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

物联网之STM32开发三(USART串口)

[复制链接]
STMCU-管管 发布时间:2020-9-27 12:49
STM32-USART串口的应用内容概要:
; Y  B5 l$ L  o  R% n7 S/ L/ N# |% b7 d. @' k: d) g% W5 w" m/ r1 ?

串行通信的基本概念


' N8 Q$ g: m, f' D  B& F

串口寄存器介绍


4 C# o# ~' y1 x9 i, {

STM32实现串口数据的收发

9 {; F" t, X& P. m- H

HAL串口库函数的使用及printf的实现


; o. o1 X+ m. _2 _- [

串行通信的基本概念:

内容概要:

通信的基本概念

USART介绍

串口的电路连接

串口的通信协议

同步通信和异步通信:

: B( K! |5 W6 @2 R/ s3 L7 b( O! Z0 D

通信,最少要有两个对象,一个收,一个发。

0 m0 H1 k! B" Z# i; o, N

同步通信:一般情况下同步通信指的是通信双方根据同步信号进行通信的方式。比如通信双方有一个共同的时钟信号,大家根据时钟信号的变化进行通信。

6 b  a, R* G7 f# j( B+ C+ Z

1_meitu_1.jpg

6 K8 g  t7 s7 m' N

异步通信:是指数据传输速度匹配依赖于通信双方有自己独立的系统时钟,大家约定好通信的速度。异步通信不需要同步信号,但是并不是说通信的过程不同布。


' x1 j6 S4 w! [$ P' G( ^# p2 x

2_meitu_2.jpg


7 W8 \+ q" o# g8 s& S8 [* o

串行通信和并行通信的区别:

/ p( I8 t" `  k4 F

串行通信:指的是同一时刻只能收或发一个bit位信息。因此只用1根信号线即可。

并行通信:指的是同一时刻可以收或发多个bit位的信息,因此需要多根信号线才行。


! f4 k+ K9 o6 g% D4 I/ v4 T

3_meitu_3.jpg

5 u6 Z. n3 I" O, |0 N

                         -串行传输:数据按位顺序传输。                                                                  -并行传输:数据各个位同时传输。

                         -优点:占用引脚资源少                                                                                  -优点:速度快

                         -缺点:速度相对较慢                                                                                      -缺点:占用引脚资源多

% r8 `3 [( u/ `, l+ u! Z8 ?9 j' L6 R

单工、半双工、全双工:

单工:要么收,要么发,只能做接收设备或者发送设备。比如收音机  

半双工:可以收,可以发,但是不能同时收发, 比如对讲机  

全双工:可以在同一时刻既接收,又发送。 手机

$ \! g2 c+ E( U. m) I

4_meitu_4.jpg

/ N3 Q0 g2 \  |# E; m

常见通信总结:

: u0 T1 J) `1 n) {% q

5_meitu_5.jpg


" b# A; y9 s( j) S( p

USART基本概念:

) o) ^6 s! q: {8 {! A5 F

通用同步异步收发器(USART)灵活地与外部设备进行全双工数据通信,满足外部设备对工业标准NRZ异步串行数据格式的要求。USART通过小数波特率发生器提供了多种波特率。它支持同步单向通信和半双工单线通信;还支持LIN(局域互联网络),智能卡协议与IrDA(红外数据协会)SIR ENDEC规范,以及调制解调操作(CTS/RTS)。而且,它还支持多处理器通信。

USART支持同步模式,因此USART 需要同步始终信号USART_CK(如STM32 单片机),通常情况同步信号很少使用,因此USART和一般单片机UART使用方式是一样的,都使用异步模式。

$ I' Y- r- |* U, u2 p" }' H

) Z4 r$ N! ]! E5 k

串口电路连接:

6_meitu_6.jpg


+ ^8 w4 N; l) A3 d( U

7_meitu_7.jpg


2 v$ [5 x) d# j0 V, \4 E, [
% F0 H- u0 L* D; \

STM32f051串口:STM32F051内置多达两个通用同步 / 异步收发器( USART1 和 USART2 ),通信速度可达 6 Mbit / s

! A6 `0 W5 Z! T1 z

8_meitu_8.jpg


7 M% |5 a/ k  O( A. h
7 b0 ]! j: W% W" y: k9 p% Q. r

9_meitu_9.jpg

- j1 y, W' \+ U0 y3 r8 s

0 V5 A/ k5 e8 ]2 p( Q1 _; F: {

串口通信协议介绍:


, p# V, u' C0 z

10_meitu_10.jpg

# ?2 C' v# ^4 X/ v; D  P& I, [

/ ~9 m( N6 v" m, E" q9 L9 T- I& o

波特率:

在串行通信中,用“波特率”来描述数据的传输速率。所谓波特率,既每秒传送的二进制位数,其单位为bps(bits per second)。它是衡量串行数据速度快慢的重要指标。


( [/ D. I0 Y3 E' C: C

国际上规定一个标准的波特率系列: 110、300、600、1200、1800、2400、4800、9600、115200、14.4Kbps、19.2Kbps、……

例如:115200bps、指每秒传送115200位。通信双方必须设置同样的同学速率才能正常通信

注意:实际的数据没这么多,还包括起始位,结束位,校验位

$ O9 w2 ]: k1 ~/ q% \: d% x


. i+ }2 r$ q# F2 u( g

STM32 USART寄存器介绍& W% s5 {4 ~" x/ @

内容概要:

控制寄存器——USART_CR  

状态寄存器——USART_SR  

数据寄存器——USART_DR  

波特率寄存器——USART_BRR

串口寄存器-USART_CR1:

11_meitu_11.jpg


6 K- W3 F$ c4 Q  x% V5 z
8 k8 X' K8 Y( v7 j3 ]1 C4 W

串口寄存器-USART_CR2:


, X5 C9 _+ o2 f* M6 D! k) @

12_meitu_12.jpg

+ i7 F& x  I9 ?$ L+ S" h+ ]7 {

                                                          13_meitu_13.jpg

串口寄存器-USART_BRR:

% I! E- \& [! [1 Y' t

14_meitu_14.jpg

" V! p2 [* [9 ~/ G9 d. Z% U

串口寄存器-USART_ISR:

9 z# J1 l3 a+ l" t% X/ b9 S" e4 [

15_meitu_15.jpg


- W! x) F" n, z

串口数据的发送和接收:

! I- o7 X& D/ _5 I5 p3 v7 V; |8 a

16_meitu_16.jpg

! n& |8 ~3 I6 g2 S8 M

) s9 C0 M0 [. X

串口寄存器-USART_TDR:

+ F1 E' _" }) t( n# h

17_meitu_17.jpg

( o( z8 T# I4 a


8 T2 S1 N/ n. T, q- h, |2 A

串口寄存器-USART_RDR:


0 M2 Y, F2 Q. [

18_meitu_18.jpg

) m, k3 G+ }) d6 c" Q* M" i! L
5 v: t0 ?( w( X9 i6 u5 b5 `" n; u
STM32实现串口数据的收发
5 o7 g, |7 G6 v$ X! N1 p9 Y7 g/ |( H; E8 ?! g  ^/ z

内容概要:

串口硬件原理图

CubeMX中串口的配置

串口发送一个字符

串口接收一个字符

串口硬件原理图:

" Y3 V9 Y3 X2 [# M4 [- }/ r" [

19_meitu_19.jpg

4 Z4 y, W: ~2 b3 ?" E( p% X; x
8 e5 x0 h: t& h/ _

注意:如果无法识别串口,清装好ch340串口驱动

, N+ r; l# C; j! x# c

" G( U% {# n4 ^( Y( s8 S, G$ Q

CubeMX中串口的配置:


- ~/ E0 Z1 C# f! \! T

7 Q# `' g  H! [

20_meitu_20.jpg


4 j' H5 c- C" l8 m4 G7 h. m2 j& N4 i7 E; s& \  q: D/ |$ A

21_meitu_21.jpg


9 k: d% f  B6 c4 j1 {

串口数据的发送和接收:


5 K5 Y8 B3 Q! t5 i) }- i* Z* _7 U

22_meitu_22.jpg


. y; M1 G2 u/ R' ]4 R7 B$ R5 n: g  ]: i% Q

串口发送一个字符:


: E. F( D2 n6 L/ u2 U( O7 Q


  1. $ b2 d0 y7 N8 K
  2. void  Uart_Putchar(uint8_t ch)
    ; `5 j. u% T1 B2 u, o
  3. {( m0 Y" M3 A) E- w( V9 c, T4 R; y
  4.         while(!(USART1->ISR &(1<<7)));   //等待发送寄存器空
    ! N4 ?. F: y) S9 h
  5.         USART1->TDR = ch;       //发送字符
    0 e$ D) v$ L( f$ q* s
  6. }/ Z' j+ _1 Q+ n
  7. . J5 }, N) h. c/ h
  8. void Uart_Putstring(uint8_t  *str)        ' z" U8 x, J5 ]* _# J
  9. {7 H2 o. _% ~2 v, I- E
  10.         while(*str != '\0')9 O2 h; x, J( @2 i$ p
  11.         {  C/ _# H4 {. l: i$ E
  12.                 Uart_Putchar(*str);               
    6 a! H! ]$ P9 I
  13.                 str++;" G$ {  f/ o5 J; C# H9 u
  14.         }/ d, _+ r2 e8 e( x8 r
  15. }
复制代码
! I' R8 E5 a% o2 u- F1 E

- h. Z+ e" ~7 l% E0 s/ ^8 X& J; A/ X6 h; P7 m

串口接收一个字符:

( V  I# Q+ I' _4 {/ ]; ^5 _3 H' X! L


  1. * L9 `7 g, B. j
  2. uint8_t Uart_Getchar(void)
    4 ~# z6 n, J$ Y- ?- d. b
  3. {
    " g# M; p) u9 q3 `, B- F. N
  4.         while(!(USART1->ISR & (1<<5)));  //等待收到一个字符的数据6 g; K$ Q4 _: A9 J; A6 C+ a! P0 D
  5.         
    9 k" o. I$ z* d
  6.         return  USART1->RDR;    //返回收到的字符
    2 m! ^2 t6 {$ t# s' R) K8 x
  7. }
复制代码

( d1 u% t1 b1 N: [" Q# a0 c4 ?HAL串口库函数的使用及printf的实现3 y8 O/ ^& k& J& ?( J1 @

) b# U# W  K8 _: a: {( T

HAL库中串口的收发函数:

# l: Q; w: K# v

  1. Stm32f0xx_hal_uart.c  文件中: I& |" W5 u  h7 |- G
  2. $ _) x; q8 B( F$ c  J; J& h
  3. 串口的发送函数
    / ^* w* }) S  }+ m* \
  4. 1 K. z3 ~% O4 l
  5. HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)5 H! L* a! A0 A/ m
  6. % M2 o1 `* |6 y6 O; n: g
  7. 串口的接收函数% r9 \; h( v# T

  8. ) x: p) k. V5 @: _/ I
  9. HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
复制代码
, K% T) }0 _8 u# x4 `* B! ^

printf()实现串口重定向:


+ t( Z7 z* N1 t  q8 M

  1. # Z2 ?3 u# q9 U. z/ a' ]" N
  2. ​​printf函数调用的是c库中的fputc函数。因此我们如果重新写了fputc函数,就可以改变printf函数的功能,可以向串口打印输出。& X1 y3 E6 t1 o3 k

  3. / Q% J% J8 e- ^/ z3 u+ C! |
  4. int fputc(int ch,FILE *f){        
    : Y% X1 a/ E+ D; v
  5.     while((USART1->ISR&(1<<7)) == 0);        
    ; l4 _' b: z2 v
  6.     USART1->TDR=(uint8_t)ch;
    $ ^( w* t* I2 B. P$ ^0 H4 I
  7.     return ch;; `* r  r1 h& ]) C! E* }. w- f/ D
  8. }
复制代码

' V: \+ A! g6 h( L
/ n, [' g: v0 F  q' c! c2 w: n0 b% ]1 P3 a1 |$ Z* ]/ T9 `; c

* A3 g: `: C. v& B' R  V8 q
8 C+ d! J. U1 v& n* @3 x0 f" F  R; L) N' L: R
8 O( g: d! E" L- x9 m0 \) k
收藏 1 评论0 发布时间:2020-9-27 12:49

举报

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