PWM

关于rtthread 4.0.0版本中pwm的初始化定时器寄存器读写问题

发布于 2019-02-27 09:43:47
最近在使用rtthread中的pwm,系统版本4.0.0,bsp中使用的是stm32f107,在调试过程中,发现定时器寄存器在初始化时,不能进行读写。后来仔细看了下,才发现问题所在:也就是底层硬件初始化时,先进行相关寄存器初始化,然后在开相关时钟,代码如下(以通用定时器4为例):
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

//Init TIM4
TIM_TimeBaseStructure.TIM_Period = 0;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

TIM_SelectOutputTrigger(TIM4, TIM_TRGOSource_Reset);
TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Disable);


TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
#ifdef BSP_USING_PWM4_CH1
TIM_OC1Init(TIM4, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
#endif /* BSP_USING_PWM4_CH1 */

#ifdef BSP_USING_PWM4_CH2
TIM_OC2Init(TIM4, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
#endif /* BSP_USING_PWM3_CH2 */

#ifdef BSP_USING_PWM4_CH3
TIM_OC3Init(TIM4, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
#endif /* BSP_USING_PWM3_CH3 */

#ifdef BSP_USING_PWM4_CH4
TIM_OC4Init(TIM4, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
#endif /* BSP_USING_PWM3_CH4 */

TIM_PWM_MspInit(TIM4);
TIM_MspPostInit(TIM4);
TIM_ARRPreloadConfig(TIM4, DISABLE);
TIM_Cmd(TIM4, ENABLE);


以上代码为系统中自带了初始化代码,这样会导致初始化相关的寄存器不能进行读写。

修改后,能运行的代码如下(即把相关的时钟是能初始化提前):
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_PWM_MspInit(TIM4);
TIM_MspPostInit(TIM4);


//Init TIM4
TIM_TimeBaseStructure.TIM_Period = 0;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

TIM_SelectOutputTrigger(TIM4, TIM_TRGOSource_Reset);
TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Disable);


TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
#ifdef BSP_USING_PWM4_CH1
TIM_OC1Init(TIM4, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
#endif /* BSP_USING_PWM4_CH1 */

#ifdef BSP_USING_PWM4_CH2
TIM_OC2Init(TIM4, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
#endif /* BSP_USING_PWM3_CH2 */

#ifdef BSP_USING_PWM4_CH3
TIM_OC3Init(TIM4, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
#endif /* BSP_USING_PWM3_CH3 */

#ifdef BSP_USING_PWM4_CH4
TIM_OC4Init(TIM4, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
#endif /* BSP_USING_PWM3_CH4 */


TIM_ARRPreloadConfig(TIM4, DISABLE);
TIM_Cmd(TIM4, ENABLE);


以上描述只是针对pwm使用中,存在的一个关于底层外设初始化问题,因为没有过多在看其它部分的内容,所以不敢确定其它外设初始化是否也存在类似问题,不过同(童)学(鞋)们在使用的过程中,需要注意一下。

查看更多

关注者
0
被浏览
1k
4 个回答
yxcbreeze123
yxcbreeze123 2019-02-27
大家,不好意思,这个问题的产生是由于公司其他人在移植的时候导致,在github上的相关的pwm应用,没有问题。不过相应的问题,大伙可以在以后的应用中注意。
flyboy
flyboy 2019-02-27
楼主,这种情况为了方便大家使用,可以提个PR的。

现在,针对 STM32 也出了新的 BSP 框架。楼主也可以尝试一下,看看新的框架是不是没有这个问题。 在这个网页下面有bsp添加教程
yxcbreeze123
yxcbreeze123 2019-02-27
flyboy 发表于 2019-2-27 10:36
楼主,这种情况为了方便大家使用,可以提个PR的。

现在,针对 STM32 也出了新的 BSP 框架。楼主也可以尝试 ...


好的,我看看
liuyang19921124
liuyang19921124 2020-09-15

请问这个时钟初始化顺序的问题在4.0.2版本上已经修复了吗?

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览