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

【实测教程】STM32L4之串口Transmit打印实验

[复制链接]
STMCU小助手 发布时间:2023-1-13 21:00
一、开发板平台简介:
$ Q( P! \6 N9 |! |% S$ b( i) T: P. |1、开发板资源简介
) X1 {( v% `1 X! P* Q' M
(1)开发板主芯片型号:STM32L431RCT6! o, G/ i- W8 y% z9 I) t
(2)开发板主芯片封装:LQFP-64_10x10x05P8 n, _+ r/ ^3 F
(3)开发板主芯片内核:ARM® Cortex®-M4
9 y4 ], T1 a$ _(4)开发板主芯片主频:80MHz
* v1 B3 r) F* Z. q3 y* k& C& J(5)开发板主芯片Flash大小:256KB
- Y4 G4 k9 a3 a) R+ z, f(6)开发板主芯片RAM大小:64KB
7 `7 u  C; [) o& M+ K% z: [( I0 Q9 `
bb91345227434ee7a43a34bf3fe366e6.png * T( R. ^' s1 Y0 n6 O
. b2 {  [  A6 c
929c0cce04aa4115a8623703982bf3e1.png $ v) _: K  u8 }

& {! b. E+ ?" e" N4 ?! K) b( E2、LED灯资源  _3 c1 p4 }6 l' W
(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:6 F' M5 r6 |  d0 T5 R& c# l

7 A& ]+ T' N6 _) w( c. Q8 I1 {
0f177691c5814f16a508bcfa747f87ac.png
- K. X2 p# U2 D* w; }% Q6 ?  m, b$ E+ q- l8 c/ Q4 @7 Y; `
(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:, l! ]- q1 U0 Z' j" A" w
# K# E0 a3 M4 W5 ~" l% h( }$ s4 [
e923ad767b8448b7ac37c4ed693724bd.png
7 {! A2 [2 w& {9 A
( @& O7 X2 d& ^* t6 B  l. _​3、串口printf打印工作原理
7 C% c* Z) x' {" \2 R( F5 } 串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。
/ y: p& h" b+ {( F5 }0 p7 B5 O/ \$ @" j  s6 s+ m8 Z" Z
     (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也可使用该串口作为debug串口。
5 x( v4 `3 w4 c3 p
& d& w4 t* K. ~     (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。
9 U9 c0 m! k/ f2 z6 R& z& j0 R9 o
9 Y2 ~- h0 h5 t4 S+ C3 A6 ^TTL转CH340串口,硬件原理图如下所示:9 t: c6 ?4 y# a& Q' C  y

  G. r' N( b4 d
4df1b489cb944c26b55013001061675d.png " W( s; z' U$ h8 |% H' a
& K, w" x: ?# E6 r9 @

: z6 l# p9 e5 p  二、串口Transmit打印实验过程' @6 B+ T7 v% S& b& f+ w
1、新建STM32CubeMX基础工程
- F- U. v: S) R
(1)打开STM32CubeMX,点击“File”-->"New Project"
$ }3 J6 Z9 C/ Z* o# ~0 ~
# d, R2 @$ G9 M6 |9 y
2399170347904e959c855fefd5877f84.png
! N/ t) h0 q3 `. n1 i; K/ i- U" U7 ~) b* ~. Y. X
(2)等待打开主芯片选项界面(大约1分钟时间)。, M& v7 _& B1 S$ ~% b5 T& _
# L$ a8 n7 M$ k* {  a
d74d2fdc60c9440483e2b7cf8d928e7f.png
0 a. z# P- q1 I5 [; x. d7 U) h0 Y- y& C
) y# H, c7 s+ F; @* e9 F(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
& w9 \+ ?3 q1 S) p* t/ G& Z: B: b' N) T3 A1 W
7b80345238d74bea82ce70e1a348f7b4.png   A8 p5 i" f0 i
) ~! u1 Q0 U% R' M1 S1 g
(4)选择时钟源。0 e) [* f# y% A% S
       因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。* u- @; |; c; Z) i; f
8 I4 N% V+ M/ `( a$ a* O- o7 G
3f65707eca104663a3dede6d25dfa961.png ( j/ J8 Z9 V4 E- B* y" N
' }' G" q3 G2 a; ]- H* B
        因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。" x- O2 F, ~! P" \6 V0 Y

9 I. a# G; h" `% f. ]
72119b971f62410fa8344f7f9fb9f389.png
+ ~; ^3 x) {4 I4 d
  D5 a3 U- `/ G* J  s, ~2、配置GPIO控制LED
) i9 B6 R% ]: N  d7 M! u6 F(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:9 O- i2 D; ]9 f- G
LED1——PC0/ }2 D) g# N1 ^/ f; g
LED2——PC11 m5 H8 K8 k, `6 H9 Z' b
LED3——PC2
6 c3 `/ f6 T/ {4 o4 e0 a! ALED4——PC3
2 ^. s! ?! l  N; K: w' j5 W
, f/ B, o: {" L9 C! @/ V1 @(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。
# b" s9 z+ B$ k- s2 P) J* \  {- t$ v7 B  z* L& e# ?
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
. k& s6 X6 E6 R0 M/ \鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。
4 a1 g2 C: ?2 t, P" M" w. S5 [鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。, a0 }6 y/ `+ ^6 |  P" d) g
鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。: {* L  A- l0 J! E; ?2 L' `  h

7 t! q& f% t" `' ^& b
492907c1e71149819adbaee4516a2af4.png - m; z7 ~( @+ K# x$ i' Q  z
$ E2 f4 j& s* K$ S
c75d3f10ba2e427d9c1a10fad9bf5471.png   h! Q5 }  [+ Z; E+ `! y7 |

7 r/ C9 e' a/ y5 W% R/ d. J(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。
2 Z# |& i' J5 W; n- m3 T% V9 {# V4 F8 ]. S: E! \% \( p/ f! O; ^2 h
38ff4b80e1c5495ba3076a5158fd91fa.png
' w4 H/ z. L; r% S8 {7 n2 D, _! N- T2 ~* k9 Q' L. w: e% N
​​3、配置PA9、PA10为串口! F. n7 f7 y; ~
查原理图得知,串口1使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:) v: e& W# ~' N( }

) o& G) T$ J! G) E$ F/ `$ d
497b8ee0243e446784e64a3c31e8a26f.png " W% j- g0 W; Q, n3 \) |4 j" D3 Q3 a; G0 f

+ k: O9 q6 |+ `% b; q) M* r5 C (1)序号1用来设置串口收发引脚的选择。
. p- Y& @, [+ J/ M; i(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。- E6 H" p$ T& b
5 y8 g. w* B6 R- q) h+ H
3、配置项目工程参数
; ~+ A6 J9 s; h& ?5 P; \(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。
5 P* X$ Y0 Z2 Q0 t+ T9 g0 u6 u3 I
9 W3 B5 _) G! Q8 a# o! _- `
f3ecedd9323f4463b69539906b3c1199.png
- u. ], W9 [9 g& X1 F) g" h- }; l) v" }/ m5 b
(2)完成配置工程。
% a- ~! Y% c% }! p6 |/ h% k备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
# q5 D+ G: {" M
4 D% _+ z8 L0 ?
efdb616174f54925b6eac31109f227b5.png
7 M3 G+ D$ H. J​​( R' |$ L6 c! a3 i& h+ M  r
41c3f2716e4e4eda8f62fa3a1d871322.png # p  a0 |& {' A2 X1 J" Q* L( M" s1 V
. H! }- d8 i- _: ^) d2 r7 O& `, @
(3)生成代码。
+ l4 ]. R. H2 V6 X  c1 \备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。
* G. j0 ?& O! f* Z) ~' X2 V
& v( y/ v1 V0 _; ]% U
8eaa7d0babea40ee93f158481a6ee471.png + r. I9 G3 ^/ q  G& ~
​​
3 T0 Q' W# A+ h* h(4)工程代码生成成功。. h6 @: _2 v4 P

  P1 V$ k6 u9 t& u2 n1 D1 [& s0 l' n2 D
e8f46d59a1fb4af589feb613fdff17b4.png
$ i: B; P6 b' C
6 y8 I  T0 y& e4 |, z 三、在KEIL 5中编写代码
" G, V& Z0 R; W( n: |$ I1、使用KEIL 5(MDK)打开项目工程文件
8 `: @- M* }) E# }1 P2 a源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。
! f; C% M& w) ]" B5 [(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。
" g; c# F0 I6 }9 F" @0 v
$ j3 ~6 t+ }/ p- [: C
20929232f4e647c28257c69fb217c0c0.png 5 b- [  D  R( W' R  K) g# u. T
4 {2 V3 i" I: g
2、添加串口Transmit验证程序, `7 M  H& Z* E# V2 M
(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加控制程序,如下所示:实现每隔500ms后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换,并且串口每隔500ms打印一次。
: }, O0 n, D) Y) X) v- D5 r. Y, r9 Z9 `  S
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。' D! z! W, `3 g6 e) G  \$ K' ~

/ I' I0 e3 |; h
dfff847f2bd84e648d7cc7889951d0f6.png ( U/ y8 U: b8 p- c/ c

! b4 Q) Z/ u& {( T  h
a583fb91001e471cab343790ed9dde30.png
9 O( i( a- o" a
! B: _& {. P" J0 z6 Q; l. c+ G; {(2)main 函数代码如下所示:8 m$ ?- m# s! @5 J8 Y3 e
  1. int main(void)
    # ?; j- R' g* b5 E* |4 H
  2. {4 d9 U6 f  X5 |
  3.     /* USER CODE BEGIN 1 */: }! @" |' M8 J" ~" r- E: M1 g, G
  4.     uint8_t transmit_str[50]= {"hello world,this is transmit function!\r\n"};$ f# ~5 o# \- N# Q: f- {# N
  5.     /* USER CODE END 1 */* S, o# l, e5 g# k, f6 o
  6. % X0 P: k  v" u
  7.     /* MCU Configuration--------------------------------------------------------*/3 @$ I, A. L9 {, c7 o) v

  8. ! [7 q: c4 A) j1 |& ~
  9.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    , W) {# j1 H9 c& a& q
  10.     HAL_Init();& ~1 E: q! B. t
  11. 3 _- L& @7 W& {1 G, e
  12.     /* USER CODE BEGIN Init */6 j1 D) r  ]2 e% M" G; s5 e+ K
  13. 5 u! e1 R8 e$ y2 n7 e
  14.     /* USER CODE END Init */) N! X6 u( q. H! p& v: Y

  15. , o5 W. a3 e) d5 r$ j, y
  16.     /* Configure the system clock *// u" m7 d6 E: N
  17.     SystemClock_Config();3 s) Z' G! A$ J' i+ |- b# q
  18. # ]: F+ U* P- E( ]
  19.     /* USER CODE BEGIN SysInit */
      C# H" f6 e6 M, \  h) A9 H
  20. ! d. ?' P0 C8 o* N4 D# }
  21.     /* USER CODE END SysInit */7 _4 Q& _; a  ]/ Q  F2 a  ^$ F4 r

  22. & |$ T- h7 d5 q) F$ u7 e1 h' m6 U
  23.     /* Initialize all configured peripherals */
    * x. n# ^/ ?5 D4 `* |  u: N; F9 _
  24.     MX_GPIO_Init();' I) z- y, s- `$ v
  25.     MX_USART1_UART_Init();
    ! z4 ]1 w" q, X" y1 ~
  26.     /* USER CODE BEGIN 2 */
    , H5 w; `, l( N7 u! L4 ~5 m9 [5 E
  27.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮4 z2 P2 J+ L" o6 ]% G8 T
  28.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮$ h$ E: x7 L/ E/ `: G; f/ H
  29.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮% n) d9 M+ f. x, V, C- D
  30.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    7 A7 B; S4 ~0 a! F( `
  31. ) C" S2 O! y2 Q- ^# N; P" l; S+ f! P
  32.     /* USER CODE END 2 */. n; Z1 h: D  e- [  m$ i9 }6 S5 T
  33. ! |+ d" Q: T8 I$ b5 n6 f$ ~
  34.     /* Infinite loop */
    2 M, n2 o" H' T. `6 @; i
  35.     /* USER CODE BEGIN WHILE */4 X% N4 y0 P7 h! p
  36.     while (1)
    # Y3 X( U8 q  p& @1 g
  37.     {
    ) ?* V; y, @1 j& Y" }) b5 ~" h
  38.         /* USER CODE END WHILE */# L% B! O( y3 R! ~: L4 f  w2 u
  39. / G8 Z0 G. V$ V$ h) N; |& T
  40.         /* USER CODE BEGIN 3 */1 d* Q3 P1 |7 p$ U6 K$ q
  41.         HAL_Delay(500);. B; T' q* e9 G
  42.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                                                                        //反转LED点亮熄灭切换: o3 ^/ y# S4 n+ K# w
  43.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);                                                                        //反转LED点亮熄灭切换
    8 a1 G5 D0 B7 Z2 v4 z" [
  44.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);                                                                        //反转LED点亮熄灭切换, n- e; W2 V) ^& A: J& J
  45.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);                                                                        //反转LED点亮熄灭切换9 t7 c1 c8 `5 }" N
  46.         HAL_UART_Transmit(&huart1,transmit_str,sizeof(transmit_str),10);        //每隔500ms打印一次) z7 X1 b; f7 z9 @
  47.     }# ]* L2 b$ ], e' Z" W5 \
  48.     /* USER CODE END 3 */
    2 F0 T# v, N4 b
  49. }
