一、开发板平台简介:
! B: C4 J5 |9 Y! v' F1 g1、开发板资源简介
4 G. P6 a' f. h. W$ E(1)开发板主芯片型号:STM32L431RCT6
# O4 o( M9 y2 z/ n4 y8 e(2)开发板主芯片封装:LQFP-64_10x10x05P
8 d- s- k. T& [7 s; [6 i! ]' l1 G(3)开发板主芯片内核:ARM® Cortex®-M4
9 V" y% k0 [6 a2 e0 a: N/ U(4)开发板主芯片主频:80MHz
' ~8 F; |) {# U2 u4 X& b(5)开发板主芯片Flash大小:256KB$ _ A) N. ^1 z4 Q: C
(6)开发板主芯片RAM大小:64KB
' c# s) v4 {/ h8 o7 l
. U% ~/ d; A, j+ X1 m j) z" f
5 j; n1 h" \+ @
3 [3 F4 }8 t+ ^7 @/ M0 Z: f
/ G6 p: q4 g; m% P- v9 b" Q D; X# Y1 Z" A
2、LED灯资源
# Z7 [! i0 l, R; y0 B1 u$ A- X(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:/ F; p8 `% P, o$ g/ G
4 h. H8 H U$ D% P* F2 E2 D; T$ f
# G$ `2 s/ o# S8 E. ?: h |, o$ ?; c
$ c0 o% t" C0 s0 Y(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:$ K- t( P$ R; C% _" F- {5 ~
$ `4 n" c- q7 q+ e# ~
$ ?- t' H- @+ t) y8 t! L# [2 b
5 V* ]) s2 ^# Z- ^' |7 ]# ~0 l
3、串口printf打印工作原理" f- e: p# ?. S" g! r
串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。( H* A$ X2 t: t
, ?; V* q7 W7 Z; |
(1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也可使用该串口作为debug串口。7 s) f+ E* o) {5 t9 I2 M) _9 {! K4 Z
, M; ]1 N4 W6 q: u
(2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。" o3 J( e, I2 C1 b8 c! ]
7 H" l, Z1 p! i& u& NTTL转CH340串口,硬件原理图如下所示:) [( K! H0 S# ?* M8 O1 v' n; r' Z0 Q
1 L B( M" B/ r7 q* e
/ i: j* _' T+ I: g* P. ]& j: [$ r
- \3 O3 U$ q* V/ }+ k( F ]! I. u
4 q; i1 X3 D1 ?0 Z) l$ ? 二、串口printf实验过程
+ a. K' q( T$ A7 F2 v/ i& |1、新建STM32CubeMX基础工程
$ |8 _6 E( p% ^9 Y5 a(1)打开STM32CubeMX,点击“File”-->"New Project"- Y# a1 H' P6 B) r. ]4 ?
' ?/ I5 Q; ~$ p
# s- Q& _7 t, x0 ^5 `5 ~ b# |
- [, W( L; {3 x(2)等待打开主芯片选项界面(大约1分钟时间)。
" G! g _& E: {4 T' O: Y# F! z+ ]' C3 B/ E
! T8 k7 F1 w- s, s
1 W4 U" B- b3 c4 O2 n( N9 ]2 a! V(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
7 d, o$ N P: g" `# Z3 |' j5 v: P4 V# E; [
6 w# K i0 O4 U: Z( B' d6 d+ e0 k
. }+ ~9 R3 |0 R(4)选择时钟源。
: Q3 ^4 W1 g5 }% z, C(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。( R9 V2 T: B) S( ~0 n D
7 W0 w$ `4 r7 N+ k
1 ?6 W$ B5 O+ |- n7 N
" x% g* O6 j) L) G& F9 j/ O: w(2)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
& V0 u0 r7 O1 U% A9 d$ s: y5 Q6 K! O4 m2 v, b2 z
0 Q2 T' d" S" n3 U1 K
2 Q' t% e' k4 _7 U4 ?2、配置GPIO控制LED/ D. h# S8 L r1 c( Q* P: M
(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:
1 C5 m% _% N) f }7 H! d8 f4 k& h0 ~
LED1——PC0
% d4 Z, N3 B! k4 [1 d4 Z7 ]LED2——PC1
. X) p2 @4 o o' O: ^2 ]) ?" qLED3——PC2
: `2 l: b3 {$ Y/ V7 ILED4——PC3
[7 P5 W4 H) F& W8 |
, z9 R* l, K5 p$ S(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。1 f: y+ M9 d( ?7 K0 f K
' y% h. e5 o0 F
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
c$ s. Q& x O5 M& Q8 z鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。
4 `. ]+ t2 ?" n; v4 @' R鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。% m8 {0 F8 C, J% v/ u
鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。
: {$ \$ p4 ?" x. o. K( @4 l, I5 n( H$ |9 L2 n; n/ w' E. s
$ B* w# O& d- i' |. u: W. f* Y" ^: c4 G
' z$ h$ B3 {0 q0 r6 ~. |' J: A
0 I! N }8 y2 X# c! f* H(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。7 ]; q9 V: _! y! [( i+ A& X
+ h& a8 o; q* K& [3 j8 u
9 v4 u9 i+ T% [5 \: {2 i Z
$ Z8 X0 M' P6 z0 [8 `7 l, W9 ~
3、配置PA9、PA10为串口
/ J; ` K+ e4 q: I U4 Q m! H+ f查原理图得知,串口1使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:: x6 x% G0 ]5 g/ Z* n* \
_( l8 z5 f [
9 m3 }3 h0 S, Y1 I8 S$ B/ b3 j! p9 X+ O5 Z* m
(1)序号1用来设置串口收发引脚的选择。
/ n, |" u9 H2 {$ v8 y; ^4 m" C(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。, H- p: _% p1 [2 a s0 H6 D4 ^/ X" G
1 |- l9 {& g6 C" {3 v
3、配置项目工程参数3 O8 o! |$ U8 v$ f8 V' v/ X
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。& M. {- c# h4 ?
$ O" {4 ?! D0 n3 q; O
# G7 B0 v% O4 w
. M4 |# N7 I9 z L! o2 I8 H4 U
(2)完成配置工程。
0 C1 |6 t6 v- F. M. t: j4 o% \8 x& s# N# F6 \1 Q5 q* u3 ^
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
b' @1 W1 p1 z# c
1 s( f0 I, ^/ _) K# y% y
7 Y; c- W, ?0 ]% n. b. w$ Q7 \+ {
9 T! D% |2 G3 q$ X9 U% K+ Y$ Z
7 ~. U8 f0 W2 z
% K$ ?( U* H, u3 o(3)生成代码。4 b0 L: M8 s9 N
9 P C* `9 m# S7 l6 I
备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。
% A3 I5 ^8 j$ Q* w2 n) l& D- L: R4 a: M) }
! ~) ~5 B( i+ i! |# W' K k" {6 `9 Z
. ?2 p7 c" D+ Y5 A2 a: X, P(4)工程代码生成成功。
# a/ l( G' f; Q/ K1 O2 N; }6 J; Z8 v% V! F# r D
" r; n5 U; u; z$ z5 ?! T! K
5 S- o9 m: M# [& L7 E
三、在KEIL 5中编写代码! j! I, E* [& z$ e
1、使用KEIL 5(MDK)打开项目工程文件6 u: k; r+ W- _+ w P# K: V
源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。
# c+ g( b% B' p) F: L( c' T
6 n) d' z' s0 b9 S; V4 O5 c(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。
! u, _- L/ G1 k! s
% x/ h9 n l- _) ~
K0 ?0 Q+ x4 l1 J
$ S! C# X% W8 n5 i6 @2、添加串口printf验证程序4 W) ]& J$ m" k( g3 o, B
(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加控制程序,如下所示:实现每隔500ms后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换,并且串口每隔500ms打印一次。, @ H. ~8 A( B) {
4 z4 W# c+ X/ o5 Y3 b
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。! j8 b0 [) ?5 T4 @7 m
2 {% k, d; k& S* ^3 p3 C2 T" t* M
6 Z0 W- b' I) v0 c" U1 X% y% ?
3 W5 x6 ?: W( H. k! l
; ?# m ]5 t1 @. r
& y" T" e+ @. Y% [* d3 N(2)main 函数代码如下所示:% z; ]4 f4 J, s4 A3 y3 O/ ]
- /* Private includes ----------------------------------------------------------*/0 Z# l! v. E5 Y& C7 G! k, D9 I1 q1 o
- /* USER CODE BEGIN Includes */
8 W# l% e; q% D( r - #include "stdio.h" //添加printf打印函数头文件
% b; e$ O) X/ d) z# ~! W2 h - /* USER CODE END Includes */# O9 t, b! g4 V( [
-
& b6 ?3 u6 l9 d q/ ~/ p -
) \+ H T) h5 ^, A# V9 ], ^ - * s% ~' S$ E$ Y# _/ ]6 T$ Y
-
' Z5 b& m) K! q/ s - G( V, x0 _+ E
- ' n6 j, k$ X/ k, o" \7 Q3 v$ b
-
1 x1 J2 s F+ M# }0 c - int main(void)- t# C( M- z; l M" R) c
- {
3 W5 j4 @/ W' k+ L) q7 b3 v - /* USER CODE BEGIN 1 */- E4 X, T# j( E. t) O
-
" G6 M! b+ `; ~( u! P. | - /* USER CODE END 1 */$ O7 w- H. m) ^7 L
- Y" v7 `5 _2 l" o U m$ k
- /* MCU Configuration--------------------------------------------------------*/; E/ m+ f; |5 u" U
-
) L( y- n _, p! j3 c - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */1 ~( A- W# |% @! g# P
- HAL_Init();
8 t& y0 _" b: A) |# b' |; f$ a -
- [- E" V {5 e' u - /* USER CODE BEGIN Init */0 Y5 i O4 O* E
- 3 k; E$ E2 i2 y, t3 H J
- /* USER CODE END Init */
' L' A, N+ L- L# }" o+ ?2 v! u) ? - : L, p* B& N5 `6 y! L) ?. X% O3 k* O
- /* Configure the system clock */
" g2 {; q3 U) _$ o1 U - SystemClock_Config();1 D6 Q( V' D# t
-
) P. w+ k$ L5 b8 J' g - /* USER CODE BEGIN SysInit */
! G& `8 y& |( j -
5 @( Z2 L9 Z+ o$ h5 H# d: h - /* USER CODE END SysInit */
. A: r8 s% A9 t3 y5 E* A - 7 w6 w$ I% t8 a+ ^+ A4 k+ w* @3 M% J3 n
- /* Initialize all configured peripherals */
( U6 X4 ~% E7 U, q, M0 e n" u - MX_GPIO_Init();
) A1 x+ x1 {+ t3 }* C - MX_USART1_UART_Init();
9 j& Q+ P" s9 ^" t - /* USER CODE BEGIN 2 */- w' K9 s" }/ t3 I2 R
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET); //初始化LED灯,默认点亮' ?) E7 Z- ?/ e5 D! _2 K" a9 k
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET); //初始化LED灯,默认点亮
+ n5 c- L& @" E* W3 D - HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET); //初始化LED灯,默认点亮
n. [7 T* P, C$ N4 h - HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET); //初始化LED灯,默认点亮
0 A1 i) Q) t3 u8 t - . y" Z: l. }2 k* s' ]4 M
- /* USER CODE END 2 */8 K; k0 v2 |0 W
-
* C# c. @4 F* G4 D3 t/ h - /* Infinite loop */
. a H6 y$ e2 Q, f6 D. P - /* USER CODE BEGIN WHILE */3 a9 f7 U, @3 I' ]
- while (1)
' d( H% C8 p4 J$ G* L - {) B- k6 j$ O5 Q. n c
- /* USER CODE END WHILE */
- Y- `+ l. O- R- U - /* USER CODE BEGIN 3 */
z+ x2 U( L8 _$ J8 o - HAL_Delay(500);( U4 t1 Q2 {) v7 a$ r
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0); //反转LED灯
8 S1 p8 h8 ]+ H$ S7 E. y& B - HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1); //反转LED灯/ y/ z" N2 o" \
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2); //反转LED灯! @! ~5 a# D+ i5 L/ D
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3); //反转LED灯
0 l: n) C9 h5 A - printf("hello world,this is printf function!\r\n"); //printf打印
8 \; k4 ]8 a ^1 @- l: T# Z - }
$ l; n; q1 u+ H5 a) r v7 s/ E - /* USER CODE END 3 */0 B$ |# V6 g4 V9 [. @
- }
复制代码 , u: S# C z0 C8 ~$ t! m( f
3、设置编程仿真下载模式
4 A {% Q! P" }" C0 f2 G8 c: l(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
- v" W+ F: q+ Q) b8 @" y: f+ W! _4 z+ X& q o& ?& k
$ V' c. p! k' v$ D2 \; j$ ]
! Y8 k: U( w! L1 e0 ]/ Y# c; T
(2)点击编译,完成后提示“0 error(s),0 warning(s)”。$ \: a6 n9 |# u. H3 F8 U! L
* j" \+ p0 v) _/ O5 E
0 _. d, ~ O* E% K# X$ C( ?
; M3 O. k M: o; b
(3)点击Download(或者快捷键F8),即可下载程序。9 {1 ]3 y# I( K$ `, H, i
$ m% _$ d/ v2 F8 z9 ]% c
; Y' X& ] p" S( U
' N+ d1 e) b1 [! a4 B: b; Z1 S" C/ t& t4 g
(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。' I% D, Y, W/ Y0 b' N
* r8 u2 y$ ^6 s7 R
: J: w, E5 L9 I( W/ p6 U% C" j9 ~ 2 g5 p! ^: D) B( Z' `/ b) [
4、串口printf打印实验效果展示/ y) H8 j& U" W2 S7 G0 p! [
程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后每隔500ms闪烁一次,并且打开串口助手后(串口参数:波特率115200、N、8、1),可以看到printf每隔500ms打印一次log数据。
$ H. l% \4 b# o8 L0 N! _) K5 R$ [ m
# T8 d* S2 J' S6 w2 @3 T
: F5 Q7 J/ J* z! E9 m8 F6 k————————————————" R0 D, ~) q4 y& ]. E
版权声明:智能小屋ZYXC
& X1 Q j: D! Q- D5 r3 g. m2 m2 o! I! v. z2 t5 h; P
|