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

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

四、开发板现象

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“第六十五天”

固态硬盘&#xff1a;SSD 原理&#xff1a;基于闪存技术Flash Memory &#xff0c;属于电可擦除ROM&#xff0c;即EEPROM&#xff1b; 由闪存翻译层和存储介质组成&#xff1b;闪存翻译层负责翻译逻辑块号&#xff0c;找到对应页&#xff0c;存储介质是由多个闪存芯片构成的&…

Pycharm常用快捷键和替换正则表达式

原生快捷键的使用&#xff1a; 1.CtrlF&#xff1a;查找 2.CtrlZ&#xff1a;返回上一步 3.Alt 鼠标左键选择&#xff1a;多行同时编辑&#xff08;上、下、左、右键能够移动光标&#xff09; 按住Ctrl,左键点击&#xff0c;定位光标 编辑过程 URL常用的替换正则表达式&am…

阿里云99元的主机到底怎么样?

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 在云栖大会上&#xff0c;阿里云推出了一款绝对超级超值的99元云服务器&#xff0c;并号称是11月销量王。什么?云栖大会11月2号结束的&#xff0c;你就号称11月销量王&#xff0c;这是未卜先知啊。…

【算法 | 数论 No.1】AcWing1246. 等差数列

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【AcWing算法提高学习专栏】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&a…

【异常----finally和自定义异常】

文章目录 finally练习问题 异常的处理流程【异常处理流程总结】自定义异常类 finally 有些特定的代码&#xff0c;不论程序是否发生异常&#xff0c;都需要执行&#xff0c;比如程序中打开的资源&#xff1a;在程序正常或者异常退出时&#xff0c;必须要对资源进进行回收。另外…

2023.11.10联测总结

T 1 T1 T1求的是有多少个区间的异或和是 k k k的因子&#xff0c; n , k ≤ 1 0 5 n,k \leq 10^5 n,k≤105。 这道题用前缀和维护一下&#xff0c;暴力枚举所有区间就有 80 80 80分。 有一瞬间想过枚举因数&#xff0c;但是脑抽以为要 O ( n ) \mathcal O(n) O(n)枚举&#x…

计算机技术专业CSIT883系统分析与项目管理介绍

文章目录 前言一、学科学习成果二、使用步骤最低出勤要求 前言 本课程介绍了信息系统开发中的技术和技术&#xff0c;以及与管理信息技术项目的任务相关的方法和过程。 它研究了系统分析师、客户和用户在系统开发生命周期中的互补角色。 它涵盖了引出系统需求的不同事实调查技…

Java进阶API第二章

Java进阶API第二章 一. 抛出企业问题&#xff0c;脱离main测试&#xff0c;模块化编程 1.学校里如何测试的 //学校教的测试方法 public static void main(String[] args) {//2.本地测试//3.调用函数//4.看输出&#xff0c;查看结果是否符合预期//5.预期结果和测试结果是通过人工…

CSS 文字溢出省略号显示

1. 单行文本溢出显示省略号 需要满足三个条件&#xff0c;添加对应的代码&#xff1a; &#xff08;1&#xff09;先强制一行内显示文本&#xff1b; &#xff08;2&#xff09;超出的部分隐藏&#xff1b; &#xff08;3&#xff09;文字用省略号来替代省略的部分&#xf…

创建两个简单表A,B 。AB表有相关联的列。并在关联列上创建索引

目录 一、创建两个简单表&#xff0c;并进行外键关联 1、创建表A 2、创建表B&#xff0c;并且关联表A 二、在关联列上创建索引 三、检查是否成功 一、创建两个简单表&#xff0c;并进行外键关联 1、创建表A CREATE TABLE A (id NUMBER PRIMARY KEY,name VARCHAR2(50),d…

3.5、Linux:命令行git的使用

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 在Linux Centos7.6下安装git yum -y install git 注册一个gitee账号 进去注册就好&#xff0c;记住自己的用户名和密码。 创建一个仓库 点击复制&#xff0c;接着就可以在Linux上使用了 git clone git clone 刚才复制的地…

物联网AI MicroPython学习之语法 ustruct 打包和解压原始数据类型

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; ustruct 介绍 ustruct提供打包和解压原始数据类型的功能。 默认情况下&#xff0c;C类型以机器的本机格式和字节顺序表示&#xff0c;并在必要时通过跳过填充字节来正确对齐&#xff08;根据C编译器使用的规…

generic webhook trigger 插件

generic webhook trigger 插件 通用 webhook 通过curl 请求触发流水线 rootubuntu20:~/luohuiwen/spring-boot-helloWorld# openssl rand -base64 32 QNJvWjUiNvNhQ4bKleI/5h2iZTKjSMREAvSJRvcM0 curl -X POST -H "Content-Type: application/json" -d { "ref…

C++:关联式容器map的使用

1、map的简介 map是关联容器&#xff0c;它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。 在map中&#xff0c;键值key通常用于排序和惟一地标识元素&#xff0c;而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同&#xff0c;并…

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

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

K8S容器持续Terminating无法正常关闭(sider-car容器异常,微服务容器正常)

问题 K8S上出现大量持续terminating的Pod&#xff0c;无法通过常规命令删除。需要编写脚本批量强制删除持续temminating的Pod&#xff1a;contribution-xxxxxxx。 解决 获取terminating状态的pod名称的命令&#xff1a; # 获取media命名空间下&#xff0c;名称带contributi…

短信登录实现(黑马点评为例)

文章目录 前言一、隐藏用户敏感信息二、短信验证登录、注册1.流程2.代码3.使用redis优化解决代码 二、登录拦截&#xff08;校验&#xff09;1.流程2.代码 总结 前言 短信登录核心知识 首先黑马点评这个短信登录是一伪验证&#xff0c;即后台调用工具类随机生成六位数字。 1.R…

网络虚拟化介绍(OVS、DVS)

目录 虚拟化中网络架构 虚拟交换机类型 虚拟交换机OVS&#xff08;Open Vswitch&#xff09; 分布式虚拟交换机DVS 虚拟机和物理网卡的通信模式 虚拟交换机中其它功能特性 网络虚拟化概念 网络虚拟化就是把网络层的一些功能从硬件中剥离出来&#xff0c;建立新的网络虚拟…

xlua游戏热更新(C#访问lua)

xlua作为Unity资源热更新的重要解决方案api&#xff0c;在Tecent重多游戏中被采用&#xff0c;本文通过案例去讲解xlua代码结构层次。 /** Tencent is pleased to support the open source community by making xLua available.* Copyright (C) 2016 THL A29 Limited, a Tence…

android自定义switch颜色

效果图&#xff1a; 原生样式和自己app的主题颜色不搭配&#xff0c;就可以这样自定义颜色样式。以下代码均可直接复制粘贴使用&#xff0c;且均有注释。 实现&#xff1a; 1、 新建drawable/switch_custom_thumb_on.xml&#xff08;滑块开启状态 &#xff09; <?xml ve…