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

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

[复制链接]
STMCU小助手 发布时间:2023-1-14 18:53
一、开发板平台简介:* i8 o) t' l8 u& y% Y
1、开发板资源简介

2 i& n1 t. r, M5 I3 N/ b" a(1)开发板主芯片型号:STM32L431RCT6
9 R3 z/ _5 ~; V" w0 y! v% w(2)开发板主芯片封装:LQFP-64_10x10x05P
9 E9 {7 K( s' |( M* `9 a7 i( X2 k(3)开发板主芯片内核:ARM® Cortex®-M4+ m. x) V; }  u1 l7 n. L* C
(4)开发板主芯片主频:80MHz; [1 u6 k; ]# F; Q6 H2 b4 p
(5)开发板主芯片Flash大小:256KB% u6 ~; t: s( N0 D, ?, t  E6 H( L0 S
(6)开发板主芯片RAM大小:64KB
9 v* ?  `& e8 @, }' R2 i
. Y! \, t+ s4 k6 j
bb91345227434ee7a43a34bf3fe366e6.png
7 r2 R6 ?0 k* \( M# I/ L8 m8 E3 `$ n( g+ e, y' b  K, U
929c0cce04aa4115a8623703982bf3e1.png
' Z1 N. }" M/ ~$ v4 X
! F) W' t0 U  S+ k
2、LED灯资源4 m7 X1 M" K7 C" l) ^
(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:3 g) x4 \9 i7 a: y7 N: q

  P$ X; w2 W4 z, g) `% O
0f177691c5814f16a508bcfa747f87ac.png
5 x4 X6 r" w6 W( i' k" H  T& s3 k
: [1 m% {* a  v* ~5 a
(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:
6 I" z5 }6 Q+ ?. b0 `: Q0 u3 w& p: k$ G6 S( u% \: }% a
e923ad767b8448b7ac37c4ed693724bd.png
5 Q2 Y) i/ q& n1 \! L) s% f4 a$ A
: H. l/ o0 z) @2 _  t0 d- o2 v​3、串口printf打印工作原理
( k/ ]* w: ~+ G0 R 串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。) F) y9 y* t7 Y- ~9 V# _

: m9 b3 S8 z! u" N. a6 {8 q: C     (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也可使用该串口作为debug串口。
! `5 l  ~/ f3 `$ _6 y* n
9 ~8 e$ l/ u& S- D     (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。
7 W. w4 N- I5 I1 R+ C

4 R* C, R, A# z0 YTTL转CH340串口,硬件原理图如下所示:
  F; H# j- `, n* o. E) j
, K8 _: h  H0 h
4df1b489cb944c26b55013001061675d.png   C9 _% t  O7 V' x6 w1 q) I1 ]

; O/ ~+ k* L; H
! g% H) b! o! O" d' J9 X% l
  二、串口printf实验过程
