1. 程式人生 > >海思晶片上GPIO操作步驟的整理

海思晶片上GPIO操作步驟的整理

最近在研究海思晶片,弄到GPIO這塊時,一開始一頭霧水,一番搜尋加看文件,貌似搞明白怎麼用了。特寫此文,幫助自己理解。 根據3516cv200手冊(其它都一樣),使用gpio只需要3步 1 設定gpio埠複用 所謂複用,就是指一個埠能同時幹很多事,但是具體你要求他幹啥,是需要設定的,這就是管腳複用暫存器的作用。 舉個例子,如果我們想設定GPIO6_7,需要首先找到對應的管腳複用暫存器地址。查手冊,對應說明如圖。意思是如果你想讓這個管腳作為io口使用,需要給muxctrl_reg55這個暫存器裡寫00。那麼muxctrl_reg55這個暫存器在哪呢?前面已經給了偏移地址0x0DC。手冊裡查下基地址0x200F_0000
。所以這個暫存器的地址為0x200F_00DC 那麼如何寫值進去呢,海思SDK已經給了工具himm 輸入以下命令即可: himm 0x200F00DC 0 這樣GPIO6_7對應管腳的功能就設定為了IO口
2 設定GPIO口的方向 所謂方向,就是你是把io做輸入用還是輸出用。比如如果你的板子外接了個電池模組,你希望電池模組在沒電的時候,能夠給你的板子一個訊號,告訴你沒電了,這時你就需要將io口作為輸入使用。反過來,如果你需要告訴外接的什麼裝置什麼事情,那就要將io口做輸出。 設定GPIO口的方向,實際上就是寫 GPIO_DIR暫存器。同樣的,首先需要找地址。 看下面兩張表:

查表得到GPIO6_7的GPIO_DIR暫存器地址為0x201A_0400。然後GPIO_DIR暫存器裡有8位,每一位對應一個GPIO的方向,即:

如果你想把GPIO6_7的方向設為輸出則輸入命令:himm 0x201A0400 0b10000000. 但是實際操作中,直接這樣幹也許會影響到其他的GPIO方向,所以最好先把暫存器裡的值讀出來,只改bit 7的值,其他的保持不變。 3 讀取或者寫入GPIO值 這塊實際上就是GPIO_DATA暫存器,從名字就可以知道,這個暫存器就是裝的數值對不,很好理解。但是不好理解的是手冊裡的一段話:
這裡我的理解是GPIO_DATA[7:0]實際上就對應了GPIO6_7到GPIO6_0  8個IO口,每一個bit是1還是0,就對應了每個IO口的數值。
那麼那段話裡什麼0x3FC,0x200這些地址什麼意思呢,我理解實際上允許你對GPIO的值進行批量操作。
打個比方,如果你只想操作GPIO6_7,那麼你的偏移地址就應該為0b10_0000_0000(即0x200),但是如果你想同時操作GPIO6_7和GPIO6_6,那麼你給的偏移地址就應該是0b11_0000_0000(即0x300)。 所以繼續上面的例子,我們只對GPIO6_7設定輸出1,那麼就應該輸入:himm 0x201A0200 0xFF 雖然我們給的值是0xFF,但是由於上面的原因,實際上我們只是給GPIO_DATA[7]賦值了,其他的都沒作用。 最後補充說下linux下gpio和海思gpio編號區別問題: 我研究資料時,先看的是原理圖,一上來就看到gpio編號都是gpiox_x(gpio6_6之類的)這種寫法,就有點蒙。因為我以前只搞過linux簡單的GPIO輸入輸出,所以腦海裡只有gpiox這種寫法,比如gpio1、gpio2。看了cpu手冊才知道,原來海思的gpio是分組的,比如3516cv200有9組,每組又有8個io口,所以gpio6_6的意思是第6組的第7個io口。 參考資料: 3516cv200手冊