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

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

[复制链接]
STMCU小助手 发布时间:2023-1-15 00:07
一、开发板平台简介:
4 t( I/ t$ ^& \; V, T1、开发板资源简介
9 O! S$ ~" a0 a1 V4 o
(1)开发板主芯片型号:STM32L431RCT60 o- \2 q% u- y; _8 I0 W+ @
(2)开发板主芯片封装:LQFP-64_10x10x05P
1 }5 o' d( @. B- O0 Y* C5 D(3)开发板主芯片内核:ARM® Cortex®-M40 K6 E& Y* a3 K' J: Z  n1 N
(4)开发板主芯片主频:80MHz0 \9 u" m7 r- M" x) T6 n
(5)开发板主芯片Flash大小:256KB
" T1 F* G$ `: S/ I. \: t% T! @  i(6)开发板主芯片RAM大小:64KB- f) z7 V, e, Z/ `2 ?  M
(7)其他外设:请参考芯片手册/ Q% N! P8 _; y; L' n
7 s+ x# r& L: L7 i% r* ~" }
bb91345227434ee7a43a34bf3fe366e6.png
7 {: S5 W, X! d) c2 q  w5 c' L/ X, P; |9 C& v* F, {
929c0cce04aa4115a8623703982bf3e1.png
) y. t9 X4 i. J( K
/ r' ]. r; x  d- W& h2、串口简介( z  |- ^+ W7 Q+ H2 T
         串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。% O( M% t3 j9 W" {+ o/ O& I
0 ]/ r+ \$ m8 d8 Y" X
        (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也试验该串口1进行。
; T' z# I) w* {. n
- \  ?7 k7 w- c4 S
        (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。6 v( l; M2 |2 \% m

1 V6 U; @; z7 ]% m! Y% A
2 Y4 O7 ?! O  S% ]" w! A8 ^; ]( |
  二、新建工程
. J) \* L0 O% k. }1、新建STM32CubeMX基础工程

