通过GNU ARM汇编实现对led灯闪烁控制。
编程环境搭建:
开发板:野火Imx6ull mini板
编程环境:Ubuntu18.04 + VScode
直接上汇编代码:
/*******************
*文件名: led.s
*作者 : 桂志威
*邮箱 : [email protected]
*描述 :裸机实验测试1 汇编点亮led灯
********************/
.global _start @全局标号
/*****
*描述 : _start函数
*/
_start :
/*****
*点亮LED灯 GPIO5_IO03
*开漏输出
*/
/*****
*1.使能控制时钟
*/
ldr r0, =0x020c4068 @配置寄存器CCM_CCGR0
ldr r1, =0xffffffff
str r1, [r0]
ldr r0, =0x020c406C @配置寄存器CCM_CCGR1
ldr r1, =0xffffffff
str r1, [r0]
ldr r0, =0x020c4070 @配置寄存器CCM_CCGR2
ldr r1, =0xffffffff
str r1, [r0]
ldr r0, =0x020c4074 @配置寄存器CCM_CCGR3
ldr r1, =0xffffffff
str r1, [r0]
ldr r0, =0x020c4078 @配置寄存器CCM_CCGR4
ldr r1, =0xffffffff
str r1, [r0]
ldr r0, =0x020c407C @配置寄存器CCM_CCGR5
ldr r1, =0xffffffff
str r1, [r0]
ldr r0, =0x020c4080 @配置寄存器CCM_CCGR6
ldr r1, =0xffffffff
str r1, [r0]
/*****
*2.GPIO5_IO03 复用功能配置GPIO
*IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 地址229_0014h
*/
ldr r0, =0x02290014 @配置寄存器SNVS_TAMPER3
ldr r1, =0x5 @AL5
str r1, [r0]
/*****
*3.GPIO5_IO03 配置IO属性功能
*IOMUXC_SNVS_SW_PAD_CTL_PAD_SNVS_TAMPER3 地址 229_0058h
*BIT0 压摆率 0-慢速
*BIT5-3 驱动能力R0/6 -110
*BIT7-6 速度 100mhz-10
* BIT11 开漏输出使能 1-开启
*BIT12 上下拉功能使能 0-关闭上下拉
*BIT13 保持功能0
*BIT15-14 100K上下拉电阻 -00
*BIT16 hys-0关闭
*设置配置值:8B0-100010110000
*/
ldr r0, =0x02290058 @配置寄存器SNVS_TAMPER3
ldr r1, =0x08B0 @AL5
str r1, [r0]
/*****
*4.设置GPIO5_IO03 为输出
*GPIO5_GDIR 地址20A_C004
*GPIO5_DR 地址20A_C000
*/
ldr r0, =0x020AC004 @配置寄存器GPIO5_GDIR
ldr r1, =0x08 @BIT3
str r1, [r0]
/*****
*5打开GPIO LED
*/
ldr r0, =0x020AC000 @GPIO5_DR
ldr r1, =0x00 @BIT3
str r1, [r0]
/*****
*6 loop循环运行
*/
loop:
/**
*开灯
*/
ldr r0, =0x020AC000 @GPIO5_DR
ldr r1, =0x00 @BIT3
str r1, [r0]
/**
*延时
*/
bl delay
/**
*关灯
*/
ldr r0, =0x020AC000 @GPIO5_DR
ldr r1, =0x08 @BIT3
str r1, [r0]
/**
*延时
*/
bl delay
b loop
/**
*延时
*/
delay:
ldr r2, =0xfffff
ldr r3, =0x0
delay_loop:
sub r2,r2, #1
cmp r2,r3
bne delay_loop
mov pc,lr @返回主函数
简化版的makefie
led.bin : led.s
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
clean:
rm -rf *.o led.bin led.elf led.dis
dump:
arm-linux-gnueabihf-objdump -D led.elf > led.dis
dowmload:
./imxdownload led.bin /dev/sdb
最终效果:
大概0.5s时间闪烁。
简单汇编延时代码:
/**
*延时
*/
delay:
ldr r2, =0xfffff
ldr r3, =0x0
delay_loop:
sub r2,r2, #1
cmp r2,r3
bne delay_loop
mov pc,lr @返回主函数