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

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

[复制链接]
STMCU小助手 发布时间:2023-1-14 18:53
一、开发板平台简介:
! B: C4 J5 |9 Y! v' F1 g1、开发板资源简介

4 G. P6 a' f. h. W$ E(1)开发板主芯片型号:STM32L431RCT6
# O4 o( M9 y2 z/ n4 y8 e(2)开发板主芯片封装:LQFP-64_10x10x05P
8 d- s- k. T& [7 s; [6 i! ]' l1 G(3)开发板主芯片内核:ARM® Cortex®-M4
9 V" y% k0 [6 a2 e0 a: N/ U(4)开发板主芯片主频:80MHz
' ~8 F; |) {# U2 u4 X& b(5)开发板主芯片Flash大小:256KB$ _  A) N. ^1 z4 Q: C
(6)开发板主芯片RAM大小:64KB
' c# s) v4 {/ h8 o7 l
. U% ~/ d; A, j+ X1 m  j) z" f
bb91345227434ee7a43a34bf3fe366e6.png 5 j; n1 h" \+ @

3 [3 F4 }8 t+ ^7 @/ M0 Z: f
929c0cce04aa4115a8623703982bf3e1.png
/ G6 p: q4 g; m% P- v
9 b" Q  D; X# Y1 Z" A
2、LED灯资源
# Z7 [! i0 l, R; y0 B1 u$ A- X(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:/ F; p8 `% P, o$ g/ G

4 h. H8 H  U$ D% P* F2 E2 D; T$ f
0f177691c5814f16a508bcfa747f87ac.png
# G$ `2 s/ o# S8 E. ?: h  |, o$ ?; c

