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

效果演示

流水灯

相关推荐
大龄程序员狗哥2 小时前
第25篇:Q-Learning算法解析——强化学习中的经典“价值”学习(原理解析)
人工智能·学习·算法
南境十里·墨染春水3 小时前
linux学习进展 线程同步——互斥锁
java·linux·学习
nashane4 小时前
HarmonyOS 6学习:旋转动画优化与长截图性能调优——打造丝滑交互体验的深度实践
学习·交互·harmonyos·harmonyos 5
华清远见IT开放实验室4 小时前
智能手表完整项目实现,比赛求职双向加分,基于嵌入式大赛推荐开发板(STM32U5)
stm32·单片机·嵌入式硬件·学习·智能手表·嵌入式大赛
炽烈小老头4 小时前
【 每天学习一点算法 2026/04/22】四数相加 II
学习·算法
uncle_ll5 小时前
LangChain基础学习笔记
笔记·学习·langchain·llm·rag
三品吉他手会点灯5 小时前
C语言学习笔记 - 14.C编程预备计算机专业知识 - 本讲内容概述
c语言·笔记·学习
Thanwind5 小时前
从0开始的机器学习之旅(二):监督学习,从线性回归说起
学习·机器学习·线性回归
2501_942326445 小时前
易速乐考,轻松备考
学习·教育电商
菜鸟‍5 小时前
【CVPR 2026】LitePT:更轻、更强的点云 Transformer【论文学习】
深度学习·学习·transformer