今天學習了linux arm裸機篇的彙編led驅動,學習了簡單的gpio使用,其大致原理和stm32的gpio初始化類似,下面列出程式設計步驟:
1、時鐘的使能設定 暫存器ccgr0~ccgr6全部置位1(為了新手方便,不單獨設定,具體參考imx6ull參考手冊699頁)
2、gpio復位的選擇設 暫存器iomuxc_sw_mux_ctl_pad_gpio1_io03復用為gpio功能(1571頁)
3、io引腳的屬性設定 暫存器iomuxc_sw_pad_ctl_pad_gpio1_io03(1793頁)
4、輸入輸出設定 暫存器gpiox_gdir設定輸入輸出(此處暫存器為gpio1_gdir)
5、高低電平的設定 暫存器gpiox_dr設定輸出的電平高低(此處暫存器為gpio1_dr)
下面上彙編**:
.global _start /* 全域性標號 */
_start
:/* 1、使能所有時鐘 */
ldr r0, = 0x020c4068 @ 暫存器ccgr0
ldr r1, = 0xffffffff
str r1, [r0]
ldr r0, = 0x020c406c @ 暫存器ccgr1
str r1, [r0]
ldr r0, = 0x020c4070 @ 暫存器ccgr2
str r1, [r0]
ldr r0, = 0x020c4074 @ 暫存器ccgr3
str r1, [r0]
ldr r0, = 0x020c4078 @ 暫存器ccgr4
str r1, [r0]
ldr r0, = 0x020c407c @ 暫存器ccgr5
str r1, [r0]
ldr r0, = 0x020c4080 @ 暫存器ccgr6
str r1, [r0]
/* 2、設定gpio1_io03復用為gpio1_io03 */
ldr r0, = 0x020e0068
ldr r1, = 0x5
str r1, [r0]
/* 3、配置gpio1_io03的io屬性
*bit 16: 0 hys關閉
*bit [15:14]: 00 預設下拉
*bit [13]: 0 kepper功能
*bit [12]: 1 pull/keeper使能
*bit [11]: 0 關閉開路輸出
*bit [7:6]: 10 速度100mhz
*bit [5:3]: 110 r0/6驅動能力
*bit [0]: 0 低轉換率 48
*/ldr r0, = 0x020e02f4
ldr r1, = 0x10b0
str r1, [r0]
/* 4、設定gpio1_io03為輸出 */
ldr r0, = 0x0209c004
ldr r1, = 0x00000008
str r1, [r0]
/* 5、開啟led0 */
ldr r0, = 0x0209c000
ldr r1, = 0
str r1, [r0]
loop
: b loop @ loop死迴圈
雖然整段**沒有什麼難度,但我在編寫完之後燒錄開發板還是出現了一點小問題,這裡給出一點小意見,命令盡量小寫書寫,書寫位址時x需要小寫,後面字母可以大寫(害,我就是犯了這麼簡單致命的錯誤)。
因為上面編寫好的彙編**不能直接進行燒錄,需要進行一系列的編譯操作:
1、使用arm-linux-gnueabihf-gcc,將.c .s檔案變為.o檔案
2、將所有的.o檔案連線為elf格式的可執行檔案
3、將elf檔案轉為bin檔案
4、將elf檔案轉為彙編,反彙編
為了方便之後修改程式,這裡可以使用makefile進行編寫(建立的檔案名字必須為makefile)
led.bin
:led.s
arm-linux-gnueabihf-gcc -g -c led.s -o led.o /* gcc編譯檔案 */
arm-linux-gnueabihf-ld -ttext 0x87800000 led.o -o led.elf /* 鏈結檔案,0x87800000為起始位址 */
arm-linux-gnueabihf-objcopy -o binary -s -g led.elf led.bin /* 格式轉換 */
arm-linux-gnueabihf-objdump -d led.elf > led.dis /* 反彙編 */
clean
: rm -rf *.o led.bin led.elf led.dis
這樣就能直接使用make語句進行編譯,make clean進行刪除,非常方便。
這裡我們將通過sd卡來給開發板燒錄**,需要使用開發光碟裡的imxdownlaod軟體,將這個軟體複製到**目錄中,在終端上執行下面的命令:
./imxdownload <.bin file>
sd卡的位置可以通過訪問 ls /dev/sd*進行檢視
最後就可以將sd卡插入到開發板上,調整撥碼開關,上電,led等就會亮起來了。(恭喜高階電燈工程師/手動滑稽)
今天的學習就是這些了,謝謝**。
正點原子 linux 開發板彙編點燈。
1.使能時間控制 ccgr0 6 2.配置io口復用,復用為gpio 3.配置輸出模式。global start 全域性標號 start 使能所有時鐘 ldr r0,0x020c4068 ccgr0 ldr r1,0xffffffff 要向ccgr0寫入的資料 str r1,r0 將0xffffff...
正點原子Mini Linux UART串列埠簡單介紹
二 部分例程 uart,也就是非同步序列收發器,使用uart與外界相連最少只要三條線 txd 傳送 rxd 接收 和gnd 地線 uart串列埠的介面電平有ttl和rs 232兩種,在正電原子的這款mini linux開發板上有ch340晶元,可以實現usb和串列埠ttl訊號之間的轉換,這裡用到的是...
正點原子 Mini Linux BSP工程管理
靜態模式 其他疑問 模仿stm32驅動開發實驗中,主要是在.s檔案中新增了清除.bss段資料 未初始化的資料段 的 在.件下對時鐘,io暫存器組的基位址進行巨集定義,並構造了對應的結構體 注意暫存器位址的連續性 最後將各個外設的暫存器組基位址強轉為對應的結構體指標並進行巨集定義,這樣在主函式中就能像...