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

效果演示

流水灯

相关推荐
外收内放8 分钟前
数据分析(数据排序)
python·学习·数据分析
AI小云19 分钟前
零基础如何系统学习AI?2026年技术路径与培训选择深度分析
人工智能·学习
我命由我1234520 分钟前
准入类与水平类职业资格
笔记·学习·职场和发展·产品运营·求职招聘·职场发展·产品经理
女神下凡21 分钟前
芯参谋(49):eMCP_软件设计规范
arm开发·嵌入式硬件·设计规范
ly_Enhs1 小时前
从无光照到 PBR:我的环境光照学习记录
学习·vulkan图形渲染c/c++
小李不想当小白1 小时前
USART串口数据包(STM32标准库学习笔记)
经验分享·笔记·stm32·单片机·嵌入式硬件·学习
xier_ran1 小时前
【infra之路】AI 编译器学习笔记(八):向量化——把小块变成 SIMD 指令
人工智能·笔记·学习
kmomo..1 小时前
Linux 驱动开发学习笔记:I2C 子系统从入门到实践
linux·驱动开发·学习
zhangdaliangmvp2 小时前
四元数的学习理解
学习
遇印记12 小时前
传输层,网络层
运维·服务器·网络·windows·学习