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

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

[复制链接]
STMCU小助手 发布时间:2023-1-14 18:53
一、开发板平台简介:9 e, ^# F6 d- F6 _' d* ~
1、开发板资源简介

6 N! o3 i; r* g  q% F, n9 F5 t2 Q2 _(1)开发板主芯片型号:STM32L431RCT6
- E' H8 N' g6 w3 v" [, a(2)开发板主芯片封装:LQFP-64_10x10x05P
3 p4 ?. ?. R6 z4 X(3)开发板主芯片内核:ARM® Cortex®-M42 H$ c* N* ~( Z& g
(4)开发板主芯片主频:80MHz
5 u, l$ I- W5 d- M: |1 L: V(5)开发板主芯片Flash大小:256KB
/ H8 y: I0 m: K; l$ ](6)开发板主芯片RAM大小:64KB
  m" D* x& @3 |5 e9 H8 F, |0 W4 M) f' D! }, X
0 n/ C* z9 A' f' c
bb91345227434ee7a43a34bf3fe366e6.png 8 ?. ^) l# O' f9 D1 H: j$ s
  S4 a4 A' t, c
929c0cce04aa4115a8623703982bf3e1.png ( p2 v* Y6 M6 o  ~1 d5 P5 T

* O# X% E- A/ ^, O% F9 {2、LED灯资源
: i+ u5 ?( D" s(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:
+ d  O9 S+ X/ _. ~' Y% v3 d1 R$ V+ f6 ^( p- g* p
0f177691c5814f16a508bcfa747f87ac.png
( c* l6 ?6 q6 g; g4 k8 ~

& E, c9 W9 Z2 ?(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:
! _" A& e1 H# s: U
1 a) t3 U* i) ?3 F
e923ad767b8448b7ac37c4ed693724bd.png ! n( N" N, v6 u; J$ {% w

2 [; D; O$ N: {​3、串口printf打印工作原理) a& m+ Y8 I4 \+ u9 H7 f, l
 串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。
& M! Q0 i) x: x5 w
     (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也可使用该串口作为debug串口。
. ^; t  h% ~, f. s$ [* ]/ _" B/ G% S! p  K2 [& G
     (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。
- X- h% L( m2 Q; O* W; y$ |
* v5 I" f7 O7 i" _9 @: E5 C; P% |
TTL转CH340串口,硬件原理图如下所示:
# K, R% ~9 V4 m$ B8 e5 e9 j- c* ^2 p/ `/ f2 g0 \# i
4df1b489cb944c26b55013001061675d.png
! E0 K4 I% ^" k6 N$ c- P: h+ u
4 S, q* u% l& L- K" H
- j0 M/ c3 ^3 s. W
  二、串口Transmit打印实验过程- }/ T& _, |8 A" [
1、新建STM32CubeMX基础工程

1 Z: O% E! h" E! H( H9 p+ h' \! k(1)打开STM32CubeMX,点击“File”-->"New Project"
9 \' p2 i  N" b; g1 F: ~
" I9 }% @: \$ F
2399170347904e959c855fefd5877f84.png
* x* C* ~! D' ?0 I" E8 y

0 {+ A/ d6 m9 v8 ?5 J& B* h& U; g0 Y(2)等待打开主芯片选项界面(大约1分钟时间)。
* w. K4 A; e* _: w+ K( y, ]' s: ^% Z3 t9 H' T& K0 x/ P
d74d2fdc60c9440483e2b7cf8d928e7f.png 2 Y0 s3 X9 E1 w8 z4 _7 J7 @" ?
$ g; h. T/ ~6 t; |( ?9 Y
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。) R% o- i; Y* \- t- \" a# b
  r- U* L' l, k* u4 `  F
7b80345238d74bea82ce70e1a348f7b4.png
1 C" J0 o. d( D/ i' H& E; b( k) E, b; e3 m2 F
(4)选择时钟源。
6 T$ y0 i( M# g- U9 `; ?5 K! z, A1 y! |8 ?( u2 c1 R$ a
        因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。! g( g$ e2 {9 \2 @

; t$ z2 G- ]$ R- L* j# W- F2 x
3f65707eca104663a3dede6d25dfa961.png . _% E  M9 T* e

5 G' D( R4 A7 T' S3 c8 ~' U        因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。3 l, U7 f  l: s7 L$ J
, X# [4 h8 S- @6 i1 C0 ?
72119b971f62410fa8344f7f9fb9f389.png
% K# R4 [$ r- J
8 z# x( E3 {: `2 s/ |1 m( u2、配置GPIO控制LED
1 T& l- S; X4 ~(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:  t* E+ r! ~$ y  i5 f2 C
' h0 C- u1 X* _# v: D. `
LED1——PC0
) [$ O7 V8 A* H5 L- g1 WLED2——PC1* j8 F; i9 B# w9 n# M' ?6 u" x/ ?
LED3——PC26 z. f" K) W4 S8 N8 j* p, Z
LED4——PC3
2 T3 E" A* P* k" x: z6 S
% @4 \  \6 K3 v; J" A; L(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。8 B$ X1 R) H( A6 o
3 k- Q' i2 W! H" z
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。6 i. ]2 f; y5 p7 w
鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。, T0 r; T5 U' Q6 h
鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。
: U: \1 m5 g! k+ L- h  w鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。/ m' q5 U- l' s+ a9 X7 c. [- g# `, F
3 [% @- N) _3 T  ]( G2 k9 W" u9 r
492907c1e71149819adbaee4516a2af4.png 8 K8 |# `+ m  r' z, E. p% V

5 Z# {& m; u# |. K- ~6 t7 w8 p
c75d3f10ba2e427d9c1a10fad9bf5471.png ) E1 [3 _* q6 w5 k  {- \* I8 O

# R( O# F6 z) T% ~(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。
  }) ?+ r+ @' r: e" D1 G3 K: N, w) o4 }9 V
38ff4b80e1c5495ba3076a5158fd91fa.png 2 @4 k8 k' x) e0 A
, y$ h3 ~% e& o
​​3、配置PA9、PA10为串口
) L+ o9 }, S! n4 y. V查原理图得知,串口1使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:( o5 E% F8 I2 b( D! n
" A+ ^  B$ E1 B; M5 ^
497b8ee0243e446784e64a3c31e8a26f.png
6 \  B. \2 }5 t/ z7 e( r( P% C# N
8 I& ~- ~5 f8 E7 ^ (1)序号1用来设置串口收发引脚的选择。
4 N& C) S& x& @& d0 L: _& C(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
/ i3 p  v6 ~( w0 ]: ?! F* j3 ]5 T. k
3、配置项目工程参数
6 ~( l# T' ~) \  E" v/ m(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。- x# |, E' H4 C5 ]$ q

) t$ ~1 h9 L9 M( d7 g
f3ecedd9323f4463b69539906b3c1199.png 5 k0 g7 o5 v% L0 H
) i# h; f! w# E0 X* H1 Y7 o
(2)完成配置工程。
+ s1 J; s7 C9 {7 L7 T5 f( n: d# N备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)# @! k- B. k9 r. A! N  v% ?- h+ v5 ^

/ @3 S. I9 y) U/ `
efdb616174f54925b6eac31109f227b5.png 1 m, `" b: x1 P! Q( v/ R: E3 t
​​7 V4 K" D! B2 z! v/ Y
41c3f2716e4e4eda8f62fa3a1d871322.png # U1 |" M% g" I8 G- a& H+ c

7 X! X! L- f0 s; n+ n3 C- l# O# n(3)生成代码。/ a: A3 z8 R2 i" }6 Y" c. P
备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。
( w1 H4 A" Y# ]; I3 H6 G& R; B+ S3 n" }: }, G# j
8eaa7d0babea40ee93f158481a6ee471.png
6 Y6 c6 _( u5 U& W, [: p​​4 P3 V4 Y5 q" A0 m, H
(4)工程代码生成成功。3 S6 B+ n+ z3 g" j
! q( f& ^0 q1 o+ f
e8f46d59a1fb4af589feb613fdff17b4.png + z% {. ^' {8 }4 F4 |

+ B, ~# `* g0 H2 K' d/ U 三、在KEIL 5中编写代码$ k- H( g0 c+ B7 w: X; g* f
1、使用KEIL 5(MDK)打开项目工程文件
# E8 U* a9 L* s源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。1 V5 i3 B. q  P; w
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。
) \, g/ E% Z/ P8 R) @, D" L  B1 \9 [
* c3 c0 k# A4 w. b9 ]5 z* t
20929232f4e647c28257c69fb217c0c0.png * @! s# S( K7 t# f+ q; H2 R

) {  t( o0 N. w( M  Q+ C: }2、添加串口Transmit验证程序

0 m5 r4 f+ Y# b4 p5 B; p* ]% ~(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加控制程序,如下所示:实现每隔500ms后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换,并且串口每隔500ms打印一次。
& e) ?, k: W; e( y1 B& O. v2 E% F4 M" Q; }1 P
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。# T  M4 e. P7 ~
' W1 |% J2 ]; @4 m
dfff847f2bd84e648d7cc7889951d0f6.png % o4 i' g/ w; f# V+ e" H" i* e) l
  v7 G1 q1 M& p! h9 }! k
a583fb91001e471cab343790ed9dde30.png 7 N" V3 L' x) L$ }; Q6 H

, ^1 \2 t! @' w7 R7 l# s, [6 u( ]2 k(2)main 函数代码如下所示:
6 _& C0 T, G6 K3 O" _/ |$ ]6 @
  1. int main(void)1 I& H5 W- y, N( x
  2. {5 Y4 h2 ], u/ |  ~( ^
  3.     /* USER CODE BEGIN 1 */
    : j$ h9 }# N2 e" a  j
  4.     uint8_t transmit_str[50]= {"hello world,this is transmit function!\r\n"};1 p0 r8 r/ q( P& u" B/ F; F0 F3 q
  5.     /* USER CODE END 1 */- c( _  G+ N2 I" C# B" I$ p
  6. 3 C+ N, L: c5 p1 f' b* J/ F
  7.     /* MCU Configuration--------------------------------------------------------*/
    # f5 P# T) z$ k. Q+ I( i, I
  8. % @" E+ P) T- B; P# H: L7 f
  9.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */4 g% d+ W# t, [; q$ x
  10.     HAL_Init();
    - X$ V: a+ }; S1 m$ g

  11. 2 X* c9 N7 T" H/ a- `/ U; V9 {/ A
  12.     /* USER CODE BEGIN Init */
    & j7 t3 S- T9 ~- O( n- S, X& Y

  13. 8 b/ {. G- q# m2 d: L7 D7 x4 T
  14.     /* USER CODE END Init */
    % s  I2 f; D% {$ m7 U( S9 Q% U
  15. 6 ^8 g9 V3 R7 r7 W* M6 F
  16.     /* Configure the system clock */& N/ c$ Z6 r* m, ?5 g' y
  17.     SystemClock_Config();: G6 L  g- c3 e* j! m

  18. ) o2 N- x2 E# P" @+ U5 ~
  19.     /* USER CODE BEGIN SysInit */
    : L8 K& y% }" O2 a' e
  20. % [5 A# d9 H7 a- q
  21.     /* USER CODE END SysInit */" Z' {  E: ~+ K( A& ^
  22. 1 K1 r% @0 D3 y4 {1 t- E2 m
  23.     /* Initialize all configured peripherals */1 I( H& N, z- F" t3 [$ ]# f
  24.     MX_GPIO_Init();9 v2 ?' A, P% N  Y7 d
  25.     MX_USART1_UART_Init();; H/ e* M4 L& X  T: _3 [
  26.     /* USER CODE BEGIN 2 */1 o5 m# R, n( y, c5 J
  27.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮5 Y4 G0 G5 }; y' z4 |" I4 Z
  28.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮: m, h; J! z8 l' r; }+ [; S
  29.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮9 A* T8 a8 E5 A/ m+ U
  30.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);                                                                //初始化LED灯,默认点亮; U/ h4 I7 V9 b1 R
  31. + p- z% s/ o  _% y/ ]# J$ r
  32.     /* USER CODE END 2 */
    7 y; @# L( s9 d3 m. ^
  33. 8 W$ W5 L$ w! w" o0 ?
  34.     /* Infinite loop */
    ( o% _" j2 `" E5 n) t
  35.     /* USER CODE BEGIN WHILE */: h+ l# q4 F+ Y/ j" ]" V) X
  36.     while (1)) n) O0 M; C  q
  37.     {
    - U& y) x8 p% B* W" K; _1 d
  38.         /* USER CODE END WHILE */
    4 R) |, C# Q. v: _
  39.   W4 G0 X% f- b$ k
  40.         /* USER CODE BEGIN 3 */6 ^2 z% \6 `5 C( W: L5 c
  41.         HAL_Delay(500);
    # X/ c2 d- X3 y- n
  42.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                                                                        //反转LED点亮熄灭切换5 H2 m" J( H6 W5 v7 P( e( g
  43.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);                                                                        //反转LED点亮熄灭切换9 t) g# Y% v. m. _
  44.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);                                                                        //反转LED点亮熄灭切换4 a2 s+ H( N8 m- K8 ]
  45.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);                                                                        //反转LED点亮熄灭切换
    7 ?+ ]' k2 q: x( |
  46.         HAL_UART_Transmit(&huart1,transmit_str,sizeof(transmit_str),10);        //每隔500ms打印一次9 q% Y# O3 E/ k4 R0 C# C
  47.     }; K' w$ x* s/ N$ R, i
  48.     /* USER CODE END 3 */% o4 z# F! t, h( c2 Y! n0 r
  49. }
复制代码

- {) K; a5 F1 N8 t: X8 B3、设置编程仿真下载模式
: {0 Y9 e. n5 g(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。2 \4 ]' z) i- e; T
' h* B% a* y$ y
edefb6b9a2a14be3b1221ad6d5c7a8a2.png . H: Y8 ?. q  `( b; N" {# @! u# I

0 U8 P% U* a. S6 Y(2)点击编译,完成后提示“0 error(s),0 warning(s)”。
4 A0 u2 R1 H' a3 p* M
% q% i& I" H" |' w1 G
e0b7e3e353b345a7987fe5f821de2dda.png
+ O% q  x: S! \. N+ `/ S8 g0 R' H' Y: J: K% K# S& t& l) ?  o
(3)点击Download(或者快捷键F8),即可下载程序。$ k$ n$ B+ q4 h

! X" t! O1 M8 e5 |/ b# Y
eb3f250f19e44862a7df80c2492fcd01.png : I; u. ^8 X6 I% f1 ~. V# \
​​
! e6 ]! i: W4 K, B$ e1 d% x(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。% C# N% D( P0 D+ O

/ S) I- x! t6 [
9f8aa1a4e8f04041bcf5cb183facd100.png
% \6 C+ J; y1 `' f+ O" l3 d% g ​​
4 {' c) o& x6 J$ V6 j4、串口Transmit打印实验效果展示: w; O+ g; J' j, Q0 Z
        程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后每隔500ms闪烁一次,并且打开串口助手后(串口参数:波特率115200、N、8、1),可以看到Transmit每隔500ms打印一次log数据。
" p* |9 O' w  U0 q7 s7 g
5 s0 O9 C/ p  j" S5 b 39a873987262466bb13106b26e781cfc.png
) c$ c+ _5 b5 G) _5 Y0 P% d) C4 Z5 S/ z3 A; Y
————————————————
5 J( ~$ \, y& ?% k+ Z7 w版权声明:智能小屋ZYXC+ w8 |8 [/ c- ^5 H% ]3 }& K

# G& F0 C! J" h- T8 r" a. H4 R4 t* h- H9 W
收藏 评论0 发布时间:2023-1-14 18:53

举报

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