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

【实测教程】STM32CubeMX-STM32L4之研究串口通信(printf)

[复制链接]
STMCU小助手 发布时间:2023-1-15 00:07
一、开发板平台简介:
% y" `9 L  H. q4 s* B1、开发板资源简介
: t- T9 I- P/ K7 m( Q" N$ ~
(1)开发板主芯片型号:STM32L431RCT6, P2 ]$ s: n1 b  ?& ?1 `
(2)开发板主芯片封装:LQFP-64_10x10x05P
3 X4 e  s/ }* `7 ]- L% n* c/ n4 j(3)开发板主芯片内核:ARM® Cortex®-M4
) r; f2 l' ~7 I0 F% Q% f8 P(4)开发板主芯片主频:80MHz
5 I# |, u8 P! l(5)开发板主芯片Flash大小:256KB
' |7 B7 R0 f/ ^: e  n& {(6)开发板主芯片RAM大小:64KB2 r3 `0 C2 y! X8 R) m& G, J9 D+ h
(7)其他外设:请参考芯片手册
3 l8 w0 k2 U2 h" |# O; A$ q& J- b! k; K- `. L9 {: ], O: ]
bb91345227434ee7a43a34bf3fe366e6.png ! i3 V- Y( e4 [% l' ~* ]8 d

. [% e  L' @! `6 ?/ J# n5 N
929c0cce04aa4115a8623703982bf3e1.png
8 g. k9 y3 i/ u! a( q" \
5 n: e( t7 A; ^2、串口简介/ |- X5 B! [4 M9 ], ?
         串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。
3 H0 o4 D6 J5 e  K  t  n9 l
0 v" o4 z9 e/ P9 b3 ^7 C  t        (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也试验该串口1进行。
' a  x5 |* d( ?& C; A$ E/ m

+ K) I+ Y$ b4 ~9 ]        (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。
' p- ~' F- V) e* }. K$ P3 q9 ]
+ \5 q0 G, D2 U+ a2 r; q
( e1 j2 W* U! d  O% i% G
  二、新建工程
9 f8 n0 Y( u( G1 A" f4 U4 n1、新建STM32CubeMX基础工程

* X7 B9 ?# H! Y7 y- y(1)打开STM32CubeMX,点击“File”-->"New Project"
0 E+ t/ }: w2 S  B# n. U
# q: H5 m/ U/ R7 e) p/ A: _! ~! Z
2399170347904e959c855fefd5877f84.png : k! ~( \9 j. r: c. y
0 w2 g4 [" v' n% Q
(2)等待打开主芯片选项界面(大约1分钟时间)。
1 X% j* N8 q+ G: [0 H
- W, y" k! f( U+ V
d74d2fdc60c9440483e2b7cf8d928e7f.png
! o4 ^9 b' y' b+ C2 G2 F! \) X! \# O, s/ j; k& ]2 K
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处现在STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
3 G+ {, L; F2 y0 \- q0 F5 Y3 \9 u. R2 e* y0 L8 {; A! L
7b80345238d74bea82ce70e1a348f7b4.png 7 `* q  R/ K. }7 A7 \* T

7 ~9 Y3 K4 z( k2 U(4)选择时钟源. D4 C& F: q; h: \1 B- d
(1)因为开发板上有8M外部时钟,此处选择外部高速时钟(HSE)。; v+ K" K8 t4 W4 ]+ l$ s. w. Q5 `
(2)因为我们没有用到外部低速时钟(LSE),此处不做处理。1 ?* W% y5 h' G+ _5 [' @3 K

* O8 v" g! ^9 U$ W+ Y  x- H
72119b971f62410fa8344f7f9fb9f389.png $ n; {7 m+ x, \9 B* O8 ?  ]
7 J3 }1 t$ l0 {, v% v% _7 n
2、配置GPIO控制LED

8 s1 F# z. `3 q6 f9 T备注:LED灯用来指示系统是否正常工作。; X! p2 X$ X, P
(1)查STM32L431RCT6开发板原理图得LED1控制引脚为PC0,则配置GPIO的引脚PC0。# p9 Q& z# x! ]7 t
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
; Y4 e, J9 W% _- r3 H& y+ ^! ^5 [
492907c1e71149819adbaee4516a2af4.png
8 q2 w/ L1 ?1 {7 n' H' A1 M4 L7 Y4 ^9 e* v3 }, `# ]" _0 b3 c
(2)根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。' T: Z8 g& v) r  P

. s/ C5 w" Z7 r: d- C3 e
38ff4b80e1c5495ba3076a5158fd91fa.png 7 y. j& c1 l1 V

1 C6 \- U( m* e3、设置串口1参数
6 }7 A3 m  d2 m  n& w
1、查原理图得知,串口0使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:
) i+ d" B/ x; h) I
3 H8 |* M2 e. {1 M1 k9 U- w& B3 `
497b8ee0243e446784e64a3c31e8a26f.png
4 g& |. A- c' E4 P7 P2 m- i- g" t
2 }2 B6 J7 B, ?8 Z (1)序号1用来设置串口收发引脚的选择。
' L* F% O2 G, L- d+ N2 m(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
0 ^7 N+ ^% F  x+ b6 G3 A
' s0 T$ o3 ]" ?1 y6 }  H, g+ U 4、配置项目工程参数; T4 v7 T3 a2 {8 V- @6 w
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。3 |3 P! i) l! w2 Z( `

! [$ N6 O- {- P) ^( e
2ce1933c10484d819234682f4abc0228.png
& h; C$ F  b$ O: E) l/ d# A& X8 f8 \# K2 e3 I) b, y
(2)完成配置工程。& ~1 p6 I9 ]' \
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)2 \2 V7 N) j& V  l

7 d, ]2 X( `3 |7 K7 O$ B- I
efdb616174f54925b6eac31109f227b5.png
) U# s" f( i  O' w% U) _
) Z" S. t' K! z7 L: W5 R
41c3f2716e4e4eda8f62fa3a1d871322.png 1 h0 v- c0 M7 _! z2 v
  g: a  f8 s4 V+ s4 N' l3 t
(3)生成代码。2 S# d! n: l9 a' _8 j9 ^+ j" n

" g  X; c) `/ @( C1 ~4 I
8eaa7d0babea40ee93f158481a6ee471.png
! ^  a# R" u* r  c4 P% V

( \% |$ y8 e0 P+ q8 y6 R& R  d0 G 三、在KEIL 5中编写代码6 F" r) j8 [2 P4 f8 T
1、使用KEIL 5(MDK)打开项目工程文件

8 E+ Z2 j- i; D, [6 y$ r(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程。3 B# _1 j6 P9 h/ U

5 P$ z/ ^9 g* B( H
0d697d3d06664ba397f843687e19dc1f.png
: f7 K7 f; u8 F. }
4 E0 y0 y( p# j' ?& z/ n8 V+ m6 R(2)添加每隔500ms,LED1闪烁一次的系统提示,用于提示程序运行正常。1 o4 e. [% Y' A8 i4 V# O

, Q7 H* Z2 ^+ d9 m8 E: F
6ab72ceaeb7a41af833842fe5ba6f34d.png - J" N* q$ m& d! W
) D5 U" R2 q' g: r* Q+ T% K
3 j" U4 J3 W4 m5 p0 g% z+ N. G9 [
2、添加使用printf函数打印log的代码' ]8 \' u& \2 o$ P6 [- z# N
(1)在项目选项中勾选Use Micro LIB选项,勾选该项目后,可以正常使用基本的C语言库。9 t4 @, H) Z' ~3 W' |! x" T' f
# I/ j7 Y- v/ x5 d, A* o( A
3db54bee7a3e4fb78ecb85f0c26ece57.png
5 U: [, X$ R% J+ o3 Q: y& P3 c8 H3 N3 Q/ q6 L/ i2 H
(2)printf函数会调用fputs函数,fputs函数为弱定义函数,即使用__weak修饰符修饰的函数,可通过自己编写函数定义覆盖原定义,我们在此处重写fputs函数。在usart.c中添加如下代码。4 k# J# b1 l: v1 o1 I

- o' W1 e* v0 R备注:开发者自己的代码需要注意添加位置,一定要放置到一对《USER CODE BEGIN和USER CODE END》之间,避免重新生成工程后被覆盖。
2 \2 ~. e' X, D- p+ J, D0 j8 t% |) R
4 D3 A- ~; U9 q
607544c9bb2b4ca995be69d71d763526.png
' E+ ~( k" j* m- f: h! I, p# p0 [/ n3 C0 K2 g; m- S
代码段如下:可直接复制使用。
! s, [1 l, B% U2 p' t, [/ b
  1. /* USER CODE BEGIN 1 */
    : s% O! `2 q5 q* ?5 |  E( j, H

  2. 6 m/ A# E* |# u
  3. #include <stdio.h>
    7 J" t1 A3 ?, [) I1 T+ q
  4. #ifdef __GNUC__1 r' X* Z8 C9 _% M! a# Z+ M; r% ~: F7 d
  5.         #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    5 C) R  K) Y. e( [
  6. #else2 W/ \+ n; J4 I
  7.         #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f): [1 q  f& @& |& Y3 z; R
  8. #endif! t- r& n% j+ T  u6 I6 |$ ^6 ]
  9. PUTCHAR_PROTOTYPE& x0 W6 \) }, O" X
  10. {/ _, ]3 {4 R; @1 N5 @
  11.                 HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);  o6 x& ?2 ?+ g% z$ M
  12.                 return ch;, W. {5 Z7 Q1 j% ?6 L
  13. }# P# r& j4 n) U4 U. x; S
  14. 5 g3 @6 @' P0 S2 {# Z- ^
  15. ' g: T5 Y- z& s$ \
  16. /* USER CODE END 1 */
复制代码
4 z$ X2 i0 z6 Y# Q. l+ ]9 {
(3)使用printf打印log数据。需要注意main.c位置添加"stdio.h"头文件(printf的函数声明头文件)。( {  l/ l! B' e+ u8 J0 m+ @
  k2 }& ]' f$ M- q7 l
ad684ef90b44425198d2cd6b046d6d5b.png 4 a8 m, P, i- M6 k1 b
* x; a' |8 W  z& J! M8 p

6 g/ p* q- F, I9 V; K
  1. printf("hello world,this is printf function!\r\n");   //printf 打印函数
复制代码
6 ]! e' j# U% o4 X# a

& ]9 m+ I% d5 a( B; Q, P 3、设置编程仿真下载模式
1 J0 h' K8 s* y9 c3 t  ?* x
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
$ M( ?4 m2 Z  s4 p; b) ?/ \' E7 w" T1 N6 L$ `* O4 D
edefb6b9a2a14be3b1221ad6d5c7a8a2.png 5 ~8 |/ A) k* C9 J$ o

& B; k3 k, p- _5 ^0 ^, y(2)点击Download(或者快捷键F8),即可下载程序。& T/ K; I! s( o! l
+ [0 B* ^. h7 y( _; \& R+ a
ba221842d5db40808aa129dd83c593d0.png
" U$ C6 z# g6 ]9 R& j- V( S8 b% J* g
2 N( f6 R" _2 Q! L
(3) 如果下载程序后,没有看到LED1灯闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
, B2 d- H, t& H/ @) y7 Z% c- W' a
/ e0 E! E; C# p6 ]
9f8aa1a4e8f04041bcf5cb183facd100.png
* W& U& U! f4 j5 \9 P+ H- X5 ]0 r
  R$ }* f0 |/ T0 r. M; R- T  K4 a+ l8 H6 C
4、查看串口printf函数打印log效果

2 m2 q6 h; ?% E$ h- h) J" R(1)设置串口助手参数为:115200、NONE、8、 1(和代码中串口初始化参数一致)。1 T4 x/ z1 |, N1 Q! j" J9 w
(2)设置成功后,就可以看到串口打印的效果。每隔500ms闪烁LED1指示灯一次,且串口输出一个log。
, j( f8 X- x( T& \; L3 X
% ~. V0 m+ r6 A6 Q% E
5d514f8d3f3f479abeba35cf6e75e92d.png
# i9 }9 W" ?8 J# k0 x; X
& f, U0 W# E) o- F————————————————9 G- q  ~7 J% o% Q- E  i8 ~' o' w
版权声明:智能小屋ZYXC
2 Y6 U7 C7 G; l2 k9 C% C
2 l4 [1 M9 P; k% T) ~$ ~5 L
收藏 评论0 发布时间:2023-1-15 00:07

举报

0个回答

所属标签

相似分享

官网相关资源

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