ARM Day4

发布于:2024-04-18 ⋅ 阅读:(22) ⋅ 点赞:(0)

汇编实现三个灯的闪烁

.text 
.global _start
_start: 
    
    @使能GPIOE的外设时钟
    LDR R0,=0x50000A28              @指定基地址
    LDR R1,[R0]                                 @将寄存器数据读取出来保存到R1中
    ORR R1,R1, #(0x3<<4)             @[4]设置为1
    STR R1,[R0]                                   @将修改之后的值写回去
 
 
    @设置PE10为输出
    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为输出
    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为输出
    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为推挽输出
    LDR R0,=0x50006004                  @指定基地址
    LDR R1,[R0]                                     @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x1<<10)                @[10]设置为0
    STR R1,[R0]                                     @将修改之后的值写回去
 
      @设置PF10为推挽输出
    LDR R0,=0x50007004                  @指定基地址
    LDR R1,[R0]                                     @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x1<<10)                @[10]设置为0
    STR R1,[R0]                                     @将修改之后的值写回去
 
      @设置PE8为推挽输出
    LDR R0,=0x50006004                  @指定基地址
    LDR R1,[R0]                                     @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x1<<8)                @[8]设置为0
    STR R1,[R0]                                     @将修改之后的值写回去
 
 
 
    @设置PE10低速输出
     LDR R0,=0x50006008                 @指定基地址
    LDR R1,[R0]                                     @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x3<<20)                    @[21:20]设置为0
    STR R1,[R0]                                         @将修改之后的值写回去
 
      @设置PF10低速输出
     LDR R0,=0x50007008                 @指定基地址
    LDR R1,[R0]                                     @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x3<<20)                    @[21:20]设置为0
    STR R1,[R0]                                         @将修改之后的值写回去
 
      @设置PE8低速输出
     LDR R0,=0x50006008                 @指定基地址
    LDR R1,[R0]                                     @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x3<<16)                    @[17:16]设置为0
    STR R1,[R0]                                         @将修改之后的值写回去
 
 
 
    @设置PE10无上拉下拉电阻
    LDR R0,=0x5000600C                      @指定基地址
    LDR R1,[R0]                                         @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x3<<20)                        @[21:20]设置为0
    STR R1,[R0]                                             @将修改之后的值写回去
 
      @设置PF10无上拉下拉电阻
    LDR R0,=0x5000700C                      @指定基地址
    LDR R1,[R0]                                         @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x3<<20)                        @[21:20]设置为0
    STR R1,[R0]                                             @将修改之后的值写回去
 
      @设置PE8无上拉下拉电阻
    LDR R0,=0x5000600C                      @指定基地址
    LDR R1,[R0]                                         @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x3<<16)                        @[17:16]设置为0
    STR R1,[R0]                                             @将修改之后的值写回去
 
 
 
    LOOP:           @B不让程序结束
        bl LED1_ON
        bl LED2_ON
        bl LED3_ON
        bl DELAY
 
        bl LED1_OFF
        bl LED2_OFF
        bl LED3_OFF
        bl DELAY
 
        B LOOP
 
    @亮灯
    LED1_ON:
        @点灯 GPIO_ODR[10]->1
        LDR R0,=0x50006014                      @指定基地址
        LDR R1,[R0]                                         @将寄存器数据读取出来保存到R1中
        ORR R1,R1,#(0x1<<10)                    @[10]设置为0
        STR R1,[R0]                                         @将修改之后的值写回去
        mov PC,LR                                           @程序返回
 
    LED2_ON:
        @点灯 GPIO_ODR[10]->1
        LDR R0,=0x50007014                      @指定基地址
        LDR R1,[R0]                                         @将寄存器数据读取出来保存到R1中
        ORR R1,R1,#(0x1<<10)                    @[10]设置为0
        STR R1,[R0]                                         @将修改之后的值写回去
        mov PC,LR                                           @程序返回
 
    LED3_ON:
        @点灯 GPIO_ODR[10]->1
        LDR R0,=0x50006014                      @指定基地址
        LDR R1,[R0]                                         @将寄存器数据读取出来保存到R1中
        ORR R1,R1,#(0x1<<8)                    @[8]设置为0
        STR R1,[R0]                                         @将修改之后的值写回去
        mov PC,LR                                           @程序返回
 
    @灭灯
    LED1_OFF:
        @灭灯 GPIO_ODR[10]->0
        LDR R0,=0x50006014                      @指定基地址
        LDR R1,[R0]                                         @将寄存器数据读取出来保存到R1中
        BIC R1,R1,#(0x1<<10)                    @[10]设置为0
        STR R1,[R0]                                         @将修改之后的值写回去
        mov PC,LR                                            @程序返回   
 
LED2_OFF:
        @灭灯 GPIO_ODR[10]->0
        LDR R0,=0x50007014                      @指定基地址
        LDR R1,[R0]                                         @将寄存器数据读取出来保存到R1中
        BIC R1,R1,#(0x1<<10)                    @[10]设置为0
        STR R1,[R0]                                         @将修改之后的值写回去
        mov PC,LR                                            @程序返回   
 
LED3_OFF:
        @灭灯 GPIO_ODR[10]->0
        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