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

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

[复制链接]
STMCU小助手 发布时间:2023-1-14 18:53
一、开发板平台简介:. J; W7 |) a' J8 M; x2 N% M
1、开发板资源简介

2 ?& o; y7 J$ [9 i; ?(1)开发板主芯片型号:STM32L431RCT6
$ O1 I, u+ W8 C(2)开发板主芯片封装:LQFP-64_10x10x05P
& t( Q3 ]7 @- S- o# l: E(3)开发板主芯片内核:ARM® Cortex®-M48 r" t- p* S# E5 U2 F4 }) m3 Q3 s
(4)开发板主芯片主频:80MHz
. P2 F' C+ ?# X( h(5)开发板主芯片Flash大小:256KB3 b- n7 p% Z% K. @: m3 o) D
(6)开发板主芯片RAM大小:64KB
; l4 \6 \3 |: x# n  p' B
; q9 f8 e; u, X) n& U

4 s- d6 s% Z2 p5 n8 ^: D bb91345227434ee7a43a34bf3fe366e6.png 4 m# w; M# g1 {; w; [7 {' D

& j  V+ ~, x3 i( P! k* Y% N 929c0cce04aa4115a8623703982bf3e1.png
3 D4 V8 _' e) Z
$ r4 [% D. O1 m9 F$ H5 J
2、LED灯资源
' U( T# i* ~! r! \+ E(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:
4 L; U* C9 f/ c6 h/ `8 U; `# E' w
6 P8 l0 c" f4 z- j# f
0f177691c5814f16a508bcfa747f87ac.png
) ~* o8 N2 A. _5 C! Y8 H. F' f! f

+ q$ Y/ R/ @$ ?(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:
: Y: G3 z3 u5 k6 z) w8 }3 G& f6 {$ p4 J' \- f) X
e923ad767b8448b7ac37c4ed693724bd.png : i5 [& q0 i" L

- d* m5 v/ |& B# E3 _. r​3、串口printf打印工作原理
4 L$ Y# V: [& V& [1 H6 y 串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。3 p1 L3 x) K' d7 `
     (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也可使用该串口作为debug串口。" k/ j; A2 |( c/ y

/ F2 |. H$ h* O  _/ W3 A     (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。' c3 F# d( G; A. B3 U" f; V

* V  _% s; ~( ^8 B, ?0 Y! S' [& Q) ]TTL转CH340串口,硬件原理图如下所示:
/ s" I5 p( w) P- o8 h9 s3 z- r/ H
; g9 N7 U/ i- ~6 S% I
4df1b489cb944c26b55013001061675d.png * t# l0 O& c- |1 z# A- }
# n; M2 i' A- x) ?6 |- F7 p; Q# E
9 m, F! T5 S. C5 g# t. y# q. Y6 ^
  二、串口Transmit打印实验过程' W7 ]$ T: h4 f
1、新建STM32CubeMX基础工程

% v, z1 k- I; l9 L$ {: r(1)打开STM32CubeMX,点击“File”-->"New Project"4 j; _% a8 a3 c2 U
: P+ x- k' e0 t$ p. m/ s  Z% j
2399170347904e959c855fefd5877f84.png + |0 N( Z+ S' b! B) |( u
, y. k3 B0 R( [7 C4 s! a. T( O* a9 k
(2)等待打开主芯片选项界面(大约1分钟时间)。7 }$ G! w) n- v; f
& M/ l" k) {( e# t3 J2 _2 R
d74d2fdc60c9440483e2b7cf8d928e7f.png   J( X! a: o2 f
. ]6 |: K/ |, i: g) ?
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。# L* g! S8 L+ X1 C) p

/ A8 C# R: T. F8 j2 W6 A9 h  F" A
7b80345238d74bea82ce70e1a348f7b4.png * J  ]/ p2 v* t8 C
1 ?9 C) R0 t; ?; u
(4)选择时钟源。
$ _$ y" O; N2 O+ u/ x4 a- i' O% e& L* u% C
        因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。
+ }) a# U5 D6 o" R! C6 }+ ^8 J7 @) T7 p2 I& V
3f65707eca104663a3dede6d25dfa961.png
0 j6 u) E2 D, `2 g
" ]5 Q) _4 |% @* U- C& j
        因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
. d3 q& s0 H, ?1 U( @7 s
' c# `' D3 j: w& g
72119b971f62410fa8344f7f9fb9f389.png
1 `* b+ |. _/ e+ S' n: g, M/ S( r5 ]
2、配置GPIO控制LED
1 w$ w  D0 g+ Q0 z- T% G(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:
; o. W8 N- X" S4 e& l6 w# e* v9 i5 y+ `9 h% Z& N' k5 ]4 Y5 Z
LED1——PC06 i( n- U5 C8 O$ \2 A, Y
LED2——PC1
" x0 o5 k$ ?0 sLED3——PC26 ~+ d9 s: }. D  `6 A* H
LED4——PC3% ?* u' |0 C+ \$ S: I

; V2 N$ p9 X, r6 H, s" L9 H. Q(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。
" I* K7 U, E+ J. S5 n
& S1 T( }: L1 C8 h鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。% o' U- z4 T) V% l0 b: F; v; H9 ~
鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。
$ f: Q# \7 }* y' s! a鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。
6 V& U* y3 Z, {0 D" O1 Z$ Q( d鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。2 H8 ?. d1 @# c$ O& Z' y5 I* Z5 j
5 g+ H5 g3 g# ~9 i9 Y1 O
492907c1e71149819adbaee4516a2af4.png
/ O( x2 O! m2 C$ {4 Q" r) a7 p$ i& p; B0 ]- v. W$ I
c75d3f10ba2e427d9c1a10fad9bf5471.png
5 Y7 t. e: o; [
: g" Z' N$ o( l- M- D3 ?' U1 u(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。% |0 E5 K6 x* t, h! N

8 {4 O6 H- ~' o6 t4 G3 T9 n0 o+ E
38ff4b80e1c5495ba3076a5158fd91fa.png ' n& ~. J; M, v5 v

; ]2 ~- Z- p3 p* D- }' S​​3、配置PA9、PA10为串口
4 Q( y( ?8 S1 u! H1 A7 H) W查原理图得知,串口1使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:
$ V( \# u' \3 F- F
2 I$ Z" d$ |# X9 U
497b8ee0243e446784e64a3c31e8a26f.png
  |7 c6 F9 I' R  C  @# l- i4 L- u+ p3 Y, _8 j! w& n& i
(1)序号1用来设置串口收发引脚的选择。9 L9 H3 q4 T6 |
(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
2 k) Z% J& d/ X/ Q9 ~' e/ c4 P( O% ^4 C+ Q( r. q  h0 w
3、配置项目工程参数4 O" @. F+ V, G& }: U% R2 }1 t* i
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。( Y2 U8 m2 r+ t: R2 u" h. W

! P) l8 v# d' I/ Y9 v  ]
f3ecedd9323f4463b69539906b3c1199.png
2 M: I- [8 U5 v1 E; l4 w3 a8 `5 ]6 J6 A- D4 e5 p
(2)完成配置工程。
: X0 s- L3 R$ o7 F# P; [备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
& N( g& c  n! U+ [3 t; E, o' {; L: V9 Q0 z* c, `4 @  C" A
efdb616174f54925b6eac31109f227b5.png ' b0 d: j2 `- q$ i
​​
6 m& I7 o: q- \8 r2 u1 M 41c3f2716e4e4eda8f62fa3a1d871322.png : c$ |$ |! {/ n2 D" k: _! Y( Z

5 R  Y$ q  [1 F+ \2 o' p5 D(3)生成代码。
0 L" q( k8 ?$ I备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。
, f/ f/ S( m! U+ ^5 `% _
% b$ [- w7 ?6 [
8eaa7d0babea40ee93f158481a6ee471.png * w! J$ A" l- d% L
​​
/ ^3 K- r( S& x3 p4 k1 N(4)工程代码生成成功。+ h: e/ @, W5 _9 W
7 F/ j+ w  |8 N5 X! l+ j/ M2 K/ `
e8f46d59a1fb4af589feb613fdff17b4.png 5 }' m7 |" u$ r! c$ o  d6 d

0 C* h/ r2 {9 A$ ` 三、在KEIL 5中编写代码
/ V) b$ M: Z8 [1、使用KEIL 5(MDK)打开项目工程文件8 M3 _! R1 _; L/ \  r
源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。
# X8 }" s0 [' M6 Q( d; l' `) O* n(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。) ?0 D6 ~7 X; ^
6 s+ N' F9 e+ {, l. c3 ~6 D9 \
20929232f4e647c28257c69fb217c0c0.png
$ z) j4 p8 D7 u- T( m5 F

' N8 W. l. ?/ h0 F4 n4 i/ P, `; t0 @4 ]2、添加串口Transmit验证程序
# j( x; }& o+ D( i6 Y# b0 C
(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加控制程序,如下所示:实现每隔500ms后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换,并且串口每隔500ms打印一次。
1 T) S% A' r( C' _" v+ H$ ]/ L( k' A) }# p
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。1 Y' w0 T% W1 h3 J. }

3 B# m. @' T$ r7 M6 B  U/ F
dfff847f2bd84e648d7cc7889951d0f6.png 6 J( r1 O5 p9 M* L  Y1 T* R+ {+ k
; Y; A" b4 {6 d/ F1 ?
a583fb91001e471cab343790ed9dde30.png 7 P9 Q9 s  N, v1 k  q* u

% a+ A$ o. u7 a7 j+ X' D( a0 o) @(2)main 函数代码如下所示:
/ }5 i* G/ w, w. ^
  1. int main(void), I2 j- k. t2 _9 X. ]
  2. {0 Q+ n3 a4 A9 e8 B4 A1 n
  3.     /* USER CODE BEGIN 1 */
    ; G8 }5 a# q' e: j+ t2 k! k
  4.     uint8_t transmit_str[50]= {"hello world,this is transmit function!\r\n"};
    + G5 e- w% e1 G) W' V
  5.     /* USER CODE END 1 */
    ( V: U* P" _0 X, F. c

  6. 0 Q0 D- B) h. k- {! k, W; k
  7.     /* MCU Configuration--------------------------------------------------------*/* p* b# y3 D5 C, M5 U
  8. # U7 g0 _+ G! d# B
  9.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */5 {. t3 i6 H7 l' r
  10.     HAL_Init();
    & B' Z4 o+ L) ~' |: J" U) ~1 y: r
  11. , R$ e' K4 D  M; l
  12.     /* USER CODE BEGIN Init */* U) C0 S: x' J+ z5 H1 j5 f2 p
  13. 2 S. x5 o* t; V) j8 J. e$ G
  14.     /* USER CODE END Init */* V2 h+ s' z6 W' g4 ?3 X

  15. + ^6 u$ C% F9 _4 l) w  K7 Q6 I, h
  16.     /* Configure the system clock */
    : s7 P, g# ~9 S3 Y. {
  17.     SystemClock_Config();
      c% y& e" P2 h, L4 f

  18. : M" S0 p1 A% R0 z* t- a
  19.     /* USER CODE BEGIN SysInit */1 i+ e0 F$ N. E; r% ?) E
  20. % E8 ^* f. m1 O5 r
  21.     /* USER CODE END SysInit */2 Y5 v  M8 e& o/ U
  22. . b: q6 V, f$ [% A# l: r0 {
  23.     /* Initialize all configured peripherals */
    $ L" M- u; E  g9 t& F3 s& P
  24.     MX_GPIO_Init();# Y+ }6 R' @4 ]
  25.     MX_USART1_UART_Init();
    1 t+ d9 ^2 H2 c9 p- j
  26.     /* USER CODE BEGIN 2 */
    2 P" O8 E% z' f) d* b
  27.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮$ P4 f3 q9 x5 K- H; e$ q
  28.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    & |' J- n! C  M
  29.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮6 I- ?+ x, {; P. i/ L+ m
  30.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    1 |( b# J" N! l

  31. ' n! y0 u. e  Y; X/ H- T
  32.     /* USER CODE END 2 */
    7 ?2 U$ ?0 n0 S8 `1 b2 t2 X
  33. : X2 V2 Y! {! t0 x# g2 k
  34.     /* Infinite loop */
    5 b* H6 d0 I, x
  35.     /* USER CODE BEGIN WHILE */6 k! z/ J  B/ g' @
  36.     while (1)# o! A, P2 i; U( |, ?
  37.     {
    % R+ Z. {# ^$ n1 G; H1 E
  38.         /* USER CODE END WHILE */
    ; _3 S/ m, I% v* F4 `+ p0 N5 n

  39. 7 ~' i% z6 s# p4 l- _
  40.         /* USER CODE BEGIN 3 */
    6 h: ?! g/ V& t
  41.         HAL_Delay(500);. i* n6 N, R" j" R# _) h
  42.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                                                                        //反转LED点亮熄灭切换6 ?, D' j; ~9 A! r& _
  43.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);                                                                        //反转LED点亮熄灭切换
    ( v! q- A/ F: Z6 Y
  44.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);                                                                        //反转LED点亮熄灭切换' l; e3 F8 C/ X  r" x
  45.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);                                                                        //反转LED点亮熄灭切换5 E/ v" b3 T& \8 a8 u
  46.         HAL_UART_Transmit(&huart1,transmit_str,sizeof(transmit_str),10);        //每隔500ms打印一次  }* T' b  z' O3 E
  47.     }2 ?* {$ W6 W; p
  48.     /* USER CODE END 3 */
    6 K" s% K$ `) {9 ]. J
  49. }
复制代码

$ i& Y) K7 m) T0 u3、设置编程仿真下载模式
! }; m0 [# d: t- o(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
  v  _; s+ B$ C$ [  o$ L5 s+ t. E$ Z5 B4 Y" A, c( v
edefb6b9a2a14be3b1221ad6d5c7a8a2.png
2 Z9 E; S# e4 |5 a) w
9 {2 j: W' O/ J+ l+ n) u. H7 p(2)点击编译,完成后提示“0 error(s),0 warning(s)”。0 N% z( v6 J  s; r5 P
1 I9 c# T" r: n# D' d
e0b7e3e353b345a7987fe5f821de2dda.png 0 ~6 }; ]% X( v. K  G$ E3 ]
5 d+ ^# y) L1 @, m+ E; e; w# W
(3)点击Download(或者快捷键F8),即可下载程序。: ^: V1 X/ n* A& E9 C0 _( |0 I

/ H7 h- \6 b. ~) g1 O6 e8 `: ?
eb3f250f19e44862a7df80c2492fcd01.png 8 q  w% s, o0 W% U! f1 `
​​1 B! W* J5 o0 `1 x6 q
(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。! G' Y7 \/ y) D' O8 Y% ^
7 q/ p1 Z7 x3 s2 u
9f8aa1a4e8f04041bcf5cb183facd100.png
0 S: c+ s4 a( U+ h0 Y0 e8 \ ​​
0 X# P1 i5 M2 z; X) O' j' e0 {4、串口Transmit打印实验效果展示8 F3 c4 @$ ^* r. R
        程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后每隔500ms闪烁一次,并且打开串口助手后(串口参数:波特率115200、N、8、1),可以看到Transmit每隔500ms打印一次log数据。5 j; O5 y' x7 Y2 @% r0 U0 c
8 E% J+ x7 E/ D6 U( X. j0 _
39a873987262466bb13106b26e781cfc.png / N# `" [0 }$ ?0 h6 G( x# f. u5 E: f

, c/ @( ^/ H3 H& K, j————————————————
0 Q, Z: C( q8 s/ e, W. O版权声明:智能小屋ZYXC
& X9 G: G" }: L- }; R4 @! U' m% \
  N% d. m' ?: _$ d0 f) `/ C- {$ g
( v# N3 n$ H6 w; u' P
赞 收藏 评论0 发布时间:2023-1-14 18:53

举报

0个回答

所属标签

相似技术帖

官网相关资源

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