你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【实测教程】STM32L4之外部中断实验

[复制链接]
STMCU小助手 发布时间:2023-1-13 20:00
一、开发板平台简介:' 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
bb91345227434ee7a43a34bf3fe366e6.png
8 i8 x0 R# k1 W1 T+ ^* o" u( ?  G' I: q+ f5 _. y
929c0cce04aa4115a8623703982bf3e1.png
" 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
0f177691c5814f16a508bcfa747f87ac.png
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
e923ad767b8448b7ac37c4ed693724bd.png
" _; 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+ I
1 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+ ?
0aef905d6dd649c1b1a14e4e3929cce6.png
" 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
2399170347904e959c855fefd5877f84.png : ?" 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
d74d2fdc60c9440483e2b7cf8d928e7f.png
- 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
7b80345238d74bea82ce70e1a348f7b4.png
) 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 ?
3f65707eca104663a3dede6d25dfa961.png
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
72119b971f62410fa8344f7f9fb9f389.png
* 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
492907c1e71149819adbaee4516a2af4.png
( c3 V, H. n6 {$ i' D3 ^$ D) K6 @4 ?% }
c75d3f10ba2e427d9c1a10fad9bf5471.png
% 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
38ff4b80e1c5495ba3076a5158fd91fa.png + 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
32c463645eee4ca983ee5887881d59fc.png
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 [
3050f19497ad4dccbb7981499017cefa.png : 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 080f6f6b93f54cba9786f89a60c56c30.png
+ 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) |
f3ecedd9323f4463b69539906b3c1199.png
, 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
efdb616174f54925b6eac31109f227b5.png
, L  Q/ K+ \% [) _  {2 c​​! Z2 P/ E2 {+ m4 H2 }8 q' ?. g/ V
41c3f2716e4e4eda8f62fa3a1d871322.png
$ 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
8eaa7d0babea40ee93f158481a6ee471.png
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
e8f46d59a1fb4af589feb613fdff17b4.png % 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
9f34ca8ed654416fbe8c8dbc4c221dc8.png
' 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 |
8c48d0c8e2b84c02bb8c7f2a0b192a60.png
/ |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 \
  1. int main(void)
    1 z- l2 b2 W: \3 X
  2. {$ [3 `1 ]% o1 t4 F7 D& N( c
  3.   /* USER CODE BEGIN 1 */
    + L7 z5 v- `! a7 R3 E& L: I8 X9 r
  4. 6 s0 I% b, V# K5 U7 ?( G+ v9 g& x) _
  5.   /* USER CODE END 1 */
    5 i0 S) W3 `0 j/ M% J: A

  6. 0 U9 F5 o. z& e7 o
  7.   /* MCU Configuration--------------------------------------------------------*/6 L0 M( p9 z+ M1 G

  8. ! B! H! c$ Y7 A# a
  9.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    ( H9 i+ M+ |: z& ]+ V
  10.   HAL_Init();* R* f7 I# d3 s3 k% g+ u$ Q2 k
  11. 7 Q0 y9 B/ {# E- n. E  G- i
  12.   /* USER CODE BEGIN Init */2 K. |" t' E% s) e5 s, S
  13. ; z. {4 B* f- S, H; Y
  14.   /* USER CODE END Init */8 Z: N& e7 U# Y8 n6 W
  15. ( g' u6 a  m! i$ S
  16.   /* Configure the system clock */+ m! N! G# Q/ ?
  17.   SystemClock_Config();
    " c3 R6 V. Q, q7 b/ c( G1 d/ a

  18. - P6 X! Z# U0 [+ ]/ d, |$ P
  19.   /* USER CODE BEGIN SysInit */* k* y5 p0 Y' O. {

  20. 2 d4 V: I& G  {) V! J
  21.   /* USER CODE END SysInit */. K1 ~/ N. D0 |( w8 z
  22. & C* n+ S1 B6 k/ \' J2 x
  23.   /* Initialize all configured peripherals */, _# x: p) N, o- ?$ L7 e+ L
  24.   MX_GPIO_Init();/ O% Y; \2 u8 s) T, H6 d! D0 ?
  25.   /* USER CODE BEGIN 2 */
    ; s* G( Y# r8 h4 _, H1 _+ i
  26.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);    //默认LED1、LED2、LED3、LED4初始化点亮
    : [' S" ~/ J0 ]9 m+ p
  27.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);
    $ t+ F2 S+ r, H1 ]( L* B
  28.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);: P2 c; b! B' M; r) `" y6 u3 K% Z2 {- b
  29.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);
    # e, g7 |! Y9 g0 g5 b; ~
  30.   /* USER CODE END 2 */) v* b+ [5 Y& K: R

  31. + _8 K0 l) [6 `2 u3 I: {
  32.   /* Infinite loop */
    : s8 P/ w/ p2 [6 D2 P2 ^. L' Z
  33.   /* USER CODE BEGIN WHILE */2 @. _8 i: s, Y- j! U
  34.     while (1)* Z; P) p! e/ `6 k
  35.     {
    7 e6 u/ r: b4 a* d3 M' [3 M, O
  36.     /* USER CODE END WHILE */
    / r0 O1 R3 a4 J1 ?7 P/ U! }
  37. 3 A$ l$ ^0 J9 H5 I% q* q" u
  38.     /* USER CODE BEGIN 3 */( Z+ q, e- M3 M( ~9 m5 }8 Q
  39.         HAL_Delay(10);+ |! K( z) p; O6 b) B" Q" n
  40.     }
    . X' {2 K9 N1 s2 c1 G" c4 E6 u. c8 D
  41.   /* USER CODE END 3 */# R* M* H5 Z/ c  j4 M
  42. }
复制代码
  j! T9 E8 E) o/ U" H. h# O. ~
