在《USART串口通信,中断方式,一分钟从菜鸟到大师(完整版)》文中详细介绍了中断方式串口通信的时序。在需要大量串口通信的应用中,《为什么需要DMA?你知道吗?》指出了中断方式的不足之处,及采用DMA方式在提高系统效率方面的巨大优势。下面看看以DMA方式串口通信的时序及要注意的问题。

如果是全双工通信,需要用到二个DMA通道,半双工时用一个DMA通道也可以,但是必须在每次收发前初始化。

1.初始化串口

包括使能串口时钟,使能发送和接收,定义引脚,波特率,数据位长度,奇偶校验方式,停止位位数;使能发送和接收功能;

使能串口模块接收中断(DMA方式也可以使能,看下面为什么要使用);

使能全局串口中断并设置优先级。

2. 初始化DMA

请参考《借助CMSIS宏定义,写出易读通用、易移植的DMA驱动》,关联串口数据发送寄存器与发送数据缓冲,及串口数据接收寄存器和接收数据缓冲,并使能DMA通道的发送完成中断。

时钟输入

3.时钟的用法

DMA接收时,预先要知道接收的字节数,如果不知道的话,可以关联一个比较大的缓冲,设置一个大的接收字节数(确保不会溢出),但是同样面临一个什么时候结束的问题。在《USART串口通信,中断方式,一分钟从菜鸟到大师(完整版)》说提到使用时钟超时来确认接收结束的方式,但是此时已经没有串口中断了,怎么使时钟复位呢?

这里要用到STM32时钟在定时器模式的一种工作状态,即可以工作在从模式,并且在时钟输入引脚电平发生上、下沿变化时,复位时钟。为了实现使用这个功能,在硬件电路里,将一个时钟捕获输入引脚,连接到串口的RX引脚,设置捕获为上沿都触发,触发时复位计数器,因此,在连接收到数据时,时钟不断被复位,不会发生超时中断。同时,时钟的主体仍然工作在定时器状态,根据时钟频率和串口波特率,设置一个合理的超时值(RX没数据发生时,计数器一直加,发生溢出中断),并使能溢出中断。

时间设置

4.工作时序

准备好发送数据,使能串口的DMAT(发送)和DMAR(接收)位,开始发送DMA关联的数据和准备接收接收数据。

接收:收到第一个字节时发生串口接收中断(此时DMA也在工作),在中断里初始化时钟,并关闭串口接收中断(仅用一次)。在时钟发生比较中断时,数据接收完成。

发送:在DMA传送结束后,DMA通道产生中断,此时,只是完成了DMA将最后的一个数据拷贝到串口的发送缓冲寄存器里,而串口并没有完成最后一个数据的发送。因此,在DMA的发送完成中断里,需要使能串口的发送完成TC中断。在串口发生TC中断时,数据才真正的发送完毕。

//发送DMAvoid DMA_Channel_IRQHandler(void){ 清楚DMA中断标识 使能串口发送完成中断}//串口中断void USART_IRQHandler(void){ if(接收中断) { 初始化时钟 关闭接收中断 }  if(发送中断) { //数据发送完成 }}

注意,接收完成后,DMA要初始化,为下一次接收做准备。通过上述过程可知整个发送、和接收过程各只用到二次中断,效率非常高,是一种非常理想DMA工作方式。

今天把原理说一下,代码我整理后再发。

