GPIO实验:ARM汇编代码实现LED灯亮灭控制

本文详细介绍了使用ARM汇编语言实现LED灯亮灭控制的过程,包括Makefile的配置、GPIO设置和控制循环,以及如何通过串口工具加载并运行bin文件到开发板。

GPIO实验:ARM汇编代码实现LED灯亮灭控制

一、 汇编工程模板Makefile分析

NAME=asm-led     #指定编译的源文件名字
CROSS_COMPILE = arm-linux-gnueabihf-   #指定交叉编译工具链前缀

CC = $(CROSS_COMPILE)gcc  #指定gcc名字

LD = $(CROSS_COMPILE)ld  #指定链接器名字
OBJCOPY = $(CROSS_COMPILE)objcopy   #用于将二进制文件编译生成一个bin后缀的二进制文件
OBJDUMP = $(CROSS_COMPILE)objdump #用于生成我们工程的反汇编文件

all:
    #编译生成二进制.o文件
    $(CC) -O0 -g -c $(NAME).S -o $(NAME).o
    #编译生成二进制elf文件
    #-Ttext=0xC0008000用于指定将程序下载到内存的0XC0008000位置
    $(LD) -Ttext=0xC0008000 $(NAME).o -o $(NAME).elf 
    #转换二进制文件为bin后缀文件
    $(OBJCOPY) -O binary $(NAME).elf  $(NAME).bin
#生成可执行文件的反汇编
    $(OBJDUMP) -D $(NAME).elf > $(NAME).dis
clean:#删除编译时生成的一些文件
    rm -rf *.elf *.bin *.o *.dis

install:
    
    sudo cp $(NAME).bin  /mnt/hgfs/share1/

二、 编写LED1亮灭控制的汇编文件

.text 
.global _start
_start: 
	
@1.RCC时钟使能GPIOE   RCC_MP_AHB4ENSETR[4]->1
    @   间接寻址取值
    LDR R0,=0x50000a28
    LDR R1,[R0]
    @   改值
    ORR R1,R1,#(0x1<<4)
    @   写回
    STR R1,[R0]
@2.设置PE10为输出模式  GPIOE_MODER[21:20]->01
    @   间接寻址取值
    LDR R0,=0x50006000
    LDR R1,[R0]
    @   改值
    BIC R1,R1,#(0x3<<20)
    ORR R1,R1,#(0x1<<20)
    @   写回
    STR R1,[R0]

    @   间接寻址取值
    LDR R0,=0x50006000
    LDR R1,[R0]
    @   改值
    BIC R1,R1,#(0x3<<16)
    ORR R1,R1,#(0x1<<16)
    @   写回
    STR R1,[R0]
@3.设置PE10为推挽输出  GPIOE_OTYPER[10]->0
    @   间接寻址取值
    LDR R0,=0x50006004
    LDR R1,[R0]
    @   改值
    BIC R1,R1,#(0x1<<10)
    @   写回
    STR R1,[R0]

    @   间接寻址取值
    LDR R0,=0x50006004
    LDR R1,[R0]
    @   改值
    BIC R1,R1,#(0x1<<8)
    @   写回
    STR R1,[R0]
@4.设置PE10为低速输出  GPIOE_OSPEEDR[21:20]->00
    @   间接寻址取值
    LDR R0,=0x50006008
    LDR R1,[R0]
    @   改值
    BIC R1,R1,#(0x3<<20)
    @   写回
    STR R1,[R0]

    @   间接寻址取值
    LDR R0,=0x50006008
    LDR R1,[R0]
    @   改值
    BIC R1,R1,#(0x3<<16)
    @   写回
    STR R1,[R0]
@5.设置PE10输出无上拉下拉 GPIOE_PUPDR[21:20]->00
    @   间接寻址取值
    LDR R0,=0x5000600c
    LDR R1,[R0]
    @   改值
    BIC R1,R1,#(0x3<<20)
    @   写回
    STR R1,[R0]
    
    @   间接寻址取值
    LDR R0,=0x5000600c
    LDR R1,[R0]
    @   改值
    BIC R1,R1,#(0x3<<16)
    @   写回
    STR R1,[R0]


