踩坑STM32F103系列-----定时器
三勺最近在学习STM32F103的定时器功能,本文主要解释在配置通用、基本、高级定时器寄存器实现相应功能时遇到的一些问题。
目标一:基本定时器的1ms定时功能
根据技术手册设置:
1/**2* @brief 定时器61ms定时3* @param None4* @retval None5*/6voidCbsp::time::time_basic(void)7{8mod.nvic.MY_NVIC_Init(3,3,TIM6_IRQn,2);9//=====定时器6时钟======//10RCC- >APB1ENR |=1< <4;1112//=====定时器6初始化=====//13//-自动装载-//14TIM6- >CR1|=1< <7;1516//-更新中断使能-//17TIM6- >DIER |=1< <0;18//-设置计数周期-//19//TIM6- >CNT =1000;20//-自动重装寄存器-//21TIM6- >ARR =1000-1;22//-预分频寄存器-//23TIM6- >PSC =36-1;24//-开启计数器使能-//25TIM6- >CR1|=1< <0;26}
在中断服务函数中翻转GPIOC13的电平。
使用逻辑分析仪分析:
现象1:根据逻辑分析仪的采样结果,发现定时时间并不是1ms,而实2ms。
原因和步骤:按照计算公式APB1的时钟为36M,定时器6设置36分频,每次累加的时间为1us,ARR寄存器为1000,则定时时间为1ms。出现这种情况唯一的可能就是定时器的时钟频率是72M导致的。
查看数据手册的时钟章节框图可以发现端倪,在APB136M时钟后,由于满足了APB1预分配不为1的条件,定时器时钟进行了倍频。
因此修改定时器的分配系数为72-1,再用逻辑分析仪抓取波形,定时时间正确。
目标二:高级定时器3路互补输出+死区
根据技术手册设置:
1voidCbsp::time::tim_senior_PWM(void)2{3RCC- >APB2ENR |=1< <2;//*A*//4RCC- >APB2ENR |=1< <3;//*B*//56//=====初始化GPIO=====//7GPIOA- >CRH =0;8GPIOB- >CRH =0;9GPIOA- >CRH |=0x0B< < (8-8)*4;10GPIOA- >CRH |=0x0B< < (9-8)*4;11GPIOA- >CRH |=0x0B< < (10-8)*4;12GPIOB- >CRH |=0x0B< < (13-8)*4;13GPIOB- >CRH |=0x0B< < (14-8)*4;14GPIOB- >CRH |=0x0B< < (15-8)*4;1516//=====开启定时器1时钟=====//17RCC- >APB2ENR |=1< <11;18//=====配置定时器 时基单元=====//1920//+预分频寄存器+//21TIM1- >PSC =72-1;22//+自动重装载值+//23TIM1- >ARR =100-1;24//+捕获/比较寄存器+//25//-设置为PWM1模式-//26TIM1- >CCMR1|= (0x6)< < (4);27TIM1- >CCMR1|= (0x6)< < (12);28TIM1- >CCMR2|= (0x6)< < (4);29//-使能预装在寄存器-//30TIM1- >CCMR1|= (1)< < (11);31TIM1- >CCMR1|= (1)< < (3);32TIM1- >CCMR2|= (1)< < (3);3334//-开启自动重装载允许位-//35TIM1- >CR1|= (0x1)< <7;36//设置向上计数//37TIM1- >CR1&= ~((0x1)< <4);38//设置时钟分频因子39//TIM1- >CR1|= ((0x2)< <8);4041//+开启通道输出+//42TIM1- >CCER |=1< <0;//CC143TIM1- >CCER |=1< <4;//CC244TIM1- >CCER |=1< <8;//CC34546TIM1- >CCER |=1< <2;//CC1N47TIM1- >CCER |=1< <6;//CC2N48TIM1- >CCER |=1< <10;//CC3N4950//-设置各通道占空比-//51TIM1- >CCR1=50;52TIM1- >CCR2=10;53TIM1- >CCR3=10;54//产生更新事件55TIM1- >EGR |=1< <0;5657//-死区时间设置-//58TIM1- >BDTR |= ((0x7)< <5);59TIM1- >BDTR |=1;60//-主输出使能-//61TIM1- >BDTR |= ((0x1)< <15);62//-开启定时器-//63TIM1- >CR1|= (0x1)< <0;64}
现象:一点波形也没有,都是低电平。
原因和步骤:
第一,代码的第61行MOE位主输出使能,忘记设置。
第二,代码的第58、59行,死区时间设置的比波形还长导致一直输出的是低电平。
修正后波形如下:
全部0条评论
快来发表一下你的评论吧 !