通过汇编程序实现三个LED灯的依次闪烁

 亮灯步骤:首先找到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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值