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

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

[复制链接]
STMCU小助手 发布时间:2023-1-13 21:00
一、开发板平台简介:! Q+ I, q/ k" i: C2 \5 n
1、开发板资源简介
$ t' P& F/ x  S# N
(1)开发板主芯片型号:STM32L431RCT6% i# r; @7 X0 k' p
(2)开发板主芯片封装:LQFP-64_10x10x05P
0 P2 s( }8 f% U  A: j(3)开发板主芯片内核:ARM® Cortex®-M4
$ E, t& ]1 M2 R/ S5 N0 \) s# f8 J1 Z(4)开发板主芯片主频:80MHz0 R; |7 c0 t1 P6 P
(5)开发板主芯片Flash大小:256KB$ t9 m$ h7 X0 ]; g, Q& E
(6)开发板主芯片RAM大小:64KB$ r* M; ?" ~- R7 E9 ?, _
. X+ C9 y: k) h  h7 u, D! q- ?
bb91345227434ee7a43a34bf3fe366e6.png
; L) P1 }1 R9 Q
' A+ `" |& v! v9 ~7 a4 B0 M
929c0cce04aa4115a8623703982bf3e1.png 7 o; r2 O: Y4 n; X2 w

# \2 c7 e7 {! K& _' Q+ y* g2、LED灯资源- S, D# f; D4 \% N! J
(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:& p) z% _* U4 k6 A/ n8 L

) n) O" q) v  @" P
0f177691c5814f16a508bcfa747f87ac.png
5 V' r  W4 b% `; u9 Q7 t3 u6 v" b6 t6 F. \9 j- P4 T0 |& t9 K
(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:4 V. X  e6 `/ @4 b

2 H6 O' O6 v- ~8 R2 T9 r6 h
e923ad767b8448b7ac37c4ed693724bd.png - r0 q& @8 ?+ Z- _( E
  @8 E, C& Q6 M# c
​3、串口printf打印工作原理( l9 F$ D8 O* w4 W  I# i( P
 串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。. w6 F* V2 n9 j- Q  p$ C" z9 o
6 V) B) d2 ~$ o% s, p* l( A
     (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也可使用该串口作为debug串口。% ]9 h) L8 d6 b" y6 R5 E& a
: H! U# k* y6 P
     (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。" P! N; M. u0 ~

, X) p  F6 D1 v4 v3 pTTL转CH340串口,硬件原理图如下所示:
* Y8 P- q6 `+ N& g9 \: T1 B6 |! f& z- Z4 v
4df1b489cb944c26b55013001061675d.png
! w8 z' d6 I( O/ W4 Y$ x4 N
0 _$ |- _' ]3 P

' j1 I, K% \$ a0 r) ?, r, h% \! e, ^  二、串口Transmit打印实验过程  G( `; M. y% |
1、新建STM32CubeMX基础工程

5 d- l6 g2 X# i(1)打开STM32CubeMX,点击“File”-->"New Project"+ G1 U8 Z2 h, p/ y6 a
3 D; F$ E, P" z) F
2399170347904e959c855fefd5877f84.png 4 F. @/ c/ W, l! n5 Y$ D8 `; F

  C3 W3 s5 ?( o) d. w; L; M(2)等待打开主芯片选项界面(大约1分钟时间)。
0 Z, z8 R3 ^+ q) Z9 w- |' \8 Y3 M* C& A) @2 u( G
d74d2fdc60c9440483e2b7cf8d928e7f.png
& F8 Y+ N% |3 a, c6 C# Y
: x5 R) I4 X- Q, T7 i! q(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
$ |  C: W7 j; b* p/ c8 L1 L( h# u$ E4 n' j) c* @( [
7b80345238d74bea82ce70e1a348f7b4.png 5 G2 ]+ G0 I7 ~# z! Y* I

) l5 \/ f: X6 V5 a0 O9 R$ n) V4 `(4)选择时钟源。
% ~0 n; j* O) |, I7 x( @       因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。
" w( J5 l' i9 n3 {- @0 a! z& K% G/ y0 u( r) c( L& r  N& x& i
3f65707eca104663a3dede6d25dfa961.png + l, [0 I  l) x/ g, k

* q9 D) k0 l! q' }9 u5 O        因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。3 d* Z9 q8 h8 |1 P# q/ W. p

