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

STM32F103标准库开发---Uart串口通信实验---函数发送和中断接收

[复制链接]
STMCU小助手 发布时间:2022-9-7 16:09
一、Uart串口通信----函数发送7 m" \; R, z; U4 m0 X3 _' @
1. Uart串口发送(标准库)函数—单字节发送
6 _: o- \7 r* V- IUart串口发送函数在STM32F103标准库的 stm32f103x_usart.c 文件中,具体如下图所示:; k  t1 x( B7 T1 _* R5 O" B9 [: u; S
2bd9c169cd004f968a579887ed1b5140.png
9 M: g/ G" w- `# }+ o1 w5 p. l0 I
& g, u" `$ f! P8 m具体函数如下:
: ?! m' _1 K+ G2 j/ h9 z7 [" d' s4 O1 w/ L$ v% C5 T
  1. /**; Y+ {7 W/ j; E
  2.   *@功能:通过USARTx外设传输单个字节数据: Q. r; `! ~; U. J: u% D& @  Y
  3.   *@参数1:指定USART外设(USART1,USART2,USART3,USART4,USART5)* B& s: j" F1 c8 s
  4.   *@参数2:要传输的数据(最多9位数据,由初始化配置决定)
    - Q% W2 {$ k" s& Y% p1 T1 u: U
  5.   *@返回值:无# f2 ^. O3 X1 S. R% ^" Y6 i% Q
  6.   */. W9 v; d' t8 f9 H/ E
  7. void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)% C! I2 r. M" ^: D
  8. {
    1 p' R4 n4 I" R5 _3 i) S, L
  9.   /* Check the parameters */
    ; Y( K$ C- A% H9 m, T" f  C/ T
  10.   assert_param(IS_USART_ALL_PERIPH(USARTx));' K9 }* E8 Y9 d6 t6 s7 N: a
  11.   assert_param(IS_USART_DATA(Data)); + X3 l1 C9 J3 j8 G- v

  12. 9 H% H$ ^, V! m' h
  13.   /* Transmit Data */
    . J; F; \8 |& R2 |0 q% o/ `5 I
  14.   USARTx->DR = (Data & (uint16_t)0x01FF);//虽然Data是16位的,但是赋给USART_DR是最多9位有效数据/ ~  O6 Y& Z6 ^
  15. }
复制代码
6 M+ s+ T9 }2 N" m1 z  S
在STM32F103参考手册中541页,对 USART_DR 寄存器有详细介绍,具体如下所示:% s7 ?$ m* X: }& ^1 f

6 Z$ D: `; @  e" }. P4 w9 Q! d. y 48ae086e7815476c9dd674f6d98677f6.png " P0 H8 c9 y6 \4 @
7d76fe27fc5e4faab4ff5b90e403171c.png 8 \2 }" d! T: l

/ U% \! y: E& u9 HUSART_DR 寄存器最多9位数据有效,所以函数一次最多只能发送9位数据,所以函数是单字节发送。( q9 h8 I! n- n) z( |7 s

3 \" B3 g3 W) H$ S1 ~2. Uart串口检测标志(标准库)函数
) \  R, B, K8 y. @8 |Uart串口检测标志函数在STM32F103标准库的 stm32f103x_usart.c 文件中,具体如下图所示:" ^: y: t8 p0 `

( E- F4 ]% M' n6 E. \ c5e53712368841e88ce2179f01e0b2d1.png ; B* G7 ?+ ?( O' z, p

# E5 `2 B% G  y& f& {函数如下:3 E% x4 J; N7 K' K  D9 @" a! {
) V( K4 ]7 U! j$ o. \# u) ]. o
  1. /**
    4 R# y# y: p9 J7 a$ `8 ]$ u
  2.   *@功能:检查是否设置了指定的USART标志2 E2 s" |, b% f
  3.   *@参数1:指定USART外设(USART1,USART2,USART3,USART4,USART5)7 v& \3 ?& n8 X4 i9 x' t, }; o, l
  4.   *@参数2:要检查的标志
    & u/ W! t& S  R
  5.   *@返回值:标志位新状态(SET or RESET)
    9 W3 S# P5 r- ^: R, K, B
  6.   */' n1 R0 l8 X1 S2 k, w, b( @+ R
  7. FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
复制代码

