STM32
直播中

向日葵的花季

8年用户 1234经验值
擅长:电源/新能源
私信 关注
[问答]

关于STM8L151F2 TIM4分频的问题求解

我使用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的中断标志,以防重复进入
}


谢谢!


回帖(1)

李辉

2024-5-8 09:33:29
建议楼主查一下PDF,TIM4和USART1是不是共用了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分