作者:Machinnneee 我是稀里糊涂的走上了嵌入式開發的道路,回想起來,多虧了身邊的幾位朋友,是在與他們的閑侃中慢慢的走上了這條道路:從最早的電路設計,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手冊和ARM1176jzf內核手冊為基礎。這三個文檔一個中文,兩個英文,頁數總和有2500頁。如果沒有耐心,想盡快完成開發,這無異于緣木求魚。6410的手冊是對ARM11芯片的介紹和寄存器的總體介紹:包括GPIO設置,相機接口、Nandflash控制器、DRAM控制器等。1176jzf是對1176jzf處理器的設置的介紹。 ![]() 對于簡單的GPIO設置,我們可以查閱6410的GPIO章節, ![]() 從中可以看出各組管腳的功能:各組管腳是混合復用(除了GPI和GPJ兩組),依據單片機知識,如果是管腳復用,必須通過相應寄存器設置才能達到相應要求,這時,我們需要看GPIO的寄存器設置章節: 對于GPA組, ![]() 可以看出端口A具有讀寫功能,并且有相應的地址,從存儲器映射圖中可以看出,端口A可以通過配置相應寄存器(也就是相應的地址)為合適的數值,就能完成相應的操作。 ![]() 對于GPA0管腳來說,通過配置其為0000或者0001或者0010將其定義為輸入、輸出或者串口模式,具體操作及分如下: ![]() 通過三個操作,可以講GPA0設置為輸出功能,如果外界LED,可以實現LED燈的控制。 此外,還有數據寄存器,上拉控制寄存器,配置休眠和上拉休眠等寄存器,其操作原理一樣,將相應的寄存器地址放入一寄存器,寫入數值,即完成相應配置。 第三、要有一點匯編和c語言的基礎。 為什么這么說呢,首先看下配置I/O口為簡單輸入輸出的ARM的啟動代碼: ![]() 在6410的啟動代碼中,需要以匯編語言的形式設置、配置寄存器,現在將這部分進行簡單的分析: 在寫裸板程序的起始,需以 .globl 為開始,通過 ![]() 將外設地址映射到外設地址,通過 ![]() 將存儲器大小設置為256M,具體怎么實現的呢,查看1176jzf手冊: ![]() ![]() 有此可見,6410手冊和1176jzf手冊對于裸板程序是一利器。 第四、舉一反三,融會貫通,利用網絡。 一個6410手冊有1378頁,一個1176jzf有972頁,看完是一項可望不可及的任務,因此善于舉一反三,融會貫通是必須的。另外還需要有Google大神的幫助。在開發過程中,如果碰到新功能,新接口沒有使用過,這時,Google大神就可以發揮其大神的作用,帶領你完成任務。 如在寫堆棧操作中,需要將各寄存器的數值進行保存,需要使用stmdb指令,如果不熟悉,可以用Google大神進行幫助。 通過介紹,可以明白具體的操作。 雖然ARM更新速度很快,但是也不是出來一個新產品就讓我們從頭開始學習新技術,只要熟悉掌握了一種MCU,通過舉一反三,可以將技術擴大到應有的領域。 最后借用孔老夫子的一句話“學而不思則罔,思而不寫則殆”來表達嵌入式開發者——至少我是這樣的心情。 |