以定时器输出PWM的DMA配置为例
注意:
正常模式和循环模式开启之后,如果不调用相应的停止传输函数,DMA都会一直传输数据。
还是以定时器输出PWM为例,相应的DMA开启函数和停止函数如下:
//开始传输
HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_1, Data, ONCE_PWM_CNT);//Data为控制占空比的数组ONCE_PWM_CNT为数组大小
//停止传输
HAL_TIM_PWM_Stop_DMA(&htim3, TIM_CHANNEL_1);
区别一:
正常模式传输完一次后会一直传输最后一位数据,且保持下去,逻辑分析仪抓取的数据如下:
DMA模式传输完一次之后又从头开始传输
区别二:
进回调的次数不同,正常模式只进一次回调,不管关不关闭DMA,之后都不再进回调;而循环模式传输完一次进一次回调,不关闭DMA传输会一直进回调。
//DMA传输完一次进回调函数
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef * htim)
{
if(htim == &htim3)
{
HAL_TIM_PWM_Stop_DMA(&htim3, TIM_CHANNEL_1);
}
}
使用场景:
看情况,如果只传输一次的,可以选正常模式,传输完一次后在回调里关闭DMA
如果是传输一段数据,且要循环发送,可以选循环模式
如果是要传输占空比全一样的pwm,也就是数组里面的数据都是一样的,用来驱动步进电机,那其实选哪个模式都是一样的。
总之原理就是上面的原理,只要能满足实际需求即可。