% j& ^4 _3 M: K2 {参数2要检测的标志,一共有10个标志,具体如下:
' a! ?. D" R7 C# ^) n+ M+ Z1 _# h$ u) U4 x& R6 y
  1. #define USART_FLAG_CTS              ((uint16_t)0x0200)         //CTS 标志0 G* X) M) s7 Q) u0 B
  2. #define USART_FLAG_LBD              ((uint16_t)0x0100)        //LIN 断开检测标志
    9 ?+ Q. y! I1 g9 S7 B+ G
  3. #define USART_FLAG_TXE              ((uint16_t)0x0080)        //发送数据寄存器空
    8 O$ [$ l* |4 o: O
  4. #define USART_FLAG_TC               ((uint16_t)0x0040)        //发送完成
    # o& F, J1 p3 z
  5. #define USART_FLAG_RXNE             ((uint16_t)0x0020)        //读数据寄存器非空, x2 L; c$ u8 h% |0 f+ P% K
  6. #define USART_FLAG_IDLE             ((uint16_t)0x0010)        //监测到总线空闲$ x+ g: S3 f( E* X$ L
  7. #define USART_FLAG_ORE              ((uint16_t)0x0008)        //过载错误& O7 ?( Y# b: i5 O! O; T  m
  8. #define USART_FLAG_NE               ((uint16_t)0x0004)  //噪声错误标志( P6 b3 w7 Q: i1 y: q5 z
  9. #define USART_FLAG_FE               ((uint16_t)0x0002)        //帧错误2 y* {1 Y  w/ L! ?: n, t
  10. #define USART_FLAG_PE               ((uint16_t)0x0001)  //校验错误
复制代码

  w4 T1 s& I2 X4 D, i) W' IUSART_SR 状态寄存器有详细介绍,具体如下所示:4 Q) C, r1 V, |" J% b: m
. w- u4 j8 i! L7 I& q" d4 x* N+ ?
7b0832e235bc4e5e886d2fc90ed69140.png $ Z& h  w( Z" x( i+ O
39fcad2c32244ee0b0d681c89d26bf34.png + c: K. t$ F/ \9 P& _" Z5 D- b
1 S' Y$ H: O5 j+ L
3. Uart串口函数发送具体程序5 G4 w9 }+ M1 m2 I( ^
自己写一个函数,外包装了一下,方便调用。/ s( }' G( t+ y, J" p
想要通过Uart串口发送数据,调用此函数即可。9 l0 P/ X, A! D" g) z  f
具体程序如下:9 p7 ]3 Y" T2 Z1 @* }

+ B2 I2 A8 r3 {$ w+ `& D
  1. /**
    " q1 g0 f) V  ^5 }) j
  2.   *@功能:串口1发送函数,负责发送数据
    7 N: B6 X' u  z
  3.   *@参数:要传输的数据(最多9位,日常8位就是一个字节)
    3 ^$ V4 Q8 Q5 H# w' K, ?
  4.   *@返回值:无+ h- Y+ N) v+ {2 d6 z
  5.   */+ a. Q# @1 g& R/ _' U1 t0 H; t+ E
  6. void Uart1Send(u16 data)
    1 g' o7 n7 j8 y! T% r( p
  7. {, H* {: x2 b5 F, C2 u0 s
  8.         USART_SendData(USART1, data);        //发送数据; g: T) \& t9 T/ ^
  9.         while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//等待发送完成2 X4 s# T" \( f: c/ W
  10. }
复制代码

0 Y' M$ e' h. [# W二、Uart串口通信----中断接收) T0 q$ X6 C' D$ N1 G% Y
1. Uart串口接收(标准库)函数—单字节接收
8 p% F: U2 ~. F3 ~& ^4 M/ {: k* `Uart串口接收函数在STM32F103标准库的 stm32f103x_usart.c 文件中,具体如下图所示:5 O* J# _& k) m& D4 @( t; }7 U0 H
$ G$ f9 {2 B  w0 o. k' U6 r
4a7cf8731f5b4c6099849e68385cf7ac.png
! y6 U; Z  R% K" i  ^
& U0 s  u7 r# u+ l$ p# S. j具体函数如下:: Z- m* [$ Q6 z
# P$ K6 G) k8 ]4 ~, r8 \
  1. /**
    . K* V0 P; X8 ]$ U4 Q+ |
  2.   *@功能:返回USARTx外设最近接收到的数据
    1 E8 o5 K4 k0 H5 M
  3.   *@参数:指定USART外设(USART1,USART2,USART3,USART4,USART5). i( P2 ]7 D9 B7 T* {6 B
  4.   *@返回值:接收到的数据
    # }) y- B6 a1 _+ F
  5.   */
    0 a) |- j0 _3 n/ d$ m
  6. uint16_t USART_ReceiveData(USART_TypeDef* USARTx)9 w! }  Q) O. J) Z& ]. ?
  7. {" h+ O; t4 w; C# B
  8.   /* Check the parameters */
    ! M% L, O/ Z' E+ v+ C
  9.   assert_param(IS_USART_ALL_PERIPH(USARTx));1 T  d6 c* o; L# N( O, i5 e

  10. ! Y: X/ `: A, X* y" c0 T
  11.   /* Receive Data */
    . ?: z7 ]" w8 n5 D5 U
  12.   return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);
    5 S* F' F" q3 y& P" R: _4 Z
  13. }
复制代码

, e1 ~: x- U) U2 n: rUSART_DR 寄存器上面有详细介绍。9 F( c3 G, M0 |1 ?2 Z6 K. j
  R7 I/ G; o+ m: }; w
2. Uart串口检测中断(标准库)函数
1 _1 g  T$ C  X# Y% r7 lUart串口检测中断函数在STM32F103标准库的 stm32f103x_usart.c 文件中,具体如下图所示:* y; R/ V: l& B2 B! X7 q) U
5 }0 E& X0 v$ K+ K
87b80fd1510b459cb49850c946ecac89.png / W9 G7 {3 z) a2 @  L- T. O% S# S/ c
2 z* x( l; o9 K% ~, M; T
函数如下:/ ]6 Y7 U3 D+ ]) L
) a! E0 u2 j2 H* \6 W7 P
  1. /**
    1 x; O+ v7 I7 {
  2.   *@功能:检查指定的USART中断是否已经发生( o( q7 A' Y+ K4 V. r4 o& b
  3.   *@参数1:指定USART外设(USART1,USART2,USART3,USART4,USART5)7 q. A! V7 X' U4 ^- U5 u7 s
  4.   *@参数2:USART中断源校验2 d! n$ |/ z0 K- Q6 B' n' p
  5.   *@返回值:USART_IT新状态(SET or RESET)- a# p0 U, ]" k. D# z; V
  6.   */4 H" A8 ?0 t, E5 m- r
  7. ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
复制代码

( A. _3 w2 {6 X! A- c+ K' b0 U$ r" J参数2要检测的中断源,具体如下:/ Q  V9 L( U4 \& ?6 \( r

8 \$ A5 f/ b* J; x
  1. #define USART_IT_PE             ((uint16_t)0x0028)3 P. F! O6 u" h; U8 a+ U
  2. #define USART_IT_TXE            ((uint16_t)0x0727)
    $ c& m: `( d2 Y
  3. #define USART_IT_TC             ((uint16_t)0x0626)
    1 J! z0 Y% Q, n) o  e* Q0 V
  4. #define USART_IT_RXNE           ((uint16_t)0x0525)2 ~7 e. W0 B/ {& g# C. E& k
  5. #define USART_IT_ORE_RX         ((uint16_t)0x0325) /* In case interrupt is generated if the RXNEIE bit is set */( K" r& w* @8 v1 X2 W# E
  6. #define USART_IT_IDLE           ((uint16_t)0x0424)& B! g# c1 I: f9 H- w! f, Y9 h3 p; E
  7. #define USART_IT_LBD            ((uint16_t)0x0846)
    2 t) P( l& c$ u5 ?
  8. #define USART_IT_CTS            ((uint16_t)0x096A)
      ?2 ?2 r) U  M3 Y
  9. #define USART_IT_ERR            ((uint16_t)0x0060)
    , ~0 V  x9 G% s8 I6 Y
  10. #define USART_IT_ORE_ER         ((uint16_t)0x0360) /* In case interrupt is generated if the EIE bit is set */
    0 v2 j" [: x( s
  11. #define USART_IT_NE             ((uint16_t)0x0260)
    , \: E  b2 r) ]  j9 O
  12. #define USART_IT_FE             ((uint16_t)0x0160)
