stm32驱动_STM32学习笔记06—USART驱动实验

6.1 STM32串口简介

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

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

39c9f1c0801fbc4157336fe14ccb7f6e.png

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

6.2 相关寄存器

6.2.1 控制寄存器USART_CR1

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

-

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

-

UE

M

WAKE

PCE

PS

PEIE

TXEIE

TCIE

RXNE

IE

IDLE

IE

TE

RE

RWU

SBK

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

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

-

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

USARTDIV_Mantissa[11:0]

USARTDIV_Fraction[3:0]

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

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

注:波特率的计算公式

23dd3ac6fce1ea8ed3755d04b0a93a47.png

6.2.3 数据寄存器USART_DR

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

-

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

-

DATA[8:0]

Bit 8~Bit 0:数据值

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

6.2.4 状态寄存器USART_SR

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

-

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

-

CTS

LBD

TXE

TC

RXNE

IDLE

ORE

NE

FE

PE

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,这个函数的源代码如下所示。

9b6be80816900ff7e55bed83b93e5fb7.png

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

85a02904cf4506b3c79718a231c14f92.png

6.4 串口例程

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

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

8435dcd2f342b611941d0b7544a32153.png

014482e51df2c794cb8d7b342f785e70.png

abf82dad4f18d819cbb4c7024d8cc06a.png

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

861c62037acb4f6da44c9a26b6770b16.png

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

6085e957f2ef5ff9e3c15c4da1e6580f.png

f15813b5b58fd6cd2d6df6732eaffa2f.png

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

3bb046c3b0a4404617dd47dbda40726b.png

f23f466406decc8b7bb84e65488f0b4f.png

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

27b28b924896ea193f6c4e9e229965c0.png

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

564ad694b2640433e0fbeeb7b0001c96.png

6.5 实验结果

a693a7ce7d2b4c69a9b584a159c7f8de.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值