1. 程式人生 > >HAL庫的中斷執行步驟--2017-8-30

HAL庫的中斷執行步驟--2017-8-30

這裡簡單介紹一下在HAL庫中的中斷執行步驟

以stm32f103的uart接收中斷為例。

首先,在主函式中,使用者呼叫中斷函式HAL_UART_Receive_IT(&huart2,&RxData,1)(來自HAL庫中的UART外設庫),在該函式中,為huart結構體賦值,包括RxData的地址等等,然後加上一個標誌位,“表明”開啟了中斷

    if(huart->State == HAL_UART_STATE_BUSY_TX)
    {
      huart->State = HAL_UART_STATE_BUSY_TX_RX;
    }
    else
    {
      huart->State = HAL_UART_STATE_BUSY_RX;
    }

其中HAL_UART_STATE_BUSY_RX與HAL_UART_STATE_BUSY_TX_RX是置位後的標誌位,這個標誌位用於後面判斷主程式是否“開啟”了中斷(這裡的“開啟”表示需要開啟的意思)。最後結束。

然後,當中斷髮生後,硬體置位相關位,程式跳轉到USART2_IRQHandler(void)中斷服務函式,此函式在stm32fxxx_it.c中。在中斷服務函式中,僅存在一個函式HAL_UART_IRQHandler(&huart2),此函式存在於HAL庫中的UART外設庫。在該函式中,根據硬體的置位進行中斷型別的判斷,在此例中,判斷為接收中斷,跳轉到HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)函式,暫時稱為H函式。

在H函式中,判斷中斷標誌位是否開啟,即判斷HAL_UART_STATE_BUSY_RX與HAL_UART_STATE_BUSY_TX_RX是否置位,如果置位,則繼續執行中斷任務。在此例中,接下來程式把接到的數一個一個發到預先指定的RxData的地址上去。傳送完成後,復位那兩個標誌位,接收資料部分結束。緊接著的是關鍵的回撥函式HAL_UART_RxCpltCallback(huart),這個回撥函式在使用者函式的主函式中,由使用者自己瞎寫。最後,H函式結束。