串口通信—STM32串口功能框图讲解

发布者:eta17最新更新时间:2023-02-23 来源: zhihu关键字:串口通信  STM32 手机看文章 扫描二维码
随时随地手机看文章

STM32 的USART 简介

通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于USART 还有一个UART(Universal Asynchronous Receiver and Transmitter),它是在USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是UART。

串行通信一般是以帧格式传输数据,即是一帧一帧的传输,每帧包含有起始信号、数据信息、停止信息,可能还有校验信息。USART 就是对这些传输参数有具体规定,当然也不是只有唯一一个参数值,很多参数值都可以自定义设置,只是增强它的兼容性。USART 满足外部设备对工业标准NRZ 异步串行数据格式的要求,并且使用了小数波特率发生器,可以提供多种波特率,使得它的应用更加广泛。

USART 支持同步单向通信和半双工单线通信;还支持局域互连网络LIN、智能卡(SmartCard)协议与lrDA(红外线数据协会) SIR ENDEC 规范。

USART 支持使用DMA,可实现高速数据通信,有关DMA 具体应用将在DMA 章节作具体讲解。

USART 在STM32 应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个USART 通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错哪具体哪里出错等等。


USART 功能框图

USART 的功能框图包含了USART 最核心内容,掌握了功能框图,对USART 就有一个整体的把握,在编程时就思路就非常清晰。USART 功能框图见图1。

图1 USART 功能框图


功能引脚

TX:发送数据输出引脚。

RX:接收数据输入引脚。

SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。

nRTS:请求以发送(Request To Send),n 表示低电平有效。如果使能RTS 流控制,当USART 接收器准备好接收新数据时就会将nRTS 变成低电平;当接收寄存器已满时,nRTS 将被设置为高电平。该引脚只适用于硬件流控制。

nCTS:清除以发送(Clear To Send),n 表示低电平有效。如果使能CTS 流控制,发送器在发送下一帧数据之前会检测nCTS 引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。

SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。USART 引脚在STM32F103ZET6 芯片具体分布见表1。

表1 STM32F103VET6 芯片的USART 引脚


系统控制器有三个USART 和两个UART,其中USART1 和时钟来源于APB2 总线时钟,其最大频率为72MHz,其他四个的时钟来源于APB1 总线时钟,其最大频率为36MHz。UART 只是异步传输功能,所以没有SCLK、nCTS 和nRTS 功能引脚。


数据寄存器

USART 数据寄存器(USART_DR)只有低9 位有效,并且第9 位数据是否有效要取决于USART 控制寄存器1(USART_CR1)的M位设置,当M位为0 时表示8 位数据字长,当M位为1 表示9 位数据字长,我们一般使用8 位数据字长。

USART_DR 包含了已发送的数据或者接收到的数据。USART_DR 实际是包含了两个寄存器,一个专门用于发送的可写TDR,一个专门用于接收的可读RDR。当进行发送操作时,往USART_DR 写入数据会自动存储在TDR 内;当进行读取操作时,向USART_DR读取数据会自动提取RDR 数据。

TDR 和RDR 都是介于系统总线和移位寄存器之间。串行通信是一个位一个位传输的,发送时把TDR 内容转移到发送移位寄存器,然后把移位寄存器数据每一位发送出去,接收时把接收到的每一位顺序保存在接收移位寄存器内然后才转移到RDR。USART 支持DMA 传输,可以实现高速数据传输,具体DMA 使用将在DMA 章节讲解。


控制器

USART 有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。使用USART 之前需要向USART_CR1 寄存器的UE 位置1 使能USART,UE 位用来开启供给给串口的时钟。发送或者接收数据字长可选8 位或9 位,由USART_CR1 的M位控制。


发送器

当USART_CR1 寄存器的发送使能位TE 置1 时,启动数据发送,发送移位寄存器的数据会在TX 引脚输出,低位在前,高位在后。如果是同步模式SCLK也输出时钟信号。

一个字符帧发送需要三个部分:起始位+数据帧+停止位。起始位是一个位周期的低电平,位周期就是每一位占用的时间;数据帧就是我们要发送的8 位或9 位数据,数据是从最低位开始传输的;停止位是一定时间周期的高电平。

停止位时间长短是可以通过USART 控制寄存器2(USART_CR2)的STOP[1:0]位控制,可选0.5 个、1 个、1.5 个和2 个停止位。默认使用1 个停止位。2 个停止位适用于正常USART 模式、单线模式和调制解调器模式。0.5 个和1.5 个停止位用于智能卡模式。

当选择8 位字长,使用1 个停止位时,具体发送字符时序图见图2。

图2 字符发送时序图


