USART驱动实验

发布者:JoyousJourney最新更新时间:2024-07-02 来源: elecfans关键字:USART  驱动实验  STM32 手机看文章 扫描二维码
随时随地手机看文章

6.1 STM32串口简介

在之前的51单片机开发中已经详细地描述过串行通信协议,但是51中的串口有一个缺点,就是为了使用串口的波特率必须将晶振更换为11.0592MHz,如果采用12MHz晶振就会导致波特率误差太大,以致于串口无法正常收发,但是如果使用11.0592MHz晶振又会存在定时器计数误差(即定时器计数不准确),在STM32中很好地解决了这个问题,并且扩展了串口的应用。


STM32F103ZET6最多可提供5路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持LIN、支持调制解调器操作、智能卡协议和IrDASIRENDEC规范、具有DMA等。STM32的USART模块结构框图如下图所示。

图片

我们可以从框图发现,STM32的波特率是低4位表示小数部分,高12位表示整数部分,这就是为什么STM32可以在不更换晶振的条件下使用串口通信。


6.2 相关寄存器

6.2.1 控制寄存器USART_CR1

31302928272625242322212019181716
-














1514131211109876543210
-UEMWAKEPCEPSPEIETXEIETCIERXNEIEIDLEIETERERWUSBK

Bit 13:USART使能


0:USART分频器和输出被禁止


   1:USART模块使能

Bit 12:字长


0:一个起始位,8个数据位,n个停止位


   1:一个起始位,9个数据位,n个停止位

Bit 11:唤醒的方法


0:被空闲总线唤醒


   1:被地址标记唤醒

Bit 10:检验控制使能


0:禁止校验控制


   1:使能校验控制

Bit 9:校验选择


0:偶校验


   1:奇校验

Bit 8:PE中断使能


0:禁止产生中断


   1:当USART_SR中的PE为1时,产生USART中断

Bit 7:发送缓冲区空中断使能


0:禁止产生中断


   1:当USART_SR中的TXE为1时,产生USART中断

Bit 6:发送完成中断使能


0:禁止产生中断


   1:当USART_SR中的TC为1时,产生USART中断

Bit 5:接收缓冲区非空中断使能


0:禁止产生中断


   1:当USART_SR中的ORE或者RXNE为1时,产生USART中断

Bit 4:IDLE中断使能


0:禁止产生中断


   1:当USART_SR中的IDLE为1时,产生USART中断

Bit 3:发送使能


0:禁止发送


   1:使能发送

Bit 2:接收使能


0:禁止接收


   1:使能接收,并开始搜寻RX引脚上的起始位

Bit 1:接收唤醒


0:接收器处于正常工作模式;


   1:接收器处于静默模式

Bit 0:发送断开帧


0:没有发送断开字符


   1:将要发送断开字符


6.2.2 波特率寄存器USART_BRR

31302928272625242322212019181716
-














1514131211109876543210
USARTDIV_Mantissa[11:0]USARTDIV_Fraction[3:0]













Bit 15~Bit 4:波特率整数部分

Bit 3~Bit 0:波特率小数部分

注:波特率的计算公式

图片

6.2.3 数据寄存器USART_DR

31302928272625242322212019181716
-














1514131211109876543210
-DATA[8:0]













Bit 8~Bit 0:数据值


包含了发送或接收的数据。由于它是由两个寄存器组成的,一个给发送用TDR,一个给接收用RDR,该寄存器兼具读和写的功能。当USART_CR1中PCE位被置位进行发送时,写到MSB的值(根据数据的长度不同,MSB是第7位或者第8位)会被后来的校验位取代。当使能校验位进行接收时,读到的MSB位是接收到的校验位。


6.2.4 状态寄存器USART_SR

31302928272625242322212019181716
-














1514131211109876543210
-CTSLBDTXETCRXNEIDLEORENEFEPE





Bit 9:CTS标志(如果设置了CTSE位,当nCTS输入变化状态时,该位被硬件置高,由软件将其清零)


0:nCTS状态线上没有变化


   1:nCTS状态线上发生变化

Bit 8:LIN断开检测标志(当探测到LIN断开时,该位由硬件置1,由软件将其清零)


0:没有检测到LIN断开


   1:检测到LIN断开

Bit 7:发送数据寄存器空


