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

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

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

3 q8 p. ~; F; u, t# F

5 Y/ M+ ~6 i) {& K6.1 STM32串口简介( c  Z4 l* @- j* ]. @* b: I/ }
       在之前的51单片机开发中已经详细地描述过串行通信协议,但是51中的串口有一个缺点,就是为了使用串口的波特率必须将晶振更换为11.0592MHz,如果采用12MHz晶振就会导致波特率误差太大,以致于串口无法正常收发,但是如果使用11.0592MHz晶振又会存在定时器计数误差(即定时器计数不准确),在STM32中很好地解决了这个问题,并且扩展了串口的应用。

" Z" B# H0 E2 Z  P/ |4 W       STM32F103ZET6最多可提供5路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持LIN、支持调制解调器操作、智能卡协议和IrDASIRENDEC规范、具有DMA等。STM32的USART模块结构框图如下图所示。0 J% j1 x2 u- n4 R2 {. }
5.png
% m( G; b9 o9 P/ [5 F我们可以从框图发现,STM32的波特率是低4位表示小数部分,高12位表示整数部分,这就是为什么STM32可以在不更换晶振的条件下使用串口通信。* {$ R* x  ?- j- O3 [/ u2 c# _
6.2 相关寄存器
5 C! Q7 S3 ]" g" _# A# \5 R6.2.1 控制寄存器USART_CR1
- P4 P2 V2 @" M! ?% v9 T# ]  H
6.png
# K: q2 `: P+ f6 Z! ]2 c5 ]& ^Bit 13:USART使能
( S# K: u) w7 u       0:USART分频器和输出被禁止- S$ L7 J! d; }: T4 F/ B( v' i; i$ q7 r
       1:USART模块使能
7 E/ G# c- F! [0 oBit 12:字长4 f3 _6 D% E6 g1 M$ E
       0:一个起始位,8个数据位,n个停止位; P' s: _, ^" x$ J) G9 ^: [
       1:一个起始位,9个数据位,n个停止位
$ J2 M( G' l9 [* SBit 11:唤醒的方法- r' S: p7 Y+ \* J2 l" x2 H) E
       0:被空闲总线唤醒
/ ~: [2 D) T: z1 }7 b: s8 v  o5 Y       1:被地址标记唤醒
# C6 M2 J  d* k1 y% N; }, sBit 10:检验控制使能
3 b  ^9 D5 y6 e" E       0:禁止校验控制
0 E5 T9 q# }7 r; @9 m' c       1:使能校验控制1 Z& l% R0 K6 O( O6 |8 _6 ~1 _
Bit 9:校验选择
" q8 b8 u) n; y- S; |6 ~       0:偶校验
- R6 L9 j5 l; ]4 n  O" K       1:奇校验
9 \+ }# z' b8 l0 `& \5 X) a9 BBit 8:PE中断使能
4 Q* Y5 q0 n: w" M       0:禁止产生中断* a/ C/ h3 b) X
       1:当USART_SR中的PE为1时,产生USART中断
6 d: j' S1 _9 U. ~+ I; hBit 7:发送缓冲区空中断使能
2 ^- Z# g  {/ j- h- g- ]9 P- U       0:禁止产生中断! O/ u+ x5 l( Z9 i1 M1 ?# `
       1:当USART_SR中的TXE为1时,产生USART中断
6 |8 A- S+ Z0 h- [9 HBit 6:发送完成中断使能4 C- r& r. h! y2 y
       0:禁止产生中断/ b9 a$ h5 l- @. _- ^
       1:当USART_SR中的TC为1时,产生USART中断! i/ \! b0 H$ {+ V, k
Bit 5:接收缓冲区非空中断使能3 K) L/ W5 t# Q1 O* S( l3 Q  ?
       0:禁止产生中断0 t9 I5 J  o% u
       1:当USART_SR中的ORE或者RXNE为1时,产生USART中断5 J" D  D  c6 }
Bit 4:IDLE中断使能2 A: T# H/ D  R5 E8 p& q
       0:禁止产生中断; y$ d1 B* H* Q% v8 {" F, S
       1:当USART_SR中的IDLE为1时,产生USART中断
  L" w, n) C9 R5 W" sBit 3:发送使能2 [7 t" e9 ]1 w& G: R4 T
       0:禁止发送
) w* }# O: X' X6 m) h1 W       1:使能发送
2 c2 k' S4 s- T8 \+ q0 W& HBit 2:接收使能, |3 z, _1 F+ k; B
       0:禁止接收# ?1 R4 c4 K, I  j4 E8 M& }& A
       1:使能接收,并开始搜寻RX引脚上的起始位  W% n8 m7 |3 R7 Q+ c- T  j
Bit 1:接收唤醒9 q8 F5 S- g( u, h7 U
       0:接收器处于正常工作模式;7 N9 |, W9 b  ^9 b
       1:接收器处于静默模式' c  s* W; X7 G" p" i
Bit 0:发送断开帧! z& K" n4 e  z
       0:没有发送断开字符  A2 ~, d/ Z4 d' f! z% b4 H' |
       1:将要发送断开字符
7 Y% `- W" Z/ ?. J6.2.2 波特率寄存器USART_BRR% D4 ]" G, l% ?% o; [% U0 [! H/ w+ U& T1 R
7.png ; r: G# e4 I) J' l/ V% `! T+ X  l
Bit 15~Bit 4:波特率整数部分4 W. t8 H' r' e; f; E
Bit 3~Bit 0:波特率小数部分
# R" }4 `7 Z- c; k注:波特率的计算公式
: \, S! C6 W  v( q, N 8.png * T$ H9 \" F) b7 k6 m; d' h
6.2.3 数据寄存器USART_DR
* E3 ]# \8 |, x* J  `) K& N 9.png 7 m  o% `% t( {. A' g" h- ^& T
Bit 8~Bit 0:数据值+ X& X- J; ~0 G: a
       包含了发送或接收的数据。由于它是由两个寄存器组成的,一个给发送用TDR,一个给接收用RDR,该寄存器兼具读和写的功能。当USART_CR1中PCE位被置位进行发送时,写到MSB的值(根据数据的长度不同,MSB是第7位或者第8位)会被后来的校验位取代。当使能校验位进行接收时,读到的MSB位是接收到的校验位。
, e/ D/ t: b$ E  `% N6.2.4 状态寄存器USART_SR
4 H9 Q% [  W- S6 x 10.png
3 b' ?  p; U! @, j& H$ x- O( R; R, TBit 9:CTS标志(如果设置了CTSE位,当nCTS输入变化状态时,该位被硬件置高,由软件将其清零). \- P0 ^; Z$ D8 h& M
       0:nCTS状态线上没有变化
1 e: n" ~) i. _% ?       1:nCTS状态线上发生变化
& Q' U4 V" s( pBit 8:LIN断开检测标志(当探测到LIN断开时,该位由硬件置1,由软件将其清零)
! @5 C# j- }. K/ F7 w. u       0:没有检测到LIN断开& a6 B2 z' W1 W3 {  w
       1:检测到LIN断开. Z+ J/ u5 R! s9 q3 S
Bit 7:发送数据寄存器空
/ I* y9 h4 \; f7 T5 A4 X, M       当TDR寄存器中的数据被硬件转移到移位寄存器时,该位被硬件置位,对USART_DR的写操作,将该位清零。/ l2 l9 E$ v2 G5 f
       0:数据还没有被转移到移位寄存器0 V9 N$ n( I3 [# b
       1:数据已经被转移到移位寄存器) X, W& E: F+ h& T
Bit 6:发送完成
* i1 c& M8 _$ L% S, G       当包含有数据的一帧发送完成后,并且TXE=1时,由硬件将该位置’1’。然后写入USART_DR清除该位。# I! ^: v- m/ c1 b$ c( ?( E, F
       0:发送还未完成
/ p5 V; u. z& ]. v       1:发送完成" B  W4 ^. Y$ E: f
Bit 5:读数据寄存器非空
( O  w8 K. j9 q* q& {7 ]  ]1 g- t3 y' g       当数据被转移到USART_DR寄存器中,该位被硬件置位。对USART_DR读操作可以将该位清零。$ |6 E" {( F/ B$ x0 E! c) q6 c' F
       0:数据没有收到;6 B3 c6 y6 J$ ?0 D+ n3 I) R1 b
       1:收到数据,可以读出; y7 y* `) e5 v: T" L/ E: a
Bit 4:检测到总线空闲
4 x# n) {. T' x2 j6 y* W2 _6 H2 N7 C       当检测到总线空闲时,该位被硬件置位,则产生中断。先读USART_SR,然后读USART_DR清除该位。
/ A* l1 b7 T& V( g* Z' F; U       0:没有检测到空闲总线3 n. ~; M. w1 w! n
       1:检测到空闲总线
" c! ~) D% x- p# N* V% VBit 3:过载错误) w" o* P) o# l) H' U
       当RXNE仍然是1的时候,当前被接收在移位寄存器中的数据,需要传送至RDR寄存器时,硬件将该位置位,先读USART_SR,然后读USART_CR清零。
/ X/ \* W$ x* U3 k! D3 Y+ O       0:没有过载错误
# h  X1 M1 l5 Q' X       1:检测到过载错误+ Q5 P7 B; x# a( Q0 g) X  F; M
Bit 2:噪声错误标志& u' ~+ J! C) w# h1 K
       在接收到的帧检测到噪音时,由硬件对该位置位。先读USART_SR,再读USART_DR清0。- E; o9 g6 y* B5 \& y
       0:没有检测到噪声1 c& U1 g; q7 k% k1 M7 v0 P+ D6 D
       1:检测到噪声+ ^5 u0 s- n" p6 J3 F7 [0 Q0 e) [
Bit 1:帧错误
+ G2 ]' E' t1 d       当检测到同步错位,过多的噪声或者检测到断开符,该位被硬件置位。先读USART_SR,再读USART_DR清零. \- ?) I6 W& ]
       0:没有检测到帧错误. H9 p6 E( b3 g; A0 n
       1:检测到帧错误或者break符
; F' K8 t6 o; P8 ^' j- o5 FBit 0:校验错误
: A" m; _+ G" I- S       在接收模式下,如果出现奇偶校验错误,硬件对该位置位。依次读USART_SR和USART_DR清零,在清除PE位前,软件必须等待RXNE标志位被置1。
$ C; L& g) I7 x6 d% U: I" z1 F2 K       0:没有奇偶校验错误;! h; ~7 |& N: b$ d. S1 J' _
       1:奇偶校验错误
