一、开发板平台简介:: C$ y% t# i$ e h4 h+ P j
1、开发板资源简介9 B- R( [4 p( E7 F. s7 c4 v
(1)开发板主芯片型号:STM32L431RCT6
- [. N" ?+ r$ b3 W4 p9 y(2)开发板主芯片封装:LQFP-64_10x10x05P
. a! |; `0 T7 b% h; i6 M$ V(3)开发板主芯片内核:ARM® Cortex®-M4/ w3 w5 D- |& J# Y
(4)开发板主芯片主频:80MHz
1 o q v& w! W! i2 X7 A(5)开发板主芯片Flash大小:256KB7 J/ B8 J# x0 ^3 J9 |
(6)开发板主芯片RAM大小:64KB) y4 J0 a4 n/ {% ~8 L
: I) ?. c9 F0 x5 w7 Q6 g) S1 n
( }7 t- d4 F9 X' @7 A( t% ^ n
' Z+ P- l( z- L! Q) v5 D
. z9 b% }! [5 x7 f$ b+ b
2 f7 m/ _; U/ B# ]! u2、LED灯资源9 Y$ t) Z _# \& L, z; d0 H
(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:, G" _: G/ l! U) q
6 D* p% Z4 t& Q% Y* \$ g: H+ j
2 x4 C) I, \, [8 ~
) \- \) e) ^5 m' r(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:7 k# n G4 q- ]+ M' J
$ v& ^) b S/ F r+ _9 b+ [
; ~# ?$ z) {" V5 _& i" |
" {( n# {& @% u: ~3 Z7 b
3、GPIO外部中断EXTI工作原理
- z! S9 A: M' _9 m8 C7 y; CExternal interrupt/event controller,外部中断/事件控制器,管理了控制器的 20个中断/事件线。
, I, b5 d/ P" g6 C# \) @# p9 `7 Z& M y$ N- U
每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线单独配置为中断或者事件,以及触发事件的属性。$ Y0 i0 |; l/ f$ P
& L2 R! x! g1 P s2 E3 _0 [$ B# ?
GPIO引脚的外部中断触发方式:3 W5 }* |' W2 d7 R. U2 j
上升沿触发
$ _4 H; s6 N* C下降沿触发7 s Y! R0 Q, \1 D# F: m
双边沿触发
2 E/ C* h7 O" ~# p1 m3 s外部中断的配置方法:, u, ^& f" y: {1 I
开启IO口时钟,初始化IO口为输入。" A' `* J5 m' v: B
开启IO口复用时钟。' p. |) }& `2 q% |
设置IO口与中断线的映射关系。
0 @: ^6 B4 f8 O# Y7 O8 N/ k& q初始化线上中断,设置触发条件等。
) ?/ x1 X1 \% u8 @6 I% k6 T配置中断分组(NVIC),并使能中断。
0 Y$ C" E3 P& v* Y5 K& E编写中断服务函数。9 ~9 L+ v& y' n1 |6 H2 _: J& o7 @
清除中断标志位。" `* ?* |8 b0 s- @3 h H
/ q3 X# i5 {( V( ^4 l( Z; |外部中断实验按键K1作为外部中断触发,原理图如下:. q) n h5 H9 x* ~% ^
g" |9 q) B; j: `& h4 J! K0 }0 t
$ X! F6 G2 `8 ]) V# r, A5 m7 I
+ c5 Q4 ^, Q; k @$ ?/ a3 E( h
二、GPIO外部中断实验过程
3 G6 ?/ l* L6 r1、新建STM32CubeMX基础工程# d/ i* {$ [0 @4 T7 ]
(1)打开STM32CubeMX,点击“File”-->"New Project"
) ?$ G+ E% E/ a4 f8 @4 B2 b
: _2 q9 Y2 Y8 L c b n+ d' r
' O+ l7 E* ~1 T! s
6 L% t3 |& ~% v5 H* l, i(2)等待打开主芯片选项界面(大约1分钟时间)。
8 s2 k! V& ^9 S0 Z" ^6 W9 C5 p9 N5 J5 r7 b1 p3 I- Y5 W
1 @+ q7 k& v ?9 n
7 w5 z( Y9 P- D, R/ U; ^5 i- q(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。7 g, x+ Q, N* N+ M' w2 v
5 u: I, [, f3 D. V. w, ?
6 U0 s$ j7 Z5 k5 K
, M1 w1 t* {# E5 e0 t(4)选择时钟源。
8 |) w5 j2 Q* I/ ]( r3 J! f9 D* S(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。* m3 a3 o$ [% ~0 p5 `/ O
3 ?( G: H7 |# `; K2 g V( [
8 J+ `4 L x. s. s2 E3 x2 R) V l4 C4 Z) R \- j% T
(2)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
9 L$ y6 b* W% h( ^' ~: }' G
/ O& H8 g8 W* Y7 z, S, \: R
$ \' h: H' r+ o
5 {! M1 `. D1 a; a% t0 Q2、配置GPIO控制LED
/ u F& ^( J8 l$ v$ F(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:$ Q# i$ h/ \7 M) F( x7 t; R
LED1——PC0
5 m- l1 }8 E" B6 \LED2——PC1
, L' w: f) [( U2 ?$ \/ NLED3——PC2 t ?" U# y" |$ `
LED4——PC3& f/ }' O) Y$ G$ F: g/ e
& s. v+ E/ H- k' S: [(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。9 L2 b4 ^. Z1 Z
' d0 F8 l X1 _7 D( T; q鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。+ N# S2 Z# M" I3 `$ e( x
鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。
K1 a& {- L2 d1 y) b( H鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。6 I6 h3 a6 k$ v3 r$ _% g
鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。0 G/ J- F0 G: U
7 v% G v+ v5 O8 [* k
% d1 C. r) F# @* x( _; m
9 h* Q& L1 K. P% U" p- F7 O
) [/ D: z3 L: U( X2 h
! i2 {3 C% V' q$ n(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。) h7 m0 w" Y' E s4 n6 T
7 n5 _% R) J! D0 z* l7 j6 s+ o
+ T: f, f, V/ b
8 V( s& s3 a% T$ l: O4 J3、配置PA0按键外部中断输入
% E. u9 Y, u+ \- b+ d2 J3 O(1)如下图所示:右键点击PA0,选择GPIO_Input,配置PA0按键GPIO_EXIT0(外部中断)。
$ N$ C T, P- [5 k' l, D: S' O ]4 z$ V
$ F8 z* w, f$ [, i, f
3 F3 Y: {3 ]8 z
(2)设置PA0 的GPIO mode模式为下降沿中断(External Interrupt Mode with Falling edge trigger detection)。
# k+ H/ a5 Z* ?6 p
N! e! ~5 ]% e' m9 n9 v
' L) F8 {6 r% i
" I6 Y9 N$ }0 c4 ~# x' ^ (3)使能NVIC(嵌套向量中断控制器)
* A8 Z7 }& q+ [9 c/ H2 d9 B
# \& r7 q$ S* N& ]$ C! ]
?% Z, H& J/ x
6 V) I6 E7 d3 q. R' p* M' p; V+ V! E
* m2 S2 v& z+ t" M1 A* K- I 3、配置项目工程参数" Y. [- q# M t+ G" w
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。
9 ?5 i z9 S# c% j( u: W w3 L$ c# c; v- z
: U* t! C `9 s8 i5 M0 d$ V
2 s! p% S9 R% z- B
(2)完成配置工程。: X8 B. d( i. }! ~, x4 h4 c8 T
2 y8 H- q& h" o
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)3 e+ O6 E; F$ E: k" c$ X
+ I* z, M; J* ~; E& x
1 m( T/ ?: ?4 S+ O8 Y- m1 I5 A# v4 g$ i* }
! H- q. v9 v0 c
! P7 K5 s5 }& h) n4 p- c! ?
(3)生成代码。
4 u' H, \0 x# X$ B2 ~备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。. L( l6 e4 j/ q% o
+ O6 z- l. C' Y
+ N6 K, n8 A) d) a2 `+ C$ E
/ ?7 F; m1 p$ x: ]' J4 G+ Z
(4)工程代码生成成功。7 p( s2 k' `; e7 S
* d9 L5 T$ [, v
+ t3 h0 Z, V6 A q8 e
) W+ V$ x3 [5 q& D- `
三、在KEIL 5中编写代码! b5 f$ I( a: K2 ?! H4 j
1、使用KEIL 5(MDK)打开项目工程文件
) M. z: Q; p; c, M, m, R源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。! s8 i- f; v, v" m; \9 o1 k V
8 w) D* F8 g8 z1 F6 u- U3 |(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。: ], Z2 V1 z- ^8 y5 t9 z6 c. I
- C% H3 J9 q) R0 p
2 M) w) ?; X/ E% {7 U+ K5 h) n2 I9 J# U. L7 x1 H
2、添加按键输入验证程序
/ @. h% s4 ~4 L3 x(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加延时10ms,防止进入while死循环,如下所示:' Z* |9 v6 z0 C4 m3 _7 ]
8 p# j; D8 D% l7 D5 L* A3 C
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。
" q v' |! S1 L" e- A1 {+ g% e2 L4 e: Y" O# B& R. C4 j: K6 `" o
4 f! i X+ C' A) f, Z& q. u* F. u$ q! J
9 G+ e% p5 F! I- d7 R
(2)main 函数代码如下所示:
- E% l* b" Z5 W. w9 T/ X- int main(void)5 W9 t) K: m2 k; l+ u
- {& n+ F' I) c- z
- /* USER CODE BEGIN 1 */
F' g8 ]1 O: {. B. p5 C9 N& T& B -
! L, k& S: y+ _7 U5 x! u4 C - /* USER CODE END 1 */4 i& g8 \1 p: \9 ~
-
" q: M+ N# g& \' i3 s - /* MCU Configuration--------------------------------------------------------*/
7 _* M$ k c$ E2 z - & R" ?2 F1 X; G- \, t% b
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */8 Y7 d$ R0 }- I: q! p/ T% g3 R2 r/ Z
- HAL_Init();
$ R3 V! v6 J8 j9 R( L+ d! K -
: s( `, R- o" c' M L6 H" V - /* USER CODE BEGIN Init */$ Q L# z* [2 [/ B
-
! U6 V3 }, Z3 B1 J+ s$ C - /* USER CODE END Init */
' I3 w- p/ G t: z# _ - : L8 X2 C; E, E# }7 a
- /* Configure the system clock */! g0 |) [! `* r7 M% O) K
- SystemClock_Config();5 Y7 v$ S( E) F) l6 t; V0 T
- : F& @! M7 ]6 E& f' \
- /* USER CODE BEGIN SysInit */. @: i& R. y1 W! r5 X
- / R' j( i% a/ k" \0 S# E8 W2 `. c: r
- /* USER CODE END SysInit */6 ~* V; n E9 o1 F
- " | y- h' X7 L" W) a
- /* Initialize all configured peripherals */! a# {* ^! R$ L; F4 l) g
- MX_GPIO_Init();
3 s1 j6 Q+ @4 p: F! W8 H0 i - /* USER CODE BEGIN 2 */
+ P- L3 T9 g2 D - HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET); //默认LED1、LED2、LED3、LED4初始化点亮# Q/ n* r4 |# e( I# z; B
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);
% ~% }4 C- [1 n& ` - HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);: y% t0 ^" e% n0 A3 b7 L
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);
/ p$ `1 N! j x0 f* S" P" \ - /* USER CODE END 2 */
, `* [+ I2 t& @+ G) e - / q% R4 ~8 W, f5 `. A& E0 e
- /* Infinite loop */
& Y' X0 E2 u' E, F" j9 q - /* USER CODE BEGIN WHILE */
- i% ^8 P- I) u! q* r) U+ v - while (1)/ d7 U& O: v! C% V6 G
- {( B3 d6 b+ l% e ?
- /* USER CODE END WHILE */
% _4 Q5 ]* x A* Z -
5 e2 @' C& h3 C$ I0 ? - /* USER CODE BEGIN 3 */
6 _+ f4 \$ M4 a; a& E% Q - HAL_Delay(10);/ l; u& s/ r' K6 a: {/ e5 B! H
- }0 S" H& {9 I M& K, B* ?
- /* USER CODE END 3 */
& E1 |7 Q; @# C! W$ ^, O7 _ - }
复制代码 * a' ~6 B& R1 o3 g' ]; U$ y& V) P# _
(3)stm32l4xx_it.c文件中对exti中断函数进行处理,添加中断响应处理操作,当读取到下降沿时,反转LED1、LED2、LED3、LED4。
% P ^, T7 Y% M7 q- /* USER CODE BEGIN 1 */" @" n. C6 o1 i; F/ Q0 x9 Q' [ `* m
- void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
% ]1 Y6 b9 s4 F/ j2 _3 L6 C9 C - {) m5 q6 J( `) D. A; I) [
- if(GPIO_Pin==GPIO_PIN_0)
: _) Z" N3 R6 G/ G - {
5 g1 c& X. p+ e$ q, _ - if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)
0 P3 Q9 S) |) N6 [" [ - {+ V/ l$ p. x, @4 ^9 n3 Z+ r) J+ N
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);
- R& t9 l1 n d7 F - HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);$ p; S- S- P4 O$ c( w5 n6 i) x
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);8 H# Y# N. h- U: i f
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);7 p. |4 v+ k; T: e' T. b- |: l
- }( l& U3 K! ^' V% l
- __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
* E% U5 y8 I' g% R9 |' E - }
) Z+ J1 X: Q: U7 O1 l+ E - " k/ L/ N$ ]3 m6 s) q. s- Y7 I/ s" l
- }8 M: m+ L6 {# j6 K9 ?/ I7 j( w' S' c
- /* USER CODE END 1 */
复制代码 + a1 p' }! q1 D3 {" I
(4)stm32l4xx_it.h头文件中对HAL_GPIO_EXTI_Callback函数进行申明。$ T4 F; \0 `# X" F
- /* Private includes ----------------------------------------------------------*/
0 u9 t& ]# K9 N6 j* s - /* USER CODE BEGIN Includes */
' S) J2 U0 L5 e! I e' n/ t) z( w' n - #include "main.h"5 c2 s6 I( w4 t+ Z6 ]# P/ u
- /* USER CODE END Includes */6 V0 K/ e' o5 M8 O
- 2 `7 j/ L+ |3 |- W6 w
- /* Exported types ------------------------------------------------------------*/
- V3 i3 ]# a; d( y - /* USER CODE BEGIN ET */
3 w' i! C) j4 | -
1 q. p, ?6 p$ T) x - /* USER CODE END ET */
/ j# R( u( G, O- c9 y -
2 }! x% S( }6 w - /* Exported constants --------------------------------------------------------*/
7 y! B& V- |* h" ]1 |' c - /* USER CODE BEGIN EC */% y& i a% K: a k0 p
-
# e' W- F2 w7 ~1 O - /* USER CODE END EC */
3 h: N3 j% v& W0 Q/ r -
1 D: ^4 B& W. Z$ A3 r - /* Exported macro ------------------------------------------------------------*/
1 ?4 D+ K5 F- u) E4 l - /* USER CODE BEGIN EM */
7 B( R5 ~ Q0 q7 }. v - void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
# Y: P0 \4 {0 B4 o1 B6 e - /* USER CODE END EM */
复制代码 1 E2 O6 G3 H2 G6 ~! R, L
3、设置编程仿真下载模式
( c& B" H8 ]3 z# \(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
* |9 h8 P+ t( E0 P7 f/ H: M
4 O' X9 v9 S% _. Q; Y% s- l, H6 I
5 L% h* i8 X7 I3 q: q [- r9 U* |- O3 ?3 H
(2)点击编译,完成后提示“0 error(s),0 warning(s)”。) f2 [! c0 K9 s U
9 p& y8 a2 H f. N6 k3 n4 \ u
8 ~+ V" Q5 F/ I1 u* j) {( m9 F4 u4 y( c! @ ^
(3)点击Download(或者快捷键F8),即可下载程序。
/ C1 \+ t. ~' N0 z& m/ c s! x+ |4 w- y f, ]' T; J7 c! t1 w8 p+ k' @
& x$ O9 ^9 J7 H6 d
$ e& Z7 J4 N6 b T1 {: P( h% s: J, M(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4点亮,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。$ \6 [4 ^6 Y# L, P" a
1 S# q- l) L8 O3 R/ j* E
" y% T0 Q( ]; q v1 T
. Z3 e( R( q! s9 S4、EXTI外部中断实验效果展示
9 M0 P# }0 ^5 j9 z* C/ O 程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后常亮,按下侧按键K1即可实现LED1、LED2、LED3、LED4点亮和熄灭的反转切换。) x* Z+ q' Z* O! S" X" A
————————————————
+ I: ^: F0 v' \& w: l5 L. }版权声明:智能小屋ZYXC
. [2 D: [) o5 R( T. g5 k! [7 J( b# T8 M }( l7 x
( g. _5 D) [" t- \
|