关于STM32H7的串口DMA的使用:

最近在使用H743做项目,想用RT-THREAD来做,但是目前(2022/5/10)之前,RT对于H7系列的支持,特别是DMA的使用可以说完全没有适配,所以现在先裸机开发各个外设的DMA,到时候再做移植

文章目录

  • 关于STM32H7的串口DMA的使用:
  • 前言
  • 一、环境准备
  • 二、cubemx配置
  • 三、修改代码
  • 四、总结

前言

h743用的人属实不多,相关教程少,特别是一些教程的例子,都难以直接上手,于是决定自己写一篇,关于如何快速开发,用使用h7系列的串口DMA

本篇教程的目的在于如何最快的上手进行开发,并不会深入底层进行分析,所提供的方法并非性能最好的

一、环境准备

keil5.30及以上版本、cubemx(其中h7系列的支持包为1.9.1),

二、cubemx配置

时钟配置等请自行配置,实在做不到就照抄正点原子时钟初始化部分
打开串口设备1,所有配置默认
打开串口1的dma通道,打开fifo,其他设置全部默认
注意记得打开DMA以及串口1中断
串口1中断cubemx默认不打开,一定要手动打开
到NVIC确认中断打开情况
点开code generation把这几个中断初始化都勾上,免得后面自己写

三、修改代码

HAL库开发虽然很快,但是如果不熟悉的话,有好多东西很难去找到。
有好多博主的教程,对于h7的dma与cache的处理,将缓存数组存在axi ram里,这毋庸置疑是高性能的写法,但是对于我们快速开发来讲,串口的速度根本用不着如此大动干戈,优化的再好波特率也只有那么多,实在不必将精力用在这里

更新一下:之前看了st官方的NUCLEO-H743ZI例程,其中的Projects\NUCLEO-H743ZI\Examples\UART\UART_TwoBoards_ComDMA下演示了两块32通过串口DMA通信,加入了MPU保护,再调用SCB_InvalidateDCache_by_Addr()函数,简单有效,下面代码重新更新一下

定义MPU

void MPU_Config(void)
{MPU_Region_InitTypeDef MPU_InitStruct;/* Disable the MPU */HAL_MPU_Disable();/* Configure the MPU as Strongly ordered for not defined regions */MPU_InitStruct.Enable = MPU_REGION_ENABLE;MPU_InitStruct.BaseAddress = 0x00;MPU_InitStruct.Size = MPU_REGION_SIZE_4GB;MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;MPU_InitStruct.Number = MPU_REGION_NUMBER0;MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;MPU_InitStruct.SubRegionDisable = 0x87;MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;HAL_MPU_ConfigRegion(&MPU_InitStruct);/* Enable the MPU */HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}

实际上是对所有地址进行MPU保护

首先是定义接收和发送缓存

uint8_t uattbuff[20]={"hello\n"};
uint8_t uattbuffdma[20]={"hello from DMA\n"};
uint8_t uatrbuffdma[128]={0};

定义了三个数组,分别用于普通模式的串口传输,DMA传输,以及DMA接收

在开始处

int main(void)
{/* USER CODE BEGIN 1 */MPU_Config();/* USER CODE END 1 *//* Enable I-Cache---------------------------------------------------------*/SCB_EnableICache();/* Enable D-Cache---------------------------------------------------------*/SCB_EnableDCache();/* MCU Configuration--------------------------------------------------------*/

加入MPU_Config配置

然后在主循环处

  /* Infinite loop *//* USER CODE BEGIN WHILE */HAL_UART_Receive_DMA(&huart1,uatrbuffdma,5);while (1){HAL_Delay(2000);HAL_UART_Transmit(&huart1,uattbuff,strlen(uattbuff),0xff);HAL_Delay(1);HAL_UART_Transmit_DMA(&huart1,uattbuffdma,strlen(uattbuffdma));/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */

循环发送
此时将程序烧录进32,已经可以看到输出了

接下来是接收中断函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance==USART1){SCB_InvalidateDCache_by_Addr ((uint32_t *)uatrbuffdma, 128);HAL_UART_Transmit(&huart1,uattbuffdma,5);HAL_UART_Receive_DMA(&huart1,uatrbuffdma,5);}
}

重点在于SCB_InvalidateDCache();函数,原因就是内存一致性,此处不展开叙述,如果有需要的可自行搜索。
此处用到SCB_InvalidateDCache_by_Addr()函数,稍微优化了一下
此时再次将代码下载到32里

可以看到串口DMA的收发操作都实现了

四、总结

可以看到HAL库+cubemx搭配的开发效率有多快,当然前提是对HAL的代码结构有基础的了解。

