STM32F1,定时器时基初始化参数
错误代码:
在初始化时基时,没有给TIM_ClockDivision和TIM_RepetitionCounter赋值。
错误代码:
static void BSP_TIM_PWMOC_Config(void)
{
uint16_t PSC = 7200;
uint32_t ARR = 10000/20;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
BSP_TIMx_PWMOC_Clk_Cmd(BSP_TIMx_PWMOC_Clk,ENABLE);
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period= ARR-1;
TIM_TimeBaseInitStructure.TIM_Prescaler = PSC-1;
TIM_TimeBaseInit(BSP_TIMx_PWMOC,&TIM_TimeBaseInitStructure);
TIM_ARRPreloadConfig(BSP_TIMx_PWMOC,ENABLE);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_Pulse = ARR/2;
TIM_OC1Init(BSP_TIMx_PWMOC,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(BSP_TIMx_PWMOC, TIM_OCPreload_Enable);
TIM_Cmd(BSP_TIMx_PWMOC,ENABLE);
}
typedef struct
{
uint16_t TIM_Prescaler;
uint16_t TIM_CounterMode;
uint16_t TIM_Period;
uint16_t TIM_ClockDivision;
uint8_t TIM_RepetitionCounter;
} TIM_TimeBaseInitTypeDef;
当时考虑TIM_ClockDivision主要用于给死区时钟 ,也没有使用到TIM_RepetitionCounter,所以就没有给他们赋值。
预想输出:定时器输出PWM,20Hz,50%占空比。
实际输出:定时器输出PWM,10Hz,50%占空比。
错误分析:
经过debug发现:由于没有给参数赋值,结果MDK为局部变量产生一个随机值(但是每次debug都是这个值)。
可以看到此时
TIM_ClockDivision被赋值0x84D4,此时CR1被赋值为0xC4。
查STM32F1中文参考手册
可以发现CMS并没有被配置成边沿对齐模式,导致实际周期变为预计周期的一般。
修正错误
static void BSP_TIM_PWMOC_Config(void)
{
uint16_t PSC = 7200;
uint32_t ARR = 10000/20;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
BSP_TIMx_PWMOC_Clk_Cmd(BSP_TIMx_PWMOC_Clk,ENABLE);
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period= ARR-1;
TIM_TimeBaseInitStructure.TIM_Prescaler = PSC-1;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(BSP_TIMx_PWMOC,&TIM_TimeBaseInitStructure);
TIM_ARRPreloadConfig(BSP_TIMx_PWMOC,ENABLE);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_Pulse = ARR/2;
TIM_OC1Init(BSP_TIMx_PWMOC,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(BSP_TIMx_PWMOC, TIM_OCPreload_Enable);
TIM_Cmd(BSP_TIMx_PWMOC,ENABLE);
}
此时CR1寄存器被正确配置。
结论
在C语言中变量都会默认初始化。其中全局变量会默认初始化为0,而局部变量会初始化随机值。
在使用外设的时候,还是要给参数初始化,以防出现未知错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)