一、编写汇编程序,实现控制外设三个LED灯闪烁
代码:
.text
.global _start
_start:
@要使三个灯闪烁 需要设置三个灯的管脚输出高电平
@对应到STM32MP157AAA的PE10、PF10、PE8
@使能GPIOE、GPIOF的外设时钟 它们对应的总线均为AHB4
@GPIOE在[4]位 GPIOF在[5]位
LDR r0,=0x50000A28 @保存RCC寄存器基地址
LDR r1,[R0] @将寄存器数据读取出来保存到r1
ORR R1,R1,#(0x1<<4) @[5,4]设置为1
ORR R1,R1,#(0x1<<5) @[5,4]设置为1
str r1,[r0] @将修改后的值写回原寄存器
@设置PE10 PE8为输出模式
ldr r0,=0x50006000 @指定PGIOE_MODER基地址
ldr r1,[r0]
bic r1,r1,#(0x3<<20) @先置零 后设置1
BIC R1,R1,#(0x3<<16) @先置零 后设置1
orr r1,r1,#(0x1<<20) @GPIOE_MODEER第[21,20]位要设置为01
ORR R1,R1,#(0X1<<16)
str r1,[r0] @管脚设置为输出模式
@设置PF10为输出
ldr r0,=0x50007000 @指定PGIOF_MODER基地址
ldr r1,[r0]
bic r1,r1,#(0x3<<20) @先置零 后设置1
orr r1,r1,#(0x1<<20) @GPIOF_MODEER第[21,20]位要设置为01
str r1,[r0] @管脚为输出模式
@设置PE10 PE8为推挽输出
ldr r0,=0x50006004 @指定基地址
ldr r1,[r0]
bic r1,r1,#(0x1<<10) @[10]设置0
bic r1,r1,#(0x1<<8) @[8]设置0
str r1,[r0]
@设置PF10为推挽输出
ldr r0,=0x50007004 @指定基地址
ldr r1,[r0]
bic r1,r1,#(0x1<<10) @[10]设置0
str r1,[r0]
@设置PE10 PE8低速输出
ldr r0,=0x50006008 @指定基地址
ldr r1,[r0]
bic r1,r1,#(0x3<<20) @[21:20]设置0
bic r1,r1,#(0x3<<16) @[17:16]设置0
str r1,[r0]
@设置PF10低速输出
ldr r0,=0x50007008 @指定基地址
ldr r1,[r0]
bic r1,r1,#(0x3<<20) @[21:20]设置0
str r1,[r0]
@设置PE10 PE8无上拉下拉电阻
ldr r0,=0x5000600c @指定基地址
ldr r1,[r0]
bic r1,r1,#(0x3<<20) @[21:20]设置0
bic r1,r1,#(0x3<<16) @[17:16]设置0
str r1,[r0]
@设置PF10无上拉下拉电阻
ldr r0,=0x5000700C @指定基地址
ldr r1,[r0]
bic r1,r1,#(0x3<<20) @[21:20]设置0
str r1,[r0]
LOOP: @不让程序结束
BL LED1_ON
BL DELAY
bl LED1_OFF
bl DELAY
B LOOP
LED1_ON:
@点灯PE10 PE8
ldr r0,=0x50006014
ldr r1,[r0]
orr r1,r1,#(0x1<<10)
ORR R1,R1,#(0X1<<8)
str r1,[r0]
@点灯PF10
LDR R0,=0X50007014
LDR R1,[R0]
ORR R1,R1,#(0X1<<10)
str r1,[r0]
mov pc,lr
LED1_OFF:
@灭灯
LDR R0,=0X50006014
ldr r1,[r0]
BIC r1,r1,#(0x1<<10)
BIC R1,R1,#(0X1<<8)
str r1,[r0]
LDR R0,=0X50007014
LDR R1,[R0]
BIC R1,R1,#(0X1<<10)
STR R1,[R0]
mov pc,lr
DELAY: @延时函数
LDR R3,=0X10000000
MM:
CMP R3,#0
SUBNE R3,R3,#1
Bne MM
MOV PC,LR
.end