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

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

[复制链接]
STMCU小助手 发布时间:2023-1-15 00:07
一、开发板平台简介:3 I  _8 C% I2 S
1、开发板资源简介

& I% Q7 Z% E$ E5 e: O" A5 N(1)开发板主芯片型号:STM32L431RCT69 E  ~+ n1 w- F% o" ^
(2)开发板主芯片封装:LQFP-64_10x10x05P; _/ V+ j* l" @' ]
(3)开发板主芯片内核:ARM® Cortex®-M4
- I* h8 I# }% h* P(4)开发板主芯片主频:80MHz2 a- _7 Z$ y( g1 v7 D4 u
(5)开发板主芯片Flash大小:256KB
! u2 Z3 \( X% E$ z% Q: c(6)开发板主芯片RAM大小:64KB
+ w3 {. d: G% v9 A* _ (7)其他外设:请参考芯片手册/ a' y* h! @7 q  _0 y1 R% l

$ q& ?' _8 b5 U1 J' h
bb91345227434ee7a43a34bf3fe366e6.png 8 p# |" K% r# h6 I- d3 w) C

( b* x, d6 d. U
929c0cce04aa4115a8623703982bf3e1.png
( b" u& s7 R" K( T+ B. m! {, T  y
! s5 G. \/ ]) f1 c" R( L2、串口简介
8 U7 b4 C8 s) l# G% R  I         串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。
# f  D( Z: b2 H6 ?: c& ?  o
5 |' z' g: \0 V. g$ b# I1 U        (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也试验该串口1进行。& R- m3 W0 T$ w, }! W; V
; v' I  i: r4 t  _# x$ k8 s% {2 K
        (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。
% t; j0 \- Q+ T, H) E/ \. n2 o5 W
, u) _: l3 j' E" L) I
  二、新建工程
, V! J8 p  r2 u! t) o8 r5 d1、新建STM32CubeMX基础工程

7 i4 b1 D9 U- ?. F+ L(1)打开STM32CubeMX,点击“File”-->"New Project"8 t. K: ^6 {, A8 t, B3 Y/ K7 l
6 d- c9 J( W! W, c3 `0 W/ H
2399170347904e959c855fefd5877f84.png 6 s/ u! H5 ~% O2 G

; M: Z8 r( I. q(2)等待打开主芯片选项界面(大约1分钟时间)。
: J3 R. g. D! j' e$ R' d* Q! F" n* e0 W
d74d2fdc60c9440483e2b7cf8d928e7f.png
# W$ ~; P) V/ v" ]/ n- A3 P) J7 ^9 \7 W) z
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处现在STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
' _: N. r- Y  @& r9 g7 M
( z. x* m$ o; i
7b80345238d74bea82ce70e1a348f7b4.png
1 K8 ^" p$ [* n% O5 y, |" O/ t& z

- a% O" r& d5 ](4)选择时钟源) L! {1 h6 [" d" _
(1)因为开发板上有8M外部时钟,此处选择外部高速时钟(HSE)。  A/ B, c# a6 r+ I
(2)因为我们没有用到外部低速时钟(LSE),此处不做处理。+ D* J. J% g* }9 Y+ `
% }: S) G+ u1 s. ~' E1 u
72119b971f62410fa8344f7f9fb9f389.png / \$ V5 L, N6 |% ~) g9 {

) X1 ^, A8 Z9 `2、配置GPIO控制LED

" V/ y+ [# [% l2 X. m2 Z0 g备注:LED灯用来指示系统是否正常工作。5 j( k6 ]/ B/ }9 t/ M9 q  s
(1)查STM32L431RCT6开发板原理图得LED1控制引脚为PC0,则配置GPIO的引脚PC0。. C4 y$ [, v' R" b: s6 q( N
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。( _$ L, U$ z8 j% u: l
! q/ ?7 |$ [5 I6 d8 U9 C# O
492907c1e71149819adbaee4516a2af4.png
7 e. d' V: X8 t/ p0 [/ \
' n9 y5 I! x! V% P/ [" i# X( _(2)根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。
8 X& S' P! {" G: Z8 g9 t5 E, ^/ |1 U9 j. E0 m
38ff4b80e1c5495ba3076a5158fd91fa.png
3 o& k6 s8 {4 V  _, g' p

8 W, W5 t6 S2 d+ g( s+ g" {; B6 M3、设置串口1参数
0 G( k# B& ~3 R- ]  Z* Z5 \% H" u3 _
1、查原理图得知,串口0使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:
0 w$ i& X5 B; h/ k; }" S$ j$ F
0 _- \2 _8 K* e9 H$ z5 Y8 [' B4 ~/ `
497b8ee0243e446784e64a3c31e8a26f.png ; A  |* c$ L3 V" Y# `  F$ A$ E

