|
ERIC大大好,之前和你请教用STM32播放PCM音频做成了(库函数+DAC+DMA+乒乓操作),最近想用STM32F030 做了一个 PWM+DMA+乒乓操作 来实验。
目前用HAL库建立的工程文件,DMA配置为 循环模式 , half word , Memory --》 Peripheral
在主程序调用 WHILE(1) 前 调用 HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, (uint32_t *)&pwm_data1,256) , 工作没有问题,在IO端的逻辑分析仪可以看到 DMA是循环将 pwm_data1里面的数组通过占空比调整进行输出
然后,我想在DMA传输结束时(也就是计数器走到头准备清0时) 产生中断,将DMA下一次传输数组改为 pwm_data2,实现乒乓操作。
我是这么写的
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
if(htim == &htim3)
{
dma_bank_cnt++;
HAL_TIM_PWM_Stop_DMA(&htim3, TIM_CHANNEL_1);
if(dma_bank_cnt%2){HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, (uint32_t *)&pwm_data1,256);}
else{HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, (uint32_t *)&pwm_data2,256);}
}
}
dma_bank_cnt 就是中断次数计数器,取2的余数判断 下一次DMA采用哪个数组。
但是这么写后,经测试,好像永远只有一个数组被读取,也有可能这么写就根本不对,没有进中断
所以想请教怎么写呢?谢谢!
|
|