ARM的学习

点亮流水灯

cpp 复制代码
.text 
.global _start
_start: 
    
    @使能GPIOE的外设时钟   RCC_MP_AHB4ENSETR 0x50000a28   [4]->1
    LDR R0,=0X50000A28  @指定基地址
    LDR R1,[R0]  @将寄存器数据读取出来保存到R1中
    ORR R1,R1,#(0x3<<4)   @[4]设置为1
    ORR R1,R1,#(0x3<<5)   @[5]设置为1
    STR R1,[R0]  @将修改之后的值写回去

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

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

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

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

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

       @设置PF10为推挽输出  GPIOF_OTYPER[10]->0   0X5000F004
    LDR R0,=0X50007004  @指定基地址
    LDR R1,[R0]  @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x1<<10)   @[10]设置为0

    STR R1,[R0]  @将修改之后的值写回去

     @设置PF10低速输出  GPIOF_OSPEEDR[21:20]->00  0X5000F008
    LDR R0,=0X50007008  @指定基地址
    LDR R1,[R0]  @将寄存器数据读取出来保存到R1中
    BIC R1,R1,#(0x3<<20)   @[21:20]设置为0

    STR R1,[R0]  @将修改之后的值写回去

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

LOOP:  @B不让程序结束
    bl LED1_ON
    bl DELAY
    bl LED1_OFF
    bl DELAY
   bl LED2_ON
    bl DELAY
    bl LED1_OFF
    bl DELAY
    bl LED3_ON
    bl DELAY
    bl LED1_OFF
    bl DELAY
    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,=0X50006014  @指定基地址
    LDR R1,[R0]  @将寄存器数据读取出来保存到R1中
    ORR R1,R1,#(0x1<<8)   @[8]设置为0
    STR R1,[R0]  @将修改之后的值写回去
    MOV PC,LR  @程序返回

    @亮灯
LED3_ON:
    LDR R2,=0X50007014  @指定基地址
    LDR R3,[R2]  @将寄存器数据读取出来保存到R3中
    ORR R3,R3,#(0x1<<10)   @[10]设置为0
    STR R3,[R2]  @将修改之后的值写回去
    MOV PC,LR  @程序返回


@灭灯
LED_OFF:
    LDR R0,=0X50006014  @指定基地址
    LDR R1,[R0]  @将寄存器数据读取出来保存到R1中
    LDR R2,=0X50007014  @指定基地址
    LDR R3,[R2]  @将寄存器数据读取出来保存到R3中
    BIC R3,R3,#(0x1<<10)   @[10]设置为0
    BIC R1,R1,#(0x1<<10)   @[10]设置为0
    BIC R1,R1,#(0x1<<8)   @[8]设置为0
    STR R1,[R0]  @将修改之后的值写回去
    STR R3,[R2]  @将修改之后的值写回去
    MOV PC,LR  @程序返回

@延时函数
DELAY:
    LDR R4,=0X10000000
MM:
    CMP R4,#0
    SUBNE R4,R4,#1
    BNE MM
    MOV PC,LR  @程序返回

.end

效果演示

流水灯

相关推荐
Elias不吃糖4 小时前
Java Lambda 表达式
java·开发语言·学习
梨子串桃子_4 小时前
推荐系统学习笔记 | PyTorch学习笔记
pytorch·笔记·python·学习·算法
jjjxxxhhh1235 小时前
spdlog介绍使用
学习
具身智能之心6 小时前
上海交大发布U-Arm:突破成本壁垒,实现超低成本通用机械臂遥操作系统
arm开发·机械臂·具身智能
曾浩轩6 小时前
图灵完备Turing Complete 3
学习
天天睡大觉6 小时前
Python学习11
网络·python·学习
laplace01237 小时前
# 第六章 agent框架开发实践 - 学习笔记
人工智能·笔记·学习·语言模型·agent
坚持不懈的大白7 小时前
Leetcode学习笔记
笔记·学习·leetcode
SWAGGY..8 小时前
数据结构学习篇(10)--- 二叉树基础oj练习
数据结构·学习
QiZhang | UESTC8 小时前
学习日记day58
学习