DMA可以直接传输数据,减少了CPU的负担,是个很好的功能,但是用的时候难免会一头雾水。这次做个小小的串口收发程序就碰到了许多问题。

之前没有注意,选择了DMA的circular模式,然后奇怪的事情发生了

很明显我这个HAL_UART_Transmit_DMA是写在while(1)外面的,但是串口调试的结果与我的预期刚刚好相反

 当时我十分迷惑,因为我明明没有放进死循环里面,但是它还是持续刷屏

我认为它应该是只发送一次的,很明显,当时的我对于DMA完全不了解(现在也是)

后面想了一下觉得应该是DMA的模式的问题,就改成了Normal模式,输出就正常了,就输出了一次语句

在此之后,我又做了一些试验,以下是部分源码

#include "main.h"
#include "dma.h"
#include "usart.h"
#include "gpio.h"
#include <stdio.h>
#include <string.h>uint8_t str_Tx1[] = "Hello World! This is stm32F103RCT6!\r\n";
uint8_t str_Tx2[64];
uint8_t str_Rx1 = 0;
uint8_t str_Rx2[64];void SystemClock_Config(void);int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_DMA_Init();MX_UART4_Init();HAL_UART_Transmit_DMA(&huart4,str_Tx1,sizeof(str_Tx1));while (1){HAL_UART_Receive(&huart4,&str_Rx1,1,1000); // 等待用户发送数据,1秒后无响应则执行后面的语句HAL_UART_Transmit_DMA(&huart4,&str_Rx1,sizeof(str_Rx1));  // 发送用户所发送的数据HAL_UART_Receive(&huart4,str_Rx2,64,1000); // 等待用户发送数据,1秒后无响应则执行后面的语句HAL_UART_Transmit_DMA(&huart4,str_Rx2,sizeof(str_Rx2));  // 发送用户所发送的数据}
}

打开串口之后如下图所示

与此同时我注意到了右下角的接收数据量还是在一直增加的

先加1,再加64(也就是我两个字符串的数据量)

然后我发送了一个9,应该是第一句接收到了

    HAL_UART_Receive(&huart4,&str_Rx1,1,1000);  // 等待用户发送数据,1秒后无响应则执行后面的语句

我再发送了一个Hello,应该是第二个字符串接收到了

    HAL_UART_Receive(&huart4,str_Rx2,64,1000);  // 等待用户发送数据,1秒后无响应则执行后面的语句

这时候如果我发送一个2,就会覆盖掉这个字符串的第一位

发送66,则会出现以下情况

也就是后面的发送数据写入字符串是覆盖写入,当写入量等于1的时候会覆盖第二个字符串的首位字符,当写入数量大于1的时候会写入第一个字符串,输入的第一个字符写入第一个字符串,其余的覆盖掉第二个字符串

鉴于我对于DMA的认识还是很浅,很多细节还是不甚了解,希望有大神不吝赐教,能在评论区指出我的过错

