汇编实现三个灯的闪烁
.text
.global _start
_start:
@使能GPIOE和GPIOF的外设时钟 RCC_MP_AHBENSETR 0X50000a28 [4]->1 RCC_MP_AHBENSETR 0X50000a28 [5]->1
LDR R0,=0X50000A28 @指定基地址
LDR R1,[R0] @寄存器数据读取出来保存到R1中
ORR R1,R1,#(0X3<<4) @[4]和[5]设置为1
str R1,[R0] @将修改之后的值写回去
@设置PE10为输出 GPIOE_MODER [21:20]->01 0x500006000
LDR R0,=0x50006000 @指定基地址
LDR R1,[R0] @将寄存器数据读取出来保存到R1
BIC R1,R1,#(0X3<<20) @[21:20]设置为00
ORR R1,R1,#(0X1<<20) @ [21:20]设置为01
STR R1,[R0] @将修改之后的值写回去
@设置PF10为输出 GPIOE_MODER [21:20]->01 0x500007000
LDR R0,=0x50007000 @指定基地址
LDR R1,[R0] @将寄存器数据读取出来保存到R1
BIC R1,R1,#(0X3<<20) @[21:20]设置为00
ORR R1,R1,#(0X1<<20) @ [21:20]设置为01
STR R1,[R0] @将修改之后的值写回去
@设置PE8为输出 GPIOE_MODER [17:16]->01 0x500006000
LDR R0,=0x50006000 @指定基地址
LDR R1,[R0] @将寄存器数据读取出来保存到R1
BIC R1,R1,#(0X3<<16) @[21:20]设置为00
ORR R1,R1,#(0X1<<16) @ [21:20]设置为01
STR R1,[R0] @将修改之后的值写回去
@设置PE10为推挽输出 GPIOE_OTYPEER [10]->0 0x500006004
LDR R0,=0x50006004 @指定基地址
LDR R1,[R0] @将寄存器数据读取出来保存到R1
BIC R1,R1,#(0X1<<10) @[10]设置为0
STR R1,[R0] @将修改之后的值写回去
@设置PF10为推挽输出 GPIOF_OTYPEER [10]->0 0x500007004
LDR R0,=0x50007004 @指定基地址
LDR R1,[R0] @将寄存器数据读取出来保存到R1
BIC R1,R1,#(0X1<<10) @[10]设置为0
STR R1,[R0] @将修改之后的值写回去
@设置PE8为推挽输出 GPIOE_OTYPEER [10]->0 0x500006004
LDR R0,=0x50006004 @指定基地址
LDR R1,[R0] @将寄存器数据读取出来保存到R1
BIC R1,R1,#(0X1<<8) @[10]设置为0
STR R1,[R0] @将修改之后的值写回去
@设置PE10为低速输出 GPIOE_OSPEEDR [21:20]->0 0x500006008
LDR R0,=0x50006008 @指定基地址
LDR R1,[R0] @将寄存器数据读取出来保存到R1
BIC R1,R1,#(0X3<<20) @[21:20]设置为0
STR R1,[R0] @将修改之后的值写回去
@设置PF10为低速输出 GPIOF_OSPEEDR [21:20]->0 0x500007008
LDR R0,=0x50007008 @指定基地址
LDR R1,[R0] @将寄存器数据读取出来保存到R1
BIC R1,R1,#(0X3<<20) @[21:20]设置为0
STR R1,[R0] @将修改之后的值写回去
@设置PE8为低速输出 GPIOE_OSPEEDR [17:16]->0 0x500006008
LDR R0,=0x50006008 @指定基地址
LDR R1,[R0] @将寄存器数据读取出来保存到R1
BIC R1,R1,#(0X3<<16) @[21:20]设置为0
STR R1,[R0] @将修改之后的值写回去
@设置PE10无上拉下拉电阻 GPIOE_PUPDR
LDR R0,=0x5000600C @指定基地址
LDR R1,[R0] @将寄存器数据读取出来保存到R1
BIC R1,R1,#(0X3<<20) @[21:20]设置为0
STR R1,[R0] @将修改之后的值写回去
@设置PF10无上拉下拉电阻 GPIOF_PUPDR
LDR R0,=0x5000700C @指定基地址
LDR R1,[R0] @将寄存器数据读取出来保存到R1
BIC R1,R1,#(0X3<<20) @[21:20]设置为0
STR R1,[R0] @将修改之后的值写回去
@设置PE8无上拉下拉电阻 GPIOE_PUPDR
LDR R0,=0x5000600C @指定基地址
LDR R1,[R0] @将寄存器数据读取出来保存到R1
BIC R1,R1,#(0X3<<16) @[17:16]设置为0
STR R1,[R0] @将修改之后的值写回去
LOOP: @不让程序结束
bl LED1_ON
bl DELAY
bl LED2_ON
bl DELAY
bl LED3_ON
bl DELAY
bl LED1_OFF
bl DELAY
bl LED2_OFF
bl DELAY
bl LED3_OFF
B LOOP
LED1_ON:
@点灯 GPIOE_ODR[10]->1 0向0006014
LDR R0,=0x50006014 @指定基地址
LDR R1,[R0] @将寄存器数据读取出来保存到R1
ORR R1,R1,#(0X1<<10) @[10]设置为0
STR R1,[R0] @将修改之后的值写回去
MOV PC,LR @程序返回
LED2_ON:
@点灯 GPIOE_ODR[10]->1 0向0006014
LDR R0,=0x50007014 @指定基地址
LDR R1,[R0] @将寄存器数据读取出来保存到R1
ORR R1,R1,#(0X1<<10) @[10]设置为0
STR R1,[R0] @将修改之后的值写回去
MOV PC,LR @程序返回
LED3_ON:
@点灯 GPIOE_ODR[10]->1 0向0006014
LDR R0,=0x50006014 @指定基地址
LDR R1,[R0] @将寄存器数据读取出来保存到R1
ORR R1,R1,#(0X1<<8) @[10]设置为0
STR R1,[R0] @将修改之后的值写回去
MOV PC,LR @程序返回
LED1_OFF:
@灭灯 GPIOE_ODR[10]->1 0向0006014
LDR R0,=0x50006014 @指定基地址
LDR R1,[R0] @将寄存器数据读取出来保存到R1
BIC R1,R1,#(0X1<<10) @[10]设置为0
STR R1,[R0] @将修改之后的值写回去
MOV PC,LR @程序返回
LED2_OFF:
@灭灯 GPIOE_ODR[10]->1 0向0006014
LDR R0,=0x50007014 @指定基地址
LDR R1,[R0] @将寄存器数据读取出来保存到R1
BIC R1,R1,#(0X1<<10) @[10]设置为0
STR R1,[R0] @将修改之后的值写回去
MOV PC,LR @程序返回
LED3_OFF:
@灭灯 GPIOE_ODR[10]->1 0向0006014
LDR R0,=0x50006014 @指定基地址
LDR R1,[R0] @将寄存器数据读取出来保存到R1
BIC R1,R1,#(0X1<<8) @[8]设置为0
STR R1,[R0] @将修改之后的值写回去
MOV PC,LR @程序返回
DELAY:
LDR R3,=0x10000000
MM:
CMP R3,#0
SUBNE R3,R3,#1
BNE MM
MOV PC,LR @程序返回
.end