当发送使能位TE 置1 之后,发送器开始会先发送一个空闲帧(一个数据帧长度的高电平),接下来就可以往USART_DR 寄存器写入要发送的数据。在写入最后一个数据后,需要等待USART 状态寄存器(USART_SR) 的TC 位为1, 表示数据传输完成, 如果USART_CR1 寄存器的TCIE 位置1,将产生中断。

在发送数据时,编程的时候有几个比较重要的标志位我们来总结下。

接收器

如果将USART_CR1 寄存器的RE 位置1,使能USART 接收,使得接收器在RX 线开始搜索起始位。在确定到起始位后就根据RX 线电平状态把数据存放在接收移位寄存器内。接收完成后就把接收移位寄存器数据移到RDR 内,并把USART_SR 寄存器的RXNE 位置1,同时如果USART_CR2 寄存器的RXNEIE 置1 的话可以产生中断。

在接收数据时,编程的时候有几个比较重要的标志位我们来总结下。

小数波特率生成

波特率指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示,单位为波特。比特率指单位时间内传输的比特数,单位bit/s(bps)。对于USART 波特率与比特率相等,以后不区分这两个概念。波特率越大,传输速率越快。

USART 的发送器和接收器使用相同的波特率。计算公式如下:

公式 21-1 波特率计算


其中,fPLCK 为USART 时钟, USARTDIV 是一个存放在波特率寄存器(USART_BRR)的一个无符号定点数。其中DIV_Mantissa[11:0] 位定义USARTDIV 的整数部分,DIV_Fraction[3:0]位定义USARTDIV 的小数部分。

例如: DIV_Mantissa=24(0x18) , DIV_Fraction=10(0x0A) , 此时USART_BRR 值为0x18A;那么USARTDIV 的小数位10/16=0.625;整数位24,最终USARTDIV 的值为24.625。

如果知道USARTDIV 值为27.68,那么DIV_Fraction=16*0.68=10.88,最接近的正整数为11,所以DIV_Fraction[3:0]为0xB;DIV_Mantissa=整数(27.68)=27,即为0x1B。波特率的常用值有2400、9600、19200、115200。下面以实例讲解如何设定寄存器值得到波特率的值。

我们知道USART1 使用APB2 总线时钟,最高可达72MHz,其他USART 的最高频率为36MHz。我们选取USART1 作为实例讲解,即fPLCK=72MHz。为得到115200bps 的波特率,此时:

解得USARTDIV=39.0625 , 可算得DIV_Fraction=0.0625*16=1=0x01 ,DIV_Mantissa=39=0x17,即应该设置USART_BRR 的值为0x171。


校验控制

STM32F103 系列控制器USART 支持奇偶校验。当使用校验位时,串口传输的长度将是8 位的数据帧加上1 位的校验位总共9 位,此时USART_CR1 寄存器的M位需要设置为1,即9 数据位。将USART_CR1 寄存器的PCE 位置1 就可以启动奇偶校验控制,奇偶校验由硬件自动完成。启动了奇偶校验控制之后,在发送数据帧时会自动添加校验位,接收数据时自动验证校验位。接收数据时如果出现奇偶校验位验证失败,会见USART_SR 寄存器的PE 位置1,并可以产生奇偶校验中断。使能了奇偶校验控制后,每个字符帧的格式将变成:起始位+数据帧+校验位+停止位。


中断控制

USART 有多个中断请求事件,具体见表2。

表2 USART 中断请求


关键字:串口通信  STM32 引用地址:串口通信—STM32串口功能框图讲解

上一篇:STM32G474评测—AD/DA模拟性能测试
下一篇:STM32的启动文件详解

推荐阅读最新更新时间:2024-11-13 10:20

