STM32之所以能够实现定时,是单片机内部在计数脉冲(来自晶振)
T=1/F (F为频率)
例如:我们以51单片机举例,假设单片机搭配12MHz的晶振,由于51单片机是12分频(即1个机器周期有12个时钟周期),则单片机的最小定时时间为
1 2 MHz / 2 = 1 MHz
Tt = 1 / 1 MHz = 1 us
最小定时时间T=1/1MHz=1us
51单片机定时器:
方式0 13位最大定时时间间隔2^13=8.192ms
方式1 16位最大定时时间间隔2^16=65.536ms
方式2 8位最大定时时间间隔2^8=256us
由此我们知道对于一个定时器而言要做到精确定时需要关注2个内容
1、分频器(分频比)
2、定时计数器的值
STM32定时器的时钟
CK_CNT表示定时器工作频率
TIMX_PSC表示分频系数
则定时器的工作频率计算公式为
CK_CNT=定时器时钟/( TIMx_PSC+1)
由此我们可得到STM32单片机1个时钟周期
为:T=1/ CK_CNT
例如普通定时器模块的时钟为72MH2,分频比位7199,那么我们想要得到一个1秒钟的定时,定时计数器的值需要设定为 》 TImx arr = 1 0 0 0 0
因为72000000/7200=10KHz时钟周期T=1/10KHz=100us100us×10000=1S
结论:分频比7199定时计数器的值10000
注意两点:
(1)TIMx(1-8),在库设置默认的情况下,都是72M的时钟;
(2)TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
是重复计数,就是重复溢出多少次才给你来一个溢出中断,
它对应的寄存器叫TIM1 RCR.
如果这个值不配置,上电的时候寄存器值可能随机的,本来1秒中断一次,可能变成N 秒中断一次,让计算量变大。
stm32定时器时间计算系统时钟是72Mhz,TIM1 是由PCLK2 (72MHz)得到,TIM2-7是由 PCLK1 得到
关键是设定 时钟预分频数,自动重装载寄存器周期的值
/*每1秒发生一次更新事件(进入中断服务程序)。RCC_Configuration()的SystemInit()的
RCC-》CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2表明TIM3CLK为72MHz。因此,每次进入中
断服务程序间隔时间为
((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1+9999)=1秒 */
定时器的基本设置1、 TIM_TimeBaseStructure.TIM_Prescaler = 7199;//时钟预分频数 例如 :时钟频率=72/(时钟预分频+1)
2、TIM_TimeBaseStructure.TIM_Period = 9999; // 自动重装载寄存器周期的值(定时时间) 累计 0xFFFF个频率后产生个更新或者中断(也是说定时时间到)
3、 TIM_TimeBaseStructure.TIM_CounterMode = TIM1_CounterMode_Up; //定时器模式 向上计数
4、 TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //时间分割值
5、 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//初始化定时器2
6、 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开中断 溢出中断
7、 TIM_Cmd(TIM2, ENABLE);//打开定时器
或者:
TIM_TimeBaseStructure.TIM_Prescaler = 35999;//分频35999 72M/
(35999+1)/2=1Hz 1秒中断溢出一次
TIM_TimeBaseStructure.TIM_Period = 2000; //计数值2000
((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72M)*(1+2000)=1秒 */
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)