5 f$ r. V# |2 I6 r( o8 v(1)打开STM32CubeMX,点击“File”-->"New Project"( X7 f: M6 L( t( I5 K
& ^6 {" R! S+ Y( l7 f0 c) \
2399170347904e959c855fefd5877f84.png
; ^; j7 l2 y; z( x2 w  Q

& a) w$ W/ f, g/ ~(2)等待打开主芯片选项界面(大约1分钟时间)。
  y8 q  z, t  T/ F* l2 |5 R& J7 u& Y6 e
d74d2fdc60c9440483e2b7cf8d928e7f.png
# _" L. ]) v% `) I" K
0 e/ `  \5 k9 T# ~: W(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处现在STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
0 S, T+ @2 z- ~3 I% P$ ^" Z  z8 Z; l1 a2 e
7b80345238d74bea82ce70e1a348f7b4.png
; Y7 _9 U$ o* {) |- ?' j
8 X  C, Z( j1 l/ b) {* L% s
(4)选择时钟源; ?- u' j$ M$ F+ k& X# B
(1)因为开发板上有8M外部时钟,此处选择外部高速时钟(HSE)。
" b, O) E9 P: ~2 M) t+ L6 U(2)因为我们没有用到外部低速时钟(LSE),此处不做处理。/ z, @( U0 N1 H5 D) v6 P

+ R8 S; L/ Z: q  t) ]$ G
72119b971f62410fa8344f7f9fb9f389.png , i9 s& _5 V% O5 ?2 @

( z$ I) T3 I9 x. S% g1 c' G2、配置GPIO控制LED

: m9 q: S' ?) v' ^7 e/ A备注:LED灯用来指示系统是否正常工作。
/ j0 z, J. O. A/ z(1)查STM32L431RCT6开发板原理图得LED1控制引脚为PC0,则配置GPIO的引脚PC0。. Y! [* W4 J  ?) n
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
& r) s% z/ p  y, d# t* V& N5 G+ N1 g' P( q: |! _3 M
492907c1e71149819adbaee4516a2af4.png / `" h) W4 k6 K  l

; h% c, c7 K6 D# d# t(2)根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。1 c. X& w/ }; Z& c7 P6 a  \
6 Q1 U" L. w2 q! y% p
38ff4b80e1c5495ba3076a5158fd91fa.png
/ Q4 `) H( e1 @$ c; v4 f

: j* D8 C; |$ N* g3、设置串口1参数
/ K0 z: q8 }. [, P" D
1、查原理图得知,串口0使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:! d4 T' e) M- A

' a; T) r2 d3 @. ]4 u6 z
497b8ee0243e446784e64a3c31e8a26f.png
$ e. H/ q0 c, r, @: N! y8 L" d0 \& d! E+ T, k: v, m) e  H( H
(1)序号1用来设置串口收发引脚的选择。
7 a$ s2 c) b/ N9 _, ]) Q(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。( w9 V! @7 h3 M' t6 t

' O  e( n5 T1 o+ m9 S  R+ { 4、配置项目工程参数
7 H- X+ v4 i  T(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。" T% v0 R) k2 j) L* l" [4 Y
& b) A& u9 B: D$ [, ?
2ce1933c10484d819234682f4abc0228.png
4 ]5 U9 b2 `0 U: x9 T% ~/ _7 e1 p" g' m
(2)完成配置工程。
5 o4 E: R+ ^3 n备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
3 _/ |* m# W, [0 Q
8 j: N0 ?1 v/ n1 ^3 n
efdb616174f54925b6eac31109f227b5.png   _1 l+ z. G' h3 K
" ^3 l" d. o. A& e- u" {
41c3f2716e4e4eda8f62fa3a1d871322.png
" v8 `5 F6 s9 t& L5 E
3 P; j0 w, \7 x' o(3)生成代码。
8 |7 g( b) o, b/ `
, g2 U0 U) t, Q- }7 Y9 C
8eaa7d0babea40ee93f158481a6ee471.png ) Z* s' K! U' `: s; e
+ J/ K) L- P# {! _! Z7 Y0 g: l
三、在KEIL 5中编写代码
( Z' r4 @- N/ j/ S( b1 \1、使用KEIL 5(MDK)打开项目工程文件
, q2 r& X5 V. ^6 i
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程。: ~  T( p& x$ N* y
, l1 L; V+ f* ?
0d697d3d06664ba397f843687e19dc1f.png - {! U( M! `: A( j8 e6 V, {5 `. W
5 u) e3 U# }* ]  A# U; z3 m
(2)添加每隔500ms,LED1闪烁一次的系统提示,用于提示程序运行正常。. G3 a8 Z% a2 Z) x% e& w
9 n) }! p( P2 W& L
6ab72ceaeb7a41af833842fe5ba6f34d.png ' H$ m4 q3 O: o! Y" N8 `) r

! p+ H5 a, @4 I7 L+ K2 `/ _
3 E; L7 x- s/ A) |5 u
2、添加使用printf函数打印log的代码3 {+ w# `5 `- r2 K
(1)在项目选项中勾选Use Micro LIB选项,勾选该项目后,可以正常使用基本的C语言库。
; ?3 ^8 E/ g) |" P3 N+ n. Y* I& ^" G- Q6 m1 L  j# o& w; K% a
3db54bee7a3e4fb78ecb85f0c26ece57.png
' J; N* ?% G1 _% j/ d( [
$ V7 H5 `8 m( E0 w  s(2)printf函数会调用fputs函数,fputs函数为弱定义函数,即使用__weak修饰符修饰的函数,可通过自己编写函数定义覆盖原定义,我们在此处重写fputs函数。在usart.c中添加如下代码。8 W0 {  V4 y( E' a

. K/ a% n/ h) f0 z备注:开发者自己的代码需要注意添加位置,一定要放置到一对《USER CODE BEGIN和USER CODE END》之间,避免重新生成工程后被覆盖。
" x7 p! c* L9 j& k  Z, m  E% K# u; e; Q1 k, t0 g; _: L
607544c9bb2b4ca995be69d71d763526.png & ?! w, H$ c6 S! |# L; A5 Q+ l

, M; @9 B3 m$ E 代码段如下:可直接复制使用。
' @! Q. g0 `- p7 k+ ~' C
  1. /* USER CODE BEGIN 1 */
    ( c6 e7 _: ?: N: n/ G

  2. 3 s3 R- m! I/ h2 G( q: s1 G' q
  3. #include <stdio.h>
    " d: a! `. E% p% H) N7 ~% Q
  4. #ifdef __GNUC__$ Q5 M8 W4 B. j
  5.         #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)2 S6 n. O% g$ W3 d' ?8 n2 b
  6. #else
    ) E. H& f/ t8 r% k
  7.         #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    / n  i# C1 ^+ W& h  n  ]
  8. #endif
    * z' Z- m/ g; W7 N% n& M" c) [
  9. PUTCHAR_PROTOTYPE) W8 [: f% L8 v8 p& q
  10. {. B8 i( y5 ~& l  E% u
  11.                 HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
    ' W$ F$ V/ `: I! m3 c
  12.                 return ch;( d2 ^! K3 T5 u# G8 @8 m2 u
  13. }
    3 e3 \- O. ^7 W% \
  14. 9 V+ S6 ]+ j: s) j$ n* L

  15. ! i1 E+ M3 Y& z; W- ?* m1 Z+ T
  16. /* USER CODE END 1 */
复制代码
0 l: J' j0 O! I' \
(3)使用printf打印log数据。需要注意main.c位置添加"stdio.h"头文件(printf的函数声明头文件)。
% r5 C& D5 E6 }/ G& P! f, h
; r* ~& B6 t6 x8 l, Y/ q  f
ad684ef90b44425198d2cd6b046d6d5b.png 3 M- J, F: Z+ O4 I& U) d; C% f
! ]5 t* G4 u9 E2 r# @- s
0 f8 |5 r+ B' B1 _% D
  1. printf("hello world,this is printf function!\r\n");   //printf 打印函数
复制代码

: [% u* L" k; ?, `1 I) C' W- Z

' Q2 a( Z  f! H! l, o 3、设置编程仿真下载模式
9 j1 B1 q$ B& k* G. g% Q: T
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
7 ]* y0 O, L$ }* W2 Q: A3 ]4 q3 s) N- m9 g4 E* r# I6 v
edefb6b9a2a14be3b1221ad6d5c7a8a2.png
3 m' i; A0 j+ d- H* R; T/ ^. i1 a! y( [+ P( N" o, B, j  P
(2)点击Download(或者快捷键F8),即可下载程序。
( [4 X7 r/ B. P2 K- B
" Y6 v# O# Q. Q
ba221842d5db40808aa129dd83c593d0.png
, J$ W7 R2 S+ X; n; J
$ s  r: e# |2 k! F# R

8 f, [9 s) `. e) s2 A; \, a) ?(3) 如果下载程序后,没有看到LED1灯闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。$ v" _# y9 t, L8 |
" I: Q& F! ~* u* n1 k
9f8aa1a4e8f04041bcf5cb183facd100.png
: w8 [" v- U& t% k' u
$ N' y# y* {- F+ n9 K( Q. K
8 A& V! Z# M$ O& ~4、查看串口printf函数打印log效果
. b  G- j( E- k
(1)设置串口助手参数为:115200、NONE、8、 1(和代码中串口初始化参数一致)。8 l* B# m& M2 P3 M; y# e; J: U; K
(2)设置成功后,就可以看到串口打印的效果。每隔500ms闪烁LED1指示灯一次,且串口输出一个log。
1 z& |% k9 {: e( M3 k; q) a0 X; i) z7 \+ F) }6 h8 Z9 Z  E
5d514f8d3f3f479abeba35cf6e75e92d.png
1 X' t( M1 `( j1 [1 [8 U5 r8 i' s; ?
————————————————
' |4 Y$ I& _( m1 q版权声明:智能小屋ZYXC; o# W( ?$ U/ y1 N8 I& M

$ u1 f" z) E  \2 E4 O
收藏 评论0 发布时间:2023-1-15 00:07

举报

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