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

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

[复制链接]
STMCU小助手 发布时间:2023-1-14 18:53
一、开发板平台简介:
/ _6 m# c0 E  k# {1、开发板资源简介
" M8 Y' h- B; \9 \8 d8 g( D
(1)开发板主芯片型号:STM32L431RCT6
. X) v9 |, k8 v( i: f(2)开发板主芯片封装:LQFP-64_10x10x05P* Q) c2 X+ w. k# c4 D) e, e, K
(3)开发板主芯片内核:ARM® Cortex®-M4
. l% C  Q7 r7 M9 _# G; N(4)开发板主芯片主频:80MHz
. s6 [4 j" R  \4 Z2 x% y(5)开发板主芯片Flash大小:256KB
  @/ B4 F9 p- H" J! c+ s& T(6)开发板主芯片RAM大小:64KB/ G& D9 A' }+ ^  q% U

( g/ R" ^3 R# h! Y8 P5 y  Z9 w9 x
bb91345227434ee7a43a34bf3fe366e6.png
5 |/ L9 G8 J. L; b8 S5 {) O& z% |# G) |
929c0cce04aa4115a8623703982bf3e1.png
& x  s5 j( S* N% @# k2 n8 k5 o
: Q$ H; d2 u# n2 w
2、LED灯资源2 g5 l3 v6 W' e4 \3 `
(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:
% Q) r1 e; N7 J) N) Q" H1 w4 K8 E% \
0f177691c5814f16a508bcfa747f87ac.png
$ I9 f9 O9 Y" D5 D

: p+ Z$ w4 }: J5 D' I, \: s(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:
) y$ A& ?1 j( T# w1 p& V8 x1 D, V: ?2 y& j
e923ad767b8448b7ac37c4ed693724bd.png * ~) L, T' L3 d2 D

& N0 G0 R- I% r$ n​3、串口printf打印工作原理
+ @$ `) X7 O. w; D! E7 D7 |( k 串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。# y3 {/ n& t! B* v' L3 [' a
1 U" n$ |2 M8 t; \8 h4 q5 U
     (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也可使用该串口作为debug串口。
, f2 Q! _6 t- J7 P' s# I' a% J# `* v% ]
     (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。
4 q3 ]( o& h1 p: w* Y* a: w
) s: M" h& @( w, Q8 r" D
TTL转CH340串口,硬件原理图如下所示:7 T' {" n0 y9 P2 Y

  ~* c) z# ?3 z( c* O4 ~0 k
4df1b489cb944c26b55013001061675d.png
2 @( ~; ^3 h0 M3 s
  }" [& ^, m3 N# c. S1 O

