---
title: mcu-stm32-cube-06-配置DMA
date: 2020-05-31 16:39:05
categories:
tags:
- stm32
- cubeMx
- dma
- serial
---

知识

DMA(Direct Memory Access,直接存储器访问) 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。

可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可供其它操作使用。

DMA参数

传输模式:数据从哪里搬到哪里。三种可能的传输方向:存储器到外设、外设到存储器或存储器到存储器。

通道选择:数据传输的是走哪条道路。

仲裁器:多个DMA传输时,优先级高的优先传输。

数据长度:每次传输的数据长度,可以1个字节,2个字节(半字),4个字节(字)

指针递增:使能此模式以后,则下次传输的地址将是前一次传输的地址递增 1(对于字节)、2(对于半字)或4(对于字)。

CubeMX 配置 DMA(以 USART2 为例)

配置

添加串口以及中断

Pinout & Configuration页中的Connectivity,选择USART2

  • Mode : Asynchronous(异步); Hardware Flow Control(硬件流控) 选择 Disable

  • Configuration - Parameter Settings中 (任意设置都可以,但通讯双方要匹配)

    • Baud Rate : 波特率,一般使用 115200
    • Word Length : 字长 8
    • Parity: 校验
    • Stop Bits : 停止位
  • Configuration - NVIC Settings中 : 勾选 Enabled (开启中断)

配置DMA

  • Configuration - DMA Settings中,点击ADD分别将USART2_RXUSART_TX添加到DMA Request表中:

    • Priority:设置优先级为Low
    • DMA Request Settings-Mode
      • Normal:只传送一次(选择此项)
      • Circular:不停地传送(循环模式)
      • Data Width:选择Byte

生产中断初始化函数

Pinout & Configuration中,System Core,选择NVIC

  • Configuration - Parameter Settings中 ,确认UsartX global interrupt Enable是勾选的
  • Configuration - Code generation中,确认UsartX global interrupt DMA1 channel 7 global interruptDMA1 channel 6 global interruptSelect for init sequence ordering是勾选的。

收尾工作

填写有关的项目属性、点击右上角的GENERATE CODE

添加代码

stm32f1xx_it.h

添加全局变量

实际上,这些变量可以封装成函数,但是为了减少教程的篇幅,这里没有这么做

/* USER CODE BEGIN EC */
/* 以下变量与DMA接收流程有关 */
volatile uint8_t rx_len = 0; // 获取收到的数据长度
volatile uint8_t recv_end_flag = 0;
uint8_t rx_buffer[200] ;
/* USER CODE END EC */

stm32f1xx_it.c

修改中断处理函数

void USART2_IRQHandler(void)
{
/* USAR CODE BEGIN USART2_IRQn 0 */
uint32_t tmp_flag = 0;
uint32_t temp;
tmp_flag =__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE); //获取IDLE标志位
if((tmp_flag != RESET))//idle标志被置位
{
__HAL_UART_CLEAR_IDLEFLAG(&huart2);//清除标志位
temp = huart2.Instance->SR; //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能
temp = huart2.Instance->DR; //读取数据寄存器中的数据
HAL_UART_DMAStop(&huart2); //
temp = hdma_usart2_rx.Instance->CNDTR;// 获取DMA中未传输的数据个数,CNDTR寄存器分析见下面
rx_len = sizeof(rx_buffer) - temp; //总计数减去未传输的数据个数,得到已经接收的数据个数
recv_end_flag = 1; // 接受完成标志位置1
}
/* USAR CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
/* USAR CODE BEGIN USART2_IRQn 1 */
/* USAR CODE END USART2_IRQn 1 */
}

main.c

引入全局变量

/* USER CODE BEGIN PV */

/* 以下变量与DMA接收流程有关 */
extern volatile uint8_t rx_len; // 获取收到的数据长度
extern volatile uint8_t recv_end_flag;
extern uint8_t rx_buffer[200] ; /* USER CODE END PV */

添加printf重定向

/* USER CODE BEGIN 0 */

#include "stdio.h"

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
/* 重定向printf */
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart2, (uint8_t*)&ch,1,HAL_MAX_DELAY);
return ch;
}
/* 重定向scanf */
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart2, &ch, 1, 0xffff);
return ch;
} /* USER CODE END 0 */

添加DMA初始化

/* USER CODE BEGIN 2 */

// 在 MX_USART2_UART_Init 之后添加这2行
__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE); //使能idle中断
HAL_UART_Receive_DMA(&huart2,rx_buffer, sizeof(rx_buffer)); //打开DMA接收,数据会存入rx_buffer数组中。(删掉会导致第一次DMA异常) /* USER CODE END 2 */

使用(在需要调用的地方,添加以下函数,以main中的while(1)为例):

/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(recv_end_flag ==1)
{
//打印接收长度、数据
printf("rx_len=%d\r\n",rx_len);
printf("%s\r\n",rx_buffer);
for(uint8_t i=0;i<rx_len;i++)
{
rx_buffer[i]=0;//清接收缓存
}
rx_len=0;//清除计数
recv_end_flag=0;//清除接收结束标志位
}
HAL_UART_Receive_DMA(&huart2,rx_buffer,sizeof(rx_buffer));//重新打开DMA接收
}
/* USER CODE END 3 */

附录:

typedef struct
{
__IO uint32_t CCR; /*!< DMA stream x configuration register */
__IO uint32_t CNDTR; /*!< DMA stream x **number of data register** */
__IO uint32_t CPAR; /*!< DMA stream x peripheral address register */
__IO uint32_t CMAR; /*!< DMA stream x memory address register */
} DMA_Channel_TypeDef;

