一、开发板平台简介:" l: L/ i& G4 {
1、开发板资源简介. ]+ S1 G) t, G, m- @( V
(1)开发板主芯片型号:STM32L431RCT62 d5 k" i1 o3 H
(2)开发板主芯片封装:LQFP-64_10x10x05P) q: i, B7 Q2 d
(3)开发板主芯片内核:ARM® Cortex®-M4- D0 @8 g( t+ b# R+ C7 {1 r
(4)开发板主芯片主频:80MHz
: y& R* Z w) X; G# R2 X6 Q(5)开发板主芯片Flash大小:256KB; _5 K Y( Z5 v
(6)开发板主芯片RAM大小:64KB
2 b; p6 U% N2 l. R' }7 J7 N
3 Z2 M/ w/ Z# b$ l% u: E6 |
9 P/ R) |8 G; o
d7 J, J9 U, E1 k
0 _" i/ b" k6 J
& _& R1 |; @8 ?6 K) _6 x5 ` e
2、LED灯资源
& E* y% f+ y9 }1 x(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:
2 i: M2 u, X9 K# [7 R* P/ h. d6 _) e0 a f- ?4 X
q: x: R( [( U. {( X- T
2 o0 d7 K' H0 ~- |' n5 f# O7 T, i4 p1 S
(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:
% D0 o1 b) H8 _9 [
6 I# V6 H' d" g/ U$ |, w4 f- H
# h. q2 M+ R1 L6 g: ^4 S* |, P
( k" W2 x) B" I; g) d, M3、按键输入工作原理
; H7 n |+ @! \* y. Y按键输入原理:读取GPIO引脚的输入高低电平。硬件原理图设计中通常会加入100nf的硬件消抖,以及ESD二极管防止静电损坏。
- I+ ^# s) F4 [. [; X" L( F+ v. ]) E
! R3 |3 l/ r6 x0 a2 ~7 v* [如下硬件原理图所示:默认PA0输入上拉,按键按下后高电平转换为低电平。* F9 }1 g0 d. F: z2 D( r; U
9 H% U# X( K# P7 ?9 h0 r7 | F
9 |$ j3 Q f5 t3 m7 |$ d4 i' W# }- }
二、按键输入实验过程
3 r8 u- _0 B( \7 F+ {( ]1、新建STM32CubeMX基础工程
' ^5 W. I1 A, V7 P(1)打开STM32CubeMX,点击“File”-->"New Project"( Y6 E" D4 D. ^: X- U: u: `) K& @
1 U3 C# m |( o
9 m B2 K0 r8 H8 C; s$ d: H
# I1 h8 i( L. A& s% H2 P; I(2)等待打开主芯片选项界面(大约1分钟时间)。
2 A: x6 Y" t/ J) X9 [) H; T. e
7 ?3 ^$ E# L+ k+ g$ j
- A8 H4 J. F* r) f# D6 Y$ W( a
0 J, k# n; p8 U; m(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
& z M$ g! B R4 @- r/ C2 H' w4 f: L
- I% Q; U2 J# u) g& N+ f* S! `/ k- u6 Q: Q
(4)选择时钟源。) |: I" n" E( B0 k' w
' v2 P# o$ L* R# y1 V* Y
(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。) t& O: ^4 B8 [ f
0 y+ W3 w' I* e8 R
* c' F, z. \9 l/ C+ H9 E
/ L+ m* p0 d2 f9 l. y! Z(2)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
! _$ d/ K& z- I, t H# S/ H T) w) U1 ^7 L/ e" W) a
1 R! t$ k4 V. u2 e7 F
6 h" r9 N5 k3 q5 E% N
2、配置GPIO控制LED1 `$ R1 u, D0 }# N/ ~! O3 T. R
(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:
/ b) J' Q9 }" e2 _6 k/ l, |, F* Q
LED1——PC0* _+ q6 q4 `# a6 S% Z
LED2——PC1
3 f) {, o' c, J* |6 H- p5 G, dLED3——PC2
5 q7 U4 L' D, @5 c& R v1 _% iLED4——PC3- W4 U( a1 q: B3 R' y+ a
0 m+ S- ?/ J/ i0 E2 o7 J4 \(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。& D' J0 D. u8 _4 [
" t" [5 I5 P6 i. \# P
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。9 n% a$ P& \2 @) W6 t4 V% K) b
鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。
; X2 D7 s ~% V! Y( D v鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。
6 Y, G/ s3 d3 Z' g( v2 ~鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。" G( J0 O4 H$ v7 R0 `0 g
; X6 b% Q5 v. T" Z9 z- Y. y5 n
( _/ W. N, i0 e( M& H
k& v+ T7 `. Z8 G1 E! S
6 l1 ]: \! x4 V, F
- S! Z6 F2 w$ y# R. M& k(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。
( D' p: g0 ?6 e- ^% O/ i* S' x- l ?/ x8 I8 o
' P8 i Z; j4 @4 e# ]& G: x
) N! y7 m" O% R& n( P3、配置PA0按键输入模式
1 ]) }: {; n2 b4 B- b' O# ?2 B1 S3 I如下图所示:右键点击PA0,选择GPIO_Input,配置PA0按键输入模式,默认内部Pull up上拉即可。! u4 p# a4 b: X0 b0 M* h
( K9 d( c8 Q, [/ U1 N
2 N4 \' ]' E$ U7 h6 s9 R ~* v
0 \. N) f! b- F5 r2 @( i; e, h6 M) u j# U# K+ b8 `
, `2 Z* p V* w" G% ?5 U u2 A, c
3、配置项目工程参数
# f Y9 s o( U% Z, C$ O(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。+ Y# c* b5 F/ ?8 Z
+ z& p1 ^! b6 ]' x' t. S, W/ T
6 L' v4 }. M$ X* h* x3 e( [% B4 E( {% L+ z
2 f/ e6 l* m" O2 e+ x# m r(2)完成配置工程。0 c/ P5 w# g9 w/ Q- o7 e" p$ ?" n
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
+ o6 P: ~# m6 t
2 [8 l/ m8 x! ? d( U
# B& P/ ]6 }9 \) x/ T; ^& T9 h, O8 e' z) y w
( |0 i9 }" d2 R' i T( h$ r. @
/ P2 R! \' t) m6 F(3)生成代码。
; n6 d5 X$ t: ~; j( }备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。
2 N6 F% k( i$ g0 @, }" ^! h' r$ M* P, @5 A* U: }6 h
9 P5 [ k: H$ u. V! r- [
) S3 [/ n, I1 M
(4)工程代码生成成功。/ X! w5 s; z0 b' w I
5 I3 w6 P6 y0 ]* S5 v7 U+ f/ S! X
1 m- w ^) e3 P: g+ `4 k" c: X( S; x
三、在KEIL 5中编写代码1 D4 r" f$ [4 e4 J
1、使用KEIL 5(MDK)打开项目工程文件
' K& D2 q6 J$ K5 l& u" v/ J3 o源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。' }" e2 q/ r3 y% d6 v9 A2 @
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。
) v! f, f; r" y
7 X" A7 R" E- M9 j3 n
$ }5 k$ {* g& ?
& V F% t' L" y6 ?1 J2、添加按键输入验证程序5 G6 K8 H. u! P+ o! c# h
(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加按键输入控制程序,如下所示:实现按键输入后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换。
" |4 X. u( b$ B$ M
* L* X% R: d5 F+ t备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。5 Z) W# V9 ]8 d/ W
. v7 z3 T" h( k, g
0 ~: T' r! ^) }! t' ^
! Q: W' | Z( f2 x+ y(2)main 函数代码如下所示:' A8 B% g) G* z
- int main(void)- w4 h* _6 x) J
- {$ }% s% f" [! G+ o9 ^
- /* USER CODE BEGIN 1 */
l9 x! R4 z0 @* u9 H+ H - 2 ~$ }3 r+ i3 k5 ?. @5 T: r
- /* USER CODE END 1 */- C( z7 e& `, @
- ' Y9 N) W/ H3 J8 W4 X) m
- /* MCU Configuration--------------------------------------------------------*/
8 W$ j. i$ w3 l# [% P1 t& m8 D: ] -
& V: y2 E9 }+ u' J( | - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- X2 X( ] _& F, ] - HAL_Init();2 f5 p, F. D$ u: f8 n1 E
-
$ S. u3 g' s0 i: Y! a - /* USER CODE BEGIN Init */
& }& |& ^# J- s/ [% ~3 e - " O9 N$ n0 W9 g1 @: B% z/ W$ U; E
- /* USER CODE END Init */# j6 n5 {, ? D- p9 x
-
& f! f& k: W: W' u - /* Configure the system clock */# l8 y8 C9 }1 g) c$ J" h- y/ m
- SystemClock_Config();0 m4 `! p% z2 o% [" Z! O( k' b
- 5 w* T% |6 \$ [
- /* USER CODE BEGIN SysInit */! C) X6 n9 X7 F! B6 e
- 2 I7 S+ C, O0 X/ O, D* V
- /* USER CODE END SysInit */$ f* \0 T" ~7 g- F) H
- |1 I, y4 d9 k9 G
- /* Initialize all configured peripherals */' d3 L3 G" ^, a# p
- MX_GPIO_Init();
/ y) e/ X" x% V8 v1 g - /* USER CODE BEGIN 2 */7 Y ~5 Q5 S2 C( @5 k! C5 ?5 u2 |
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET); //默认LED1、LED2、LED3、LED4初始化点亮. D" h5 x0 \4 f) I
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);
5 i* D) n6 N7 S$ s R' N - HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);! @- A8 u, A- X+ R/ C
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);
2 e: V @$ H+ N+ z - /* USER CODE END 2 */* ^0 c( D& n. a* Q
- 7 E- x( E5 L7 U
- /* Infinite loop */. X1 q2 F/ s" _
- /* USER CODE BEGIN WHILE */7 k7 ?1 Q% x, j( j
- while (1)& v* p! Y. K' G
- {% b6 e1 F3 y, a j. s
- /* USER CODE END WHILE */
2 @0 m, V5 Z* h - 2 n: ^4 M6 Z9 I" t
- /* USER CODE BEGIN 3 */% z( y w+ Q. j/ Z3 N8 w
- if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET) //读取按键输入3 B# w8 _! C. s9 Y0 d
- {7 a' _* _& ?/ l8 j* b% {) Q
- HAL_Delay(200); //软件延时200ms- a! U! Z9 U v% [" f+ B
- if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET) //按键反转LED,熄灭和点亮切换
+ h- Z6 J$ _/ V% y0 I" d1 o - {
: o( K( G* W5 k& N7 Y2 A - HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);
# C3 Q% O9 s3 D6 [* N v" S7 U - HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);! }' D% c! S9 I1 F# m0 J
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);
0 c; N$ u" D; P - HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);
+ Y# o# R7 O5 W - }( ~) n* j, k4 Y8 b
- }
/ O; G4 H3 @' ?6 R6 D5 F$ A% E' b - }: E1 v0 _' I6 X1 e
- /* USER CODE END 3 */
9 ^5 S7 p9 |8 ~5 P1 p3 u: L - }
复制代码 , _* N3 ~. s6 M8 l1 A$ q& Y
3、设置编程仿真下载模式
' F7 x/ q: a. W" f2 g! A5 E6 m(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。& r/ J+ }( H' w! s( D
7 v3 y% B. G, o+ L5 L: z% W
# P( M. U; V [& F' P/ T; w) w! Y: [0 P: ^1 {! v/ A- e( \8 K
(2)点击编译,完成后提示“0 error(s),0 warning(s)”。
# E7 Y9 Z& w6 c& z1 o6 r0 U, H- T8 m# ?4 v3 e2 h
7 O( U3 [+ e( z% T2 n; u( j8 R- R% ~: u6 q- M( |
(3)点击Download(或者快捷键F8),即可下载程序。; y) f5 g( _, [8 W9 `
6 k4 B- g# f5 p* P. a0 h
! Q3 c8 W2 d/ J i0 ]5 B/ n3 ?" [! C, s" y; ~' N
5 J8 V7 H W5 ^
(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4点亮,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
: v7 E# A, C# N( q& B' k/ ~2 y& ?, I( P0 s% j0 T
2 v+ z7 } K( l' y0 o' ~. L
' F; t( Y7 k% s+ T- n( D3 l: I
% j$ g+ M4 z" @. d4 q. r) V4、按键输入实验效果展示
* |& f& ?$ K6 K: } 程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后常亮,按下侧按键K1即可实现LED1、LED2、LED3、LED4点亮和熄灭的反转切换。- c' G2 h2 g: J9 v* u1 e6 c
————————————————- U$ c4 Z ]8 B7 J- k8 i$ @! ]
版权声明:智能小屋ZYXC& }" N$ i* f: [
9 L* c/ |. a7 p- S* X
- J( P- t2 b( h0 t3 C( u9 ^: z" }0 k5 ?) b
|