物联网ARM开发-11STM32数据搬运工DMA

前言: 上一内容ADC多路采集数据之前用的是DR数据寄存器,CPU需要不停访问轮询,一路采集完成才能采集另一路,非常消耗资源。DMA是通过DR数据寄存器,采集完后发一个DMA数据请求,然后会把数据放到内存中去,实现一个搬运工的角色,释放了CPU。

目录

一、DMA基本概念

二、STM32DMA功能框图分析

三、STM32DMSA传输

1、DMA传输模式

2、DMA传输的源、目的、长度

3、DMA增量设置

4、DMA循环模式

5、DMA单次传输和突发传输

四、STM32DMA中断

五、DMA多路采集实例

1、实验要求:利用ADC采集电位器以及芯片内部温度传感器的数据,在main函数中启动ADC转换以及DMA传输,最后在DMA完成中断中打印采集到的数据。

2、cubmx配置

3、编程思路

4、实验效果


一、DMA基本概念

(1)DMA简介

DMA,全称为:Direct Memory Access,即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。

二、STM32DMA功能框图分析

 中午参考手册9.3

1、外设通道
STM32F4xx 系列资源丰富,具有两个 DMA 控制器,同时外设繁多,为实现正常传输,DMA需要通道选择控制。每个 DMA控制器具有 8个数据流,每个数据流对应 8个外设请求。    外设通道选择要解决的主要问题是决定哪一个外设作为该数据流的源地址或者目标地址。
注:     DMA控制器会通过 DMA数据流 x 配置寄存器 DMA_SxCR的 CHSEL[2:0]位选择对应的通道作为该数据流的目标外设。

2、数据量仲裁
一个 DMA控制器对应 8个数据流,数据流包含要传输数据的源地址、目标地址、数据长度等等信息。如果我们需要同时使用同一个 DMA 控制器(DMA1 或 DMA2)多个外设请求时,那必然需要同时使用多个数据流,那究竟哪一个数据流具有优先传输的权利呢?这就需要仲裁器来管理判断了
数据流传输优先级配置配置 

  • 1DMA_SxCR寄存器 PL[1:0]位,可以设置为非常高、高、中和低四个级别
  • 2如果两个或以上数据流软件设置优先级一样,则他们优先级取决于数据流编号,编号越低越具有优先权

3、数据FIFO
每个数据流都有一个独立的 “4 字 ”FIFO(先进先出存储器缓冲区)。 DMA传输具有 FIFO模式和直接模式。
a.直接模式       
每个 DMA 请求会立即启动对存储器的传输。当在直接模式(禁止 FIFO)下将 DMA请求配置为以存储器到外设模式传输数据时,DMA 仅会将一个数据从存储器预加载到内部 FIFO,从而确保一旦外设触发 DMA 请求时则立即传输数据。
b.FIFO模式    
可通过控制寄存器 DMA_SxFCR 的 FTH[1:0]位来设置FIFO 阈值级别为 FIFO 大小的 1/4、1/2 或 3/4。如果数据存储量达到阈值级别时,FIFO 内容将传输到目标中。

4、存储器端 同下

5、外设端口

DMA 控制器提供两个 AHB 主端口:AHB  存储器端口 (用于连接存储器)和 AHB  外设端口(用于连接外设)。        
但是,要执行存储器到存储器的传输,AHB  外设端口 必须也能访问存储器。所以 DMA1 不能实现存储器到存储器传输。

三、STM32DMSA传输

1、DMA传输模式

模式选择可以通过 DMA_SxCR 寄存器的 DIR[1:0]位控制

  • DMA1 只有外设到存储器和存储器到外设两种模式
  • DMA2 除前面两种外还支持存储器到存储器的传输模式。

2、DMA传输的源、目的、长度

  • DMA_SxPAR寄存器:  设置外设寄存器地址  
  • DMA_SxM0AR寄存器:设置存储器地址
  • DMA_SxCR 寄存器   : DIR[1:0]位配置数据的传输方向
  • DMA_CNDTRx 寄存器: 写入需要传输的数据量, (0 到 65535)  
  • DMA_SxCR 寄存器中的 PSIZE 和 MSIZE 位:设置源和目的的数据宽度,两边的位宽尽量保持一致

