PWM DMA

你好,做PWM的DMA测试时,一直得不到波形,代码如下下面,请问问题在哪里?


__align(4) uint32_t pwm_duty [] = {1000, 1000, 1000, 1000, 1000};

GPIOB_ResetBits( GPIO_Pin_10 );// 配置PWM口 PA10

GPIOB_ModeCfg( GPIO_Pin_10, GPIO_ModeOut_PP_5mA );

GPIOPinRemap( ENABLE, RB_PIN_TMR1 );


TMR1_PWMInit( High_Level, PWM_Times_1 );

TMR1_PWMCycleCfg( 3200 );        // 周期 100us

TMR1_ClearITFlag( TMR1_2_IT_DMA_END );      // 清除中断标志

TMR1_ITCfg(ENABLE, TMR1_2_IT_DMA_END);          // 开启DMA完成中断

NVIC_EnableIRQ( TMR1_IRQn );

TMR1_DMACfg( ENABLE, (uint16_t)&pwm_duty[0], (uint16_t)&pwm_duty[4], Mode_Single );

TMR1_Disable();

TMR1_PWMActDataWidth( 1000 );              // 占空比设置 , 修改占空比必须暂时关闭定时器

TMR1_Enable();


你可以参考一下573的TMR例程,新的例程是添加了的:

3.png



你好:

   谢谢你的帮助,现在已经有波形输出了,不过还有一个技术问题没有解决,就是如何有效执行DMA后停止PWM的问题. 使用DMA,就是希望精确的输出指定的脉冲,和脉冲的个数。下面的代码中,PWM会一直输出波形。


__align(4) uint32_t pwm_duty [] = {1000, 1000, 1000, 1000, 1000};


void pwm_start(void){

    GPIOB_ResetBits( GPIO_Pin_10 );// 配置PWM口 PA10

    GPIOB_ModeCfg( GPIO_Pin_10, GPIO_ModeOut_PP_5mA );

    GPIOPinRemap( ENABLE, RB_PIN_TMR1 );


    TMR1_PWMInit( High_Level, PWM_Times_1 );

    TMR1_PWMCycleCfg( 3200 );        // 周期 100us

    TMR1_ClearITFlag( TMR1_2_IT_DMA_END );      // 清除中断标志

    TMR1_ITCfg(ENABLE, TMR1_2_IT_DMA_END);          // 开启DMA完成中断

    NVIC_EnableIRQ( TMR1_IRQn );

    TMR1_DMACfg( ENABLE, (uint16_t)&pwm_duty[0], (uint16_t)&pwm_duty[4], Mode_Single );

}


void TMR1_IRQHandler( void )        // TMR1 定时中断

{

    if(TMR1_GetITFlag(TMR1_2_IT_DMA_END))

    {

        TMR1_ITCfg(DISABLE, TMR1_2_IT_DMA_END);     // 使用单次DMA功能+中断,注意完成后关闭此中断使能,否则会一直上报中断。

        TMR1_ClearITFlag( TMR1_2_IT_DMA_END );      // 清除中断标志 

        /* DMA 结束 */

        /* 用户可自行添加需要的处理 */

    }

}



关于DMA中断无法清除的问题,提供一个解决方法给你,在dma结束时,传入另一个其实地址和结束地址,那么就不会一直输出pwm波了。


1.     你的这个方法有效,可以停止PWM,功能和 TMR1_Disable() 一样起作用。但是结果也一样, 只输出一个波形就没了。

  估计是  TMR1_2_IT_DMA_END 的问题,没有等输出完指定的脉冲个数,就产生了中断。

  不知道你有什么方法解决? 这个问题困扰了几天了,一直没有进展。


2.     我尝试了另一个方法,采用FIFO的PWM方法。 奇怪的是,这个也有问题,最后一个波形变了,如下图第5个脉冲:


1GP2$UB7{0$6HZ6MAD9B)R0.png


 上面FIFO的问题,是我理解错了,TMR0_3_IT_FIFO_OV 是指FIFO的数据空了, 不是最后一个波形也输出完成。这时候进入了睡眠,导致波形改变。再加一个TMR1_PWMActDataWidth( 0); 可以解决问题。


你这个“NVIC_EnableIRQ( TMR1_IRQn );”编译不会报错吗? CH582F会报错是架构不同的吗?


是的,可以参考下583例程包中TMR例程的写法:

PFIC_EnableIRQ(TMR1_IRQn);



只有登录才能回复,可以选择微信账号登录