手把手教做網(wǎng)站做國外網(wǎng)站
Interrupt
- 1> 硬件框圖
- 2> NVIC 中斷管理
- 3> EXTI 中斷管理
- 3.1> EXTI與NVIC
- 3.2> EXTI內(nèi)部框圖
- 4> 外部中斷實(shí)驗(yàn)
- 4.1> 實(shí)驗(yàn)概述
- 4.2> 程序設(shè)計(jì)
- 5> 中斷向量表
- 6> 總結(jié)
1> 硬件框圖
NVIC:Nested Vectored Interrupt Controller【嵌套向量中斷控制器】
管理內(nèi)核外設(shè)和片上外設(shè)的所有中斷功能;
EXTI:External Interrupt 【外部中斷控制器】
管理GPIO的中斷;
2> NVIC 中斷管理
3> EXTI 中斷管理
3.1> EXTI與NVIC
STM32F103ZET6總共19個(gè)外部中斷
PA0~PG0,7個(gè)引腳中只有一個(gè)可以映射到EXTI0;
外部中斷EXTI 9 ~ 5 合并為EXTI9_5中斷;
外部中斷EXT 15~10 合并為EXT15_10中斷;
3.2> EXTI內(nèi)部框圖
4> 外部中斷實(shí)驗(yàn)
4.1> 實(shí)驗(yàn)概述
用2個(gè)按鍵控制2個(gè)LED狀態(tài)翻轉(zhuǎn),用外部中斷方式
4.2> 程序設(shè)計(jì)
main.c: 主程序
int main(void)
{ LED_Init();KEY_Init();LED_Off();while(1) /* stop */;//return 0;
}
bsp_led.c: LED燈初始化及開關(guān)函數(shù)
void LED_Init(void)
{GPIO_InitTypeDef gpio_Struct_tmp = {0};// 使能時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);// PB5gpio_Struct_tmp.GPIO_Pin = GPIO_Pin_5;gpio_Struct_tmp.GPIO_Speed = GPIO_Speed_50MHz;gpio_Struct_tmp.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽輸出GPIO_Init(GPIOB, &gpio_Struct_tmp); // PE5gpio_Struct_tmp.GPIO_Pin = GPIO_Pin_5;gpio_Struct_tmp.GPIO_Speed = GPIO_Speed_50MHz;gpio_Struct_tmp.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽輸出GPIO_Init(GPIOE, &gpio_Struct_tmp);
}void LED_On(void)
{GPIO_ResetBits(GPIOB, GPIO_Pin_5);GPIO_ResetBits(GPIOE, GPIO_Pin_5);
}void LED_Off(void)
{GPIO_SetBits(GPIOB, GPIO_Pin_5);GPIO_SetBits(GPIOE, GPIO_Pin_5);
}
bsp_key.c: 按鍵初始化
void KEY_Init(void)
{GPIO_InitTypeDef GPIO_tmp;EXTI_InitTypeDef EXTI_tmp;NVIC_InitTypeDef NVIC_tmp;/*-------------Step 1> 配置GPIO ---------------*/// 2話不說開啟時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);GPIO_tmp.GPIO_Mode = GPIO_Mode_IPU;GPIO_tmp.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_3; // PE4, PE3GPIO_tmp.GPIO_Speed = GPIO_Speed_50MHz; // PE4, PE3 上拉輸入GPIO_Init(GPIOE, &GPIO_tmp);/*------------- Step 2> 配置AFIO ------------*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4); // EXTI_Line4GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3); // EXTI_Line3/*------------- Step 3> 配置EXTI ------------*/EXTI_tmp.EXTI_Line = EXTI_Line4;EXTI_tmp.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_tmp.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_tmp.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_tmp); // EXTI_Line4EXTI_tmp.EXTI_Line = EXTI_Line3;EXTI_tmp.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_tmp.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_tmp.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_tmp); // EXTI_Line3/*------------- Step 4> 配置NVIC ------------*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 中斷優(yōu)先級分組NVIC_tmp.NVIC_IRQChannel = EXTI4_IRQn;NVIC_tmp.NVIC_IRQChannelPreemptionPriority = 0;NVIC_tmp.NVIC_IRQChannelSubPriority = 0;NVIC_tmp.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_tmp); NVIC_tmp.NVIC_IRQChannel = EXTI3_IRQn;NVIC_tmp.NVIC_IRQChannelPreemptionPriority = 0;NVIC_tmp.NVIC_IRQChannelSubPriority = 0;NVIC_tmp.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_tmp);
}
4步配置GPIO的外部中斷:
Step 1> 配置GPIO
Step 2> 配置AFIO
Step 3> 配置EXTI
Step 4> 配置NVIC
stm32f10x_it.c: 中斷處理函數(shù)
// EXTI3 處理函數(shù), key1;
void EXTI3_IRQHandler(void)
{EXTI_ClearITPendingBit(EXTI_Line3);LED_On();
}// EXTI4 處理函數(shù), key0;
void EXTI4_IRQHandler(void)
{EXTI_ClearITPendingBit(EXTI_Line4);LED_Off();
}
5> 中斷向量表
中斷數(shù)量:70個(gè)
STM32F103ZET6有70個(gè)中斷 = 60外設(shè)中斷 + 10個(gè)系統(tǒng)中斷;
6> 總結(jié)
GPIO, AFIO, EXTI, NVIC等功能模塊,學(xué)習(xí)它們們時(shí)各個(gè)擊破;
了解他們內(nèi)部結(jié)構(gòu),內(nèi)部寄存器,找點(diǎn)感覺,
重點(diǎn)看看每個(gè)模塊的函數(shù)如何使用,
會使用后,看看內(nèi)部如何編寫的,非常能提高編程技能;