STM8S单片机的定时器TIM4 的程序问题

#include "STM8S105C_S.h"main(){ PB_DDR = 0x08; PB_CR1 = 0x08; // 将PD3设置成推挽输出 PB_CR2 = 0x00;TIM4_IER = 0x00; // TIM4_EGR = 0x01; // TIM4_PSCR = 0x07; // 计数器时钟=主时钟/128=2MHZ/128 // 相当于计数器周期为64uS TIM4_ARR = 255; // 设定重装载时的寄存器值,255是最大值 TIM4_CNTR = 255; // 设定计数器的初值 // 定时周期=(ARR+1)*64=16320uS TIM4_CR1 = 0x01; while(1) { while((TIM4_SR& 0x01) == 0x00); // 等待更新标志 TIM4_SR= 0x00; // 清除更新标志 PB_ODR = PB_ODR ^ 0x08; // LED驱动信号取反 // LED闪烁频率=2MHZ/128/255/2=30.63 } }请问LED灯的闪烁频率怎么计算的。为啥不是16320US闪烁一次呢
2026年09月25日 02:30
有2个网友回答
网友(1):

虽然是好久的问题了,但是我还要说两句。LED闪烁频率不就是1/16320/2吗?(与2MHZ/128/255/2=30.63一样的)定时器周期是16320US,因为每个定时器周期LED状态翻转一次,所以要除以2。(TIM4_PSCR = 0x07; // 计数器时钟=主时钟/128=2MHZ/128)这分频系数是没错的。分频系数7。实际分频数是2的7次方(128)的意思。

网友(2):

你的预分频值有问题
TIM4_PSCR = 0x07; // 计数器时钟=主时钟/(0x07+1)=2MHZ/8=250K

TIM4_ARR = 255; // 设定重装载时的寄存器值,255是最大值
TIM4_CNTR = 255; // 设定计数器的初值
定时器溢出时钟频率=250K/(ARR+1)=250K/256=976.5625Hz
定时时间=1024uS
PB_ODR = PB_ODR ^ 0x08; // LED驱动信号取反

则闪烁频率为1/2 -> 488.28125Hz
// LED闪烁频率=2MHZ/8/256/2=488.28125Hz
周期2048uS