60、ARM/汇编实现控制外设

一、编写汇编程序,实现控制外设三个LED灯闪烁

代码:

复制代码
.text 
.global _start
_start: 
        @要使三个灯闪烁 需要设置三个灯的管脚输出高电平
        @对应到STM32MP157AAA的PE10、PF10、PE8

        @使能GPIOE、GPIOF的外设时钟 它们对应的总线均为AHB4
        @GPIOE在[4]位  GPIOF在[5]位
        LDR r0,=0x50000A28  @保存RCC寄存器基地址
        LDR r1,[R0]  @将寄存器数据读取出来保存到r1
        ORR R1,R1,#(0x1<<4)   @[5,4]设置为1
        ORR R1,R1,#(0x1<<5)   @[5,4]设置为1
        str  r1,[r0]    @将修改后的值写回原寄存器

        @设置PE10 PE8为输出模式 
        ldr r0,=0x50006000   @指定PGIOE_MODER基地址
        ldr r1,[r0]
        bic r1,r1,#(0x3<<20)   @先置零 后设置1
        BIC R1,R1,#(0x3<<16) @先置零 后设置1
        orr r1,r1,#(0x1<<20)   @GPIOE_MODEER第[21,20]位要设置为01
        ORR R1,R1,#(0X1<<16)
        str r1,[r0]    @管脚设置为输出模式
        @设置PF10为输出
        ldr r0,=0x50007000   @指定PGIOF_MODER基地址
        ldr r1,[r0]
        bic r1,r1,#(0x3<<20)   @先置零 后设置1
        orr r1,r1,#(0x1<<20)   @GPIOF_MODEER第[21,20]位要设置为01
        str r1,[r0]    @管脚为输出模式      
  
        @设置PE10 PE8为推挽输出
        ldr r0,=0x50006004   @指定基地址
        ldr r1,[r0]
        bic r1,r1,#(0x1<<10)   @[10]设置0
        bic r1,r1,#(0x1<<8)      @[8]设置0
        str r1,[r0]
        @设置PF10为推挽输出
        ldr r0,=0x50007004   @指定基地址
        ldr r1,[r0]
        bic r1,r1,#(0x1<<10)   @[10]设置0
        str r1,[r0]

        @设置PE10 PE8低速输出
        ldr r0,=0x50006008   @指定基地址
        ldr r1,[r0]
        bic r1,r1,#(0x3<<20)   @[21:20]设置0
        bic r1,r1,#(0x3<<16)   @[17:16]设置0
        str r1,[r0]
        @设置PF10低速输出
        ldr r0,=0x50007008   @指定基地址
        ldr r1,[r0]
        bic r1,r1,#(0x3<<20)   @[21:20]设置0
        str r1,[r0]            

        @设置PE10 PE8无上拉下拉电阻
        ldr r0,=0x5000600c   @指定基地址
        ldr r1,[r0]
        bic r1,r1,#(0x3<<20)   @[21:20]设置0
        bic r1,r1,#(0x3<<16)   @[17:16]设置0        
        str r1,[r0]
        @设置PF10无上拉下拉电阻
        ldr r0,=0x5000700C   @指定基地址
        ldr r1,[r0]
        bic r1,r1,#(0x3<<20)   @[21:20]设置0
        str r1,[r0]         

LOOP:  @不让程序结束
        BL  LED1_ON
        BL DELAY
        bl LED1_OFF
        bl DELAY
        B LOOP

LED1_ON:
        @点灯PE10 PE8
        ldr r0,=0x50006014 
        ldr r1,[r0]
        orr r1,r1,#(0x1<<10)
        ORR R1,R1,#(0X1<<8)
        str r1,[r0]
        @点灯PF10
        LDR R0,=0X50007014
        LDR R1,[R0]
        ORR R1,R1,#(0X1<<10)
        str r1,[r0]
        mov pc,lr

LED1_OFF:
        @灭灯
        LDR R0,=0X50006014
        ldr r1,[r0]
        BIC r1,r1,#(0x1<<10)
       BIC R1,R1,#(0X1<<8)
        str r1,[r0]
        LDR R0,=0X50007014
        LDR R1,[R0]
        BIC R1,R1,#(0X1<<10)
        STR R1,[R0]
        mov pc,lr


DELAY:  @延时函数
        LDR R3,=0X10000000
MM:
        CMP R3,#0
        SUBNE R3,R3,#1
        Bne MM
        MOV PC,LR

.end
相关推荐
松涛和鸣15 小时前
72、IMX6ULL驱动实战:设备树(DTS/DTB)+ GPIO子系统+Platform总线
linux·服务器·arm开发·数据库·单片机
陌上花开缓缓归以18 小时前
linux mtd-utils使用源码分析(ubuntu测试版)
linux·arm开发·ubuntu
我送炭你添花21 小时前
电子世界的奇妙冒险:从一个电阻开始(系列目录)
人工智能·单片机·嵌入式硬件·fpga开发
VekiSon21 小时前
Linux内核驱动——设备树原理与应用
linux·c语言·arm开发·嵌入式硬件
知识充实人生1 天前
FPGA设计杂谈之九:HRIO/HPIO/HDIO
fpga开发·xilinx·hr i/o·hp i/o·hd i/o·io类型
代码游侠1 天前
复习——Linux设备驱动开发笔记
linux·arm开发·驱动开发·笔记·嵌入式硬件·架构
maverick_1111 天前
【FPGA】 在Verilog中,! 和 ~ 的区别
fpga开发
万法若空2 天前
8086/8088实模式的内存布局
汇编
陌上花开缓缓归以2 天前
LiteOS和RTOS 系统选型分析
arm开发
深圳市九鼎创展科技2 天前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算