一、开发板平台简介:' T' Q) u, T$ \* Z2 W+ |$ r
1、开发板资源简介
3 d( f+ v1 T$ [(1)开发板主芯片型号:STM32L431RCT6; c4 I8 a6 Y( S/ n9 _/ c8 B
(2)开发板主芯片封装:LQFP-64_10x10x05P
" x- v- }" `, u8 I8 S3 U- {7 Y(3)开发板主芯片内核:ARM® Cortex®-M4/ ^4 J% Q7 [: g, Y5 f/ l3 f
(4)开发板主芯片主频:80MHz1 m6 ]8 r7 ]; p9 a: p
(5)开发板主芯片Flash大小:256KB
4 A( [" P/ Y- b9 N4 S! Y(6)开发板主芯片RAM大小:64KB
) R7 Z$ V. _' U" g
$ Q, q2 U" y" b7 l1 B: h
8 i8 x0 R# k1 W1 T+ ^* o" u( ? G' I: q+ f5 _. y
" a7 e* K1 `" i6 T( ?+ @* k; d" `& l, ], \1 r% |, @
2、LED灯资源
- F8 K6 M( b: R. m(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:# M7 O0 d7 {- u2 m+ s3 a5 T% c
" m9 q# e6 X$ r3 W+ M( @ f" X
2 S! K r% y" L2 w( O6 T" ] F3 @& S6 s- A5 c/ M6 Z0 h7 n
(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:
8 ^% K* \* Q* J0 \0 p) j
4 K" l- d* H1 |. w: X
" _; f7 W; ^ U; l, V: M# S9 N6 M9 K" h! n. R/ @
3、GPIO外部中断EXTI工作原理
- T. i8 A6 ]8 O) c0 A% d8 e8 vExternal interrupt/event controller,外部中断/事件控制器,管理了控制器的 20个中断/事件线。
) R# c+ h* \, B. o; e+ `9 k3 ]) v) {$ a/ v
每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线单独配置为中断或者事件,以及触发事件的属性。
( a6 c; b, W8 Q4 t2 l- o+ I1 e) z; ~7 m% z* p
GPIO引脚的外部中断触发方式:
% g; D/ L b! _$ I上升沿触发
8 R2 y1 l$ ~7 q# s下降沿触发
+ y5 a. _9 @- ?- ]( \双边沿触发
0 Q5 c5 p; m, |+ J/ `0 N7 g外部中断的配置方法:
) w; R! g" U$ s2 a+ |开启IO口时钟,初始化IO口为输入。
' O- z6 Q4 h# U9 W0 c! V开启IO口复用时钟。) ^+ ^# p! H$ p" Q: u: u6 E; O
设置IO口与中断线的映射关系。
1 @" g/ [( z% E! V初始化线上中断,设置触发条件等。, @! p" u7 y$ b
配置中断分组(NVIC),并使能中断。
# g$ Z; d3 Y" l6 s0 A) @编写中断服务函数。
$ g4 s* n7 _; _ t4 d' T- b清除中断标志位。
6 e9 o w7 b6 @ i1 `- f5 H+ {1 n/ {! m
外部中断实验按键K1作为外部中断触发,原理图如下:& B$ {' d, u1 C! T
+ T" ^ S7 J B/ l3 I3 B+ ?
" U1 z- ?8 q3 J8 }% {- T" u. E% u
% _3 z% Z6 _% R$ R- d1 Q' U 二、GPIO外部中断实验过程; V( ]; z7 C! V1 ]8 ]9 b
1、新建STM32CubeMX基础工程
" d- @& L- ?/ @7 c(1)打开STM32CubeMX,点击“File”-->"New Project". Q" J3 ^& q. n. ?" o4 l2 b' ?
/ V4 ^ I. R" m! H p/ M) Y0 J
: ?" b6 e4 y: V( o/ C
# S: L4 z+ z# N7 x% ?6 i(2)等待打开主芯片选项界面(大约1分钟时间)。
+ Z7 Y8 B. w# S2 }; k/ C+ h2 {7 R+ \8 e, s& H" z! G
- m! W0 G, _! Y; K& a& q5 C" }! i7 s$ b- z& x5 L6 G
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
3 q: A% }/ W2 ]% y
|. G9 e7 t) v
) n0 n% h. h3 Q) i2 ?6 ]
& W7 s" z( j8 h3 a7 R0 b8 }5 L) K(4)选择时钟源。
$ p) k1 k$ o5 i' J/ {8 s0 ?5 M(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。5 @. H. h m: ]. ]" m) E$ z% r
) L9 C! t# b& V% z7 ?
2 s# z- d- s5 y* `' B S3 o
6 ~' D- B3 z; j(2)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
( Q6 u* u4 _8 U4 Q
9 l/ X: w3 X5 N% _/ J
* z6 x: r0 p* \
/ H) g; l S/ V' d! c" H H2、配置GPIO控制LED
7 m* B3 G2 J# E% S" C3 Y: d(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:* d% M0 t" m3 O, ^
LED1——PC0
7 o; ^4 X* \/ M& @, T$ m/ v6 q' r f% yLED2——PC17 V8 i0 E0 t+ W' q9 o2 j+ ^
LED3——PC2
% J, @: M! \( Q+ z1 C) }LED4——PC3$ E+ X. b9 _) P: l
4 E- v& K/ [+ j, p, u' {
(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。0 a1 I5 M+ k1 ^3 p$ F; M
0 a `' f7 f" u6 K( z
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。6 n; L D+ y! s5 v5 R
鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。' `; Z: \" \8 n( k/ c; D
鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。
- ~. K: [$ x: A9 ^9 Z0 @5 E7 e鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。
: r2 f, m! X, p- Q1 O7 f% d5 f4 o. V$ c2 R: e) {% i
( c3 V, H. n6 {$ i' D3 ^$ D) K6 @4 ?% }
% N5 O2 L, |% R* ~. J0 C. |( S) E2 Y3 @6 L% n7 i
(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。$ H( I: U |4 G
9 Y; S. [3 u' z; E
+ Y2 v- s' L- p% c. X
% i( Y# |! g1 }
3、配置PA0按键外部中断输入
/ S1 E1 l% _: a+ l$ l(1)如下图所示:右键点击PA0,选择GPIO_Input,配置PA0按键GPIO_EXIT0(外部中断)。& O x9 ~5 `+ g. s4 |
& I8 b- Y" H: S7 ` S' P9 W
4 `. o" v* ^8 \; x F6 h7 C
1 W8 f7 Z% T" N: E (2)设置PA0 的GPIO mode模式为下降沿中断(External Interrupt Mode with Falling edge trigger detection)。
7 ?9 f$ T' m3 T/ }( K4 G l: N+ u1 O3 }1 {+ _/ G# @2 A1 [
: C1 d6 S1 V# U
/ C, N" u5 z+ K9 x (3)使能NVIC(嵌套向量中断控制器)- p* g4 O$ T/ w) K' z/ u+ B+ s: m8 g
2 I, O3 ]1 _% I* f; t8 C# D8 _/ O
+ C( s" @2 ~# P- H& ^* Y A9 d' G! p; a4 p+ d
& H6 M( _" q8 \4 Q e9 j4 _0 W7 X
3、配置项目工程参数1 A8 D$ i2 I" K* g$ f
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。4 U4 R8 c/ V; Z, [/ K
1 e9 X7 \! B8 U# `. @2 Z) |
, T& R: r- w6 E9 F7 h+ ]8 E$ \, `
) [/ [0 X# [; C4 H(2)完成配置工程。
% h' `$ F7 I0 R* s2 s0 {! ~2 Y" ~- b1 ~+ P/ m/ x
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
' `) b7 ]: x4 `7 B8 Q. U4 }- M, R( Y4 M7 N4 A; _4 O
, L Q/ K+ \% [) _ {2 c! Z2 P/ E2 {+ m4 H2 }8 q' ?. g/ V
$ X: k- V$ z, X3 K5 g4 H# s- i! G
9 ^+ U( O; \! U4 Z0 z(3)生成代码。. w# R' G/ J, c
备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。9 m3 V" K& D- x3 G
N* K! [4 H* q# e
9 ?5 w! x3 v7 e$ K2 |
( H% k% B4 d' c! P: J4 W$ J(4)工程代码生成成功。
4 e0 L8 _5 K: q; ^' ?
7 N _8 F# [5 \* l5 c9 X
% C9 o' S9 V0 @' E
3 C0 o- O0 W4 v2 J: n* M2 v 三、在KEIL 5中编写代码- g! h" _( I" W3 z
1、使用KEIL 5(MDK)打开项目工程文件: x# I( W6 _, t( U; ]1 v3 X8 i
源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。) ~- W! N9 m9 g1 u7 N) ~' r8 p8 `
( Y& s% q8 G& Q
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。
( P8 P! l$ Y. u1 I
) Y m% J/ z; b2 ]* k) J% |- i. Y1 O
' t. K `- L! P! z, A2 y; i
/ g- Q' h& w6 f+ ]" G2、添加按键输入验证程序" [3 f, q' |; P
(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加延时10ms,防止进入while死循环,如下所示:: m4 T. d0 E: {% S( ?2 I4 O- r
% N. L5 m* u9 v9 D
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。1 g9 G" V+ R9 O$ Y
. k9 ]# t9 _; l5 d0 {3 |
/ |4 x; H6 i8 K1 L6 f7 P% s& {0 Y+ S( x: x M9 o) S% F) z( m. h
. C) c9 r& {4 ^8 r
(2)main 函数代码如下所示:
0 k7 P9 @3 a; v0 I0 \- int main(void)
1 z- l2 b2 W: \3 X - {$ [3 `1 ]% o1 t4 F7 D& N( c
- /* USER CODE BEGIN 1 */
+ L7 z5 v- `! a7 R3 E& L: I8 X9 r - 6 s0 I% b, V# K5 U7 ?( G+ v9 g& x) _
- /* USER CODE END 1 */
5 i0 S) W3 `0 j/ M% J: A -
0 U9 F5 o. z& e7 o - /* MCU Configuration--------------------------------------------------------*/6 L0 M( p9 z+ M1 G
-
! B! H! c$ Y7 A# a - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
( H9 i+ M+ |: z& ]+ V - HAL_Init();* R* f7 I# d3 s3 k% g+ u$ Q2 k
- 7 Q0 y9 B/ {# E- n. E G- i
- /* USER CODE BEGIN Init */2 K. |" t' E% s) e5 s, S
- ; z. {4 B* f- S, H; Y
- /* USER CODE END Init */8 Z: N& e7 U# Y8 n6 W
- ( g' u6 a m! i$ S
- /* Configure the system clock */+ m! N! G# Q/ ?
- SystemClock_Config();
" c3 R6 V. Q, q7 b/ c( G1 d/ a -
- P6 X! Z# U0 [+ ]/ d, |$ P - /* USER CODE BEGIN SysInit */* k* y5 p0 Y' O. {
-
2 d4 V: I& G {) V! J - /* USER CODE END SysInit */. K1 ~/ N. D0 |( w8 z
- & C* n+ S1 B6 k/ \' J2 x
- /* Initialize all configured peripherals */, _# x: p) N, o- ?$ L7 e+ L
- MX_GPIO_Init();/ O% Y; \2 u8 s) T, H6 d! D0 ?
- /* USER CODE BEGIN 2 */
; s* G( Y# r8 h4 _, H1 _+ i - HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET); //默认LED1、LED2、LED3、LED4初始化点亮
: [' S" ~/ J0 ]9 m+ p - HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);
$ t+ F2 S+ r, H1 ]( L* B - HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);: P2 c; b! B' M; r) `" y6 u3 K% Z2 {- b
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);
# e, g7 |! Y9 g0 g5 b; ~ - /* USER CODE END 2 */) v* b+ [5 Y& K: R
-
+ _8 K0 l) [6 `2 u3 I: { - /* Infinite loop */
: s8 P/ w/ p2 [6 D2 P2 ^. L' Z - /* USER CODE BEGIN WHILE */2 @. _8 i: s, Y- j! U
- while (1)* Z; P) p! e/ `6 k
- {
7 e6 u/ r: b4 a* d3 M' [3 M, O - /* USER CODE END WHILE */
/ r0 O1 R3 a4 J1 ?7 P/ U! } - 3 A$ l$ ^0 J9 H5 I% q* q" u
- /* USER CODE BEGIN 3 */( Z+ q, e- M3 M( ~9 m5 }8 Q
- HAL_Delay(10);+ |! K( z) p; O6 b) B" Q" n
- }
. X' {2 K9 N1 s2 c1 G" c4 E6 u. c8 D - /* USER CODE END 3 */# R* M* H5 Z/ c j4 M
- }
复制代码 j! T9 E8 E) o/ U" H. h# O. ~
(3)stm32l4xx_it.c文件中对exti中断函数进行处理,添加中断响应处理操作,当读取到下降沿时,反转LED1、LED2、LED3、LED4。" e$ w/ C, @' ~5 B. |
- /* USER CODE BEGIN 1 */% s# }$ [7 G( j D. u
- void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
2 O5 b3 d$ n2 u5 }+ L- e& {. M. ^: i. g( Y - {
3 W( I; n- N R6 \- ^& d) H - if(GPIO_Pin==GPIO_PIN_0)3 A+ `/ z, `# N$ d. R- |' p
- {" l* [4 B x8 a1 i9 b
- if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)
2 L5 j' `* W, G2 |4 D6 y* ^ - {' g4 A! \% ^, z+ D
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);7 ^& f- H0 R, O: H$ g1 j/ b$ B
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);1 _1 Z4 U" h* v5 W
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);) `( a* B, W# c1 f/ @* u6 A' w
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);; e4 R# r& L& H( k/ s* T
- }
/ Q- u6 K2 `: v- ^; S - __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
% J0 b) z5 s u# ~ - }% Z) v: {5 j7 x& W: z8 i" A
- 3 z; E9 ~" [6 {! |/ m N; }
- }& V h6 k( j! g- `
- /* USER CODE END 1 */
复制代码 * U, Q% r5 p& T9 ]6 U7 ?/ t3 I
(4)stm32l4xx_it.h头文件中对HAL_GPIO_EXTI_Callback函数进行申明。8 o# `5 m2 L. T- L3 v# j) p: W I
- /* Private includes ----------------------------------------------------------*/' N9 k4 ^$ q ^0 ^. G' N* n& j
- /* USER CODE BEGIN Includes */8 p, V1 g$ A8 ?5 \* |8 ~8 F
- #include "main.h"9 |& X8 N% R% \1 D: s% U
- /* USER CODE END Includes */
) L- ?- Q/ r8 m; Y: y+ ^ b% z -
- N7 o% K8 m- q9 V0 c - /* Exported types ------------------------------------------------------------*/
+ c+ ]0 M/ E4 U7 o) s( m - /* USER CODE BEGIN ET */
' @6 T6 o8 @- W+ R9 ]8 F' C( m6 Y -
" p1 b- P4 p1 j# x* m Q - /* USER CODE END ET */7 ^( Z! @0 o) e1 j+ H& h$ i8 x
- , P' @, u* p& k9 ?6 f& i
- /* Exported constants --------------------------------------------------------*/7 l% \& B" @( U) H# H d* F) t
- /* USER CODE BEGIN EC */
1 a4 |# ^% [% y -
- `% x( d4 g2 p5 t8 L# m* P - /* USER CODE END EC */' Q3 G. e8 b0 O" d( F/ D; _: W. Z
- 2 r. O7 S. ~, f
- /* Exported macro ------------------------------------------------------------*/
4 C" j. l* u6 L2 W - /* USER CODE BEGIN EM */
6 f! H7 V0 O* w4 E- c - void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
- y9 B0 {8 F" i5 l) X% c - /* USER CODE END EM */
复制代码 " b% P8 R- i W( V% N U
3、设置编程仿真下载模式9 G% H. S! L# l0 P \
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
: [& T: t' W, N" x* `3 }( j8 q" w: f0 `! T) X7 H3 h: k: b4 {
; D0 _& f- w* h, l' B
0 W: _7 ?' H5 z: P. u0 r' h$ b* n
(2)点击编译,完成后提示“0 error(s),0 warning(s)”。
- e% K9 m+ P6 j7 h; M6 W y
! b% n( O: E/ @; J
2 l+ H6 v3 P% p+ H$ P1 h! f" m
/ }7 R- N) {7 q2 I7 W9 \2 P% v(3)点击Download(或者快捷键F8),即可下载程序。
) c2 K5 r6 Q, m4 {* }7 e( j _3 `
1 s2 C& c6 R* a8 V
3 r9 _9 [* i1 Z* A# A
# j" K# y' x, W
(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4点亮,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。# c0 _" v6 U7 G% C7 k5 m
0 t* M S. ]! o+ C3 O
% h+ v6 b; S) g' Q' H( b6 H, \ $ W3 a! z! c, k3 c( V u
4、EXTI外部中断实验效果展示
' C5 L/ E4 [1 z% I 程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后常亮,按下侧按键K1即可实现LED1、LED2、LED3、LED4点亮和熄灭的反转切换。- `/ s. s, W" |% y5 k: |
————————————————
% [6 A, _" [. M+ Z8 o8 }版权声明:智能小屋ZYXC8 a8 U5 |9 C* b
. z0 {# L' u' i4 p( ^) P9 W+ q
) X: y6 U! ~+ H& t: m |