2018.4.21溫故而知新,可以為師矣。 在JZ2440的板子上,有GPIO控制器,這裡我打算用GPF4作為輸出。 那麼怎麼讓GPF4輸出1或者0?可以通過:①配置為輸出引腳(配置GPFCON) ②設置狀態(配置GPFDAT) 在JZ2440的板子上有CPU,裡面有R0,R1......R15寄存 ...
2018.4.21溫故而知新,可以為師矣。
在JZ2440的板子上,有GPIO控制器,這裡我打算用GPF4作為輸出。
那麼怎麼讓GPF4輸出1或者0?可以通過:①配置為輸出引腳(配置GPFCON) ②設置狀態(配置GPFDAT)
在JZ2440的板子上有CPU,裡面有R0,R1......R15寄存器,這些寄存器CPU可以直接訪問。
而GPIO控制器里有GPF1,GPF2......GPFCON/GPFDAT寄存器,CPU無法直接訪問,只能以地址訪問。
GPFCON配置寄存器(配置引腳F),GPFDAT數據寄存器(引腳F的數據寄存器)。
①先要把GPF4配置為輸出引腳,查表可知:
GPF4對應GPFCON[9:8],寄存器8bit為1時,地址為0x00000100。
所以把0x100寫到寄存器GPFCON,0x56000050上面。
②設置狀態,查表可知:
GPF4對應GPFDAT[4],寄存器4bit為1時,地址為0x00000010;寄存器4bit為0時,地址為0。
對於GPFDAT[4]有兩個狀態:
①輸出1時為高電平,燈熄滅→把0x10寫到地址0x56000054上面。
②輸出0時為低電平,燈點亮→把0寫到地址0x56000054上面。
我要的是點亮板子上的led,則選擇第二種方式。
我用彙編代碼寫,簡單介紹一下用到的代碼指令。
①LDR(load):讀記憶體,讀4位元組。
LDR R0,[R1]
假設R1的值是x,讀取地址x上的數據(4位元組),保存到R0中。
②STR(store):寫記憶體命令,寫4位元組。
STR R0,[R1]
假設R1的值是x,把R0的值寫到地址x中。
③B:跳轉
④MOV(move):賦值指令
MOV R0,R1
把R1的值賦給R0,即R0=R1。
MOV R0,#0x100→R0=0x100。
⑤LDR的偽指令
LDR R0,#0x12345678
這是一條偽指令,它的最終結果被拆分為幾條真正的ARM指令,指令結果使得R0=0x12345678。
如果MOV R0,#0x12345678 這是一條錯誤的指令,為什麼呢?
我習慣用Source Insight 3.5
代碼如下:
連接到伺服器,把led_on.S用FileZilla上傳到伺服器後,
這樣就可以得到led_on.bin文件。
其實為了方便以後的編譯,也可以把這些代碼做成Makefile文件
這樣直接就可以用make命令編譯;make clean命令清除生成的文件。
得到led_on.bin後,用FileZilla把bin文件從伺服器中拷貝到windows。
然後用oflash把bin燒寫到Nand flash中,斷電後設置為Nand啟動,上電即可點亮一盞led。
2018.4.21溫故而知新,可以為師矣。