* J' G8 g( q- f1 D3 L+ h
72119b971f62410fa8344f7f9fb9f389.png 6 h: l$ i" P1 k( s# |" Z% |: s
9 V. K, W# W' ?" [. {- ?
2、配置GPIO控制LED2 j( O6 n6 Z( \0 I  o
(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:" v" I1 t2 c" Z+ e3 r
LED1——PC0
) V! X1 ?1 g; r7 l  rLED2——PC1- p" O  [1 R& |; |  C& e1 v
LED3——PC2& u: o" `' A9 o8 c
LED4——PC3- J1 R* k3 f( i* N- n

- ?7 ^0 v! d- y3 z2 Y, r3 v7 e+ D(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。( C) [$ Q6 l  L$ j
* P; j) B- {+ i8 l/ R
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。1 o- F' ~) J7 J2 g* S
鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。2 F6 m& G0 w7 h7 M7 M  v+ X1 [* }
鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。
9 O5 `$ l; x4 G' E: O0 c' B鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。
: V; E* \8 c& u& S* g( [
- D" F: B7 j4 [. F3 ?  h% Z( }* u
492907c1e71149819adbaee4516a2af4.png
/ P1 @: n' P  @3 u
  m3 F3 M/ C+ W. C
c75d3f10ba2e427d9c1a10fad9bf5471.png
4 t) v+ Z! R+ O. @( u& [3 [
" J, e0 d! z9 \$ @  I, i4 L9 g(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。
3 f2 J" Z! i- [) W, r8 o
6 R! R/ q6 N* _! F' K" ^' v
38ff4b80e1c5495ba3076a5158fd91fa.png 9 m) h' y* |( w% Q+ ?5 @! v- U7 a8 |

7 h) y% S2 f* i2 O' v/ W2 b& U​​3、配置PA9、PA10为串口
; M2 m5 l7 e/ }4 g- n% v6 Y+ |' A( ]% {查原理图得知,串口1使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:
0 e1 F# Y7 V' J
5 C/ X9 O/ L/ t5 G8 q7 n
497b8ee0243e446784e64a3c31e8a26f.png 1 P1 ~2 E+ I, a0 V6 z& Z; Q
% |# d  V+ f; Q6 O% }
(1)序号1用来设置串口收发引脚的选择。+ x' z* ^) P/ B$ [# b" r
(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。; y8 ~9 R2 Y8 E( Q2 o* F' {7 r
7 b$ H. [- i2 a0 o4 g; [
3、配置项目工程参数. [, r3 q' D. Q# W, |
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。) \# l& M  v( q+ M
- G6 V& [! E( h% O7 G; z. A; |
f3ecedd9323f4463b69539906b3c1199.png
2 E( b: ]+ L7 B9 ~( K( u, k7 l, h% P5 ^3 z2 r: [5 k$ j
(2)完成配置工程。
6 P/ v! G: }2 S8 ]/ q$ \) B备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
0 f, Z; W. P0 G+ ~5 D) ?/ b9 f( v: N3 c" M0 E
efdb616174f54925b6eac31109f227b5.png   [* Z" U% G$ L6 k
​​4 i! s8 _: u2 k) X: i
41c3f2716e4e4eda8f62fa3a1d871322.png
- B1 s9 D7 h5 k. d( W6 F+ Y7 z

) Y/ u) T  y, x0 v' `' n(3)生成代码。
' Z  \& P$ ?- U7 @6 e备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。4 g& K9 k! M1 B& z7 w' S% _( p

* ~# v6 W* q2 R; C, [
8eaa7d0babea40ee93f158481a6ee471.png
2 m. o* O. P" @​​2 m" H& z0 ?" ~% ^" `
(4)工程代码生成成功。
5 ^# X" n5 T) Z; y8 s) o) P& G; Q9 Q! b3 `
e8f46d59a1fb4af589feb613fdff17b4.png
6 Q9 g8 I, h. }/ A- |: F
0 h: d* M& t6 W5 G6 k 三、在KEIL 5中编写代码
* M/ J( ~8 i3 B7 y# G3 a% s" v1、使用KEIL 5(MDK)打开项目工程文件
2 [5 s8 @) G9 J9 D. W9 L源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。
7 G2 N: ^; a9 w% F(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。
% h* Z% a5 J$ q8 E; B6 P; R$ D/ R2 ]2 q6 H' J# @% |4 u
20929232f4e647c28257c69fb217c0c0.png
7 ^* p' k# Y' S$ }- w! C5 C& N! \/ C8 V! \
2、添加串口Transmit验证程序' c$ K" H" A: l" L
(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加控制程序,如下所示:实现每隔500ms后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换,并且串口每隔500ms打印一次。
8 V% n) ]1 P6 z* _2 ~  s. K# e8 q9 \; g' ~; M
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。
" m& _) s. o- g9 m; W; G: `, T9 H
) O, L* g2 ]2 y/ u
dfff847f2bd84e648d7cc7889951d0f6.png 4 Q& M7 `' \- i

- ?) C2 w' G. Z- T( I+ ]* x
a583fb91001e471cab343790ed9dde30.png
+ F' i; @! v4 E$ V+ Z7 h: ^
! T- u: M/ ^7 o! [(2)main 函数代码如下所示:
" T8 t" p6 T' Y. [; n
  1. int main(void), P$ t7 q# f8 T6 S& H$ {
  2. {) h$ D' q* a# [7 N5 O; E# U
  3.     /* USER CODE BEGIN 1 */) j1 r% [/ B. Y; }
  4.     uint8_t transmit_str[50]= {"hello world,this is transmit function!\r\n"};
    % u" ]. ?8 W3 s! V) w
  5.     /* USER CODE END 1 */
    0 z* j" q4 d' M7 X
  6. 4 H( T; \* @2 |3 @' {9 i% P
  7.     /* MCU Configuration--------------------------------------------------------*/& H% \, W' I8 O; b
  8. $ c8 Y1 N( k* M% J
  9.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    7 ?0 t1 I$ R7 [& `. p
  10.     HAL_Init();! i# |; }" t* N% d
  11. $ B, f9 B5 f8 G
  12.     /* USER CODE BEGIN Init */
    ; b, W& O" Y8 L' c$ `9 d
  13. - z. B) N$ G* }6 d4 D9 G
  14.     /* USER CODE END Init */
    " w- K! `0 \# E0 q2 O
  15. # t8 n& h* e' K# m6 H1 p
  16.     /* Configure the system clock */
    + \; n) U/ Z6 ?
  17.     SystemClock_Config();' X, g' {1 H, G/ ]# T

  18. 2 Z( F) F& C  I% R
  19.     /* USER CODE BEGIN SysInit */$ ?/ [% B1 E+ l

  20. 1 V& }& J% a+ M( n; p! w; A1 f
  21.     /* USER CODE END SysInit */- r& f  k! h* B2 b& Q. J1 h

  22. 7 p# \; \1 g3 i5 c
  23.     /* Initialize all configured peripherals */( U" x' H2 e- m& C( @  y& P
  24.     MX_GPIO_Init();
      J! B' E  i1 r5 F
  25.     MX_USART1_UART_Init();
    % U% i4 f4 Z' p4 Y% H
  26.     /* USER CODE BEGIN 2 */
    & M1 v7 e' a1 G' m, J" g  Q- R
  27.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    9 a* [+ ?$ D* w* s4 f( s4 `
  28.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    - O( W% @7 t" z7 }/ @0 D& W, e4 K
  29.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    0 m; `, }0 N& K* R8 L
  30.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    % Q* T% A/ w) E( u. ]; M

  31. 4 i/ v$ x' [* ]
  32.     /* USER CODE END 2 */
    4 T; V" w8 |5 T- B  }2 j7 a
  33. ' ?- P2 g" @8 v4 }0 f4 P
  34.     /* Infinite loop */! t  ?" K$ S: x& B) z
  35.     /* USER CODE BEGIN WHILE */& X" Z8 Y. m4 q7 G5 a8 l% r
  36.     while (1)- P+ m3 b9 n& \  ?  G6 }' n4 ^7 i# P
  37.     {
    7 y( a; a# _2 Z
  38.         /* USER CODE END WHILE */
    : T% e' b$ T9 d( l" H" W2 w  O
  39.   P4 p0 U. L1 M$ {# Z8 x
  40.         /* USER CODE BEGIN 3 */* e$ ~2 ?' O6 [
  41.         HAL_Delay(500);  C. c; p0 C7 j1 z: R
  42.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                                                                        //反转LED点亮熄灭切换
    , \; e8 d% X. U. p9 v3 M* f6 ^% o
  43.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);                                                                        //反转LED点亮熄灭切换5 ~7 V4 Q0 D0 d7 }- J/ g1 |
  44.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);                                                                        //反转LED点亮熄灭切换
    $ G; y6 \2 U( y$ ?
  45.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);                                                                        //反转LED点亮熄灭切换
    ! ~) v2 {1 A4 z/ Z7 d% [8 \
  46.         HAL_UART_Transmit(&huart1,transmit_str,sizeof(transmit_str),10);        //每隔500ms打印一次0 ?0 [( k, [0 D# O4 }5 v0 t
  47.     }
    . B  v7 K4 ^9 s# M1 F/ w" }
  48.     /* USER CODE END 3 */- m1 r: B0 {0 F2 m  P
  49. }
复制代码
; ^* c! x' b; K5 m$ u; u6 {6 l
3、设置编程仿真下载模式
* W; ?9 ]% i7 F(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
6 H8 B+ e$ [" _4 |: X  C; \5 S
1 a. ]& B- Y0 j# H% {
edefb6b9a2a14be3b1221ad6d5c7a8a2.png
& Y! y1 \$ l( [) y  l​​2 B+ c) u/ v( O/ V+ J3 h
(2)点击编译,完成后提示“0 error(s),0 warning(s)”。0 }) G4 p0 f/ [! s) q( g

& @% R2 B; ]; i& L; i
e0b7e3e353b345a7987fe5f821de2dda.png
) i3 B0 R. X$ [
( q+ g7 a4 E: g
' _" x: K9 A+ P. U
(3)点击Download(或者快捷键F8),即可下载程序。% z" F% L1 U/ g0 x& h
- y1 d3 L3 O1 o
eb3f250f19e44862a7df80c2492fcd01.png
% \6 L$ g* `9 L8 Q  j) w: o+ E​​
! `3 N3 \' j2 w& H0 G! b(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
6 H! h$ X) ?6 O( Q5 u+ q$ ]3 I
5 b" F8 F# D8 U: v# [* X
9f8aa1a4e8f04041bcf5cb183facd100.png
) c# l! f6 {$ i, W4 T& y' c" m( Y ​​- y; V6 y+ ]" j! ~
4、串口Transmit打印实验效果展示) L3 O7 V( U1 \2 Z
        程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后每隔500ms闪烁一次,并且打开串口助手后(串口参数:波特率115200、N、8、1),可以看到Transmit每隔500ms打印一次log数据。  j" b/ q7 P4 [% A9 `. _

" \8 k% X7 b. O5 a
39a873987262466bb13106b26e781cfc.png " ~% o2 O) W% V7 [3 ]; o
- O! J. ?. O; a5 @$ ?
————————————————
: \1 D) H4 h! B( Z. ]版权声明:智能小屋ZYXC
% P4 }+ G7 Y- s  }% G0 w: [0 r$ _/ s) n9 w- g1 A

( Z5 S( S# c6 T- |$ N3 R6 D
收藏 评论0 发布时间:2023-1-13 21:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版