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

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

[复制链接]
STMCU小助手 发布时间:2023-1-15 00:07
一、开发板平台简介:5 u' |+ N; S! j/ e! d
1、开发板资源简介
! b5 }+ f2 |: ?
(1)开发板主芯片型号:STM32L431RCT67 H* M& `  Q, q3 x, ~. I! q
(2)开发板主芯片封装:LQFP-64_10x10x05P! C( @# ^; i, \0 n% J0 Y5 v+ i
(3)开发板主芯片内核:ARM® Cortex®-M4# X+ X/ \3 u* I% a; P% \0 w' W
(4)开发板主芯片主频:80MHz
% i+ z+ K9 V$ v- F) V9 c/ r(5)开发板主芯片Flash大小:256KB
) V6 a7 H1 E& f(6)开发板主芯片RAM大小:64KB: P' p/ G4 y/ `1 K
(7)其他外设:请参考芯片手册4 w1 Y2 M. g  s& s- N- I+ L

: A) U( s5 }- R9 Y
bb91345227434ee7a43a34bf3fe366e6.png
: X; @) M$ s4 s& q% p* b1 o7 }* v: p3 {2 y" X( q
929c0cce04aa4115a8623703982bf3e1.png % {1 Y+ m2 u) {  D$ b; a; i: R
7 W/ x6 x: i& ^: ^4 z7 v8 {
2、串口简介: s; W& ?& s: k7 ^- Y8 _) Q
         串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。
* N! m) e3 m9 d  N- q& v
2 U7 d. E3 i: f        (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也试验该串口1进行。8 N9 G' w4 J4 w

$ p% A+ x( L8 G        (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。  e5 w; }6 W% t8 T
3 a- g/ x  t- o5 S
% U7 f4 j. p4 o  d7 l3 S
  二、新建工程8 M6 ]! r. Q$ g3 @$ q) J
1、新建STM32CubeMX基础工程

) m, u" h" X' N/ b+ \2 b$ K) H(1)打开STM32CubeMX,点击“File”-->"New Project"0 u4 R( R& s0 P& [
0 B3 y! y* s3 H! p
2399170347904e959c855fefd5877f84.png
# d& R  Z" m8 ~' u0 R) l; e- [
4 T  q/ U5 ]6 `3 o, |
(2)等待打开主芯片选项界面(大约1分钟时间)。  I4 ^" b# H! E+ X7 u3 p. [) P
* I. N7 L, j. E6 \% D" ~0 A# ]5 U6 t
d74d2fdc60c9440483e2b7cf8d928e7f.png 4 |# W1 ^/ @+ J# j! ?
- J" k' G9 b) v# R
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处现在STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
  v4 I5 e6 D$ I4 k$ f, l$ d
: f& a8 i6 a; C0 C2 ^8 F0 B+ ?
7b80345238d74bea82ce70e1a348f7b4.png
! Z; ~- k! w+ @% ?  Q3 N2 A

- ]# R( g' q8 Z) X  B6 f. I# a/ G) ~(4)选择时钟源
& t8 z; ^7 m, G3 g& ], `7 l6 W0 d) W8 n(1)因为开发板上有8M外部时钟,此处选择外部高速时钟(HSE)。+ Z. H  g! {- E' Y
(2)因为我们没有用到外部低速时钟(LSE),此处不做处理。, e0 ?% s/ j5 C) J& U. H

