reynoldxu 发表于 2016-4-13 12:48:53

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

mark0668 发表于 2016-4-13 13:45:13

方法一;你的DMA是单次模式,改为循环模式,就不会输出后面几个连续的PWM而是重复重新开始
方法二,是因为用了库的原因,处理不够定时器快输出了几个PWM才执行到关闭定时器的函数。

发表于 2016-4-13 17:33:26

while (1)

    {

      HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, (uint32_t *)&pwm_duty, 6);

      HAL_Delay(10);

    }
这里判断执行完后再开始。

爱因福尔 发表于 2017-6-7 17:03:23

兄弟,你问题解决了。我也是同样的问题,其余都正常,就是第一个led有时候会出问题,我查了一圈发现就你是用的STM32+HAL+TIM+DMA+WS2812B
页: [1]
查看完整版本: Cube中TIM_DMA例程问题