STM32 ADC — DMA乒乓缓存
文章目录
- STM32 ADC --- DMA乒乓缓存
- 软件切换实现乒乓
- 利用DMA双缓冲实现乒乓
- 通过cubeMX配置生成HAL工程
- 这里使用的是上篇文章(STM32 ADC — DMA采样)中生成的工程配置
软件切换实现乒乓
cubeMX默认生成的工程中是打开DMA中断的,这章我们需要用到该中断,固不要将该中断关闭(对于上节的配置使用将DMA中断关闭也是可以正常工作的)。
DMA在传输完成时会调用void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
该回调函数,
#define SAMPLE_NUM 10
#define CHANNEL_NUM 2
uint16_t adc_converted_value[SAMPLE_NUM][CHANNEL_NUM]; //行表示存储的ADC数据个数,列表示对应的通道
uint16_t adc_converted_value2[SAMPLE_NUM][CHANNEL_NUM];
//注意:这里不能关闭DMA中断
//HAL_NVIC_DisableIRQ(DMA2_Stream0_IRQn);
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_converted_value, SAMPLE_NUM*CHANNEL_NUM);
// 中断回调函数,DMA传输完成时会自动调用该函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
if(hadc->Instance == ADC1) {
static uint32_t cnt = 0;
cnt++;
if(cnt & 0x1) {
//切换DMA内存地址
HAL_ADC_Stop_DMA(&hadc1);
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_converted_value2, SAMPLE_NUM*CHANNEL_NUM);
//TODO: 数据处理
} else {
//切换DMA内存地址
HAL_ADC_Stop_DMA(&hadc1);
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_converted_value, SAMPLE_NUM*CHANNEL_NUM);
// TODO: 数据处理
}
}
}
利用DMA双缓冲实现乒乓
参考文章:https://shequ.stmicroelectronics.cn/thread-625398-1-1.html