外部中斷實驗

2021-10-09 02:40:27 字數 3894 閱讀 1478

需要新增的韌體庫檔案有 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輸出...