我是稀里糊涂的走上了嵌入式開發的道路,回想起來,多虧了身邊的幾位朋友,是在與他們的閑侃中慢慢的走上了這條道路:從最早的電路設計,PCB打板,電路調試,模擬仿真,單片機開發到后來的ARM開發,回想起來,心里也是誠惶誠恐,如履薄冰。
我開始做電子是用的AVR單片機,從I/O、按鍵…到內存、外設玩了一通。工作之后,才開始玩ARM。在項目中逐漸對ARM開發有了一些感悟。
學習ARM有兩個目的,看你是那種:1、長見識,順便玩玩;2、工作需要,從事ARM開發。這就要分開對待了。
如果是長見識,隨便玩玩,為日后的工作做準備,那么就應該挑選市場上很成熟的ARM7、ARM9等資料比較多,玩的人比較多,出現問題容易解決;如果是工作需要,就沒有這么多選擇,必須按照功能要求,開始征服特定的片子。
不管哪種目的,學習起來步驟我感覺差不多,先裸板,后上操作系統:
之所以這么安排,是因為聽了很多大牛的建議和意見。正所謂“萬丈高樓平地起”,基礎很重要。在上操作系統之前,一定要對底層代碼特別是裸板程序有一定的認識。這樣,對于操作系統中涉及底層的問題就會少很多。
現在以我學習ARM11(s3c6410-1176JZF)的經歷介紹寫一些基本功。
首先:要有一定的電子基礎。
這不是廢話嗎,既然玩ARM當然都是懂電子的呀。其實不然!電子基礎可深可淺,怎么是個頭?會IC放大器,搭建信號處理電路,這是信號處理中的基本功。對于ARM開發來說,我感覺重點在信號走線、濾波、穩壓和保持片子性能穩定上(分析一個ARM板子就會明白這些道理)。
我談下我的見解:明白ARM板子中除集成IC之外的元器件的作用,最常見的是電容作用、驅動LED呀、揚聲器呀、串口連接、存儲器連接、LCD屏幕連接等等??吹酱?,想起怎么連接;看到按鍵,想起怎么識別……基本上在硬件上可以將整個系統連接起來。
其次,有一定的英文閱讀能力。
我在開發的時候以Linux應用完全開發手冊、6410手冊和ARM1176j***內核手冊為基礎。這三個文檔一個中文,兩個英文,頁數總和有2500頁。如果沒有耐心,想盡快完成開發,這無異于緣木求魚。6410的手冊是對ARM11芯片的介紹和寄存器的總體介紹:包括GPIO設置,相機接口、Nandflash控制器、DRAM控制器等。1176j***是對1176j***處理器的設置的介紹。
對于簡單的GPIO設置,我們可以查閱6410的GPIO章節,
從中可以看出各組管腳的功能:各組管腳是混合復用(除了GPI和GPJ兩組),依據單片機知識,如果是管腳復用,必須通過相應寄存器設置才能達到相應要求,這時,我們需要看GPIO的寄存器設置章節:
對于GPA組,
可以看出端口A具有讀寫功能,并且有相應的地址,從存儲器映射圖中可以看出,端口A可以通過配置相應寄存器(也就是相應的地址)為合適的數值,就能完成相應的操作。
對于GPA0管腳來說,通過配置其為0000或者0001或者0010將其定義為輸入、輸出或者串口模式,具體操作及分如下:
通過三個操作,可以講GPA0設置為輸出功能,如果外界LED,可以實現LED燈的控制。
此外,還有數據寄存器,上拉控制寄存器,配置休眠和上拉休眠等寄存器,其操作原理一樣,將相應的寄存器地址放入一寄存器,寫入數值,即完成相應配置。
第三、要有一點匯編和c語言的基礎。
為什么這么說呢,首先看下配置I/O口為簡單輸入輸出的ARM的啟動代碼:
在6410的啟動代碼中,需要以匯編語言的形式設置、配置寄存器,現在將這部分進行簡單的分析:
在寫裸板程序的起始,需以 .globl 為開始,通過
將外設地址映射到外設地址,通過
將存儲器大小設置為256M,具體怎么實現的呢,查看1176j***手冊:
有此可見,6410手冊和1176j***手冊對于裸板程序是一利器。
第四、舉一反三,融會貫通,利用網絡。
一個6410手冊有1378頁,一個1176j***有972頁,看完是一項可望不可及的任務,因此善于舉一反三,融會貫通是必須的。另外還需要有Google大神的幫助。在開發過程中,如果碰到新功能,新接口沒有使用過,這時,Google大神就可以發揮其大神的作用,帶領你完成任務。
如在寫堆棧操作中,需要將各寄存器的數值進行保存,需要使用stmdb指令,如果不熟悉,可以用Google大神進行幫助。
通過介紹,可以明白具體的操作。
雖然ARM更新速度很快,但是也不是出來一個新產品就讓我們從頭開始學習新技術,只要熟悉掌握了一種MCU,通過舉一反三,可以將技術擴大到應有的領域。
評論
查看更多