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

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

[复制链接]
STMCU小助手 发布时间:2023-1-15 00:07
一、开发板平台简介:8 h/ z9 a( p" N9 c- L" d, f: X& j
1、开发板资源简介
" E" }4 W( Q, }8 k# I4 C
(1)开发板主芯片型号:STM32L431RCT6
! U$ z% _7 }- [4 g8 |; }(2)开发板主芯片封装:LQFP-64_10x10x05P
7 E$ E" s0 w/ O5 |' @- V& A(3)开发板主芯片内核:ARM® Cortex®-M43 Q. R& m9 J3 {& ^) Z
(4)开发板主芯片主频:80MHz) a2 P/ l1 I0 j' S7 |: N# d; K8 y
(5)开发板主芯片Flash大小:256KB, s, ^; d; q) L/ R8 N' h
(6)开发板主芯片RAM大小:64KB
5 f, p* @: J  Y& K! M0 l (7)其他外设:请参考芯片手册1 j0 B/ _! A8 I
' `0 }+ e4 _, B: b( U  `2 d: t
bb91345227434ee7a43a34bf3fe366e6.png
1 _" V1 o4 S3 A: G8 c; E
. l  {7 G5 I- r9 j$ Z9 S
929c0cce04aa4115a8623703982bf3e1.png " M6 S4 L3 O  p2 k( r+ Z1 l  P
4 U+ n( I5 j- n$ ^! y  P
2、串口简介* X; n$ @# b" E2 ?  k
         串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。
% _, k6 T: }) L0 E6 c0 D* g. m, [  C4 ]) m) B1 D) `
        (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也试验该串口1进行。
9 p3 i& r6 g: v8 m2 S% }
, @. h& _1 P4 @9 _2 N
        (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。
9 w$ d* l% @" }) X
, h+ p9 [' J2 h5 |6 n, f
' d3 S2 q0 X0 d; b% U& s5 J  n
  二、新建工程7 p9 n( Z5 n, `# c( _! x