stm32F103RCT6的DMA使用经历相关推荐

  1. 百度成立小度蓝牙联盟,DMA+小度App打造蓝牙语音风口

    人机交互经历了三个阶段键鼠.触屏和语音交互.在国外,谷歌.亚马逊.苹果等巨头的竞争已经到达白热化状态:在国内,百度的DuerOS正是这方面的一位大玩家. 在技术发展的各个时代中,提前入局的厂商,必然能 ...

  2. 串口IDLE空闲中断+DMA实现接收不定长数据基于stm32cubemx

    引言:对于串口接收一些不定长的数据,必须面对一个问题:怎么判断一帧数据接收是否完成?通常使用RXNE非空中断配合简单的数据协议,在数据中加入帧头.帧尾,在程序中判断是否接收到帧尾来确定数据接收完毕,因 ...

  3. 华大 MCU 之五 SPI 从机 DMA 模式 配置(不能正常接收问题处理)

      最近有个需求是需要使用 华大 MCU(HC32F460) 的 SPI 作为从机来接收数据,无奈搞了两天死活不可用.配置完 SPI 的从机模式后,只要启动主机端的发送就出现如下图所示的错误: 下面是 ...

  4. STM32 HAL 硬件IIC+DMA+简单图形库控制OLED

    目录 前言 一.建立工程 二.编写和移植 前期准备 驱动部分修改 三.使用和验证 结论 (2022年1月22日重制)本文主要是移植带简单图形库的程序,如果只是实现DMA控制,建议看[0.96寸 OLE ...

  5. 学习stm32中断、DMA通信原理和编程方法

    目录 ​​​​​ 一.中断是什么 1.例1: 2.例2: 3.硬件和软件配合来协同实现中断处理的全过程 3.流程中出现的问题 中断处理经历的保存和恢复过程中的步骤: 二.什么是DMA 1.原理 1). ...

  6. 关于个人对UART+DMA +串口空闲中断的理解与疑惑

    以下只是个人根据自己实际项目的使用在论坛里看到的一些交流的理解,欢迎大家指出其中理解错误的地方. 1. 我为什么选择了 串口+DMA+空闲中断模式 在网上去搜索会看到很多的资料与简介,甚至还有许多实例 ...

  7. STM32cubemx教程 DAC+TIM+DMA

    DAC+TIM+DMA 前言 本文主要讲解定时器触发DAC去输出任意信号,DMA负责数据数据搬移. 所需工具: 开发板:STM32F103RCT6 STM32CubeMX IDE: Keil-MDK ...

  8. PIO操作与DMA操作

    IDE数据传输模式 随着技术的发展,产品对数据传输速度要求的提高,IDE接口硬盘的数据传输模式,经历过三个不同的技术变化,由最初的PIO模式,到DMA模式,再到Ultra DMA模式. 1> P ...

  9. 百度DMA+小度App的蓝牙语音解决方案入局

    前记   人机交互经历了三个阶段键鼠.触屏和语音交互.在国外,谷歌.亚马逊.苹果等巨头的竞争已经到达白热化状态:在国内,百度的DuerOS凭借着入局早,投入大,已经成为国内语音互交的一面旗帜.无论是从 ...

最新文章

  1. 浙江大学 | 深度域自适应和小目标检测挑战、技术和数据集:调研
  2. ios php rsa加密解密,php rsa加密解密使用详解
  3. 程序的加载和执行(六)——《x86汇编语言:从实模式到保护模式》读书笔记26
  4. 第二章 Linux系统安装 - VMware虚拟机安装、卸载与使用
  5. Echart 5.0+版本报错Error in data(): “TypeError: Cannot read properties of undefined (reading ‘graphic‘)“
  6. TOAD连接Oracle数据库失败:OCI_INVALID_HANDLE解决
  7. 小程序中封装的ajax 方法
  8. 7-11 玩转二叉树 (25 分)
  9. python查看dll中所有函数_Python中的函数
  10. 滴滴章文嵩:一个人的 20 年开源热情和国内互联网开源运动
  11. 开发者强势围观!Gartner 发布 2020 年十大战略科技发展趋势
  12. 最佳深度学习书单(从零到深度学习工程师)
  13. 自定义http报头_http协议报头详解HTTP协议结构
  14. JAVA 列表输入学生的信息
  15. IDM下载器插件 让浏览器不在限速
  16. 【面经】华为OD软件测试
  17. ZYB's Biology
  18. 关于云计算的一些概念理解
  19. html实现ppt缩放效果,ppt放大镜效果
  20. DIN EN ISO 4589-2塑料 用氧指数法测定燃烧行为 第2 部分:室温试验

热门文章

  1. python一键发seo文章真方便
  2. 电脑在输入报表怎么用计算机,如何生成电脑配置详细报表
  3. 脑机接口国内外公司及核心期刊
  4. Java游戏 坦克大战
  5. 利用Pytorch写多分支网络的一些想法
  6. 提升学生群体中的STEAM教育核心素养
  7. 推荐给没有机器的小伙伴------深度学习云平台Floydhub
  8. HTML霓虹灯闪光效果,HTML5文本的霓虹灯轻微闪烁动画特效
  9. python粤嵌培训可以吗
  10. 开源之夏 2022 火热来袭 | 欢迎报名 OpenMLDB 社区项目~