Labview与C51单片机实现串口通信
Labview串口通信学会两种方法,一种是利用visa(虚拟仪器软件构架),另一种是调用activeX控件。 第一种方法(VISA)程序如图 首先,设置串口参数,串口初始化,循环内利用VISA WITE实现对串口的写操作,延时200毫秒,用VISA READ实现读操作,中间有个端口属性节点的作用是计算端口的总的字节数。非常简单,但我花了一天时间搞懂。 第二种方法 调用active X 程序图如下所示 ACTIVE X串口通信的最大优点是可以利用中断实现数据的传送或对下位机的控制,MSCOMM32控件实现串口通信主要是通过对其属性节点的设置来实现的。并利用到了事件回调方法实现中断程序。
[单片机]
stm32 I2C自收发测试例程
define BufferSize 4 define I2C2_SLAVE_ADDRESS7 0x30 /* Private macro ————————————————————-*/ /* Private variables ———————————————————*/ vu8 I2C1_Buffer_Tx = {1, 2, 3, 4}; /* I2C1待发送字节数组 */ vu8 I2C2_Buffer_Rx = {0, 0, 0, 0}; /* I2C2待接收字节缓冲 */ vu8 Tx_Idx = 0; /* I2C1数据发送计数变量 */ vu8 Rx_Idx = 0; /* I2C2数据接收计数变量 */
[单片机]
<font color='red'>stm32</font> I2C自收发测试例程
STM32系列DAC的介绍与使用
前言 最近是因为有一个项目需要输出 0~10V 的信号量,而且 想着应该可以直接使用 STM32 的 DAC 来做,虽然不一定实际使用,但是也就来试试看吧。 说句实话,博主自己做的产品,不常用 DAC,所以 本文我们就来好好复习下 STM32 的 DAC ,从应用角度讲讲如何快速使用起来。 我是矜辰所致,全网同名,尽量用心写好每一系列文章,不浮夸,不将就,认真对待学知识的我们,矜辰所致,金石为开! 一、STM32 带 DAC 的系列 目前博主产品使用的芯片为 STM32L051C8 系列,本来还想着直接CubeMX 设置一下,直接测试,才发现这个片片根本没有 DAC = =! 好吧,尴尬,后来查了下 L 系列确实都没有 D
[单片机]
<font color='red'>STM32</font>系列DAC的介绍与使用
STM32 BootLoader跳转APP,中断特殊处理
本文APP基于RTX-RTOS开发,由于该系统的特殊性,需对中断进行开启处理 1、bootloader进入app前关闭中断__set_PRIMASK(1); 2、在app中需要开启,但是开启的时间需要在RTOS创建之前,因为RTX运行基于systick运行,所以在boot中关闭中断后直接进入APP,没有开启中断的Sys tick产生中断直接hardfault。由于RTX内部封装,无法找到在RTX初始化之前开启中断,可以选择在系统时钟初始化之前完成全局中断开启。 SystemInit() { __set_PRIMASK(0); }
[单片机]
【嵌入式】STM32的库函数使用
使用编译环境为MDK5,烧录器将会使用JTAG和串口两种,芯片为STM32F103C8T6 零、前准备 1.MDK5编译环境 2.JTAG驱动或串口驱动 一、建立工程模板,写一个简单的小程序 1).创建工程目录 这里就会使用MDK创建工程了,由于STM32的工程已经比较大了,所以在工程目录下将会再创建多个目录,以便整理。 (说明一下,其实随便放都可以,只要工程都能包含以下说到的文件即可) 这里工程名就叫template吧(.代表工程目录): .CORE 存放芯片内核驱动文件; .FWLIB 使用库函数的话存放库函数; .OBJ 存放编译生成文件; .SYSTEM 存放系统代码; .USER 存放工程文件,应用程序等。 新建好
[单片机]
【嵌入式】<font color='red'>STM32</font>的库函数使用
STM32的USART接收数据通过DMA传输所遇到的问题
出现的问题: 先使用USART中断函数接收数据,判断是否接收到每帧数据的起始标记字符。如果接收到就关闭USART中断,然后开启DMA用于后续串口数据的接收。但是出现一个问题是每帧数据的起始标记为:A5 4A 05 00 00 40 81 然后开启DMA传输后所接收收到的第一个数据为0x81,也就是起始标志字符的最后一个数据。 造成这样问题的原因是: 在USART初始化时使用了函数:USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); 虽然此时DMA没有被使能,但是硬件上已经开始做DMA传输检测了。 解决办法: 将函数:USART_DMACmd(USART1,USART_DMAReq_Rx,ENA
[单片机]
stm32专题二十七:MPU6050 驱动程序
提供了一个简单的mpu6050的驱动: mpu6050.h #ifndef __MPU6050_H #define __MPU6050_H #include stdint.h #include i2c.h #include usart.h #include stm32f1xx_hal.h /* MPU6050 */ #define DELAY_MS 10 // 初始化延时 #define DEVICE_ADDR (0XD0) // 8位设备地址 #define PWR_MGMT_1 (0X6B) // 电源管理1 #define MPU6050_
[单片机]
<font color='red'>stm32</font>专题二十七:MPU6050 驱动程序
STM32的ISP方式和IAP方式下载程序有什么区别
都可以通过串口来下载啊 ISP方式:需要将BOOT管脚配置成上电从System Memory启动,System Memory中有一段BOOTLOADER来接收串口来的数据,把它们烧写到FLASH中。 IAP方式:是用户自己写一段烧写程序,通过ISP或者仿真器事先烧写到用户FLASH中,使用时通过某种方式触发这段程序,再来从串口接收数据,然后烧到相应的FLASH中,不需要改变BOOT管脚配置。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved