1. 程式人生 > >nanoPc T2裸機開發(一)

nanoPc T2裸機開發(一)

---------------------------寫在前面

已經好久沒有玩微控制器了,之前玩的stm32根本就不算是學習,只是單純地使用之前學過的51知識和呼叫原子的庫函式,菜得一匹。有什麼不對的地方,還請大家指正,謝謝。

參考:

開發板是使用友善之臂的nanoPc T2,Soc是S5P4418,其他的外設自己看wiki吧,上面都有。我覺得挺不錯的,雖然我就只用過這家的,但是用起來還是不錯的。

這是我參考的例程,雖然我沒有進去看,(因為我沒有微博。。。。)但是我有他的全部相關資料原始碼,就是整理的微博上的。叫做迪卡大佬,強得一匹。

----------------------------正文

我們需要知道我們現在要做的是一個什麼樣的事情,要有個概念。如果你看了迪卡大佬的文章,他的題目就是,像玩51一樣玩s5p4418,這也就是說,我們可以能夠用s5p4418來點燈啊,設定按鍵啊,加個1602啊,加個12864啊,擼箇中斷來跑定時器啊,這種和學51時相同的功能。(什麼?居然還能這麼玩?)這是肯定的,原理都是相同的,只是一個更復雜,功能更多了,運用場景更廣闊而已。

ok,比如說,我們要拿他來點燈。回想一下51的時候,我們是怎麼做的?

1.包含標頭檔案,reg51.h這不能少吧,(這一步IDE已經幫我們做好了,我只需要include就好)

2.擼功能函式

3.編譯生成hex或者bin檔案

4.下載到目標機中(即51微控制器)

非常簡單對吧,那麼對應到我們的手頭這塊nanoPc T2應該怎麼做呢?

1《========》我們也需要一個頭檔案,這個標頭檔案和reg51.h的功能相同的,但是我們得自己寫。

2《========》擼功能函式

3《========》編譯生成hex或者bin檔案(我只試了生成bin)

4《========》下載到目標機中(即s5p4418)

其實都一樣的步驟,但是我們缺少了IDE的幫忙,略顯得麻煩而已,我沒有試過keil能不能用,我此行的目的是為了理解他的一整個流程,而不是僅僅是跑出個結果而已,所以參照迪卡大佬的程式,理解。

那麼具體怎麼做呢?

1.標頭檔案形成,看了迪卡大佬的文章,他對51的理解非常深,我學的時候僅僅是停留在用而已,他已經看到了本質。一整個系統都是0 1的“世界”,一層層地搭建起來的。最底層的世界就是許多電平訊號的傳輸。那麼,回來,51的標頭檔案,上面有很多sfr sbit定義的東西,後面接著一串16進位制數,那是什麼?那就是暫存器的絕對地址,前面的字串就是這些地址的代號,比方說,sfr P0 0x80;  你可以由0x80這個地址找到這個暫存器,而P0則是我們在上層交流的暗語,最後彙編的時候他會還原成絕對地址的。

也就是說,我們要給s5p4418分配暗語代號,目的是為了更好的交流。ok,知道我們要做的事情是什麼了之後,還要解決我們如何得知他們暫存器等的地址在哪呢?查晶片的datasheet,上面寫得還挺詳細的,(雖然我也沒有對比,但是看著挺多頁的。。。)什麼?你不會?不要緊,先看一下別人寫的原始碼,看一下別人是怎麼寫的,然後再思考為什麼這麼寫,上面的資訊我可以在哪查得到。由於我用的是迪卡大佬的程式碼,所以我就不放上來了,你們想要的話,可以去微博聯絡他,(我還沒有微博。。。。)

2.假設我們已經看明白了標頭檔案,我們以點燈為例,我們需要操作的就是GPIO介面,那麼我們需要操作的就是GPIO,gpio有那麼多,我們選哪一個?

這是datasheet上截的圖,下面還有很多。這就是他比51強大的原因了,他強大的地方就是他功能強且多,而空間有限,引腳不夠怎麼辦?引入了引腳複用的機制。下圖我們可以看到他的封裝圖,

他的bga封裝引出的引腳,對於他的功能來說,其他不算多,正因為引腳複用,才拓展了他。下圖是他的複用對映圖,

A1 A2 A3....對應著他的引腳,但是他引腳的功能是什麼,需要暫存器來設定。

這就是我們需要控制gpio的暫存器,來達到我們想要的功能。

ok,我們現在已經知道了,我們操作暫存器的目的是什麼了,現在我們就可以來配置暫存器來達到我們的目的。

我們的目的是點亮led,那麼我們要查原理圖,什麼引腳控制的led,這個就不貼圖了。我的這塊板子,是GPIOB12控制的led0的。所以,我們需要GPIOB12,ok,在引腳複用暫存器那裡檢視,我們應該怎麼操作才能得到GPIOB12。

這兩個是配置複用的暫存器,ALTFN0是0-15引腳的,ALTFN1是31-16引腳的。我需要的是12,那麼,看12

好像並沒有什麼GPIOB12的字眼出現,我們再看剛才的引腳分配圖,

看到了嗎,ALT Function0 ,1,2,3是配置他們的功能引腳的。GPIOB12是2,所以賦值10.

即,GPIOBALTFN0 |= (0X2<<24);或者你寫成16進位制也行。ok,這樣之後這個引腳就是GPIOB12了。但是我們控制LED,是要讓引腳輸出電壓,所以還需配置為輸出模式,這個也是一樣的,配置相應的暫存器就ok了,很簡單的。輸出也有相應的控制,所以,非常簡單就能達到我們的要求了。至此,我們的功能函式也就擼完了。