我使用STM8L151F2,使用16MHz的内部高速时钟HSI,没有分频;然后对
tiM4使用了128分频,填充值为125,我本来想它会1ms中断一次,然后再中断程序中每计数500次(0.5秒)切换一下指示灯。
但在
开发板上却发现要增加100倍才达到我想要的效果,对照参考手册翻来覆去都实在找不到问题出在那里,请帮忙看看是哪里搞错了,谢谢!
void Init_TIM4(void)
{
CLK_ICKCR |=0x01; //打开内部高速时钟HSI(16MHz);
CLK_SWR =0x01; //系统时钟源使用内部高速时钟HSI;0x01=HSI,0x02=LSI,0x04=HSE,0x08=LSE其余保留
CLK_CKDIVR=0x00; //系统不分频,使之工作在16MHz的频率下(0=1,1=2,2=4,3=8,4=16)
CLK_PCKENR1 |= 0x04; //让TIM4链接上系统时钟。
//定时器TIM4的初始化,首先将TIM4相关的寄存器全部复位
TIM4_CR1 = 0x00; //控制寄存器1
TIM4_CR2 = 0x00; //控制寄存器2
TIM4_SMCR = 0x00; //从模式控制寄存器
TIM4_IER = 0x00; //中断使能寄存器
TIM4_CNTR = 0x00; //计数寄存器
TIM4_PSCR = 0x00; //分频值寄存器
TIM4_ARR = 0xFF; //重装填值寄存器,手册上写的复位值是0xFF,
TIM4_SR1 = 0x00; //状态寄存器
//对TIM4进行设置
TIM4_PSCR = 0x07; //对系统时钟进行128分频,当前系统使用16MHz,经128分频后得128KHz(8us/触发)
TIM4_ARR = 125; //125次触发×8us=1000us=1ms。就是说1ms产生1次中断
TIM4_EGR = 0x01; //TG =0,UG =1; 选择中断类型
TIM4_IER |= 0x01; //打开中断
TIM4_CR1 |= 0x01; //打开定时器;
}
#pragma vector=TIM4_UIF_vector //TIM4的中断函数
__interrupt void TIM4_UIF(void)
{
TIM4_count ++;
// if(TIM4_count >= 500){ //一开始以为会1ms中断一次,500次中断得500ms,但实际效果是指示灯常亮
if(TIM4_count >= 50000){ //现在改为五万次中断动作1次,才实现0.5秒指示灯动作一次。
PB_ODR ^=0x02; //指示灯的引脚反相,实现开关灯。
TIM4_count =0;
}
TIM4_SR1 = 0x01; //清除TIM4的中断标志,以防重复进入
}
谢谢!