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

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

[复制链接]
STMCU小助手 发布时间:2023-1-13 20:00
一、开发板平台简介:
4 _" S7 t# g' M7 H$ s1、开发板资源简介

* R8 ]7 U# `7 e: {(1)开发板主芯片型号:STM32L431RCT6+ }# S# ~) @4 @+ [& l5 o  s
(2)开发板主芯片封装:LQFP-64_10x10x05P" L% ?5 j; Q8 h: Z- T
(3)开发板主芯片内核:ARM® Cortex®-M49 N2 p! |! j9 U) ^4 w6 [
(4)开发板主芯片主频:80MHz
- V( y+ B$ e5 h$ s0 e* L/ E(5)开发板主芯片Flash大小:256KB
0 r# F3 o/ j4 i(6)开发板主芯片RAM大小:64KB1 U8 g; H, I3 M6 H6 T) A! p

3 ?7 v6 |/ R) h+ Y1 Q0 i- u  Z
bb91345227434ee7a43a34bf3fe366e6.png 4 O/ ^6 J8 b4 s# l1 L$ N3 k; x
" y$ k, s1 y" {5 W; `
929c0cce04aa4115a8623703982bf3e1.png
2 g1 D! T7 G! \) S+ s! c2 E  J$ p: y! r4 V
2、LED灯资源
: o& p1 W( y* M- Y9 {) l(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:0 L5 ^% f9 t: T4 z$ W! d! n
& T/ |: Z/ [' D" Q, J  Q* z
0f177691c5814f16a508bcfa747f87ac.png 8 v7 ?# _9 U$ D4 U5 y

: n, a8 o/ `+ g; l; g(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:+ E& O4 b" h, g, h. v& K# {5 o5 Z
( @+ f" r8 \- ]2 V5 y
e923ad767b8448b7ac37c4ed693724bd.png 7 X9 p, v7 A# }* `
- l- y0 Y3 U, J3 S: Y
​3、GPIO外部中断EXTI工作原理
& Y: j0 y5 x) y1 z  g& \+ ~4 bExternal interrupt/event controller,外部中断/事件控制器,管理了控制器的 20个中断/事件线。: Z. K- c0 I9 J% M9 I$ D( y

) P! W3 T4 i: m: K) O3 w& N* c每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线单独配置为中断或者事件,以及触发事件的属性。
' w* U' ~+ T: f  h0 P

9 X6 L; D) _2 g4 _  K9 j7 rGPIO引脚的外部中断触发方式:
2 v. U# N  g- j4 P, {上升沿触发" m7 {: t0 T- C- H# A, w! i; E
下降沿触发' d) B0 p: y  O+ H. S8 E8 Y' Y' S
双边沿触发
: e  O" l9 z, d( ^
外部中断的配置方法:
4 R0 a& @1 L) Y* P8 m* a) e# n开启IO口时钟,初始化IO口为输入。; c4 }9 m$ @7 W
开启IO口复用时钟。
8 r# m# ]. p9 S& t7 R设置IO口与中断线的映射关系。! a" V" g: j- \: V+ R$ Q. N4 k) u5 H6 `5 S
初始化线上中断,设置触发条件等。) l- u+ G3 b2 F9 I( O
配置中断分组(NVIC),并使能中断。% _' l" B" l4 o0 ]& W
编写中断服务函数。
1 ~* @7 I% l* \$ {% U$ X& G清除中断标志位。
# D9 I/ I0 k) g' {0 Q4 k8 P# T; ]: _8 N% N9 [' D8 |5 w
外部中断实验按键K1作为外部中断触发,原理图如下:2 |; z$ d" h; V# C- N+ i' @4 e$ G

6 U! _. ^& L4 k4 ~. G
0aef905d6dd649c1b1a14e4e3929cce6.png # E4 E6 G. q2 C9 F" b! G- z- J. V
# h. U' S2 n  G4 d3 G
  二、GPIO外部中断实验过程
2 `! I6 k9 p) Z9 z. v! K; p1、新建STM32CubeMX基础工程
, ?, g7 e- {( E(1)打开STM32CubeMX,点击“File”-->"New Project"7 y8 t0 N0 Q+ _
1 K& g$ M5 R/ N% l8 o& s
2399170347904e959c855fefd5877f84.png 7 L; D  s2 M$ T, i, E
) O. x& k1 {7 M- J& @: ^5 @6 }! l
(2)等待打开主芯片选项界面(大约1分钟时间)。7 @3 x% r  Y8 d& O/ i0 r
* R' ?7 o4 b2 @8 A2 N  e
d74d2fdc60c9440483e2b7cf8d928e7f.png
' Z, z3 i& B) H3 ~9 `* w) J1 s: F
& ?- C3 o; s3 K* g" N9 p6 h
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
: \; d2 {) m$ Z) }* l3 c$ |$ h+ T& A; I; Q
7b80345238d74bea82ce70e1a348f7b4.png
: U8 Y6 @, k9 p( H  |* ?6 C8 n9 T' ]# d
(4)选择时钟源。$ O  f9 g; k. u
(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。
3 l* ^" ?2 s( `6 G  I$ p7 h, O+ ~4 L! r0 _# @. [. \, X
3f65707eca104663a3dede6d25dfa961.png - c- J' H  M3 ~2 E
" A: D. p0 k4 j' c" V  i6 k
(2)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
- ^$ \# x$ q  E0 P; F* S- s: `
* k. v# s7 F. h- {% Y8 T4 O
72119b971f62410fa8344f7f9fb9f389.png
& i" B- B% k' G5 G, r

6 a/ C1 N! t* F# d7 R, M; ?2、配置GPIO控制LED
" p3 H9 }1 z, V; Z+ J(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:
7 u7 n& F* H' J+ [LED1——PC0. X( S2 d2 R/ z( V5 }( n9 q. Z& r
LED2——PC1! ]( q) H8 g  g  t; x5 x
LED3——PC22 z2 b  B& k- r' D+ S  c6 Y! H. a
LED4——PC3  D) d- N6 m& m9 O9 M# Y
1 z5 \( c2 q4 ~" X* i
(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。4 @( N. s- p  X% w. A
5 U  Y% U3 z  {  f" k
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。9 a$ J4 |4 V+ r: B* ]" |
鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。: O6 F* O1 O! G( _/ X2 C
鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。
  e: q, j% }3 C# L( p鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。1 s- m1 T3 F  J* b
* Z; L8 b5 L& e, f; Y+ Y' X
492907c1e71149819adbaee4516a2af4.png ) x) d1 N& d7 R8 p) M( u
' B  D4 e+ N7 D% }  R8 m  V0 q
c75d3f10ba2e427d9c1a10fad9bf5471.png
% {3 \9 N- z; w5 o. V2 x+ Z$ K9 V6 w
, K$ k9 X1 h( p(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。* ^; `' y; G. ~- z
  m* t( t( z% X: r; D; g% a+ i% H
38ff4b80e1c5495ba3076a5158fd91fa.png
6 M5 {* m; R% d5 Q4 N
& V; h3 p( a3 E& U1 U​​3、配置PA0按键外部中断输入% ^: j% e- ?2 d. m. o2 U; @
(1)如下图所示:右键点击PA0,选择GPIO_Input,配置PA0按键GPIO_EXIT0(外部中断)。( @" y0 f! a+ @& s7 ~- m0 a

7 `6 p- v: n8 `% S) J
32c463645eee4ca983ee5887881d59fc.png 8 ^# C; h. D! R9 F4 K
8 z9 ]0 g# E+ }
(2)设置PA0 的GPIO mode模式为下降沿中断(External Interrupt Mode with Falling edge trigger detection)。
5 e+ m+ U& M, |
4 ~9 w3 N9 S  B& P
3050f19497ad4dccbb7981499017cefa.png 5 H/ o. z  k5 _8 h0 k5 t

, o  M$ v! O: W" O  l (3)使能NVIC(嵌套向量中断控制器)
/ ]  T# m) {; Z& B) M- E

# U/ v- E4 _6 t8 E# j: O 080f6f6b93f54cba9786f89a60c56c30.png
- j& g7 ~5 y# S( L5 Q) I
2 Z( J3 Z9 y% ^3 J3 o; V
1 G# {2 v8 c5 G
3、配置项目工程参数
5 ~! f# ~1 H# o+ ?* O2 S2 F; j2 }(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。
& o8 T) k" Q* U( W: p7 S) r* G  A+ Z
  z  [# h# m+ ~% ^* N& l3 n
f3ecedd9323f4463b69539906b3c1199.png
" O% _! h  N" k( c: O2 F6 v4 i7 Z
$ {  _6 K3 N0 X- [4 q(2)完成配置工程。; F1 w$ Y7 |1 U0 Y5 I0 f
3 O2 `/ @! Q; N" v- Y4 n2 h3 X
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
$ M' I0 d7 v4 u
! c& B2 C/ v! I% k  X8 n6 F) Q( L
efdb616174f54925b6eac31109f227b5.png " b2 ]0 k  a+ c# e' H2 O
​​
5 K9 X* q( C  e5 f5 f$ D 41c3f2716e4e4eda8f62fa3a1d871322.png : c5 ]% |9 X3 g  V) W# H
% O9 S0 L, q. v( a/ S
(3)生成代码。
, ~* t6 y. k) z% G+ w8 b备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。
! P; _/ @! x; s. l/ w* E  W3 C& N% b" k& \4 \; C
8eaa7d0babea40ee93f158481a6ee471.png * m* v# p; A" D& J
​​- N( P. }5 ?3 J9 j% _
(4)工程代码生成成功。. x, A( a5 f4 |* t2 p6 P( @

. K6 Q  b5 p" R, T2 V. [% g) k
e8f46d59a1fb4af589feb613fdff17b4.png 7 T8 Y  u3 O5 K2 U. g! f
, t, {$ }( p0 }4 b+ r  h8 z& U$ S
三、在KEIL 5中编写代码
! [2 t5 L' L; D7 B7 t. M1、使用KEIL 5(MDK)打开项目工程文件
2 e) L7 q) s. J9 s- ~' k% i源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。+ d+ }- V' }* F, X
& m6 W7 m; s) ?
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。
5 r' }; c; P# F% w
8 b  M) j; J" I2 y% K4 ?0 l& `
9f34ca8ed654416fbe8c8dbc4c221dc8.png
/ \0 a9 E6 S0 X% h' G5 {
2 v0 N# p/ i# p' r7 x2、添加按键输入验证程序
' T. ^" d2 Z+ t* F7 H% w(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加延时10ms,防止进入while死循环,如下所示:
+ l4 g6 M4 O; n4 G! R. @' }" ~0 W: k% Y# b- y8 K5 r6 F
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。
1 ^! D( w" {* ]+ ^$ A- T) h$ w4 I( Z2 T
( @' H$ y7 H2 C- M
8c48d0c8e2b84c02bb8c7f2a0b192a60.png
7 N4 F/ h4 A/ A% ^3 F. [
' h  n6 g7 o. L
5 P$ o) y/ K7 p2 g+ x% x, Q/ I5 g; F
(2)main 函数代码如下所示:* z* \( W/ T4 [8 I
  1. int main(void)
    ) S% m+ s0 p( [5 P
  2. {% C3 a, a" a1 \
  3.   /* USER CODE BEGIN 1 */! x! v  X/ G1 S3 M- k( e5 [- I

  4. , w7 b$ `; G& {1 A
  5.   /* USER CODE END 1 */! ^3 |" y0 N" O" S! `. r
  6. : \" G- w. }/ F4 k
  7.   /* MCU Configuration--------------------------------------------------------*/
    5 {5 h7 N3 P4 y6 @: G: c/ |

  8. 6 |' H# Z0 u4 v  N  @2 a' q
  9.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */+ ]! }! X; d- ~" f$ E
  10.   HAL_Init();* Q. j* l7 j. |9 A
  11. , s& N5 n! d/ o8 C
  12.   /* USER CODE BEGIN Init */
    : i6 h7 M4 Q5 p5 x+ F$ F( F9 q
  13. ! d! c! Q# b! v6 }
  14.   /* USER CODE END Init */
    ( `3 Y9 T+ W, d

  15. ' u! O9 ]* S0 N
  16.   /* Configure the system clock */! S  e! q3 i; n' s9 C3 E) B
  17.   SystemClock_Config();5 J9 r. l! g' n- P

  18. : @  e' J% k7 o1 J: |/ F, h% E
  19.   /* USER CODE BEGIN SysInit */
    " F, e2 E2 P8 Q0 N

  20. + i! k/ j& k0 B' l
  21.   /* USER CODE END SysInit */" [, }9 v: A: h7 ?7 T1 g

  22. 8 X9 u) t/ \6 l+ d, Q! C
  23.   /* Initialize all configured peripherals */, ?, u$ `4 T2 o; B8 }4 [
  24.   MX_GPIO_Init();
    # a/ c) F/ G& j9 f0 u+ v
  25.   /* USER CODE BEGIN 2 */; ]: C1 N. _8 e) n0 s. |
  26.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);    //默认LED1、LED2、LED3、LED4初始化点亮2 O1 S; A0 o& E. P' M, M
  27.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);
    8 N( ~) d" M, v
  28.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);
      Z! h8 h$ _$ e0 v6 {1 q) W
  29.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);
    5 h* T/ U1 Z' t' h- m' G4 l6 ]
  30.   /* USER CODE END 2 */9 {( i, k  T# L* p
  31. : K& S( x$ w7 j
  32.   /* Infinite loop */
    ; ~" j# ], S, \6 p+ u/ J6 z3 N
  33.   /* USER CODE BEGIN WHILE */
    / ?& p( F/ k- t' D& O7 s( D: w
  34.     while (1)1 w1 N! [8 G, P% h
  35.     {
    ; h1 n& _7 V& P6 I, S  L
  36.     /* USER CODE END WHILE */
    : y3 O% [% g' D0 s, b8 P9 Z; b
  37. : ], b6 C( T' w
  38.     /* USER CODE BEGIN 3 */
    . E& w7 R" O8 B8 {: {: h) y: M# w
  39.         HAL_Delay(10);
    9 P( v' m; t: l( a; J& |
  40.     }* z* @5 E) l, L( P1 P
  41.   /* USER CODE END 3 */
    2 v8 q3 d5 r5 g/ @* m! \& |
  42. }
复制代码

3 j# a$ `' S: j(3)stm32l4xx_it.c文件中对exti中断函数进行处理,添加中断响应处理操作,当读取到下降沿时,反转LED1、LED2、LED3、LED4。
9 b. R, K0 A6 I& b4 F& m* R3 Z9 v
  1. /* USER CODE BEGIN 1 */
    / G/ X$ X5 r8 G. ^5 q7 l) w) Z# J
  2. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)$ v1 t) X+ ]+ a4 y0 y! ^
  3. {8 p4 C( f) t8 y& {) C3 @
  4.     if(GPIO_Pin==GPIO_PIN_0), S( d- ], N" S: t
  5.     {
    3 a9 F* Z9 M2 S2 c2 a
  6.         if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)
    : G% a% H" _5 x: [# Z: {
  7.         {* R1 @* E7 u8 a  J6 P- V7 K
  8.             HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);
    2 F* s- S+ W1 ~
  9.             HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);& A  N6 @5 W) s" f
  10.             HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);& h% {* N  p* R/ ~) F
  11.             HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);
    / L$ I- L) p6 x
  12.         }
    , d# X, e; g" P4 @2 T6 H2 Q% }) ?9 v% o1 A
  13.         __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);% l% q* J) f1 y# H9 |0 E
  14.     }
    # H( w  E& X; V' |" O( V8 H( z) S  Z

  15. ! j  Y" b$ N+ S4 _! x$ i
  16. }
    - W$ g* h7 |5 O' U9 h+ A8 {
  17. /* USER CODE END 1 */
