本人现在大一,刚开学学习C语言的时候就开始接触CSDN了,现在也想在这里记录我的学习过程,因此写了这第一篇博客。
(内容如果有错误,欢迎大家指正)
今天学习了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等就会亮起来了。(恭喜进阶电灯工程师/手动滑稽)
今天的学习就是这些了,谢谢观看。