stm32串列埠的配置方案
阿新 • • 發佈:2020-11-19
最近老闆要我去做控制方面的內容,所以買了一塊正點原子的開發板,現在是研究了一下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檔案中便將這些定義了。