STM8S单片机的定时器TIM4 的程序问题
#include"STM8S105C_S.h"main(){PB_DDR=0x08;PB_CR1=0x08;//将PD3设置成推挽输出PB_CR2=0x00;TIM4_I...
#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闪烁一次呢 展开
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闪烁一次呢 展开
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
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
追问
你怎么记将分频(0x07+1)=2MHZ/8=250K 还要加1 这个是直接分频的。后面的计数加一是对的。
还有就是LED的闪烁频率具体是怎么算法 请教
追答
st的不管stm8还是stm32的TIM预分频器都差不多,肯定是没有0分频的,最小是1分频,所以0x00时是1分频,手册也写有的,一般习惯给预分频和重新装载寄存器减一,官方例程上也有这个习惯
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询