STM32-DMA工作原理
ADC_DMA多路采集实例
一.STM32-DMA工作原理
1.DMA简介
DMA,全称为:Direct Memory Access,即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。
2.DMA功能框图
(1)外设通道
STM32F4xx 系列资源丰富,具有两个 DMA 控制器,同时外设繁多,为实现正常传输,DMA需要通道选择控制。每个 DMA控制器具有 8个数据流,每个数据流对应 8个外设请求。
(2)数据流仲裁
(3)数据FIFO
(4,5)存储器端口和外设端口
3.DMA传输
4.DMA中断
二.DMA多路采集实验
1.实验要求:
(实验1)利用ADC采集电位器以及芯片内部温度传感器的数据,在main函数中启动ADC转换以及DMA传输,最后在DMA完成中断中打印采集到的数据.
(实验2)利用ADC采集电位器及STM32内部温度传感器的数据
2.cubemx创建工程
(1)设置 接口,温度管道
(2)配置RCC时钟,USART串口
(3)配置ADC
在上述页面先不要关,打开DMA设置
设置优先级
3.步骤
(1)main.c全局声明
uint16_t adc_value[2] = {0};
(2)main.c的while(1){}中
HAL_ADC_Start_DMA(&hadc1, (uint32_t*) adc_value, 2);
HAL_Delay(1000);
HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)
ADC_HandleTypeDef* hadc: 使用ADC1就写 &hadc1
uint32_t* pData: 接收到的数据
uint32_t Length: 接收到的数据的大小,按选定的大小算(在DMA setting默认配置)
(3)ADC.c中的回调函数重写
extern uint16_t adc_value[2] ;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc->Instance == ADC1)
{
printf("adc_value[0]=%d, adc_value[1]=%d\n",adc_value[0],adc_value[1]);
}
}
问题:为什么全局变量声明为16位,而HAL_ADC_Start_DMA的参数确实32位?
答:DMA配置默认半字,所以以半字接收
(3)DMA使用中断,如何寻找中断回调函数?
<1>一般的寻找函数中断回调函数
在stm32f407xx.it.c文件中找到中断函数,右键定义从中寻找成功的回调函数重写.
<2>此处DMA寻找回调函数
A: 右键进入HAL_ADC_Start_DMA
B:寻找complete
C:寻找complete/callback,此处就是回调函数
问题:为什么原始的it.c不可以找到回调函数?
答:HAL_ADC_Start_DMA函数里面的指针对函数的指向进行了修改.
(1)HAL_ADC_Start_DMA函数中
(2)it.c的回调函数
发现XferHalfCpltCallback函数的指向被修改,所以通常的寻找不可用