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

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

[复制链接]
STMCU小助手 发布时间:2023-1-14 18:53
一、开发板平台简介:
2 ]' F& r: [: S3 {/ g1、开发板资源简介

# `2 E# j3 [' k" D- u. U(1)开发板主芯片型号:STM32L431RCT6
2 K. B6 a2 }2 b. ^1 ]4 f4 B4 }(2)开发板主芯片封装:LQFP-64_10x10x05P
& g, N+ |- I0 q8 t+ w, r(3)开发板主芯片内核:ARM® Cortex®-M4% z- v; C8 _3 {  U  f
(4)开发板主芯片主频:80MHz  h! E* A5 ~( m0 a& u% z& Y
(5)开发板主芯片Flash大小:256KB; s/ s3 [8 a( p, ~4 P
(6)开发板主芯片RAM大小:64KB
- S3 Q- L- J9 B3 i; I& ^; M" p/ Q6 o- c0 S, |$ s
bb91345227434ee7a43a34bf3fe366e6.png
, g) L  m1 B+ H$ R# B; }. Q2 t0 @; t) W
929c0cce04aa4115a8623703982bf3e1.png / ?9 B  Y; U) u: q

  w% K6 w* @3 o- G2、LED灯资源* O! H6 F2 i$ w, m9 Z7 _
(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:
4 @" n4 C' n7 O; o) n' |9 C
0 r1 J% e7 g! r1 C
0f177691c5814f16a508bcfa747f87ac.png ! r2 K* s: {- K6 T8 G; b4 b: H
6 I3 Z9 J7 `/ `6 y: q9 k& y2 O
(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:
6 W! X# d7 B: G8 @
. Y6 L2 ^" ]9 T- Z9 S1 w% i
e923ad767b8448b7ac37c4ed693724bd.png
, K) e0 R2 K2 ^! n' G( L' ?7 K4 Y& I) z5 ]# G
​3、串口printf打印工作原理' G2 |0 I" m3 Y1 i1 t) M; D2 E
 串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。
+ l4 a$ ^& S* w+ ?& C

: w* H. x/ |# z# b     (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也可使用该串口作为debug串口。
0 W# X0 Z* A4 z' {* Z; ^* ?/ c# m4 h, L) d  l% Y, K# w# {
     (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。
, ^. q! E% }& r

8 s9 S( r# q# i1 A2 ]4 k3 ?/ T, TTTL转CH340串口,硬件原理图如下所示:% L1 e3 S6 ?, ^- |( W) D

9 [+ j3 P# R8 d3 A
4df1b489cb944c26b55013001061675d.png
! W" L& z( O/ K1 D  |/ w, S7 i% M" f
: f0 p6 T% ]8 z1 Q
9 _6 Q4 a9 P; F) p7 J
  二、串口printf实验过程
8 v* w% M  K8 M1、新建STM32CubeMX基础工程
9 E; b4 i0 H6 j! B1 x1 H7 Y9 f(1)打开STM32CubeMX,点击“File”-->"New Project"
, c% ^/ P* x' O5 B4 E% ^0 L2 ^* }0 e6 Y) }% V; ?0 ?
2399170347904e959c855fefd5877f84.png
, ^! ?3 n/ e: r3 H1 m
' g0 z; f0 S( c( j5 Q8 ^  O(2)等待打开主芯片选项界面(大约1分钟时间)。2 F4 `. k8 {# e9 x- M2 v; i
9 y/ o( q. J/ }3 _; h
d74d2fdc60c9440483e2b7cf8d928e7f.png
- A. d# \' q" C$ ^7 O+ A
1 }' G. r! I: n5 _0 y& f(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。3 @' ], ]0 E! Y) i+ S! V5 m' G
5 ?0 H+ E! e4 z+ \" l
7b80345238d74bea82ce70e1a348f7b4.png
: g1 _3 C$ s6 R

% o0 w* O. l7 |, S1 v  s(4)选择时钟源。- ]4 `$ X5 v* g  v" h
(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。
' P! s" V, I% i" h) K- P7 Y% q% D  I. Y5 z! O* {
3f65707eca104663a3dede6d25dfa961.png 6 t  i5 k4 W; z) J2 I7 z/ L
  W9 S2 X/ {+ Q% J9 `) N