STM32 CubeMX 学习:06-配置DMA的更多相关文章

  1. cubemx+stm32串口学习汇总资料

    这篇文章是串口中断的文章--STM32基于CubeMX的高速串口收发程序(中断模式)比较有帮助. http://www.stmcu.org.cn/module/forum/thread-616613- ...

  2. STM32 FSMC学习笔记+补充(LCD的FSMC配置)

    STM32 FSMC学习笔记+补充(LCD的FSMC配置) STM32 FSMC学习笔记 STM32 FSMC的用法--LCD

  3. stm32定时器学习二——PWM设置

    /* STM32 嵌入式学习入门(5)——PWM的实现 上一篇博文介绍了定时器和PWM的基本的原理,本篇博文从代码层面来介绍PWM的具体实现.同样,还是以博主所用的开发板——正点原子开发板STM32F ...

  4. STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷

    STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷 http://www.openedv.com/thread-63849-1-1.html 实现思路:采 用STM32F103的串口1,并配 ...

  5. [FreeRTOS入门] 1.CubeMX中FreeRTOS配置参数及理解

    1.有关优先级 1.1 Configuration --> FreeRTOS MAX_PRIORITIES 设置任务优先级的数量:配置应用程序有效的优先级数目.任何数量的任务都可以共享一个优先级 ...

  6. 基于STM32的学习型通用红外遥控设备的设计实现(三)

    CPU: STM32 调试平台: STM32F103ZET和STM32F103VBT 软件平台: Keil uVision4 电路设计: Altium Designer v6.9 http://blo ...

  7. 【转载-Andrew_qian】stm32中断学习

    [转载]stm32中断学习 中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机时代,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断,但是在STM32中,中断数量大 ...

  8. stm32串口学习笔记

    stm32作为现在嵌入式物联网单片机行业中经常要用多的技术,相信大家都有所接触,今天这篇就给大家详细的分析下有关于stm32的出口,还不是很清楚的朋友要注意看看了哦,在最后还会为大家分享有些关于stm ...

  9. STM32 CubeMx使用教程

    一.STM32CubeMX 简介 STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具,目的就是为了方便开发者, 允许用户使用图形化向导生成C 初始化代码,可以 ...

  10. STM32的SPI口的DMA读写[原创www.cnblogs.com/helesheng]

    SPI是我最常用的接口之一,连接管脚仅为4根:在常见的芯片间通信方式中,速度远优于UART.I2C等其他接口.STM32的SPI口的同步时钟最快可到PCLK的二分之一,单个字节或字的通信时间都在us以 ...

随机推荐

  1. Solution - AGC060B

    Link 简要题意:在 \(n \times m\) 的方格表中填入一些不超过 \(2^k-1\) 的数.考虑所有从左上角到右下角的最短路径,要求其中满足路径上数异或和为 \(0\) 的路径只有给定的 ...

  2. CCE云原生混部场景下的测试案例

    本文分享自华为云社区<CCE云原生混部场景下在线任务抢占.压制离线任务CPU资源.保障在线任务服务质量效果测试>,作者:可以交个朋友. 背景 企业的 IT 环境通常运行两大类进程,一类是在 ...

  3. 基于三菱Q系列cc-Link的立体仓库控制系统

    系统说明: 方案选择: 工艺流程: 触摸屏设计: 程序设计:采用SFC进行编程,结构清晰,逻辑明了 本文章为学习记录,水平有限,望各路大佬们轻喷!!!    转载请注明出处!!!

  4. list转json tree的工具类

    package com.glodon.safety.contingency.job; import com.alibaba.fastjson.JSON; import com.alibaba.fast ...

  5. 我的书《Unity3D动作游戏开发实战》出版了

    首先感谢帮助和参与前期检阅的朋友们.本书是我经验积累的提炼,书中既有干货分享也有对基础内容的详解补充. 同时由于是第一次撰写书籍,许多地方仍有不足还请读者朋友们见谅. 在京东或当当等都可以购买到本书: ...

  6. pageOffice插件 springboot实现服务器上Word文档在线打开编辑保存

    需求: 在oa系统上,想实现在线,服务器上doc,docx文档,在web打开,编辑.编辑后,可以再同步保存到服务器端. 开发环境: java springboot,thymeleaf 服务器环境: 无 ...

  7. vue实现的常见的动画效果

    本文包括的动画: zoom-in zoom-in-left zoom-in-right zoom-in-top zoom-in-bottom zoom-in-center-x zoom-in-cent ...

  8. sass 混合指令 (Mixin Directives)详解

    ​ 混合指令(Mixin)用于定义可重复使用的样式,避免了使用无语意的 class,比如 .float-left.混合指令可以包含所有的 CSS 规则,绝大部分 Sass 规则,甚至通过参数功能引入变 ...

  9. itest(爱测试) 4.5.7 发布,开源BUG 跟踪管理 & 敏捷测试管理&极简项目管理软件

    itest 简介 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试5合1,又有丰富的统计分析.可按测试包分配测试用例执行,也可建测试迭代 ...

  10. 2024-06-05:用go语言,给定三个正整数 n、x 和 y, 描述一个城市中由 n 个房屋和 n 条街道连接的情况。 城市中存在一条额外的街道连接房屋 x 和房屋 y。 需要计算对于每个街道数(

    2024-06-05:用go语言,给定三个正整数 n.x 和 y, 描述一个城市中由 n 个房屋和 n 条街道连接的情况. 城市中存在一条额外的街道连接房屋 x 和房屋 y. 需要计算对于每个街道数( ...