與MCU不同,ARM屬于功能更復雜,更強大的SOC,是可以移植操作系統的,但是在最開始學習arm,需要了解arm的運行方式,所以現在使用的是裸機開發。arm系統有多種工作模式,分別是User,IRQ,FIQ,Supervisor,Abort,Undef? 和 System。一般情況下arm會工作在User模式,但是當有異常發生時,pc指針會指向異常向量表中對應的異常向量,該異常向量保存的是異常處理函數入口,然后就會進入異常處理函數。
而對這些異常向量進行初始化,對其對應的cpsr,sp進行初始化就是需要匯編實現的功能,將這些寫好之后,在匯編中使用b指令進行跳轉,跳轉到c文件的主函數開始正常運行。
而這些異常向量最常用到的就是中斷異常,我選擇的是使用IRQ模式執行中斷處理函數,當產生中斷的時候就會跳轉到異常向量的位置,然后會跳轉到中斷處理函數,該中斷處理函數是所有的中斷都會跳轉過來的函數,所以在該函數中,需要對跳轉的是哪一個中斷進行判斷,一般使用的是INTOFFSET,中斷偏移量進行判斷,INTOFFSET值不同就代表了不同的中斷,然后根據對應的中斷去處理相應的函數,最終在處理完之后要記得源掛起寄存器和中斷掛起寄存器的置起位都清掉,不然就會反復執行該中斷。
因為我要使用的是按鍵,使用按鍵需要配置端口 G 控制寄存器(GPGCON,??GPGDAT,?GPGUP)
然后配置GPGCON寄存器中的GPG0,GPG3等與按鍵相關的這六個GPG,讓他們的模式為EINT模式,就可以通過按鍵觸發對應的外部中斷了。然后通過配置EXTINTn(外部中斷控制寄存器 n),就可以選擇對應的觸發方式,按鍵按下是高電平向低電平的跳變,所以這里選擇的是下降沿觸發方式,然后需要配置EINTMASK(外部中斷屏蔽寄存器),通過配置該寄存器的對應位來允許中 斷,這些都是對該外部中斷的初始化,讓其按下按鍵會進入相應的終端,最后在中斷處理函數中檢查EINTPEND(外部中斷掛起寄存器)中被置起的位,就可以得知是外部中斷是EINT8_23中的哪一個中斷被相應了,然后就讓一全局變量的鍵值改變,最后使用led燈對該鍵值進行顯示。? ? ? ? ? ?
但是在使用led之前,也同樣需要查手冊,對led點亮相關的GPB寄存器進行配置,寫好初始化函數,還要寫好led點亮的函數,最后才能實現按鍵控制led的功能。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
總而言之,與之前學習的51相比,要實現一個簡單的功能,也需要查手冊,然后需要配置大量的寄存器才能實現對應的功能,但是寄存器這么多也才能實現更復雜的功能,所以還需繼續加油!
下面是我實現該功能所需要配置的寄存器的手冊內容
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??