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

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

[复制链接]
STMCU小助手 发布时间:2023-1-13 21:00
一、开发板平台简介:* [0 e+ A/ G0 D/ u6 W1 r5 Z
1、开发板资源简介
8 s2 l0 i3 ^. h
(1)开发板主芯片型号:STM32L431RCT6
- m; e2 l2 Q* Q) B4 P(2)开发板主芯片封装:LQFP-64_10x10x05P
; U+ f1 F- o% t(3)开发板主芯片内核:ARM® Cortex®-M4
' E- v" _( A* |; V' G1 V(4)开发板主芯片主频:80MHz
! Y0 i$ S* s$ V, J. e& O(5)开发板主芯片Flash大小:256KB. A1 Q3 a$ E# G
(6)开发板主芯片RAM大小:64KB' G0 i6 c) l7 Y0 g; \  d, c% e

- _7 J3 K3 A; K0 }3 O
bb91345227434ee7a43a34bf3fe366e6.png 6 A; @, E! C- l" R: [

! T* Q8 H" _6 l: R5 U2 g
929c0cce04aa4115a8623703982bf3e1.png
; Z' ?' e2 d3 z& h: X0 E! i
* i+ q4 q+ A) H; T0 @4 R! M0 a2、LED灯资源
' @4 C- h0 a( q% M* ^4 I* U, p(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:* y$ h$ P3 R$ m. E4 {1 H

# i# h3 t* V# p5 `
0f177691c5814f16a508bcfa747f87ac.png 3 y7 ^1 Y# d0 Q6 S$ q

