一、开发板平台简介:
; K* b, o$ `4 V" [1、开发板资源简介
$ u3 G1 R3 i" `$ K$ m/ X(1)开发板主芯片型号:STM32L431RCT6
0 ]/ t- g; k$ {3 @. \9 w(2)开发板主芯片封装:LQFP-64_10x10x05P. Q# l5 I* }$ ]( j2 \: [
(3)开发板主芯片内核:ARM® Cortex®-M4
m. w2 }8 D( k/ y2 P(4)开发板主芯片主频:80MHz
* ?& M1 E z' |(5)开发板主芯片Flash大小:256KB
* m$ P: w& S2 T6 y7 h* s7 ?4 e(6)开发板主芯片RAM大小:64KB) j' A- @) t k9 F
4 Z! Y. ^& G' V/ E$ S
4 \: L. G2 g o3 L
8 M# S( j8 O( v! b$ p
0 c" K0 Y! ~( d; V ^. ~8 Q/ H% i+ ^
2、LED灯资源
% C% g8 [8 d8 s2 E' z6 a. U(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:; ?+ ^' d# D% z) Y' g3 T' d
0 K, `" Y" X5 c
. o/ O. ]3 l1 f! U( |+ m
, y" c$ F& f! B) N7 F0 T) |9 |# Y0 u' t5 v) u3 F/ S
(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:7 l% [2 c- R/ S+ o5 n: h
! t" Z5 P' B$ Y- s% ^8 y
: G9 V# w4 ^4 J* X' P
9 X6 j1 I W# v& K8 o0 O/ F$ N8 }
3、按键输入工作原理/ ]/ }6 v* \. [! a, D3 {" p J
按键输入原理:读取GPIO引脚的输入高低电平。硬件原理图设计中通常会加入100nf的硬件消抖,以及ESD二极管防止静电损坏。
' x1 A1 k4 _: m- Y. N4 D- c2 E# n' _: y; I- V3 r& @6 ^" E
如下硬件原理图所示:默认PA0输入上拉,按键按下后高电平转换为低电平。
* t' F+ ]8 N) \: q" j1 I: X! ]9 Y Y6 |9 S6 n
2 h9 O# q7 k7 R; l9 ]2 G
4 ^# ^# N$ ?* O) C+ k 二、按键输入实验过程
& T- Q/ z* n7 } ?& k: O, u1、新建STM32CubeMX基础工程
$ J# ]& C+ Z/ S- W e(1)打开STM32CubeMX,点击“File”-->"New Project"4 P0 x$ b" n0 V4 o
' l# |. ?' I% X3 j& r+ O! X$ g
. `9 ]) e( W% E ? |; @$ c8 s. O
s0 S- O8 Q7 B- V* t. Q# q(2)等待打开主芯片选项界面(大约1分钟时间)。
* ~# k6 x4 {+ U! E+ s0 W. t% h! N4 Z3 j O3 r. E& ^5 G4 E
# y8 \0 P4 c6 d7 k: t* m
0 a1 @* U" R _5 }) t4 K% y
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
, K1 c( _0 `, \0 f0 m1 J3 M: J% E$ _3 y8 p/ [
_5 [8 f5 b2 ?1 ^; ]
7 q: c; x% n" M, X0 T! ^( E(4)选择时钟源。5 ~, p2 K! g, x+ c; d
4 u- W+ I1 m. c# N3 n: ~6 j(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。
' D$ Q6 }: a$ J6 a6 d! w5 [( r6 h8 }& c6 ^7 B6 p9 t' d
T# B3 Y$ B( Q' k& q" \' s, K8 O/ i$ b, V P% \/ g! E
(2)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
$ y# e. V7 j0 a
' _+ l- p( b- V5 D q, E
. ]- R* Y* x5 m/ e: L: P# j7 q1 i2 Q; e: c! Q) @$ R" n
2、配置GPIO控制LED
; V8 f+ _* }5 D. Y- j(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:
% T5 ]+ @+ O; `* t, ]9 u# j1 {5 [. V4 Q$ x: J
LED1——PC08 [! j) D% M0 T
LED2——PC17 E0 D3 U1 q1 Q( r, j+ Q
LED3——PC2
8 ?6 A, F+ ~% r* vLED4——PC3# m' e; R1 N# y! G' ^
2 E' }# q$ L& x6 b" A
(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。
8 U5 r9 W7 M8 H2 r8 s; u% w( m, e3 z" b! i# k
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。% Z% C+ K6 e3 o
鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。
+ R/ }! K X& Y7 r7 T鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。: q1 w* J6 ?( H% W# C0 C$ C$ T+ e Y
鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。
/ F. g/ W- Z2 w6 G( x
4 Y# x- r( W; v9 x$ |# `3 N
" S7 `3 x7 @, Q# a" \) Q! G% b3 `, C9 H/ \5 t0 `* Z
; E0 S" v4 E" H7 p/ ]9 W" Z" l5 M
, w5 b+ b5 `/ H& G
(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。' [( A& @' M. Q
7 |, _1 N Y9 t
; W$ m' K$ ^8 k E1 ~1 v
0 B, r1 s: d% x' j. f( J1 \; o3、配置PA0按键输入模式
6 x: f) o1 C1 ?- W t0 T+ m如下图所示:右键点击PA0,选择GPIO_Input,配置PA0按键输入模式,默认内部Pull up上拉即可。
: X$ v+ c! u- u* b' ~6 S0 r
8 M1 F* P# e! }4 J/ i+ Y; O
j0 Z5 j) A3 W
: T7 k6 m3 @* N7 k: I" L$ P/ y4 i, D1 T6 b }" A
( l, h* R) ^% `+ G1 i/ j7 ]
3、配置项目工程参数
+ v. o2 Z9 B& h$ \* p(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。3 D* l4 E" ^5 y1 b
! Z* `7 `8 k, P
& n: X4 @6 c4 c
8 B3 h. N! {* ~; Q
" A B7 b* R( [( n. z2 c9 R(2)完成配置工程。; @# [" Y' Q& `; l
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)5 V- v: G1 C+ x$ ?; d8 j
9 l! l# Q4 w3 @) v; l
% [( P" |$ e9 K2 z5 p7 ?! h
3 n" ~( w( L# j q" k& ~
; g8 D# v. P4 C) ~1 ]
( I8 M! |* F' j
(3)生成代码。
V8 h1 [& ]& g9 S) |2 }备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。
2 b* q' \, N+ {, ~& X, n
' V2 J- h' D$ o% N
2 p8 R* @* ?8 x" ~$ c
3 ]/ Q- h4 E4 X. K(4)工程代码生成成功。1 U# H0 I+ F Y( E& I3 ^2 b
4 ~3 Q0 v% ?* o N! u
% z7 S2 L9 K, `3 U- [8 M2 ] k" @6 Q. Q: a" {; m
三、在KEIL 5中编写代码9 D+ e! v: e" }: }' F5 g0 B! z* m
1、使用KEIL 5(MDK)打开项目工程文件
; g, S k9 c& D* F, o3 n: w源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。; K3 w8 g) \( X
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。. S( m. F0 D7 W7 b+ c
' z V2 T+ w, [
: i2 F/ ?: C7 r( x2 l
2 l8 _% j2 y) U+ Y2、添加按键输入验证程序 a/ f! c$ T2 ]8 o7 w+ {2 S, P2 q
(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加按键输入控制程序,如下所示:实现按键输入后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换。# Q% `& c8 w: S: h- F1 d7 `1 Q
5 z: [4 l( [ R备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。
3 ?. f1 ?# M0 O( Z( a
: a0 k2 g3 w; J* S% e+ V
6 n R! s1 T( w6 b$ X8 e
9 n( u) a- Y3 K2 H) z" [
(2)main 函数代码如下所示: L" k2 o, k( s; [$ J4 P0 J0 h0 Q% M7 J
- int main(void): n% F3 y# i) c1 l
- {
+ R- a1 C, c4 z/ C - /* USER CODE BEGIN 1 */
7 Z$ s/ E% h% s' A -
O) O* [: j* b- V7 u* S$ S/ \ - /* USER CODE END 1 */
) N8 t( S$ |: j1 D - ! |2 M: L: y7 k( b3 _" [
- /* MCU Configuration--------------------------------------------------------*/
# n% k* I/ D8 m. E" b: Q - 4 {6 `6 o" j9 R9 _ Z9 a$ A
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
8 g/ s) P- k! J: `* C - HAL_Init();4 k! N" l' i+ _ R! t* I( W- j& p
- % V( j) u' C9 @3 ?
- /* USER CODE BEGIN Init */6 f1 u, j0 E) v4 Q
-
1 p3 t, ]9 t' B* U - /* USER CODE END Init */- F J4 R) Q7 |, S; }9 B( H4 u% W
- 8 t' F; a0 \6 M4 W* s
- /* Configure the system clock */
, X1 K8 Y( S9 R* K: `8 J8 J- ] - SystemClock_Config(); I/ _ _8 u4 t7 s
-
! O+ k* M. ?2 n1 P( A) b - /* USER CODE BEGIN SysInit */
) Z3 N+ n3 b4 e, O9 n! E$ M -
( C: D" e p/ I( s' x# K) Z1 } - /* USER CODE END SysInit */
) F+ f/ w' l6 w3 K - 6 T J# J; r9 T9 T/ s: c& z7 i
- /* Initialize all configured peripherals */) Q0 S. W, g; L/ P/ ]% G( ?; y
- MX_GPIO_Init();
6 K& H1 K$ i0 p0 W - /* USER CODE BEGIN 2 */
9 l* \' H% ]8 d! Z$ G" Z - HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET); //默认LED1、LED2、LED3、LED4初始化点亮
$ r, @5 f r& d* \" l, s- v% t# R0 V - HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);1 p& ^" u7 c5 d/ H/ K4 b
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);
+ I, M4 m% ^- v. ~" G$ ] - HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);
* K, k* ~+ |* D: f, H0 M- ^ _! H7 N - /* USER CODE END 2 */$ Y. @: `9 y+ ?# v* E
-
: Z3 j. @1 t5 k# z! i; u - /* Infinite loop */, s4 _0 B. q `1 f+ f) t2 z
- /* USER CODE BEGIN WHILE */ r/ ?& r, M# e
- while (1)8 s j9 J! I$ ]! g5 }- J x) W7 b
- {
2 c5 A* `/ W3 v. v - /* USER CODE END WHILE */2 `3 r; q( p" C: ~5 X( H! [5 P
-
2 K2 W g+ T- L. Y5 A$ H0 D - /* USER CODE BEGIN 3 */
2 h2 z }* Z2 O I) d, r. f9 T1 l - if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET) //读取按键输入4 v: o& D6 U' \+ [
- {0 f# X* J" \9 t3 _
- HAL_Delay(200); //软件延时200ms- M0 S9 f$ y$ n" k7 c
- if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET) //按键反转LED,熄灭和点亮切换) G% S- v/ z/ S. W% w7 j
- {7 f& G Y( Z C5 b% g8 K5 \
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);
l) @1 S+ f: o; f - HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);! S) _3 U: o. v
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2); j, P5 O: x A2 Q& ^, X5 z
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);
7 P: s, F( I! M) j7 A- c - }
2 c5 ~0 a, c! M& W& [/ S& W - }1 e9 J1 Q" R7 K) @) ?
- }% Y6 c0 a! r1 S, C
- /* USER CODE END 3 */
e H/ b' k# P" Q% O - }
复制代码
) ~7 L/ U1 c5 {+ U/ D: `. i3、设置编程仿真下载模式4 L9 F6 w& |2 b) a' ^+ x- U* b
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
5 i0 X% j' V7 ^& B/ }% G$ |( w- _2 T7 y( q4 h) Y- @0 r( t j- O
( H% P+ \$ R7 }( i' T4 f* d% g
" D( d9 n6 O* W2 j. ?(2)点击编译,完成后提示“0 error(s),0 warning(s)”。3 X3 X! u L: p$ R# Q" b! X5 n
r( J+ d1 | Q8 `7 l$ G; @/ J
7 ?$ L" f* Z1 k9 V, O6 {
* x! y, {4 T3 F
(3)点击Download(或者快捷键F8),即可下载程序。
" ]$ p Y/ l8 ]& p! Z! O
$ V* e# P2 \" Q; S) U }
, ?- v: V5 R/ E4 m+ a& R: u# p' N& ` H4 F- Q
1 U9 o$ K* s9 W5 ~. |% i8 U# Z' }7 |(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4点亮,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
/ }/ f, e- t3 m; i6 a' ]$ J) z- S% k
* R8 F+ j4 c# V8 I
6 j! } p) H% B2 ^$ \: D5 s
' A) A3 K) U: \, H, R- c& A7 Z2 K8 X% T/ ^, G2 ` E# u/ U0 x
4、按键输入实验效果展示
% s, S: u! T# \& W1 b 程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后常亮,按下侧按键K1即可实现LED1、LED2、LED3、LED4点亮和熄灭的反转切换。3 Q: z+ m+ n( B1 Y4 Q: ^
————————————————
9 i9 @' I C# U$ O6 w' G版权声明:智能小屋ZYXC( z' x2 {! W- D& ]0 j w- U: D- K; h! ?
: e. o/ k+ q* C) V% |8 C, G7 g- I2 \6 `+ I* c
; T, R2 e: R( t6 I8 P2 X$ S8 J
|