" ]1 }" D1 ?* r* X7 }6.3 printf函数重映射
" }9 s4 w3 U* L% z5 D学习C语言的时候会经常用到一个函数,就是格式化输出printf,这个函数的源代码如下所示。
$ C; C) G8 w' O5 o; _, d
11.png
, Q8 j0 Q' V8 f3 ]1 B) K 从上图可以看出来,printf函数实际上的核心是putchar函数,在KEIL中,由于我们使用了MicroLIB,所以putchar函数改为了fputc函数,此时,我们只需要修改fputc函数就可以完成printf重定向,重定向代码如下图所示。
* d) c, G  M% V- s 12.png 5 e) t7 j0 b9 u  k' X
6.4 串口例程
, \; w4 U) {4 P+ f" H4 y5 @8 X使用printf函数将串口接收到的字符串发送出去。
+ I" B0 ^- E$ y" w" @
(1)底层寄存器文件stm32f10x.h添加串口寄存器地址。
$ N* @0 b/ b; p1 @+ a 13.png 14.png 15.png (2)在SYSTEM目录下新建usart1目录,并在usart1目录下新建usart1.c和usart1.h两个文件。
/ v  F4 k7 W5 K' v 16.png
( M  B" S( k: ]) `; k$ s(3)将usart1.c和usart1.h两个文件加入工程。1 m' B5 T; |5 b
17.png (4)在usart1.c文件内写入以下代码。4 O  Q; N7 ]: T0 D7 A( @1 Q
18.png 19.png (5)在usart1.h添加以下代码。
1 \* D* t# H- L* G: y6 o 20.png . u4 Y, b+ P& S$ {& \; b5 G; ?) N
(5)在1.c文件中添加以下代码。
. d# ]( @6 o/ v# Y 21.png   d, `- o2 _; D1 r" l( a% @/ t
6.5 实验结果. c* K/ S5 T$ k$ ?& h2 w5 S3 y+ g
22.png # |$ @% a% ]+ T8 O
# a5 G  J  l7 h$ E9 p) G
" |2 Z4 v+ Y. c9 q$ b$ S9 o
9 s- J* p. t9 Q! c0 C
上一篇:
& ]6 L7 q0 V6 g( ASTM32学习笔记05—GPIO输入输出实验:
3 Y3 U- D, q/ U. i9 O4 j" d6 }3 T. K2 e

9 t8 p7 p, p/ m. e/ R' V
收藏 2 评论0 发布时间:2020-10-28 13:08

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版