, }4 y8 O5 D) ]% D" Y1、新建STM32CubeMX基础工程
6 u* {- D6 y, f( c& i: w) z" I7 U(1)打开STM32CubeMX,点击“File”-->"New Project"
% L) g- U1 G7 \- Y6 z! ^$ K) E; R# Y' |( I' f$ z) Q
2399170347904e959c855fefd5877f84.png
5 N3 ~# Z  v- D. V* y' @& S* m4 z' j% `
(2)等待打开主芯片选项界面(大约1分钟时间)。- }( }: Q& J' u3 }4 t8 L8 [7 R
; r% D* u. `8 \
d74d2fdc60c9440483e2b7cf8d928e7f.png
, ^1 t4 L  K' g3 n/ d. n! B7 o: W8 `
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。+ d8 g3 Y7 A8 G$ O( l' L8 M; h. B
: s. K: K  Y! d2 g
7b80345238d74bea82ce70e1a348f7b4.png % M! |& D5 r. G! c" B

0 l5 c* T4 R* m8 p: x: P( x(4)选择时钟源。+ H2 R6 d3 h5 |; M! c5 r0 f) \6 f
(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。
# Q- S" z$ g, q3 J( D! A1 h. K. F- R8 _& m
3f65707eca104663a3dede6d25dfa961.png
0 A& y* Z& A4 z9 n3 G$ c
& |3 L& O) m4 Z. z# b1 g(2)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
' g- C8 j8 [6 Q0 ]2 \
; P. o# i" o) y8 ?+ B: q5 R7 Q" Z
72119b971f62410fa8344f7f9fb9f389.png
: z/ m( l+ B: ^# \5 C$ k. ^
8 y& p7 g. q- d' f, z0 I
2、配置GPIO控制LED
, a4 }- j% Z  t! ?  s0 B(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:
, g8 G$ \" b/ e% x6 ~
) `4 Z& @3 |8 b/ D) g% eLED1——PC0
6 ^0 @/ U4 }6 i$ U1 bLED2——PC1
) b+ q( K' Z6 R; j$ V) f5 ELED3——PC2# e- l+ O8 t# J% O% M) q
LED4——PC3  |9 X$ `% B7 o# ~
) s) m* {* t' u1 q' S4 n$ J5 N
(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。# u8 d) T' E8 S6 y1 {/ H
/ f; \3 n! n) J. t% J# O* l$ P
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
. o$ w' C9 r2 w6 S7 Z+ G# r鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。9 f/ r# e; A; u
鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。
- m9 J+ X- r3 S8 v9 l( Y9 v. x鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。
/ K9 ]" W  F- ~) ^3 ~8 |1 \( J( T6 A/ @
492907c1e71149819adbaee4516a2af4.png - U* g' D% y3 l+ w+ u- m

, |/ U% B* ^5 k
c75d3f10ba2e427d9c1a10fad9bf5471.png
$ w6 K9 g/ l. k! r
  Z2 F) E+ i" y6 Q(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。