复制代码
* D! w$ q$ Q0 L; w8 i: b
3、设置编程仿真下载模式9 }! X) f, @  L, c3 `! K/ `
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。% y7 X$ N% Q0 ?* W

: I$ F5 o0 N1 E3 g+ `9 Q
edefb6b9a2a14be3b1221ad6d5c7a8a2.png 6 h0 M  c! v. Q3 F
​​
1 `) w) G: k9 i! P! S7 @(2)点击编译,完成后提示“0 error(s),0 warning(s)”。
: q. D. w1 l3 U2 f
9 [0 S5 [5 l3 w) Q7 H( o, k
e0b7e3e353b345a7987fe5f821de2dda.png " M' H( `5 V4 `

. I9 `2 a3 j2 y. l( N( o! w

+ D: u1 \2 r$ e" b1 y(3)点击Download(或者快捷键F8),即可下载程序。) R4 R8 h& y5 X/ |# ?- \7 J( ~& V
3 V! X- n* M2 O# E
eb3f250f19e44862a7df80c2492fcd01.png & C. ~- t+ `" S( N3 @
​​. K( D) [/ y% {) b5 L: u$ w
(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
: |* H6 L+ @$ S& B3 C
+ P! \1 T+ F# p. e) u
9f8aa1a4e8f04041bcf5cb183facd100.png
+ |% h* D! z9 \! R+ X& r$ ^ ​​; d$ [6 M" q' l7 G9 R9 x' E- Z
4、串口Transmit打印实验效果展示
! Q. ?* K$ k+ b% f3 u5 [/ _        程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后每隔500ms闪烁一次,并且打开串口助手后(串口参数:波特率115200、N、8、1),可以看到Transmit每隔500ms打印一次log数据。
3 Q; o2 e* w1 Y5 `1 [& \, H
  z  @* A" f% }' U4 Z! `6 m) v; O
39a873987262466bb13106b26e781cfc.png
" J7 b0 O5 W+ Z/ [) d3 O$ Z9 h( P1 [8 r  x) W* J) K/ B
————————————————) J8 _3 H  z% e% k2 ?! T9 I& f: U
版权声明:智能小屋ZYXC6 j: t5 x+ b6 X: g

& Q2 A; n$ B9 Q+ K
2 u4 T! h+ n: O' f* M- a" K. A! n  b
赞 收藏 评论0 发布时间:2023-1-13 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版