复制代码

5 B' x$ B1 Y3 {5 t: G- Y(4)stm32l4xx_it.h头文件中对HAL_GPIO_EXTI_Callback函数进行申明。% Y: Y, c( d- W
  1. /* Private includes ----------------------------------------------------------*/% @& t6 o* i2 @) E" W6 G
  2. /* USER CODE BEGIN Includes */, X- z* f) j" {- A
  3. #include "main.h"
    ( g% {  H& p6 p. m7 ^$ x+ U4 \) V- D4 s
  4. /* USER CODE END Includes */
    / e- O! f+ b/ M5 Q
  5. 8 n, i2 }* T. F
  6. /* Exported types ------------------------------------------------------------*/
    : @) G5 O) q! }) G8 S
  7. /* USER CODE BEGIN ET */, U6 B8 l2 i8 ?2 O0 p) F; l

  8. 1 p+ Y' Q- l, f9 D/ @5 ]# k: H$ u
  9. /* USER CODE END ET */3 f# u, O, M9 c- h
  10. 6 \  x) S0 g5 N( W7 Z+ ?( }: p( v
  11. /* Exported constants --------------------------------------------------------*/; K* f) K. V3 e! |2 G7 C
  12. /* USER CODE BEGIN EC */
    $ H, f9 j/ s1 W; s2 ]' T

  13.   E+ m( w7 C" q  ?; V- o# V
  14. /* USER CODE END EC */4 D0 w8 \5 \5 S/ c& f2 }

  15. / [6 t+ R' j: {
  16. /* Exported macro ------------------------------------------------------------*/5 d. \- L! p5 Z' E
  17. /* USER CODE BEGIN EM */, F2 r% [! G. R: [
  18. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);# G7 q: M" E8 m" |' @9 q- [
  19. /* USER CODE END EM */
复制代码

# u1 A! ]' T8 K: Q  h# g0 Y5 T3、设置编程仿真下载模式' G: |/ k# P. Z/ Y
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。0 p4 a! k, h. I2 S* [1 ^
. B+ C- k6 n9 o. d9 k
edefb6b9a2a14be3b1221ad6d5c7a8a2.png
+ J4 d; n) U% x7 A- s8 W  W​​- `' h* V6 S! J5 a& F
(2)点击编译,完成后提示“0 error(s),0 warning(s)”。2 |' J, W0 M/ t  m7 w! @. o
! p9 t" z' n$ [" d- a
e0b7e3e353b345a7987fe5f821de2dda.png
7 t4 f6 i: x0 q' ^6 l( h​​) }7 _" u- l; _' x2 a" @0 v& W
(3)点击Download(或者快捷键F8),即可下载程序。2 u: C* T: t7 D+ {

" o; `  [+ _: \5 X* R5 o
eb3f250f19e44862a7df80c2492fcd01.png % d2 c& Q/ O6 o
​​
1 r. u# F) P; B(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4点亮,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。, D; W$ q. w) u, i6 @, S: e: m" a

! m# L& W; b' M( i! L( M$ W

. h2 M! v  d/ d3 t+ \  C ​​8 |% B9 r( I9 M6 W
4、EXTI外部中断实验效果展示
& m% \' P9 g8 b' F- }# t        程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后常亮,按下侧按键K1即可实现LED1、LED2、LED3、LED4点亮和熄灭的反转切换。2 Q$ R: t! F) l4 @) q
————————————————/ C* ?' j: |4 h+ z* D$ a# X8 @
版权声明:智能小屋ZYXC
: j7 G4 c6 _- ]" p& S" P7 s2 y1 @
% {3 m+ R) x2 u9 z
9f8aa1a4e8f04041bcf5cb183facd100.png
赞 收藏 评论0 发布时间:2023-1-13 20:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版