关闭串口_USART串口通信,DMA方式,一分钟从入门到大师相关推荐

  1. 串口中断方式与DMA方式通信

    文章目录 一.串口中断介绍 1.串口发送/接收函数 2.串口中断函数 3.串口查询函数 二.中断方式串口通信 1.题目要求 2.工程建立 3.代码编写 4.烧录与结果演示 三.DMA介绍 1.DMA简 ...

  2. STM32通过DMA方式实现串口通信

    目录 一.DMA工作原理 二.创建工程项目 三.编写代码 1.在main.c写入以下函数 2.main函数中的while循环中写入以下代码 四.编译烧录 1.编译运行 2.烧录结果 五.总结 六.参考 ...

  3. 梳理STM32F429之通信传输部分---NO.3 串口空闲IDEL中断+DMA+FreeRTOS

    梳理STM32F429之通信传输部分---NO.3 串口空闲IDEL中断+DMA+FreeRTOS 目录 一.串口空闲IDEL中断: 二.串口及串口中断的配置: 三.stm32f4xx_it.h 的配 ...

  4. 关于RS485通讯中使用STM32串口以DMA方式发送数据丢失字节的问题

    1.开发平台 计算机操作系统:WIN7 64位: 开发环境:Keil MDK 5.14: MCU:STM32F407ZET6: STM32F4xx固件库:STM32F4xx_DSP_StdPeriph ...

  5. STM32串口DMA方式接收数据。类似环形FIFO。超省CPU资源!

    本文转自:http://www.amobbs.com/thread-5530588-2-1.html 一直以来都为串口接收数据所困扰: 1:如果用接收中断的话,每接收1byte就得中断一次.这样太消耗 ...

  6. 嵌入式作业STM32采用串口DMA方式发送数据

    目录 前言 要求 一.DMA的基本介绍 DMA的基本定义 DMA的主要特征 STM32F411x系列芯片DMA控制器 二.通过CubeMX配置项目 1.创建项目 2.选择芯片STM32F103C8T6 ...

  7. USART向串口助手发送数据(DMA方式)

    目录 一.前言 二.什么是DMA? 1.DMA简介 2.DMA主要特性 3.DMA框图 三.STM32CubeMX工程创建 1.题目要求 2.CubeMX工程配置 四.Keil工程的创建 五.效果展示 ...

  8. STM32使用串口空闲中断接收不定长数据帧-USART_IT_IDLE使用(不使用DMA方式)

    STM32使用串口空闲中断接收不定长数据帧-USART_IT_IDLE使用(不使用DMA方式) 前言 串口空闲中断介绍 清中断方法 串口中断处理函数 串口中断用到的全局变量定义 串口初始化(使能接收中 ...

  9. STM32F103C8T6核心开发板下,采用串口DMA方式向上位机连续发送数据的实例详解

    STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据 文章目录 STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据 前言 一.DMA应用初步 ...

最新文章

  1. html复选框多行排列布局
  2. JavaScript:从此不再怕闭包
  3. python-configparser模块
  4. pythonos pathjson_python进阶05 常用问题库(1)json os os.path模块
  5. Android转载一:Android文件命名规范
  6. LeetCode 1847. 最近的房间(排序离线计算 + 二分查找)
  7. centos6和centos7防火墙的关闭
  8. 满满干货!mysql无法修改表的数据
  9. HTTP请求解析过程 (简单概括)
  10. 去掉快捷方式图标上的箭头
  11. 我的开源项目:AAC格式分析器
  12. 分享我的Linux开发环境
  13. 2.1.0 Python初识面向对象
  14. PowerBI使用Tabular Editor翻译报表模型
  15. CAD编辑指南2:五大CAD查看器的功能盘点
  16. css3永久放大动画,CSS3 简单的方形放大动画
  17. python中hist的用法总结
  18. PHP 大数据处理思路
  19. Python PyAutoGUI模块自动化控制鼠标和键盘
  20. SonarQube速查手册

热门文章

  1. python和对象复习_【Python复习巩固 Day4】面向对象编程
  2. python的库在哪_你知道python常见的库有哪些吗?五大python库
  3. python 水位_一种适用于利用图像识别水位的水位尺的制作方法
  4. 树莓派python3.7_[Linux] 树莓派编译python3.7.4
  5. java 为什么重写equals一定要重写hashcode?
  6. 聊一聊 SpringBoot 自动配置的原理
  7. 江苏省计算机学会科学技术奖,孙国梓
  8. tomcat升级_「shell脚本」懒人运维之自动升级tomcat应用(war包)
  9. 怎么修改docker镜像的名字_Docker这些none:none的镜像,难道就不配拥有名字吗
  10. ubuntu安装软件依赖