你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32学习笔记06—USART驱动实验

[复制链接]
STMCU 发布时间:2020-10-28 13:08
STM32学习笔记06—USART驱动实验


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

       STM32F103ZET6最多可提供5路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持LIN、支持调制解调器操作、智能卡协议和IrDASIRENDEC规范、具有DMA等。STM32的USART模块结构框图如下图所示。
5.png
我们可以从框图发现,STM32的波特率是低4位表示小数部分,高12位表示整数部分,这就是为什么STM32可以在不更换晶振的条件下使用串口通信。
6.2 相关寄存器
6.2.1 控制寄存器USART_CR1

6.png
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
7.png
Bit 15~Bit 4:波特率整数部分
Bit 3~Bit 0:波特率小数部分
注:波特率的计算公式
8.png
6.2.3 数据寄存器USART_DR
9.png
Bit 8~Bit 0:数据值
       包含了发送或接收的数据。由于它是由两个寄存器组成的,一个给发送用TDR,一个给接收用RDR,该寄存器兼具读和写的功能。当USART_CR1中PCE位被置位进行发送时,写到MSB的值(根据数据的长度不同,MSB是第7位或者第8位)会被后来的校验位取代。当使能校验位进行接收时,读到的MSB位是接收到的校验位。
6.2.4 状态寄存器USART_SR
10.png
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,这个函数的源代码如下所示。

11.png
从上图可以看出来,printf函数实际上的核心是putchar函数,在KEIL中,由于我们使用了MicroLIB,所以putchar函数改为了fputc函数,此时,我们只需要修改fputc函数就可以完成printf重定向,重定向代码如下图所示。
12.png
6.4 串口例程
使用printf函数将串口接收到的字符串发送出去。

(1)底层寄存器文件stm32f10x.h添加串口寄存器地址。
13.png 14.png 15.png (2)在SYSTEM目录下新建usart1目录,并在usart1目录下新建usart1.c和usart1.h两个文件。
16.png
(3)将usart1.c和usart1.h两个文件加入工程。
17.png (4)在usart1.c文件内写入以下代码。
18.png 19.png (5)在usart1.h添加以下代码。
20.png
(5)在1.c文件中添加以下代码。
21.png
6.5 实验结果
22.png



上一篇:
STM32学习笔记05—GPIO输入输出实验:


收藏 1 评论0 发布时间:2020-10-28 13:08

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版