当TDR寄存器中的数据被硬件转移到移位寄存器时,该位被硬件置位,对USART_DR的写操作,将该位清零。


   0:数据还没有被转移到移位寄存器


   1:数据已经被转移到移位寄存器

Bit 6:发送完成


当包含有数据的一帧发送完成后,并且TXE=1时,由硬件将该位置’1’。然后写入USART_DR清除该位。


   0:发送还未完成


   1:发送完成

Bit 5:读数据寄存器非空


当数据被转移到USART_DR寄存器中,该位被硬件置位。对USART_DR读操作可以将该位清零。


   0:数据没有收到;


   1:收到数据,可以读出

Bit 4:检测到总线空闲


当检测到总线空闲时,该位被硬件置位,则产生中断。先读USART_SR,然后读USART_DR清除该位。


   0:没有检测到空闲总线


   1:检测到空闲总线

Bit 3:过载错误


当RXNE仍然是1的时候,当前被接收在移位寄存器中的数据,需要传送至RDR寄存器时,硬件将该位置位,先读USART_SR,然后读USART_CR清零。


   0:没有过载错误


   1:检测到过载错误

Bit 2:噪声错误标志


在接收到的帧检测到噪音时,由硬件对该位置位。先读USART_SR,再读USART_DR清0。


   0:没有检测到噪声


   1:检测到噪声

Bit 1:帧错误


当检测到同步错位,过多的噪声或者检测到断开符,该位被硬件置位。先读USART_SR,再读USART_DR清零


   0:没有检测到帧错误


   1:检测到帧错误或者break符

Bit 0:校验错误


在接收模式下,如果出现奇偶校验错误,硬件对该位置位。依次读USART_SR和USART_DR清零,在清除PE位前,软件必须等待RXNE标志位被置1。


   0:没有奇偶校验错误;


   1:奇偶校验错误


6.3 printf函数重映射

学习C语言的时候会经常用到一个函数,就是格式化输出printf,这个函数的源代码如下所示。

图片

从上图可以看出来,printf函数实际上的核心是putchar函数,在KEIL中,由于我们使用了MicroLIB,所以putchar函数改为了fputc函数,此时,我们只需要修改fputc函数就可以完成printf重定向,重定向代码如下图所示。

图片

6.4 串口例程

使用printf函数将串口接收到的字符串发送出去。

(1)底层寄存器文件stm32f10x.h添加串口寄存器地址。

图片

图片

图片

(2)在SYSTEM目录下新建usart1目录,并在usart1目录下新建usart1.c和usart1.h两个文件。

图片

(3)将usart1.c和usart1.h两个文件加入工程。

图片

图片

(4)在usart1.c文件内写入以下代码。

图片

图片

(5)在usart1.h添加以下代码。

图片

(5)在1.c文件中添加以下代码。

图片

6.5 实验结果

图片


关键字:USART  驱动实验  STM32 引用地址:USART驱动实验

上一篇:独立看门狗定义及使用场景
下一篇:IOT毕设|4G智能开窗器控制系统设计

推荐阅读最新更新时间:2026-02-13 16:00

