01. 汇编LED驱动实验

news2025/1/12 4:03:55

01. 汇编LED驱动实验

  • 汇编原理分析
    • 为什么要学习Cortex—A汇编
    • STM32IO初始化流程
    • IMX6UL初始化流程
  • 汇编基础
    • 处理器内部数据传输指令
    • 存储器访问指令
  • 编写驱动
  • 编译程序
  • 烧写bin文件

汇编原理分析

为什么要学习Cortex—A汇编

  1. 需要用汇编初始化一些SOC外设
  2. 使用汇编初始化DDR,I.MX6U不需要
  3. 设置SP指针,一般指向DDR,设置好C语言运行环境

ALPHA开发板LED原理图

而LED0是接在GPIO1_3,下面一个LED灯是电源指示灯
在这里插入图片描述

STM32IO初始化流程

  1. 使能GPIO时钟
  2. 设置IO复用,将其复用为GPIO
  3. 配置GPIO电气属性
  4. 使用GPIO输出高低电平

IMX6UL初始化流程

  1. 使能时钟,CCGR0-CCGR6这七个寄存器控制着6ULL所有外设时钟的使能。为了简单,将这七个寄存器全部设置为0xffffffff,相当于使能所有外设时钟
  2. IO复用,寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03。这个寄存器的0-3位是复用位,将这4位设置为0101,这样就是复用为GPIO
    在这里插入图片描述
  3. 配置电气属性,寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03是设置电气属性,包括压摆率、速度、驱动能力、开漏、上下拉等。
    在这里插入图片描述
    在这里插入图片描述
  4. 配置GPIO功能,设置输入输出。设置GPIO1_GDIR寄存器,设置GPIO1_IO03为输出,也就是为1;设置GPIO1_DR数据寄存器的bit3,为1表示输出高电平。

汇编基础

处理器内部数据传输指令

  1. mov指令
    用于将数据从一个寄存器拷贝到另一个寄存器,或者将一个立即数传递到寄存器里面
mov R0, R1 @将寄存器R1中的数据传递给R0
mov R0, #0x12 @将立即数0x12传递给R0寄存器
  1. mrs指令
    用于将特殊寄存器(如CPSR和SPSR)中的数据传递给通用寄存器
mrs R0, CPSR
  1. msr指令
    将普通寄存器的数据传递给特殊寄存器
msr CPSR, R0

存储器访问指令

ARM不能直接访问存储器,比如RAM中的数据。I.MX6UL中的寄存器就是RAM类型的,我们用汇编来配置时许哟啊借助寄存器访问指令,一般先要将要配置的值写入到Rx(x=0~12)寄存器中,然后借助存储器访问指令将Rx中的数据写入到I.MX6UL寄存器中,读取也是一样的。
在这里插入图片描述

  1. LDR指令
    用于从存储器加载数据到寄存器Rx中,也可以将一个立即数加载到寄存器中,加载立即数时需要用=,而不是#。
    在这里插入图片描述
    上述代码的offset是0
  2. STR指令
    将数据写入到存储器中
    在这里插入图片描述

编写驱动

.global _start @全局标号,_start是程序的入口

_start:
	/* 使能所有外设时钟 */
	ldr r0, =0x020c4068 @CCGR0的地址
	ldr r1, =0xffffffff @要向CCGR0写入的数据
	str r1, [r0]		@将r1写入到r0中

	ldr r0, =0x020c406c
	str r1, [r0]
	
	ldr r0, =0x020c4070
	str r1, [r0]
	
	ldr r0, =0x020c4074
	str r1, [r0]

	ldr r0, =0x020c4078
	str r1, [r0]

	ldr r0, =0x020c407c
	str r1, [r0]

	ldr r0, =0x020c4080
	str r1, [r0]
    
    ldr r0, =0x020c4084
	str r1, [r0]

	/* 配置GPIO1_IO03的复用为GPIO,也就是设置为5 */
	ldr r0, =0x020e0068 @地址
	ldr r1, =0x05
	str r1, [r0] 

	/* 配置GPIO1_IO03的电器属性,地址是0x020e02f4
	*bit0:    0低速率
	*bit5:3:  110 R0/6驱动能力
	*bit7:6:  10 100MHz速度
	*bit11:   0关闭开路输出
	*bit12:   1 使能pull/kepper
	*bit13:   0 kepper
	*bit15:14: 00 100k下拉
	*bit16:   0 关闭hys
	*/

	ldr r0, =0x020e02f4 @地址
	ldr r1, =0x10b0
	str r1, [r0] 
	
	/* 设置GPIO1_GDIR寄存器,设置GPIO_GPIO03为输出 */
	ldr r0, =0x0209c004
	ldr r1, =0x08
	str r1, [r0] 

	/* 打开LED,也就是设置GPIO_IO03为低电平
	 *GPIO_DR的地址为0x0209c000
	 */
	ldr r0, =0x0209c000
	ldr r1, =0x00
	str r1, [r0]

