在STM32標準外設庫(SPL)開發中,外設中斷的處理流程通常如下:
一、標準庫外設中斷處理流程
(1)使能外設時鐘
在使用任何外設之前,都必須打開外設的時鐘。例如,使用USART1的中斷,需先開啟USART1和GPIO的時鐘:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
(2)配置GPIO引腳模式(若需要)
外設的中斷功能通常和GPIO引腳關聯,例如USART引腳需要配置為復用功能模式:
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 復用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);
(3)配置外設參數并打開外設中斷
使用標準庫提供的外設初始化結構,配置外設參數并使能中斷。例如,USART接收中斷:
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);// 使能USART接收中斷
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// 使能USART外設
USART_Cmd(USART1, ENABLE);
(4)配置NVIC中斷控制器
STM32的中斷是由NVIC(Nested Vectored Interrupt Controller)統一管理的,因此要在NVIC中設置中斷優先級并使能該中斷:
NVIC_InitTypeDef NVIC_InitStructure;// 配置中斷分組
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);// 配置USART1中斷通道
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; // USART1中斷向量
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 搶占優先級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 子優先級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 中斷使能
NVIC_Init(&NVIC_InitStructure);
(5)編寫中斷服務函數(ISR)
在標準庫開發中,用戶需要自己在main.c
或者自定義文件中定義中斷服務函數:
注意:ISR函數名必須和啟動文件中定義的向量表名稱一致。以USART1為例:
void USART1_IRQHandler(void)
{if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // 檢測接收中斷標志{uint16_t data = USART_ReceiveData(USART1); // 讀取接收到的數據// 用戶處理代碼,例如保存數據或發送給其他任務USART_ClearITPendingBit(USART1, USART_IT_RXNE); // 清除中斷標志}
}
二、完整的外設中斷處理流程總結
標準庫外設中斷處理的完整流程可總結為:
- 使能外設和GPIO時鐘 →
RCC_APB2PeriphClockCmd()
- 配置GPIO →
GPIO_Init()
- 外設參數設置并使能外設中斷 → 外設初始化函數,如
USART_Init()
和USART_ITConfig()
- NVIC中斷控制器配置 →
NVIC_Init()
- 編寫對應的中斷服務函數(ISR) → 用戶自行定義
IRQHandler
函數并處理對應的中斷標志
三、注意事項:
- 一定要確保中斷服務函數(如
USART1_IRQHandler()
)函數名與啟動文件的中斷向量表完全一致,否則中斷無法進入。 - 在ISR函數中,及時清除中斷標志位,否則中斷會反復進入(死循環)。
- ISR中盡量簡短高效,不要進行耗時操作,可用標志位或者緩沖區傳遞數據給主程序處理。
以上為STM32標準外設庫(SPL)外設中斷的標準處理流程,開發時可遵循該流程確保中斷功能正常穩定運行。