# o7 j8 l9 v/ p( @5 p (1)序号1用来设置串口收发引脚的选择。
6 x: L, M8 Z7 F- M" i5 J(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
$ Z1 D  L4 F6 S# g' W. d4 S  @: e' L$ E% r; b# V8 p0 Y! q
4、配置项目工程参数
7 ?! t! _2 n0 B7 o: c(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。/ q1 e% ?/ q) R8 n" P

5 Z% I/ ^4 c" j) V& |: V" W0 B
2ce1933c10484d819234682f4abc0228.png + Z1 d& a$ d7 h' I6 r: O3 m

  h, ~' b  [, n$ E) n; u! l5 a(2)完成配置工程。
# w8 O2 @* M) ~1 Z! t备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)7 S/ K5 D7 U+ P6 I
1 e' v/ k8 m0 g. R, K" [5 r
efdb616174f54925b6eac31109f227b5.png 0 e1 Y# |: g0 m1 G! L" }% B- K
% }, C8 w% h& e" o( I5 w9 I
41c3f2716e4e4eda8f62fa3a1d871322.png " y! u$ Z* ]' K

: C: S- j4 H# K, x(3)生成代码。
( D7 m/ t9 w. b# f
+ a/ e" {, M5 j6 l
8eaa7d0babea40ee93f158481a6ee471.png
; _% x: R2 Q; c% E  ]
% A8 M3 Y' Q1 F8 |
三、在KEIL 5中编写代码
5 N+ @" B4 p- b$ [1、使用KEIL 5(MDK)打开项目工程文件

