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

基于STM32F1的串口配置代码经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-14 19:12
前言$ _" [/ B$ q4 k) U5 t6 w, u$ c
  STM32的串口通信是最常用的通信方式,串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。下面根据stm32f1的中文手册和stm32f1固件库来配置一个串口。: K& H' |& ], b8 Q7 a5 k* f
0 r2 Y2 w; h" f9 Z
查看原理图4 b" }/ f4 Z( U% \; c
  通过STM32F103RET6的原理图知道串口1的管脚为PA9和PA10,下面就需要将这两个管脚配置为串口1。
4 |+ v6 Y: G; u7 c/ z3 E1 n6 }( s3 c( u! ^0 \
17b4c880436b497f83e3ddb5d00b1a04.png
+ i+ L( H0 j2 T# r- Q/ |

6 N; B, G( V; ~3 \引脚初始化% ?9 h: L8 h3 b. T7 E; g3 `
  和配置GPIO一样,使用引脚前需要使能RCC时钟,查看总线架构可以知道,GPIOA和USART1是在APB2下的。9 v! p6 o* a% c2 r/ L& Q

1 b" `0 y! m* i- ~5 R  Z
cb996ea2bc0e47d692f7d4d79e51d62c.png . h, m8 C5 [' x: g. g& b# Q& y( m
! x- Z( V/ C3 c3 C8 J, p
  查看STM32F1的库函数手册初始化函数。
% r0 q# t0 ^" K+ u, M6 |% ]+ H3 r! g
3bd3c8f860b846f1b3c08a955283c9e1.png 2 F8 T) U+ ~) q+ A
8 X2 l! m' [$ t9 k$ \& w
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 , ENABLE);0 A& M. O! F- `- \

5 l7 y/ a4 S: }3 {" @6 \  开启RCC时钟后,就可以进行引脚初始化了,查看库函数中的GPIO_Init函数,找到下面的实例,复制修改一下即可。# Q8 X' z: U+ [1 s' t0 {* D4 o
; z7 v: }. A/ u! O  f
475a1a3253444c06b5e21e6cee5eb3e3.png
! ~; M# D! m: U2 L; \
( q2 p2 Q, U; b- h, T& M
  串口的引脚模式要根据STM32F1中文参考手册的8.1.11外设的GPIO配置来配置,将PA9.TX配置为推挽复用输出,PA10.RX配置为上拉输入。
# p$ P5 h6 @( v# r' N
5 x' ^% F0 B( G+ g* M
355344a0a12a412494ce1d8f9d20a017.png
5 i3 M4 g8 B) n. W" N$ b
2 f/ S; d0 F) I
  1. GPIO_InitTypeDef GPIO_InitStructure;
    * i  D2 `- B3 \! P6 e4 S, J
  2.          //PA9.TX6 |" ^0 A! e, ^* F; W4 O
  3.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA9  V% j6 k3 h# |# X
  4.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; * F8 f# ]( o/ g4 p/ y  ~
  5.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
    ' w3 N2 W+ f. {" x. v
  6.         GPIO_Init(GPIOA, &GPIO_InitStructure);2 a3 I, X/ V( d: Y
  7.         //PA10.RX/ v2 c" U2 L. H' V
  8.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA10$ U" `' }0 a/ d: M# Q3 j2 `
  9.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 8 b) l- |& }# p) {
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
    / a. f' k5 r2 j) t
  11.         GPIO_Init(GPIOA, &GPIO_InitStructure);* L- n' j/ x& L, p
复制代码
) ]+ @  p3 Y4 j8 d! Q
串口初始化. R0 {+ A; m. \$ w/ `/ D
  查看STM32F1的库函数中文参考手册的USART_Init,根据 USART_InitStruct 中指定的参数初始化外设 USARTx 寄存器,一般只需要配置前六将,后面四想默认配置即可
0 ], Y+ @- w/ \) f6 D+ f! M0 O5 ~; w6 A$ e) S& `+ z
5f74b58dadbe41778a5a49fe42117995.png $ \4 o4 U" ^0 j) C, x* w6 g

/ z+ h+ V1 E' b2 q% o8 s5 z# K! b, [& R
  1. USART_InitTypeDef USART_InitStructure; ' w* U9 }# d& R& I
  2. USART_InitStructure.USART_BaudRate = 115200; //设置波特率
    4 _0 v1 j& y/ _4 q
  3. USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8 位数据
    ; B* M: D2 S- f$ ^1 k
  4. USART_InitStructure.USART_StopBits = USART_StopBits_1;//在帧结尾传输 1 个停止位 5 H  b5 S; F- {
  5. USART_InitStructure.USART_Parity = USART_Parity_No; //奇偶失能,无校验: {: A  ~0 C0 H2 B, o3 W
  6. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;// 硬件流控制失能8 N& I, I" {% G  S" R1 p, U4 K1 Y
  7. USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//发送、接收使能+ [& S. S/ ~) C/ T
复制代码
+ _. v# `1 Z9 o: J
完整配置代码' D- Y) _: W0 f. s' J7 W9 y% |; ~
  1. void Usart1_Init(void)//串口1初始化7 j( V$ W6 p4 P$ @* ?
  2. {
    : k- S7 J1 j& j* K% ~
  3.        
    0 o  x# ~# W2 U6 J
  4.         ; y! Q# Q* |- B( T
  5.         //GPIO端口配置
    ! h' H# q8 u2 _9 l& J8 y1 O0 D0 h) X
  6.         GPIO_InitTypeDef GPIO_InitStructure;
    3 v5 u7 T1 @; ]
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 , ENABLE);//使能RCC时钟) }& b) y, L  _
  8.          //PA9.TX
    - `# X8 I/ L  K) z$ D9 Q$ @. j
  9.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA9- G: p& x+ s/ v% ]
  10.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ) d* v6 r2 n, V8 Z8 a# r
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出1 D2 W# y3 x% X+ n7 {: K7 V( p
  12.         GPIO_Init(GPIOA, &GPIO_InitStructure);
    7 H# O- o7 r: |+ a' O4 ]/ G) h; \
  13.         //PA10.RX6 u- c, w4 b1 U: |
  14.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA10
    ; _* ?! r( Q4 K& L0 r
  15.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; * ]5 V: J4 v5 a: E1 U
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入9 a# K9 Q& d1 h) I/ r# _; C/ ]0 |' U. A
  17.         GPIO_Init(GPIOA, &GPIO_InitStructure);
    8 A% }. t7 y2 U$ e
  18.        
    ! m5 H# G% M4 w+ T7 h3 [/ W) M
  19.         //USART 初始化设置          q1 B  `- J# Z4 ~. W
  20.         USART_InitTypeDef USART_InitStructure; " G  J, [/ d8 U  j" A. a
  21.         0 @. d6 z5 i  b
  22.         USART_InitStructure.USART_BaudRate = 115200; //设置波特率
    4 N) Y! K9 h9 f! C9 H- a
  23.         USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8 位数据
    ! N$ |3 W" |5 m# P
  24.         USART_InitStructure.USART_StopBits = USART_StopBits_1;//在帧结尾传输 1 个停止位
    9 W8 M! U6 s+ U
  25.         USART_InitStructure.USART_Parity = USART_Parity_No; //奇偶失能,无校验2 h6 l4 _& o- V6 }* s
  26.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;// 硬件流控制失能8 G( y2 v' r& p/ k# g2 B
  27.         USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//发送、接收使能3 A4 w# y% y0 X) d6 D
  28.        
    & \. e- |, H! ]4 l. s
  29.         USART_Init(USART1, &USART_InitStructure);//初始化串口19 ?* `2 c  T- p9 _
  30.         USART_Cmd(USART1, ENABLE);               //使能串口1
    * H4 b, J6 e: }8 \; V0 {! b
  31. $ \/ Z0 }# q- e, Q3 A- _& ?9 q
  32. }
    " e$ d9 F9 h" ^& b+ R- O; x