(3)stm32l4xx_it.c文件中对exti中断函数进行处理,添加中断响应处理操作,当读取到下降沿时,反转LED1、LED2、LED3、LED4。" e$ w/ C, @' ~5 B. |
  1. /* USER CODE BEGIN 1 */% s# }$ [7 G( j  D. u
  2. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    2 O5 b3 d$ n2 u5 }+ L- e& {. M. ^: i. g( Y
  3. {
    3 W( I; n- N  R6 \- ^& d) H
  4.     if(GPIO_Pin==GPIO_PIN_0)3 A+ `/ z, `# N$ d. R- |' p
  5.     {" l* [4 B  x8 a1 i9 b
  6.         if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)
    2 L5 j' `* W, G2 |4 D6 y* ^
  7.         {' g4 A! \% ^, z+ D
  8.             HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);7 ^& f- H0 R, O: H$ g1 j/ b$ B
  9.             HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);1 _1 Z4 U" h* v5 W
  10.             HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);) `( a* B, W# c1 f/ @* u6 A' w
  11.             HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);; e4 R# r& L& H( k/ s* T
  12.         }
    / Q- u6 K2 `: v- ^; S
  13.         __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
    % J0 b) z5 s  u# ~
  14.     }% Z) v: {5 j7 x& W: z8 i" A
  15. 3 z; E9 ~" [6 {! |/ m  N; }
  16. }& V  h6 k( j! g- `
  17. /* 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
  1. /* Private includes ----------------------------------------------------------*/' N9 k4 ^$ q  ^0 ^. G' N* n& j
  2. /* USER CODE BEGIN Includes */8 p, V1 g$ A8 ?5 \* |8 ~8 F
  3. #include "main.h"9 |& X8 N% R% \1 D: s% U
  4. /* USER CODE END Includes */
    ) L- ?- Q/ r8 m; Y: y+ ^  b% z

  5. - N7 o% K8 m- q9 V0 c
  6. /* Exported types ------------------------------------------------------------*/
    + c+ ]0 M/ E4 U7 o) s( m
  7. /* USER CODE BEGIN ET */
    ' @6 T6 o8 @- W+ R9 ]8 F' C( m6 Y

  8. " p1 b- P4 p1 j# x* m  Q
  9. /* USER CODE END ET */7 ^( Z! @0 o) e1 j+ H& h$ i8 x
  10. , P' @, u* p& k9 ?6 f& i
  11. /* Exported constants --------------------------------------------------------*/7 l% \& B" @( U) H# H  d* F) t
  12. /* USER CODE BEGIN EC */
    1 a4 |# ^% [% y

  13. - `% x( d4 g2 p5 t8 L# m* P
  14. /* USER CODE END EC */' Q3 G. e8 b0 O" d( F/ D; _: W. Z
  15. 2 r. O7 S. ~, f
  16. /* Exported macro ------------------------------------------------------------*/
    4 C" j. l* u6 L2 W
  17. /* USER CODE BEGIN EM */
    6 f! H7 V0 O* w4 E- c
  18. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
    - y9 B0 {8 F" i5 l) X% c
  19. /* 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 {
edefb6b9a2a14be3b1221ad6d5c7a8a2.png ; 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
e0b7e3e353b345a7987fe5f821de2dda.png 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
eb3f250f19e44862a7df80c2492fcd01.png 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
9f8aa1a4e8f04041bcf5cb183facd100.png
收藏 评论0 发布时间:2023-1-13 20:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版