7 L/ G- ^+ u$ M- ](1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程。
! K( i& d9 ~; }6 x8 g
! V' M- f; |( n; P& P0 G( L1 j
0d697d3d06664ba397f843687e19dc1f.png : F3 ~" x% [  Z" N
5 F" n- D3 S! @5 L' ?2 @$ h
(2)添加每隔500ms,LED1闪烁一次的系统提示,用于提示程序运行正常。
# Y# L+ Q- A) X/ b$ F
1 g  r- ]! i5 ^' w- }1 l
6ab72ceaeb7a41af833842fe5ba6f34d.png
+ b2 D0 @: s0 _3 ~
9 J! N$ h# {+ d2 L/ Q1 N9 I
$ o$ i& G  F- S1 k. j
2、添加使用printf函数打印log的代码
+ E8 m% c0 a1 e! N(1)在项目选项中勾选Use Micro LIB选项,勾选该项目后,可以正常使用基本的C语言库。4 s! @+ G5 z! b
$ E2 k3 o- H2 |$ T2 @$ r' E3 n
3db54bee7a3e4fb78ecb85f0c26ece57.png
% l7 x  c. T% L  k: H4 [
: W  [  @4 F1 E, {" \- ](2)printf函数会调用fputs函数,fputs函数为弱定义函数,即使用__weak修饰符修饰的函数,可通过自己编写函数定义覆盖原定义,我们在此处重写fputs函数。在usart.c中添加如下代码。0 d  L2 k/ _- u

% P/ r5 w) P2 B9 n4 X- i备注:开发者自己的代码需要注意添加位置,一定要放置到一对《USER CODE BEGIN和USER CODE END》之间,避免重新生成工程后被覆盖。( u0 [( k. J3 j( y" M: z$ K
* z/ j3 i) y9 T: D, T
607544c9bb2b4ca995be69d71d763526.png 9 p9 d7 T/ i, {! |

6 s1 |, s" L8 @( b# X2 Y& G: _ 代码段如下:可直接复制使用。! W. M1 D2 T3 ~( L
  1. /* USER CODE BEGIN 1 */. o2 ]; {1 g/ \/ _: J2 u9 i+ y
  2. , P7 Z6 c1 c7 Q, s) G) J
  3. #include <stdio.h>
    : `) t2 Y& }' [1 W4 v3 x, b
  4. #ifdef __GNUC__* v- n$ i+ R! b0 P
  5.         #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    - ]  l  ]3 R- a# U5 B  k. \+ M, q1 a
  6. #else6 P5 ^2 E5 V) {' w4 b
  7.         #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    / _7 W! [8 q  D; O
  8. #endif
    7 f0 F: f. D! Y/ n) @7 z4 q
  9. PUTCHAR_PROTOTYPE! l; u; u! N5 r8 C: A" @- L
  10. {5 l! E+ Z1 w$ H. k: p
  11.                 HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);- R/ ^# A2 |3 Q( L3 F% X2 W5 H9 S
  12.                 return ch;
    5 \% i) P( t; m, n# l0 ^4 z
  13. }& z' F% m5 X& R

  14. 4 C2 u( o- T2 Y; R% i

  15. : n' d; B$ O# ?; _# v, F* Y
  16. /* USER CODE END 1 */
复制代码
7 {6 x7 x* t/ i
(3)使用printf打印log数据。需要注意main.c位置添加"stdio.h"头文件(printf的函数声明头文件)。
. i0 s: S5 |5 f$ N" I  Z! _4 I
/ Q3 o6 y1 t1 }, G/ j7 f' O
ad684ef90b44425198d2cd6b046d6d5b.png 9 X/ i$ h+ I5 ~; u8 L" f

& q# i$ D2 v1 G- \: S3 N! `6 r
! {; R4 V. T) l$ {" E6 M
  1. printf("hello world,this is printf function!\r\n");   //printf 打印函数
复制代码

- E( ?% d6 B/ K6 s1 U* K" F
/ w, L3 m9 J$ n- y! k7 H  A3 s4 f* M
3、设置编程仿真下载模式

" q- w% s/ [! W2 ^3 J$ s: c( G$ l(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。7 D$ f% b, o3 z# X* M

' D, v4 O0 B4 c' i! ^: H% \
edefb6b9a2a14be3b1221ad6d5c7a8a2.png
( T. {4 B5 x+ r4 K5 C& ?' ?* B6 d5 |; A$ o+ l6 o2 O1 ]: P2 x
(2)点击Download(或者快捷键F8),即可下载程序。
9 f8 Z* E( \5 C6 O+ }* [
) N& d7 z# M3 [
ba221842d5db40808aa129dd83c593d0.png
+ ^( f" m; e6 X) W% F( X; x. x
$ R. b' {6 t* I$ ^3 u0 x. r% ^0 H
4 l! j  A: l2 V1 I, l) P
(3) 如果下载程序后,没有看到LED1灯闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
% h' a/ J8 M9 [) Q# Y4 b# w: F: [: z1 D1 s& ?# Q7 p) b
9f8aa1a4e8f04041bcf5cb183facd100.png
/ A! }; P- o+ R8 Y7 y
  \, Y& B0 Z, F# E6 ?2 ~1 X( o" M% _( p6 K7 x; q' \6 |
4、查看串口printf函数打印log效果
5 z% n& ]& `5 Z4 P
(1)设置串口助手参数为:115200、NONE、8、 1(和代码中串口初始化参数一致)。3 K- i- B, w0 x" q8 K9 O
(2)设置成功后,就可以看到串口打印的效果。每隔500ms闪烁LED1指示灯一次,且串口输出一个log。
" v# p+ g7 J0 y: t- ]* M) `/ U% [  Q) D$ [2 l; o
5d514f8d3f3f479abeba35cf6e75e92d.png
4 j9 j8 y; u0 V% @
3 @4 F  Y4 a" Q4 ]( D1 d' u————————————————
5 w. e- A+ x' w% g" F1 \6 p版权声明:智能小屋ZYXC9 J! l+ u- [* |5 K
7 F6 v7 y! e2 U
收藏 评论0 发布时间:2023-1-15 00:07

举报

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