$ c0 o% t" C0 s0 Y(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:$ K- t( P$ R; C% _" F- {5 ~
$ `4 n" c- q7 q+ e# ~
e923ad767b8448b7ac37c4ed693724bd.png $ ?- t' H- @+ t) y8 t! L# [2 b
5 V* ]) s2 ^# Z- ^' |7 ]# ~0 l
​3、串口printf打印工作原理" f- e: p# ?. S" g! r
 串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。( H* A$ X2 t: t
, ?; V* q7 W7 Z; |
     (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也可使用该串口作为debug串口。7 s) f+ E* o) {5 t9 I2 M) _9 {! K4 Z
, M; ]1 N4 W6 q: u
     (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。" o3 J( e, I2 C1 b8 c! ]

7 H" l, Z1 p! i& u& NTTL转CH340串口,硬件原理图如下所示:) [( K! H0 S# ?* M8 O1 v' n; r' Z0 Q

1 L  B( M" B/ r7 q* e
4df1b489cb944c26b55013001061675d.png / i: j* _' T+ I: g* P. ]& j: [$ r
- \3 O3 U$ q* V/ }+ k( F  ]! I. u

4 q; i1 X3 D1 ?0 Z) l$ ?  二、串口printf实验过程
+ a. K' q( T$ A7 F2 v/ i& |1、新建STM32CubeMX基础工程
$ |8 _6 E( p% ^9 Y5 a(1)打开STM32CubeMX,点击“File”-->"New Project"- Y# a1 H' P6 B) r. ]4 ?
' ?/ I5 Q; ~$ p
2399170347904e959c855fefd5877f84.png
# s- Q& _7 t, x0 ^5 `5 ~  b# |
- [, W( L; {3 x(2)等待打开主芯片选项界面(大约1分钟时间)。
" G! g  _& E: {4 T' O: Y# F! z+ ]' C3 B/ E
d74d2fdc60c9440483e2b7cf8d928e7f.png ! T8 k7 F1 w- s, s

1 W4 U" B- b3 c4 O2 n( N9 ]2 a! V(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
7 d, o$ N  P: g" `# Z3 |' j5 v: P4 V# E; [
7b80345238d74bea82ce70e1a348f7b4.png
6 w# K  i0 O4 U: Z( B' d6 d+ e0 k

. }+ ~9 R3 |0 R(4)选择时钟源。
: Q3 ^4 W1 g5 }% z, C(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。( R9 V2 T: B) S( ~0 n  D
7 W0 w$ `4 r7 N+ k
3f65707eca104663a3dede6d25dfa961.png 1 ?6 W$ B5 O+ |- n7 N

" x% g* O6 j) L) G& F9 j/ O: w(2)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
& V0 u0 r7 O1 U% A9 d$ s: y5 Q6 K! O4 m2 v, b2 z
72119b971f62410fa8344f7f9fb9f389.png
0 Q2 T' d" S" n3 U1 K

2 Q' t% e' k4 _7 U4 ?2、配置GPIO控制LED/ D. h# S8 L  r1 c( Q* P: M
(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:
1 C5 m% _% N) f  }7 H! d8 f4 k& h0 ~
LED1——PC0
% d4 Z, N3 B! k4 [1 d4 Z7 ]LED2——PC1
. X) p2 @4 o  o' O: ^2 ]) ?" qLED3——PC2
: `2 l: b3 {$ Y/ V7 ILED4——PC3
  [7 P5 W4 H) F& W8 |
, z9 R* l, K5 p$ S(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。1 f: y+ M9 d( ?7 K0 f  K
' y% h. e5 o0 F
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
  c$ s. Q& x  O5 M& Q8 z鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。
4 `. ]+ t2 ?" n; v4 @' R鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。% m8 {0 F8 C, J% v/ u
鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。
: {$ \$ p4 ?" x. o. K( @4 l, I5 n( H$ |9 L2 n; n/ w' E. s
492907c1e71149819adbaee4516a2af4.png
$ B* w# O& d- i' |. u: W. f* Y" ^: c4 G
c75d3f10ba2e427d9c1a10fad9bf5471.png
' z$ h$ B3 {0 q0 r6 ~. |' J: A
0 I! N  }8 y2 X# c! f* H(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。7 ]; q9 V: _! y! [( i+ A& X

+ h& a8 o; q* K& [3 j8 u
38ff4b80e1c5495ba3076a5158fd91fa.png 9 v4 u9 i+ T% [5 \: {2 i  Z
$ Z8 X0 M' P6 z0 [8 `7 l, W9 ~
​​3、配置PA9、PA10为串口
/ J; `  K+ e4 q: I  U4 Q  m! H+ f查原理图得知,串口1使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:: x6 x% G0 ]5 g/ Z* n* \
  _( l8 z5 f  [
497b8ee0243e446784e64a3c31e8a26f.png
9 m3 }3 h0 S, Y1 I8 S$ B/ b3 j! p9 X+ O5 Z* m
(1)序号1用来设置串口收发引脚的选择。
/ n, |" u9 H2 {$ v8 y; ^4 m" C(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。, H- p: _% p1 [2 a  s0 H6 D4 ^/ X" G
1 |- l9 {& g6 C" {3 v
3、配置项目工程参数3 O8 o! |$ U8 v$ f8 V' v/ X
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。& M. {- c# h4 ?

$ O" {4 ?! D0 n3 q; O
f3ecedd9323f4463b69539906b3c1199.png # G7 B0 v% O4 w
. M4 |# N7 I9 z  L! o2 I8 H4 U
(2)完成配置工程。
0 C1 |6 t6 v- F. M. t: j4 o% \8 x& s# N# F6 \1 Q5 q* u3 ^
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
  b' @1 W1 p1 z# c
1 s( f0 I, ^/ _) K# y% y
efdb616174f54925b6eac31109f227b5.png 7 Y; c- W, ?0 ]% n. b. w$ Q7 \+ {
​​
9 T! D% |2 G3 q$ X9 U% K+ Y$ Z 41c3f2716e4e4eda8f62fa3a1d871322.png 7 ~. U8 f0 W2 z

% K$ ?( U* H, u3 o(3)生成代码。4 b0 L: M8 s9 N
9 P  C* `9 m# S7 l6 I
备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。
% A3 I5 ^8 j$ Q* w2 n) l& D- L: R4 a: M) }
8eaa7d0babea40ee93f158481a6ee471.png
! ~) ~5 B( i+ i! |# W' K  k" {6 `9 Z​​
. ?2 p7 c" D+ Y5 A2 a: X, P(4)工程代码生成成功。
# a/ l( G' f; Q/ K1 O2 N; }6 J; Z8 v% V! F# r  D
e8f46d59a1fb4af589feb613fdff17b4.png " r; n5 U; u; z$ z5 ?! T! K
5 S- o9 m: M# [& L7 E
三、在KEIL 5中编写代码! j! I, E* [& z$ e
1、使用KEIL 5(MDK)打开项目工程文件6 u: k; r+ W- _+ w  P# K: V
源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。
# c+ g( b% B' p) F: L( c' T
6 n) d' z' s0 b9 S; V4 O5 c(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。
! u, _- L/ G1 k! s
% x/ h9 n  l- _) ~
b3dafdc5f39c4af2946ea9b465b779aa.png   K0 ?0 Q+ x4 l1 J

$ S! C# X% W8 n5 i6 @2、添加串口printf验证程序4 W) ]& J$ m" k( g3 o, B
(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加控制程序,如下所示:实现每隔500ms后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换,并且串口每隔500ms打印一次。, @  H. ~8 A( B) {
4 z4 W# c+ X/ o5 Y3 b
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。! j8 b0 [) ?5 T4 @7 m

2 {% k, d; k& S* ^3 p3 C2 T" t* M
d1194af353cd4b0b88cd9208b1ac7db1.png 6 Z0 W- b' I) v0 c" U1 X% y% ?

3 W5 x6 ?: W( H. k! l
178a631ceb1b40769861cfa141087495.png
; ?# m  ]5 t1 @. r
& y" T" e+ @. Y% [* d3 N(2)main 函数代码如下所示:% z; ]4 f4 J, s4 A3 y3 O/ ]
  1. /* Private includes ----------------------------------------------------------*/0 Z# l! v. E5 Y& C7 G! k, D9 I1 q1 o
  2. /* USER CODE BEGIN Includes */
    8 W# l% e; q% D( r
  3. #include "stdio.h"                    //添加printf打印函数头文件
    % b; e$ O) X/ d) z# ~! W2 h
  4. /* USER CODE END Includes */# O9 t, b! g4 V( [

  5. & b6 ?3 u6 l9 d  q/ ~/ p

  6. ) \+ H  T) h5 ^, A# V9 ], ^
  7. * s% ~' S$ E$ Y# _/ ]6 T$ Y

  8. ' Z5 b& m) K! q/ s
  9.   G( V, x0 _+ E
  10. ' n6 j, k$ X/ k, o" \7 Q3 v$ b

  11. 1 x1 J2 s  F+ M# }0 c
  12. int main(void)- t# C( M- z; l  M" R) c
  13. {
    3 W5 j4 @/ W' k+ L) q7 b3 v
  14.     /* USER CODE BEGIN 1 */- E4 X, T# j( E. t) O

  15. " G6 M! b+ `; ~( u! P. |
  16.     /* USER CODE END 1 */$ O7 w- H. m) ^7 L
  17.   Y" v7 `5 _2 l" o  U  m$ k
  18.     /* MCU Configuration--------------------------------------------------------*/; E/ m+ f; |5 u" U

  19. ) L( y- n  _, p! j3 c
  20.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */1 ~( A- W# |% @! g# P
  21.     HAL_Init();
    8 t& y0 _" b: A) |# b' |; f$ a

  22. - [- E" V  {5 e' u
  23.     /* USER CODE BEGIN Init */0 Y5 i  O4 O* E
  24. 3 k; E$ E2 i2 y, t3 H  J
  25.     /* USER CODE END Init */
    ' L' A, N+ L- L# }" o+ ?2 v! u) ?
  26. : L, p* B& N5 `6 y! L) ?. X% O3 k* O
  27.     /* Configure the system clock */
    " g2 {; q3 U) _$ o1 U
  28.     SystemClock_Config();1 D6 Q( V' D# t

  29. ) P. w+ k$ L5 b8 J' g
  30.     /* USER CODE BEGIN SysInit */
    ! G& `8 y& |( j

  31. 5 @( Z2 L9 Z+ o$ h5 H# d: h
  32.     /* USER CODE END SysInit */
    . A: r8 s% A9 t3 y5 E* A
  33. 7 w6 w$ I% t8 a+ ^+ A4 k+ w* @3 M% J3 n
  34.     /* Initialize all configured peripherals */
    ( U6 X4 ~% E7 U, q, M0 e  n" u
  35.     MX_GPIO_Init();
    ) A1 x+ x1 {+ t3 }* C
  36.     MX_USART1_UART_Init();
    9 j& Q+ P" s9 ^" t
  37.     /* USER CODE BEGIN 2 */- w' K9 s" }/ t3 I2 R
  38.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮' ?) E7 Z- ?/ e5 D! _2 K" a9 k
  39.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    + n5 c- L& @" E* W3 D
  40.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
      n. [7 T* P, C$ N4 h
  41.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    0 A1 i) Q) t3 u8 t
  42.     . y" Z: l. }2 k* s' ]4 M
  43.     /* USER CODE END 2 */8 K; k0 v2 |0 W

  44. * C# c. @4 F* G4 D3 t/ h
  45.     /* Infinite loop */
    . a  H6 y$ e2 Q, f6 D. P
  46.     /* USER CODE BEGIN WHILE */3 a9 f7 U, @3 I' ]
  47.     while (1)
    ' d( H% C8 p4 J$ G* L
  48.     {) B- k6 j$ O5 Q. n  c
  49.         /* USER CODE END WHILE */
    - Y- `+ l. O- R- U
  50.         /* USER CODE BEGIN 3 */
      z+ x2 U( L8 _$ J8 o
  51.         HAL_Delay(500);( U4 t1 Q2 {) v7 a$ r
  52.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                                                                        //反转LED灯
    8 S1 p8 h8 ]+ H$ S7 E. y& B
  53.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);                                                                        //反转LED灯/ y/ z" N2 o" \
  54.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);                                                                        //反转LED灯! @! ~5 a# D+ i5 L/ D
  55.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);                                                                        //反转LED灯
    0 l: n) C9 h5 A
  56.         printf("hello world,this is printf function!\r\n");                      //printf打印
    8 \; k4 ]8 a  ^1 @- l: T# Z
  57.     }
    $ l; n; q1 u+ H5 a) r  v7 s/ E
  58.     /* USER CODE END 3 */0 B$ |# V6 g4 V9 [. @
  59. }
复制代码
, u: S# C  z0 C8 ~$ t! m( f
3、设置编程仿真下载模式
4 A  {% Q! P" }" C0 f2 G8 c: l(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
- v" W+ F: q+ Q) b8 @" y: f+ W! _4 z+ X& q  o& ?& k
edefb6b9a2a14be3b1221ad6d5c7a8a2.png $ V' c. p! k' v$ D2 \; j$ ]
! Y8 k: U( w! L1 e0 ]/ Y# c; T
(2)点击编译,完成后提示“0 error(s),0 warning(s)”。$ \: a6 n9 |# u. H3 F8 U! L

* j" \+ p0 v) _/ O5 E
e0b7e3e353b345a7987fe5f821de2dda.png 0 _. d, ~  O* E% K# X$ C( ?
​​; M3 O. k  M: o; b
(3)点击Download(或者快捷键F8),即可下载程序。9 {1 ]3 y# I( K$ `, H, i

$ m% _$ d/ v2 F8 z9 ]% c
eb3f250f19e44862a7df80c2492fcd01.png
; Y' X& ]  p" S( U​​
' N+ d1 e) b1 [! a4 B: b; Z1 S" C/ t& t4 g
(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。' I% D, Y, W/ Y0 b' N
* r8 u2 y$ ^6 s7 R
9f8aa1a4e8f04041bcf5cb183facd100.png
: J: w, E5 L9 I( W/ p6 U% C" j9 ~ ​​2 g5 p! ^: D) B( Z' `/ b) [
4、串口printf打印实验效果展示/ y) H8 j& U" W2 S7 G0 p! [
        程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后每隔500ms闪烁一次,并且打开串口助手后(串口参数:波特率115200、N、8、1),可以看到printf每隔500ms打印一次log数据。
$ H. l% \4 b# o8 L0 N! _) K5 R$ [  m
06445a6b81d24af4a118aadebfd333de.png # T8 d* S2 J' S6 w2 @3 T

: F5 Q7 J/ J* z! E9 m8 F6 k————————————————" R0 D, ~) q4 y& ]. E
版权声明:智能小屋ZYXC
& X1 Q  j: D! Q- D5 r3 g. m2 m2 o! I! v. z2 t5 h; P
收藏 评论0 发布时间:2023-1-14 18:53

举报

0个回答

所属标签

相似分享

官网相关资源

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