1、新建STM32CubeMX基础工程
5 Y. _2 \- R7 P- L0 F8 x' [
(1)打开STM32CubeMX,点击“File”-->"New Project"2 {2 @1 i( I4 a* x/ W/ W# v8 e

6 u. ]9 R  x8 N2 s/ H
2399170347904e959c855fefd5877f84.png
& U; n7 Z1 h% G. |; Z8 O4 W3 N
1 k5 v; s0 T- j7 I7 ^
(2)等待打开主芯片选项界面(大约1分钟时间)。  v  v" K/ @2 @0 P3 @2 X, e  p  C

5 T' y4 @7 O( J3 Q2 S  z
d74d2fdc60c9440483e2b7cf8d928e7f.png 7 O: j. j" z, b) m% Y0 e/ l1 ?
3 v. j9 C8 a& `  L/ U; z
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处现在STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
- c8 a- J: B- A! \" f# p& p- S- `
( n% o2 l/ y5 |# }
7b80345238d74bea82ce70e1a348f7b4.png
; q# C/ {$ n- K! V. {6 p) k7 m
/ x2 r' N, ]. Z. I+ c5 v
(4)选择时钟源
3 D3 D# o) J+ y& i" V(1)因为开发板上有8M外部时钟,此处选择外部高速时钟(HSE)。
. Y( h; p% O6 p  s! V7 G/ R6 A: \( r(2)因为我们没有用到外部低速时钟(LSE),此处不做处理。
8 v% X6 Q4 r6 J# h2 K7 ~* Q) l
% ^) X$ ~/ V* y! C0 d& h4 B8 ]
72119b971f62410fa8344f7f9fb9f389.png 2 _& u  }) e' |; R/ b7 Y5 A
/ [3 g- I+ _+ l
2、配置GPIO控制LED

) k( g5 u* u7 c1 w- E* ]备注:LED灯用来指示系统是否正常工作。+ L3 I+ \' }  T. R( Q9 |7 E1 D
(1)查STM32L431RCT6开发板原理图得LED1控制引脚为PC0,则配置GPIO的引脚PC0。
" U& H% d) W  z$ l9 j8 d) V" A鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。: Q# M( Y& b8 v( i
7 l0 e( m8 Y6 o% ^) [
492907c1e71149819adbaee4516a2af4.png
6 Q$ P# a0 P0 f) |* t0 K, Z6 S- `, \: h  q) ~3 _, ~0 n
(2)根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。
7 J( U" S4 B' F3 ^2 t+ C7 U. L8 |9 n6 ~% r
38ff4b80e1c5495ba3076a5158fd91fa.png
, I, u$ C9 X. v, [6 R0 {
1 s0 z1 H  b2 B5 V7 M
3、设置串口1参数

3 a, {3 {) G6 Q) o. l1、查原理图得知,串口0使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:% H0 z$ ^* u- V5 c9 I' f) {

0 n& h1 V9 S' ^& K7 T
497b8ee0243e446784e64a3c31e8a26f.png , B2 q6 q# S% ]6 E' z; [$ w
' _8 L' f/ E; g* s; P
(1)序号1用来设置串口收发引脚的选择。
3 q4 X/ g  d3 w(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。( n+ u  O) W! H6 F

+ j5 v3 `5 h; P 4、配置项目工程参数
7 w1 z0 P/ W  Q' H(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。6 ?( J1 H0 U( _' Z0 }$ C
! e: Q& V: h( O
2ce1933c10484d819234682f4abc0228.png / b- d# |3 w5 M# x& B' Z" T

+ r! W4 v3 v! Z7 A& h(2)完成配置工程。
! l) t* m$ H  O5 o, s备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
2 K; k& N( Z5 V8 X# m
& Q% K! d0 I4 _" T/ }
efdb616174f54925b6eac31109f227b5.png 3 K7 I  n' x. b; [% F/ J9 m  C

) i. @- m9 ]7 O) \( B2 e
41c3f2716e4e4eda8f62fa3a1d871322.png 3 g" r" k6 [- U- u! X& ~

' G5 e& k; X3 r. I$ y! c# e/ }8 h(3)生成代码。
, C% t, d) `6 L% Z* @% E  a$ F  ]4 @: A+ c, T
8eaa7d0babea40ee93f158481a6ee471.png
9 b) R( e, J, s, v  J) c9 d; z" c
0 y4 _, c2 v; i  n1 k' R4 s/ M" \
三、在KEIL 5中编写代码
' S% S8 p; |. X" t4 f/ ~5 N$ j! Z! m- G1、使用KEIL 5(MDK)打开项目工程文件
2 Q' B9 z' K5 Z  s3 D
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程。& B8 C1 _1 F/ J5 K7 n4 {* d
* t3 ~5 M. K  z2 s* e
0d697d3d06664ba397f843687e19dc1f.png
9 t. A% i& j; S8 C
. C9 Q  G- c# R: T- y. W6 ^(2)添加每隔500ms,LED1闪烁一次的系统提示,用于提示程序运行正常。4 H* C; I9 ^, p# ^4 C
% C  P+ f0 A3 s  w* n/ d5 q
6ab72ceaeb7a41af833842fe5ba6f34d.png ! ^$ w8 |5 f* {, ^; G$ V. |0 j  j

, O: h% P$ K. m' k4 C" V

- s, |2 M6 |6 E2、添加使用printf函数打印log的代码
& M! W2 Y7 o/ q/ n* ]% {(1)在项目选项中勾选Use Micro LIB选项,勾选该项目后,可以正常使用基本的C语言库。* T) k& _3 X" G6 |2 n

8 X' Z$ H3 F2 F% u
3db54bee7a3e4fb78ecb85f0c26ece57.png
* U8 g3 \! K7 W, O
/ ]' ^% @6 Q5 `- b+ K" O$ ^4 S(2)printf函数会调用fputs函数,fputs函数为弱定义函数,即使用__weak修饰符修饰的函数,可通过自己编写函数定义覆盖原定义,我们在此处重写fputs函数。在usart.c中添加如下代码。
- c, R, ]- D5 F: N* L1 k7 c- p
, E- P' [/ \; Y" f, o% Z
备注:开发者自己的代码需要注意添加位置,一定要放置到一对《USER CODE BEGIN和USER CODE END》之间,避免重新生成工程后被覆盖。4 b6 ~; f0 E$ ~5 ?8 l( u1 f" \; k0 I

" m9 S! B. V% r9 ~
607544c9bb2b4ca995be69d71d763526.png   `) M+ g- Q3 a$ h1 T4 e3 _

6 J6 [" D  r* t8 b  e% L# M 代码段如下:可直接复制使用。8 W+ I) |9 W4 i0 H! g: Q2 L
  1. /* USER CODE BEGIN 1 */
    ) V4 Y8 b0 ?. l% W5 g
  2. 7 c7 v1 B; y# q& K  @. d
  3. #include <stdio.h>
    - o" ]  k9 V, U; A( E! t" j
  4. #ifdef __GNUC__
    . A( ]- R  F% F4 w7 o
  5.         #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    * L! T. r+ T. y! u# B+ I( j
  6. #else4 D6 j; r: r* u0 }0 L7 m. Z
  7.         #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    $ ]2 `, p9 q+ v: q9 ?6 I
  8. #endif1 a7 s; _/ N; j" V! r
  9. PUTCHAR_PROTOTYPE  q, j/ a0 F/ T1 n
  10. {! {4 b1 ?7 d" V5 ]+ N
  11.                 HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
    9 x) T/ k* e: j( }
  12.                 return ch;
    # Q, r* l) B+ |
  13. }: x, F# z) A/ y

  14. , L& m) q- W+ A
  15.   i  z* Q6 P" z- P6 _
  16. /* USER CODE END 1 */
复制代码
3 I1 B0 M% X) G# y# X
(3)使用printf打印log数据。需要注意main.c位置添加"stdio.h"头文件(printf的函数声明头文件)。! G- a- H  `5 E" d: ]9 u
7 S, f& m. j" w8 f
ad684ef90b44425198d2cd6b046d6d5b.png
4 Y4 _# d2 t- ]) _& N% r0 {! ?/ a6 r
5 I( u# \8 ^' A1 O% W1 E
  1. printf("hello world,this is printf function!\r\n");   //printf 打印函数
复制代码
. ]. j7 p) a1 {! ]
. x2 `! t9 V! Q/ ^; J8 _/ t3 W
3、设置编程仿真下载模式

0 K: s) q; G3 x(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。1 K/ F$ `% N& T

! M$ C7 L- S9 b& h6 m0 B
edefb6b9a2a14be3b1221ad6d5c7a8a2.png
5 \8 l: U) g8 P3 V1 U: s  s% f0 O& m
(2)点击Download(或者快捷键F8),即可下载程序。! @4 y. P/ f6 L# v) k! ?

* p' @: X7 H: U  o) ?! ]  R
ba221842d5db40808aa129dd83c593d0.png
# L! o6 O. a5 ]0 L& D; C* C
! N3 j) U2 T/ P2 ]* a

, h( {2 d+ o* x! H" g(3) 如果下载程序后,没有看到LED1灯闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。7 o, D$ C- h2 C: a1 _

! b# |, Y- T6 R& S; T- S4 S# e
9f8aa1a4e8f04041bcf5cb183facd100.png 2 a) d# ?9 A7 M9 l* m* B  r
# F5 i# Y9 H- K; i
; a; Q) b! ^5 f, C: l0 ?+ A1 |, `
4、查看串口printf函数打印log效果

  d7 {7 v9 {( Y: b(1)设置串口助手参数为:115200、NONE、8、 1(和代码中串口初始化参数一致)。5 t0 X' G4 H9 Q$ u7 O
(2)设置成功后,就可以看到串口打印的效果。每隔500ms闪烁LED1指示灯一次,且串口输出一个log。
& k5 b& ^: u' C8 T5 S. c
/ r; f( p: T: ^1 }& b( O
5d514f8d3f3f479abeba35cf6e75e92d.png 0 I" z+ ~8 l6 m! K$ D
. q  C0 o- P" w
————————————————
5 i' \. c+ @, _) H% x5 Z1 `版权声明:智能小屋ZYXC1 G( ~% B0 j- N( j& u6 \

4 ]( i0 A; d! B5 R
收藏 评论0 发布时间:2023-1-15 00:07

举报

0个回答

所属标签

相似分享

官网相关资源

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