一、开发板平台简介:
. b5 @0 A( x( A3 c+ O1、开发板资源简介
4 e8 `- w* q# S4 Q: ?) ?+ E5 @8 g(1)开发板主芯片型号:STM32L431RCT6* Z' V# w: c& ?; o8 Q9 @1 ^* E6 G6 j
(2)开发板主芯片封装:LQFP-64_10x10x05P
+ R0 S1 L4 b) x4 M2 p5 u(3)开发板主芯片内核:ARM® Cortex®-M4- {% y3 x- c J6 i3 ]
(4)开发板主芯片主频:80MHz
) n) D3 j8 A8 R u7 L# Q' H0 Q(5)开发板主芯片Flash大小:256KB& P- \ a0 H7 m7 ]0 E) f0 R
(6)开发板主芯片RAM大小:64KB
: C1 U3 v+ N$ P4 T9 u; K) I1 l" _0 G# k5 W$ @
0 }9 j/ J ]# Y; ~' g0 ^
2 ?# R* v. n2 v$ l
' [& B5 ~/ B8 Z- w1 }7 Y5 s+ \& T1 ~' G% P
2、LED灯资源
8 I8 u: \! I4 `4 p(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:
' I/ d: D( X; V( `+ ?
2 W4 K' q% K9 e9 S3 m
/ _& V3 J$ T3 c) U8 w
- r4 _. }" y Q- }7 ^6 C+ I(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:
. e( [: v& F8 _- X) g3 P7 z: z4 T" x
2 B. e0 v5 K* m+ ~
2 O( W8 t9 l; [2 p+ o! e3、GPIO外部中断EXTI工作原理
1 [9 O$ j- P8 v t2 h- P6 ^External interrupt/event controller,外部中断/事件控制器,管理了控制器的 20个中断/事件线。
9 \- M5 E& g; y, ]7 |
( P L" q& a& p每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线单独配置为中断或者事件,以及触发事件的属性。8 L1 I, u7 I" |$ o% j
2 Q; s# j8 @. D% d! z) r# V% [
GPIO引脚的外部中断触发方式:
. e" k1 I+ x8 e# g, N上升沿触发( T# Z: P' M2 r
下降沿触发
- \$ N( c7 s& `1 l9 O$ W0 ^% b( u双边沿触发# K, ~) z: O# x7 [% \6 o
外部中断的配置方法:0 A4 R9 W) R9 Q, ~0 e' @
开启IO口时钟,初始化IO口为输入。, k. W7 J9 r/ T* R y
开启IO口复用时钟。
1 ~- {6 }+ y, N设置IO口与中断线的映射关系。* `+ i2 l# W7 p& i0 ~- C2 z( {
初始化线上中断,设置触发条件等。
, _# x) H4 W; j* H4 ?7 {3 o配置中断分组(NVIC),并使能中断。
( {1 J: H2 m1 g3 h编写中断服务函数。: x& |# J/ I- Z0 h
清除中断标志位。
; z" @8 n; F$ p7 X1 C9 }
: ~* [3 h' X, b6 j* n4 F外部中断实验按键K1作为外部中断触发,原理图如下:) \' f Q0 H/ `/ C* N- t. X0 l
( E3 n9 Z+ R2 @% z- f: ]: }3 ~! E
) s% p6 m( a1 @6 M$ T( n+ O m
2 a5 q6 d+ O# k+ \5 b2 c 二、GPIO外部中断实验过程
( G1 w" `; q! Y: P v1 f1、新建STM32CubeMX基础工程' W, s. X! Z" a
(1)打开STM32CubeMX,点击“File”-->"New Project"" B1 k4 j; m3 A0 M% ]! p6 v# q
( a* I) i4 l% m: m6 t
- F5 U# y! U2 J( \ o% f! a- s5 A( V! h+ _
(2)等待打开主芯片选项界面(大约1分钟时间)。* s/ \) B# P F" z7 i
4 Z, ~4 R9 B3 F5 `, V
2 j$ P# E" d' g% t7 |" ]) C+ t+ r
) P! w# u8 o* N: f, A9 z(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。6 u e( `+ i# @' n1 n5 Z4 |) E, ?
8 x* n4 k/ @: D% ^6 E, W
3 L7 a7 ]! e6 d# w* }. }
, U: L- x7 @0 z2 a& F! z
(4)选择时钟源。
1 H% r5 T9 H' q3 p; ~(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。
) g/ Y1 Z) n F- o0 q& [+ _
4 y3 B$ v% e9 w N* T6 \$ A
% b- J3 y( I9 c+ E' [
! u( C A3 |) K! O9 V' l) j(2)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
0 O* Q& F. V8 C- |. l9 y9 [# }
9 L9 a1 ]+ m* {7 a3 X$ W& o
) y8 }$ t2 r6 ~- O( C
, |6 m) e5 T, ?2、配置GPIO控制LED! w$ ?) {/ y/ l% K( m2 V
(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:
6 R" F" Y! p# Q5 `0 r/ X# L5 KLED1——PC0
3 C! f4 M; h1 m/ J1 z+ V; T2 {! hLED2——PC1; D7 q8 f! n, X" h9 c5 \* Y
LED3——PC2
7 X) u& o4 h4 e7 K. O* {LED4——PC3" A5 v- e$ O- z7 |) A- t
' e6 {2 Y1 [( z; Z8 _3 U1 b* Y(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。
, G7 z9 `3 M) |8 i C7 R
7 t6 Y( p2 l Y- |9 z鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
/ x, n8 {9 E1 W& B1 K$ J) L0 e6 {鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。- ^1 I) h; [8 P' @) m
鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。$ ^' g0 A! C3 }; J8 h
鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。
, _. C# I5 I: v, y6 H: T2 s
8 F) g! H" {6 Z! E6 x N
6 @: n' C2 ~" U' L& d8 k
* p% b5 o% \ W' T, ~4 {# E
- {/ `; K0 u q( ^, O! l) P3 y9 C
) a6 r+ B+ N- {( c: }(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。
* c$ ]6 `! Z, I) ^/ E
9 |. J+ b: h9 K0 y
- F% J1 }( ^6 D* j& C7 z, k; H Z! }. |( \" T
3、配置PA0按键外部中断输入4 s' w S2 D& n+ _6 H0 P
(1)如下图所示:右键点击PA0,选择GPIO_Input,配置PA0按键GPIO_EXIT0(外部中断)。5 j* x7 m- d; m1 K
* G# e5 \' C6 ~ g
1 z; y$ P) ^8 A, R+ L% o
, K3 u" q7 o W" o/ a (2)设置PA0 的GPIO mode模式为下降沿中断(External Interrupt Mode with Falling edge trigger detection)。
! p7 K. e$ S4 o* @' [1 }0 a* n$ M( `' W: C: q
4 I+ t; W6 G. i. g+ u: t6 q
0 |) D7 T \6 q2 l% A4 F* y$ C
(3)使能NVIC(嵌套向量中断控制器)( ]3 q2 \1 e) v6 J/ E" ]8 m
$ b; _. W# V7 I* X2 B4 x
; E: o" Y6 E$ R( H0 Y- i
# E# w$ W# B, a( O: N
4 j# f# h& b8 H 3、配置项目工程参数
7 e# Y8 ?$ T4 E: F! S(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。
2 H7 r( {4 [7 w6 \; }5 E1 Y
0 t8 m/ b. j# x N" I9 T
) F! C3 s l; O# f+ j! g: D& `$ t, Z: m3 r4 N
(2)完成配置工程。
w+ l8 A m9 @7 H: S% ]4 N/ l4 P) \) \
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)! K. m# d! {/ ]2 {, e
" e) d% j# o' ~9 } S, f" I
' L/ L8 p4 v' `+ n
8 W1 S4 }1 z4 r0 K x
* o0 ]2 L# k" L2 q5 ^# o2 s6 A: T1 ]( g: g, `" V' ]; r8 x
(3)生成代码。/ q# R4 D6 |- w
备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。, `" i0 L' Y9 U) Q2 o* y
' o; [5 V) f; e( ^
/ E9 \) D4 Q, X; W0 T% Z1 S4 r' K
4 ^) e* P" @( S8 o(4)工程代码生成成功。" p2 X- s& I% N$ `5 F6 C
4 h4 O6 T( D9 N
6 \- ~# e6 v7 B7 v
; r9 `3 c. R) h 三、在KEIL 5中编写代码6 ^* |* X4 W, Q5 B
1、使用KEIL 5(MDK)打开项目工程文件
8 p, f2 P5 ]2 }) p! a8 ~# _1 L! X源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。
% Z }8 K( c& A9 f. D4 ~) w. }2 F% i# Z/ v
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。) r; ]2 h0 T; t, ?; e) x6 {
7 ?6 E" K& P+ @: [
! {# z1 S, {9 j$ D- T- @
& C# @8 D* t( D& ^2 H. A2 d' G& ~2、添加按键输入验证程序3 g* W! E4 \% K
(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加延时10ms,防止进入while死循环,如下所示:
- i* u; M: x# f% i/ G& k8 m V a4 W$ o5 w# ]: n) \4 H, b
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。
, V% q' u2 e# g; `6 t' q. b4 Z
! l$ M: b7 Y6 F; j' I9 O3 L/ q
$ P: }# x1 Z( u4 X$ W- E2 p* X, G$ G
1 C% ?9 u2 I( Y' o" X, }
(2)main 函数代码如下所示:* v# P/ q2 V( C O: _8 `
- int main(void)
/ r" H) G- Q0 I8 E( t6 }( n. Q - {# Z% j, R+ @) [/ z7 G/ r# Y
- /* USER CODE BEGIN 1 */' A' o% u" d0 s
-
1 C' Y( u7 U2 W; e( f5 q2 b$ [" t- v - /* USER CODE END 1 */
4 n. R6 Q5 x. Y i, x0 g, f - 0 c( P! k$ ]$ ~0 K
- /* MCU Configuration--------------------------------------------------------*/
) p3 W$ D4 d9 m, d -
, L7 p; q/ A2 L - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */1 v! ?: `7 M/ J. m
- HAL_Init();
- l7 e. B( {/ N; j1 x' b3 u& _ - 1 ~6 x( v# R$ q+ R1 o
- /* USER CODE BEGIN Init */5 `3 h7 G* }* X2 W
- 7 B1 c9 E( g- @1 T
- /* USER CODE END Init */
4 |3 ~1 o5 p. e; x, B# ^ -
' x# v4 C m7 Z6 M" I, @ - /* Configure the system clock */
2 D# I# S3 r; M. i6 }4 b - SystemClock_Config();- b3 i) J( ]+ }% U6 G
-
7 D0 w$ U% F7 Y9 ? t( E - /* USER CODE BEGIN SysInit */) d* t- |8 G2 n* @5 Q7 D
- 9 N. @4 B0 j5 E: ^* b8 P
- /* USER CODE END SysInit */; r! q8 S% v4 ]) D; M$ X( y i/ T
- % }: r$ v) ?. b( V' L1 d
- /* Initialize all configured peripherals */
* B' P) w; C( _2 p$ O - MX_GPIO_Init();& z1 \9 I( l7 K# e ~
- /* USER CODE BEGIN 2 */$ u+ q# H, M2 M2 e& A
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET); //默认LED1、LED2、LED3、LED4初始化点亮* K5 m; w7 a' U9 U4 _+ `) f
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);' t2 Q1 T( ~* N
- HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);
! c1 s& Z" L5 Q. M - HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET); x( j) j8 G `
- /* USER CODE END 2 */
1 p7 g: Z9 P8 X, t+ o2 | -
. e1 m7 o6 G; g& f - /* Infinite loop */
" ~! w9 ?* f5 S* ]9 X K - /* USER CODE BEGIN WHILE */
P8 c! `6 i! ~, m h5 L - while (1)9 n. H' Y/ N' m
- {
/ I0 U& g# i7 q3 w/ @) Q - /* USER CODE END WHILE */3 G- J, S+ ^/ r4 U: A0 M5 I
-
/ E, t) U" d& I6 ?% B) y: I - /* USER CODE BEGIN 3 */% X4 H8 q) n- ^. L" C! a# S
- HAL_Delay(10);' h' A1 n% y) f7 d+ R' q
- }; G# L2 j' |4 R# A8 j/ \, C
- /* USER CODE END 3 */" H; _0 D* N- G% Y
- }
复制代码 1 h9 W' k1 @# D: Z! F! u
(3)stm32l4xx_it.c文件中对exti中断函数进行处理,添加中断响应处理操作,当读取到下降沿时,反转LED1、LED2、LED3、LED4。9 L5 t3 T8 J5 k: g. V% B
- /* USER CODE BEGIN 1 */
5 u/ M) ^; O+ R) j+ A - void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)* s3 ]: M: L+ G: U. B5 F
- {
' E) `1 V4 |0 ? - if(GPIO_Pin==GPIO_PIN_0)! p$ K1 \1 \, \5 _
- {' D% T& j* k6 x1 T# r7 Q$ \4 Q
- if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)
5 g; l. T- h* A - {
) W- }7 Z; W# D" H7 e9 x8 r* [ - HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);7 q Q) U2 K# R0 m
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);
' V+ d+ O7 Y* E- f$ ]0 r - HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);
7 F8 h7 b1 n$ Y, _; h; B) F. W4 U' D - HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);
% j9 N# S: L ]0 d. C - }: e* w3 I8 v" m: V
- __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);% N) y& c7 R; k7 o5 N! R1 t/ k
- }7 Q9 K) G- H# W1 c
- . N8 l& U& E/ H1 p/ O3 N5 b9 d
- }
. g; t# e( [- W& R - /* USER CODE END 1 */
复制代码
7 r. @" h9 [3 K+ P' O7 r(4)stm32l4xx_it.h头文件中对HAL_GPIO_EXTI_Callback函数进行申明。& w5 ] D' `5 Y' n: @
- /* Private includes ----------------------------------------------------------*/. C2 d6 O* ?0 H: w4 P! C
- /* USER CODE BEGIN Includes */
E1 n/ x5 l& t/ M% j) ]' j( L - #include "main.h"/ U0 |$ u9 |! ]
- /* USER CODE END Includes */+ y h: ~3 f4 W9 [8 ?' k% f
- 2 U7 w4 X0 o- Z' x& Q" N; l
- /* Exported types ------------------------------------------------------------*/* b2 F, g) e# ?( J3 k% w
- /* USER CODE BEGIN ET */
" a, r; m" f- c. S4 t& R: r - # Y! F! _% q$ j5 x `3 U, O
- /* USER CODE END ET */
2 G- D! [ E/ x -
! ]. G& A. ~- k7 g - /* Exported constants --------------------------------------------------------*/0 W) j& F8 ^1 D0 s. r$ ]" N8 A
- /* USER CODE BEGIN EC */
6 T6 J/ d% f! ?5 S y# V9 H -
' Y8 G1 R5 e/ H4 A- I - /* USER CODE END EC */
: }# E0 _" W e8 X: J - , E" T4 m9 L' O6 ? p) h
- /* Exported macro ------------------------------------------------------------*/
- N6 ~& j8 L/ n/ t0 @ { - /* USER CODE BEGIN EM */! X- t8 x9 I& I
- void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
5 X7 P( x1 }! C& Z2 U W1 } - /* USER CODE END EM */
复制代码
2 y1 {) G D- g7 h' y3、设置编程仿真下载模式7 x6 T% C( X$ ]; S H p1 U* O( U
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
0 ?. w* S2 s/ A$ {8 ]
7 V) o( s! B3 J/ d
& L+ p% K0 E* Y% |1 A4 f
# u( d4 Z( R' y; \, I D. V' A
(2)点击编译,完成后提示“0 error(s),0 warning(s)”。% Y; B1 K: {6 O+ Y9 @" p, C
5 i( V1 g" U4 V0 X0 G+ c% A
9 R0 }* r7 t ]6 ]9 V5 S
$ F2 T9 ?4 o6 I- e(3)点击Download(或者快捷键F8),即可下载程序。
! `- j' ^: v5 n8 n' B* J) I- o% R5 S# q6 O
g, R/ ^$ @, Z- }5 o8 R
T) C1 j* w& ~! C6 @(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4点亮,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
+ x* K6 R2 g9 @4 a \
. x( Q& Q5 Z, ]- R3 B1 L$ o5 i! `( f
e* J* X# x7 h+ g( ~4 N4、EXTI外部中断实验效果展示
$ V4 o K: P) x' R' C& o. g 程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后常亮,按下侧按键K1即可实现LED1、LED2、LED3、LED4点亮和熄灭的反转切换。, o: @+ @9 j6 g, j3 T
————————————————
( r7 M, i, C5 J4 U2 y$ E0 Z版权声明:智能小屋ZYXC# n6 I) V# u* v6 r8 ~* N# T
2 y* [" _4 v6 z4 E8 ]6 C2 Y
$ @- t/ e/ ^5 L' K |