手写STM32 FOC记录-----USART连接vofa+上位机显示波形
电机调试过程中很有必要对相关参数进行监控,最好的方式就是将这些数据输出出来,编程可视化的波形,正好最近看到一款很好用的上位机——vofa+,想了想可以在STM32电机调试过程中用到,将实现过记录下来如下。 1、串口配置 其他基本配置跟前两篇一样,这里不做介绍,有疑问看看前两篇文章。 根据原理图,选择USART2,模式选择异步通信,配置波特率为115200。 选择串口引脚,PA2 - Tx,PA3 - Rx 其他不用配置,默认即可,生成代码 2、收发数据验证 测试文件中编写一个串口初始化函数 主要用到以下两个接口函数 HAL_UART_Transmit_IT( huart2 ,(uint8_t*)
[单片机]
STM32 USART串口通信深度解析(第9篇)
一、通信协议介绍 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统。 当STM32想要实现一些功能,但是需要外挂一些其他模块才能实现,这就需要在两个设备之间连接上一根或多跟通信线,通过通信线路发送或者接收数据,完成数据交换,从而实现控制外挂模块和读取外挂模块数据的目的。 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发。 单工:只允许数据单向传输; 双工:指通信双方能够进行双向通信; 半双工:发送数据和接收数据不能同时传输; 全双工:可以同时进行发送数据和接受数据,一般有两根通信线,一根发送数据,一根接收数据,发送线路和接收线路互不影响。 时钟特性分为同步和异步。 同步:一般有时钟线连接,接收设备可以在时钟
[单片机]
<font color='red'>STM32</font> <font color='red'>USART</font>串口通信深度解析(第9篇)
STM32 USART 补充
串口通讯的数据包:发送设备通过自身的TXD接口传输到接收设备的RXD接口。 串口通讯的协议层中,规定了数据包的内容,由起始位、主体数据、校验位、停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据。 异步通讯:不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包,以数据帧的格式传输数据,有时还需要双方约定数据的传输速率,以便更好地同步。异步通讯中会包含帧的各种标识符,异步通讯双方的时钟允许误差较大。 “波特率” (Baudrate):表示每秒钟传输了多少个码元。异步通讯中由于没有时钟信号,以两个通讯设备之间需要约定好波特率。 数据包的起始信号由一个逻辑0的数据位表示;数据包的停止信号
[单片机]
<font color='red'>STM32</font> <font color='red'>USART</font> 补充
STM32单片机的USART的奇偶校验误区(坑)
当STM32的串口配置成带有奇偶校验位的情况下,需要软件校验是否发生奇偶校验错误,硬件只是置起奇偶校验错误标志位,并将错误的数据放到DR寄存器中,同时置起RXEN标志位,如果使能中断还是会正常进入中断,用户如果不在读取DR寄存器之前手动检验(读DR寄存器会清除错误状态标志)奇偶校验位是否置起,将会接受奇偶校验错误的数据。 因此如果想开启奇偶校验,应在读取数据寄存器时先查看标志位,如果发生校验错误标志则丢弃数据。或者进行其他应用逻辑代码处理
[单片机]
STM32学习笔记6.2】USART实践
前言 本系列文章统一围绕STM32F103C8T6最小系统开发板进行记录,如涉及其他开发板将会特别说明。 USART配置思路 打开时钟 USART1对应的RCC时钟APB2 USART1设计TX、RX引脚所对应时钟 AFIO:USART为默认复用,不需要再打开 配置TX与RX引脚模式 RX:浮空输入模式 TX:复用推挽输出模式,50MHz 串口参数配置 波特率:9600 可编程数据字长度:8位 可配置的停止位:1位 校验位:无校验位 硬件流控:无硬件流控 USART初始化 串口使能 配置USART中断源+NVIC USART管脚选择 默认不进行重映向时,USART1的发送和接收管脚为P
[单片机]
STM32单片机的USART接收数据问题解决方案
先使用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,ENABLE
[单片机]
STM32USART1与USART2模块串行数据通讯功能
STM32的USART1与USART2模块支持多种功能,包括IrDA红外、Smart Card(IC卡)等。本文就其串行数据通讯功能进行讲解。 USART功能图: 一般情况串口都采用异步方式通讯,因此本文只讲解异步通讯方式(UART)。异步模式下串口采用Tx、Rx两线,其数据模式如图: 上图为数据长度为8位(包括1位校验)的情形。位数据的意义: 总线空闲 :空闲时线上为高电平。 起始位 :一位逻辑0信号帧,代表传输开始。 数据位 :可以为7位或8位数据。低位开始传输 校验位: 若启用,使得逻辑1的位数应为偶数(偶校验)或奇数(奇校验)。若不启用,该位由一位数据帧替代(多一位数据)。 停止位:
[单片机]
<font color='red'>STM32</font>的<font color='red'>USART</font>1与<font color='red'>USART</font>2模块串行数据通讯功能
STM32学习笔记】USART 硬件流控
流控的概念源于 RS232 这个标准,在 RS232 标准里面包含了串口、流控的定义。大家一定了解,RS232 中的“RS”是Recommend Standard 的缩写,即”推荐标准“之意,它并不像 IEEE-1284、IEEE-1394 等标准,是由“委员会定制”。因而,不同的厂商在做 RS232 时,多少会有不同,流控也都会存在差异。以下我们与大家一起探讨流控的作用、搭建及如何操作。 本文着重探讨硬件流控。 为什么需要流控? 数据在两个串口之间进行通讯的时候常常会出现丢失数据的现象,比如两台计算机或者是一台计算机和一个单片机之间进行通讯,当接收端的数据缓冲区已经满了,这个时候如果还有数据发送过来,因为接收端没有时
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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