(stm32f103学习总结)—stm32外部中断
一、外部中斷介紹
1.1 EXTI簡介
EXTI簡介 STM32F10x外部中斷/事件控制器(EXTI)包含多達(dá) 20 個(gè)用于產(chǎn)生事 件/中斷請(qǐng)求的邊沿檢測器。EXTI的每根輸入線都可單獨(dú)進(jìn)行配置,以選 擇類型(中斷或事件)和相應(yīng)的觸發(fā)事件(上升沿觸發(fā)、下降沿觸發(fā)或 邊沿觸發(fā)),還可獨(dú)立地被屏蔽。(stm32f103有19個(gè))
1.2 EXTI結(jié)構(gòu)框圖
1.3 外部中斷/事件線映射
STM32F10x的EXTI具有20個(gè)中斷/事件線,如下:(stm32f103有19個(gè)以太網(wǎng)喚醒事件沒有;stm32f107有20個(gè))
STM32F10x 的 EXTI 供外部 IO 口使用的中斷線有 16 根,但是我們使用的 STM32F103 芯片卻遠(yuǎn)遠(yuǎn)不止 16 個(gè) IO 口,那么 STM32F103 芯片怎么解決這個(gè)問題的呢?
因?yàn)?STM32F103 芯片每個(gè) GPIO 端口均有 16 個(gè)管腳,因此把每個(gè) 端 口 的 16 個(gè) IO 對(duì) 應(yīng) 那 16 根 中 斷 線 EXTI0-EXTI15 。 比 如 :GPIOx.0-GPIOx.15(x=A,B,C,D,E,F(xiàn),G)分別對(duì)應(yīng)中斷線 EXTI0-EXTI15,這樣一來每個(gè)中斷線就對(duì)應(yīng)了最多 7 個(gè) IO 口,比如:GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。但是中斷線每次只能連接一個(gè)在 IO 口上,這樣就需要通過 AFIO 的外部中斷配置寄存器 1 的 EXTIx[3:0]位來決定對(duì)應(yīng)的中斷線映射到哪個(gè) GPIO 端口上,對(duì)于中斷線映射到 GPIO 端口上的配置函數(shù)在stm32f10x_gpio.c 和 stm32f10x_gpio.h 中,所以使用到外部中斷時(shí)要把這個(gè)文件加入到工程中,在創(chuàng)建庫函數(shù)模板的時(shí)候我們默認(rèn)已經(jīng)添加。EXTI 的 GPIO 映射圖如圖 18.1.3 所示:
二、外部中斷配置步驟
要使用外部中斷我們就需要先配置它,通常都需經(jīng)過這幾步:
(1)使能IO口時(shí)鐘,配置IO口模式為輸入
(2)開啟 AFIO 時(shí)鐘,設(shè)置 IO 口與中斷線的映射關(guān)系
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //開啟AFIO時(shí)鐘
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); //設(shè)置IO 口與中斷線的映射關(guān)系即哪個(gè)io口哪一個(gè)管腳作為中斷輸入線
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //這里以配置GPIOA口 GPIOA的第0管腳作為中斷輸入線
(3)配置中斷分組(NVIC),使能中斷
(4)初始化EXTI,選擇觸發(fā)方式
1 void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
2 typedef struct
3 {
4 uint32_t EXTI_Line; //中斷/事件線
5 EXTIMode_TypeDef EXTI_Mode; //EXTI模式
6 EXTITrigger_TypeDef EXTI_Trigger; //EXTI觸發(fā)方式
7 FunctionalState EXTI_LineCmd; //中斷線使能或失能
8 }EXTI_InitTypeDef;
(5)編寫EXTI中斷服務(wù)函數(shù)(中斷函數(shù)固件庫中已經(jīng)定義必須使用下列函數(shù)名不能自己定義)
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler
三、編寫外部中斷控制程序 要實(shí)現(xiàn)外部中斷方式控制LED,程序框架如下:
(1)初始化對(duì)應(yīng)端口的EXTI(第三部分中的1-4小步)
(2)編寫EXTI中斷函數(shù)
(3)編寫主函數(shù)
1 /*******************************************************************************
2 * 函 數(shù) 名 : My_EXTI_Init
3 * 函數(shù)功能 : 外部中斷初始化
4 * 輸 入 : 無
5 * 輸 出 : 無
6 *******************************************************************************/
7 void My_EXTI_Init(void)
8 {
9 NVIC_InitTypeDef NVIC_InitStructure;
10 EXTI_InitTypeDef EXTI_InitStructure;
11
12 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //AFIO使能
13 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//選擇GPIO管腳用作外部中斷線路
14 //EXTI0 NVIC 配置
15 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0中斷通道
16 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//搶占優(yōu)先級(jí)
17 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子優(yōu)先級(jí)
18 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
19 NVIC_Init(&NVIC_InitStructure); //根據(jù)指定的參數(shù)初始化VIC寄存器
20 //初始化EXTI 配置
21 EXTI_InitStructure.EXTI_Line=EXTI_Line0;
22 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
23 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
24 EXTI_InitStructure.EXTI_LineCmd=ENABLE;
25 EXTI_Init(&EXTI_InitStructure);
26 }
1 /*******************************************************************************
2 * 函 數(shù) 名 : EXTI0_IRQHandler
3 * 函數(shù)功能 : 外部中斷0函數(shù)
4 * 輸 入 : 無
5 * 輸 出 : 無
6 *******************************************************************************/
7 void EXTI0_IRQHandler(void)
8 {
9 if(EXTI_GetITStatus(EXTI_Line3)==1) //判斷EXTI中斷標(biāo)志位狀態(tài)函數(shù)
10 {
11 //填寫中斷中需要完成的程序
12 }
13 EXTI_ClearITPendingBit(EXTI_Line3); //在結(jié)束中斷服務(wù)函數(shù)前,清楚中斷標(biāo)志位
14
15 }
總結(jié)
以上是生活随笔為你收集整理的(stm32f103学习总结)—stm32外部中断的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一、Oracle目录介绍
- 下一篇: appt使用小结