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

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

[复制链接]
STMCU小助手 发布时间:2023-1-13 21:00
一、开发板平台简介:
* A* n" W1 C1 A+ I8 B7 T1、开发板资源简介

  y, g" F, e# I+ @# U! @3 [9 F(1)开发板主芯片型号:STM32L431RCT6; e" k: y9 y! L
(2)开发板主芯片封装:LQFP-64_10x10x05P
9 o8 f& N- I8 u0 b- h(3)开发板主芯片内核:ARM® Cortex®-M4
% F/ S# t; r. T- d  ^, a) P(4)开发板主芯片主频:80MHz9 _' L' T9 z; C* l& J6 A
(5)开发板主芯片Flash大小:256KB
$ U1 H& d' i6 [3 h3 B% _(6)开发板主芯片RAM大小:64KB" J! ]  ?  ~, c/ n2 T5 s
) J, t/ ~0 R  r: H2 T% o& [
bb91345227434ee7a43a34bf3fe366e6.png
! k) X$ H  p8 O; k3 j/ F6 m0 Z) g! ~# I6 G: n& i
929c0cce04aa4115a8623703982bf3e1.png
2 @, z+ Q+ A$ y5 @6 ^- N; s; a0 ^* g* Z. [! A
2、LED灯资源2 `- \( ]& |; u9 w+ J. u
(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:, C  B/ G5 E2 \; b7 ]) M  \! N

# t. K3 f; ~+ Y* ~6 _* C0 p
0f177691c5814f16a508bcfa747f87ac.png
! O& G8 u& q/ v9 T2 ]4 c8 ]( J3 D( T' u
(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:
6 f$ \2 T: O+ s0 A) c* ^" P5 x; U4 Y, |2 Q( ^2 D
e923ad767b8448b7ac37c4ed693724bd.png ' a% K/ N: ^& W; i% d

8 c. _' O; D0 I2 ^​3、串口printf打印工作原理
! R( @2 ]! X# q* \; f3 V* d 串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。
2 v. ?( V& s# }/ {# V. i4 j- X* P& N3 _1 c* W
     (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也可使用该串口作为debug串口。
5 s* P( M" c% b: [: q# D! q( r. Y+ U2 X/ @/ p- I; F" z
     (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。
- ^+ r( X4 _  \! [: W' o
8 T( s9 r8 r$ y2 `TTL转CH340串口,硬件原理图如下所示:
6 \" H' N+ H0 E6 \! v% d, z& `+ \% [- ~
4df1b489cb944c26b55013001061675d.png
9 D( [1 p& |) e$ X5 [  {/ I+ j, i; n" V$ m) z
. b+ e; }7 m2 T' g. X; B
  二、串口Transmit打印实验过程
% I% w! l: _  [$ k6 _9 M  \1、新建STM32CubeMX基础工程

7 W3 E# _& G8 j4 b(1)打开STM32CubeMX,点击“File”-->"New Project"
: ^9 t8 z. j# i& b4 Y
6 i4 U9 }2 ~; t& x* X% u& [
2399170347904e959c855fefd5877f84.png   d! o7 p3 g) o* B

; m3 c* R+ S0 `( B! M4 `4 N(2)等待打开主芯片选项界面(大约1分钟时间)。' B3 ~) }. {0 t& r) t! X
3 x0 ]! Q9 D: l
d74d2fdc60c9440483e2b7cf8d928e7f.png 4 k% U$ k; n$ `' Q6 X* L- k
+ H5 l( Z% F: e
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。: k- m. E+ [" T

: `7 g, y( G! Q$ ~) G! G; n
7b80345238d74bea82ce70e1a348f7b4.png + j8 ~0 w) k8 Q' U5 w) O+ N) O
3 [5 t! Y. E# l% `) W* Z
(4)选择时钟源。9 o1 _- X( U0 R- G& ^& ~  b: D
       因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。
1 I5 v( C3 M1 Y0 Z! u, {! t7 [3 L  y/ n/ b
3f65707eca104663a3dede6d25dfa961.png $ U6 Q: F: }/ i* N* m0 N1 W
4 c- J+ O; D7 Q2 d
        因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
0 C6 h3 }3 m8 }) {7 [* n( G( q+ Q' R- [( L- B3 P8 c, T& ~2 W
72119b971f62410fa8344f7f9fb9f389.png
! t1 I3 o0 H* |% ~; ~* L0 ?, Q+ f! |" j2 s9 Y* d' q
2、配置GPIO控制LED
% Q5 `' Y- K+ H3 i! ~(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:
9 L* E, W, N, {0 FLED1——PC0$ I  j' [& Q$ j& k* b1 [8 m
LED2——PC1
! L% c  x$ t2 }7 n/ S/ o8 t5 yLED3——PC21 @3 L; h8 L0 X. C( ^7 ^% p( P
LED4——PC3
4 q" h: _0 W1 \1 t7 q/ m+ x* c* m% ]$ l
(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。8 s7 C: o6 r  V& Q5 j6 W' k

5 g  n5 s2 z& Z! W/ y* M鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
/ r8 B, E1 n( u  a鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。$ u# u5 U- H! W/ {# y
鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。2 D' H$ @  Y! {' _
鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。4 u4 k- P1 U/ Y0 {! G/ p
8 d6 U7 r7 ?* c+ f
492907c1e71149819adbaee4516a2af4.png ) S. F( G& [: s# ]9 [6 _5 l
3 Q9 ~" M3 c/ |# B+ @
c75d3f10ba2e427d9c1a10fad9bf5471.png
3 Y2 F% Q- W( R- n5 P7 x( y& w+ [. P3 i3 o7 t( }+ r* v
(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。
( ?3 R$ a3 u' w( T2 G- ~7 c1 M
. d+ q; u1 N. J1 ]- ?+ P# `$ n
38ff4b80e1c5495ba3076a5158fd91fa.png * ]; l1 r: p+ l% Z

& x$ B9 V% x4 Q( d2 T- u​​3、配置PA9、PA10为串口
' ?% X. C* L$ A5 F/ H+ @5 J查原理图得知,串口1使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:3 h1 ?4 t# G; N
8 x3 w% ^7 O% D! y0 E" D
497b8ee0243e446784e64a3c31e8a26f.png
& B# U. C7 }! O3 a
/ b. |4 {1 v& g8 E9 l (1)序号1用来设置串口收发引脚的选择。1 J, K' y$ z: o' t% Q
(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
& L. ^. K, g" ~# U  }* d
9 m' x. t1 @8 b 3、配置项目工程参数
# b: J$ x& H6 M+ b' j; o$ |- S(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。% Y9 o+ l+ c- y2 @

) ~0 ]- a; F1 x- K/ t
f3ecedd9323f4463b69539906b3c1199.png
- P6 G- r! @, T/ Z2 q3 s  v9 P: Y' M, G; m- W
(2)完成配置工程。
1 O: z+ n  Q! R备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
! _/ ]+ A; J6 M2 Q4 P  C# |% Q) l2 m  ~( U  i8 K
efdb616174f54925b6eac31109f227b5.png 5 H4 N* ?. |( O6 `- H
​​% ]4 M3 M7 |0 C+ }# k& C' ]
41c3f2716e4e4eda8f62fa3a1d871322.png
2 R. `0 h% ^3 l1 x( @  {+ \
; ]4 }; d6 M0 n2 S! }
(3)生成代码。
0 a! m$ o( `( X备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。
9 N. J3 E: R# E1 y/ i% x9 j7 L4 x6 S/ A' ]& o: Q- C
8eaa7d0babea40ee93f158481a6ee471.png 7 V9 h/ Q' W  K( ?& o, T% o
​​$ U3 H9 d  N1 M( B0 ~) T9 ?
(4)工程代码生成成功。# B/ i* q3 I+ u5 D3 C

, i7 \6 h! Q$ Y+ Y, i
e8f46d59a1fb4af589feb613fdff17b4.png + P& j) _" l7 c6 i2 |+ Y

  [% J% J; u8 F4 E 三、在KEIL 5中编写代码9 v! ~. \! {% N0 n1 N
1、使用KEIL 5(MDK)打开项目工程文件' w" u; K0 Q, Z3 _8 Q& o6 R
源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。/ y9 x7 g6 a6 q$ @
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。
: i; ~' h, h+ \+ K2 A" ^! C+ P4 S! w$ ^' b
20929232f4e647c28257c69fb217c0c0.png " }. n; l# i: _9 ^8 }/ @1 ]: d" x
8 N. J" Q0 i& F& w9 o" g8 P
2、添加串口Transmit验证程序; _0 u9 h) [7 E( J# t2 W
(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加控制程序,如下所示:实现每隔500ms后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换,并且串口每隔500ms打印一次。+ d0 S2 Y. P, }  s
# D' P- d3 i/ Q# B7 d5 {! @
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。1 z1 ~  b. k5 M6 h& s0 n& N

- g) R, m. Z" ]9 n1 g! }
dfff847f2bd84e648d7cc7889951d0f6.png * D0 @8 B: `3 j& A, S1 r2 T. Z0 O4 f

2 A2 n9 t- g( L8 B
a583fb91001e471cab343790ed9dde30.png
3 k6 R; P& J. E9 g. }8 X# e8 `' i5 ]2 C/ Y
(2)main 函数代码如下所示:
! I& p0 u3 P. c5 H% q5 T2 _4 f
  1. int main(void)
    : \- R5 ?$ |% z( l( }
  2. {0 J" n1 N" j4 I# S4 n) L( i( j/ H
  3.     /* USER CODE BEGIN 1 */
    6 W  V* [5 k! b0 H. U4 {
  4.     uint8_t transmit_str[50]= {"hello world,this is transmit function!\r\n"};' E" P, z8 z1 Q- G# _
  5.     /* USER CODE END 1 */- e! R2 O/ B7 x: S
  6. 0 C, O+ b! R, f+ w$ ~) D
  7.     /* MCU Configuration--------------------------------------------------------*/
    3 ?! ?" d; Y6 m( C8 h+ C$ x
  8. % A  u% _& g8 P3 u7 c
  9.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */9 ~( a3 I. r, e0 p) i6 G
  10.     HAL_Init();
    : @7 i3 |  k; R1 x+ A$ S% |; v$ f
  11. ( m% {/ ?- `& n8 o; o
  12.     /* USER CODE BEGIN Init */
    ! D5 L5 C1 K0 r0 G0 l( A

  13. ' m- y+ p& H+ }7 ^6 d
  14.     /* USER CODE END Init */3 X- }- x) i8 F& E

  15. ; ^$ V: I5 x- r! ]; A- }" c6 C
  16.     /* Configure the system clock */7 t/ n+ n2 d3 l. ~
  17.     SystemClock_Config();
      X4 U& ~( a$ x0 o$ J

  18. ' e2 _; \+ p, B/ S, e
  19.     /* USER CODE BEGIN SysInit */
    ! e& n/ d  O* ]6 [2 C
  20. 0 m! k: a* {; P) N
  21.     /* USER CODE END SysInit */& |5 Q* y" S' U2 e

  22. 5 j. ~# h! J8 g3 a: [$ G) T
  23.     /* Initialize all configured peripherals */
    4 A* V4 ^3 M! L: p* e& I$ t
  24.     MX_GPIO_Init();0 X4 }* I  W  Z! v6 F2 p5 I' H$ b
  25.     MX_USART1_UART_Init();
    # B8 J* _3 F0 x. V1 R0 ?# O
  26.     /* USER CODE BEGIN 2 */
    " d4 i% f- \$ ]$ K, E# }7 c
  27.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮, M; p* y* @1 {! v- Y. k' L0 |4 T
  28.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    5 j& g% x7 U% j6 z% w# N- N9 i4 @+ d
  29.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    / k0 {$ ?5 @1 {7 Q0 f$ w0 _* u" i
  30.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮1 G% o6 }- w4 R: X. B

  31. 5 r4 q# d" |1 F# ?. |* R% ?' I
  32.     /* USER CODE END 2 */
    4 `. h; Y: M% H! Z% c. c
  33. ) e. o6 A+ n+ K9 a/ C: Y! e
  34.     /* Infinite loop */' K: E$ k" R- z- w. M
  35.     /* USER CODE BEGIN WHILE */* H5 T. G! t: F" D0 Q
  36.     while (1)/ T0 e5 L. I: ]) }/ _
  37.     {+ |9 x" |! B3 [2 S1 D! Q
  38.         /* USER CODE END WHILE */* a6 C4 y6 e0 N, T1 ~9 j9 [
  39. 0 e! s5 p+ g  j5 `
  40.         /* USER CODE BEGIN 3 *// U/ ]4 ?" b- i" m+ d. ]5 @
  41.         HAL_Delay(500);* Y( }& u6 Z7 W3 l" H4 k  u& g
  42.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                                                                        //反转LED点亮熄灭切换
    5 V) L- i" z5 c  w/ d; T
  43.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);                                                                        //反转LED点亮熄灭切换
    / q$ C: _2 [- u$ e! u3 a) U
  44.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);                                                                        //反转LED点亮熄灭切换& R9 l9 Y) _- r3 ?9 C
  45.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);                                                                        //反转LED点亮熄灭切换
    1 A6 |, p: t4 F1 |. ?
  46.         HAL_UART_Transmit(&huart1,transmit_str,sizeof(transmit_str),10);        //每隔500ms打印一次
    9 y- f3 f: Y% \8 o: a9 M
  47.     }7 f0 p0 |0 l; w: d; k- x
  48.     /* USER CODE END 3 */$ o" o& E2 E* H" \
  49. }
复制代码
7 M8 M9 X( b/ }7 w' Q& D% h
3、设置编程仿真下载模式: H- E+ V) ~% H2 [  l* K: O
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。% h7 d6 h: F# N2 o

, C3 R9 T% j; B0 u
edefb6b9a2a14be3b1221ad6d5c7a8a2.png ' v  |" S4 s, V3 U
​​
9 L4 ~5 J/ d2 G0 R(2)点击编译,完成后提示“0 error(s),0 warning(s)”。
( {+ c# \& s  o9 Y5 R8 ?1 N1 n2 L' A/ X
e0b7e3e353b345a7987fe5f821de2dda.png
4 Q$ M/ L) r' C3 y* h( |; f" T8 L9 n6 S+ O" L( H

- @8 Y( J) s9 X9 r8 u(3)点击Download(或者快捷键F8),即可下载程序。! ]' P$ q# I8 ]

3 `& F2 P; F, c; r- }+ _% ]
eb3f250f19e44862a7df80c2492fcd01.png 4 G6 x6 \' T8 M1 ^1 M3 d" \; r
​​7 {( u- v; M8 y6 k* i2 q
(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
1 C8 x! r& @* }7 @5 A! O# T5 T4 ?
; ?4 K+ a; u2 t
9f8aa1a4e8f04041bcf5cb183facd100.png
7 e, h, B% G! {9 d  |, \' @0 h ​​
8 {( Y0 G9 d: b  w4、串口Transmit打印实验效果展示
  o; [' }' N1 ]        程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后每隔500ms闪烁一次,并且打开串口助手后(串口参数:波特率115200、N、8、1),可以看到Transmit每隔500ms打印一次log数据。
5 p! W, ^2 Y7 n% d. P, r7 X
" D, ^* R% u& @- l4 v
39a873987262466bb13106b26e781cfc.png
& r) x0 `: {- _3 O5 ?
% B' B; w( [2 U% ~————————————————
& Y0 m/ Y" w/ |0 J3 v版权声明:智能小屋ZYXC
8 y4 q, V" J+ s1 F* w4 C- w. p3 o
2 k2 A' j8 U4 v& M$ l# s
$ U6 p- \8 v7 B$ `9 I, U
赞 收藏 评论0 发布时间:2023-1-13 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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