需要新增的韌體庫檔案有 misc.c、stm32f4xx_exti.c、stm32f4xx_gpio.c、stm32f4xx_rcc.c、stm32f4xx_syscfg.c 五個。
1) 使能 io 口時鐘,初始化 io 口為輸入
首先,我們要使用 io 口作為中斷輸入,所以我們要使能相應的 io 口時鐘,以及初始化相應的 io 口為輸入模式,具體的使用方法在按鍵模組完成。
//按鍵io口初始化函式
void
key_init
(void
)
2) 開啟 syscfg 時鐘,設定 io 口與中斷線的對映關係。
接下來,要配置 gpio 與中斷線的對映關係,那麼我們首先需要開啟syscfg 時鐘。
rcc_apb2periphclockcmd
(rcc_apb2periph_syscfg, enable)
;//使能 syscfg 時鐘
這裡一定要注意,只要我們使用到外部中斷,就必須開啟 syscfg 時鐘。接下來,配置 gpio 與中斷線的對映關係。在庫函式中,配置 gpio 與中斷線的對映關係的函式 syscfg_extilineconfig ()來實現的:
void
syscfg_extilineconfig
(uint8_t exti_portsourcegpiox, uint8_t exti_pinsourcex)
;
該函式將 gpio 埠與中斷線對映起來,使用如下:
//建立io口與中斷線的對映關係
syscfg_extilineconfig
(exti_portsourcegpiof, exti_pinsource6)
;//pf6連線到中斷線6
syscfg_extilineconfig
(exti_portsourcegpiof, exti_pinsource7)
;//pf6連線到中斷線7
syscfg_extilineconfig
(exti_portsourcegpiof, exti_pinsource8)
;//pf6連線到中斷線8
syscfg_extilineconfig
(exti_portsourcegpiof, exti_pinsource9)
;//pf6連線到中斷線9
設定好中斷 線對映之後,那麼到底來自這個 io 口的中斷是通過什麼方式觸發的呢?接下來就要設定該中斷線上中斷的初始化引數了。
3) 初始化線上中斷,設定觸發條件等。
中斷線上中斷的初始化是通過函式 exti_init()實現的。exti_init()函式的定義是:
void
exti_init
(exti_inittypedef* exti_initstruct)
;
具體使用如下:
// 初始化線上中斷,設定觸發條件等
exti_initstructure.exti_line=exti_line6 | exti_line7 | exti_line8 | exti_line9;
//中斷線6-9
exti_initstructure.exti_trigger=exti_trigger_falling;
//下降沿觸發
exti_initstructure.exti_mode=exti_mode_interrupt;
//中斷事件
exti_initstructure.exti_linecmd=enable;
//使能中斷線
exti_init
(&exti_initstructure)
;//初始化中斷線
4) 配置中斷分組(nvic),並使能中斷。
我們設定好中斷線和 gpio 對映關係,然後又設定好了中斷的觸發模式等初始化引數。既然是外部中斷,涉及到中斷我們當然還要設定 nvic 中斷優先順序。
//配置中斷分組(nvic),並使能中斷
nvic_initstructure.nvic_irqchannel=exti9_5_irqn;
//使能外部按鍵中斷通道
nvic_initstructure.nvic_irqchannelpreemptionpriority=
0x02
;//搶占優先順序2
nvic_initstructure.nvic_irqchannelsubpriority=
0x02
;//響應優先順序2
nvic_initstructure.nvic_irqchannelcmd=enable;
//使能中斷通道
nvic_init
(&nvic_initstructure)
;//中斷優先順序分組初始化
5) 編寫中斷服務函式。
我們配置完中斷優先順序之後,接著我們要做的就是編寫中斷服務函式。中斷服務函式的名字是在 mdk 中事先有定義的。這裡需要說明一下,stm32f4 的 io 口外部中斷函式只有 7 個,分別為:
export exti0_irqhandler
export exti1_irqhandler
export exti2_irqhandler
export exti3_irqhandler
export exti4_irqhandler
export exti9_5_irqhandler
export exti15_10_irqhandler
中斷線 0-4 每個中斷線對應乙個中斷函式,中斷線 5-9 共用中斷函式 exti9_5_irqhandler,中斷線 10-15 共用中斷函式 exti15_10_irqhandler。
//外部中斷服務函式
void
exti9_5_irqhandler
(void
)
6) 軟體設計
exti.c
#include
"key.h"
#include
"common.h"
#include
"led.h"
#include
"exti.h"
//外部中斷服務函式
void
exti9_5_irqhandler
(void
)//初始化pf6-pf9為中斷輸入
void
extix_init
(void
)
exti.h
#ifndef __exti_h
#define __exti_h
void
exti9_5_irqhandler
(void);
//中斷服務函式
void
extix_init
(void);
//外部中斷初始化函式
#endif
main.c
#include
"common.h"
#include
"exti.h"
#include
"led.h"
intmain
(void
)}
外部中斷實驗
crotex m3 核心支援 256 個中斷,其中包含了 16 個核心中斷和 240 個外部中斷。stm32f10x 晶元有 84 個中斷通道,包括 16 個核心中斷和 68 個可遮蔽中斷,對於stm32f103系列晶元只有60個可遮蔽中斷,參考 stm32f10x 中文參考手冊 9 中斷和事件章節...
外部中斷實驗
外部中斷概述 1 stm32的每個io都可以作為外部中斷輸入。2 stm32的中斷控制器支援19個外部中斷 事件請求 思考 stm32供io使用的中斷線只有16個,但是stm32f10x系列的io口多達上百個,stm32f103zet6 112 stm32f103rct6 51 那麼中斷線怎麼跟io...
外部中斷與定時器中斷實驗
已知微控制器晶振頻率為12mhz,自行選取定時 計數器,定時 計數器工作方式自選,編寫程式,使p1.7端輸出週期為0.5ms方波。解題思路 假設方波訊號的占空比為50 已知條件可以得,機器週期為1us,所以決定採用t0定時,工作方式0,已知輸出週期為0.5ms,則每定時0.25ms計數使p1.7輸出...