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

查看: 5329|回复: 4

【JESSE】STM32初学(寄存器版)——USART

[复制链接]

10

主题

170

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-10-7
发表于 2017-8-24 19:41:33 | 显示全部楼层 |阅读模式

通用同步异步收发器(USART)在大部分STM32程序中都会用上,无论是功能需要,要求板子与外部设备通信,还是用于程序的调试,都离不开USART
既然用的这么广,我们就先看看如何在寄存器模式下使用它。
那首先就是要知道它的寄存器咯
1.PNG
有七个寄存器,分别是:状态寄存器(SR),数据寄存器(DR),波特率寄存器(BRR),控制寄存器1CR1),控制寄存器2CR2),控制寄存器3CR3),还有一个保护时间和预分频寄存器(GTPR),它们的作用大家一看就知道了,最后一个寄存器可以暂时不用管,先看看它的控制寄存器
USART1_CR1
  
位 15 OVER8:过采样模式 (Oversampling mode)
  0: 16 倍过采样
  1: 8 倍过采样
  
  
13 UEUSART 使能 (USART enable)
  
该位清零后, USART 预分频器和输出将停止,并会结束当前字节传输以降低功耗。此位由软
  件置
1 和清零。
  
    0:禁止 USART 预分频器和输出
  
    1:使能 USART
  
  
12 M:字长 (Word length)
  
该位决定了字长。该位由软件置 1 或清零。
  
    01 起始位,  8 数据位, n 停止位
  
    11 起始位,  9 数据位, n 停止位
  
  
10 PCE:奇偶校验控制使能 (Parity control enable)
  
该位选择硬件奇偶校验控制(生成和检测)。使能奇偶校验控制时,计算出的奇偶校验位被
  插入到
MSB 位置(如果 M=1,则为第  9 位;如果 M=0,则为第  8 位),并对接收到的数据
  检查奇偶校验位。此位由软件置
1 和清零。一旦该位置  1PCE 在当前字节的后面处于活动
  状态(在接收和发送时)。
  
    0:禁止奇偶校验控制
  
    1:使能奇偶校验控制
  
  
9 PS:奇偶校验选择 (Parity selection)
  
该位用于在使能奇偶校验生成/检测(PCE 位置 1)时选择奇校验或偶校验。该位由软件置  1
  清零。将在当前字节的后面选择奇偶校验。
  
    0:偶校验
  
    1:奇校验


3 TE:发送器使能 (Transmitter enable)
  
该位使能发送器。该位由软件置 1 和清零。
  
    0:禁止发送器
  
    1:使能发送器

  
2 RE:接收器使能 (Receiver enable)
  
该位使能接收器。该位由软件置 1 和清零。
  
    0:禁止接收器
  
    1:使能接收器并开始搜索起始位
  
USART_CR2
  
13:12 STOP:停止位 (STOP  bit)
  
这些位用于编程停止位。
  
    001 个停止位
  
    010.5 个停止位
  
    102 个停止位
  
    111.5 个停止位
  
注意: 0.5 个停止位和 1.5 个停止位不适用于 UART4 UART5
  
USART_CR3
  
11 ONEBIT:一个采样位方法使能 (One  sample bit method enable)
  
该位允许用户选择采样方法。选择一个采样位方法后,将禁止噪声检测标志 (NF)
  
    0:三个采样位方法
  
    1:一个采样位方法
  
这里并没有列出它的中断使能位,中断放在下一篇进行探讨。
USART_SR
  
7 TXE:发送数据寄存器为空 (Transmit data register empty)
  
TDR 寄存器的内容已传输到移位寄存器时,该位由硬件置  1。如果 USART_CR1 寄存器
  中
TXEIE = 1,则会生成中断。通过对  USART_DR 寄存器执行写入操作将该位清零。
  
    0:数据未传输到移位寄存器
  
    1:数据传输到移位寄存器
  
注意: 单缓冲区发送期间使用该位
  
  
6 TC:发送完成 (Transmission complete)
  
如果已完成对包含数据的帧的发送并且 TXE 1,则该位由硬件置  1。如果 USART_CR1 寄存
  器中
TCIE = 1,则会生成中断。该位由软件序列清零(读取 USART_SR 寄存器,然后写入
  
USART_DR 寄存器)。 TC 位也可以通过向该位写入‘0来清零。建议仅在多缓冲区通信
  时使用此清零序列。
  
    0:传送未完成
  
    1:传送已完成
  
  
5 RXNE:读取数据寄存器不为空 (Read  data register not empty)
  
RDR 移 位 寄  存 器 的 内 容 已 传 输 到 USART_DR 寄 存 器  时,该 位 由 硬 件 置 1。如 果
  
USART_CR1  寄存器中 RXNEIE = 1,则会生成中断。通过对 USART_DR 寄存器执行读入
  操作将该位清零。
RXNE 标志也可以通过向该位写入零来清零。建议仅在多缓冲区通信时使
  用此清零序列。
  
    0:未接收到数据
  
    1:已准备好读取接收到的数据
  