, R  X6 \, R( V7 q' w5 b% }3 ^8 U- J4 c% [  二、串口printf实验过程7 G3 ]; }1 u) t' m
1、新建STM32CubeMX基础工程
- X3 M  }3 Z6 @9 n4 s; m5 g4 q(1)打开STM32CubeMX,点击“File”-->"New Project"9 M% {9 S, D6 J' ?6 y. s# m) X

+ `$ Z$ _9 p+ H
2399170347904e959c855fefd5877f84.png ! M1 [7 o( G4 m9 Y- J

6 ]$ G) `, g. i% K(2)等待打开主芯片选项界面(大约1分钟时间)。# h% ]2 a* |; K1 ?- t

; m! F3 L& t0 v
d74d2fdc60c9440483e2b7cf8d928e7f.png
* H+ P1 d1 N9 q$ e$ W+ C- {
/ s& X6 y' w2 _% [0 }% Q7 j4 B; M(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
7 r+ T" J1 D2 ^4 n: U, [# H% P3 Q! G2 w3 G
7b80345238d74bea82ce70e1a348f7b4.png 6 E8 X3 }( a% X% e, G
6 a1 s. f" b. L8 Z3 _0 l
(4)选择时钟源。
9 c: q, G2 Z# r# }( G) Y" L8 u(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。" Y8 z/ @( l+ v0 i* H" |# E

6 J' E+ i& ]. H2 n* W7 j3 ?, Q
3f65707eca104663a3dede6d25dfa961.png 1 J& [6 V0 w' r0 d
& e+ U* ~  m$ @/ t" ~
(2)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。& t! @; |8 Y5 J7 Z7 c5 n

( R" M2 o. }1 G. h: A
72119b971f62410fa8344f7f9fb9f389.png 3 V4 Z4 V+ @0 B0 f5 |( _

  j" w# m' _: d& o5 }5 ]% B2、配置GPIO控制LED" T+ J0 k) n) C& O) ^* n- }
(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:
6 r* F9 c$ u# r: S0 C6 D: f( g7 d& O3 l/ x' O
LED1——PC02 ]% {, C% Z4 R' U9 T% y# t
LED2——PC1! ~& @) i3 n5 S" i/ f# b
LED3——PC2) F( b; {8 P2 B6 T4 i6 T6 n0 [
LED4——PC33 a: D+ @3 T+ ~& u. A7 ?7 c
/ l9 @2 C7 s8 U) P( d  o
(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。1 j* C0 J1 T1 {* u- s% ]  ?
2 L1 k- w) @* `- R' _  b+ b; L
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。& V+ z, V* X% _& S" u8 F4 t) i' P
鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。% Q) t$ n1 X3 F6 x
鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。
) D- c$ e* g* O; ~" [; _1 k/ F# }鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。" |# Y( f  j* `8 E# @/ a* S
* I$ ^0 s* \: @: K: [; w5 _
492907c1e71149819adbaee4516a2af4.png
( w8 a! g) p" S7 r- u, j" D+ Y' \# Y9 ~
c75d3f10ba2e427d9c1a10fad9bf5471.png
* q( g' [* N9 M# P$ Z
) P/ X! Q% ?! m3 J# m$ v(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。
7 ?( b$ ]7 ^& l2 s+ p% T( A4 a9 P$ N( q# e
38ff4b80e1c5495ba3076a5158fd91fa.png
1 P1 Z3 z: f& X* Q
8 _1 ~( @5 k( u/ h8 @  j; K5 @​​3、配置PA9、PA10为串口% x1 V$ Y. i3 J" _  m* J( `( d
查原理图得知,串口1使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:
; }& t) B. v* _9 u- P; Z& F' n8 I) l: l
497b8ee0243e446784e64a3c31e8a26f.png ( y1 m5 w% D; L+ m
' b, b6 K& Y: n: [" P: f
(1)序号1用来设置串口收发引脚的选择。, A* ]4 R5 c6 }* h( s
(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
3 X" m2 D6 L5 E( `% M9 N
  M' _; b/ i) n  `# T0 }: { 3、配置项目工程参数. {( }, q6 S2 o2 A' E; U
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。$ [% g% N" j+ @1 _" F* J

$ ]3 e8 i9 x8 {% t6 r
f3ecedd9323f4463b69539906b3c1199.png
- U! c+ z3 C5 R
1 {4 a9 f3 k2 `  Z
(2)完成配置工程。# ]7 C( y. b' `9 S2 g3 g# T
! O1 Z. p; W9 A7 a
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
0 |0 ]0 M- F9 q! X, e. V
( M# T. }) D  v" P" n2 L
efdb616174f54925b6eac31109f227b5.png
( \% {( i) ~, m5 u​​+ }# q6 H& T$ }* t  [) ?* Z7 n
41c3f2716e4e4eda8f62fa3a1d871322.png # x/ K" j9 b0 ]* o9 R5 w% X! c. m- r4 U
/ J+ l! @( S# I; q5 ?7 v) S
(3)生成代码。+ P9 B+ w/ [* E) h

4 b2 e2 T/ v+ `$ }; u1 d( r备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。5 L4 ?7 x+ S% G9 ]4 X

( r8 u2 N& q  L4 Z* H7 m8 e
8eaa7d0babea40ee93f158481a6ee471.png ! c9 m# R+ m( U
​​
, o. |5 z7 v" }6 w6 U% e(4)工程代码生成成功。
) k* X3 F& r- L. m% m. B
3 y" Y2 o" ]. T" |
e8f46d59a1fb4af589feb613fdff17b4.png 0 a& l, j( O' Q0 ]1 K( r! D
' f1 e5 x, r6 n. a/ n7 J2 F5 s
三、在KEIL 5中编写代码
7 e& T' C; U" k+ B2 N' {: t1、使用KEIL 5(MDK)打开项目工程文件' `' h2 q& P0 L7 Q
源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。
" J" p8 B+ |# z$ h& A6 X
* X1 y5 |6 k# z4 a(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。
. @, P1 l, [# }1 A' J- R
& d5 D1 I1 K% f% ]6 z
b3dafdc5f39c4af2946ea9b465b779aa.png
+ E9 E7 }3 p+ F5 L2 `" D) p; F# [4 t5 X! r7 i
2、添加串口printf验证程序2 U; ?; G4 p4 ^( P  Z
(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加控制程序,如下所示:实现每隔500ms后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换,并且串口每隔500ms打印一次。; P/ w! J, X9 F( C: D2 S
% b7 R8 \2 w. a! r+ Y, B8 x
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。
2 D; s# p/ r; M9 {6 x" W/ h
7 I+ [5 p1 P" Z
d1194af353cd4b0b88cd9208b1ac7db1.png
- T% `$ I' N  V/ Y, w! E! P
2 s# v0 @5 G0 f; _7 L4 X
178a631ceb1b40769861cfa141087495.png 7 G0 B2 m$ j- n7 U; G& L

& d- A: F+ u, x- C& J9 }) F& `(2)main 函数代码如下所示:6 a/ e$ Y# }- T8 J
  1. /* Private includes ----------------------------------------------------------*/
    9 A6 l/ Z+ Q& O+ O, K" |
  2. /* USER CODE BEGIN Includes */! [1 E. h! j$ u$ u
  3. #include "stdio.h"                    //添加printf打印函数头文件, @0 t& W6 O/ C, Y
  4. /* USER CODE END Includes */
    ' N) d" B- @. {0 \1 U
  5. & R6 T7 |* O. \; G! C
  6. ( V' u8 B5 S$ \" i$ q

  7. ) i: J) Y5 t. t) h- U

  8. - Q5 R" C% \+ k4 F" h5 z9 @9 B/ w

  9. ) f3 g% ~2 d: N- t/ i3 R
  10. 1 I) F$ `9 V" S

  11. 0 o5 L& Z' E9 w7 S* M) O
  12. int main(void)
    ) q$ W+ h8 S; S) F: }" F
  13. {
    7 _0 ?8 P% L0 E6 }& R0 V8 W
  14.     /* USER CODE BEGIN 1 *// g& C  k# }' b1 _; j& J- a
  15. $ s3 I, }! n: N+ m
  16.     /* USER CODE END 1 */. D. K- |6 V5 N( ?4 x
  17. # z- ^8 @" u2 p/ _$ s1 o
  18.     /* MCU Configuration--------------------------------------------------------*/2 R3 a: n2 \- j6 p! ]: T, A8 v4 i
  19. , B2 K' Y8 m2 s7 I6 T
  20.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    # z' U* C  P/ v5 W9 z: I
  21.     HAL_Init();
    , |$ S1 ], v. ?! f- }# f+ b
  22. " a9 @7 o' @9 U" z3 D( {
  23.     /* USER CODE BEGIN Init */  U% k: [/ T2 v
  24. 5 w6 }& Q1 z! d) c" v! T2 d. u1 e
  25.     /* USER CODE END Init */
    * k6 l# r* T) U& a8 x
  26. 4 N0 e0 T0 T+ G7 [0 Y
  27.     /* Configure the system clock */
    5 S  \3 n# g1 @( p2 u7 b
  28.     SystemClock_Config();/ u6 }& x& ^7 i! T! y$ [
  29. ! U: Z( O' a$ }4 m
  30.     /* USER CODE BEGIN SysInit */8 {& F0 _7 W! L! S1 g# f1 K
  31. ) D" v+ U+ O1 e% v" S+ I- z
  32.     /* USER CODE END SysInit */
    . C3 ?; w, L& N6 D% D

  33. 7 d9 u1 {8 i9 k3 W$ k, K4 {/ Z: d
  34.     /* Initialize all configured peripherals */8 I/ S3 e0 Z  g% a. P
  35.     MX_GPIO_Init();! v8 H, K  F" O; |- ^
  36.     MX_USART1_UART_Init();
    # q& ^$ s# k' f; Q, e' l4 d
  37.     /* USER CODE BEGIN 2 */9 G/ Q! `5 b- X
  38.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮, ~) u/ n: t! s, ^
  39.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    4 n, k# p6 J" x; K! z
  40.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮9 Y) k3 p; V1 S1 ^  W6 O$ O- M
  41.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    ) L) n1 Q5 n/ i- s1 F
  42.     3 n- S1 a3 o' j% k8 h4 N( I
  43.     /* USER CODE END 2 */9 Z9 m. E8 N0 W. X

  44.   Q7 A. j" R3 Z: z1 F: {6 ?
  45.     /* Infinite loop */
    % l1 }7 _: M: A
  46.     /* USER CODE BEGIN WHILE */
    # O1 F1 B& A- r9 Q  @1 f
  47.     while (1)
    ) @4 U9 k5 ^# v( h' ^1 ~" p
  48.     {
    7 c# |% q8 O2 D7 C2 r; J" T6 b
  49.         /* USER CODE END WHILE */
    & r9 j. {' O( C' f& p
  50.         /* USER CODE BEGIN 3 */8 S$ L# A& v  A) I
  51.         HAL_Delay(500);
    , ^! m2 D: r# W$ G
  52.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                                                                        //反转LED灯
    - i3 d2 f# E% ~  p3 r
  53.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);                                                                        //反转LED灯, s: ]6 x: l  K1 G
  54.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);                                                                        //反转LED灯3 H5 T& w3 n+ k* Z3 o- N6 G
  55.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);                                                                        //反转LED灯6 P% J+ q6 ?5 p: Z- E# _
  56.         printf("hello world,this is printf function!\r\n");                      //printf打印% E& ^  E' O  N1 k) L
  57.     }
    # R/ V! z  h/ d: r
  58.     /* USER CODE END 3 */
    % r+ }  x) ]3 U3 G! @* {$ b
  59. }
复制代码
8 R1 p( k4 m' M; M; S+ U
3、设置编程仿真下载模式( _8 g+ D- W' D
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。3 `# f: X9 u7 }( ]6 W$ N

# z6 ]. }7 c4 e5 Q. R
edefb6b9a2a14be3b1221ad6d5c7a8a2.png 7 K% F% b0 R; M) [

4 q0 ]0 [) _; m(2)点击编译,完成后提示“0 error(s),0 warning(s)”。# R3 R' t5 G2 r, d0 q
  Q% w3 R  D; y% `
e0b7e3e353b345a7987fe5f821de2dda.png 4 g: ?8 _" e; k0 v6 [9 e% [# j: P/ C
​​
. j9 |+ @, L" A9 {4 n& A(3)点击Download(或者快捷键F8),即可下载程序。
# A# U2 C: I/ l. R- n
, Y2 D4 h# R0 L  ^* H
eb3f250f19e44862a7df80c2492fcd01.png % x/ Y. }1 d8 n9 L  b( s
​​
, X$ e5 b  U: m7 C2 Q; v  j% i9 A/ ~1 E1 G& Y1 w) I4 c& b
(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
: n6 v7 h# `1 b+ ?$ u
* V* ^* `% K( ~4 E7 s
9f8aa1a4e8f04041bcf5cb183facd100.png
" u1 u2 f& [" Q5 g, ~9 Q/ F ​​
! w" Y; s+ q" O1 }5 g; v$ E+ u4、串口printf打印实验效果展示0 f6 y* A8 E/ r+ `. H
        程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后每隔500ms闪烁一次,并且打开串口助手后(串口参数:波特率115200、N、8、1),可以看到printf每隔500ms打印一次log数据。3 V; l2 N1 @7 j: E; L' ^( W
- m. Y* J2 ~0 I% A: `6 g
06445a6b81d24af4a118aadebfd333de.png % x. C3 Z( x# b& b2 h5 L
, i, ?6 _) y" S7 U
————————————————
6 q7 ?( B3 n" V* z1 G版权声明:智能小屋ZYXC- M- w5 f) ~' W0 W3 `
& I4 ?. v$ J. q" O4 V
收藏 评论0 发布时间:2023-1-14 18:53

举报

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