关于STM32H7的串口DMA的使用相关推荐

  1. STM32H7xx 串口DMA发送接收(LL库)

    文章目录 1 前言 2 STM32H7实现 2.1 关键步骤 2.2 注意事项 3 代码仓库 1 前言   关于串口DMA收发实现,不同CPU其套路都是类似的,不同之处在于寄存器配置.依赖BSP库等差 ...

  2. dma接收双缓存 stm32_容易被大多数人忽视的STM32串口DMA问题

    讨论三个问题: 1.什么叫串口DMA 请求: 2.串口简要复习: 3.串口DMA发送流程. 第一 什么叫串口DMA 请求(战舰STM32开发板) 说这个问题之前先简单回顾DMA的基本特性.先导出原子哥 ...

  3. STM32串口+DMA使用1

    STM32串口+DMA使用 STM32有5个串口资源(USART1,USART2,USART3及UART4,UART5).其中3个USART(通用同步/异步收/发器universalsynchrono ...

  4. STM32 USART串口DMA 接收和发送的源码详解!

    硬件平台:STM32F103ZET6: 开发环境:KEIL 4: 先说说应用通讯模式,串口终端的工作方式和迪文屏差不多,终端被动接受MCU发的指令,终端会偶尔主动发送一些数据给MCU(像迪文屏的触摸信 ...

  5. STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wifi模组通信问题

    一.HAL库 串口 DMA+ESP8266模组通信问题 用STM32 HAL库串口的DMA发送和空闲中断接收处理数据,单片机发送AT指令给ESP8266 wifi模组问题:单片机连续几次给wifi模组 ...

  6. STM32CubeMX HAL库串口+DMA数据发送不定长度数据接收

    参考资料:1.ST HAL库官网资料 2.https://blog.csdn.net/u014470361/article/details/79206352#comments 一.STM32CubeM ...

  7. STM32 进阶教程 15 - 串口DMA收发

    前言 串口操作相信大家一定很熟悉,如果你已经会串口的收发数据,并可以灵活使用轮询及中断方式对串口进行数据收发,那么恭喜你,学完本节内容后,也将可以学会串口的更高级操作方式,DMA方式,DMA操作串口可 ...

  8. STM32 串口DMA接收 Openmv / K210 整数、小数字符串数据 (基于HAL库)

    目录 前言 一.工程配置 二.串口DMA部分代码 1.源文件UART_DMA.c 2.头文件UART_DMA.h 3.stm32f1xx_it.c的修改 4.串口收发DMA测试 三.字符串数字提取代码 ...

  9. STM32F4 串口DMA

    串口DMA方式收发 笔者使用的是STM32F407VET6,共包含6路串口,页尾处程序已将全部串口的DMA收发配置完成,本文仅以串口1为例进行讲解.(查看代码可直接跳至第二节或页尾处下载) 1 STM ...

最新文章

  1. 汇总同一时间段的数据_数据集干货:一文读懂Mapsidejoin
  2. UOJ#310.【UNR #2】黎明前的巧克力(FWT)
  3. python画图颜色表示大小变化_python画图(线条颜色、大小、类型:点、虚线等)(图文详细入门教程四)...
  4. Django model 中的 class Meta 详解
  5. npoi 设定视图为分页预览_按班级分页打印,只要两步就行,不需要再筛选复制打印了...
  6. Android图片,PNG还是JPG?用哪种?
  7. nginx根据域名做http,https分发
  8. keytool条目_keytool常用命令
  9. 【OpenCV】Rect函数
  10. 《机器学习实战笔记--第一部分 分类算法:决策树 3》
  11. android+嵌入地图,Android 给app加入百度地图
  12. 全民奇迹修复云服务器跨服,穿过无数服务器来战你《全民奇迹MU》开启跨服PK时代...
  13. 我为什么鼓励工程师写博客
  14. NGUI Sprite的各种Type(Simple、Sliced、Tiled、Filed、Advanced)
  15. python源代码制作星空_用python画星空源代码是什么?
  16. Push rejected Push to origin/master was rejected
  17. 搭建CTF-AWD训练平台
  18. 函数式编程语言的入门级了解
  19. 简单配置Mybatis,Druid访问MySQL数据库
  20. CSS正方体背面不可见

热门文章

  1. outlook 2016 英文版 撤回邮件
  2. yaml配置Mybatis
  3. 非正式第十三届蓝桥杯大赛
  4. html中样式属性有哪些,css字体样式属性有哪些?
  5. MediaRecorder录制视频和录音
  6. MySQL中 begin 事务 begin ,第二个begin带自动提交功能???
  7. cesium获取模型实时坐标_cesium获取坐标及高程
  8. 【读论文】基于深度学习的铁路道岔转辙机故障诊断(2INTRO)
  9. iOS-APP-运行时防Crash工具XXShield练就
  10. 又拍云叶靖:基于Docker的云处理服务平台