USART_DR
数据寄存器只有8位有效位,31-9都是保留位。
数据寄存器包含两个寄存器,一个用于发送(TDR),一个用于接收(RDR),但是我们只能看到一个,就是(DR),因此它具有双重功能(读和写),DR具体代表哪一个寄存器取决于所执行的操作是“读取”还是“写入”。
USART是通过GPIO与外部连接的,那对应的引脚就复用了特定的功能。
我们从参考手册中可以找到相应的描述
2.PNG
3.PNG
说了这么多,我们来看看代码(我的板卡只引出了USART6)
  1. void usart_init(uint32_t brr)
  2. {
  3.     RCC->APB2ENR |= 0x01<<5;    //开启USART6的时钟
  4.    
  5.     USART6->CR1  &= ~(0x01<<15|0x01<<13|0x01<<12|0x01<<10|0x01<<3|0x01<<2);
  6.     USART6->CR1  |= (0x01<<13|0x01<<3|0x01<<2);
  7.     USART6->CR2  &= ~(0x03<<12);
  8.     USART6->CR3  &= ~(0x01<<11);
  9.     USART6->BRR   = 16000000/brr;
  10. }

复制代码
对应参考手册,我们知道这几行代码将USART6的控制寄存器进行了以下配置:
16倍过采样
使能USART
1 起始位, 8 数据位,n 停止位
禁止奇偶校验控制
使能发送器
使能接收器并开始搜索起始位
1 个停止位
三个采样位方法
最后一个寄存器BRR配置的是USART6的波特率,形参brr就是波特率值,例如9600,115200等值。
往BRR这个寄存器中写入的值是怎么算的呢,参考手册上有一个公式
4.PNG
其中OVER8是过采样模式,我们采用的是16倍过采样(至于什么是16倍过采样,看参考手册吧),所以OVER8为0,fck是APB2总线时钟频率,简化之后便是:
波特率 = fck/(16*USARTDIV)
USARTDIV 是一个存放在 USART_BRR 寄存器中的无符号定点数(USARTDIV是个浮点数)。
我们再看看波特率寄存器是什么样子的。
5.PNG
参考手册上说,寄存器的低四位是用来存放USARTDIV的小数部分,15-4是用来存放USARTDIV的整数部分,好像有点懵逼,再说小数怎么存进去,不知道怎么做可以看看别人是怎么做的呀。
6.PNG
正点原子是将小数部分乘以16(转16进制)再加上整数部分左移4位,之后写入BRR寄存器中的,这里好像可以发现点什么,整数左移4位不也相当于乘以16吗?小数乘以16后加上整数乘上16,再加上之前的波特率计算公式,不就相当于:
波特率 = fck/写入BRR中的值
将公式变换一下,就得到:
写入BRR中的值 = fck/波特率
这就尴尬了,绕了这么一圈。
这只是进行了USART6的相关配置,USART是通过GPIO与外部设备连接的,那肯定是要对相应的引脚进行配置了,
7.PNG
从数据手册中我们找到了,能复用为USART6-RX和TX的引脚分别为PG9和PG14,接着便是初始化
8.PNG
这段初始化程序和前面不同的地方在于,它配置了AFR寄存器
9.PNG
AFR寄存器分为AFRL和AFRH(程序中的结构体将其封装为一个具有两个元素的数组),四个位控制一个引脚,共有16种复用功能。从上面的图2和图3了解到复用为USART6是AF8,所以程序便是将相应为上清零,并写入相应数值。
到这,我们只要写好发送和接收函数就可以进行简单的收发了
来张效果图
10.PNG
这篇帖子只是对USART进行简单的配置和应用,但是并没有将USART的问题讲述清楚,还有时钟、中断等问题,后续再更



project1.rar

下载

1.76 MB, 下载次数: 79, 下载积分: ST金币 -1

<
回复

使用道具 举报

13

主题

785

回帖

60

蝴蝶豆

金牌会员

最后登录
2020-4-14
发表于 2018-2-1 10:57:50 | 显示全部楼层
写的很详细,好久没更新了。。。
回复 支持 反对

使用道具 举报

10

主题

170

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-10-7
 楼主| 发表于 2018-2-3 11:43:40 | 显示全部楼层
springvirus 发表于 2018-2-1 10:57
写的很详细,好久没更新了。。。

不好意思不好意思,确实拖了很久。在学校做完毕设、答辩完就南下奔波了。年后找到工作稳定下来继续更,谢谢支持
回复 支持 反对

使用道具 举报

13

主题

785

回帖

60

蝴蝶豆

金牌会员

最后登录
2020-4-14
发表于 2018-2-5 08:27:47 | 显示全部楼层
@乔木 发表于 2018-2-3 11:43
不好意思不好意思,确实拖了很久。在学校做完毕设、答辩完就南下奔波了。年后找到工作稳定下来继续更, ...

辛苦了,毕业这阵子确实需要处理的事情很多
回复 支持 反对

使用道具 举报

91

主题

4603

回帖

4

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2018-9-5 23:55:00 | 显示全部楼层
谢谢分享                        
回复 支持 反对

使用道具 举报

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