loop:
	b loop @死循环,防止程序结束

编译程序

  1. 使用arm-linux-gnueabihf-gcc -g -c led.s led.o将.c 和.s 文件变为.o
  2. 使用arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf将.o文件链接为elf格式的可执行文件,链接时需要指定链接的起始地址。对于6ULL,链接其实地址应该指向RAM地址,而不是存在内部flash。RAM分为内部0x900000~0x91ffff,也可以是外部DDR,对于ALPHA,选择0x87800000。要使用DDR,必须要初始化DDR。对于IMX,bin文件不能直接烧写到SD卡、EMMC、NAND等外置存储中,然后从这些外置存储中启动运行,需要添加一个头部,这个头部包含了DDR的初始化参数
  3. 使用arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin将elf文件转为bin文件
  4. 使用arm-linux-gnueabihf-objdump -D led.elf > led.dis将elf文件转为汇编、反汇编文件

烧写bin文件

烧写不是将bin文件拷贝到SD卡中,而是将bin文件烧写到SD卡的绝对路径下。而且对于IMX,不能直接烧写bin问价,需要使用imxdownload软件。使用方法:确定要烧写的SD卡文件,给予imxdownload可执行权限chmod 777 imxdownload。然后就./imxdownload led.bin /dev/sdf。会向led.bin添加一个头部,并且生成一个新的imx文件,将新的文件烧写到SD卡中

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

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

相关文章

【代码随想录】算法训练营 第三天 第二章 链表 Part 1

目录 链表基础 链表的定义 203. 移除链表元素 题目 思路 代码 直接删除法 虚拟头结点辅助法 707. 设计链表 题目 思路 代码 206. 反转链表 题目 思路 代码 双指针法 递归法 链表基础 链表是一种通过指针串在一起的线性结构,每个节点都由数据域和指…

初阶数据结构-常见的排序算法

排序 排序的概念常见的排序算法常见排序算法的实现数组的打印 插入排序直接插入排序的实现希尔排序( 缩小增量排序 )希尔排序的实现 交换排序冒泡排序冒泡排序的实现选择排序选择排序的实现堆排序堆排序的实现快速排序快速排序非递归 归并排序归并排序的递归实现归并排序的非递…

黑马JVM总结(三十五)

