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

效果演示

流水灯

相关推荐
玄同7655 小时前
Python Random 模块深度解析:从基础 API 到 AI / 大模型工程化实践
人工智能·笔记·python·学习·算法·语言模型·llm
符哥20085 小时前
C++ 适合初学者的学习笔记整理
c++·笔记·学习
曦月逸霜5 小时前
Python快速入门——学习笔记(持续更新中~)
笔记·python·学习
AI视觉网奇5 小时前
blender 导入fbx 黑色骨骼
学习·算法·ue5·blender
星火开发设计6 小时前
this 指针:指向对象自身的隐含指针
开发语言·数据结构·c++·学习·指针·知识
Gain_chance6 小时前
37-学习笔记尚硅谷数仓搭建-ADS层分析并以各品牌商品下单统计为例
笔记·学习
魔力军6 小时前
Rust学习Day2: 变量与可变性、数据类型和函数和控制流
开发语言·学习·rust
黄大帅@lz6 小时前
openai提示词学习
windows·学习
pop_xiaoli6 小时前
effective-Objective-C 第二章阅读笔记
笔记·学习·ios·objective-c·cocoa
代码游侠6 小时前
复习——Linux设备驱动开发笔记
linux·arm开发·驱动开发·笔记·嵌入式硬件·架构