1. 程式人生 > 實用技巧 >stm32串列埠的配置方案

stm32串列埠的配置方案

  最近老闆要我去做控制方面的內容,所以買了一塊正點原子的開發板,現在是研究了一下usart.c,函式的程式碼如下:

void USART1_IRQHandler(void) 
        {
        u8 Res;
        #ifdef OS_TICKS_PER_SEC //串列埠 1 中斷服務程式//如果時鐘節拍數定義了,說明要使用 ucosII 了.OSIntEnter();
        #endif
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        //接收中斷(接收到的資料必須是 0x0d 0x0a 結尾)
{ Res =USART_ReceiveData(USART1);//(USART1->DR); //讀取接收到的資料 if((USART_RX_STA&0x8000)==0)//接收未完成 { if(USART_RX_STA&0x4000)//接收到了 0x0d { if(Res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始 else USART_RX_STA|=0x8000; //接收完成了 } else //還沒收到 0X0D {
if(Res==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0; //接收資料錯誤,重新開始接收 } } } } #ifdef OS_TICKS_PER_SEC //如果時鐘節拍數定義了,說明要使用 ucosII 了.
OSIntExit( ); #e ndif }

  這裡我生出了一個疑惑——中斷函式是如何進入的,當初學習51系列微控制器的時候我們知道,我們是特別設定了一箇中斷入口的,但是在stm32的程式設計中,我們並沒有使用多執行緒之類的手段。因此,我翻看了原子哥串列埠部分的主函式程式碼,以及串列埠通訊實驗的各種檔案,希望能找到關於中斷連結之類的程式碼(與主要內容無關這裡便不列出),但是並沒有。之後我再網上各種平臺翻看了一下,同時想到了我們在編寫stm32程式碼前會先匯入一個與晶片相關的.s彙編檔案,因此最終我在彙編檔案中找到如下內容:

           DCD     I2C1_EV_IRQHandler         ; I2C1 Event
                DCD     I2C1_ER_IRQHandler         ; I2C1 Error
                DCD     I2C2_EV_IRQHandler         ; I2C2 Event
                DCD     I2C2_ER_IRQHandler         ; I2C2 Error
                DCD     SPI1_IRQHandler            ; SPI1
                DCD     SPI2_IRQHandler            ; SPI2
                DCD     USART1_IRQHandler          ; USART1
                DCD     USART2_IRQHandler          ; USART2
                DCD     USART3_IRQHandler          ; USART3    

  其中DCD是一條資料定義偽指令,用於分配一片連續的字儲存單元並用指定的資料初始化。USART1_IRQHandler就是我們所定義的中斷函式,因此我個人猜測這裡是定義了一個異常的入口,發生對應的異常時會進入對應的入口。也就是說.s檔案中便將這些定義了。