今天了解了:
中斷
中斷有多個類別包括:USART中斷,I2C中斷等;
并通過NVIC來分配中斷的優先級
EXTI
EXTI的內部結構:
EXTI線
🔧 ??一、EXTI系統核心架構??
1. ??中斷源輸入(左上區域)??
- ??GPIO引腳??:
支持最多4個GPIO端口(A/B/C/D)的引腳作為中斷源。
??注意??:每個GPIO引腳都能觸發中斷。 - ??信號合并??:
多個GPIO引腳通過 ??“多路選擇器(MUX)”?? 匯合到一條EXTI線上。
??關鍵限制??:??同一時間,每條EXTI線只能連接一個GPIO引腳!??
2. ??中斷線分配(中間黃色鈴鐺圖標)??
- ??EXTI線數量??:
共有??20條獨立中斷線??:EXTI0
~EXTI15
:??16條通用線??(可分配給任意GPIO引腳)EXTI16
~EXTI19
:??4條專用線??(用于特定事件,如PVD、RTC鬧鐘等)
- ??資源復用??:
EXTI0可同時被PA0、PB0、PC0、PD0使用,但只能選擇其中一個。
3. ??中斷觸發邏輯(右上區域)??
- 每條EXTI線可獨立配置??觸發模式??:
- 上升沿觸發(
Rising Edge
) - 下降沿觸發(
Falling Edge
) - 雙邊沿觸發(
Both Edges
)
- 上升沿觸發(
- 中斷信號最終傳遞到 ??NVIC(嵌套向量中斷控制器)??,執行用戶中斷服務函數。
?? ??二、GPIO與EXTI的綁定規則??
1. ??引腳號決定EXTI線號??
- ??引腳0(如PA0/PB0)→ 綁定到EXTI0??
- ??引腳1(如PA1/PB1)→ 綁定到EXTI1??
- ...
- ??引腳15(如PA15/PB15)→ 綁定到EXTI15??
2. ??端口選擇(通過AFIO寄存器配置)??
- ??示例代碼(STM32標準庫)??:
- 以中斷優先級分組2為例:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//#1.初始化PA5和PA6RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;//PA5GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA, &GPIO_InitStruct);//PA6GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA, &GPIO_InitStruct); //#2.為EXTI5和EXTI6分配引腳RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);//#3.初始化EXTI的線EXTI_InitTypeDef EXTI_InitStruct;EXTI_InitStruct.EXTI_Line = EXTI_Line5;EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStruct.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStruct);EXTI_InitStruct.EXTI_Line = EXTI_Line6;EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStruct.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStruct);//#4.配置NVICNVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStruct);
?? ??三、重要設計約束???
專用中斷線??:
EXTI16
:連接PVD(可編程電壓檢測)EXTI17
:連接RTC鬧鐘EXTI18
:連接USB喚醒事件EXTI19
:連接RTC入侵檢測
??注意??:這些線無法分配給GPIO引腳。
💎 ??四、總結與配置流程??
??硬件連接??:
確定要用作外部中斷的GPIO引腳(如PA0)。??EXTI線映射??:
根據引腳號選擇EXTI線(如PA0 → EXTI0)。??端口綁定??:
在AFIO_EXTICR
寄存器中設置EXTI0的信號源為GPIOA(而非GPIOB等)。??中斷參數配置??:
- 選擇觸發模式(上升沿/下降沿/雙邊沿)
- 使能中斷(
EXTI->IMR
寄存器) - 在NVIC中啟用該EXTI線的中斷請求
??實現中斷服務函數??:
編寫EXTI0_IRQHandler()
函數并清除中斷標志。