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 );? ? ? // 清除中斷標(biāo)志

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 );? ? ? ? ? ? ? // 占空比設(shè)置 , 修改占空比必須暫時關(guān)閉定時器

TMR1_Enable();


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

3.png



你好:

? ?謝謝你的幫助,現(xiàn)在已經(jīng)有波形輸出了,不過還有一個技術(shù)問題沒有解決,就是如何有效執(zhí)行DMA后停止PWM的問題.?使用DMA,就是希望精確的輸出指定的脈沖,和脈沖的個數(shù)。下面的代碼中,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 );? ? ? // 清除中斷標(biāo)志

????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功能+中斷,注意完成后關(guān)閉此中斷使能,否則會一直上報中斷。

? ? ? ? TMR1_ClearITFlag( TMR1_2_IT_DMA_END );? ? ? // 清除中斷標(biāo)志?

? ? ? ? /* DMA 結(jié)束 */

? ? ? ? /* 用戶可自行添加需要的處理 */

? ? }

}



關(guān)于DMA中斷無法清除的問題,提供一個解決方法給你,在dma結(jié)束時,傳入另一個其實(shí)地址和結(jié)束地址,那么就不會一直輸出pwm波了。


1.? ? ?你的這個方法有效,可以停止PWM,功能和 TMR1_Disable()?一樣起作用。但是結(jié)果也一樣,?只輸出一個波形就沒了。

? 估計是? TMR1_2_IT_DMA_END?的問題,沒有等輸出完指定的脈沖個數(shù),就產(chǎn)生了中斷。

? 不知道你有什么方法解決??這個問題困擾了幾天了,一直沒有進(jìn)展。


2.? ? ?我嘗試了另一個方法,采用FIFO的PWM方法。?奇怪的是,這個也有問題,最后一個波形變了,如下圖第5個脈沖:


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


?上面FIFO的問題,是我理解錯了,TMR0_3_IT_FIFO_OV?是指FIFO的數(shù)據(jù)空了,?不是最后一個波形也輸出完成。這時候進(jìn)入了睡眠,導(dǎo)致波形改變。再加一個TMR1_PWMActDataWidth( 0);?可以解決問題。


你這個“NVIC_EnableIRQ( TMR1_IRQn );”編譯不會報錯嗎? CH582F會報錯是架構(gòu)不同的嗎?


是的,可以參考下583例程包中TMR例程的寫法:

PFIC_EnableIRQ(TMR1_IRQn);



只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频