01. 汇编LED驱动实验
01. 汇编LED驱动实验
- 汇编原理分析
- 为什么要学习Cortex—A汇编
- STM32IO初始化流程
- IMX6UL初始化流程
- 汇编基础
- 处理器内部数据传输指令
- 存储器访问指令
- 编写驱动
- 编译程序
- 烧写bin文件
汇编原理分析
为什么要学习Cortex—A汇编
- 需要用汇编初始化一些SOC外设
- 使用汇编初始化DDR,I.MX6U不需要
- 设置SP指针,一般指向DDR,设置好C语言运行环境
ALPHA开发板LED原理图
而LED0是接在GPIO1_3,下面一个LED灯是电源指示灯

STM32IO初始化流程
- 使能GPIO时钟
- 设置IO复用,将其复用为GPIO
- 配置GPIO电气属性
- 使用GPIO输出高低电平
IMX6UL初始化流程
- 使能时钟,CCGR0-CCGR6这七个寄存器控制着6ULL所有外设时钟的使能。为了简单,将这七个寄存器全部设置为0xffffffff,相当于使能所有外设时钟
- IO复用,寄存器
IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03。这个寄存器的0-3位是复用位,将这4位设置为0101,这样就是复用为GPIO

- 配置电气属性,寄存器
IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03是设置电气属性,包括压摆率、速度、驱动能力、开漏、上下拉等。


- 配置GPIO功能,设置输入输出。设置GPIO1_GDIR寄存器,设置GPIO1_IO03为输出,也就是为1;设置GPIO1_DR数据寄存器的bit3,为1表示输出高电平。
汇编基础
处理器内部数据传输指令
- mov指令
用于将数据从一个寄存器拷贝到另一个寄存器,或者将一个立即数传递到寄存器里面
mov R0, R1 @将寄存器R1中的数据传递给R0
mov R0, #0x12 @将立即数0x12传递给R0寄存器
- mrs指令
用于将特殊寄存器(如CPSR和SPSR)中的数据传递给通用寄存器
mrs R0, CPSR
- msr指令
将普通寄存器的数据传递给特殊寄存器
msr CPSR, R0
存储器访问指令
ARM不能直接访问存储器,比如RAM中的数据。I.MX6UL中的寄存器就是RAM类型的,我们用汇编来配置时许哟啊借助寄存器访问指令,一般先要将要配置的值写入到Rx(x=0~12)寄存器中,然后借助存储器访问指令将Rx中的数据写入到I.MX6UL寄存器中,读取也是一样的。

- LDR指令
用于从存储器加载数据到寄存器Rx中,也可以将一个立即数加载到寄存器中,加载立即数时需要用=,而不是#。

上述代码的offset是0 - STR指令
将数据写入到存储器中