" n6 @: |/ q+ P: g& D& V9 ~
72119b971f62410fa8344f7f9fb9f389.png
5 v# }% e5 y5 K- n

) a1 X$ G% k1 _/ v. D9 ~: h2、配置GPIO控制LED
4 z- B" {  z% E, n/ a7 z) m- h1 j# N
备注:LED灯用来指示系统是否正常工作。( L. v" c) n9 f; V  ^' \$ R  p
(1)查STM32L431RCT6开发板原理图得LED1控制引脚为PC0,则配置GPIO的引脚PC0。
2 ^- @' \; H! N7 b5 m7 M鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
6 u$ |" d) h7 c+ Y6 [2 y; i- c7 P. d: f6 @2 g% D" v3 G" ~
492907c1e71149819adbaee4516a2af4.png
/ g* O# p" n  f6 o* p, Q( _- D; V% s, }- W9 @) b9 L
(2)根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。" g% r2 Z" E# I, n, f9 u
. N! D/ L+ b  P8 o- K! j
38ff4b80e1c5495ba3076a5158fd91fa.png 8 [1 Z. a5 ^7 Z/ A% a

( g/ i5 Z+ q* \! x3、设置串口1参数
4 r; D  P# @4 ^
1、查原理图得知,串口0使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:: V( W' i' Z$ H0 F; E

7 k. V! \& `& u, A
497b8ee0243e446784e64a3c31e8a26f.png ! I. |  J( z; _' n5 C9 \

5 k3 [+ i5 x! ~; ?+ s" ?; N$ p7 P (1)序号1用来设置串口收发引脚的选择。
; C+ U& R+ O' n& f/ W) g- |+ I(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。  Y2 P, ^- s! ]' o/ Z% \

) p2 W5 y1 t0 k" P% { 4、配置项目工程参数
0 A0 T5 }4 d9 d1 H! c+ T, q(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。) x6 s5 E- A4 N( w$ ~. _3 O

$ r- H8 h1 g8 T
2ce1933c10484d819234682f4abc0228.png 0 q- r0 y+ D, O& T
9 i( R6 t7 o5 _) g  B. S& Y$ T
(2)完成配置工程。
2 `/ Y; i( s. R7 h: f: t备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)! T! d% W5 b6 H4 F; x

, _. e, j3 V' E9 D
efdb616174f54925b6eac31109f227b5.png + l$ `" @+ L& W& c" H- p, z
8 n, l* o) r8 \) w0 L
41c3f2716e4e4eda8f62fa3a1d871322.png
8 f3 X$ n5 N) ?: l* i0 v
9 n8 v3 R: U" F2 j" D(3)生成代码。0 ?% N! w) Q. V( p
- k5 S% [$ y1 A' y6 K
8eaa7d0babea40ee93f158481a6ee471.png 6 t$ R) E, M- C5 ~8 b
% d" ~/ L% ?0 {( b  t* _( r$ S  @
三、在KEIL 5中编写代码
* V% I9 |8 b3 B: G5 z$ I+ t( H1、使用KEIL 5(MDK)打开项目工程文件
. n% X$ ]2 l9 X) X. n2 V% ~' ~
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程。
2 W8 T' W, r% V; S4 l
- e1 Z* ~4 _5 W+ ?1 R' W
0d697d3d06664ba397f843687e19dc1f.png # ~* ?# r" d6 H& `, {7 T  j2 N

3 r; L. |5 d# t6 ?; p: u# P(2)添加每隔500ms,LED1闪烁一次的系统提示,用于提示程序运行正常。: U5 Q, ]: \7 z5 K
9 G- p3 k# F' N/ o) g  c  t
6ab72ceaeb7a41af833842fe5ba6f34d.png $ K& i( L) M/ w3 U- X5 l# i* `
/ @; r- z( E2 Y3 p- n7 p
5 F& `- o* E7 D2 Z5 ~  l9 E; E; y
2、添加使用printf函数打印log的代码4 y8 n0 D3 |" H( h  Y
(1)在项目选项中勾选Use Micro LIB选项,勾选该项目后,可以正常使用基本的C语言库。* \7 k. f; f/ F

1 B' O. [. [! I5 w
3db54bee7a3e4fb78ecb85f0c26ece57.png
- f& z" n2 V& G6 L, I+ ~9 l8 O  `; R& G/ _5 z' h
(2)printf函数会调用fputs函数,fputs函数为弱定义函数,即使用__weak修饰符修饰的函数,可通过自己编写函数定义覆盖原定义,我们在此处重写fputs函数。在usart.c中添加如下代码。
  ?$ r7 R" \1 A+ A5 E
) [& c( O; Q2 f. o8 N
备注:开发者自己的代码需要注意添加位置,一定要放置到一对《USER CODE BEGIN和USER CODE END》之间,避免重新生成工程后被覆盖。  n+ P6 X$ }* z# E$ K$ C
3 y, R! q$ a1 A; @# f, g8 g
607544c9bb2b4ca995be69d71d763526.png - z6 y( u3 h! J/ c- X+ E. N$ P( u$ j( Q
' Z5 ?9 [5 Z2 k+ x; q' q/ I
代码段如下:可直接复制使用。3 U% C7 e* h# f2 h/ K
  1. /* USER CODE BEGIN 1 */
    7 P/ j% I7 c; ~
  2. , m  V( P8 e0 R1 |0 [$ n/ x& S# z; q
  3. #include <stdio.h>( {% e, V) K$ `; I$ M% S, i
  4. #ifdef __GNUC__* M; n- w& j' \: _+ P' M; D
  5.         #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)3 M/ ~2 l  r, P' ?: }
  6. #else
    1 w: X) L+ u7 P, n! `. @
  7.         #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    / J+ d- U: m5 F# z
  8. #endif
    9 i* ^; y9 p8 H
  9. PUTCHAR_PROTOTYPE
    ) j2 V/ f" p8 p, q
  10. {
    ! V! u+ R& A# ~: \3 r
  11.                 HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
    # m2 {- @  u- F% B# L' |
  12.                 return ch;
    0 M5 g" d0 |' {$ b
  13. }
    : }+ a; R$ x9 p+ [6 t* N

  14. % J  Q6 _2 O* k6 A, }

  15. 8 X5 U8 a$ c7 V  I. r2 G
  16. /* USER CODE END 1 */
复制代码

3 u6 N. I1 S) H# v% l(3)使用printf打印log数据。需要注意main.c位置添加"stdio.h"头文件(printf的函数声明头文件)。0 r8 Z, u, c- X$ d& v( q

9 H8 d" e9 W' t+ P2 T0 ~9 o
ad684ef90b44425198d2cd6b046d6d5b.png
6 X) {2 C  y, j9 r! l; ~1 H; ~, T. i
& y9 X! z; m9 {. b, p. N
* R% J" d- b6 O3 J. r, Y% A/ G
  1. printf("hello world,this is printf function!\r\n");   //printf 打印函数
复制代码
% Z$ Y: m) U& K& o1 J6 d- g+ }, v& s; M% T
/ d. ~  H' G  m; M
3、设置编程仿真下载模式

) ]' P3 V% q/ _* M+ b+ s: c(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
. M4 C1 J3 S4 u) h
3 b2 W5 q/ m8 c. `
edefb6b9a2a14be3b1221ad6d5c7a8a2.png
& w1 D3 _) k7 D
5 f- L) }0 j* @6 ~8 k* F(2)点击Download(或者快捷键F8),即可下载程序。
( d- H5 y! _: X; ?# N5 ~% J. J0 o$ [& \3 K9 T* |' b4 I
ba221842d5db40808aa129dd83c593d0.png : `( B# }, X$ Q. A$ U5 [9 D

4 ]5 V7 y0 Y2 c3 w2 }8 ]8 T
$ c5 h/ ^; M5 M3 w
(3) 如果下载程序后,没有看到LED1灯闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。: n. L/ j1 P" w! r
% P4 R( u; m( Q$ U) b
9f8aa1a4e8f04041bcf5cb183facd100.png
& M# h) C' [. q  T" U 7 l) Q  T0 }4 D# b( r

8 {) U! M; N5 g, P  S7 c* R4、查看串口printf函数打印log效果

) J0 _5 \3 j- r(1)设置串口助手参数为:115200、NONE、8、 1(和代码中串口初始化参数一致)。
, M' A% E0 ?: `1 X! ~(2)设置成功后,就可以看到串口打印的效果。每隔500ms闪烁LED1指示灯一次,且串口输出一个log。
0 H" K: N, t: ^( C
+ a) m' B6 R3 b. ^
5d514f8d3f3f479abeba35cf6e75e92d.png - @6 {2 K, R# j

) D: w+ R; {9 o; B) O& B————————————————
6 M0 E  f- _$ y% Y版权声明:智能小屋ZYXC
3 s. r2 H, b8 }7 F; I
/ a/ p8 Q2 O9 z* Q1 Q+ H3 V7 W
赞 收藏 评论0 发布时间:2023-1-15 00:07

举报

0个回答

所属标签

相似技术帖

官网相关资源

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