初始准備
- 初始化串口
初始化Tx、Rx對應的GPIO引腳
設置1個停止位,8位數據位
發送和接收都是polling
禁止modem、afc
波特率設置
- 初始化按鍵中斷(在key.c中:以中斷方式處理按鍵)
外部中斷對應的GPIO設置
中斷觸發模式
中斷允許
清掛起,清除是寫1
- 綁定好異常向量表、初始化中斷控制器
綁定異常向量表
禁止所有中斷
選擇中斷類型為IRQ
清VICxADDR
- 綁定isr到中斷控制器硬件
- 使能中斷
運行過程:
程序運行-----> 按鍵按下-------->硬件自動跳轉到異常向量表的IRQ中斷部分 -------->由於向量表這里寫的是IRQ_handle的函數地址,所以又發生一次跳轉 ----------
---> 到匯編中執行IRQ_handle,具體作用為:保護現場、跳轉到真正的中斷處理程序、返回時的現場恢復 ---------> 到.c文件中執行IRQ_handler函數 --------->由於除了按鍵之外的其他的一些中斷也會導致發生IRQ中斷,所以不一定是按鍵中斷------->由於S5PV210幫我們硬件實現了發生的中斷位置1,所以我們只需要到vicaddr[i]中讀取函數執行就可以了。
第二次理解:
S5PV210中,有異常向量表,當出現中斷時會硬件會自動跳轉到異常向量表中,去執行向量表中對應的代碼,但是向量表中實際上每個異常只提供了4個字節,所以我們在異常向量表中存的實際上是中斷處理函數的地址。
那么分析一下,按鍵處理的中斷,首先我們做好初始工作
按鍵部分key.c:
- 按鍵設置為中斷處理模式
- 下降沿觸發
- 中斷允許
- 清掛起
- 寫好真正的中斷處理程序以便於將來和VICnADDRESS中的中斷源編號綁定。
中斷部分int.c:
- 寫好異常向量表中各個中斷對應的異常處理代碼,重點寫好中斷處理的代碼。
- 綁定異常中斷處理函數的地址到異常向量表
- 初始化中斷控制器:禁止所有中斷 VICnINTENCLEAR = 0xffffffff;選擇中斷類型為IRQ中斷,清除清VICnVECTADDR
- 寫好綁定函數,用於綁定isr到VICnVECTADDR
- 使能中斷函數VICnINTENABLE
- 禁止中斷函數VICnINTENCLEAR
- 中斷處理程序:直接到VICnVECTADDR中取出isr函數去執行
匯編文件start.S
- 寫好中斷保護現場的過程
main函數
- 做好中斷初始化
- 串口初始化
- 調用綁定異常向量表函數
- 調用綁定isr函數
- 使能中斷
按鍵iRQ中斷執行步驟:
- (1)按鍵按下
- (2)硬件跳轉到異常向量表執行對應的中斷處理,同時將isr硬件自動推送到VICnVECTADDR
- (3)異常向量表中是IRQ中斷地址,指向匯編文件,在匯編文件中做好現場保護工作,比如設置IRQ模式下的棧,保存r0~r12,跳轉到中斷處理程序
- (4)從匯編跳轉到中斷處理程序中執行,使用指針的方式間接訪問VICnVECTADDR中由硬件自動推送的函數,執行。
- (5)程序執行結束,跳轉到匯編中恢復現場