提示:小白自學,大神看到不對的地方請指出指導一下,
中斷是啥
中斷可以這樣比喻:你在做一件事情,然后電話打進來,你去做電話里要求你做的是,然后做完了又回來做剛才沒做完的事情,
NVIC
嵌套向量中斷控制器,屬于內核外設,管理著包括內核和片上所有外設的中斷相關的功能,
EXTI
外部 中斷/事件 控制器
EXTI 有20個中斷/事件線,每個GPIO都可以被設定為輸入線,占用 EXTI0至EXTI15,
中斷分組、主優先級、子優先級

一般來說先選定優先級分組,選好之后就不要改了,因為改分組可能會使程式錯亂,然后配置主優先級和子優先級,
如果同一分組里,主優先級相同,子優先級越低,越先發生,如果是主優先級不同,那么主優先級越低,也越先發生,等一個發生完了,再接下一個發生…當然,如果一個優先級高的先發生了,這是來了個低的,是不會打斷這個正在發生的,
配置程序分析
用的是按鍵中斷1.初始化要連接到EXTI的GPIO
代碼如下(示例):
GPIO_InitTypeDef GPIO_InitStruct; //宣告結構體
RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK, ENABLE); //開時鐘
GPIO_InitStruct.GPIO_Pin = KEY1_INT_GPIO_PIN; //配置按鍵的引腳
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //配置模式
GPIO_Init( KEY1_INT_GPIO_PORT , &GPIO_InitStruct); //埠初始化寫入
2.初始化EXTI用于產生中斷/事件
代碼如下(示例):
EXTI_InitTypeDef EXTI_InitStruct;//宣告結構體
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//打開APB2的時鐘
GPIO_EXTILineConfig( GPIO_PortSourceGPIOA, GPIO_PinSource0);//選擇GPIO引腳作為EXTI線
EXTI_InitStruct.EXTI_Line = EXTI_Line0;//選擇EXTI線
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//選擇中斷模式
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//選擇上升觸發型別
EXTI_InitStruct.EXTI_LineCmd = ENABLE;//EXTI使能
EXTI_Init( &EXTI_InitStruct);
3.初始化NVIC,用于處理中斷
代碼如下(示例)
NVIC_InitTypeDef NVIC_InitStruct;//宣告結構體
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1);//選擇優先級分組
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;//選擇中斷源
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;//選擇主優先級
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;//選擇子優先級
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//中斷使能
NVIC_Init( &NVIC_InitStruct);
NVIC_IROChannel:用來設定中斷源,不同的中斷中斷源不一樣,且不可寫錯,即使寫錯了程式也不會報錯,只會導致不回應中斷,

有需要的可以去韌體庫里查所需要的中斷源
4.撰寫中斷服務函式
#define LED_G_TOGGLE {LED_GPIO_PORT->ODR ^= LED_GPIO_PIN;}//暫存器異或實作亮滅
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus( EXTI_Line0) != RESET )//檢測是否按下
{
LED_TOGGLE;//燈亮滅
}
EXTI_ClearITPendingBit( EXTI_Line0 );//清除
}
5.主函式
int main(void)
{
LED_GPIO_Config();
EXTI_KEY1_Config();
while(1)
{
}
}
總結
算是對STM32的中斷有了個了解,會用按鍵中斷來電燈,這算是入門的一大步嘛?哈哈哈,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/276268.html
標籤:其他