(1)JMM-有序性-问题 (2)JMM-有序性-解决 使用maven重新编译: 生成两个jar包 运行这个jar包: 再次执行上述结果:0出现的次数为0了 (3)JMM-有序性-理解 (4&am…

2023_Spark_实验十六:编写LoggerLevel方法及getLocalSparkSession方法

一、搭建Spark项目结构 在SparkProject模块的pom.xml文件中增加一下依赖&#xff0c;并等待依赖包下载完毕&#xff0c;如上图。 ​<!-- Spark及Scala的版本号 --><properties><scala.version>2.11</scala.version><spark.version>2.1.1</sp…

组合数的计算

C: 即从a个元素中选取b个元素的组合数。 LL C(int a, int b) {LL res 1;for (int i a, j 1; j < b; i --, j )res res * i / j;return res; } A: 表示从a个元素中选取b个元素进行排列的情况数。 LL P(int a, int b) {LL res 1;for (int i a; i > a - b; i--){res…

2-k8s-控制器介绍

文章目录 一、控制器类型二、Deployment控制器三、SatefulSet控制器四、Daemonset控制器五、Job控制器六、CronJob 控制器 一、控制器类型 Deployment&#xff1a;适合无状态的服务部署StatefullSet&#xff1a;适合有状态的服务部署DaemonSet&#xff1a;一次部署&#xff0c…

iMazing 3中文版功能介绍免费下载安装教程

iMazing 3中文版免费下载是一款兼容Win和Mac的iOS设备管理软件。iMazing 3能够将音乐、文件、消息和应用等数据从任何 iPhone、iPad 或 iPod 传输到 Mac 或 PC 上。 使用iMazing 3独特的 iOS 备份功能保证数据安全:设定自动无线备份时间并支持快照;将备份保存到外接驱动器和网…

数据结构复盘——第四章:数组和矩阵

文章目录 第一部分:矩阵第一部分习题第二部分:对称矩阵第二部分习题第三部分:三角矩阵第三部分习题第四部分:三对角矩阵第四部分习题第五部分:稀疏矩阵第五部分习题小结第一部分:矩阵 矩阵在线性代数中已经有过详细了解,在考研中矩阵部分常常考察数组下标 k 与 矩阵行 …

5-k8s-探针介绍

文章目录 一、探针介绍二、探针类型三、探针定义方式四、探针实例五、启动探针测试六、存活探针测试七、就绪探针测试 一、探针介绍 概念 在 Kubernetes 中 Pod 是最小的计算单元&#xff0c;而一个 Pod 又由多个容器组成&#xff0c;相当于每个容器就是一个应用&#xff0c;应…

采用Spring Boot框架开发的医院预约挂号系统3e3g0+vue+java

本医院预约挂号系统有管理员&#xff0c;医生和用户。管理员功能有个人中心&#xff0c;用户管理&#xff0c;医生管理&#xff0c;科室信息管理&#xff0c;预约挂号管理&#xff0c;用户投诉管理&#xff0c;投诉处理管理&#xff0c;通知公告管理&#xff0c;科室分类管理。…

LeetCode24.两两交换链表中的节点

这道题还是比较简单&#xff0c;我看完题目的想法就是借助一个第三变量&#xff0c;来改变两个节点的指针的指向&#xff0c;比如我要改变1和2节点的指向&#xff0c;我用h1表示节点1&#xff0c;我创建一个新的节点ans&#xff0c;先拿ans指向节点2&#xff08;ans.next h1.n…

Linux性能优化--性能工具:网络

7.0 概述 本章介绍一些在Linux上可用的网络性能工具。我们主要关注分析单个设备/系统网络流量的工具&#xff0c;而非全网管理工具。虽然在完全隔离的情况下评估网络性能通常是无意义的(节点不会与自己通信),但是&#xff0c;调查单个系统在网络上的行为对确定本地配置和应用程…

从零开始的LINUX(二)

1.alias: 用法&#xff1a;取别名&#xff0c;此时code1是code的别名&#xff0c;对code1进行操作和对code进行操作结果一致。 如果原本文件名不存在&#xff0c;仍可以正常运行指令&#xff0c;不会报错。 2.stat 显示指定文件或目录的状态、属性。 3.touch 当文件名不存在的…

基于SSM+Vue的日用品网站设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

数据结构复盘——第一章:绪论

文章目录 第一部分:数据的专业术语1、数据2、数据元素3、数据项4、数据对象5、数据类型6、抽象数据类型(ADT)第一部分习题第二部分:数据结构1、逻辑结构:2、存储结构(又称物理结构)︰3、运算:第二部分习题第三部分:算法1、算法的五个特性2、算法的设计五个要求第三部分习题…

antd的RangePicker设置默认值,默认近七天(andt+react)

import moment from "moment";state {initData:[moment().startOf(day).subtract(6, d), moment().endOf(day)], }<FormItem label"产生时间" {...tailItemLayout}>{getFieldDecorator("produceTime", {initialValue: initData})(<Ran…

C语言 形参、实参

定义 形参 形式上的参数&#xff0c;没有确定的值 实参 实际存在的&#xff0c;已经确定的参数&#xff0c;常量&#xff0c;变量&#xff0c;表达式&#xff0c;都是实参 区别 实参的值不随形参的变化而变化 在C语言中&#xff0c;数据传送是单向的&#xff0c;即只能把实…

【软考】14.2 统一建模语言UML/事务关系图

《统一建模语言UML》 可视化的建模语言&#xff0c;非程序设计语言UML的结构&#xff1a;构造块&#xff08;事物、关系、图&#xff09;、规则、公共机制 模型的事物 结构事物&#xff1a;静态行为事物&#xff1a;动态分组事物&#xff1a;组织注释事物&#xff1a;解释 事…

基于寄生捕食优化的BP神经网络(分类应用) - 附代码

基于寄生捕食优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于寄生捕食优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.寄生捕食优化BP神经网络3.1 BP神经网络参数设置3.2 寄生捕食算法应用 4.测试结果…

GPT绘制流程图咒语

【咒语】下面是我的一篇论文选取部分&#xff0c;为了让读者更好理解&#xff0c;我准备画一张图&#xff0c;请你阅读后为我设计一下这个图应该怎么画&#xff0c;更有说服力&#xff0c;更容易理解 论文片段&#xff1a; 多模态数据融合研究的基础在于有效的数据采集。首先&a…