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

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

[复制链接]
STMCU小助手 发布时间:2023-1-15 00:07
一、开发板平台简介:
; R1 {- O0 W+ `1、开发板资源简介

( k( p+ v: q# W  C: H2 j5 `(1)开发板主芯片型号:STM32L431RCT6
! V! \6 C) Q! `! t) \(2)开发板主芯片封装:LQFP-64_10x10x05P8 |$ L* g1 ?: ?, R! w, I2 B
(3)开发板主芯片内核:ARM® Cortex®-M4. R! Q8 w5 ^, x0 S/ R5 ]
(4)开发板主芯片主频:80MHz% @( w+ W5 N  V/ E& c
(5)开发板主芯片Flash大小:256KB
; M% X# L+ _/ B4 L) O) @" L(6)开发板主芯片RAM大小:64KB
  p# Y1 |) f. Z# r$ U& p (7)其他外设:请参考芯片手册: W6 @* e' L3 ~/ j# p
9 r# N' w+ w8 J+ J- f
bb91345227434ee7a43a34bf3fe366e6.png / n& }% u6 z% F4 h
( q% ~6 h) C6 u; c
929c0cce04aa4115a8623703982bf3e1.png - J- H$ l5 U- x, o$ E2 E
8 b9 ~* q" v* G: b/ l6 I
2、串口简介* n4 f% F" i# T
         串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。
1 q1 E2 z3 l- h) V6 Y% v" ~6 M+ }8 H/ }6 I7 A
        (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也试验该串口1进行。0 [- L" R) Q0 z: c) a

: E1 v2 l9 Y4 M- ?; x        (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。
) `. o- o) o) `+ u
+ I; X. A1 n& g9 S* Y0 F+ n, U
4 @% |* k& s: T$ Q" g4 c
  二、新建工程' T1 ~% y& U8 E& _" k- G8 b8 M
1、新建STM32CubeMX基础工程

& @+ |* Y, G/ S- ?(1)打开STM32CubeMX,点击“File”-->"New Project"9 T3 ?& }) O5 f* b
( t$ e( }; V; {( k4 q! L+ m
2399170347904e959c855fefd5877f84.png " @( ~8 O& ?4 [, ?5 J
& R% ]- c6 F& p: B8 u2 V, P) B5 n/ b
(2)等待打开主芯片选项界面(大约1分钟时间)。
* k8 B) M% M: F  L# M5 m6 E. v5 R  r0 g2 P% @$ Y& i! w( `/ o6 p$ ?
d74d2fdc60c9440483e2b7cf8d928e7f.png 0 s. z% D$ t. ]. `2 ~' @0 s
/ }) S' d! E( _7 F+ J$ e& R& M6 X
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处现在STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。( \5 q- }" J5 W; ]/ D* f3 _7 i

2 V+ r( E5 t# d( m
7b80345238d74bea82ce70e1a348f7b4.png
! z  L4 t) R) x' N9 U+ p

6 K4 ?. w* t, B# z: ]! @7 l3 A(4)选择时钟源
  i, M% n, F5 q9 ~0 W' C(1)因为开发板上有8M外部时钟,此处选择外部高速时钟(HSE)。5 L' |" C' C" F
(2)因为我们没有用到外部低速时钟(LSE),此处不做处理。
$ x  H& m# F; J% ]$ @2 x' I+ q& h; b
72119b971f62410fa8344f7f9fb9f389.png : g& @) T: S2 r, h7 b

# O- f9 g# V! n3 E2 V" P$ N: L5 a2、配置GPIO控制LED

* u$ r' w3 S* {8 r备注:LED灯用来指示系统是否正常工作。
# J; Y0 I) p9 `(1)查STM32L431RCT6开发板原理图得LED1控制引脚为PC0,则配置GPIO的引脚PC0。
# U: F1 F. i+ U$ q鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。8 I( @8 q7 k; l$ J$ `( G2 A9 `* ]
) K: ]. d7 Z2 q0 o) f5 t4 c
492907c1e71149819adbaee4516a2af4.png
; E6 R9 U( a' @; W4 ?
( S# ^% u; _- H- `: B1 S% }(2)根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。8 `, U9 y7 H1 Z- x/ w* Z
3 ?- u7 z( v' N+ f
38ff4b80e1c5495ba3076a5158fd91fa.png - U; D: X7 v5 `5 ^. U$ [

! L9 `) \% c! g0 S3、设置串口1参数
# g' C1 K, {4 _' {
1、查原理图得知,串口0使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:" I( U2 v7 S1 q8 s; y( g

# e$ v! B7 q1 P% t. |/ Y$ w* A+ X2 F
497b8ee0243e446784e64a3c31e8a26f.png
; y" @4 c3 V# W3 M5 u0 w2 E5 o7 I: p. W: t. ~$ v
(1)序号1用来设置串口收发引脚的选择。% C1 B. P2 ?. |, ]+ L) c% m
(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。  ]/ d  Y* O' E9 j2 r9 \
) n! N1 Z: y) D# P. M3 j; @5 B
4、配置项目工程参数
$ }! r" N8 ~% d" B(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。
  J* J3 L( q% e8 u3 ]7 k. V3 R9 H+ `- _" a4 K: g0 q5 J& U! z
2ce1933c10484d819234682f4abc0228.png
/ G' {6 y9 o. d2 {
" u. d& Y9 ]/ k2 E(2)完成配置工程。
- B- }( Z, U2 r: ~$ h. Y. a+ W备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
9 ^/ J0 j7 _. i- \$ j" f0 D8 d+ ^0 y0 m( q8 g5 J
efdb616174f54925b6eac31109f227b5.png
  @3 e7 M2 b- H5 N
4 I# s- \. U2 y1 X& T. w
41c3f2716e4e4eda8f62fa3a1d871322.png
8 U- T! N+ E, f6 w9 X7 ^. k9 [4 h9 t4 [( t
(3)生成代码。
5 g) h2 u/ @; F6 ^& Y
6 J. q, T* c- h4 Q3 T7 x3 G9 L) @3 F
8eaa7d0babea40ee93f158481a6ee471.png
* J1 W) p; }6 y+ Q4 w
0 M" V. l* |/ Z: p, k
三、在KEIL 5中编写代码
3 c3 N9 v; g  v1、使用KEIL 5(MDK)打开项目工程文件
" _* j  _6 n2 R1 |! w
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程。
/ A, A) W1 H$ I$ t9 R$ z( d: ~* U) J
  L" Q$ n+ `& K% w, ^
0d697d3d06664ba397f843687e19dc1f.png * ]" ^$ [% q/ J- l; {3 s, ]- v
1 x7 M: b1 a4 }  ~0 S
(2)添加每隔500ms,LED1闪烁一次的系统提示,用于提示程序运行正常。
) n2 {( \& w. p9 e7 n( E0 \5 E5 d1 A: x2 k8 f8 A; Q
6ab72ceaeb7a41af833842fe5ba6f34d.png
! Q. i5 G: h9 M% E9 S9 f0 L5 f1 [. \

. `- e4 ^6 o) o6 a( ?1 \2、添加使用printf函数打印log的代码
2 Q' D! ?- @  \. E7 T(1)在项目选项中勾选Use Micro LIB选项,勾选该项目后,可以正常使用基本的C语言库。+ _4 D9 M- S% T$ N& m
% {2 Z9 Y# C$ ]7 \" D: K
3db54bee7a3e4fb78ecb85f0c26ece57.png
/ ~4 X( w0 k3 |- E3 W: q5 \
$ B+ Q6 ^$ z. k% a2 T, X(2)printf函数会调用fputs函数,fputs函数为弱定义函数,即使用__weak修饰符修饰的函数,可通过自己编写函数定义覆盖原定义,我们在此处重写fputs函数。在usart.c中添加如下代码。9 ^+ o* W  {1 n$ s/ Z
- J& A$ g; D8 j
备注:开发者自己的代码需要注意添加位置,一定要放置到一对《USER CODE BEGIN和USER CODE END》之间,避免重新生成工程后被覆盖。3 @% h$ J9 o4 e( N$ B. O7 d; t$ j
9 ]% q! v% p3 \7 {. {% r# P& ?
607544c9bb2b4ca995be69d71d763526.png # t8 l  s5 Z7 w# ?6 v0 ]* u2 |6 w2 R

, f& p( w6 X" Y4 f" e5 L 代码段如下:可直接复制使用。
/ F/ x, @) B; k& C) b' D0 L
  1. /* USER CODE BEGIN 1 */
    1 w# K! O* r* \$ x9 k  T4 B! j9 m  h

  2. - a' H0 Y' v3 |& s+ w
  3. #include <stdio.h>% M! L: Q% F8 Y# ]) _. }3 W
  4. #ifdef __GNUC__
    ) |4 S( E0 X7 b$ R- u- ^6 p( n! K! @
  5.         #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    5 x# _  l! G5 s3 o: u1 u
  6. #else
    9 f. O) O. q# n) c
  7.         #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)( z8 [' v, [& K  r$ _2 ?; y
  8. #endif
    $ ~1 h' V) z" w
  9. PUTCHAR_PROTOTYPE
    3 ]+ Z; \% ~- D
  10. {
    : n# X& g$ g" {9 {, s
  11.                 HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
    * K1 i, c2 C! t& d. i
  12.                 return ch;
    1 O* E* A% y, u& n& W+ e
  13. }) y1 X/ v* w/ P# _
  14.   H0 X6 G5 w/ P1 T! O9 u

  15. 8 M3 B9 N4 e8 t1 E. \1 `
  16. /* USER CODE END 1 */
复制代码

2 w1 }6 N; U" H6 L$ L9 T5 n$ K(3)使用printf打印log数据。需要注意main.c位置添加"stdio.h"头文件(printf的函数声明头文件)。
1 p9 z" h$ X- G
8 y) N) S- c; L9 d6 q
ad684ef90b44425198d2cd6b046d6d5b.png 6 G3 y& a1 c4 h  F, m
8 s+ L5 A* s9 X" y

! I3 }; z3 [6 \4 A5 B# x/ q! o
  1. printf("hello world,this is printf function!\r\n");   //printf 打印函数
复制代码
" N, C2 D; m/ S! r

9 G+ s3 F9 w* ?. j 3、设置编程仿真下载模式
3 _" Q, ~  ^( ?$ d  G
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。. D9 Y2 H$ Z" A# k
9 A3 j' ?% V# L0 B! {" ~
edefb6b9a2a14be3b1221ad6d5c7a8a2.png , c& W* k( m' N8 ^- z7 x4 Y8 Z

: p: ]6 F; L! O* s  s, O/ y(2)点击Download(或者快捷键F8),即可下载程序。
* h. s, l9 r9 D2 M! `9 p; s, @/ n1 ~" L2 Z
ba221842d5db40808aa129dd83c593d0.png . d( d% [) I; o# T' [5 I
4 {4 |  \1 ~; N) P" o0 M
: u' R! d* X7 d" ~7 u$ }* a, Z
(3) 如果下载程序后,没有看到LED1灯闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。4 ?# }" c* _! M/ g

# M) f7 b/ ^% X1 b6 a1 h
9f8aa1a4e8f04041bcf5cb183facd100.png
0 n* ?# T) T9 \# i
* u" _# N% p6 F4 m. N1 q- r9 J6 d4 O9 z7 l! g
4、查看串口printf函数打印log效果
) I$ s4 h7 z# {, H  K/ L0 }0 L
(1)设置串口助手参数为:115200、NONE、8、 1(和代码中串口初始化参数一致)。
8 n+ z% {  i8 r3 `(2)设置成功后,就可以看到串口打印的效果。每隔500ms闪烁LED1指示灯一次,且串口输出一个log。7 u3 @3 D+ T( d; p

. y0 h* I& Q4 b6 j* T( ~8 T' Q+ F( N
5d514f8d3f3f479abeba35cf6e75e92d.png
( I- g6 D0 Y6 t1 A! \1 F/ n; k- K* S# `
————————————————
/ c5 e& e$ N# H: `0 E! ]版权声明:智能小屋ZYXC/ m, ~) {& A2 ^  ^

; z: j) Z! D6 _" J; F- _* Y
收藏 评论0 发布时间:2023-1-15 00:07

举报

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