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在FPGA的应用之我见

    首先,来做一个简单的实验,利用DMA来实现on-chip-memory和SRAM之间的传输,同时也在做一个关于SRAM不同地址之间的传输. 一.硬件设计 1.首先设计自己的SOPC结构,包括CPU.j ...

  2. DMA详解

    1.DMA由来DMA(Direct Memory Access,直接存储器访问).在DMA出现之前,CPU与外设之间的数据传送方式有程序传送方式.中断传送方式.CPU是通过系统总线与其他部件连接并进行 ...

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

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

  4. STM32基于HAL库通过DMA读写SDIO

    通过STM32CUBEMX生成DMA读写sdio的工程,再读写过程中总会卡死在DMA中断等待读写完成的while中,最终发现while等待的标志在SDIO的中断里置位的,而SDIO中断优先级如果小于或 ...

  5. H5拍照应用开发经历的那些坑儿

    一.项目简介 1.1.项目背景:这是一个在移动终端创新应用的项目,用户在浏览器端(微信/手Q)即可完成与金秀贤的合影,希望通过这样一种趣味体验,引发用户的分享与转发的热潮. 1.2.系统要求:ios6 ...

  6. 记2016腾讯 TST 校招面试经历,电面、笔试写代码、技术面、hr面,共5轮

    (出处:http://www.cnblogs.com/linguanh/) 前序: 距离  2016 腾讯 TST 校招面试结束已经5天了,3月27日至今,目前还在等待消息.从投简历到两轮电面,再到被 ...

  7. 阿里提前批校招内推offer经历

    经过一个半月的阿里内推面试,今天终于收到了阿里的offer邮件 .阿里的内推面试一共有四轮,本人是7月19号投的内推邮件,8月28号收到了offer的邮件.首先本人谈谈内推的看法.内推是公司招聘人才的 ...

  8. Ubuntu服务器被黑经历(ElastichSearch漏洞)

    起因 最近我们的一台Ubuntu阿里云服务器一直提示有肉鸡行为,提示了好几天,开始并没有关注,然后连续几天后发现应该是个大问题啊.很可能服务被侵入了!!! 寻找线索 一开始我是完全懵逼的状态的,Lin ...

  9. z-stack协议uart分析(DMA)

    1.从ZMain里面的main函数开始分析 2.进入int main( void ); HalDriverInit();   //硬件相关初始化,有DMA初始化和UART初始化 3.进入HalDriv ...

随机推荐

  1. 如何获取 topic 主题的列表?

    bin/kafka-topics.sh --list --zookeeper localhost:2181

  2. WeakHashMap 是怎么工作的?

    WeakHashMap 的工作与正常的 HashMap 类似,但是使用弱引用作为 key,意思就是当 key 对象没有任何引用时,key/value 将会被回收.

  3. FutureTask 是什么 ?

    这个其实前面有提到过,FutureTask 表示一个异步运算的任务.FutureTask 里面 可以传入一个 Callable 的具体实现类,可以对这个异步运算的任务的结果进行等 待获取.判断是否已经 ...

  4. 什么是可重入锁(ReentrantLock)?

    举例来说明锁的可重入性 public class UnReentrant{ Lock lock = new Lock(); public void outer(){ lock.lock(); inne ...

  5. Effective Java —— 谨慎覆盖clone

    本文参考 本篇文章参考自<Effective Java>第三版第十三条"Always override toString",在<阿里巴巴Java开发手册>中 ...

  6. DateFormat类,利用SimpleDateFormat解决系统时间初始(格式化/解析)问题

    目标: java.text.DateFormat 是日期/时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换. 格式化 ...

  7. (stm32f103学习总结)—USART串口通信

    一. USART简介 USART即通用同步异步收发器,它能够灵活地与外部设备进行全双工 数据交换,满足外部设备对工业标准 NRZ 异步串行数据格式的要求. UART即通用异步收发器,它是在USART基 ...

  8. poj_3253_priority queue

    描述 农夫约翰想要修篱墙,他需要N块木板,第i块板长Li.然后他买了一块很长的板子,足够他分成N块.忽略每次锯板子带来的损失. 约翰忘记买锯子了,于是像Don借.Don要收费,每次锯一下,就要收一次板 ...

  9. css3 弹性布局和多列布局

    弹性盒子基础 弹性盒子(Flexible Box)是css3中盒子模型的弹性布局,在传统的布局方式上增加了很多灵活性. 定义一个弹性盒子 在父盒子上定义display属性: #box{ display ...

  10. Canvas 核心技术

    最近项目需求中要写较多H5小游戏,游戏本身体量不是很复杂,主要是承载较多业务逻辑,所以决定用canvas来完成游戏部分.之前只是知道H5中有canvas这个东西,也知道它大概是画图的,但具体怎么用,还 ...