汇编语言实现 实现三盏灯的流水闪烁
.text @声明下面内容都属于文本段内容
.global _start @声明 _start是一个全局启用的标签
_start: @封装_start标签,汇编的标签和C中的函数类似
@LED1
@GPIOE外设时钟使能 RCC_MP_AHB4ENSETR 0X50000A28 「4」-1
ldr r0,=0X50000A28 @将基地址保存到r0寄存器中
ldr r1,[r0] @将基地址里的内容保存到r1寄存器中
orr r1,r1,#(0x1<<4) @将「4」位置1
str r1,[r0] @将修改后的值写回内存
@设置PE10为输出 GPIO_MODER[21:20] --01 基地址为0x50006000
ldr r0,=0x50006000 @基地址
ldr r1,[r0] @将该地址内的数据保存到r1里
bic r1,r1,#(0x3<<20) @将[21:20]位置0
orr r1,r1,#(0x1<<20) @将「21:20」设置成01
str r1,[r0] @将修改后的数据写回内存中
@设置PE10为推挽输出 GPIOE_OTYPER[10] --0 偏移地址为0x04
ldr r0,=0x50006004 @基地址+偏移量
ldr r1,[r0] @将对应内存地址的内容保存到r1中
bic r1,r1,#(0x1<<10) @将「10」置零
str r1,[r0] @将修改后的数据写回内存中
@设置PE10为低速输出 GPIOE_OSPEEDR[21:20] -- 00 偏移地址为0x08
ldr r0,=0x50006008 @指定基地址及偏移量
ldr r1,[r0] @将内存地址里的内容载入到r1中
bic r1,r1,#(0x3<<20) @将[21:20]位置零
str r1,[r0] @将修改后的数据写回内存中
@设置PE10的上拉下拉电阻 无 GPIOE_PUPDR[21:20]----00 偏移地址为0x0C
ldr r0,=0x5000600C @指定基地址及偏移量
ldr r1,[r0] @将内存地址里的内容载入到r1中
bic r1,r1,#(0x3<<20) @将[21:20]位零
str r1,[r0] @将修改后的值写回内存
@LED2
@GPIOF外设时钟使能 RCC_MP_AHB4ENSETR 0X50000A28 「5」-1
ldr r0,=0X50000A28 @将基地址保存到r0寄存器中
ldr r1,[r0] @将基地址里的内容保存到r1寄存器中
orr r1,r1,#(0x1<<5) @将「5」位置1
str r1,[r0] @将修改后的值写回内存
@设置PF10为输出 GPIO_MODER[21:20] --01 基地址为0x50007000
ldr r0,=0x50007000 @基地址
ldr r1,[r0] @将该地址内的数据保存到r1里
bic r1,r1,#(0x3<<20) @将[21:20]位置0
orr r1,r1,#(0x1<<20) @将「21:20」设置成01
str r1,[r0] @将修改后的数据写回内存中
@设置PF10为推挽输出 GPIOF_OTYPER[10] --0 偏移地址为0x04
ldr r0,=0x50007004 @基地址+偏移量
ldr r1,[r0] @将对应内存地址的内容保存到r1中
bic r1,r1,#(0x1<<10) @将「10」置零
str r1,[r0] @将修改后的数据写回内存中
@设置PF10为低速输出 GPIOF_OSPEEDR[21:20] -- 00 偏移地址为0x08
ldr r0,=0x50007008 @指定基地址及偏移量
ldr r1,[r0] @将内存地址里的内容载入到r1中
bic r1,r1,#(0x3<<20) @将[21:20]位置零
str r1,[r0] @将修改后的数据写回内存中
@设置PF10的上拉下拉电阻 无 GPIOF_PUPDR[21:20]----00 偏移地址为0x0C
ldr r0,=0x5000700C @指定基地址及偏移量
ldr r1,[r0] @将内存地址里的内容载入到r1中
bic r1,r1,#(0x3<<20) @将[21:20]位零
str r1,[r0] @将修改后的值写回内存
@LED3
@GPIOE外设时钟使能 RCC_MP_AHB4ENSETR 0X50000A28 「4」-1
ldr r0,=0X50000A28 @将基地址保存到r0寄存器中
ldr r1,[r0] @将基地址里的内容保存到r1寄存器中
orr r1,r1,#(0x1<<4) @将「4」位置1
str r1,[r0] @将修改后的值写回内存
@设置PE8为输出 GPIO_MODER[17:16] --01 基地址为0x50006000
ldr r0,=0x50006000 @基地址
ldr r1,[r0] @将该地址内的数据保存到r1里
bic r1,r1,#(0x3<<16) @将[17:16]位置0
orr r1,r1,#(0x1<<16) @将「17:16」设置成01
str r1,[r0] @将修改后的数据写回内存中
@设置PE10为推挽输出 GPIOE_OTYPER[8] --0 偏移地址为0x04
ldr r0,=0x50006004 @基地址+偏移量
ldr r1,[r0] @将对应内存地址的内容保存到r1中
bic r1,r1,#(0x1<<8) @将「8」置零
str r1,[r0] @将修改后的数据写回内存中
@设置PE8为低速输出 GPIOE_OSPEEDR[17:16] -- 00 偏移地址为0x08
ldr r0,=0x50006008 @指定基地址及偏移量
ldr r1,[r0] @将内存地址里的内容载入到r1中
bic r1,r1,#(0x3<<16) @将[17:16]位置零
str r1,[r0] @将修改后的数据写回内存中
@设置PE8的上拉下拉电阻 无 GPIOE_PUPDR[17:16]----00 偏移地址为0x0C
ldr r0,=0x5000600C @指定基地址及偏移量
ldr r1,[r0] @将内存地址里的内容载入到r1中
bic r1,r1,#(0x3<<16) @将[17:16]位零
str r1,[r0] @将修改后的值写回内存
loop: @B不让程序结束
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 点灯 GPIOE_ODR[10]-1 0X50006014
@设置PE10的管脚输出高低电平GPIOE_ODR[10]偏移地址为 0x14
led1_on:
ldr r0,=0x50006014
ldr r1,[r0] @将内存地址内的内容保存到r1中
orr r1,r1,#(0x1<<10)
str r1,[r0]
mov pc,lr
@led1 关灯 GPIOE_ODR[10]-0 0X50006014
led1_off:
ldr r0,=0x50006014
ldr r1,[r0] @将内存地址内的内容保存到r1中
bic r1,r1,#(0x1<<10)
str r1,[r0]
mov pc,lr
@led2 点灯 GPIOF_ODR[10]-1 0X50007014
@设置PF10的管脚输出高低电平GPIOF_ODR[10]偏移地址为 0x14
led2_on:
ldr r0,=0x50007014
ldr r1,[r0] @将内存地址内的内容保存到r1中
orr r1,r1,#(0x1<<10)
str r1,[r0]
mov pc,lr
@led2 关灯 GPIOF_ODR[10]-0 0X50007014
led2_off:
ldr r0,=0x50007014
ldr r1,[r0] @将内存地址内的内容保存到r1中
bic r1,r1,#(0x1<<10)
str r1,[r0]
mov pc,lr
@点灯 GPIOE_ODR[8]->1 0x0006014
led3_on:
LDR R0,=0x50006014 @指定基地址
LDR R1,[R0] @将寄存器数据读取出来保存到R1中
ORR R1,R1,#(0x1<<8) @将[8]设置为0
STR R1,[R0] @将修改后的值写回去
mov pc,lr @程序返回
@灭灯 GPIOE_ODR[8]->0 0x0006014
led3_off:
LDR R0,=0x50006014 @指定基地址
LDR R1,[R0] @将寄存器数据读取出来保存到R1中
bic R1,R1,#(0x1<<8) @将[8]设置为0
STR R1,[R0] @将修改后的值写回去
mov pc,lr @程序返回
@延时:
delay:
LDR r3,=0x5000000
MIN:
cmp r3,#0
subne r3,r3,#1
bne MIN
mov pc,lr @程序返回
.end