3、DMA增量设置

  • 根据设置 DMA_SxCR 寄存器中 PINC 和 MINC 位的状态,外设和存储器指针在每次传输后可以自动向后递增或保持常量。  
  • 当设置为增量模式时,下一个要传输的地址将是前一个地址加上增量值,增量值取决与所选的数据宽度为 1 、 2 或 4 。

4、DMA循环模式

  •  循环模式用于处理循环缓冲区和连续的数据传输 ( 如 ADC 的扫描模式 ) 。可以使用 DMA_SxCR寄存器中的 CIRC 位使能此特性。 
  •  当启动了循环模式,一组的数据传输完成时,计数寄存器将会自动地被恢复成配置该通道时设置的初值, DMA 操作将会继续进行。

5、DMA单次传输和突发传输

  • DMA传输类型有单次(Single)传输和突发(Burst)传输。DMA 控制器可以产生单次传输或 4 个、8 个和 16 个节拍的增量突发传输
  • 突发大小通过软件针对两个 AHB 端口独立配置,配置时使用 DMA_SxCR 寄存器中的MBURST[1:0] 和 PBURST[1:0] 位。
  • 为确保数据一致性,形成突发的每一组传输都不可分割:在突发传输序列期间,AHB 传输会锁定,并且 AHB 总线矩阵的仲裁器不解除对 DMA 主总线的授权。

四、STM32DMA中断

对于每个 DMA 数据流,可在发生以下事件时产生中断:

  •  达到半传输  
  •  传输完成  
  • 传输错误  
  • FIFO 错误(上溢、下溢或 FIFO 级别错误)  
  • 直接模式错误

注:这些标志位都在中断状态寄存器DMA_xISR中设置

五、DMA多路采集实例

1、实验要求:利用ADC采集电位器以及芯片内部温度传感器的数据,在main函数中启动ADC转换以及DMA传输,最后在DMA完成中断中打印采集到的数据。

利用DMA的好处: 

  • 多路采集数据之前用的是DR数据寄存器,CPU需要不停访问轮询,一路采集完成才能采集另一路,非常消耗资源
  • DMA是通过DR数据寄存器,采集完后发一个DMA数据请求,然后会把数据放到内存中去,可以用buf[]接收,一般设置为递增方式存储4

2、cubmx配置

和上一内容一样,开启168Mhz时钟,串口打印,pa5 adc1in,温度adc采集

 

使能DMA

 配置DMA

 

3、编程思路

1实现一个printf重定义方便调试打印

2主函数中循环开启adcDMA方式采集,延时1s

3回调函数中打印采集信息

我们先追一下源码:

 

 

 我们改写这个函数

//放在adc.c文件下,因为属于adc的回调函数

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]);
	}
}

main函数

int fputc(int ch,FILE *p)             //printf函数重定向
{
	while(!(USART1->SR & (1<<7)));
	USART1->DR = (uint8_t)ch;
	return ch;
}

uint16_t adc_value[2] = {0};
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  *
  * @retval None
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  MX_ADC1_Init();
  /* USER CODE BEGIN 2 */
  printf("this is DMA_test\r\n");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		HAL_ADC_Start_DMA(&hadc1,(uint32_t *)adc_value,2);  //开启DMA
		HAL_Delay(1000);
		
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

