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

效果演示

流水灯

相关推荐
hans汉斯2 分钟前
力学研究|半主动变刚度吸振器设计及减振机理研究
学习·力学
風清掦26 分钟前
【STM32学习笔记-13】PWR电源控制
笔记·stm32·学习
噜噜噜阿鲁~34 分钟前
python学习笔记 |10.1、面向对象编程-类和实例
笔记·python·学习
kdxiaojie34 分钟前
U-Boot分析【学习笔记】(8)
linux·笔记·学习
solicitous37 分钟前
学习了解充电桩协议OCPP
学习·充电桩
小夏子_riotous1 小时前
Kubernetes学习路径——5. Kubernetes 实战入门:Namespace、Pod、Label、Deployment 与 Service 全解析
学习·贪心算法·kubernetes
沉浸式学习ing1 小时前
播客和视频怎么变成知识库里的笔记?音视频转结构化笔记完整方案
人工智能·笔记·gpt·学习·ai·音视频·notion
沃普天科技2 小时前
USB显示器多屏异显多屏拼接IF8032 IT690 VL171 8801 RTD2556
arm开发·驱动开发·算法·计算机外设·音视频·硬件工程·pcb工艺
知识分享小能手2 小时前
R语言入门学习教程,从入门到精通,R语言数据处理与清洗 (9)
开发语言·学习·r语言
炽烈小老头2 小时前
【 每天学习一点算法 2026/05/14】单词接龙
学习·算法