思来想去还是决定记录一下点灯,毕竟万物皆点灯嘛
编程步骤
-
使能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即可
代码
cpp
.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了!