9 p, L; a6 t" G1 P" v(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:$ m: K6 i2 N. Z4 w! T1 n

# t! a/ {3 N: ?4 P$ N
e923ad767b8448b7ac37c4ed693724bd.png 7 X" z/ v% A6 W
3 x& b3 [/ W. ^. `0 o; A8 w
​3、串口printf打印工作原理
) y' T  j5 {, Z$ {: T5 o 串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。
- d; @) z7 t2 D' a6 c; Z1 I
' i$ s7 X& b+ d$ P6 ?     (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也可使用该串口作为debug串口。
# V4 X# Q, Z( |+ g( t
* I7 j3 K/ u& D4 e* _8 {$ T     (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。! _* l9 U: n* v) H, F

0 x1 e6 e! `) L  QTTL转CH340串口,硬件原理图如下所示:+ A. O/ T. A* R3 H& g

& D: j% o! B$ Z+ ^- E
4df1b489cb944c26b55013001061675d.png
  n/ |* f7 N6 W/ D+ {6 B
% h6 J7 [5 t, O) a

' r' b- k1 {) ~8 o8 U* o( }5 L6 B5 \  二、串口Transmit打印实验过程- g! S: g9 U0 ~$ D/ o$ @" m
1、新建STM32CubeMX基础工程
, l1 m/ B3 o/ S. X% a2 a( t
(1)打开STM32CubeMX,点击“File”-->"New Project"" N% i9 j) u+ ]
+ |; t/ f/ l: k$ L* C( X
2399170347904e959c855fefd5877f84.png : v' e, f; T- P- u' W

9 K, N* x5 Z& w5 y(2)等待打开主芯片选项界面(大约1分钟时间)。
, d" d1 a/ N- S0 S; ^2 J( k( }; s! L5 D
d74d2fdc60c9440483e2b7cf8d928e7f.png 5 S% R3 B2 P* z0 c& S5 v2 R1 s  t" R

* v0 e& R1 S( k(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。; g3 k& k) c" S8 T$ u# ?, }

4 H$ c" v1 {. R( k# s1 R9 q' Q: q
7b80345238d74bea82ce70e1a348f7b4.png
! f- N1 Q* d. E( J: x4 y, x( G" U0 v4 \7 U7 ^( s8 H
(4)选择时钟源。. d% x8 V* T6 }
       因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。& Z; Q* X" W+ Q- X! a' F

' ?( l( C) i- ?& \8 B$ _
3f65707eca104663a3dede6d25dfa961.png
0 ]; w+ H" ~/ T8 n5 W, c2 E9 @/ r: U9 p: T( C0 r( |. L% Y
        因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
$ {' M' Y( c; x* o9 a8 ?' M. ]( K6 Y
72119b971f62410fa8344f7f9fb9f389.png
6 z6 R( g8 K' u& ?' E. Z7 L: q* {( H. ~% ^4 T! [4 q6 q
2、配置GPIO控制LED
+ }! X1 r+ P+ E0 I" y* n1 b; w, N(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:
- d" P$ A, i- D  b+ o- ^LED1——PC0) g9 F: Y+ A& y  H. Q5 `
LED2——PC1/ a' ^5 k2 x' D7 G
LED3——PC2
$ Z- S1 k$ l2 N$ `" D9 ^+ A$ OLED4——PC38 Q8 e! g1 I! a6 v6 H/ g! b! v

& n% ]" O/ e& v6 q5 B, G; ~, t(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。- k  y/ J! }( d& E% a% o- ~
) _( S! W* j9 L! C
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
" U" Z: b. ~% g- V! K% ?鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。
* n9 y4 `% K7 L8 b. E, E7 F( A鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。9 O/ \+ C  E" B* o6 }
鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。
  d7 }: R9 J% p1 o$ v, [' _
8 e7 y2 h: h! B
492907c1e71149819adbaee4516a2af4.png
! N0 {; i( C. q, U/ l# V
, V% ]- b& G9 K
c75d3f10ba2e427d9c1a10fad9bf5471.png
6 S" A" ?& Y6 e7 w) v# C' Q9 x! O  g+ u
(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。4 V, ]6 B" `3 G- Z

! K8 ], p$ h' w+ R3 M) o3 ^: v! v
38ff4b80e1c5495ba3076a5158fd91fa.png
" \/ q1 F$ S; `; n" R/ y4 Z8 j. F: c# v% C  W- Z1 Z
​​3、配置PA9、PA10为串口8 H, a. f7 b  a. d( A% c5 v
查原理图得知,串口1使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:
' p1 H' K5 p0 y4 k  e" r0 o+ n2 S' n2 J) T# L" ]3 c6 ^( |
497b8ee0243e446784e64a3c31e8a26f.png 5 k0 C/ G- E" t5 `+ }$ v) w& }

" _& s% d" [& N" P! P% a (1)序号1用来设置串口收发引脚的选择。
" C7 j: \$ U! v, V) o: I& ?(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。9 @0 z  J5 j. {, j' o
& V1 _) w  n/ }2 q- U. B% q/ [
3、配置项目工程参数
. J# t- h. m* I' I7 A8 n(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。
0 ~) g3 d/ G0 T9 C. M- f9 p# w- A; L; B1 m1 q
f3ecedd9323f4463b69539906b3c1199.png 8 M7 W% N+ ]: @9 d9 K/ N

& p* F5 [& X5 \# G2 b+ F(2)完成配置工程。
: p8 R% t" f, F9 Q+ p备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
) O. |" A; b8 T7 x) j4 Q+ E9 T' L1 |
efdb616174f54925b6eac31109f227b5.png
' c# ^/ j2 ~# B. T" O: }​​8 g4 q- ^! }# K1 W6 {6 @
41c3f2716e4e4eda8f62fa3a1d871322.png # h! a7 q" ?, \- P8 U5 ]! j
& _) D# C1 v+ V1 B
(3)生成代码。' o7 x* F' V# M4 T/ M
备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。
. T5 h# e2 p# G: |& B1 U8 U* V/ m8 R9 U) l2 E) B  K) f
8eaa7d0babea40ee93f158481a6ee471.png
0 O5 T3 g4 T+ S# I. k2 T1 X+ M​​
0 d7 q+ b5 x: O/ Y  }(4)工程代码生成成功。" w3 U. U. z. f$ x$ Z+ |! Z

( H# Z& T3 o8 N* C
e8f46d59a1fb4af589feb613fdff17b4.png
: s" N* w/ \, Y) e  {
& r) G; T$ g. t8 B6 R5 P, e 三、在KEIL 5中编写代码
3 Z* Q$ l- W; `1 i1 F8 g8 m1、使用KEIL 5(MDK)打开项目工程文件
( ]' H5 A" v# k+ n源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。: l* B2 |+ f; }7 b4 F+ M% W% B
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。+ D7 u) D' m' R0 k4 w
4 }. T/ Y1 n) u
20929232f4e647c28257c69fb217c0c0.png . f  W4 S5 M7 \1 D
9 S4 w, ~( w8 e. ~6 w6 D
2、添加串口Transmit验证程序
7 q% m: o: y& W7 k* a5 p(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加控制程序,如下所示:实现每隔500ms后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换,并且串口每隔500ms打印一次。
) ^; r" ^* ?7 e7 }2 Q( P, R& _. p( k7 w9 ]3 ^3 ^
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。  b; Q6 }4 d5 p, W5 \# f

1 f6 R1 H% V: [& R' D
dfff847f2bd84e648d7cc7889951d0f6.png ( z1 y5 }8 a7 [; ~

: M! f$ C5 T5 `+ i9 K
a583fb91001e471cab343790ed9dde30.png
1 l  U& Q7 i5 m" g8 V6 A0 B+ {. c
6 d0 ?7 G9 i5 I! v& L3 h+ a(2)main 函数代码如下所示:  q  D; Z, E, e! `, {1 e, l
  1. int main(void)0 d( C1 w0 Y8 u/ B9 E- m9 B7 b
  2. {
    : F7 q1 j. B8 k$ o1 T
  3.     /* USER CODE BEGIN 1 */
    : F; c$ u+ [3 z' D0 o& v
  4.     uint8_t transmit_str[50]= {"hello world,this is transmit function!\r\n"};, w  i& K4 M3 u8 u
  5.     /* USER CODE END 1 */
    / d: E* A' ^3 n6 [
  6. 1 I8 y4 j. L6 c+ q2 C
  7.     /* MCU Configuration--------------------------------------------------------*/
    ( m# Q3 ?, ^; d1 Z
  8. ( O* a6 [+ P2 g; B
  9.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    8 B+ O. G# ^2 U! \
  10.     HAL_Init();/ S1 o2 e  m" d8 X$ V. d3 W5 y

  11.   z) o, ~1 a, _
  12.     /* USER CODE BEGIN Init */) W3 g4 a4 G* K& b9 R
  13. ) s6 k$ z7 z: v6 n
  14.     /* USER CODE END Init */
    5 L1 ]: T. O$ i1 k, A

  15. , C6 L( v* G. ^
  16.     /* Configure the system clock */) \: A  d1 v' R+ S0 {- G
  17.     SystemClock_Config();
    * K) f- O, c' L8 _1 I0 \9 {/ t

  18. 8 w1 c7 Y& S. a
  19.     /* USER CODE BEGIN SysInit */
    ' _( [8 o$ G! y& c

  20. + B+ t$ }$ q: E& h4 X+ ]
  21.     /* USER CODE END SysInit */6 ?* n' Y0 d' }4 Q, p
  22. 5 D& N, ~! E" P7 I- l5 i" C
  23.     /* Initialize all configured peripherals */( X+ J: I& `, z
  24.     MX_GPIO_Init();
    4 V- N( B# c2 O
  25.     MX_USART1_UART_Init();% q1 `* P' p6 f
  26.     /* USER CODE BEGIN 2 */
    1 q( T, o4 q0 X$ u
  27.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮7 S) U9 ^& d& G" F
  28.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮2 N! k& w9 ~$ w0 I& S
  29.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮3 R' R$ A' t1 s3 `8 I+ F
  30.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    ' D: N3 Y4 [7 ^' P

  31. 1 r6 c9 [) D( c- a, b- T
  32.     /* USER CODE END 2 */
    ; M9 A+ B/ J' g

  33. 9 ]# x$ p7 }% p5 d
  34.     /* Infinite loop */
    8 E& o" ]2 I. |7 E
  35.     /* USER CODE BEGIN WHILE *// f) o1 b: }! G! `6 n' E
  36.     while (1)
    ' q3 z, P; j( P2 Y  L; s
  37.     {
    ! V4 X1 M8 v. b0 i
  38.         /* USER CODE END WHILE *// f2 W6 c6 E* V6 D+ F

  39. 8 `0 ~% m, p$ J, o
  40.         /* USER CODE BEGIN 3 */
    # e& m% Z, F- s
  41.         HAL_Delay(500);" |1 p) P* d! K( C# |  \
  42.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                                                                        //反转LED点亮熄灭切换
    4 o( X! a  U" G; l& s+ J$ z6 S
  43.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);                                                                        //反转LED点亮熄灭切换
    ) z, F1 w/ _1 G$ U' Y
  44.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);                                                                        //反转LED点亮熄灭切换3 M2 P) r$ G$ n  M. h3 g6 q% M- e
  45.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);                                                                        //反转LED点亮熄灭切换2 M; H9 o" ~9 [# r& k0 Y% s4 T
  46.         HAL_UART_Transmit(&huart1,transmit_str,sizeof(transmit_str),10);        //每隔500ms打印一次+ p7 a% x! Y( X1 }- s6 I8 i
  47.     }
    : T" `9 i% o9 Q& d' ^
  48.     /* USER CODE END 3 *// h1 b; R: f. f
  49. }
复制代码

  h8 A' R- j+ P: s/ a3、设置编程仿真下载模式6 J7 V, [+ w: M1 {' W
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。% C' P) V3 Q  [+ u' i# Z
1 z; }; f4 c+ V6 b! u  `
edefb6b9a2a14be3b1221ad6d5c7a8a2.png - E, j( D8 _# u; y2 n
​​3 h2 K1 g. L* U1 T; {$ h  w! c/ i
(2)点击编译,完成后提示“0 error(s),0 warning(s)”。# n% R/ ~2 R/ y/ b9 Y' S2 n

' @+ U  I: g8 L8 e; v
e0b7e3e353b345a7987fe5f821de2dda.png
% {) q; U% x) `2 Z  ^* G+ ^0 R! F  C
/ \* _: F) |! M* I$ V7 ^0 h
(3)点击Download(或者快捷键F8),即可下载程序。6 V  y1 ~* q2 f& s
$ G% d  K* m8 |4 ]% ~( G9 z; [4 P
eb3f250f19e44862a7df80c2492fcd01.png / t4 T- j6 |6 y3 r/ p& O/ b6 |, R
​​  @9 C1 f. I# S( w/ c" p8 M6 D
(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。4 [( n% n, B+ I, m/ y' i( O

: p* A1 K: R* F( |7 @- C8 T" Z3 U) t
9f8aa1a4e8f04041bcf5cb183facd100.png
; R5 |- ?0 v2 i9 c; k8 q+ E2 d ​​5 B5 b* ]( O$ n: H! ~) W7 l
4、串口Transmit打印实验效果展示
& {* b% F$ a  p! e( a. w% ]' n        程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后每隔500ms闪烁一次,并且打开串口助手后(串口参数:波特率115200、N、8、1),可以看到Transmit每隔500ms打印一次log数据。& J8 j: b* D/ B) i

  |# n  P% x* l
39a873987262466bb13106b26e781cfc.png 4 ?* g  @7 H% G1 f# _6 X

& ^. r" ~* x# ?) H————————————————
: i3 N8 L; C8 \) m5 f8 e/ T0 m) X" c版权声明:智能小屋ZYXC- D- e+ G* E* J2 ?9 E

. I! l% u9 B' _
( \+ R& M' S; A1 m; X2 b
收藏 评论0 发布时间:2023-1-13 21:00

举报

0个回答

所属标签

相似分享

官网相关资源

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