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

news2024/11/25 10:04:33

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 回车,执行代码

四、开发板现象

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1193612.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络第一章(计算机网络开篇)

目录 一.什么是计算机网络1.0 何为计算机网络1.1 什么是Internet?1.2 互联网与互连网1.3 互联网基础结构发展的三个阶段 二.什么是网络协议2.1 协议的三要素2.2 internet协议标准 三. 互联网的组成3.1 边缘部分3.11 端系统之间的通信 3.2 核心部分3.21 数据交换技术 四. 计算机…

2023双十一:实体门店闯入,第二战场全面开战

“闺女&#xff0c;吃饺子了吗&#xff1f;”11月8日&#xff0c;立冬&#xff0c;忙碌一天的陈曦回家路上接到母亲电话&#xff0c;才想起来家里冷冻水饺没了&#xff0c;又不想再去超市&#xff0c;直接打开美团买菜买了两袋&#xff0c;回家就煮了吃。当然&#xff0c;最终她…

【GIT】Git中的Gui介绍,使用Git中的ssh协议介绍,使用使用idea集成Git

目录 一&#xff0c;Git中的Gui介绍&#xff0c;使用 二&#xff0c;Git中的ssh介绍&#xff0c;使用 三&#xff0c;使用idea集成Git 一&#xff0c;Git中的Gui介绍&#xff0c;使用 1.1什么是Gui&#xff1f; 图形化管理工具是一种通过可视化界面来操作计算机系统或应用程…

管理员模式运行cmd或则bat文件的时候,出现路径错误的问题

最近在使用Comfyui, 不清楚啥原因&#xff0c;有时候Git无法访问&#xff0c;有时候文件夹无法访问的。就想把它的运行bat命令直接用 管理员模式运行&#xff0c;给到最高的权限&#xff0c;试试。但就这么简单的问题&#xff0c;搜了半天&#xff0c;都是一大堆不靠谱的教程&a…

统信UOS Linux操作系统下怎么删除某个程序在开始菜单或桌面的快捷方式

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 引言 统信操作系统的开始菜单包罗万象&#xff0c;将所有应用的快捷方式都放在了开始菜单内。 虽然提供了分类展示的能力&#xff0c;但无论是分类方式还是未分类方式&#xff0c;都不能像windows一样将这…

《剪映短视频剪辑从入门到精通》:最好别跟我说你精通剪映短视频剪辑

《剪映短视频剪辑从入门到精通》&#xff1a;最好别跟我说你精通剪映短视频剪辑 毫无疑问&#xff0c;如今短视频已经彻底冲入了所有大众的视野&#xff0c;已经成为了我们生活中不可或缺的一部分。本文将从一个全新的视角&#xff0c;重新带领大家学习剪映短视频剪辑&#xff…

论文速览 | arxiv 2023, 马氏距离感知训练在分布外检测中的应用

注1:本文系“最新论文速览”系列之一,致力于简洁清晰地介绍、解读最新的顶会/顶刊论文。 OOD论文速览 | arxiv 2023, Mahalanobis-Aware Training for Out-of-Distribution Detection 该论文旨在提出一种改进的深度学习模型训练方法,以提高对分布外(OOD)样本的检测能力。…

商业计划书PPT怎么做?这个AI软件一键在线生成,做PPT再也不求人!

商业计划书是一份重要的书面文件&#xff0c;它通常被用作商业估值、筹资和进一步扩大业务的基础。一个好的商业计划书能够让团队向投资者、潜在客户和业务合作伙伴展示其企业的价值&#xff0c;并且清楚地阐述企业的产品或服务能够如何满足市场需求。作为商业计划书的重要组成…

职场必备技能-BI数据可视化,后悔没早学

数据分析能力的上限会影响到一个人职业生涯的上限&#xff0c;由此可见数据分析能力在职场技能中的重要性。而数据可视化则是将数据分析结果快速传递给职场人&#xff0c;让职场人足以利用这些信息去运营决策&#xff0c;提供业务水平、提高业绩。这么重要的职场必备技能&#…

多级缓存之实现多级缓存

多级缓存的实现离不开Nginx编程&#xff0c;而Nginx编程又离不开OpenResty。 1. OpenResty快速入门 我们希望达到的多级缓存架构如图&#xff1a; 其中&#xff1a; windows上的nginx用来做反向代理服务&#xff0c;将前端的查询商品的ajax请求代理到OpenResty集群 OpenRest…

操作系统·处理机调度死锁

3.1 处理机调度概述 3.1.1 处理机调度概述 高级调度 (High level Scheduling)决定把外存上哪些作业调入内存、创建进程、分配资源。高级调度又称作业调度、长程调度或宏观调度。只在批处理系统中有高级调度。 中级调度 (Middle level Scheduling)完成进程的部分或全部在内、…

华为ssl vpn配置案例

t先在命令行输入命令 v-gateway sslvpn interface GigabitEthernet1/0/2 private 打开在命令行建立的sslvpn名称 直接开网络权限最大的模式&#xff1a;网络扩展 建立用户完成后点击上面的应用&#xff1a; 用命令行加策略&#xff1a; security-policy default action p…

【Docker】Docker 网络

引言 Docker是一个开源的应用容器引擎&#xff0c;它允许开发者将应用及其依赖打包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux机器或Windows机器上&#xff0c;也可以实现虚拟化。Docker的主要优势之一是其网络功能&#xff0c;而网络功能的核心就是网络驱动…

【Mysql】联表查询

目录 表&#xff1a; 思路&#xff1a; inner join right join left join ​编辑 表&#xff1a; student表 class表 思路&#xff1a; 1.分析查找的字段来自哪些表 2.确定使用哪种连接查询 3.确定交叉点 比如student表的name与class表的name是相等的 inner join …

面试字节、美团、阿里等公司后,才知道软件测试面试题就这些...

一、Linux系统应用和环境配置 1、Linux系统的操作命令给我说10个&#xff0c;一般用什么工具远程连接Linux服务器&#xff1f; 2、Linux中的日志存储在哪里&#xff1f;怎么查看日志内容&#xff1f; 3、Linux中top和ps命令的区别&#xff1f; 4、Linux命令运行的结果如何写…

MIPI配置的OV5640的使用

MIPI摄像头的数据输入FPGA的数据流&#xff1a; N Lane 差分串行输入 ————串转并模块 ————字节对齐处理 ————Lane同步处理处理 ————逆转LLP:Unpacked 处理 ————Byte转Pixel处理 此后写入Wfifo并且存入DDR3。

大数据毕业设计选题推荐-智慧消防大数据平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

教你遇到vcomp120.dll无法继续执行代码的解决方法

分享关于vcomp120.dll丢失的4个修复方法。在此之前&#xff0c;我想先简要介绍一下vcomp120.dll的作用以及它是什么。 首先&#xff0c;让我们来了解一下vcomp120.dll的作用。vcomp120.dll是一个动态链接库文件&#xff0c;它是由Microsoft Visual C 2012 Redistributable Pac…

论文阅读[121]使用CAE+XGBoost从荧光光谱中检测和识别饮用水中的有机污染物

【论文基本信息】 标题&#xff1a;Detection and Identification of Organic Pollutants in Drinking Water from Fluorescence Spectra Based on Deep Learning Using Convolutional Autoencoder 标题译名&#xff1a;基于使用卷积自动编码器的深度学习&#xff0c;从荧光光谱…