该汇编程序是基于S5P6818X芯片(cortex-A53)的一个简单汇编程序,实现LED闪烁功能
其他芯片也可参考该汇编逻辑
.text
.global _start
_start:
@ 1. 设置GPIOA28引脚为GPIO功能
@ GPIOAALTFN1[25:24] = 0b00
@ 0xC001A024 为GPIOAALTFN1寄存器的地址
ldr r0, =0xC001A024 @在寄存器r0中存入GPIO控制寄存器GPIOAALTFN1的地址
ldr r1, [r0] @加载GPIO控制寄存器GPIOAALTFN1的数据到r1
bic r1, r1, #(0x3 << 24) @清除24 25 两个位的数据
str r1, [r0] @更新GPIOAALTFN1寄存器
@ 2. 设置GPIOA28引脚模式(0:输入 1:输出)
@ GPIOAOUTENB[28] = 0b1
@ 0xC001A004 为GPIOAALTFN1寄存器的地址
ldr r0, =0xC001A004 @在寄存器r0中存入GPIO控制寄存器GPIOAOUTENB的地址
ldr r1, [r0] @加载GPIO控制寄存器GPIOAOUTENB的数据到r1
orr r1, #(0x1 << 28) @将28位置1 设置为OUTPUT模式
str r1, [r0] @更新GPIOAALTFN1寄存器
@循环
loop:
bl red_on @ 点亮RED灯
bl delay1s @ 延时1s
bl red_off @ 熄灭RED灯
bl delay1s @ 延时1s
b loop
@ 点亮RED灯
red_on:
@ 设置GPIOA28引脚输出高电平
@ GPIOAOUT[28] = 0b0
@ 0xC001A000 为GPIOAOUT寄存器的地址
ldr r0, =0xC001A000 @在寄存器r0中存入GPIO控制寄存器GPIOAOUT的地址
ldr r1, [r0] @加载GPIO控制寄存器GPIOAOUT的数据到r1
orr r1, #(0x1 << 28) @将28位置1
str r1, [r0] @更新GPIOAOUT寄存器
mov pc, lr @跳回主循环
@ 熄灭RED灯
red_off:
@ 设置GPIOA28引脚输出低电平
@ GPIOAOUT[28] = 0b0
@ 0xC001A000 为GPIOAOUT寄存器的地址
ldr r0, =0xC001A000 @在寄存器r0中存入GPIO控制寄存器GPIOAOUT的地址
ldr r1, [r0] @加载GPIO控制寄存器GPIOAOUT的数据到r1
bic r1, #(0x1 << 28) @将28位清理零
str r1, [r0] @更新GPIOAOUT寄存器
mov pc, lr @跳回主循环
@ 1s的延时函数
delay1s:
ldr r3, =0x10000000 @设置计数次数
mm:
cmp r3, #0 @r3 与 0比较 看是否计数到零
subne r3, r3, #1 @r3 - 1
bne mm @跳转到对比
mov pc, lr @计数结束跳转到主循环
.end