一、开发板平台简介:
/ _6 m# c0 E k# {1、开发板资源简介" M8 Y' h- B; \9 \8 d8 g( D
(1)开发板主芯片型号:STM32L431RCT6
. X) v9 |, k8 v( i: f(2)开发板主芯片封装:LQFP-64_10x10x05P* Q) c2 X+ w. k# c4 D) e, e, K
(3)开发板主芯片内核:ARM® Cortex®-M4
. l% C Q7 r7 M9 _# G; N(4)开发板主芯片主频:80MHz
. s6 [4 j" R \4 Z2 x% y(5)开发板主芯片Flash大小:256KB
@/ B4 F9 p- H" J! c+ s& T(6)开发板主芯片RAM大小:64KB/ G& D9 A' }+ ^ q% U
( g/ R" ^3 R# h! Y8 P5 y Z9 w9 x
5 |/ L9 G8 J. L; b8 S5 {) O& z% |# G) |
& x s5 j( S* N% @# k2 n8 k5 o: Q$ H; d2 u# n2 w
2、LED灯资源2 g5 l3 v6 W' e4 \3 `
(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:
% Q) r1 e; N7 J) N) Q" H1 w4 K8 E% \
$ I9 f9 O9 Y" D5 D
: p+ Z$ w4 }: J5 D' I, \: s(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:
) y$ A& ?1 j( T# w1 p& V8 x1 D, V: ?2 y& j
* ~) L, T' L3 d2 D
& N0 G0 R- I% r$ n3、串口printf打印工作原理
+ @$ `) X7 O. w; D! E7 D7 |( k 串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。# y3 {/ n& t! B* v' L3 [' a
1 U" n$ |2 M8 t; \8 h4 q5 U
(1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也可使用该串口作为debug串口。
, f2 Q! _6 t- J7 P' s# I' a% J# `* v% ]
(2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。
4 q3 ]( o& h1 p: w* Y* a: w) s: M" h& @( w, Q8 r" D
TTL转CH340串口,硬件原理图如下所示:7 T' {" n0 y9 P2 Y
~* c) z# ?3 z( c* O4 ~0 k
2 @( ~; ^3 h0 M3 s
}" [& ^, m3 N# c. S1 O
, R X6 \, R( V7 q' w5 b% }3 ^8 U- J4 c% [ 二、串口printf实验过程7 G3 ]; }1 u) t' m
1、新建STM32CubeMX基础工程
- X3 M }3 Z6 @9 n4 s; m5 g4 q(1)打开STM32CubeMX,点击“File”-->"New Project"9 M% {9 S, D6 J' ?6 y. s# m) X
+ `$ Z$ _9 p+ H
! M1 [7 o( G4 m9 Y- J
6 ]$ G) `, g. i% K(2)等待打开主芯片选项界面(大约1分钟时间)。# h% ]2 a* |; K1 ?- t
; m! F3 L& t0 v
* H+ P1 d1 N9 q$ e$ W+ C- {
/ s& X6 y' w2 _% [0 }% Q7 j4 B; M(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
7 r+ T" J1 D2 ^4 n: U, [# H% P3 Q! G2 w3 G
6 E8 X3 }( a% X% e, G
6 a1 s. f" b. L8 Z3 _0 l
(4)选择时钟源。
9 c: q, G2 Z# r# }( G) Y" L8 u(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。" Y8 z/ @( l+ v0 i* H" |# E
6 J' E+ i& ]. H2 n* W7 j3 ?, Q
1 J& [6 V0 w' r0 d
& e+ U* ~ m$ @/ t" ~
(2)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。& t! @; |8 Y5 J7 Z7 c5 n
( R" M2 o. }1 G. h: A
3 V4 Z4 V+ @0 B0 f5 |( _
j" w# m' _: d& o5 }5 ]% B2、配置GPIO控制LED" T+ J0 k) n) C& O) ^* n- }
(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:
6 r* F9 c$ u# r: S0 C6 D: f( g7 d& O3 l/ x' O
LED1——PC02 ]% {, C% Z4 R' U9 T% y# t
LED2——PC1! ~& @) i3 n5 S" i/ f# b
LED3——PC2) F( b; {8 P2 B6 T4 i6 T6 n0 [
LED4——PC33 a: D+ @3 T+ ~& u. A7 ?7 c
/ l9 @2 C7 s8 U) P( d o
(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。1 j* C0 J1 T1 {* u- s% ] ?
2 L1 k- w) @* `- R' _ b+ b; L
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。& V+ z, V* X% _& S" u8 F4 t) i' P
鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。% Q) t$ n1 X3 F6 x
鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。
) D- c$ e* g* O; ~" [; _1 k/ F# }鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。" |# Y( f j* `8 E# @/ a* S
* I$ ^0 s* \: @: K: [; w5 _
( w8 a! g) p" S7 r- u, j" D+ Y' \# Y9 ~
* q( g' [* N9 M# P$ Z
) P/ X! Q% ?! m3 J# m$ v(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。
7 ?( b$ ]7 ^& l2 s+ p% T( A4 a9 P$ N( q# e
1 P1 Z3 z: f& X* Q
8 _1 ~( @5 k( u/ h8 @ j; K5 @3、配置PA9、PA10为串口% x1 V$ Y. i3 J" _ m* J( `( d
查原理图得知,串口1使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:
; }& t) B. v* _9 u- P; Z& F' n8 I) l: l
( y1 m5 w% D; L+ m
' b, b6 K& Y: n: [" P: f
(1)序号1用来设置串口收发引脚的选择。, A* ]4 R5 c6 }* h( s
(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
3 X" m2 D6 L5 E( `% M9 N
M' _; b/ i) n `# T0 }: { 3、配置项目工程参数. {( }, q6 S2 o2 A' E; U
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。$ [% g% N" j+ @1 _" F* J
$ ]3 e8 i9 x8 {% t6 r
- U! c+ z3 C5 R1 {4 a9 f3 k2 ` Z
(2)完成配置工程。# ]7 C( y. b' `9 S2 g3 g# T
! O1 Z. p; W9 A7 a
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
0 |0 ]0 M- F9 q! X, e. V
( M# T. }) D v" P" n2 L
( \% {( i) ~, m5 u+ }# q6 H& T$ }* t [) ?* Z7 n
# x/ K" j9 b0 ]* o9 R5 w% X! c. m- r4 U
/ J+ l! @( S# I; q5 ?7 v) S
(3)生成代码。+ P9 B+ w/ [* E) h
4 b2 e2 T/ v+ `$ }; u1 d( r备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。5 L4 ?7 x+ S% G9 ]4 X
( r8 u2 N& q L4 Z* H7 m8 e
! c9 m# R+ m( U
, o. |5 z7 v" }6 w6 U% e(4)工程代码生成成功。
) k* X3 F& r- L. m% m. B
3 y" Y2 o" ]. T" |
0 a& l, j( O' Q0 ]1 K( r! D
' f1 e5 x, r6 n. a/ n7 J2 F5 s
三、在KEIL 5中编写代码
7 e& T' C; U" k+ B2 N' {: t1、使用KEIL 5(MDK)打开项目工程文件' `' h2 q& P0 L7 Q
源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。
" J" p8 B+ |# z$ h& A6 X
* X1 y5 |6 k# z4 a(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。
. @, P1 l, [# }1 A' J- R
& d5 D1 I1 K% f% ]6 z
+ E9 E7 }3 p+ F5 L2 `" D) p; F# [4 t5 X! r7 i
2、添加串口printf验证程序2 U; ?; G4 p4 ^( P Z
(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加控制程序,如下所示:实现每隔500ms后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换,并且串口每隔500ms打印一次。; P/ w! J, X9 F( C: D2 S
% b7 R8 \2 w. a! r+ Y, B8 x
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。
2 D; s# p/ r; M9 {6 x" W/ h
7 I+ [5 p1 P" Z
- T% `$ I' N V/ Y, w! E! P
2 s# v0 @5 G0 f; _7 L4 X
7 G0 B2 m$ j- n7 U; G& L
& d- A: F+ u, x- C& J9 }) F& `(2)main 函数代码如下所示:6 a/ e$ Y# }- T8 J
- /* Private includes ----------------------------------------------------------*/
9 A6 l/ Z+ Q& O+ O, K" | - /* USER CODE BEGIN Includes */! [1 E. h! j$ u$ u
- #include "stdio.h" //添加printf打印函数头文件, @0 t& W6 O/ C, Y
- /* USER CODE END Includes */
' N) d" B- @. {0 \1 U - & R6 T7 |* O. \; G! C
- ( V' u8 B5 S$ \" i$ q
-
) i: J) Y5 t. t) h- U -
- Q5 R" C% \+ k4 F" h5 z9 @9 B/ w -
) f3 g% ~2 d: N- t/ i3 R - 1 I) F$ `9 V" S
-
0 o5 L& Z' E9 w7 S* M) O - int main(void)
) q$ W+ h8 S; S) F: }" F - {
7 _0 ?8 P% L0 E6 }& R0 V8 W - /* USER CODE BEGIN 1 *// g& C k# }' b1 _; j& J- a
- $ s3 I, }! n: N+ m
- /* USER CODE END 1 */. D. K- |6 V5 N( ?4 x
- # z- ^8 @" u2 p/ _$ s1 o
- /* MCU Configuration--------------------------------------------------------*/2 R3 a: n2 \- j6 p! ]: T, A8 v4 i
- , B2 K' Y8 m2 s7 I6 T
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
# z' U* C P/ v5 W9 z: I - HAL_Init();
, |$ S1 ], v. ?! f- }# f+ b - " a9 @7 o' @9 U" z3 D( {
- /* USER CODE BEGIN Init */ U% k: [/ T2 v
- 5 w6 }& Q1 z! d) c" v! T2 d. u1 e
- /* USER CODE END Init */
* k6 l# r* T) U& a8 x - 4 N0 e0 T0 T+ G7 [0 Y
- /* Configure the system clock */
5 S \3 n# g1 @( p2 u7 b - SystemClock_Config();/ u6 }& x& ^7 i! T! y$ [
- ! U: Z( O' a$ }4 m
- /* USER CODE BEGIN SysInit */8 {& F0 _7 W! L! S1 g# f1 K
- ) D" v+ U+ O1 e% v" S+ I- z
- /* USER CODE END SysInit */
. C3 ?; w, L& N6 D% D -
7 d9 u1 {8 i9 k3 W$ k, K4 {/ Z: d - /* Initialize all configured peripherals */8 I/ S3 e0 Z g% a. P
- MX_GPIO_Init();! v8 H, K F" O; |- ^
- MX_USART1_UART_Init();
# q& ^$ s# k' f; Q, e' l4 d - /* USER CODE BEGIN 2 */9 G/ Q! `5 b- X
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET); //初始化LED灯,默认点亮, ~) u/ n: t! s, ^
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET); //初始化LED灯,默认点亮
4 n, k# p6 J" x; K! z - HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET); //初始化LED灯,默认点亮9 Y) k3 p; V1 S1 ^ W6 O$ O- M
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET); //初始化LED灯,默认点亮
) L) n1 Q5 n/ i- s1 F - 3 n- S1 a3 o' j% k8 h4 N( I
- /* USER CODE END 2 */9 Z9 m. E8 N0 W. X
-
Q7 A. j" R3 Z: z1 F: {6 ? - /* Infinite loop */
% l1 }7 _: M: A - /* USER CODE BEGIN WHILE */
# O1 F1 B& A- r9 Q @1 f - while (1)
) @4 U9 k5 ^# v( h' ^1 ~" p - {
7 c# |% q8 O2 D7 C2 r; J" T6 b - /* USER CODE END WHILE */
& r9 j. {' O( C' f& p - /* USER CODE BEGIN 3 */8 S$ L# A& v A) I
- HAL_Delay(500);
, ^! m2 D: r# W$ G - HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0); //反转LED灯
- i3 d2 f# E% ~ p3 r - HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1); //反转LED灯, s: ]6 x: l K1 G
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2); //反转LED灯3 H5 T& w3 n+ k* Z3 o- N6 G
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3); //反转LED灯6 P% J+ q6 ?5 p: Z- E# _
- printf("hello world,this is printf function!\r\n"); //printf打印% E& ^ E' O N1 k) L
- }
# R/ V! z h/ d: r - /* USER CODE END 3 */
% r+ } x) ]3 U3 G! @* {$ b - }
复制代码 8 R1 p( k4 m' M; M; S+ U
3、设置编程仿真下载模式( _8 g+ D- W' D
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。3 `# f: X9 u7 }( ]6 W$ N
# z6 ]. }7 c4 e5 Q. R
7 K% F% b0 R; M) [
4 q0 ]0 [) _; m(2)点击编译,完成后提示“0 error(s),0 warning(s)”。# R3 R' t5 G2 r, d0 q
Q% w3 R D; y% `
4 g: ?8 _" e; k0 v6 [9 e% [# j: P/ C
. j9 |+ @, L" A9 {4 n& A(3)点击Download(或者快捷键F8),即可下载程序。
# A# U2 C: I/ l. R- n
, Y2 D4 h# R0 L ^* H
% x/ Y. }1 d8 n9 L b( s
, X$ e5 b U: m7 C2 Q; v j% i9 A/ ~1 E1 G& Y1 w) I4 c& b
(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
: n6 v7 h# `1 b+ ?$ u
* V* ^* `% K( ~4 E7 s
" u1 u2 f& [" Q5 g, ~9 Q/ F
! w" Y; s+ q" O1 }5 g; v$ E+ u4、串口printf打印实验效果展示0 f6 y* A8 E/ r+ `. H
程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后每隔500ms闪烁一次,并且打开串口助手后(串口参数:波特率115200、N、8、1),可以看到printf每隔500ms打印一次log数据。3 V; l2 N1 @7 j: E; L' ^( W
- m. Y* J2 ~0 I% A: `6 g
% x. C3 Z( x# b& b2 h5 L
, i, ?6 _) y" S7 U
————————————————
6 q7 ?( B3 n" V* z1 G版权声明:智能小屋ZYXC- M- w5 f) ~' W0 W3 `
& I4 ?. v$ J. q" O4 V
|