使用汇编点亮单片机LED灯

时间:2025-03-07 14:58:56
#define GPIOEOUT 0xC001E000 #define GPIOEOUTENB 0xC001E004 #define GPIOEALTFN0 0xC001E020 .text //代码段的开始 .global _start _start: //地址标签,也可以作为函数名 //配置GPIOE13为GPIO模式 ldr r0,=GPIOEALTFN0 //r0 = 0xC001E020 ldr r1,[r0] //r1 = *r0 ldr r2,=3<<26 //r2 = 3<<26 mvn r3,r2 //r3 = ~r2 and r1,r1,r3 //r1 = r1 & r3 str r1,[r0] //*r0 = r1 //配置GPIOE13为输出功能 ldr r0,=GPIOEOUTENB //r0 = 0xC001E004 ldr r1,[r0] //r1 = *r0 ldr r2,=1<<13 //r2 = 1<<13 orr r1,r1,r2 //r1 = r1|r2 str r1,[r0] //*r0 = r1 //GPIOE13输出低电平 ldr r0,=GPIOEOUT //r0 = 0xC001E000 ldr r1,[r0] //r1 = *r0 ldr r2,=1<<13 //r2 = 1<<13 mvn r3,r2 //r3 = ~r2 and r1,r1,r3 //r1 = r1 & r3 str r1,[r0] //*r0 = r1 loop: //地址标签 //GPIOE13输出低电平 ldr r0,=GPIOEOUT //r0 = 0xC001C000 ldr r1,[r0] //r1 = *r0 ldr r2,=1<<13 //r2 = 1<<13 mvn r3,r2 //r3 = ~r2 and r1,r1,r3 //r1 = r1 & r3 str r1,[r0] //*r0 = r1 //延时一会 bl delay //delay() //GPIOE13输出高电平 ldr r0,=GPIOEOUT //r0 = 0xC001E000 ldr r1,[r0] //r1 = *r0 ldr r2,=1<<13 //r2 = 1<<13 orr r1,r1,r2 //r1 = r1 | r2 str r1,[r0] //*r0 = r1 //延时一会 bl delay //delay() b loop //跳转到loop delay: mov r0,#0x2000000 //r0=0x2000000 delay_loop: sub r0,r0,#1 //r0=r0-1 cmp r0,#0 //检测r0 == 0 bne delay_loop //有条件的跳转,若r0跟0是不相等,则跳转到delay_loop;否则不跳转 bx lr //函数返回 .end //代码段的结束