(2)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
& `& a* C' \- F/ v7 G/ V- w  k: O% i
72119b971f62410fa8344f7f9fb9f389.png / u' Q% @. C2 _$ h3 L% q

" P; Q9 k+ m: c! u: v1 ~2、配置GPIO控制LED
  L  x4 J. n2 }, O( L(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:
! U) n& E$ x6 i5 o# p( N1 c5 R9 o" Q
- b+ G/ R9 w) f8 KLED1——PC0
$ I9 I  F- S& J. I. }6 N1 t0 \LED2——PC1, y  [% k) d2 m6 w7 v+ U
LED3——PC28 G1 t: C) O  p( t/ }
LED4——PC39 @( o7 Q; B" R9 g% z. `/ H
" {: _6 r/ {2 s( S+ x1 S6 A) x' }
(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。
* g2 m# C2 R. J. t; A0 }0 p
" z3 u/ u, O# u, P
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。( f+ `1 g8 e8 p4 F* X: \  m
鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。2 M3 W* i+ p  Z. D$ o0 @- ]
鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。/ Q# l4 [) I( e1 C* J, ?
鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。7 ?7 k, m( v/ X/ o/ r' A7 d" Y! E) \
' [3 j# ~+ A6 r3 l8 `
492907c1e71149819adbaee4516a2af4.png , e3 d; t9 Y8 p1 y: F" s2 D

# b/ z0 B& O. {" L; {) y
c75d3f10ba2e427d9c1a10fad9bf5471.png 1 P9 m4 |' I9 q. t. u; ]

/ r0 M: @. Z7 z4 p+ Y- A5 {, M( g0 z(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。  B7 H1 z. R6 h

& p9 d6 p2 B3 u) y! {
38ff4b80e1c5495ba3076a5158fd91fa.png
+ ?. P1 i5 A* W( c. Z" S& s
/ O# O7 d. `1 F' {5 u6 d+ z' ]​​3、配置PA9、PA10为串口3 m& U8 L& s. F) d5 [. `- @6 h. R
查原理图得知,串口1使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:
  K1 G) K7 M6 S/ s' f; G
' E& U1 s- Y% j5 Q! o# J4 d" d
497b8ee0243e446784e64a3c31e8a26f.png
+ }# m& y4 |9 [) m6 f; E$ n" d1 i: A' f; Q1 w" w
(1)序号1用来设置串口收发引脚的选择。9 G% `- ~* x+ D/ ~# ~0 `
(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
7 h1 o7 c* m+ z. _: f
2 @$ s% [  t; L5 X6 }/ t: w, n! ^8 P 3、配置项目工程参数5 Z% `! v9 l7 ~7 N9 q* K
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。7 Y3 ?- f. U8 w# U/ y3 h( o4 v& ]

0 N& ~, v5 w7 a. J
f3ecedd9323f4463b69539906b3c1199.png
+ l# p7 h- P! X; ~1 D" @
4 z. V" `7 |0 Q2 p8 h: |& J
(2)完成配置工程。
' o5 E. L5 t9 L: T( M$ U/ w# `6 r9 [% k5 ~+ ]: S- h7 j' l* @
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)# G) S5 y+ t& M' c! n
( c6 v( P+ r& _; {! P
efdb616174f54925b6eac31109f227b5.png $ w2 e$ o8 L+ R" |/ r
​​
5 \- g) C( K8 B4 ] 41c3f2716e4e4eda8f62fa3a1d871322.png
3 ]0 [0 l" B$ y' o
. B! O  d8 K' l  U0 D$ |
(3)生成代码。
+ s2 ~: |& f, H- x$ O. a: ]) T! U, ^1 b) F* n! b, A
备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。* h, i! W  a4 c7 M5 v0 F
7 D% a( ?7 h* p, a  T7 z
8eaa7d0babea40ee93f158481a6ee471.png 5 h" h# O' F* S& R2 k" X2 B) p
​​' E) \( y- d/ C+ m; t/ n
(4)工程代码生成成功。; K" ?( l, B3 X
; ?- L; h+ N9 ~: C4 X9 `7 l+ V4 z
e8f46d59a1fb4af589feb613fdff17b4.png
+ c( c6 J$ M) L! [' G* M* n) _8 `( G0 c
三、在KEIL 5中编写代码& l5 x- k% N! o8 T. ]5 v2 J  N4 Y
1、使用KEIL 5(MDK)打开项目工程文件/ ]$ u7 N2 @+ z4 j" {8 g
源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。
5 B; H; K, P! ^- E' \) |
, x( w$ h, K0 {+ e1 _& n" \(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。5 ~5 h4 [4 H, w, n$ x% r% Z

& t' ]) N1 a" g
b3dafdc5f39c4af2946ea9b465b779aa.png , @$ t4 D: Q% {# I

9 J5 ]) J0 Y" ^- B9 U2、添加串口printf验证程序
- {+ E4 ]. V# h6 h0 o6 P# P' `9 R(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加控制程序,如下所示:实现每隔500ms后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换,并且串口每隔500ms打印一次。1 P/ x9 W  S; h$ T: @" v" N  I& s

- R+ j( J$ B; G% |* C, s备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。5 T% V  ^" J+ x

& C0 a  j: v4 U9 E6 o3 l3 V  x
d1194af353cd4b0b88cd9208b1ac7db1.png 7 L7 R2 N6 @) }6 c0 F

9 }: C/ U7 E$ F$ D" j; E
178a631ceb1b40769861cfa141087495.png
: B- Z1 l4 D! g7 t1 U
$ B% X9 `% r6 t(2)main 函数代码如下所示:
, J" v2 K4 M& a2 ^
  1. /* Private includes ----------------------------------------------------------*/% b5 x% R; |$ z4 J: [  x
  2. /* USER CODE BEGIN Includes */
    * D- {3 o+ q) f! G9 T- ~: }" L
  3. #include "stdio.h"                    //添加printf打印函数头文件
    ! Q1 ~! H# a0 M2 C  C
  4. /* USER CODE END Includes */3 G3 G# [6 s' y- l7 Y  n" F2 }+ ~
  5. . f$ C: a0 t$ ^6 c& s

  6. % r5 r/ K8 U3 t4 B1 C
  7.   x0 I$ M1 X6 N# ]( G" R

  8. 4 v2 N2 B- m6 f% S  q& a

  9.   B2 o- i0 E1 A3 X# d# W& p" U
  10. : h5 K0 m5 |- F/ u( t3 l- a

  11. 0 L5 f) f6 a$ s- g# G
  12. int main(void)  V1 B, M( |1 i* X9 T2 i
  13. {
      z! Q  c$ L* m
  14.     /* USER CODE BEGIN 1 *// g) Z" F; |' ?

  15. ) S3 e! o: L$ R+ y; u6 U8 k
  16.     /* USER CODE END 1 */
    ! V  f/ g; Y. V3 L5 _: X

  17. : R4 h) D/ @' s4 A
  18.     /* MCU Configuration--------------------------------------------------------*/
    8 J7 Y' C/ c1 a1 w9 a- O5 G4 w
  19. 4 `* S: ?; n% t! u7 I) o
  20.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */" K0 f- m- N+ y: c. F  f8 O
  21.     HAL_Init();
    / B( m% q& l  R- h. r

  22. ( M" V/ t. [* |9 U6 m7 i
  23.     /* USER CODE BEGIN Init */' B+ l$ A# E" y- H5 a! u5 P6 A$ Q* w

  24. & j  u+ c* g+ M' S" J
  25.     /* USER CODE END Init */" }: U/ K2 [; T8 R. y4 l  S: P
  26. $ }+ x( Y; @* r; _, l/ i
  27.     /* Configure the system clock */
    * K4 Z+ f1 A& |/ J
  28.     SystemClock_Config();2 F, q. Y  h5 r8 L' r

  29. . C" ~2 h4 I. T2 ~  R  @
  30.     /* USER CODE BEGIN SysInit */
    ( n2 d" C" f1 X: Y$ d8 Z

  31. ( e2 t6 l# h% H6 g4 E
  32.     /* USER CODE END SysInit */
    $ P+ f" F. B! G3 G' L8 T" ~' {
  33. 9 x8 W0 P: C* ~$ z; X' }
  34.     /* Initialize all configured peripherals */
    # k7 R& ?4 T0 _- q
  35.     MX_GPIO_Init();& l3 b+ J/ J7 s
  36.     MX_USART1_UART_Init();
    ' w$ x3 T  X# m0 B5 T0 h
  37.     /* USER CODE BEGIN 2 */' |$ W' L9 R7 J3 F0 h
  38.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮6 i; j, d% O. l0 F, S
  39.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    : X3 k7 ^4 V, A
  40.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮, M& L+ a, V+ C
  41.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    2 Q" H( p. Z$ s$ _9 q
  42.     ' l1 p: {7 Q; b- J# Q! a# h
  43.     /* USER CODE END 2 */6 U3 V8 s2 N* M& D* ~
  44. ' t8 b* P6 ~  w- ^6 A  M# n
  45.     /* Infinite loop */
    " R* l7 b( U: y
  46.     /* USER CODE BEGIN WHILE */
    % i% U3 T" a/ B" n: `) v
  47.     while (1)
    0 i  S" Q) u4 C/ E: }, X1 P* ~
  48.     {
    $ v1 \7 A2 ?/ p, X' g# ~
  49.         /* USER CODE END WHILE */8 X9 }$ b% D: K+ K1 ]) s4 e! _
  50.         /* USER CODE BEGIN 3 */
    9 r7 `+ V& P$ z! j2 A! P. z4 @/ j
  51.         HAL_Delay(500);% d0 b. `) @% ^
  52.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                                                                        //反转LED灯) H4 D1 A+ F$ u6 I3 a; A
  53.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);                                                                        //反转LED灯
    % d2 u3 ?' e; q
  54.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);                                                                        //反转LED灯
    4 R+ E& |7 Y# `" f
  55.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);                                                                        //反转LED灯
    : W* n$ x: n% B2 ?
  56.         printf("hello world,this is printf function!\r\n");                      //printf打印
    0 b; r8 G6 o: i! o5 d" D
  57.     }+ L+ j4 F' g! D
  58.     /* USER CODE END 3 */  U' u; A& h6 M$ q6 Q7 |) G
  59. }
复制代码
+ F, a" u) Z4 U7 q" y% `: K
3、设置编程仿真下载模式+ L! N" X  z3 B, C$ q
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。/ ^/ |% u5 p" r/ N; p. A1 W/ k

( s7 z$ q3 T% g8 k0 Z" W
edefb6b9a2a14be3b1221ad6d5c7a8a2.png   e! T. [( M1 }
​6 Q8 T' ?  k8 G8 }* k8 W
(2)点击编译,完成后提示“0 error(s),0 warning(s)”。
' r% c6 X: p6 S6 q0 r4 f4 ]4 ]0 T
e0b7e3e353b345a7987fe5f821de2dda.png $ m( N  _1 l' d9 b+ }: b! B
​​
1 X+ B  X$ s  a8 f(3)点击Download(或者快捷键F8),即可下载程序。
7 K* r/ Y& R5 l2 h% L4 R5 a% W5 A5 ]" ^
  D! ~  x8 Z7 \0 b" V
eb3f250f19e44862a7df80c2492fcd01.png
; I5 Q' Y$ x4 [. p* g$ b​​
6 }, Z! V0 {. V9 g* b* M" n4 L4 g* [; h, t8 Z5 V' M6 {9 p( p
(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。+ O- B2 o% V5 ?1 o8 G4 D
1 ?" k) S0 Y( E/ R" X$ K
9f8aa1a4e8f04041bcf5cb183facd100.png
( u5 K. }  J) J# ^ ​​
" L/ `% D6 j; T) h  v' ~+ z5 ^$ X4、串口printf打印实验效果展示
. y& x6 a$ q# K% R3 h! I        程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后每隔500ms闪烁一次,并且打开串口助手后(串口参数:波特率115200、N、8、1),可以看到printf每隔500ms打印一次log数据。
: @9 r& A; @8 W  w1 {! b5 D- H5 v$ ^' ]: ?6 n6 S8 Z% T5 J
06445a6b81d24af4a118aadebfd333de.png 5 ]/ Y( h/ s& z( p/ `% S

% \7 B$ D: R7 S- W! l$ c/ ^————————————————
! I6 i9 A+ k8 f. {版权声明:智能小屋ZYXC( _& H0 T3 w2 b, C8 i

! R; v% L2 k( X  m  O6 E
赞 收藏 评论0 发布时间:2023-1-14 18:53

举报

0个回答

所属标签

相似技术帖

官网相关资源

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