复制代码

7 }; K( q1 d# @. F! A$ |- r
+ U- f4 a/ p% I" [- e$ f) n2 L# ]发送单个数据
( ?- D1 i, }0 A. X1 q- q( [+ U  |
  1. void Usart1_sentbyte(char data)
    # U$ B; Y8 P* ]: F3 Q$ K( G+ l9 \1 D
  2. {9 o5 K6 n/ ]2 j( d
  3.         while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==SET));* N" w5 |) ?/ h- P5 h& y! P
  4.         USART_SendData(USART1,data);/ Q& v$ x) n9 P+ E9 |! F1 P6 O
  5.        
    # G- G5 ^  f& h- p/ m
  6. }
    2 f' u+ x& g7 ?& {& }" H
复制代码

1 U8 w( Y# }5 x: U5 X8 Y: O  V9 C; i7 a6 P) T' V0 b
发送字符串
4 a! m1 D7 P7 F8 o* [) s
  1. void Usart1_sentstring(char *data)2 z! |0 E$ S; e% n% ~
  2. {
    " j1 J6 B! @& j5 E/ b
  3.         while(*data)  j9 {) Z! r) A
  4.         Usart1_sentbyte(*data++);
    3 R8 T0 f' G" h# j
  5.        
    & w1 `3 c5 j6 C# D6 |
  6. }
    + o! L6 R0 F* |1 B
复制代码

/ S9 ~& a+ C/ X- C$ Y% E2 @  D
/ p5 K( ~) M6 E接收字符

; E4 K9 U( ]' w2 S; E
  1. char Usart1_Receivebyte(void)
    % H+ j! g  @6 Y; P* o
  2. {
      C8 l5 P$ @( U6 u/ a5 b
  3.         while(!(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)==SET));
    ; |0 \- M* k% ?1 R- M/ K
  4.         return USART_ReceiveData(USART1);0 Y; p. w- {1 x
  5. }
    ' j+ R0 e$ E- @$ m7 c/ X  F. a
复制代码
- S8 x& d& U5 P( b4 n  [
' E# f0 G* ^& v/ z' v' P0 r

1 j" r+ G  ?: g6 X. P————————————————: v# c! t( c8 L
版权声明:纸箱里的猫咪
$ @( E6 q- b- G5 A, w# X如有侵权请联系删除4 x4 [. F' x$ ?
4 z: t( e6 l! }4 f3 |: O% p

1 W* G  J$ }0 m7 i, D' a+ I9 ]  w2 j3 X* @# v- x  Z# ^7 m# J
收藏 评论0 发布时间:2023-5-14 19:12

举报

0个回答

所属标签

相似技术帖

官网相关资源

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