中斷服務函數列表
IO口外部中斷在中斷向量表中只分配了7個中斷向量,也就是只能使用7個中斷服務函數
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler
外部中斷一般步驟
1、開啟IO口時鐘,初始化IO口為輸入。調用函數:GPIO_Init();
2、開啟IO口復用時鐘。調用函數:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
3、設置IO口與中斷線的映射關系。調用函數:GPIO_EXTILineConfig();
4、初始化線上中斷,設置觸發條件等。調用函數:EXTI_Init();
5、配置中斷分組(NVIC),并使能中斷。調用函數:NVIC_Init();
6、編寫中斷服務函數。調用函數:EXTIx_IRQHandler();
7、清除中斷標志位。調用函數:EXTI_ClearITPendingBit()。
硬件:
LED——GPIOB,GPIO_Pin_5
KEY——GPIOE,GPIO_Pin_1
代碼:
void LED_Init(void) //led初始化配置
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根據設定參數初始化GPIOB.5
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 輸出高 此時狀態為滅 低電平亮
}
void KEY_Init(void) //key初始化配置
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能PORTA,PORTE時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設置成上拉輸入
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化GPIOE.1
}
void EXTIX_Init(void) //中斷線初始化配置 下降沿觸發
{
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能復用功能時鐘
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource1); //設置IO口與中斷線的映射關系
EXTI_InitStructure.EXTI_Line=EXTI_Line1; //KEY——GPIOE,GPIO_Pin_1 映射線
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中斷模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //上升沿中斷
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中斷
EXTI_Init(&EXTI_InitStructure); //根據EXTI_InitStruct中指定的參數初始化外設EXTI寄存器
}
void NVIC_Init(void) //中斷初始化配置
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //使能按鍵key1所在的外部中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優先級2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子優先級2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
NVIC_Init(&NVIC_InitStructure);
}
void EXTI1_IRQHandler(void) //中斷服務函數配置
{
delay_ms(10); //鍵盤消抖
if(EXTI_GetITStatus(EXTI_Line1)==1) //判斷中斷線中斷狀態是否發生
{
GPIO_PinReverse(GPIOB,GPIO_Pin_5); //反轉
}
EXTI_ClearITPendingBit(EXTI_Line1); //清除LINE1上的中斷標志位
}
int main(void)
{
LED_Init();
KEY_Init();
NVIC_Init();
EXTIX_Init();
while(1);
}
代碼可以進行的優化:
1.使用 #define 宏定義來聲明GPIO口
2.使用 庫函數 或者 寄存器 來操作GPIO口
硬件:
LED——GPIOB,GPIO_Pin_5
KEY——GPIOE,GPIO_Pin_1
#define digitalHi(p,i) {p->BSRR = i;}
#define digitalLow(p,i) {p->BSRR = (uint32_t)i;}
#define digitalToggle(p,i) {p->ODR ^= i;}
#define LED_GPIO_PORT GPIOB
#define LED_GPIO_PIN GPIO_pin_5
#define LED_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED_TOGGLE digitalToggle(LED_GPIO_PORT,LED_GPIO_PIN)
#define LED_OFF digitalHi(LED_GPIO_PORT,LED_GPIO_PIN)
#define LED_ON digitalLow(LED_GPIO_PORT,LED_GPIO_PIN)
外部中斷常用庫函數:
①設置IO口與中斷線的映射關系:
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource,uint8_t GPIO_PinSource);
eg: GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource1);
② 初始化中斷線:觸發方式等:
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
③判斷中斷線中斷狀態,是否發生:
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
④清除中斷線上的中斷標志位:
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
EXTI_Init函數:
typedef struct
{
uint32_t EXTI_Line; //指定要配置的中斷線
EXTIMode_TypeDef EXTI_Mode; //模式:事件 OR中斷
EXTITrigger_TypeDef EXTI_Trigger; //觸發方式:上升沿/下降沿/雙沿觸發
FunctionalState EXTI_LineCmd; //使能 OR失能
}EXTI_InitTypeDef;
EXTI_InitStructure.EXTI_Line=EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
上一篇:STM32——ARM與STM32之間的聯系
下一篇:STM32——MCU結構簡述(中英文對照)
推薦閱讀
史海拾趣
設計資源 培訓 開發板 精華推薦
- PI PowiGaN技術學習中心,全方位解讀PI 1700V GaN: InnoMux-2 EP技術精髓!有好禮!
- 中秋芯幣兌大禮
- 了解泰克新品P7700探頭,答題贏好禮!
- STM32H7R/S 高性能MCU 開啟全新的創新機遇!答題好禮~還有開發板等你拿!
- ST傳感器闖天下之驅動移植大賽+骨振動傳感器評測,分高者勝
- 3月26日上午10:00直播:開拓IoT社會 尼吉康的新蓄電裝置
- 感恩十載 與你同在 EEWORLD十周年
- 有獎評測:100套東芝最小光繼電器TLP3547的評估板免費申請中!
- 醫用/工業CT醫療影像探測器芯片應用與解決方案
- MPS有獎活動|綠色AI“芯” 動力,探索節能低碳的AI供電方案!