ARM体系:汇编实现三个灯的闪烁

程序代码:

.text 
.global _start
_start: 
@LED1
	@GPIOE的外设时钟   RCC_MP_AHB4ENSETR 0x50000a28   [4]->1
    LDR R0 , =0x50000A28 @指定基地址
    LDR R1,[R0] @将寄存器数据读取出来保存到R1
    ORR R1,R1,#(0x1<<4) @[4]设置为1
    STR R1,[R0] @将修改后的值写回去

    @设置PE10为输出 GPIO_MODER[21:20]->01   0x500600
    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]    @将修改后的值写回去

    @设置PE10为推挽输出   GPIOE_OTYPER[10]->0   0x5006004
    LDR R0,=0x50006004   @指定基地址
    LDR R1,[R0]    @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x1<<10)   @[10]设置为0
    STR R1,[R0]       @将修改后的值写回去

    @设置PE10低速输出    GPIO_OSPEEDR[21:20]->00   0x5006008
    LDR R0,=0x50006008   @指定基地址
    LDR R1,[R0]    @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x3<<20)   @[21:20]设置为0
    STR R1,[R0]       @将修改后的值写回去

     @设置PE10无上拉下拉电阻  GPIOx_PUPDR[21:20]->00   0x5006008
    LDR R0,=0x5000600c   @指定基地址
    LDR R1,[R0]    @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x3<<20)   @[21:20]设置为0
    STR R1,[R0]       @将修改后的值写回去
@LED2
    @GPIOE的外设时钟   RCC_MP_AHB4ENSETR 0x50000a28   [5]->1
    LDR R0 , =0x50000A28 @指定基地址
    LDR R1,[R0] @将寄存器数据读取出来保存到R1
    ORR R1,R1,#(0x1<<5) @[5]设置为1
    STR R1,[R0] @将修改后的值写回去

    @设置PE10为输出 GPIO_MODER[21:20]->01   0x500600
    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]    @将修改后的值写回去

    @设置PE10为推挽输出   GPIOE_OTYPER[10]->0   0x5006004
    LDR R0,=0x50007004   @指定基地址
    LDR R1,[R0]    @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x1<<10)   @[10]设置为0
    STR R1,[R0]       @将修改后的值写回去

    @设置PE10低速输出    GPIO_OSPEEDR[21:20]->00   0x5006008
    LDR R0,=0x50007008   @指定基地址
    LDR R1,[R0]    @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x3<<20)   @[21:20]设置为0
    STR R1,[R0]       @将修改后的值写回去

     @设置PE10无上拉下拉电阻  GPIOx_PUPDR[21:20]->00   0x5006008
    LDR R0,=0x5000700c   @指定基地址
    LDR R1,[R0]    @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x3<<20)   @[21:20]设置为0
    STR R1,[R0]       @将修改后的值写回去

@LED3
	@GPIOE的外设时钟   RCC_MP_AHB4ENSETR 0x50000a28   [4]->1
    LDR R0 , =0x50000A28 @指定基地址
    LDR R1,[R0] @将寄存器数据读取出来保存到R1
    ORR R1,R1,#(0x1<<4) @[4]设置为1
    STR R1,[R0] @将修改后的值写回去

    @设置PE10为输出 GPIO_MODER[17:16]->01   0x500600
    LDR R0,=0x50006000  @指定基地址
    LDR R1,[R0]   @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x3<<16)  @将[17:16]设置为00
    ORR R1,R1,#(0x1<<16)  @[17:16]设置为01
    STR R1,[R0]    @将修改后的值写回去

    @设置PE10为推挽输出   GPIOE_OTYPER[8]->0   0x5006004
    LDR R0,=0x50006004   @指定基地址
    LDR R1,[R0]    @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x1<<8)   @[8]设置为0
    STR R1,[R0]       @将修改后的值写回去

    @设置PE10低速输出    GPIO_OSPEEDR[17:16]->00   0x5006008
    LDR R0,=0x50006008   @指定基地址
    LDR R1,[R0]    @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x3<<20)   @[17:16]设置为0
    STR R1,[R0]       @将修改后的值写回去

     @设置PE10无上拉下拉电阻  GPIOx_PUPDR[17:16]->00   0x5006008
    LDR R0,=0x5000600c   @指定基地址
    LDR R1,[R0]    @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x3<<16)   @[17:16]设置为0
    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

@点灯    GPIOE_ODR[10]->1    0x0006014
LED1_ON:
    LDR R0,=0x50006014   @指定基地址
    LDR R1,[R0]   @将寄存器数据读取出来保存到R1中
    ORR R1,R1,#(0x1<<10)  @将[10]设置为0
    STR R1,[R0]   @将修改后的值写回去
    mov pc,lr  @程序返回

@灭灯    GPIOE_ODR[10]->0    0x0006014
LED1_OFF:
    LDR R0,=0x50006014   @指定基地址
    LDR R1,[R0]   @将寄存器数据读取出来保存到R1中
    bic R1,R1,#(0x1<<10)  @将[10]设置为0
    STR R1,[R0]   @将修改后的值写回去
    mov pc,lr  @程序返回

@点灯    GPIOE_ODR[10]->1    0x0006014
LED2_ON:
    LDR R0,=0x50007014   @指定基地址
    LDR R1,[R0]   @将寄存器数据读取出来保存到R1中
    ORR R1,R1,#(0x1<<10)  @将[10]设置为0
    STR R1,[R0]   @将修改后的值写回去
    mov pc,lr  @程序返回

@灭灯    GPIOE_ODR[10]->0    0x0006014
LED2_OFF:
    LDR R0,=0x50007014   @指定基地址
    LDR R1,[R0]   @将寄存器数据读取出来保存到R1中
    bic R1,R1,#(0x1<<10)  @将[10]设置为0
    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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值