关闭串口_USART串口通信,DMA方式,一分钟从入门到大师
在《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方式,一分钟从入门到大师相关推荐
- 串口中断方式与DMA方式通信
文章目录 一.串口中断介绍 1.串口发送/接收函数 2.串口中断函数 3.串口查询函数 二.中断方式串口通信 1.题目要求 2.工程建立 3.代码编写 4.烧录与结果演示 三.DMA介绍 1.DMA简 ...
- STM32通过DMA方式实现串口通信
目录 一.DMA工作原理 二.创建工程项目 三.编写代码 1.在main.c写入以下函数 2.main函数中的while循环中写入以下代码 四.编译烧录 1.编译运行 2.烧录结果 五.总结 六.参考 ...
- 梳理STM32F429之通信传输部分---NO.3 串口空闲IDEL中断+DMA+FreeRTOS
梳理STM32F429之通信传输部分---NO.3 串口空闲IDEL中断+DMA+FreeRTOS 目录 一.串口空闲IDEL中断: 二.串口及串口中断的配置: 三.stm32f4xx_it.h 的配 ...
- 关于RS485通讯中使用STM32串口以DMA方式发送数据丢失字节的问题
1.开发平台 计算机操作系统:WIN7 64位: 开发环境:Keil MDK 5.14: MCU:STM32F407ZET6: STM32F4xx固件库:STM32F4xx_DSP_StdPeriph ...
- STM32串口DMA方式接收数据。类似环形FIFO。超省CPU资源!
本文转自:http://www.amobbs.com/thread-5530588-2-1.html 一直以来都为串口接收数据所困扰: 1:如果用接收中断的话,每接收1byte就得中断一次.这样太消耗 ...
- 嵌入式作业STM32采用串口DMA方式发送数据
目录 前言 要求 一.DMA的基本介绍 DMA的基本定义 DMA的主要特征 STM32F411x系列芯片DMA控制器 二.通过CubeMX配置项目 1.创建项目 2.选择芯片STM32F103C8T6 ...
- USART向串口助手发送数据(DMA方式)
目录 一.前言 二.什么是DMA? 1.DMA简介 2.DMA主要特性 3.DMA框图 三.STM32CubeMX工程创建 1.题目要求 2.CubeMX工程配置 四.Keil工程的创建 五.效果展示 ...
- STM32使用串口空闲中断接收不定长数据帧-USART_IT_IDLE使用(不使用DMA方式)
STM32使用串口空闲中断接收不定长数据帧-USART_IT_IDLE使用(不使用DMA方式) 前言 串口空闲中断介绍 清中断方法 串口中断处理函数 串口中断用到的全局变量定义 串口初始化(使能接收中 ...
- STM32F103C8T6核心开发板下,采用串口DMA方式向上位机连续发送数据的实例详解
STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据 文章目录 STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据 前言 一.DMA应用初步 ...
最新文章
- html复选框多行排列布局
- JavaScript:从此不再怕闭包
- python-configparser模块
- pythonos pathjson_python进阶05 常用问题库(1)json os os.path模块
- Android转载一:Android文件命名规范
- LeetCode 1847. 最近的房间(排序离线计算 + 二分查找)
- centos6和centos7防火墙的关闭
- 满满干货!mysql无法修改表的数据
- HTTP请求解析过程 (简单概括)
- 去掉快捷方式图标上的箭头
- 我的开源项目:AAC格式分析器
- 分享我的Linux开发环境
- 2.1.0 Python初识面向对象
- PowerBI使用Tabular Editor翻译报表模型
- CAD编辑指南2:五大CAD查看器的功能盘点
- css3永久放大动画,CSS3 简单的方形放大动画
- python中hist的用法总结
- PHP 大数据处理思路
- Python PyAutoGUI模块自动化控制鼠标和键盘
- SonarQube速查手册
热门文章
- python和对象复习_【Python复习巩固 Day4】面向对象编程
- python的库在哪_你知道python常见的库有哪些吗?五大python库
- python 水位_一种适用于利用图像识别水位的水位尺的制作方法
- 树莓派python3.7_[Linux] 树莓派编译python3.7.4
- java 为什么重写equals一定要重写hashcode?
- 聊一聊 SpringBoot 自动配置的原理
- 江苏省计算机学会科学技术奖,孙国梓
- tomcat升级_「shell脚本」懒人运维之自动升级tomcat应用(war包)
- 怎么修改docker镜像的名字_Docker这些none:none的镜像,难道就不配拥有名字吗
- ubuntu安装软件依赖