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

【经验分享】STM32CubeMX— 配置串口1 接收中断

[复制链接]
STMCU小助手 发布时间:2022-5-15 16:41
实验操作0 Z$ y: N. t2 X* H* ^
1、打开cubemax ,芯片选取。
2 w, \3 S# w% ^& k5 y  {4 u% b选取STM32F103RCt6 (根据实际情况选择),LQFP64封装的。然后鼠标双击中间那个圈住的地方就可以进入配置界面。
* D' B0 f2 R) _2 ]7 i5 _: X& g1 g6 M  P# f& e
20201021113415189.png 图1、芯片选取界面
) Z+ H1 e. G/ N4 C& [1 S3 i. b/ w
# ?& `' L& U# u; Q  [, s
20201021114212900.png
8 x- w7 N! ^8 ]5 ]( Z1 w5 o' P
) }  ~7 g% m' [& ^图2、配置界面: o, A! ]; S" V2 T

& A/ w8 A' u; l/ h% A. ?& J6 g如上图:
9 Z1 H. M) s* O, ]5 J' s' K% L* i* |( X. E7 L/ G3 R
            (1)、标号1 为系统核心的配置,其中由晶振的配置。3 e' b3 {; K1 @

! N  P+ t+ T4 a5 `/ `            (2)、标号2为模拟量相关的外设配置,如adc,dac,等。
7 {& g, S. Z& z$ ^0 o3 u3 A
7 G( _7 Z% Z# I, m1 x" q- c            (3)、标号3为定时器配置。4 j/ o; G3 {2 A5 l4 B+ J" }) E
& L5 q5 ^7 y. C3 t1 L2 |
            (4)、标号4为通信相关的外设。比如串口,CAN等。
' @( \  X2 s& }. |- s" W
. K; ]! R! j% s$ |0 {8 r其他图中有标注。8 c/ z6 _6 K* F" x

: ]) b, d% e) O2、晶振配置
2 g8 z' G  D" X) \& Q) v- ^        晶振是单片机的时钟来源,相当于心脏,先添加晶振,点击上图编号1,然后出现下图,在点击RCC,进入晶振' h. I8 i! \% [
/ U+ }* n' c2 `2 M+ Y/ U
20201021114516692.png
$ j, C, V6 @- Z+ V$ I8 |
# b/ C6 h. k. {) ?0 D  B$ v# G0 t 20201021114618318.png
" S" ?. y0 F3 C) {; l1 O3 z3 B- m5 e7 ~, D4 {- g
如上图:HSE 和LSE 都选择Crystal..选项。然后注意芯片示意图上有四个引脚变为绿色。
& c3 U3 G0 K  @, k" A! i7 I; {( c6 t: r% k- ~
3、时钟树配置
- v) ~3 c6 b4 P! o4 O
0 O4 p7 Q8 L2 H  ? 点击 20190713232239519.png   出现下图,时钟树:
) D0 w" W; `( N/ c! g( G' ]5 u4 g- |3 ]
20201021114759826.png ( d, {  l. Q' W8 X/ R" k
, r- q! D4 J* F& H8 t( h' e

+ g/ S  d: |( x/ G" v8 w配置时钟树如上图,改好后按回车键生效。7 M+ c) W/ U& ?+ Y
  ~! z% @. J- g1 f/ Y
4、中断管理配置:
  J5 ]( a! u2 D2 M) `/ t' Y# x7 c* [$ ~
20201021114926115.png ! l4 ^( W0 O6 ^& W- k* }5 L2 {

4 C7 Y8 z# m8 z/ M! \, n点击NVIC 后,进入如下界面:; u9 ]6 H( l$ o: c

, x% T; E* s/ K- x" e5 R 20201021115138715.png
$ U% B' B* b6 [7 c" h
2 P* @0 w* n8 U* E到这里我们STM32的系统基础配置就完成了!
0 T& L. z% ]# d8 o/ B
8 ^" m, K3 \, u. ]5、外设配置
" R* ^) u% j! H$ f: D  t. G( H' O/ ?6 u. S9 _( [0 J2 q1 e
下面就是结合具体需求来进行配置,例如我们这里讲的是串口1以及串口1的接收中断配置,那么下面开始配置串口1 及其中断。
) g, k1 U* _1 L/ N( }" x( s; X2 a
2020102111545925.png
" I: q$ @. m. r' E4 i& K2 O; v# X4 |+ w# u5 B, s  k3 ]
20201021115640761.png 7 ~; R. s  J3 S! I! n5 ], Y6 i& {
! ]3 g% q' Q' b, g; g' e$ F
这里只要选好模式就行,可以注意到,芯片示意图上已经出现了串口1引脚 。但要记住这里的波特率设置为115200了。这里串口就可以正常使用了。但是,我们还需要使用中断,所以还需要配置串口中断。
9 l  @6 b- F8 H1 A0 Z3 o/ H6 {; K  a0 w9 d! k
20201021115807741.png
) A, N* y" }' j! P" c8 Y6 M1 S
9 F$ j6 b: W/ F0 u' l7 P中断最后还需要设置好优先级:6 i, p  Y8 A+ C# n- T% V4 |
  J9 |, G; x) q) D
20201021121247742.png ; `1 V& |8 ?' w

8 R0 _( \$ P- W到这里,串口1的中断就算是配置好了。接下来可以生成代码了,但是需要几个小的配置,点击工程管理/ t. e8 G; f3 a! k* G
, j& G0 w; }* K; s: K
20190713232951864.png
8 ~# `4 N% y* i5 G) f, F" t, A+ `& R
进入管理工程界面,# C$ K9 g( y* [$ |. A

. C1 ^- e4 H. v0 X# L9 Z5 M' N $UJ`L$WM4FUXEJE`EC(PG$N.png
5 u) Z0 I; t. Q/ `. h) P% R8 O6 ]# w8 E( `; P( h* B; b4 F
OPZRWX~K_RINCGJ]M@$Q{KM.png
& U9 G  _6 [8 }, K( m
" Y  C0 T8 ]9 g/ N0 b2 x2 E' K到这里软件的工程的软件配置部分就结束了,然后生成工程代码,1 `( H9 U, x/ j' W$ H2 {

, n- v5 M% m7 g2 ~, A MGBK@(SYSJDZ4EEO`J6`9}V.png
+ A+ i1 w  m; ^, T9 L1 U5 N7 p$ u) p  U  b0 n  k3 c

1 J  l/ n: H% U8 x' N6、工程代码上的配置以及修改
6 g8 a  G. ^# e2 {5 S

! ~# L/ n( O, u. s4 q使用keil5 打开刚刚生成的工程代码。( c2 V3 ^" k; F( H' N" Q
- E& K5 F6 }: `6 [/ ~4 C7 u  ~
`RD45$TRIFV7R)1QF[9WG3C.png
0 ^8 }/ s0 g+ N! f  u) r3 f, Z/ o
/ y8 ?, n& e. \5 _3 f4 N, R KJDYCSUJT7YY@NNNB4UZA%A.png
* w4 j: \6 [8 k5 K" s0 U0 V. [( C- P. q
找到main.c, 会发现如上图的主函数结构,其中  _/ j& v7 ~' H$ f' Y. R9 \  u
2 ~# _% Q) C/ i! [0 T  B
MX_USART1_UART_Init(); 就是软件生成的串口1初始化配置。, v' ?. O2 c" h
" j" R- E7 u; g
如下图,光标放在相应的函数上,鼠标右击,选择GO TO Definetion..  选项即可进行跳转。
6 x. R0 L# ~% I9 w/ W+ Z5 I2 x5 L. m* m% A' z: q, t6 f
HPN1O[VAM@HWG_5J062R_W2.png
! y9 f) r& M" k, S$ F" \0 d5 u( W) f1 T4 O  R
跳转进入usart.c 文件,会看到,MX_USART1_UART_Init();的函数体。
' N* Y( W# n4 O  ]- w; d' z$ r/ @/ z; V, S# ^/ R
  1. #if 1
    ; w0 E" I- Q! X/ k" G: n

  2. 0 ~  v$ {, X- j; t+ T% `; o
  3. #pragma import(__use_no_semihosting)                             
    ( U6 o, m" q3 |  Z/ w& [# \

  4. 5 u& t* t  Z! c2 g
  5. struct __FILE
    ! o. F2 M" N' [# h( b2 f1 O

  6. - M0 ]) n) z! [! Z7 G/ U
  7. {
    6 m" a+ z" r8 H, Z# g2 E) |
  8. # o& u) K; z8 o7 f7 g( [. P
  9. int handle;+ V0 e' w9 {5 t% f5 X
  10. 7 ~  i; w' {& ?( C
  11. };. T7 t0 u! Z6 g) s) K/ V$ H. @: T; j
  12. ) k  G2 B, v8 M/ V4 o" v& q! F* X3 e
  13. FILE __stdout;      * d3 h9 Z# K7 Y. ]+ O0 u" N
  14. . K' i; P" [! _7 X4 ?
  15. void _sys_exit(int x)
    , d. Y7 {) j- t3 H; C
  16. # m6 ~- r* R) O
  17. {4 L- d. r/ E7 H5 S
  18. ! d1 ~' F1 X. T+ d
  19.    x = x;
    2 O1 r) L; v8 h0 \8 Y

  20. 9 [. F7 C/ @' I: h
  21. }+ Y& y. y1 n$ B1 q+ ~

  22. ) ?( ?' Y" m) ]- a2 @
  23. int fputc(int ch, FILE *f)
    ' _) y4 z' H4 o5 X
  24. . y0 W4 I) A. p( t/ w3 L
  25. {     5 R" Z9 \1 D" r

  26. ! ]* Z2 E% n5 _
  27.      while((USART1->SR&0X40)==0);  
    / b. t- c" x0 q& m

  28. - ?/ f6 J! b$ Y7 d" p, s9 d$ h' L4 s
  29.     USART1->DR = (uint8_t) ch;     
    2 {( F2 b5 g6 Q) M+ l
  30. 6 g, Z. o* w; w  s
  31.      return ch;
    $ t% X) M  B# r! f, m8 I" b

  32. 4 H0 Y9 |& J  \5 ]  r
  33. }
    . ^+ ]7 A  B$ n6 {2 I" F) f! I
  34. % [6 I" t5 r5 L4 s# @
  35. #endif
    3 R  W- ~1 w% z4 R/ z. X
复制代码

. K% e% d' {1 K! W* h* R& v5 B. I! u2 B
在这个usart.c文件中添加如下代码:,如下图所示
. ]' `, _$ _( c" j2 }2 K2 f% J& z, J  Z2 J$ ~
这段代码可以在STM32中正常使用printf()函数。具体添加位置可以如下图,注意所在的文件和位置。同时不要忘了在usart.h 文件中添加#include “stdio.h”
. Z# ?/ ~6 F4 ^! e+ x+ }, T# o: e( _- A( H$ Y
& V" f; J4 i2 c: v
AYV@XN$C3F@BP~]MHI)$PRF.png 8 H+ }% Z3 }' P( c" Q4 T# |2 ^  i
/ R* P1 [, O# H  u$ O* D2 j. }5 z# C

+ r: I& B% B- L7 t$ V添加 #include “stdio.h”  c- S1 i8 A. f( z# p. C; J& W

9 G. z9 {' L- T AJ7OGS8PM5X7(45N[[MSM59.png
+ {" `9 W5 A7 k: ^' @. n6 g& [2 i" Y- v" y
  m2 K- F) h6 ~9 ]4 W7 a- Q4 e
经过上述两步就可以正常使用printf() 函数了。( C6 l& V' P# l
1 O7 d9 r, k1 h* l& }* T
最后配置中断相关的函数,
+ V3 V8 Y$ \" S4 P- F1 l
, K+ B7 v3 r$ i( I* ]' B. p(1)、找到中断服务函数
# b) v8 A# {5 I3 o) J6 n* W+ j
: |; p* ?. F! z' U1 X位于stm32f1xx_it.c 文件中3 A4 H" K6 P8 ^4 _; z4 f
+ i( A5 E, w$ M9 X5 e) T; N4 D
DX3B~I(B{%R7O$DG)~$IQ%6.png # g4 C6 e3 U% N& l% n% [9 i

  \" {9 X3 O7 E4 v3 Y7 J( ]+ r(2)、找到中断回调函数
' Z# f9 @5 o6 W- U! O. r
% `* Z: |. Y$ m0 c2 t8 @& T1)、HAL_UART_IRQHandler(&huart1);
# T, k% x0 Z- p
+ X8 Y/ V" y2 G! H2)、UART_Receive_IT(huart);
- S. H" E4 {: a" q+ c) O
* Y3 {$ L8 l6 }( n! d5 i+ x3)、HAL_UART_RxCpltCallback(huart);
6 p+ M5 h- c8 H
& _) U) w/ j0 s8 e6 H. L& @6 b  void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
8 f$ r3 {3 j0 v  a! d
+ p% z  M+ x& h2 l从1)可以跳转到3),                                      `5 n9 C' |0 b( g2 l4 C
, r$ J2 u3 S$ p/ d: `) \. |# a) ^" Z
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); 就是串口中断回调函数 。
; N8 l2 ?6 P6 ^  a' F: [7 f4 ]9 k2 f) \1 e& F2 Y7 j
并且将void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)复制到usart.c文件中,如下图。在这个函数中就可以写中断逻辑
6 E2 i/ ?, t# {' ^+ d) K# m9 h4 w
" _/ W, A3 v9 i+ F; F* Y

) l, y% u* W2 d& l: d6 f5 d% j* z* D: J5 a
(3)、开启接收中断
" \. q9 b' `, |
( F! M3 ^. t/ n( R  SHAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
5 e' p! \6 H; k, O# L; n
5 x0 Y; V. d8 U# p3 e在这个函数中会使能接收中断,需要三个参数,分别为/ M5 q) m, l3 \& [8 C

9 B8 j8 Z! d. l; a# ]! K1)、串口句柄," s6 H1 p6 V3 c
4 n7 b- a! V& a( L5 U' Q8 T; `
2)、保存接收数据的数组,
2 U# h8 f5 }: x+ ?! O
, n# m) J! K2 `5 ]; A! D1 E( Y4 g3)、每次接受的数据字节数," Z* a! q! y' n1 }. h  F

1 a% m- e+ i8 {; Y所以我们需要首先定义一个保存接收数据的数组。4 H+ o+ R8 I( c$ K/ ~2 s( c9 p

( l; \7 `* Q$ y. | B@UB)H5%G5YQUN)QRRQG5XH.png 0 v0 i" G  P/ I& q* G2 i' Y

0 _$ Y! `: }: t0 o% |然后开启中断,需要写在两个地方,分别是串口初始化的时候和回调函数的最后,如下图所示,
3 R' a6 ]. m/ s+ D) |3 }/ u  J' X2 e) ], t( C$ s" n- S  [
([LNTPKDAX)CR@WNKAS62BW.png
- o" A9 `: M4 @% ?/ o9 @) C
3 L$ @/ Q  l9 T3 F
2 w/ h9 x/ O) Y4 w9 K4 Y/ c  {! z4 Z最后 在回调函数里加入如下代码进行测试:$ M* s, L1 T$ k0 |$ H4 @9 v" [
) T" z1 u% {9 y9 _% |$ W( [  g7 ^! H
)2VINME338U5}4GM9Z[`{CV.png
( Q; a/ j( B  `" i, Q2 a7 t5 Q
最后下载程序测试,, p( E, R6 V' p6 S8 A3 K
9 a: _1 \' U  R4 C; c5 }- J; I8 N
点击发送,单片机收到数据,就会打印出123.(因为我们使用的是串口1的接收中断,所以通过串口助手给串口一发数据,串口1接收到数据,就会触发接收中断,执行中断服务函数,最终执行到回调函数也就是我们的中断逻辑。这里的回调函数只是为了说明问题,实际使用时还需要判断是哪个串口触发的中断。
9 Z$ Z( Z6 T% c
3 d+ F* c# y# |# [! u/ {
  D7 e$ O& o: a4 t3 \4 z
! D4 M/ n/ Q/ K3 x9 ^; U6 c% x
收藏 评论0 发布时间:2022-5-15 16:41

举报

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