思來想去還是決定記錄一下點燈,畢竟萬物皆點燈嘛
編程步驟
-
使能GPIO時鐘
-
設置引腳復用為GPIO
-
設置引腳屬性(上下拉、速率、驅動能力)
-
控制GPIO引腳輸出高低電平
使能GPIO時鐘
其實和32差不多
先找到控制LED燈的引腳,也就是原理圖
文件名
C:/Users/dawn/Desktop/野火_EBF6ULL%20S1%20Mini_EBF410270V1_SCH_20230518.pdf
然后再數據手冊找到對應開啟時鐘的寄存器和引腳定義
?名字:IMX6ULLRM(6ULL用戶手冊).pdf
這里可以看到所在內存位置0x20c406c
至于為什么要全置1可以看數據手冊的定義
這里為了方便賦值全一,其實只要對26、27位賦一就可以
設置引腳復用為GPIO
引腳復用相關寄存器:IOMUXC_SW_MUX_CTL_PAD_XXX
?
設置引腳屬性(上下拉、速率、驅動能力)
Register (IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO04) ?
?
?
控制GPIO引腳輸出高低電平、
設置引腳方向
把第4位置1也就是10000(2)=16(10)
?
設置引腳電平
4置為0即可
?
?代碼
.global _start_start:@ 使能GPIO時鐘
ldr r0,=0x20c406c
ldr r1,=0xffffffff
str r1,[r0]@ 設置引腳復用為GPIO
ldr r0,=0x20e006c
ldr r1,=5
str r1,[r0]@ 設置引腳屬性(上下拉、速率、驅動能力)
ldr r0,=0x20e02f8
ldr r1,=0x10b0
str r1,[r0]@ 控制GPIO引腳輸出高低電平
ldr r0,=0x0209c004
ldr r1,=16
str r1,[r0]ldr r0,=0x0209c000
ldr r1,=0
str r1,[r0]
程序編譯
下載裸機的gcc編譯器
sudo apt-get install gcc-arm-none-eabi 裸機程序編譯
編譯匯編文件為可重定位文件led.o
arm-none-eabi-gcc -c led.s -o led.o
把重定位文件鏈接起來,得到可執行程序(elf文件)
arm-none-eabi-ld -Ttext 0x80000000 led.o -o led.elf
這里記錄一下我遇到的問題
gec@ubuntu:~/bare_mental/part_2$ arm-none-eabi-ld -Ttext 0x80000000 led.o -o led.elf
arm-none-eabi-ld: warning: cannot find entry symbol _start; defaulting to 0000000080000000
這是GNU鏈接器(ld)的警告消息,指示未找到入口符號_start
,而默認使用地址0000000080000000
作為入口點。
入口符號(Entry symbol)是程序的起始點。通常情況下,它是C/C++代碼中的main
函數。在本例中,ld無法找到名為_start
的入口符號,因此會使用默認的入口地址0000000080000000
。
我當時是從VS粘貼到VScode的
右下角設置為UTF-8和LF就好了
把elf文件去掉冗余的段和elf頭,得到純凈的bin文件
arm-none-eabi-objcopy -O binary led.elf led.bin
給bin文件添加6ull特殊的頭部信息(IVT+boot data+DCD),并燒錄到sd卡
./mkimage.sh XXX.bin
這里需要把撥碼開關調至258,emmc啟動的是2457
然后就成功點亮一枚LED了!
?