Cube中TIM_DMA例程问题
本帖最后由 reynoldxu 于 2016-4-13 13:01 编辑Hi all:
最近在使用Cube 的Timer中碰到一些问题,请大家一起看看是什么问题
目的:
输出固定个数的占空比可变方波,比如800kHZ,20%,20%,40%,60%,80%,100%,驱动WS2812S LED灯
硬件:
STM32-Nucleo-F303RE
实现:
参考CubeF3中的例程(STM32Cube_FW_F3_V1.4.0\Projects\STM32F303RE-Nucleo\Examples\TIM\TIM_DMA)能够输出占空比可变的PWM,但是历程中似乎没有写完整,实际测到pwm波形并不是有限个数而是无限个,大于DMA目标个数后的PWM占空比为DMA最后一次传送给Timer_CCR的值.
思考可能是因为Start_DMA之后没有关闭而产生的问题,在HAL_TIM_PWM_PulseFinishedCallback回调中加入HAL_TIM_PWM_Stop_DMA.
观测波形,发现可以停止PWM不停产生,但是仍然会多出几个脉冲,将DMA优先级与NVIC优先级调成最高情况一样
参考"STM32L053可控PWM脉冲方法之DMA,[原文链接,提及在使用Cube库中可能需要增加预分频系数来提高响应?增加预分频系数到15之后问题依旧
综上所述:
1.STM32Cube_FW_F3_V1.4.0总关于TIM_DMA的例程是否有Bug不全或者是需要修改?
2.当在HAL_TIM_PWM_PulseFinishedCallback回调中加入HAL_TIM_PWM_Stop_DMA后任然无法及时响应,可能的改善方法?
3.在实际的测试中发现,每次启动HAL_TIM_PWM_Start_DMA后,第一个脉冲数据总是有些问题,如图所示,该如何解决?
核心代码如下:uint8_t pwm_duty={1,1,2,3,4,5};
int main(void)
{
...//各种初始化
while (1)
{
HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, (uint32_t *)&pwm_duty, 6);
HAL_Delay(10);
}
}
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM1 )
{
HAL_TIM_PWM_Stop_DMA(&htim1, TIM_CHANNEL_1);
}
}
相关代码与波形文件截图在如下地址:
http://coding.net/u/reynoldxu/p/testPWM_DMA/git
错误的波形图如下:
http://coding.net/u/reynoldxu/p ... blob/master/pic.png
http://coding.net/u/reynoldxu/p/testPWM_DMA/git/raw/master/pic.png
方法一;你的DMA是单次模式,改为循环模式,就不会输出后面几个连续的PWM而是重复重新开始
方法二,是因为用了库的原因,处理不够定时器快输出了几个PWM才执行到关闭定时器的函数。 while (1)
{
HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, (uint32_t *)&pwm_duty, 6);
HAL_Delay(10);
}
这里判断执行完后再开始。 兄弟,你问题解决了。我也是同样的问题,其余都正常,就是第一个led有时候会出问题,我查了一圈发现就你是用的STM32+HAL+TIM+DMA+WS2812B
页:
[1]