亮灯步骤:首先找到LED的管脚
然后根据主板图确定主线编号--AHB4
之后根据手册找到RCC和GPIOF/E的基地址,进而确定每个寄存器在内存的地址
最后设置每个LED的寄存器
1.GPIOE_MODER[21:20]设置为01,PE10管脚为输出模式
2.GPIOE_OTYPER[10]设置为0,PE10推挽输出
3.GPIOE_OSPEEDR[21:20]设置为00,PE10低速输出、
4.GPIOE_PUPDR[21:20]设置为00,PE10输出无上拉下拉电阻
5.GPIOE_ODR[10]设置为1,PE10输出高电平;设置为0,PE10输出低电平
.text
.global _start
_start:
@将RCC_MP_AHB4ENSETR寄存器第[4]设置为1,使能GPIOE外设时钟
LDR R0,=0x50000a28 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
ORR R1,R1,#(0x1<<4) @将第4位设置为1
STR R1,[R0] @将修改后的数值写回
@将RCC_MP_AHB4ENSETR寄存器第[5]设置为1,使能GPIOE外设时钟
LDR R0,=0x50000a28 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
ORR R1,R1,#(0x1<<5) @将第4位设置为1
STR R1,[R0] @将修改后的数值写回
@1.GPIOE_MODER[21:20]设置为01,PE10管脚为输出模式
LDR R0,=0x50006000 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
BIC R1,R1,#(0x3<<20) @将第[21:20]位设置0
ORR R1,R1,#(0x1<<20) @将第20位设置为1
STR R1,[R0] @将修改后的数值写回
@1.GPIOF_MODER[21:20]设置为01,PF10管脚为输出模式
LDR R0,=0x50007000 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
BIC R1,R1,#(0x3<<20) @将第[21:20]位设置0
ORR R1,R1,#(0x1<<20) @将第20位设置为1
STR R1,[R0] @将修改后的数值写回
@1.GPIOE_MODER[17:16]设置为01,PE8管脚为输出模式
LDR R0,=0x50006000 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
BIC R1,R1,#(0x3<<16) @将第[17:16]位设置0
ORR R1,R1,#(0x1<<16) @将第16位设置为1
STR R1,[R0] @将修改后的数值写回
@2.GPIOE_OTYPER[10]设置为0,PE10推挽输出
LDR R0,=0x50006004 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
BIC R1,R1,#(0x1<<10) @将第[10]位设置0
STR R1,[R0] @将修改后的数值写回
@2.GPIOF_OTYPER[10]设置为0,PF10推挽输出
LDR R0,=0x50007004 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
BIC R1,R1,#(0x1<<10) @将第[10]位设置0
STR R1,[R0] @将修改后的数值写回
@2.GPIOE_OTYPER[8]设置为0,PE8推挽输出
LDR R0,=0x50006004 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
BIC R1,R1,#(0x1<<8) @将第[8]位设置0
STR R1,[R0] @将修改后的数值写回
@3.GPIOE_OSPEEDR[21:20]设置为00,PE10低速输出、
LDR R0,=0x50006008 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
BIC R1,R1,#(0x3<<20) @将第[21:20]位设置0
STR R1,[R0] @将修改后的数值写回
@4.GPIOE_PUPDR[21:20]设置为00,PE10输出无上拉下拉电阻
LDR R0,=0x5000600C @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
BIC R1,R1,#(0x3<<20) @将第[21:20]位设置0
STR R1,[R0] @将修改后的数值写回
@5.GPIOE_ODR[10]设置为1,PE10输出高电平;设置为0,PE10输出低电平
LDR R0,=0x50006014 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
ORR R1,R1,#(0x1<<10) @将第[10]位设置1
STR R1,[R0] @将修改后的数值写回
@5.GPIOF_ODR[10]设置为1,PE10输出高电平;设置为0,PE10输出低电平
LDR R0,=0x50007014 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
ORR R1,R1,#(0x1<<10) @将第[10]位设置1
STR R1,[R0] @将修改后的数值写回
@5.GPIOE_ODR[8]设置为1,PE8输出高电平;设置为0,PE10输出低电平
LDR R0,=0x50006014 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
ORR R1,R1,#(0x1<<8) @将第[10]位设置1
STR R1,[R0] @将修改后的数值写回
loop:
BL led1_on
bl Delay
bl led1_off
bl Delay
BL led2_on
bl Delay
bl led2_off
bl Delay
BL led3_on
bl Delay
bl led3_off
bl Delay
b loop
led1_on:
@5.GPIOE_ODR[10]设置为1,PE10输出高电平;设置为0,PE10输出低电平
LDR R0,=0x50006014 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
ORR R1,R1,#(0x1<<10) @将第[10]位设置1
STR R1,[R0] @将修改后的数值写回
mov pc,lr @程序返回
led2_on:
@5.GPIOF_ODR[10]设置为1,PF10输出高电平;设置为0,PE10输出低电平
LDR R0,=0x50007014 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
ORR R1,R1,#(0x1<<10) @将第[10]位设置1
STR R1,[R0] @将修改后的数值写回
mov pc,lr
led3_on:
@5.GPIOF_ODR[8]设置为1,PE8输出高电平;设置为0,PE10输出低电平
LDR R0,=0x50006014 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
ORR R1,R1,#(0x1<<8) @将第[10]位设置1
STR R1,[R0] @将修改后的数值写回
mov pc,lr
led1_off:
@5.GPIOE_ODR[10]设置为1,PE10输出高电平;设置为0,PE10输出低电平
LDR R0,=0x50006014 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
bic R1,R1,#(0x1<<10) @将第[10]位设置0
STR R1,[R0] @将修改后的数值写回
mov pc,lr @程序返回
led2_off:
@5.GPIOF_ODR[10]设置为1,PF10输出高电平;设置为0,PE10输出低电平
LDR R0,=0x50007014 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
bic R1,R1,#(0x1<<10) @将第[10]位设置0
STR R1,[R0] @将修改后的数值写回
mov pc,lr
led3_off:
@5.GPIOE_ODR[8]设置为1,PE8输出高电平;设置为0,PE10输出低电平
LDR R0,=0x50006014 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
bic R1,R1,#(0x1<<8) @将第[10]位设置0
STR R1,[R0] @将修改后的数值写回
mov pc,lr
@延时函数
Delay:
LDR r3,=0X1000000
MM:
CMP R3,#0
subne r3,r3,#1
bne MM
MOV PC,LR
.end