7.stm32的数据搬运工DMA

文章介绍了STM32的DMA工作原理,包括DMA的简介、功能框图、传输过程和中断机制。然后详细阐述了一个利用DMA进行ADC多路采集的实验,包括实验要求、CubeMX工程配置、代码实现和中断回调函数的查找与重写。实验中通过DMA进行ADC数据采集,并在DMA完成中断中处理采集结果。
摘要由CSDN通过智能技术生成

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函数的指向被修改,所以通常的寻找不可用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值