码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • STM32之USART2 DMA通信


    STM32之DMA通信

    • 一.DMA介绍
    • 二、创建DMA例程
      • 1.创建工程,选择芯片型号
      • 2.设置RCC,选择Cystal(可选)
      • 3.设置串口
      • 4.使能中断
      • 5.DMA设置
      • 6.模式设置为Normal,右侧选择Memory
      • 7.在System view下选择DMA
      • 8.左侧点击ADD的添加
      • 9.进行时钟设置
      • 10.设置工程名和IDE的版本
      • 11.提示
    • 测试有两种情况
    • 狂打日志原因查清
    • 博客参考

    一直没有时间研究DMA,很高效的数据传输方式,今天终于有机会一窥全貌了。

    一.DMA介绍

    DMA,全称Direct Memory Access,即直接存储器访问。
    DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。
    在这里插入图片描述
    DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
    DMA框图
    在这里插入图片描述

    二、创建DMA例程

    1.创建工程,选择芯片型号

    在这里插入图片描述
    芯片根据实际情况选择

    2.设置RCC,选择Cystal(可选)

    在这里插入图片描述

    3.设置串口

    1点击USATR1
    2设置MODE为异步通信(Asynchronous)
    3基础参数:波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1 接收和发送都使能
    4GPIO引脚自动设置 USART1_RX/USART_TX
    在这里插入图片描述

    4.使能中断

    在这里插入图片描述

    5.DMA设置

    点击DMASettings 下的 Add 添加通道,传输速率设置为中速
    在这里插入图片描述

    6.模式设置为Normal,右侧选择Memory

    在这里插入图片描述

    7.在System view下选择DMA

    在这里插入图片描述

    8.左侧点击ADD的添加

    在这里插入图片描述

    9.进行时钟设置

    在这里插入图片描述

    10.设置工程名和IDE的版本

    在这里插入图片描述
    点击右上角GENERATE CODE,完成

    11.提示

    上面的步骤由于芯片差异,不是每一步都要求一样,按照实际情况来。

    三、代码改写及运行效果

    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_USART2_UART_Init();
    
      uint8_t Senbuff[10] = {1,2,3,4,5,6,7,8,9,0};
      uint8_t Senbuff2[10] = {1,2,3,4,5,6,7,8,9,0}; 	
      uint16_t count = 0;
    
      while (1)
      {
    		 count++;
    		memset(Senbuff, 0, 10);
    		memcpy(Senbuff, Senbuff2, 10);
    		Senbuff[0] = count;
    		HAL_Delay(5);
        /* USER CODE END WHILE */
    		HAL_UART_Transmit_DMA(&huart2, (uint8_t *)Senbuff, sizeof(Senbuff));
    		
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_RESET);
    	  HAL_Delay(100);
    		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_SET);
    		HAL_Delay(100);
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    测试有两种情况

    1.开机只打印一次
    在这里插入图片描述

    2.开机狂打日志
    在这里插入图片描述
    至于为什么还在研究中…

    狂打日志原因查清

    UASRT2要勾选中断,重新生成代码正常了。DMA确实比较好用
    在这里插入图片描述

    博客参考

    1.主要参考STM32之DMA通信
    2.STM32的中断控制与DMA

  • 相关阅读:
    从抓包砍到接口测试,五分钟看完全过程解析,还说你不会测试?
    End-to-end 3D Human Pose Estimation with Transformer
    一款低 EMI,无需滤波器, AB/D 类可选式音频功率放大器 SL2018
    【数据结构】—— 双链表的增删改查
    那些年你啃过的ConcurrentHashMap
    zabbix监控实战
    MYSQL海量数据存储与优化
    书评 - 人月神话(纪念典藏版)
    台式电脑连不上wifi怎么办
    MySQL数据库——第一节 — MySQL数据库基础
  • 原文地址:https://blog.csdn.net/liuqingsongmsdn2014/article/details/125607145
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号