在点灯前,需要做好充足准备
1、先在原理图上找LD1、LD2、LD3所用的引脚口
2、在接口连接的原理图上找LD1、LD2、LD3所对应的网络标签
3、找到RCC和GPIO对应的总线,为AHB4
4、找到GPIOE和GPIOF和RCC的起始地址
5、找到所有需要修改的位,及其偏移量
代码总览
.text
.global _start
_start:
/*------------------------------------------------GPIOE时钟设置--------------------------------------------*/
@将RCC_MP_AHB4ENSETR寄存器第[4]设置为1,使能GPIOE外设时钟
LDR R0,=0x50000a28 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
ORR R1,R1,#(0x1<<4) @将第4位设置为1
STR R1,[R0] @将修改后的数值写回
/*------------------------------------------------GPIOF时钟设置--------------------------------------------*/
@将RCC_MP_AHB4ENSETR寄存器第[5]设置为1,使能GPIOF外设时钟
LDR R0,=0x50000a28 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
ORR R1,R1,#(0x1<<5) @将第5位设置为1
STR R1,[R0] @将修改后的数值写回
/*--------------------------------LED1:PE10-----------------------------------------*/
@LED1:PE10 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] @将修改后的数值写回
@LED1:PE10 GPIOE_OTYPER[10]设置为0,PE10推挽输出
LDR R0,=0x50006004 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
BIC R1,R1,#(0x1<<10) @将第[10]位设置0
STR R1,[R0] @将修改后的数值写回
@LED1:PE10 GPIOE_OSPEEDR[21:20]设置为00,PE10低速输出
LDR R0,=0x50006008 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
BIC R1,R1,#(0x3<<20) @将第[21:20]位设置0
STR R1,[R0] @将修改后的数值写回
@LED1:PE10 GPIOE_PUPDR[21:20]设置为00,PE10输出无上拉下拉电阻
LDR R0,=0x5000600C @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
BIC R1,R1,#(0x3<<20) @将第[21:20]位设置0
STR R1,[R0] @将修改后的数值写回
/*--------------------------------LED2:PF10-----------------------------------------*/
@LED2:PF10 GPIOE_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] @将修改后的数值写回
@LED2:PF10 GPIOE_OTYPER[10]设置为0,PF10推挽输出
LDR R0,=0x50007004 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
BIC R1,R1,#(0x1<<10) @将第[10]位设置0
STR R1,[R0] @将修改后的数值写回
@LED2:PF10 GPIOE_OSPEEDR[21:20]设置为00,PF10低速输出
LDR R0,=0x50007008 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
BIC R1,R1,#(0x3<<20) @将第[21:20]位设置0
STR R1,[R0] @将修改后的数值写回
@LED2:PF10 GPIOE_PUPDR[21:20]设置为00,PF10输出无上拉下拉电阻
LDR R0,=0x5000700C @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
BIC R1,R1,#(0x3<<20) @将第[21:20]位设置0
STR R1,[R0] @将修改后的数值写回
/*--------------------------------LED3:PE8-----------------------------------------*/
@LED3:PE8 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] @将修改后的数值写回
@LED3:PE8 GPIOE_OTYPER[8]设置为0,PE8推挽输出
LDR R0,=0x50006004 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
BIC R1,R1,#(0x1<<8) @将第[8]位设置0
STR R1,[R0] @将修改后的数值写回
@LED3:PE8 GPIOE_OSPEEDR[17:16]设置为00,PE8低速输出
LDR R0,=0x50006008 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
BIC R1,R1,#(0x3<<16) @将第[17:16]位设置0
STR R1,[R0] @将修改后的数值写回
@LED3:PE8 GPIOE_PUPDR[17:16]设置为00,PE8输出无上拉下拉电阻
LDR R0,=0x5000600C @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
BIC R1,R1,#(0x3<<16) @将第[21:20]位设置0
STR R1,[R0] @将修改后的数值写回
loop:
BL led1_on
BL Delay
BL led1_off
BL led2_on
BL Delay
BL led2_off
BL led3_on
BL Delay
BL led3_off
B loop
/*-----------------------延时-----------------------------*/
Delay:
LDR r3,=0X10000000
MM:
CMP R3,#0
subne r3,r3,#1
bne MM
MOV PC,LR
/*-------------------------------------led1的开关----------------------------------------*/
led1_on:
@LED1:PE10 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 @函数返回
led1_off:
@LED1:PE10 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的开关----------------------------------------*/
led2_on:
@LED2:PF10 GPIOE_ODR[10]设置为1,PF10输出高电平;设置为0,PF10输出低电平
LDR R0,=0x50007014 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
ORR R1,R1,#(0x1<<10) @将第[10]位设置1
STR R1,[R0] @将修改后的数值写回
MOV PC,LR @函数返回
led2_off:
@LED2:PF10 GPIOE_ODR[10]设置为1,PF10输出高电平;设置为0,PF10输出低电平
LDR R0,=0x50007014 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
BIC R1,R1,#(0x1<<10) @将第[10]位设置0
STR R1,[R0] @将修改后的数值写回
MOV PC,LR @函数返回
/*-------------------------------------led3的开关----------------------------------------*/
led3_on:
@LED3:PE8 GPIOE_ODR[8]设置为1,PE8输出高电平;设置为0,PE8输出低电平
LDR R0,=0x50006014 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
ORR R1,R1,#(0x1<<8) @将第[10]位设置1
STR R1,[R0] @将修改后的数值写回
MOV PC,LR @函数返回
led3_off:
@LED3:PE8 GPIOE_ODR[8]设置为1,PE8输出高电平;设置为0,PE8输出低电平
LDR R0,=0x50006014 @指定操作的寄存器地址
LDR R1,[R0] @将寄存器数据取出来保存到R1中
BIC R1,R1,#(0x1<<8) @将第[10]位设置0
STR R1,[R0] @将修改后的数值写回
MOV PC,LR @函数返回
.end