4、实验效果

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: 基于ARM Cortex-M3的STM32嵌入式系统是一种高性能、低功耗的嵌入式系统,可广泛应用于各种领域。它的工作原理是基于ARM Cortex-M3内核的芯片,该内核具有较强的计算能力和多重存储器接口。STM32系列芯片结合了低功耗、高性能和丰富的外设功能,能够满足不同的应用需求。 STM32嵌入式系统的应用十分广泛。首先,它可以应用于工业自动化控制领域。通过与各种传感器和执行器的连接,STM32可以实现对温度、湿度、压力等各种参数的实时监测和控制。其低功耗特性也使其适合在长时间运行的智能仪表和机械设备中使用。 其次,STM32嵌入式系统可应用于物联网设备。通过内置的无线通信模块,如Wi-Fi、蓝牙和LoRa等,STM32可以与其他设备进行无线通信,并实现数据的传输和远程控制,适用于智能家居、智能城市等场景。 此外,STM32还可以应用于消费电子产品领域。其丰富的外设接口可以与LCD显示屏、摄像头、音频设备等进行连接,从而实现手机、平板电脑和音频播放器等产品的功能。 总体来说,基于ARM Cortex-M3的STM32嵌入式系统具有高性能、低功耗、丰富的外设接口等特点,可以广泛应用于工业自动化、物联网设备和消费电子等众多领域,为各类产品提供强大的计算和控制能力。 ### 回答2: 基于ARM Cortex-M3的STM32嵌入式系统是一种高性能、低功耗的解决方案。STM32系列微控制器基于ARM Cortex-M3内核,具有丰富的外设和功能,适用于各种嵌入式应用。 STM32的嵌入式系统原理是基于ARM Cortex-M3内核的运行机制。ARM Cortex-M3是一种32位的低功耗处理器,具有较高的性能和灵活性。STM32通过在芯片上集成了丰富的外设模块(例如通用输入输出、串行通信接口、模数转换器等)以及存储器和时钟管理模块,实现了完整的嵌入式系统功能。 嵌入式系统应用方面,STM32可广泛应用于工控、家电、汽车电子、医疗设备等领域。在工控领域,STM32可用于控制和监测生产过程,实现智能化管理。在家电领域,STM32可用于控制空调、洗衣机等家电设备,提高其性能和用户体验。在汽车电子领域,STM32可用于车载娱乐、导航和车身控制等系统。在医疗设备领域,STM32可用于监测和控制医疗设备,提高诊断和治疗效果。 STM32的优点包括低功耗、高性能、丰富的外设、易于开发和灵活的应用性。低功耗使得STM32在电池供电或移动设备应用中非常适用。高性能和丰富的外设让STM32能够处理复杂的任务和连接多种外部设备。易于开发的特性使得开发者能够快速上手并进行系统开发。灵活的应用性使得STM32能够应对不同的应用需求和系统架构。 总之,基于ARM Cortex-M3的STM32嵌入式系统以其优异的性能和丰富的外设被广泛应用于各种嵌入式系统领域,为各种应用提供了高效、低功耗的解决方案。 ### 回答3: STM32是意法半导体公司推出的一种基于ARM Cortex-M3内核的嵌入式系统。它采用了先进的芯片设计和先进的嵌入式开发技术,具有高性能、低功耗和丰富的外设接口等特点。 基于ARM Cortex-M3的STM32嵌入式系统原理主要包括以下几个方面: 1. ARM Cortex-M3内核:ARM Cortex-M3是一种高性能、低功耗的32位处理器内核。它具有高性能的运算能力和丰富的指令集,能够处理复杂的计算任务。 2. 外设接口:STM32嵌入式系统提供了丰富的外设接口,包括多个GPIO引脚、UART、SPI、I2C、ADC等。这些外设接口可与外部设备进行通信,实现数据的输入和输出。 3. 存储器:STM32嵌入式系统具有不同类型的存储器,包括闪存、RAM和EEPROM。闪存用于存储程序代码和数据,RAM用于临时数据存储,EEPROM用于非易失性数据存储。 4. 中断系统:STM32嵌入式系统具有强大的中断系统,可实现多任务并发执行。通过中断系统,可以及时响应外部事件,并执行相应的任务。 基于ARM Cortex-M3的STM32嵌入式系统应用广泛,主要包括以下几个方面: 1. 工业控制:STM32可以广泛应用于工业自动化领域,用于控制和调节各种设备和系统,如PLC、人机界面等。 2. 智能家居:STM32可以用于智能家居控制系统,实现对家居设备的远程控制和管理,如智能灯光、安防系统等。 3. 汽车电子:STM32可以应用于汽车电子领域,用于发动机控制、车载娱乐系统、导航系统等。 4. 医疗设备:STM32可以应用于医疗设备,如医疗监护仪、心电图仪等,实现对患者的监测和治疗。 总之,基于ARM Cortex-M3的STM32嵌入式系统具有高性能、低功耗和丰富的外设接口等特点,广泛应用于各个行业的嵌入式系统开发。它为开发者提供了强大的功能和丰富的接口选项,可以满足不同领域的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

4IOT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值