0628_ARM4

发布于:2024-07-02 ⋅ 阅读:(152) ⋅ 点赞:(0)

练习:

stm32流水灯

.text 
.global _start
_start: 

@使能GPIOE外设时钟   0X50000A28     RCC_MP_AHB4ENSETR[4]->1
LDR R0,=0x50000a28   @指定操作的内存地址
LDR R1,[R0]  @将R0对应的地址空间中的值读取出来
ORR R1,R1,#(0x3<<4)   @将第4,5位设置为1
STR R1,[R0]  @将修改后的数值写回去


@设置PE10为输出   0X50006000 [21:20]->01
LDR R0,=0x50006000   @指定操作的内存地址
LDR R1,[R0]  @将R0对应的地址空间中的值读取出来
BIC R1,R1,#(0x3<<20)   @先清零
ORR R1,R1,#(0x1<<20)   @再置位
STR R1,[R0]  @将修改后的数值写回去

@设置PE8为输出   0X50006000 [17:16]->01
LDR R0,=0x50006000   @指定操作的内存地址
LDR R1,[R0]  @将R0对应的地址空间中的值读取出来
BIC R1,R1,#(0x3<<16)   @先清零
ORR R1,R1,#(0x1<<16)   @再置位
STR R1,[R0]  @将修改后的数值写回去

@设置PF10为输出   0X50007000 [21:20]->01
LDR R0,=0x50007000   @指定操作的内存地址
LDR R1,[R0]  @将R0对应的地址空间中的值读取出来
BIC R1,R1,#(0x3<<20)   @先清零
ORR R1,R1,#(0x1<<20)   @再置位
STR R1,[R0]  @将修改后的数值写回去


@设置PE10为推挽输出  0X50006004  [10]->0
LDR R0,=0x50006004   @指定操作的内存地址
LDR R1,[R0]  @将R0对应的地址空间中的值读取出来
BIC R1,R1,#(0x1<<10)   @将第10位设置为0
STR R1,[R0]  @将修改后的数值写回去

@设置PE8为推挽输出  0X50006004  [8]->0
LDR R0,=0x50006004   @指定操作的内存地址
LDR R1,[R0]  @将R0对应的地址空间中的值读取出来
BIC R1,R1,#(0x1<<8)   @将第10位设置为0
STR R1,[R0]  @将修改后的数值写回去

@设置PF10为推挽输出  0X50007004  [10]->0
LDR R0,=0x50007004   @指定操作的内存地址
LDR R1,[R0]  @将R0对应的地址空间中的值读取出来
BIC R1,R1,#(0x1<<10)   @将第10位设置为0
STR R1,[R0]  @将修改后的数值写回去

@设置PE10低速输出  0X50006008   [21:20]->00
LDR R0,=0x50006008   @指定操作的内存地址
LDR R1,[R0]  @将R0对应的地址空间中的值读取出来
BIC R1,R1,#(0x3<<20)   @清零
STR R1,[R0]  @将修改后的数值写回去

@设置PE8低速输出  0X50006008   [17:16]->00
LDR R0,=0x50006008   @指定操作的内存地址
LDR R1,[R0]  @将R0对应的地址空间中的值读取出来
BIC R1,R1,#(0x3<<16)   @清零
STR R1,[R0]  @将修改后的数值写回去

@设置PF10低速输出  0X50007008   [21:20]->00
LDR R0,=0x50007008   @指定操作的内存地址
LDR R1,[R0]  @将R0对应的地址空间中的值读取出来
BIC R1,R1,#(0x3<<20)   @清零
STR R1,[R0]  @将修改后的数值写回去

@设置PE10无上啦下拉电阻  0X5000600C  [21:20]->00
LDR R0,=0x5000600C   @指定操作的内存地址
LDR R1,[R0]  @将R0对应的地址空间中的值读取出来
BIC R1,R1,#(0x3<<20)   @清零
STR R1,[R0]  @将修改后的数值写回去

@设置PE8无上啦下拉电阻  0X5000600C  [17:16]->00
LDR R0,=0x5000600C   @指定操作的内存地址
LDR R1,[R0]  @将R0对应的地址空间中的值读取出来
BIC R1,R1,#(0x3<<16)   @清零
STR R1,[R0]  @将修改后的数值写回去

@设置PF10无上啦下拉电阻  0X5000700C  [21:20]->00
LDR R0,=0x5000700C   @指定操作的内存地址
LDR R1,[R0]  @将R0对应的地址空间中的值读取出来
BIC R1,R1,#(0x3<<20)   @清零
STR R1,[R0]  @将修改后的数值写回去

WH:
    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 WH

LED1_ON:
    @设置PE10输出高电平  0X50006014  [10]->1
    LDR R0,=0x50006014   @指定操作的内存地址
    LDR R1,[R0]  @将R0对应的地址空间中的值读取出来
    ORR R1,R1,#(0x1<<10)   @写1
    STR R1,[R0]  @将修改后的数值写回去
    MOV PC,LR

LED2_ON:
    @设置PF10输出高电平  0X50007014  [10]->1
    LDR R0,=0x50007014   @指定操作的内存地址
    LDR R1,[R0]  @将R0对应的地址空间中的值读取出来
    ORR R1,R1,#(0x1<<10)   @写1
    STR R1,[R0]  @将修改后的数值写回去
    MOV PC,LR

LED3_ON:
    @设置PE8输出高电平  0X50006014  [8]->1
    LDR R0,=0x50006014   @指定操作的内存地址
    LDR R1,[R0]  @将R0对应的地址空间中的值读取出来
    ORR R1,R1,#(0x1<<8)   @写1
    STR R1,[R0]  @将修改后的数值写回去
    MOV PC,LR

LED1_OFF:
    @设置PE10输出高电平  0X50006014  [10]->1
    LDR R0,=0x50006014   @指定操作的内存地址
    LDR R1,[R0]  @将R0对应的地址空间中的值读取出来
    BIC R1,R1,#(0x1<<10)   @清0
    STR R1,[R0]  @将修改后的数值写回去
    MOV PC,LR

LED2_OFF:
    @设置PF10输出高电平  0X50007014  [10]->1
    LDR R0,=0x50007014   @指定操作的内存地址
    LDR R1,[R0]  @将R0对应的地址空间中的值读取出来
    BIC R1,R1,#(0x1<<10)   @清0
    STR R1,[R0]  @将修改后的数值写回去
    MOV PC,LR

LED3_OFF:
    @设置PE8输出高电平  0X50006014  [8]->1
    LDR R0,=0x50006014   @指定操作的内存地址
    LDR R1,[R0]  @将R0对应的地址空间中的值读取出来
    BIC R1,R1,#(0x1<<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


网站公告

今日签到

点亮在社区的每一天
去签到