海思晶元上GPIO操作

2021-09-24 20:26:39 字數 3280 閱讀 1436

gpio的設定一般為三步:1 設定gpio埠復用、2 設定gpio口的方向、3 讀取或者寫入gpio值;第一步不是每個gpio口都是要配置的,如果你設定的gpio埠有復用功能,那麼你需要對gpio對應復用暫存器進行配置,例如:文件中gpio5_5是有復用功能的,0:pwm_out0  ; 1:gpio5_5,所以把復用暫存器設定為1就是表示為gpio5_5;但有些gpio埠是沒有復用功能的,例如gpio0_0,這個就不需要復用暫存器的設定;

1、設定gpio埠復用

所謂復用,就是指乙個埠能同時幹很多事,但是具體你要求他幹啥,是需要設定的,這就是管腳復用暫存器的作用。

舉個例子,如果我們想設定gpio5_5,需要首先找到對應的管腳復用暫存器位址;通過手冊查詢,如果你想讓這個管腳作為io口使用,需要給復用控制暫存器muxctrl_reg54這個暫存器裡寫0x01;管腳復用暫存器的基位址為0x120f_0000,muxctrl_reg54的偏移位址0xd8,所以這個暫存器的位址為0x120f00d8;

通過his自帶的himm命令輸入以下即可:

himm 0x120f00d8 0x01;

這樣gpio5_5對應管腳的功能就設定為了io口,還有乙個問題需要注意:在設定暫存器的時候要檢視該暫存器其他bit位的作用,不要盲目的直接設定你需要設定的bit位,可能會其他bit給清除了,所以最好的做法是先讀出暫存器的值,然後或上設定的位的值,再設定暫存器,這樣就不會改變其他bit位的值;

2 設定gpio口的方向

所謂方向,就是你是把io做輸入用還是輸出用。比如如果你的板子外接了個電池模組,你希望電池模組在沒電的時候,能夠給你的板子乙個訊號,告訴你沒電了,這時你就需要將io口作為輸入使用。反過來,如果你需要告訴外接的什麼裝置什麼事情,那就要將io口做輸出,設定gpio口的方向,實際上就是寫 gpio_dir暫存器。同樣的,首先需要找位址,對於gpio5的基位址為:0x121a_0000;gpio_dir的偏移位址為0x400,得到gpio5_5的暫存器位址為0x121a_0400;然後gpio_dir暫存器裡有8位,每一位對應乙個gpio的方向,如果你想把gpio5_5的方向設為輸出,則需要把bit5置1;

輸入命令:himm  0x121a0400  0x20(二進位制 0010 0000)

3 讀取或者寫入gpio值

gpio_data為gpio資料暫存器,用來對輸入或輸出資料進行快取;當配置gpio_dir中對應位為輸出時,寫入gpio_data 暫存器的值將會輸出到相應的管腳(注意需要配置正確的管腳復用);如果配置為輸入時,將會讀取相應輸入管腳的值。

注意:當gpio_dir相應的位元配置為輸入時,有效讀取的結果將返回管腳的值;當配置為輸出的時候,有效讀取的結果將返回寫入的值。gpio_data 暫存器利用paddr[9:2]實現了讀寫暫存器位元的遮蔽操作。該暫存器對應256個位址空間。paddr[9:2]分別對應gpio_data[7:0],當相應的bit 為高時,則可以對相應的位進行讀寫操作;反之,若對應bit 為低則不能進行操作。

例如:若位址為0x3fc(0b11_1111_1100),則對gpio_data[7:0]這8bit 操作全部有效。

若位址為0x200(0b10_0000_0000),則僅對gpio_data[7]的操作有效。

同樣的,首先需要找位址,對於gpio5的基位址為:0x121a_0000;gpio_data 的偏移位址為0x3fc,得到gpio5_5的暫存器位址為0x121a_03fc,如果你想把gpio5_5寫入值為1時,則需要把bit5置1;

輸入命令:himm 0x121a03fc 0x20(二進位制 0010 0000)

上面也說了,對於gpio埠復用功能,可以通過配置復用暫存器muxctrl_reg54,把這個gpio埠配置為pwm_out0的功能,配置為pwm管腳功能的歩聚:1、配置gpio復用;2、設定core pwm 引數;3、使能core 對應的pwm;

1、配置gpio復用

按照上面說明,只需要把muxctrl_reg54復用暫存器配置為0,即為pwm_out0功能,

執行命令:himm 0x120f00d8 0x00

2、設定core pwm 引數

根據所需的pwm 輸出頻率和占空比,計算出對應的pwm 計數週期數和高電平計數值。

計數週期數計算公式為:

pwm_ period = (24000000 / freq) −1

高電平計數值計算公式為:

pwm_ duty = (24000000/ freq)*duty −1

例如,晶元core電源調壓控制由pwm0訊號控制,如果需要pwm0 輸出頻率為

200khz, 占空比為75%,配置步驟如下:

pwm_period=(24000000/200000)-1 = 119

pwm_duty=(24000000/200000) x 0.75-1=89

設定core pwm 引數:設定peri_pmc0 [15:0]=0x77, peri_pmc0 [31:16]=0x59;

執行命令: himm 0x120e0000  0x00590077

3、使能core 對應的pwm

使能core 對應的pwm: 設定peri_pmc4 [0]=1;

執行命令:himm 0x120e0010 0x01

如果想通過**操作gpio,請檢視博主文章:

海思晶元上GPIO和PWM操作

一 gpio的配置 gpio的設定一般為三步 1 設定gpio埠復用 2 設定gpio口的方向 3 讀取或者寫入gpio值 第一步不是每個gpio口都是要配置的,如果你設定的gpio埠有復用功能,那麼你需要對gpio對應復用暫存器進行配置,例如 文件中gpio5 5是有復用功能的,0 pwm out...

海思GPIO和中斷操作

中斷部分 1.關於gpio的操作 1 gpio request gpio num,null 註冊 gpio 2 設定gpio方向 對於輸入 gpio direction input gpio num 對於輸出 gpio direction output gpio num,gpio out val 3...

Mini XML在海思晶元上移植

解壓編譯 configure host arm hisiv300 linux 修改生產了makefile檔案 將objs mmd.o mxmldoc.o testmxml.o zipc.o libobjs 修改為 objs mmd.o libobjs 在all targets 行後增加如下內容 ar...