嵌入式 > 技术百科 > 详情

TIMER2定时器不能进入中断的问题

发布时间:2023-03-22 发布时间:
|

STM8S103的引脚封装图如下

是一个20管脚的51类型单片机,8Kflash 1kRAM。


STM8S207引脚封装如下

一个48引脚64KFLASH和6K的RAM,也是51单片机,但串口和定时器的功能多了。


从手册看,timer1是ADVANCED 定时器,timer 2 3是通用型定时器。


在移植过程中以为只要改动器件类型同时在stm8s.h内将


#ifndef __STM8S_H


#define __STM8S_H


#define STM8S207 //STM8S103


103注释掉并开通207的宏定义。


定时器初始化如下


void TIM1_Init(void)


{


TIM1_DeInit(); //定时器1相关寄存器复位


TIM1_TimeBaseInit(7, TIM1_COUNTERMODE_UP, 9999, 0); //中断时间10ms


// TIM1_TimeBaseInit(8, TIM1_COUNTERMODE_UP, 1500, 0); //中断时间ms


TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE); //使能中断


TIM1_Cmd(ENABLE); //使能TIM1


}


void TIM2_Init(void)


{


TIM2_DeInit();


TIM2_TimeBaseInit(TIM2_PRESCALER_1, 125*20);//20ms中断


TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE); //使能中断


ITC_SetSoftwarePriority(ITC_IRQ_TIM2_OVF, ITC_PRIORITYLEVEL_2);//设置d定时器中断优先级 2


TIM2_Cmd(ENABLE);//使能定时器1


}


但是通过单步调试,确无法进入中断


#pragma vector=ITC_IRQ_TIM2_OVF + 2


__interrupt void TIM2_UPD_OVF_BRK_IRQHandler(void)


{


TIM2_ClearFlag(TIM2_FLAG_UPDATE); //清定时器1更新中断标志


}


观察寄存器发现 TIMER2 的寄存器值TIMER2_IER无法开通中断也就是使能中断 ,手册和register都显示timer2 的寄存器很少。TIMER1和TIMER2的比较如下



后来在stm8s_timer2.h里发现了端倪


typedef struct TIM2_struct


{


__IO uint8_t CR1;


// __IO uint8_t RESERVE1;


// __IO uint8_t RESERVE2; //注释掉用于STM8S207 否则用于stm8s103


__IO uint8_t IER;


__IO uint8_t SR1;


__IO uint8_t SR2;


__IO uint8_t EGR;


__IO uint8_t CCMR1;


__IO uint8_t CCMR2;


__IO uint8_t CCMR3;


__IO uint8_t CCER1;


__IO uint8_t CCER2;


__IO uint8_t CNTRH;


__IO uint8_t CNTRL;


__IO uint8_t PSCR;


__IO uint8_t ARRH;


__IO uint8_t ARRL;


__IO uint8_t CCR1H;


__IO uint8_t CCR1L;


__IO uint8_t CCR2H;


__IO uint8_t CCR2L;


__IO uint8_t CCR3H;


__IO uint8_t CCR3L;


}


TIM2_TypeDef;


也就是在给timer2 的寄存器赋值时由于多了两个没用的,将数值顶替了,注释掉可以了。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
OM8838