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燈初始化及開(kāi)關(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);
// PB5
gpio_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);
// PE5
gpio_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話不說(shuō)開(kāi)啟時(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, PE3
GPIO_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_Line4
GPIO_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_Line4
EXTI_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)先級(jí)分組
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> 總中斷開(kāi)關(guān)
// 文件core_cm3.h:
static __INLINE void __enable_irq() { __ASM volatile ("cpsie i"); }
static __INLINE void __disable_irq() { __ASM volatile ("cpsid i"); }
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-835139.html
7> 總結(jié)
GPIO, AFIO, EXTI, NVIC等功能模塊,學(xué)習(xí)它們們時(shí)各個(gè)擊破;
了解他們內(nèi)部結(jié)構(gòu),內(nèi)部寄存器,找點(diǎn)感覺(jué),
重點(diǎn)看看每個(gè)模塊的函數(shù)如何使用,
會(huì)使用后,看看內(nèi)部如何編寫(xiě)的,非常能提高編程技能;文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-835139.html
到了這里,關(guān)于STM32F1 - 中斷系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!