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

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

[复制链接]
STMCU小助手 发布时间:2023-1-15 00:07
一、开发板平台简介:% f  w& a% y1 u% ?
1、开发板资源简介

  E4 o" B5 L6 m) ](1)开发板主芯片型号:STM32L431RCT6
, i9 L& F* b4 t/ ?9 j9 c6 E( T4 @(2)开发板主芯片封装:LQFP-64_10x10x05P
1 H: H- k% W! x: R; Z(3)开发板主芯片内核:ARM® Cortex®-M4
5 F1 H# h; m6 z% N& S* i(4)开发板主芯片主频:80MHz
" k7 w, w* T% \" x. j! L2 k(5)开发板主芯片Flash大小:256KB. X5 R* o& v, c
(6)开发板主芯片RAM大小:64KB
4 c  V1 ?# T; S$ W* {6 V2 v (7)其他外设:请参考芯片手册
$ \; p1 ?! n% \7 C& A5 C* o5 o3 _- O' `" |
bb91345227434ee7a43a34bf3fe366e6.png ) G/ m# W5 a$ `. K, N4 [+ g
1 x9 t5 X8 }; v' c. t6 Q
929c0cce04aa4115a8623703982bf3e1.png " }- H) Q$ A3 H7 @* }# _" r) F
/ s8 H( m6 y; a% B, a
2、串口简介
( R* Y* {5 a* Z1 V- y         串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。7 d& K6 @( _! N! M% `: o2 }

! q( m. E3 V! `- ^        (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也试验该串口1进行。, i8 R- [' g/ r0 k5 E  }  ^5 r
- r% ^5 w- b' d. @4 N, j
        (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。
0 X+ z5 M% K. T+ U- h# U9 g& Y  m( t  a/ H7 o, I$ ?8 t% f
0 }! Y* k2 m' |- m
  二、新建工程% ~0 t' A) i9 }$ J& y% P
1、新建STM32CubeMX基础工程

$ [, T$ v0 R+ u3 }" i(1)打开STM32CubeMX,点击“File”-->"New Project"; V6 R: E$ h2 z
+ N. D& D) b) i
2399170347904e959c855fefd5877f84.png
* i! \  t3 y- ]% A( \

) c+ C/ U% K8 p! ]  T4 x! m(2)等待打开主芯片选项界面(大约1分钟时间)。0 I# G( ~5 s6 \9 X
$ k$ U* L8 W; c# Y4 k: ?% U
d74d2fdc60c9440483e2b7cf8d928e7f.png 4 M- ^7 B5 F7 {6 `& s- |, R

/ L+ i7 b0 x4 ^6 c$ P% ^9 A(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处现在STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。3 |$ j# _& r# n2 G* z( }
8 T2 a, }' [9 O) F, Z* x
7b80345238d74bea82ce70e1a348f7b4.png % P) j% q! y$ h8 T( z
' d# i" r5 H) J* f8 b# ]; ?' M
(4)选择时钟源! k$ s0 X* M8 i
(1)因为开发板上有8M外部时钟,此处选择外部高速时钟(HSE)。9 r" p: f! t1 p- Q: ~
(2)因为我们没有用到外部低速时钟(LSE),此处不做处理。6 }7 M! I0 T# F: K

8 x3 A: M8 T' Z  H
72119b971f62410fa8344f7f9fb9f389.png
% w0 c- F4 b7 O: a) W

, g) H; I& p$ g9 l; K+ e* R' [2、配置GPIO控制LED
3 N* I0 x" Q. C& W5 N
备注:LED灯用来指示系统是否正常工作。/ O2 l2 _" u- |: {
(1)查STM32L431RCT6开发板原理图得LED1控制引脚为PC0,则配置GPIO的引脚PC0。: s% x9 e4 t. @
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。/ H; P, }7 |: Z* y) w' H5 s
8 F+ E. d! @; `% B  H
492907c1e71149819adbaee4516a2af4.png ( {/ E$ S2 D7 r8 P; n' I+ ^
1 `' j" c# S% G! s: J% c
(2)根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。
" K7 T; x7 |9 w" h# ~3 {$ x, E
38ff4b80e1c5495ba3076a5158fd91fa.png
* _/ v) ?, o9 |( c5 v  y

! B7 ]% k% z3 N5 g8 |3、设置串口1参数

9 N0 a! o; W$ z, @. p1、查原理图得知,串口0使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:
/ e) [  i3 s4 K2 l+ s8 N! |8 r+ W5 b. R1 B& g
497b8ee0243e446784e64a3c31e8a26f.png , ^+ ^. h% z5 P

  g. s4 h" q$ ~7 g (1)序号1用来设置串口收发引脚的选择。
- g+ m) h! S5 s2 ~6 `+ n6 Z6 }, H(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。* p5 [( H& q% x; o) j- b* l
9 P; q8 e( @- ]5 ^
4、配置项目工程参数" d! E9 t( ?; d1 x- r; d
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。
6 n1 K0 R  ]: Z. s1 o* e4 r% _. `0 t/ i" D( {; ?5 r/ f' k
2ce1933c10484d819234682f4abc0228.png 7 y. [0 t" {5 @; Q$ L7 U: w# w
4 i- s; Z  H3 e; J
(2)完成配置工程。) y3 c8 d1 l( B4 U
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
2 Q" Z9 x5 S3 w/ k/ |- S
% U5 {7 L3 B# G
efdb616174f54925b6eac31109f227b5.png
( m' s# L8 a$ s1 J" E$ B- N6 m' J! @! G8 ~4 w9 M5 A8 E! D  H
41c3f2716e4e4eda8f62fa3a1d871322.png
; T) _7 }9 D" Q7 ]+ p; V3 e/ {! P4 _- u4 P/ V5 E% Y8 E
(3)生成代码。
2 G- l$ G- n1 ~; K
4 p" U8 a# \# m
8eaa7d0babea40ee93f158481a6ee471.png & M/ E; i8 o1 `, S1 Z
; I0 h; x. j, J0 d+ R# P
三、在KEIL 5中编写代码9 d/ t( V5 b; I  T8 C' n. q3 q% d
1、使用KEIL 5(MDK)打开项目工程文件
1 \9 n5 G  E- P& j# L
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程。% K" l+ Z' @& Z; N! C

! g( J6 q: d. W, Z
0d697d3d06664ba397f843687e19dc1f.png
9 Y7 H' s3 ~0 g% W9 f! _. d
" `9 Y! `) _: G: V* \(2)添加每隔500ms,LED1闪烁一次的系统提示,用于提示程序运行正常。
1 |8 F6 ?& |( `7 N2 ~* \! Z' [$ G. E- B: T* b
6ab72ceaeb7a41af833842fe5ba6f34d.png
* y7 P' w4 C9 d$ c" d  ?6 K0 {  p( g1 R. T- K/ y3 H
3 L4 r, ]' u( b% {
2、添加使用printf函数打印log的代码
+ [6 h# D% y, F/ w(1)在项目选项中勾选Use Micro LIB选项,勾选该项目后,可以正常使用基本的C语言库。
: \. U2 i% U& Q% m1 p, ~
/ P' p& J0 z. t
3db54bee7a3e4fb78ecb85f0c26ece57.png 1 I1 i9 J# F2 E! t4 a+ ~8 z
& X8 i1 l% t# ]' j
(2)printf函数会调用fputs函数,fputs函数为弱定义函数,即使用__weak修饰符修饰的函数,可通过自己编写函数定义覆盖原定义,我们在此处重写fputs函数。在usart.c中添加如下代码。- \3 P9 U1 A$ A4 l% A, n& g

& v% N) B. }2 q. N% `0 r* n8 H+ Z1 ^) ^备注:开发者自己的代码需要注意添加位置,一定要放置到一对《USER CODE BEGIN和USER CODE END》之间,避免重新生成工程后被覆盖。
# R/ w$ O. e, p8 W0 T* ?
8 h/ J( c* j, c5 I3 Z
607544c9bb2b4ca995be69d71d763526.png
  h0 @, o9 g  u$ ]
7 @+ `! p' ]$ @& a8 D6 ~ 代码段如下:可直接复制使用。5 s8 R# i! I; Y/ m; A! g+ |+ x1 l
  1. /* USER CODE BEGIN 1 */# U, F& Z6 W4 L
  2. - @7 D# y  }. {
  3. #include <stdio.h># Q2 l# D4 z: F4 k' O4 m- l5 `
  4. #ifdef __GNUC__# l% f: h9 a! u4 I! w
  5.         #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    " [( N( z, \* ]3 q  T3 n! i
  6. #else1 U- Z! Q7 n& r) C
  7.         #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)7 t% j* o8 O) P' j4 q7 E5 I) ~
  8. #endif5 R) h4 H5 c9 v1 @
  9. PUTCHAR_PROTOTYPE1 y" \3 C3 K# T/ A7 t1 `
  10. {2 c7 Y" G& B6 K9 A7 S% l
  11.                 HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
    * L/ ]+ k& k% m  e2 d
  12.                 return ch;" X: u, c& p- t* Z) P
  13. }) C: X' x! u1 \% p" G

  14. 9 ~! O, e6 ^2 S' d( P( \" a

  15. , z3 d  E( K' z' R3 ~
  16. /* USER CODE END 1 */
复制代码
! {7 ?* \: M% L; H5 P: b
(3)使用printf打印log数据。需要注意main.c位置添加"stdio.h"头文件(printf的函数声明头文件)。
- ?4 r% f4 c' e# q, ?& n! |
' }- t5 |) g4 S# {+ I
ad684ef90b44425198d2cd6b046d6d5b.png # o: k8 y: k9 T

2 p; U! k8 t/ f& ?" [
. C1 H: x9 I& E  m
  1. printf("hello world,this is printf function!\r\n");   //printf 打印函数
复制代码
/ O) D' h0 X  q9 q6 U, d# P
" h4 C- I; I  X; M0 s- X
3、设置编程仿真下载模式
/ u. _0 ^( L$ w# R( }7 B4 X
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
$ r, w9 E+ s, F7 a4 j0 o# S6 \3 o" ^) i3 D/ S1 r
edefb6b9a2a14be3b1221ad6d5c7a8a2.png
+ {) R; L. O" w) ^- f1 h- c: B( Y# q2 e) ~
(2)点击Download(或者快捷键F8),即可下载程序。1 q5 n+ q; J: U2 W6 ?4 j  {

* @; c  `( v5 b0 P/ v/ P! X
ba221842d5db40808aa129dd83c593d0.png
' `* ?" Z) e8 b. G9 i0 s9 T" r6 G/ B7 d( _0 D& b/ z9 _
3 t4 a& d, J7 q* `
(3) 如果下载程序后,没有看到LED1灯闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。: W7 i( r4 E. q% S( N* f. M' S

/ ?( Q/ f" Q9 q9 J/ a( o1 C
9f8aa1a4e8f04041bcf5cb183facd100.png
& W: R7 y2 i4 W) \) j . ^' k6 v  n  v, E" _- r0 ~3 d$ f

& r7 v0 b1 S8 T- _4、查看串口printf函数打印log效果

' A1 [! H6 I  [1 P# X5 M' v(1)设置串口助手参数为:115200、NONE、8、 1(和代码中串口初始化参数一致)。+ R. B- Q) j$ P) H$ f
(2)设置成功后,就可以看到串口打印的效果。每隔500ms闪烁LED1指示灯一次,且串口输出一个log。
+ p0 h# x5 N0 P$ l4 |- m7 h! q6 ~7 k& @3 {, `1 u$ Y$ E
5d514f8d3f3f479abeba35cf6e75e92d.png
5 V( ]) n9 s- I0 a0 n+ i5 T1 h9 |6 z5 ~( N* e9 U
————————————————
! j! o3 r0 ~4 z2 M& `9 `" {版权声明:智能小屋ZYXC- q' e3 a! \8 U: O

% L0 o4 E2 M0 x7 U
收藏 评论0 发布时间:2023-1-15 00:07

举报

0个回答

所属标签

相似分享

官网相关资源

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