踩坑STM32F103系列-----定时器
三勺最近在学习STM32F103的定时器功能,本文主要解释在配置通用、基本、高级定时器寄存器实现相应功能时遇到的一些问题。
目标一:基本定时器的1ms定时功能
根据技术手册设置:
1/**
2 * @brief 定时器6 1ms定时
3 * @param None
4 * @retval None
5 */
6void Cbsp::time::time_basic(void)
7{
8 mod.nvic.MY_NVIC_Init(3,3,TIM6_IRQn,2);
9 //=====定时器6时钟======//
10 RCC- >APB1ENR |= 1< < 4;
11
12 //=====定时器6初始化=====//
13 //-自动装载-//
14 TIM6- >CR1 |= 1< < 7;
15
16 //-更新中断使能-//
17 TIM6- >DIER |= 1< < 0;
18 //-设置计数周期-//
19 //TIM6- >CNT = 1000;
20 //-自动重装寄存器-//
21 TIM6- >ARR = 1000-1;
22 //-预分频寄存器-//
23 TIM6- >PSC = 36-1;
24 //-开启计数器使能-//
25 TIM6- >CR1 |= 1< < 0;
26}
在中断服务函数中翻转GPIOC13的电平。
使用逻辑分析仪分析:
现象1 :根据逻辑分析仪的采样结果,发现定时时间并不是1ms,而实2ms。
原因和步骤 :按照计算公式APB1的时钟为36M,定时器6设置36分频,每次累加的时间为1us,ARR寄存器为1000,则定时时间为1ms。出现这种情况唯一的可能就是定时器的时钟频率是72M导致的。
查看数据手册的时钟章节框图可以发现端倪,在APB136M时钟后,由于满足了APB1预分配不为1的条件,定时器时钟进行了倍频。
因此修改定时器的分配系数为72-1,再用逻辑分析仪抓取波形,定时时间正确。
目标二:高级定时器3路互补输出+死区
现象: 一点波形也没有,都是低电平。
原因和步骤:
第一,代码的第61行MOE位主输出使能,忘记设置。
第二,代码的第58、59行,死区时间设置的比波形还长导致一直输出的是低电平。
修正后波形如下: