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

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

[复制链接]
STMCU小助手 发布时间:2023-1-14 18:53
一、开发板平台简介:" P7 }" h* m- k9 I5 O% w) ~
1、开发板资源简介

& `% E* t0 q& T: u6 {# b' g' A. W(1)开发板主芯片型号:STM32L431RCT6
* f" O0 {8 Y1 ^+ l(2)开发板主芯片封装:LQFP-64_10x10x05P
# U1 W( E$ _% `* F/ |(3)开发板主芯片内核:ARM® Cortex®-M4
1 Q+ }9 D' l1 M2 H(4)开发板主芯片主频:80MHz
; N+ _4 x& V4 Q6 f" G7 e1 j(5)开发板主芯片Flash大小:256KB
( L5 B5 K* S$ h3 l1 }0 b0 A# {(6)开发板主芯片RAM大小:64KB
- w9 H$ b' I& _% a# F$ N3 k
  q0 h+ N7 w: \2 y5 p1 Q3 A
bb91345227434ee7a43a34bf3fe366e6.png
& X& V) l) T* m* M
: \! Y; B& N( c' g5 v8 k
929c0cce04aa4115a8623703982bf3e1.png
$ A$ q, Y7 j* s* V

, V3 r2 h2 l5 y6 m+ v7 |' [2、LED灯资源/ f7 q! I% i( W6 [, @& y
(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:! Z3 J* P0 f0 u" }2 Q4 _

# o2 F  l- b. m2 M- a
0f177691c5814f16a508bcfa747f87ac.png ! b; h- J" W% ]
: u& P( v. V7 A1 U$ p
(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:
' T2 n5 P$ ~1 G3 I/ Z  p; ^; A+ {! k& _1 |
e923ad767b8448b7ac37c4ed693724bd.png 0 H. g& e& L' I0 F! g' n, C- o$ H

: a8 l" H' w2 n​3、串口printf打印工作原理) k' y% a+ }7 t3 v
 串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。
2 W" H+ K2 c( l+ d& ?5 O) U
# Y$ i% o! O1 z3 |+ p% [, V
     (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也可使用该串口作为debug串口。
( H4 e7 |/ M9 X2 q$ [
* k' N1 k3 c/ P, h) o: _     (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。
. K# e, r/ C! m! R2 ~8 \

, ?9 K6 M% e8 C4 d6 P5 h8 G' }$ STTL转CH340串口,硬件原理图如下所示:* Y2 p7 K2 C& o( q; d  J3 C
2 O7 ^+ S6 V5 C9 D, n% L, R5 N
4df1b489cb944c26b55013001061675d.png
. N0 A1 O9 [7 W& Q2 v8 P' t
, z4 x- Q; Q3 N8 Q/ B
; U3 r& f* O) A6 Q
  二、串口printf实验过程
! c( A/ o( A4 a3 L; H2 V* B% |9 f1、新建STM32CubeMX基础工程
) ^, ~, l* S# B8 j9 d) c* b, L(1)打开STM32CubeMX,点击“File”-->"New Project"
/ y+ k' i3 R1 s& _+ j
  ^5 y! [( p& k
2399170347904e959c855fefd5877f84.png
9 {; D2 f' e" d3 K- X! l! B5 p: q# D1 m/ z0 [
(2)等待打开主芯片选项界面(大约1分钟时间)。+ i& |6 U0 \: o% c; s- S
, Y; n* S; N+ [! Z7 ]( y# P8 o; u
d74d2fdc60c9440483e2b7cf8d928e7f.png $ {7 Y- I# z6 A# \" }
& @. |! y# n2 O, M
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
% \' F: b" q& W% S% F. Y# H
! g/ M. q0 w1 G8 c. R) P* b
7b80345238d74bea82ce70e1a348f7b4.png 4 I; M/ S1 v2 `" S7 c3 w
6 i4 U; Z9 d1 h% u! t& e' X, H& e
(4)选择时钟源。7 Y  t, ^4 K( y
(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。
1 U1 Z/ t8 r5 W4 V8 l/ J
4 {5 `/ P$ N+ v/ p7 Z- d
3f65707eca104663a3dede6d25dfa961.png 5 J1 b; I  A. Y! Z
0 u1 c) e" h, @4 B( D
(2)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
7 K0 b, h% n. Y
, \( c/ t( s( i: q  R4 `3 v' R
72119b971f62410fa8344f7f9fb9f389.png
& A* F4 {4 i6 h: T/ W

/ x# E9 R5 g! H& N2、配置GPIO控制LED$ g) c: K4 S, a3 X' e
(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:
6 p+ q( E, q$ m# Z6 t' u* C7 X
; K$ M. M( c: X; W$ n( {9 ALED1——PC0
( l" N) `! c% E: [( N% B5 a3 CLED2——PC1" [' o* i) H( \$ T6 Q2 }
LED3——PC2
9 w0 f" q" u3 J4 I5 pLED4——PC3: F' }" i: h# g: N) N% X) `5 ^
& n+ B& C6 T% ]  X  f4 v7 Z
(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。
' H! {6 Y4 S& m, ?2 D- C6 e, R/ m

( q; b# g# C" Z鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。& T/ b' S1 K! H$ U! P5 O; }0 Z
鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。
6 G6 c/ @2 D( e8 Z5 ^鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。
: D9 |/ a) n# s. Z鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。+ f8 f6 P. ?6 C2 i$ E  p
/ |/ D" l9 L  L- l6 X2 f
492907c1e71149819adbaee4516a2af4.png 7 ^1 I, J# K! H& [) P3 L" i
4 g  L' d, O2 b+ c  j- ~
c75d3f10ba2e427d9c1a10fad9bf5471.png / o4 y: k! W) \" J
% g$ J  |' h# _& W
(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。: B% ?2 t) E6 }, m

1 k1 D7 u4 Q- T5 u
38ff4b80e1c5495ba3076a5158fd91fa.png
8 y8 ~+ A1 @8 Z9 {( H1 ^
( J0 A5 Q9 n+ \% f  A7 v8 ~6 l​​3、配置PA9、PA10为串口
$ Z4 c+ l; h2 G0 m% t查原理图得知,串口1使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:7 M% F, u- ?, a9 F8 X/ m
% B' x  p' L3 z$ [0 z* U
497b8ee0243e446784e64a3c31e8a26f.png
+ t# Q5 A% L* L3 Q1 @! P5 B8 X
* F8 c7 K* S& G# s (1)序号1用来设置串口收发引脚的选择。
! k  `9 S( d) p! m- h(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
& d3 Y1 B1 C1 d) i( a4 B; Y! y2 R
3、配置项目工程参数$ b$ T/ m  f: [
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。
) r* B' i( v( U# k( G: [, m( P9 T' w$ c9 `* [. R5 P2 Q
f3ecedd9323f4463b69539906b3c1199.png 8 b2 V& V  K/ c$ Q" @! i
1 g% D+ J2 A- C7 j
(2)完成配置工程。8 U% C$ Z+ F) W" b* R6 |
6 R7 |. t9 h* A/ R& w
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
' V* ]6 b+ p+ O4 S: Y0 y% b3 @6 F  M+ a8 {8 e
efdb616174f54925b6eac31109f227b5.png
7 q: H6 D5 ~" h: t9 N% G​​. ~' U3 m$ u* o3 V
41c3f2716e4e4eda8f62fa3a1d871322.png & A; @, ?1 N& M* h; a. h& r/ I

3 B) ]6 j* M, m3 P8 R/ Q: Y& a2 ?(3)生成代码。; y3 f" v: J' y/ O# ?

/ w6 p) H$ W& i9 k备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。
+ w6 R0 u+ w. e9 b
0 z/ ]* M9 z3 l4 B; F$ M( Y8 Z$ K
8eaa7d0babea40ee93f158481a6ee471.png , X" _4 p( E: }2 w$ o. N9 k! X, s2 M
​​/ s5 |! j& @9 E2 l
(4)工程代码生成成功。. s+ j0 o% P' Y3 m
* T  Q/ e6 P5 ]- v0 o1 Y
e8f46d59a1fb4af589feb613fdff17b4.png
1 P9 f$ }/ w% Z2 S( [1 ?) x! e0 `+ D0 V  Z
三、在KEIL 5中编写代码) s. H2 J- i% k( _# p: |
1、使用KEIL 5(MDK)打开项目工程文件) t/ V# v$ [. m5 D* D% T
源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。% F7 t+ Y3 y  x; L" C' Y7 b
4 K) D( W/ N2 N% u: g9 ?; |
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。7 r1 C, u& r1 ]* b

0 l& w3 Q' p0 @! t
b3dafdc5f39c4af2946ea9b465b779aa.png
' @& b* n1 t& I1 b+ V% N  a) y( ?* s& ~* [0 Q& U& I* {. H+ w
2、添加串口printf验证程序
: b# Z- V8 z: @4 [* Q, l' D(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加控制程序,如下所示:实现每隔500ms后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换,并且串口每隔500ms打印一次。
5 V/ P7 |( z$ t  m* s8 b1 _1 Q2 O+ E8 t( o- W$ U
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。
& k4 {: B0 H. T, j% `6 i2 Y  H8 N+ r# O4 j* n
d1194af353cd4b0b88cd9208b1ac7db1.png
8 |# C6 s- U+ J7 i9 y- M3 G/ ?
6 @: L$ H( V  \4 ?4 c' @
178a631ceb1b40769861cfa141087495.png & f4 a. Q' n) k# k) ~$ ?& i

3 {$ f* J6 o. e) q" b9 R1 f(2)main 函数代码如下所示:( |2 H, @) M7 q* Q$ w, @
  1. /* Private includes ----------------------------------------------------------*/; t: `. \. ^9 |: v/ U
  2. /* USER CODE BEGIN Includes */
    0 E3 f, w0 V/ }5 P1 e8 G. J
  3. #include "stdio.h"                    //添加printf打印函数头文件2 F7 e# S6 Z: f- R2 C
  4. /* USER CODE END Includes */
    - ?5 @7 O& j5 ^1 M

  5. 2 ~' ~/ E% e8 Q
  6. ) i' S! Q+ l- G. O3 s" j

  7. 0 c9 l0 R; P9 c5 _

  8. - J) R& f, ^$ [7 D5 x
  9. - |8 W' H" O0 S8 Y  C% e

  10. ( c( L5 ]: y2 F$ q7 J
  11. 7 t$ F: W! L( k) a2 d, m
  12. int main(void)
    + w3 J3 c' ?2 k- M/ X$ a, G
  13. {3 d5 s' y9 ^# i3 c. Q- t* n
  14.     /* USER CODE BEGIN 1 */
    ' O  N+ ?1 x8 c, c+ T
  15. ) _/ _, u- q) R3 v! j/ i
  16.     /* USER CODE END 1 */* W5 ]9 |6 ]  O+ x$ u4 A

  17. * w/ S& t( G2 i  [; n
  18.     /* MCU Configuration--------------------------------------------------------*/6 O' t/ G9 R( V, P: j6 U, v, ]

  19. 8 [( V0 h; g# b/ c- b
  20.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */8 m! P2 E2 s4 T6 g' ~
  21.     HAL_Init();& S4 O% I9 c  a0 `  O

  22. 2 o$ p/ ~7 G1 Z. W, F$ ~
  23.     /* USER CODE BEGIN Init */6 ?% P% \/ }! s/ |0 q& h

  24. . w7 v0 R+ x- \5 C0 n: R
  25.     /* USER CODE END Init */. d" V; `& t& Z5 _5 l" B+ S: y& `

  26. ) _; `0 P) n1 b2 K( w
  27.     /* Configure the system clock */
    % r% K$ L8 z; U& q& E
  28.     SystemClock_Config();
    0 a2 H& z+ Z6 b& e* A

  29. + w! f) c1 i3 h5 i
  30.     /* USER CODE BEGIN SysInit */
    5 w# u3 ~$ M$ D

  31. - g  ]1 h& T2 b9 z7 N
  32.     /* USER CODE END SysInit */
    - S% m) L! C& O: b, H

  33. 5 d$ t1 O. k7 u5 j! n# x8 y9 w
  34.     /* Initialize all configured peripherals */
    ; z" }5 K' h3 ?9 X. B1 y. Q0 ~
  35.     MX_GPIO_Init();& J: Q5 S* A# @$ c
  36.     MX_USART1_UART_Init();+ V9 f/ g9 l( c. o
  37.     /* USER CODE BEGIN 2 */+ N3 h& z& v7 k* b
  38.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    * \( X* g. R9 R6 W( [& a' X
  39.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    " w, @) M3 m+ \, w. Y
  40.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    + z  j1 L& T# I  W  ]
  41.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    # J3 O# I" \9 x5 N
  42.     4 T& h  Z2 Y3 f+ x5 o( \
  43.     /* USER CODE END 2 */
    ) C8 z- A) E  ?' S" B

  44. # A0 `7 B5 ~$ K/ K% J" y- K
  45.     /* Infinite loop */
    * n% @3 D: ~$ Z1 c
  46.     /* USER CODE BEGIN WHILE */' {8 @# M  }+ y: Y. F2 i: _
  47.     while (1)
    , h# ^/ V: R) n9 A7 A
  48.     {
    % x% ]2 {( X; F* U* r' }
  49.         /* USER CODE END WHILE */9 E( l" f5 _# Q
  50.         /* USER CODE BEGIN 3 */4 q3 B" U  |7 n! J# p9 Z4 k! t/ ~
  51.         HAL_Delay(500);: Q8 [  ^" a. Y! L  @6 G! k
  52.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                                                                        //反转LED灯& h& O7 W6 S* v6 `# W/ f7 e
  53.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);                                                                        //反转LED灯
    . l! n4 c9 E' Y+ E6 ]
  54.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);                                                                        //反转LED灯
    % ~" ^: i, f9 P5 U" [, A, ~& s2 B
  55.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);                                                                        //反转LED灯
    6 _0 y. n$ n3 a& j
  56.         printf("hello world,this is printf function!\r\n");                      //printf打印
    ! h9 j8 J, _" c6 J8 ], N! k0 Q
  57.     }5 L2 e( Z2 k) a/ V+ M
  58.     /* USER CODE END 3 */) e6 N' @% d1 b2 H
  59. }
复制代码
( s" p. ?, |* J5 T: I3 V: D
3、设置编程仿真下载模式
' k& g9 P6 A4 E9 x! y4 S(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
$ \, e* v3 D8 H/ i
% i$ C# {5 z8 [1 {
edefb6b9a2a14be3b1221ad6d5c7a8a2.png & c5 h/ ~1 X& h: C. E6 B
3 q, i8 t, l4 X1 k, X1 N
(2)点击编译,完成后提示“0 error(s),0 warning(s)”。9 N6 o1 _# {2 |# B

& o) D3 l. V8 I1 I) f9 c# V9 G
e0b7e3e353b345a7987fe5f821de2dda.png
& I" ?* `. ^! N+ g, q​​; \4 l3 j$ h& ^% T( B6 U# j. o1 ~
(3)点击Download(或者快捷键F8),即可下载程序。0 n6 ?: A; Z, E0 g9 F, c- N( C- Q
' T; E- v4 A# ]  o
eb3f250f19e44862a7df80c2492fcd01.png 8 V9 ?: L7 @3 _% m+ {$ z
​​
# `) K5 S2 P, y3 ]9 f) Q2 D. o- R& ~2 s; I2 `% x
(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。6 k1 O, \1 k( s7 `5 U; p! o- D( ^

* I, s3 |; f+ u1 p
9f8aa1a4e8f04041bcf5cb183facd100.png 4 D' N4 B% q6 O+ h: T9 n/ h& r
​​
9 C  H0 m2 n% C) x4 m7 r4、串口printf打印实验效果展示) T! c2 j, ]! Q  O  S4 D* g
        程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后每隔500ms闪烁一次,并且打开串口助手后(串口参数:波特率115200、N、8、1),可以看到printf每隔500ms打印一次log数据。: N8 c9 W3 N! k
6 \1 A- B" d4 ~9 H+ h) r( ?; h
06445a6b81d24af4a118aadebfd333de.png
" g9 S, a! {* R0 l1 b$ W
# e% V/ Y" d3 p5 |5 X/ B————————————————
' D# u6 x. R2 _4 C' {版权声明:智能小屋ZYXC
/ O# u- U9 N+ Z
) {9 v  n2 S6 D, P) a+ K- D
收藏 评论0 发布时间:2023-1-14 18:53

举报

0个回答

所属标签

相似分享

官网相关资源

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