复制代码
+ y' I  r* P9 p; L
3. Uart串口中断接收具体程序
' \9 Y& e2 M- b0 N+ Q
Uart串口中断接收,没接收一个字节数据,进一次中断。
/ m& g7 O1 N: H( @$ a$ U
, {: @! R: u0 w* r0 d0 P
  1. /**
    / d  }2 `+ A6 L/ {. S
  2.   * @brief  串口1中断服务函数,负责接收数据$ f; q+ t' U* n
  3.   * @retval None
    " C2 p8 n& \" t/ K8 n( ^$ R
  4.   */
      ]9 _, o7 H: B8 m, F( W
  5. void USART1_IRQHandler(void) //串口1中断服务程序  p* G8 ~# k1 G; C% @' x
  6. {
    ) N/ ?8 B, T5 q8 v6 q0 l
  7.         u8 Res=0;
    9 d7 T; w% c/ v' Y0 [
  8.         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断/ f# V7 e' ^' y
  9.         {& q; ?7 T  L$ M7 l' f# F, c3 p
  10.                 Res =USART_ReceiveData(USART1);        //读取接收到的数据6 L4 P7 e8 R- z$ E0 p. M7 T6 M, Y
  11.                 /*: I2 Z& }2 f- n
  12.                   对接收的数据进行处理$ E5 s# @+ t+ X0 Y7 c6 y
  13.                 */
    0 b/ }; n& n- u- E
  14.     }
    + h, z1 R# r5 q5 S3 Z
  15. }
复制代码

$ f1 @0 g5 {0 W( N% @" @5 V  H9 B————————————————: c2 v$ {% [6 V6 S8 I
版权声明:根号五
- k8 l& b. ^3 d1 P
! W5 N" t' ^4 A7 K& t9 A
/ z- J6 n/ ~4 L  A5 o
收藏 评论0 发布时间:2022-9-7 16:09

举报

0个回答

所属标签

相似分享

官网相关资源

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