@1.RCC时钟使能GPIOF   RCC_MP_AHB4ENSETR[5]->1
    @   间接寻址取值
    LDR R0,=0x50000a28
    LDR R1,[R0]
    @   改值
    ORR R1,R1,#(0x1<<5)
    @   写回
    STR R1,[R0]
@2.设置PF10为输出模式  GPIOE_MODER[21:20]->01
    @   间接寻址取值
    LDR R0,=0x50007000
    LDR R1,[R0]
    @   改值
    BIC R1,R1,#(0x3<<20)
    ORR R1,R1,#(0x1<<20)
    @   写回
    STR R1,[R0]
@3.设置PF10为推挽输出  GPIOE_OTYPER[10]->0
    @   间接寻址取值
    LDR R0,=0x50007004
    LDR R1,[R0]
    @   改值
    BIC R1,R1,#(0x1<<10)
    @   写回
    STR R1,[R0]
@4.设置PF10为低速输出  GPIOE_OSPEEDR[21:20]->00
    @   间接寻址取值
    LDR R0,=0x50007008
    LDR R1,[R0]
    @   改值
    BIC R1,R1,#(0x3<<20)
    @   写回
    STR R1,[R0]
@5.设置PF10输出无上拉下拉 GPIOE_PUPDR[21:20]->00
    @   间接寻址取值
    LDR R0,=0x5000700c
    LDR R1,[R0]
    @   改值
    BIC R1,R1,#(0x3<<20)
    @   写回
    STR R1,[R0]


@6.控制PE10管脚输出高低电平  GPIOE_ODR[10]
@   LED1闪烁
LOOP:
    BL LED1_ON
    BL delay
    BL LED1_OFF
    BL delay

    BL LED2_ON
    BL delay
    BL LED2_OFF
    BL delay

    BL LED3_ON
    BL delay
    BL LED3_OFF
    BL delay
    B LOOP

LED1_ON:
    @   间接寻址取值
    LDR R0,=0x50006014
    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)
    @   写回
    STR R1,[R0]
    MOV PC,LR


LED2_ON:
    @   间接寻址取值
    LDR R0,=0x50007014
    LDR R1,[R0]
    @   改值
    ORR R1,R1,#(0x1<<10)
    @   写回
    STR R1,[R0]
    MOV PC,LR

LED2_OFF:
    @   间接寻址取值
    LDR R0,=0x50007014
    LDR R1,[R0]
    @   改值
    BIC R1,R1,#(0x1<<10)
    @   写回
    STR R1,[R0]
    MOV PC,LR

LED3_ON:
    @   间接寻址取值
    LDR R0,=0x50006014
    LDR R1,[R0]
    @   改值
    ORR R1,R1,#(0x1<<8)
    @   写回
    STR R1,[R0]
    MOV PC,LR

LED3_OFF:
    @   间接寻址取值
    LDR R0,=0x50006014
    LDR R1,[R0]
    @   改值
    BIC R1,R1,#(0x1<<8)
    @   写回
    STR R1,[R0]
    MOV PC,LR

@封装汇编的延时函数
delay:
    LDR R1,=0X10000000

mm:
    cmp R1,#0
    SUBNE R1,R1,#1
    BNE mm
    mov pc,lr

.end

三、串口工具加载bin文件步骤

  • 连接开发板之后,打开设备管理器查看设备端口
    在这里插入图片描述
  • 打开串口工具进行连接
    在这里插入图片描述
  • 点击开发板上的复位键,在倒计时结束前按下任意键,然后输入命令: loadb 0xC0008000 回车
    在这里插入图片描述
  • 加载生成的 bin 文件
    在这里插入图片描述
  • 输入命令:go 0xC0008000 回车,执行代码

四、开发板现象

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhk___

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值