一、查看LED网络标号和引脚号
找到LED灯D7、D8、D9、D10引脚号分别为:GPIOE13、GPIOC17、GPIOC8、GPIOC7而D11号灯为系统心跳灯,一般情况下,这个系统心跳灯是不能修改的。
二、配置引脚模式
1、查找复用功能
在手册中查找到GPIOE13为复用功能0号
2、输出电平
作为程序员,也要学会阅读英文帮助文档,这是配置输出模式,GPIOEOUT地址为:0xC001E0000
而0是低电平;
1是高电平
3、使能模式
从帮助手册中可以看出GPIOEOUTENB地址:0xC001E00004
0是输入模式
1是输出模式
4、复用功能
GPIOE13为复用功能0,GPIOEALTFN0地址为0xC001E0020
前期准备工作已就绪,现在就开始编写代码
三、 使用汇编来编写代码
1、代码实现
#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 //代码段的结束
2、使用到的汇编指令
STR:存储字数据
SUB:减法