: R& o+ j' Z: b+ E- e1 [5 W- [
0 N& t$ P8 O9 Q) F3 u8 }6 i
38ff4b80e1c5495ba3076a5158fd91fa.png
/ j* J" w  C* Z' t0 K1 B2 N" s5 t. W; d) T
​​3、配置PA9、PA10为串口
0 I4 g5 g+ O! v" w查原理图得知,串口1使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:
2 m' s; }' ^9 _- c/ ]
& N& D. m$ {/ G* ~  w7 t
497b8ee0243e446784e64a3c31e8a26f.png
$ j0 Z% c6 i7 L( P: o1 p! b  H* ~
, b9 i% z: ]& t (1)序号1用来设置串口收发引脚的选择。
* X) r2 E/ D% h$ X) ]3 [" g1 n$ l(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
6 a+ j8 x* m* X( D6 f. r8 f
" @0 x$ `0 `- y/ {; S 3、配置项目工程参数
0 Z& U. ^, e+ C, E* ](1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。
9 Z$ d* ^3 W1 z" \" a
% E: U% ~; g9 N( d: L
f3ecedd9323f4463b69539906b3c1199.png % x+ B. w+ e) x, Z  @# Q
4 `# ~% @! ^. O3 J
(2)完成配置工程。
9 ?" k7 g5 j- u8 s% I" v  o; W7 F, ]- R! t$ _# J
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
! `5 o- [1 E/ v
8 V) i9 {% z3 T: `
efdb616174f54925b6eac31109f227b5.png * j9 g0 E0 P% n- J$ T+ H
​​
! s4 i) `2 s8 z! R 41c3f2716e4e4eda8f62fa3a1d871322.png 4 H* S' ]) w0 i9 b
4 w/ C. y0 k0 _7 b" G2 D4 Q
(3)生成代码。
4 J5 k5 X8 \7 K5 y. t, x. l( G( w; J& {" V. R" f% ^0 l. ]
备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。9 L+ \6 y' }$ f0 }4 F, O; a5 W

4 w! i5 d7 q" j  _% o
8eaa7d0babea40ee93f158481a6ee471.png ! C4 E3 _, _% ^
​​
  G* M. D4 e) N( D(4)工程代码生成成功。
" I, y. `$ Z$ g& |; z1 d5 k% o7 r- i; R0 E3 |5 ]
e8f46d59a1fb4af589feb613fdff17b4.png . C- i, a: L2 s$ j7 s3 `

6 ?' z# h3 E- d  O7 A, { 三、在KEIL 5中编写代码
; F; L: s. j- c1 f  O& Y1、使用KEIL 5(MDK)打开项目工程文件! B8 J2 p$ C6 Y
源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。' q$ j) C# o+ x, l4 d; V

( w* [4 L2 U9 o, Z5 G6 M! V9 @(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。
/ r3 P  r( K  u7 ?9 z7 Q9 N+ F) L' s; Z4 k
b3dafdc5f39c4af2946ea9b465b779aa.png : h* ~" G6 I" X/ |
2 @1 B3 B& @/ T. b: V+ B% d7 b& r
2、添加串口printf验证程序
6 i+ _. I. u4 ](1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加控制程序,如下所示:实现每隔500ms后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换,并且串口每隔500ms打印一次。0 X$ [/ R& c( y$ h6 O$ j: H7 G% Y3 R
, o9 x/ W: w' s
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。
0 x( t7 E3 q" ^' |( Z. d% w$ j/ Y$ O# r1 ~' _
d1194af353cd4b0b88cd9208b1ac7db1.png
3 {- }2 c+ ?' G9 l+ Q* s! q5 Y) B0 u' L% x1 Q
178a631ceb1b40769861cfa141087495.png 3 \7 v7 B- E6 `, {% N+ f4 I* s( b
0 }" r! L: T, z7 k
(2)main 函数代码如下所示:
5 X/ P5 Y; p$ C/ `7 h# Q% ?
  1. /* Private includes ----------------------------------------------------------*/1 ~" J  \9 x2 ?7 a
  2. /* USER CODE BEGIN Includes */
    7 I) U! {, \) E. V) P8 q
  3. #include "stdio.h"                    //添加printf打印函数头文件
    4 |9 n  r7 m; N; `! {
  4. /* USER CODE END Includes */% l# U) W; C1 B. G. |, D

  5. 1 O1 Z  V) [' ~: w
  6. 6 J) L5 c2 j& @) p$ t
  7. ( w6 u8 ^- _0 c  d6 Q4 U2 |

  8. & I  m3 ~) J+ x  Q' Q7 \6 I
  9. 8 S$ b( r: Y6 d, J; Z' n# H

  10. 7 r+ G# {3 [# W* _
  11. / }1 t9 G, M  H' \
  12. int main(void)
    ' w8 ?) f2 J$ v. \1 j2 x
  13. {
    2 _1 Q( X' _/ X1 M5 ~( s
  14.     /* USER CODE BEGIN 1 */2 |" r: F* o* X6 V* A: j; Q
  15. ! Q$ p3 }: }6 `- n
  16.     /* USER CODE END 1 */
    . O, p% z* P9 _* N1 Q: g

  17. , f4 Y& U; Z4 F4 {$ G
  18.     /* MCU Configuration--------------------------------------------------------*/
    - T0 V) z9 _7 v

  19. 6 v* O3 F, S/ z' j5 }$ M3 m& q
  20.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    ) @% ?+ N% C+ |) t3 G9 L4 I" `8 o
  21.     HAL_Init();5 N  }- U- F, y3 V
  22. * s7 }5 _7 u0 Q- D. M2 j4 D
  23.     /* USER CODE BEGIN Init */
    ; a8 i8 Z; x6 j0 i3 H
  24.   m* v% k; ~7 j; _
  25.     /* USER CODE END Init */! {1 H7 m6 q$ t% g' F1 g# `

  26. " w: z# w% J1 h! }7 X0 d, q4 n
  27.     /* Configure the system clock */* S/ P( c1 K  y5 a* |! r
  28.     SystemClock_Config();- J$ `7 \7 l9 w( H6 O

  29. / w7 \, ]8 H. Q1 k* m* ]0 M
  30.     /* USER CODE BEGIN SysInit */# a# g. D% N) N$ E/ Y( {8 ~

  31. 7 o! c& k4 i, G$ G9 z* D. n
  32.     /* USER CODE END SysInit */- _' o2 D8 G) T* H1 V  t; v- p
  33. ) A1 [: D9 E& u$ Y6 n3 |' R
  34.     /* Initialize all configured peripherals */7 f/ U. u. O- K+ ^  K
  35.     MX_GPIO_Init();3 s; p- `0 X7 g: H: O# p2 K4 c. j
  36.     MX_USART1_UART_Init();8 l# Q8 K) d# }
  37.     /* USER CODE BEGIN 2 *// T* ~! T6 z! F* r* Y
  38.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮! J: }, S4 z' H4 N
  39.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮( w. y& U  Y( d- v# l* C" J, m2 t7 |
  40.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    / G- G2 h, z# N& d
  41.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    - a( X! T, R/ E/ B& h' j
  42.    
    % o3 ?9 ~" a4 P+ C- V  Q. U8 Q1 Q
  43.     /* USER CODE END 2 */2 j, g: q5 n# L; M& A5 W
  44. 1 D& d7 O- L6 X0 r. k# B) W% R
  45.     /* Infinite loop */& h6 M" r; y5 j5 ~
  46.     /* USER CODE BEGIN WHILE */  \' z2 V; ?+ O) u/ }/ ~! A6 K. J
  47.     while (1)
    + H8 [' @. \* O4 k
  48.     {
    : V! P, l* `( c1 K: }
  49.         /* USER CODE END WHILE */9 N8 c4 [  z+ e0 n& b
  50.         /* USER CODE BEGIN 3 */
    ; |! d5 W$ r' _9 e; w
  51.         HAL_Delay(500);0 u* Y, j) l$ o4 ~1 \. b$ \
  52.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                                                                        //反转LED灯
    & G8 s& a7 t* Y; d' D* {& f
  53.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);                                                                        //反转LED灯& x( C9 \3 \* X8 K2 A1 W: W+ w
  54.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);                                                                        //反转LED灯% R$ V. i3 p# l4 v: b* R6 X
  55.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);                                                                        //反转LED灯% W% o  |9 E: V2 m% h: V
  56.         printf("hello world,this is printf function!\r\n");                      //printf打印
    3 P$ V" B: ~6 l' f8 l
  57.     }
    7 K3 u$ @% [! {9 ?/ M% p8 j
  58.     /* USER CODE END 3 */
    % `$ Z: h: B9 Z% m3 ?6 s3 j5 f
  59. }
复制代码
3 r/ B$ e& o! j+ }. ]# }- H8 }
3、设置编程仿真下载模式
9 W; `+ J" R& z3 D0 M/ V  Z! ?7 r(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。* Y' ], G. @8 T2 o  p1 y8 W7 z
  R/ d& D, Y& i0 v; I, \
edefb6b9a2a14be3b1221ad6d5c7a8a2.png
0 K* J& G3 w( V3 n% J. C; F/ w​
* A/ P/ I; v  n' _0 G(2)点击编译,完成后提示“0 error(s),0 warning(s)”。  C5 ]) j8 P  O! T* Y+ B
# \8 N: W1 x3 D% c& Q
e0b7e3e353b345a7987fe5f821de2dda.png
6 \0 @3 l4 T6 L) d7 g8 t​​0 P5 H8 k3 z. {- O
(3)点击Download(或者快捷键F8),即可下载程序。# l# M7 l7 W* J7 N! z
9 R7 q) ~$ U4 [* y& z" \
eb3f250f19e44862a7df80c2492fcd01.png ) ^. B) K1 o4 o) S- A
​​/ c/ }) W( M, k

3 A/ `1 m5 N  y) w1 ^1 @# @8 }(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。% s3 A. L! i) s: v% z
+ d( t0 v8 v2 U3 V: K( J7 W
9f8aa1a4e8f04041bcf5cb183facd100.png
3 I8 F4 h& Q! `0 G0 ?) T ​​
4 E& W8 f" D3 e. u3 J/ p4、串口printf打印实验效果展示
2 \  o3 `3 ]; g        程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后每隔500ms闪烁一次,并且打开串口助手后(串口参数:波特率115200、N、8、1),可以看到printf每隔500ms打印一次log数据。. ]2 \/ T$ s; O2 U1 ]
$ P6 ]' A7 A$ ^8 K6 j' J3 p+ V
06445a6b81d24af4a118aadebfd333de.png
& E2 [  x$ [0 Y2 I9 c* N+ }. i6 f' ~9 G- F* }* W9 j
————————————————& `3 \5 y& }5 r
版权声明:智能小屋ZYXC' I3 z7 {5 a1 i: y5 t6 y. r9 @7 _
; U0 C8 f! z) h  n4 N' U  u7 H
赞 收藏 评论0 发布时间:2023-1-14 18:53

举报

0个回答

所属标签

相似技术帖

官网相关资源

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