编写驱动
.global _start @全局标号,_start是程序的入口_start:/* 使能所有外设时钟 */ldr r0, =0x020c4068 @CCGR0的地址ldr r1, =0xffffffff @要向CCGR0写入的数据str r1, [r0] @将r1写入到r0中ldr r0, =0x020c406cstr r1, [r0]ldr r0, =0x020c4070str r1, [r0]ldr r0, =0x020c4074str r1, [r0]ldr r0, =0x020c4078str r1, [r0]ldr r0, =0x020c407cstr r1, [r0]ldr r0, =0x020c4080str r1, [r0]ldr r0, =0x020c4084str r1, [r0]/* 配置GPIO1_IO03的复用为GPIO,也就是设置为5 */ldr r0, =0x020e0068 @地址ldr r1, =0x05str 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, =0x10b0str r1, [r0] /* 设置GPIO1_GDIR寄存器,设置GPIO_GPIO03为输出 */ldr r0, =0x0209c004ldr r1, =0x08str r1, [r0] /* 打开LED,也就是设置GPIO_IO03为低电平*GPIO_DR的地址为0x0209c000*/ldr r0, =0x0209c000ldr r1, =0x00str r1, [r0]loop:b loop @死循环,防止程序结束
编译程序
- 使用
arm-linux-gnueabihf-gcc -g -c led.s led.o将.c 和.s 文件变为.o - 使用
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的初始化参数 - 使用
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin将elf文件转为bin文件 - 使用
arm-linux-gnueabihf-objdump -D led.elf > led.dis将elf文件转为汇编、反汇编文件
可以直接编写makefile文件,直接通过make指令编译,这里就不详细说明makefile文件的使用
led.bin:led.sarm-linux-gnueabihf-gcc -g -c led.s -o led.oarm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elfarm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.binarm-linux-gnueabihf-objdump -D led.elf > led.dis
clean:rm -rf *.o led.bin led.elf led.dis
烧写bin文件
烧写不是将bin文件拷贝到SD卡中,而是将bin文件烧写到SD卡的绝对路径下。而且对于IMX,不能直接烧写bin问价,需要使用imxdownload软件。使用方法:确定要烧写的SD卡文件,给予imxdownload可执行权限chmod 777 imxdownload。然后就./imxdownload led.bin /dev/sdf。会向led.bin添加一个头部,并且生成一个新的imx文件,将新的文件烧写到SD卡中
相关文章:
01. 汇编LED驱动实验
01. 汇编LED驱动实验 汇编原理分析为什么要学习Cortex—A汇编STM32IO初始化流程IMX6UL初始化流程 汇编基础处理器内部数据传输指令存储器访问指令 编写驱动编译程序烧写bin文件 汇编原理分析 为什么要学习Cortex—A汇编 需要用汇编初始化一些SOC外设使用汇编初始化DDR&#x…...
Hadoop3教程(二十):MapReduce的工作机制总结
文章目录 (109)MapTask工作机制(110)ReduceTask工作机制&并行度ReduceTask工作机制MapTask和ReduceTask的并行度决定机制 (122)MapReduce开发总结参考文献 (109)MapTask工作机制…...
浅谈AI大模型技术:概念、发展和应用
AI大模型技术是指使用超大规模的深度学习模型来解决各种复杂的人工智能问题,如自然语言处理、计算机视觉、多模态交互等。AI大模型技术具有强大的学习能力和泛化能力,可以在多种任务上取得优异的性能,但也面临着计算、存储、通信等方面的挑战…...
【Leetcode】212.单词搜索II(Hard)
一、题目 1、题目描述 给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words, 返回所有二维网格上的单词 。 单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中…...
146.LRU缓存
双向链表哈希表 class LRUCache { public://1、定义双向链表结构、容量、哈希表等LRU数据成员struct Node{int key,value;Node *left,*right;Node(int _key,int _value):key(_key),value(_value),left(NULL),right(NULL){}}*L,*R;int n;unordered_map<int,Node*> ump;//…...
使用transformers过程中出现的bug
1. The following model_kwargs are not used by the model: [encoder_hidden_states, encoder_attention_mask] (note: typos in the generate arguments will also show up in this list) 使用text_decoder就出现上述错误,这是由于transformers版本不兼容导致的 …...
Hadoop3教程(二十二):Yarn的基础架构与工作流程
文章目录 (126)基础架构(127)YARN的工作机制(128)作业全流程参考文献 (126)基础架构 之前基本介绍完了Hadoop的几个核心组件,接下来可以思考下,在MR程序运行…...
离线 notepad++ 添加到右键菜单
复制下面代码,修改文件后缀名为:reg Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\NotePad] "Notepad" "Icon""D:\\Notepad\\notepad.exe,0"[HKEY_CLASSES_ROOT\*\shell\NotePad\Command] "D:\…...
怎么让英文大语言模型支持中文?--构建中文tokenization--继续预训练--指令微调
1 构建中文tokenization 参考链接:https://zhuanlan.zhihu.com/p/639144223 1.1 为什么需要 构建中文tokenization? 原始的llama模型对中文的支持不太友好,接下来本文将讲解如何去扩充vocab里面的词以对中文进行token化。 1.2 如何对 原始数…...
笙默考试管理系统-MyExamTest----codemirror(35)
笙默考试管理系统-MyExamTest----codemirror(35) 目录 一、 笙默考试管理系统-MyExamTest 二、 笙默考试管理系统-MyExamTest 三、 笙默考试管理系统-MyExamTest 四、 笙默考试管理系统-MyExamTest 五、 笙默考试管理系统-MyExamTest 笙默考试…...
MMKV(2)
API 初始化和实例获取: MMKV.initialize(Context context): 初始化MMKV库。通常在应用程序的入口点调用此方法。 MMKV.defaultMMKV(): 获取默认的MMKV实例。默认实例使用默认的存储路径和加密方式。 MMKV.mmkvWithID(String mmapID): 根据给定的ID获取MMKV实例。…...
Spring Boot项目中使用 TrueLicense 生成和验证License(附源码)
1、Linux 在客户linux上新建layman目录,导入license.sh文件, [rootlocalhost layman]# mkdir -p /laymanlicense.sh文件内容: #!/bin/bash # 1.获取要监控的本地服务器IP地址 IPifconfig | grep inet | grep -vE inet6|127.0.0.1 | awk {p…...
ES6 Iterator 和 for...of 循环
1.iterator 概念 ES6 添加了Map和Set。这样就有了四种数据集合,需要一种统一的接口机制来处理所有不同的数据结构。遍历器(Iterator)就是这样一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部…...
ubuntu20.04 nvidia显卡驱动掉了,变成开源驱动,在软件与更新里选择专有驱动,下载出错,调整ubuntu镜像源之后成功修复
驱动配置好,环境隔了一段时间,打开Ubuntu发现装好的驱动又掉了,软件与更新 那里,附加驱动,显示开源驱动,命令行输入 nvidia-smi 命令查找不到驱动。 点击上面的 nvidia-driver-470(专有&#x…...
华为FAT模式无线AP配置实例
硬件:AP3010DN 软件版本:VRP software, Version 5.170 (AP3010DN-V2 FAT V200R010C00SPCf02) [Huawei]dis ver Huawei Versatile Routing Platform Software VRP (R) software, Version 5.170 (AP3010DN-V2 FAT V200R010C00SPCf02) Copyright (C) 2011…...
nodejs基于vue 学生论坛设计与实现
随着网络技术的不断成熟,带动了学生论坛,它彻底改变了过去传统的管理方式,不仅使服务管理难度变低了,还提升了管理的灵活性。 是本系统的开发平台 系统中管理员主要是为了安全有效地存储和管理各类信息, 这种个性化的平…...
017 基于Spring Boot的食堂管理系统
部分代码地址: https://github.com/XinChennn/xc017-stglxt 基于Spring Boot的食堂管理系统 项目介绍 本项目是基于Java的管理系统。采用前后端分离开发。前端基于bootstrap框架实现,后端使用Java语言开发,技术栈包括但不限于SpringBoot、…...
常用的二十种设计模式(下)-C++
设计模式 C中常用的设计模式有很多,设计模式是解决常见问题的经过验证的最佳实践。以下是一些常用的设计模式: 单例模式(Singleton):确保一个类只有一个实例,并提供一个全局访问点。工厂模式(…...
C#桶排序算法
前言 桶排序是一种线性时间复杂度的排序算法,它将待排序的数据分到有限数量的桶中,每个桶再进行单独排序,最后将所有桶中的数据按顺序依次取出,即可得到排序结果。 实现原理 首先根据待排序数据,确定需要的桶的数量。…...
快速了解服务器单CPU与双CPU
在当今快节奏的技术环境中,用户们对功能强大且高效的服务器配置需求不断增长。CPU作为构成任何计算基础设施的骨干,服务器的“大脑”,负责执行计算、控制数据流并协调各个组件之间的任务,是服务器选择硬件中的重要一环。因此…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
