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

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

[复制链接]
STMCU小助手 发布时间:2023-1-14 18:53
一、开发板平台简介:
# J" @+ Q' q  ?( v+ T1、开发板资源简介

' C% w* R5 x; g2 L' P(1)开发板主芯片型号:STM32L431RCT6
6 k, F2 t4 G* E7 h7 }( S(2)开发板主芯片封装:LQFP-64_10x10x05P4 |* \7 d5 P/ f. w4 A: {5 ^
(3)开发板主芯片内核:ARM® Cortex®-M4+ e# Y9 Q. F7 _' \% ]
(4)开发板主芯片主频:80MHz
1 d3 F2 l- M$ k! j  Q2 G(5)开发板主芯片Flash大小:256KB
0 z" _2 a/ v' Q& F: h(6)开发板主芯片RAM大小:64KB, @6 w# a0 |4 m7 f! \, I

1 l0 E3 w9 R! H5 _5 d

( ]* {" ]9 x1 J8 c0 q bb91345227434ee7a43a34bf3fe366e6.png 1 \, g, A5 r: V4 F
4 G+ d) a. ?+ r( h1 A% W9 }
929c0cce04aa4115a8623703982bf3e1.png
& _1 X7 a4 \: h# G0 Q3 c1 U% \0 O
/ D$ K2 [& O$ i! d( b  l
2、LED灯资源0 w! [/ v( k2 U5 W' G& H
(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:7 Y/ Y/ y1 c* e
* [+ c$ I0 }! P& C; c* m4 U
0f177691c5814f16a508bcfa747f87ac.png
6 ]! `1 S/ s: E" }1 [3 A4 n

8 t' ?/ H% |( f" P(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:8 K+ f: M& D( ?6 ?9 p1 F- T% l4 T
. O% M! O; W# h4 m* c8 Y
e923ad767b8448b7ac37c4ed693724bd.png
7 q  T0 `! q& a5 Y. x& f: a* o3 j* |4 G; M* G- `0 D% ~
​3、串口printf打印工作原理
/ T  G$ o: v  G. B 串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。
) K: Q& H* E. `- N( L: e
     (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也可使用该串口作为debug串口。8 t5 A( [2 m% ~& ~* i4 h, ?
" q+ Y; G5 D. z+ E) d- p( E
     (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。
, [' g: o+ O/ E( J/ T4 i
1 S% C0 V2 T  m8 O4 o: `
TTL转CH340串口,硬件原理图如下所示:
2 L  Q+ B. M, t  ~" ?2 ^7 }4 E/ J
! o) H4 \9 `% x, E/ t' \2 M2 Z0 F
4df1b489cb944c26b55013001061675d.png , W+ o' ]: D9 N2 H  x6 j) K

" h6 t( V, F) b5 x6 u0 ?" ~6 T

5 C  p8 C" G, k  二、串口Transmit打印实验过程$ Z3 G6 O- ^9 [% J( g4 a7 m
1、新建STM32CubeMX基础工程
2 w% E! g& `* \- `1 j
(1)打开STM32CubeMX,点击“File”-->"New Project"$ N2 s- Q5 J. r
, d; o1 l, [4 G# r: V3 \
2399170347904e959c855fefd5877f84.png - F5 l/ Y2 i9 D1 y# u

! |4 k4 O& j, B(2)等待打开主芯片选项界面(大约1分钟时间)。3 K" z8 V6 ?2 u' L' l$ b" @

- _5 \- F# B3 y
d74d2fdc60c9440483e2b7cf8d928e7f.png
% }$ U2 I$ _4 u" H$ R

9 u4 q7 V/ |" g5 q(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。; D* h: I$ l- T# p; d/ {7 w

/ ?/ A% V, z! z( m4 J4 ^
7b80345238d74bea82ce70e1a348f7b4.png $ M  b% C, W7 b) v
5 a3 _- k" W& G+ F' a3 b3 `8 c( A- ~- V
(4)选择时钟源。. k! y0 X4 V# E' b7 J0 y8 h

* g/ [; j0 u% G8 @$ E: h4 M% K! P        因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。4 ^+ z. p) D7 B/ ~
& F+ Z) }: q/ b
3f65707eca104663a3dede6d25dfa961.png
' J/ }; d  _$ r6 m# X
' ?2 M$ F2 t$ U  S' J. R, K
        因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。% }. \& f/ W8 X/ `! O! M
( e8 n) d$ y& e. s0 \
72119b971f62410fa8344f7f9fb9f389.png 0 t9 C. _- d* z& `8 y* y9 n

2 l3 n8 U, i: }5 s* S' e2、配置GPIO控制LED- w5 O/ d# I7 C7 H# Q& H
(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:
8 A+ J- O2 ]6 F5 m
- N& x& V; Y2 I) DLED1——PC0
' r3 n- p0 U! e% iLED2——PC1
& e0 l+ X* `2 {& e1 CLED3——PC20 Q, m# K, Y7 Z1 U
LED4——PC3
5 a8 {9 ~' z( ~2 T1 A1 Z% z* g* D
(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。5 v/ g- T- T1 Y: t# c! @
4 U! q! x- a6 H4 L5 a, `1 R( o
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
/ T. g1 p. P& O% G& r/ y鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。* ^& {4 w: d' v9 h) D6 x& p8 o
鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。
* T( `0 X& q8 ~6 l0 F3 L7 P9 P  b鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。8 {; ]1 j; Y0 y$ t

/ q9 D0 i* P1 `3 K
492907c1e71149819adbaee4516a2af4.png + y# g: G+ v: }. m3 L6 F

  n2 F# [+ t" c$ G! C1 ~% k4 X- l
c75d3f10ba2e427d9c1a10fad9bf5471.png 5 @1 W2 l+ f  C

  s. O4 i. }5 A8 V! n+ a- d(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。
7 S; `( K# F( n4 [
8 S2 j/ x0 y: {  P7 D
38ff4b80e1c5495ba3076a5158fd91fa.png
# n5 Q" D6 H/ D( |; o! Y) a) i/ A' o! h  m/ M& p( Z
​​3、配置PA9、PA10为串口8 Z" B5 F9 W/ Q; @! H7 N
查原理图得知,串口1使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:' q; @* l6 V5 U$ R8 C( Y  b
' i' B3 R; e9 M# v; L; p' ]
497b8ee0243e446784e64a3c31e8a26f.png
% h( I8 r- Y* u7 V3 l2 j2 b* u  v9 R/ S6 H! b& I
(1)序号1用来设置串口收发引脚的选择。
! C, x$ W% a2 G0 G9 O$ W/ Z(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
; e% U9 D5 U2 |: m; @$ a
' a) ~, p1 t3 q6 ~2 z+ a1 g) U4 P 3、配置项目工程参数
, K2 G, u3 U+ z* _& b( c1 W- |(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。) }. _) e+ i( Z

+ {# V/ v% I4 A$ `; t( `+ u
f3ecedd9323f4463b69539906b3c1199.png 2 X+ K' w1 w9 K% X! A  S
( U; f+ Q" H* [6 h" g
(2)完成配置工程。8 W$ e5 E5 f. q' E
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。). |4 D- a7 |2 s& M4 |, ?& V
" N% u  r( q/ P6 [- ?& q+ m" X5 K
efdb616174f54925b6eac31109f227b5.png $ {8 W+ O$ P5 ?" w, }- {1 {- M: k
​​
# Q) V" {6 q! e2 W 41c3f2716e4e4eda8f62fa3a1d871322.png $ ^: w# T# B/ p3 G: E. \+ ?
! L* L1 D* P, j. I
(3)生成代码。% ~3 ~, W6 q) d' u
备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。! {! H& d  b8 ^* f
/ k% y3 y3 l2 X, _; W1 }' J
8eaa7d0babea40ee93f158481a6ee471.png . U6 b; Y' ^; \) K
​​
6 l2 G! Y( K( I3 ?/ P+ N* L- p(4)工程代码生成成功。
! R' J: r) }1 S  S$ F0 `
0 Y$ r$ d) N/ ~. c2 K( \0 W
e8f46d59a1fb4af589feb613fdff17b4.png
. d* P; v" U/ o3 a

$ S# |0 S% t' U$ K) M8 k9 h7 N5 | 三、在KEIL 5中编写代码5 a1 a9 A6 D  v; `3 [9 f" L
1、使用KEIL 5(MDK)打开项目工程文件+ w' \. p* h; R- m
源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。
$ r) T- \. ?  j- d6 w$ K6 R(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。  P+ J* o% A! J3 j
2 l  w, m) w( d
20929232f4e647c28257c69fb217c0c0.png
: v$ u9 z% A$ P/ k
) n4 P8 p+ p1 H* C9 T# F
2、添加串口Transmit验证程序
2 r1 w( w' W: T% {7 h
(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加控制程序,如下所示:实现每隔500ms后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换,并且串口每隔500ms打印一次。
+ e) F7 Q' {, j$ o' @  p/ W2 R: o4 s+ a
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。
9 c; r3 ~# L4 [, i, p$ F8 s
9 [3 i% i! |& g
dfff847f2bd84e648d7cc7889951d0f6.png 9 Q" A# T) A4 B5 |; B( e7 `0 U: n
3 `) c9 x2 w6 R7 m: j9 a( s4 t
a583fb91001e471cab343790ed9dde30.png
% Z& k3 c1 A, _) W
: }. }9 Q6 i; N/ v, s2 ^(2)main 函数代码如下所示:- u; z- H0 q$ K1 R/ z
  1. int main(void)
    + v; _' h+ y9 W
  2. {. C5 `) U  |! S$ ]0 p2 B2 J
  3.     /* USER CODE BEGIN 1 */: _# ~" P0 u/ c% n
  4.     uint8_t transmit_str[50]= {"hello world,this is transmit function!\r\n"};
    9 |+ T- Q# Q- Q3 i+ d
  5.     /* USER CODE END 1 */) X0 @5 q  L, e7 m7 N7 b4 Q

  6. 3 U6 e7 v4 i$ M  |' u1 F. Y
  7.     /* MCU Configuration--------------------------------------------------------*/* k7 ^: J: i- i' ~8 e- ?
  8. % F7 j: `. `7 C' G7 ]0 G7 J
  9.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    ( P/ F' i% K* Z& _& t
  10.     HAL_Init();: z  v$ L1 K5 c5 d8 a

  11. 3 ^* t0 p5 z' }8 Q& C
  12.     /* USER CODE BEGIN Init */
    3 n+ g* T) J' F5 i/ b8 u, |4 j
  13. ; u7 a* ~% X6 F$ I0 S- @
  14.     /* USER CODE END Init */4 S8 d8 o+ R4 C
  15. ) W/ K- I. \$ Z) r0 \( N
  16.     /* Configure the system clock */! _0 `; J  C! K) s% \, ^' X
  17.     SystemClock_Config();
    6 s1 q8 j! w3 @/ k8 I8 R
  18.   A3 q- `+ b- [; a
  19.     /* USER CODE BEGIN SysInit */
    , ~8 k# D' @& h) y7 _
  20. & E2 o+ K1 B; Q" A2 y
  21.     /* USER CODE END SysInit */) R6 z& c2 o' _+ ^3 L

  22. 0 k4 @( w8 A4 ?
  23.     /* Initialize all configured peripherals */! H2 I; ?2 i* }# ^- O/ m
  24.     MX_GPIO_Init();
    4 P2 u! j+ e. h
  25.     MX_USART1_UART_Init();
    0 S# H6 U; W& B4 X
  26.     /* USER CODE BEGIN 2 */: \& n, k) w4 e: r, g
  27.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮. R) s! c: v! H: u  F4 C( |! A1 v
  28.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮& N# [0 e( ]6 x2 b5 f
  29.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    % I6 a5 H; B5 h4 \2 ]. Q: ]
  30.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮
    % _$ q' \* d0 q6 n3 ^

  31. 3 H0 L! @8 c$ [9 {  U  _, @. p
  32.     /* USER CODE END 2 */0 p! C! r* u8 v7 m

  33. ( I3 }: G! s; _# R7 E  |" Y
  34.     /* Infinite loop */
    & v0 m4 C( G) `& K; _: _5 m
  35.     /* USER CODE BEGIN WHILE */
    - Q: y# S8 r% J
  36.     while (1)& y0 }# @' P4 W: a7 b. p2 f# J; l
  37.     {  P  N; e- w3 t$ ~7 m' f
  38.         /* USER CODE END WHILE */
    * O8 R, S1 M3 a6 m
  39. + [+ `$ s5 w! d" y
  40.         /* USER CODE BEGIN 3 */8 E& |: p% I% ?% F8 r9 ~6 H
  41.         HAL_Delay(500);
    , P) u$ x6 h% A! M, P4 G
  42.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                                                                        //反转LED点亮熄灭切换8 X6 |, x, K3 B+ D3 E$ ?
  43.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);                                                                        //反转LED点亮熄灭切换8 @+ a6 c. W2 x: [( v! m
  44.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);                                                                        //反转LED点亮熄灭切换1 N1 k  o& Q7 o% V
  45.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);                                                                        //反转LED点亮熄灭切换
    - U5 D9 i/ n# t! d/ r
  46.         HAL_UART_Transmit(&huart1,transmit_str,sizeof(transmit_str),10);        //每隔500ms打印一次
    # P- M/ |0 O# H% M9 C8 q, z4 m: y
  47.     }
    4 p! q! \7 y/ n3 s& O, \
  48.     /* USER CODE END 3 */& [/ i8 i0 u: a1 d( u7 B5 e
  49. }
复制代码
4 i" I! _) \5 z% n+ A$ D
3、设置编程仿真下载模式
& J$ w: {$ n9 |2 v(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。) q" A1 j* b: z! S  ~

! w' j3 X- ?$ A5 D8 C- g) b( _* ~
edefb6b9a2a14be3b1221ad6d5c7a8a2.png
* ^& o/ P# s/ p$ B! [9 P/ w2 V3 h+ M
(2)点击编译,完成后提示“0 error(s),0 warning(s)”。
  i6 ?4 I9 s# i% a& m7 u* [8 V5 e0 y  O1 y
e0b7e3e353b345a7987fe5f821de2dda.png
! Y2 T6 O" [3 B. l- t8 L0 H2 y& t# x8 z9 Z/ a( V6 }
(3)点击Download(或者快捷键F8),即可下载程序。; c: S& r  S/ E
$ j6 y1 `" v& ^$ L$ Q1 _4 N
eb3f250f19e44862a7df80c2492fcd01.png
( m& r3 z0 `3 P7 P9 {9 Q2 s​​* N3 h7 U* F: v. s$ o# m5 {" t0 ~  f
(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
; W! f3 H( [1 r/ i: J' H$ z) f- g* A8 B+ ^% @/ O
9f8aa1a4e8f04041bcf5cb183facd100.png ; p" q# C2 j3 w" g' [- ]
​​
% J1 a0 D6 u  A2 A5 R! w4、串口Transmit打印实验效果展示3 j( ?' x  Z$ q4 J* k3 `
        程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后每隔500ms闪烁一次,并且打开串口助手后(串口参数:波特率115200、N、8、1),可以看到Transmit每隔500ms打印一次log数据。, h( Y2 w8 `/ }  e
0 f% S7 x+ p) ^1 s0 W
39a873987262466bb13106b26e781cfc.png , \% i/ W8 h6 i, j0 Y* p3 M

3 V( @& u+ N& Q6 r————————————————4 E4 e3 k1 Z  V6 f, f* n& x
版权声明:智能小屋ZYXC
, J* K& c8 G/ O/ L. k4 H4 }5 G+ ~  D# e3 f
8 ]: }2 m" l; \3 @
赞 收藏 评论0 发布时间:2023-1-14 18:53

举报

0个回答

所属标签

相似技术帖

官网相关资源

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