当前位置: 首页 > news >正文

嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • IMX6ULL介绍
    • 主要资料
    • IO表现形式
  • 汇编LED驱动
    • 原理图
    • 初始化流程
      • 时钟设置
      • IO复用设置
      • 电气属性设置
      • 使用GPIO
    • 编写驱动
    • 编译程序
      • 编译.o文件
      • 地址链接.elf
      • 格式转换.bin
      • 反汇编(其他)
    • 综合成Makefile完成一步编译
    • 烧录程序
      • imxdownload
      • 准备SD卡
      • 向SD卡烧写程序


前言

现在开始正式在开发板上进行开发,仍然看的是正点原子的资料


IMX6ULL介绍

主要资料

使用的是Cortex-A7
在这里插入图片描述
点击芯片名字打开介绍,主要参考的手册是:
在这里插入图片描述
以及数据手册:
在这里插入图片描述

IO表现形式

对于一般的STM32来说,IO的表现形式为:
在这里插入图片描述
管教名为PA1,管脚的功能在倒数第二列

对于IMX6ULL,IO形式在参考手册里面,且没有上面的表格:目录列表即管教名:SNVS_TAMPER2这样格式的,是对寄存器介绍的。
在这里插入图片描述
下图的这两种,有MUX的表示本节介绍的是复用功能
在这里插入图片描述
配置其电气模式:就是速度、上下拉类似stm32那些
在这里插入图片描述


汇编LED驱动

Cortex-A汇编的功能:

  • 初始化SOC外设
  • 初始化DDR(一般内部ROM存放了启动代码,读取DDR配置信息,完成DDR初始化)
  • 设置SP指针,一般指向DDR,设置好C语言环境

原理图

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

在这里插入图片描述

初始化流程

参考STM32的初始化过程:
在这里插入图片描述

  • 使能GPIO时钟
  • 设置IO复用,复用为GPIO
  • 配置电气属性
  • 使用

时钟设置

对IMX6ULL来说:CCM为其时钟控制
在这里插入图片描述
打开发现CCGR0-6,控制了其所有的外设时钟
在这里插入图片描述
有几种模式,但先直接初始化为11,所有模式下都开启,且CG0-CG15都这样,即0xfffffff
在这里插入图片描述
这里有地址:0x20C4068
在这里插入图片描述

IO复用设置

在这里插入图片描述

需要设置为0101,即复用为GPIO模式
SION寄存器,设置为默认0就行

电气属性设置


SRE(bit0): 对应图 8.1.4.2 中的 SRE,设置压摆率,当此位为 0 的时候是低压摆率,当为 1的时候是高压摆率。这里的压摆率就是 IO 电平跳变所需要的时间(高速通信就用高压摆率),要过EMC就用低压摆率。

DSE(bit5:3):对应图 8.1.4.2 中的 DSE,当 IO 用作输出的时候用来设置 IO 的驱动能力,111驱动能力最强。
在这里插入图片描述
SPEED(bit7:6): 对应图 8.1.4.2 中的 SPEED,当 IO 用作输出的时候,此位用来设置 IO 速度
在这里插入图片描述
PUE(bit13):当 IO 作为输入的时候,为 0 的时候使用状态保持器,当为 1 的时候使用上下拉。状态保持器在当外部电路断电以后此 IO 口可以保持住以前的状态。

PKE(bit12): 此位为0 时禁止上下拉/状态保持器,为 1 时使能上下拉和状态保持器。

ODE(bit11):当 IO 作为输出的时候,此位为 0 的时候禁止开路输出, 当此位为 1 的时候就使能开路输出功能。

PUS(bit15:14): 用来设置上下拉电阻的
在这里插入图片描述
HYS(bit16):使能迟滞比较器,当 IO 作为输入功能的时候有效,用于设置输入接收器的施密特触发器是否使能。如果需要对输入波形进行整形的话可以使能此位。此位为 0 的时候禁止迟滞比较器,为 1 的时候使能迟滞比较器。

使用GPIO

在这里插入图片描述

  • DR:读写数据

  • GDIR:IO是输入还是输出

  • PSR:功能和输入状态下的DR寄存器一样,读取IO状态

  • ICR1、ICR2:中断控制寄存器,ICR1配置IO0-15,ICR2配置IO16-31
    在这里插入图片描述
    要设置 GPIO1_IO15为上升沿触发中断,那么 GPIO1.ICR1=2<<30

  • IMR:中断屏蔽寄存器,使能某个 GPIO 的中断,那么设置相应的位为 1 即可,反之,如果要禁止中断,那么就设置相应的位为 0,使能 GPIO1_IO00 的中断,那么就可以设置 GPIO1.MIR=1

  • ISR:中断状态寄存器,32 位寄存器,只要某个 GPIO 的中断发生,那么ISR 中相应的位就会被置 1

  • EDGE_SEL:边沿选择寄存器,设置边沿中断,这个寄存器会覆盖 ICR1 和 ICR2 的设置,同样是一个 GPIO 对应一个位。如果相应的位被置 1,那么就相当与设置了对应的 GPIO 双边沿触发。

各个地址在这里:
在这里插入图片描述
以GDIR为例子:每一位代表一个IO,IO3为1即0x8
在这里插入图片描述

编写驱动

.global _start   //全局start入口_start://使能所有外设时钟ldr r0, =0x020C4068 //CCGR0寄存器地址ldr r1, =0xffffffff //写入的数据str r1, [r0]        ldr r0, =0X020C406C /* 寄存器 CCGR1 */str r1, [r0]ldr r0, =0X020C4070 /* 寄存器 CCGR2 */str r1, [r0]ldr r0, =0X020C4074 /* 寄存器 CCGR3 */str r1, [r0]ldr r0, =0X020C4078 /* 寄存器 CCGR4 */str r1, [r0]ldr r0, =0X020C407C /* 寄存器 CCGR5 */str r1, [r0]ldr r0, =0X020C4080 /* 寄存器 CCGR6 */str r1, [r0]// 设置 GPIO1_IO03 复用为 GPIOldr r0, =0X020E0068 /* 将寄存器 SW_MUX_GPIO1_IO03_BASE 加载到 r0 中 */ldr r1, =0X5 /* 设置寄存器 SW_MUX_GPIO1_IO03_BASE 的 MUX_MODE 为 5 */str r1,[r0]/* 3、配置 GPIO1_IO03 的 IO 属性*bit [16]:    0 HYS 关闭*bit [15:14]: 00 默认下拉*bit [13]: 0 kepper 功能*bit [12]: 1 pull/keeper 使能*bit [11]: 0 关闭开路输出*bit [7:6]: 10 速度 100Mhz*bit [5:3]: 110 R0/6 驱动能力*bit [0]: 0 低转换率*/ldr r0, =0X020E02F4 /*寄存器 SW_PAD_GPIO1_IO03_BASE */ldr r1, =0X10B0str r1,[r0]//设置为输出模式ldr r0, =0X0209C004 /*寄存器 GPIO1_GDIR */ ldr r1, =0X0000008str r1,[r0]//输出低电平ldr r0, =0X0209C000 /*寄存器 GPIO1_DR */ldr r1, =0str r1,[r0]//loop循环
loop:b loop

编译程序

编译.o文件

在这里插入图片描述

arm-linux-gnueabihf-gcc -g -c leds.s -o leds.o

用交叉编译器进行编译,“-g”选项是产生调试信息, GDB 能够使用这些调试信息进行代码调试。“-c”选项是编译源文件,但是不链接。“-o”选项是指定编译产生的文件名字,这里我们指定 led.s 编译完成以后的文件名字为 led.o。

地址链接.elf

在STM32中,keil会链接存储的起始地址和运行地址0x80000000
我们烧写到SD卡中,上电以后 I.MX6U 的内部 boot rom 程序会将可执行文件拷贝到链接地址处,这个链接地址可以在 I.MX6U 的内部 128KB RAM 中(0X900000~0X91FFFF),也可以在外部的 DDR 中。

拷贝到DDR中:
链接起始地址为 0X87800000。 I.MX6U-ALPHA 开发板的 DDR 容量有两种: 512MB 和256MB,起始地址都为 0X80000000,只不过 512MB 的终止地址为 0X9FFFFFFF,而 256MB 容量的终止地址为 0X8FFFFFFF。之所以选择 0X87800000 这个地址是因为后面要讲的 Uboot 其链接地址就是 0X87800000,这样我们统一使用 0X87800000 这个链接地址,不容易记混。

arm-linux-gnueabihf-ld -Ttext 0X87800000 leds.o -o leds.elf

在这里插入图片描述
最后还需要格式转换到bin文件:

arm-linux-gnueabihf-objcopy -O binary -S -g leds.elf leds.bin

格式转换.bin

arm-linux-gnueabihf-objcopy -O binary -S -g leds.elf leds.bin

“-O”选项指定以什么格式输出,后面的“binary”表示以二进制格式输出,选项“-S”表示不要复制源文件中的重定位信息和符号信息,“-g”表示不复制源文件中的调试信息。
在这里插入图片描述

反汇编(其他)

反汇编:多数是用 C 语言写的,有时候查看其汇编代码来调试,一般可以将 elf 文件反汇编

arm-linux-gnueabihf-objdump -D leds.elf > leds.dis

“-D”选项表示反汇编所有的段,反汇编完成以后就会在当前目录下出现一个名为 led.dis 文件
在这里插入图片描述

综合成Makefile完成一步编译

创建Makefile文件:

leds.bin:leds.sarm-linux-gnueabihf-gcc -g -c leds.s -o leds.oarm-linux-gnueabihf-ld -Ttext 0X87800000 leds.o -o leds.elfarm-linux-gnueabihf-objcopy -O binary -S -g leds.elf leds.binarm-linux-gnueabihf-objdump -D leds.elf > leds.dis
clean:rm -rf *.o leds.bin leds.elf leds.dis

在这里插入图片描述

烧录程序

imxdownload

I.MX6U 支持从外置的 NOR Flash、 NAND Flash、 SD/EMMC、 SPI NOR Flash和 QSPI Flash 这些存储介质中启动,所以我们可以将代码烧写到这些存储介质中中。在这些存储介质中,除了 SD 卡以外,其他的一般都是焊接到了板子上的,我们没法直接烧写。

将 imxdownload 拷贝到工程根目录下,也就是和 leds.bin 处于同一个文件夹下,给予 imxdownload 可执行权限,给予 imxdownload 可执行权限以后其名字变成了绿色的,如果没有可执行权限的话其名字颜色是白色的。

chmod 777 imxdownload

在这里插入图片描述

准备SD卡

ls /dev/sd*

在这里插入图片描述
查看可知该SD卡挂载/dev/sdb、/dev/sdb1,/dev/sdd 是我的 SD 卡, /dev/sdd1 是 SD 卡的第一个分区

向SD卡烧写程序

./imxdownload <.bin file> <SD Card>

在这里插入图片描述
注意如果出现MB/s的烧写速度,肯定烧写失败,需要重启Ubuntu,这里我下载错了,应该是/dev/sdb

烧写完成以后会在当前工程目录下生成一个 load.imx 的文件

之后,设置为SD卡启动,按下复位键
在这里插入图片描述
在这里插入图片描述

相关文章:

嵌入式Linux裸机开发(一)基础介绍及汇编LED驱动

系列文章目录 文章目录 系列文章目录前言IMX6ULL介绍主要资料IO表现形式 汇编LED驱动原理图初始化流程时钟设置IO复用设置电气属性设置使用GPIO 编写驱动编译程序编译.o文件地址链接.elf格式转换.bin反汇编&#xff08;其他&#xff09; 综合成Makefile完成一步编译烧录程序imx…...

企业微信机器人对接GPT

现在网上大部分微信机器人项目都是基于个人微信实现的&#xff0c;常见的类库都是模拟网页版微信接口。 个人微信作为我们自己日常使用的工具&#xff0c;也用于支付场景&#xff0c;很怕因为违规而被封。这时&#xff0c;可以使用我们的企业微信机器人&#xff0c;利用企业微信…...

【数据结构】排序(1) ——插入排序 希尔排序

目录 一. 直接插入排序 基本思想 代码实现 时间和空间复杂度 稳定性 二. 希尔排序 基本思想 代码实现 时间和空间复杂度 稳定性 一. 直接插入排序 基本思想 把待排序的记录按其关键码值的大小依次插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&…...

Python 列表推导式深入解析

Python 列表推导式深入解析 列表推导式是 Python 中的一种简洁、易读的方式&#xff0c;用于创建列表。它基于一个现有的迭代器&#xff08;如列表、元组、集合等&#xff09;来生成新的列表。 基本语法&#xff1a; 列表推导式的基本形式如下&#xff1a; [expression for…...

信息学奥赛一本通-编程启蒙3103:练18.3 组别判断

3103&#xff1a;练18.3 组别判断 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 1963 通过数: 1418 【题目描述】 信息学课上要同学分组做期末报告&#xff0c;分组的方式为依座号顺序&#xff0c;每 3个人一组。如&#xff1a;1, 2, 3 为第一组&#xff0c;4, …...

C++ primer plus--探讨 C++ 新标准

18 探讨 C 新标准 18.1 复习前面介绍过的 C11 功能 &#xff08;1&#xff09;C11 扩大了列表初始化的适用范围&#xff0c;使用初始化列表时&#xff0c;可以不加等号。 int x {5}; float y {1.1}; short arr[5] {1, 2, 3, 4, 5}; int* ar new int[4] {1, 2, 3, 4}; vect…...

2023版 STM32实战6 输出比较(PWM)包含F407/F103方式

输出比较简介和特性 -1-只有通用/高级定时器才能输出PWM -2-占空比就是高电平所占的比例 -3-输出比较就是输出不同占空比的信号 工作方式说明 -1-1- PWM工作模式 -1-2- 有效/无效电平 有效电平可以设置为高或低电平&#xff0c;是自己配置的 周期选择与计算 周期重…...

选择排序算法:简单但有效的排序方法

在计算机科学中&#xff0c;排序算法是基础且重要的主题之一。选择排序&#xff08;Selection Sort&#xff09;是其中一个简单但非常有用的排序算法。本文将详细介绍选择排序的原理和步骤&#xff0c;并提供Java语言的实现示例。 选择排序的原理 选择排序的核心思想是不断地从…...

安卓教材学习

文章目录 教材学习第一行代码 Android 第3版环境配置gradle配置下载包出现问题 教材学习 摘要&#xff1a;选了几本教材《第一行代码 Android 第3版》&#xff0c;记录一下跑案例遇到的问题&#xff0c;和总结一些内容。 第一行代码 Android 第3版 环境配置 gradle配置 gradl…...

C++设计模式-生成器(Builder)

目录 C设计模式-生成器&#xff08;Builder&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-生成器&#xff08;Builder&#xff09; 一、意图 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 二、…...

CTFHUB - SSRF

目录 SSRF漏洞 攻击对象 攻击形式 产生漏洞的函数 file_get_contents() fsockopen() curl_exec() 提高危害 利用的伪协议 file dict gopher 内网访问 伪协议读取文件 端口扫描 POST请求 总结 上传文件 总结 FastCGI协议 CGI和FastCGI的区别 FastCGI协议 …...

边缘计算网关

一、项目整体框架图 二、项目整体描述 边缘计算网关项目主要实现了智能家居场景和工业物联网场景下设备的数据采集和控制。 整个项目分为三大层&#xff1a;用户接口层、网关层、设备层。 其中用户层通过QT客户端、WEB界面及阿里云提供数据展示和用户接口。 网关使用虚拟机代替…...

1800_vim的宏录制功能尝试

全部学习信息汇总&#xff1a; GreyZhang/editors_skills: Summary for some common editor skills I used. (github.com) 最近5年多来&#xff0c;我emacs的编辑器用的还是比较多的。我的配置基本上是一个spacemacs&#xff0c;然后根据自己的需求增加了一丁点儿的其他配置。而…...

Ultra-Fast-Lane-Detection-v2 {后处理优化}//参考

采用三次多项式拟合生成的anchor特征点&#xff0c;在给定的polyfit_draw函数中&#xff0c;degree参数代表了拟合多项式的度数。 具体来说&#xff0c;当我们使用np.polyfit函数进行数据点的多项式拟合时&#xff0c;我们需要指定一个度数。这个度数决定了多项式的复杂度。例…...

【面试题精讲】Java静态方法和实例方法有何不同?

★ 有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top ” 首发博客地址[1] 面试题手册[2] 系列文章地址[3] Java 中的静态方法和实例方法在使用和行为上有一些不同之处。 调用方式不同&#xff1a; 静…...

【数据结构】布隆过滤器

布隆过滤器的提出 在注册账号设置昵称的时候&#xff0c;为了保证每个用户昵称的唯一性&#xff0c;系统必须检测你输入的昵称是否被使用过&#xff0c;这本质就是一个key的模型&#xff0c;我们只需要判断这个昵称被用过&#xff0c;还是没被用过。 方法一&#xff1a;用红黑…...

linux基础4---内存

1、什么是内存泄漏,怎么解决内存泄漏? 在嵌入式Linux中,内存泄漏是指由于疏忽或错误,导致一些对象或资源无法被垃圾回收器回收,从而导致内存占用不断增加,最终导致设备性能下降。内存泄漏对程序的影响很大,可能会导致应用程序变慢、崩溃或者消耗大量的内存,最终导致设…...

图论---拓扑排序

概念 一个有向图&#xff0c;如果图中有入度为 0 的点&#xff0c;就把这个点删掉&#xff0c;同时也删掉这个点所连的边。一直进行上面的处理&#xff0c;如果所有点都能被删掉&#xff0c;则这个图可以进行拓扑排序。拓扑排序是对DAG&#xff08;有向无环图&#xff09;上的节…...

java Spring Boot 将日志写入文件中记录

我们之前的一套操作来讲 日志都是在控制台上的 但 如果你的项目在正式环境上跑 运维人员突然告诉你说日志报错了&#xff0c;但你日志只在控制台上&#xff0c;那公司项目如果访问量很大 那你是很难在控制台上找到某一条日志的 这时 我们就可以用文件把它记下来 我们打开项目 …...

Android 开发错误集合

&#x1f525; 开发错误集合一 &#x1f525; Caused by: java.lang.ClassNotFoundException: Didnt find class "com.mask.app.ui.LoginRegisterActivity" on path: DexPathList[[zip file "/data/app/~~NMvHVhj8V6-HwGbh2amXDA/com.mask.app-PWbg4xIlETQ3eVY…...

华硕梅林固件下,让HP1020打印机在Linux网络环境中重获新生

1. 为什么HP1020打印机在Linux网络环境中会"罢工"&#xff1f; 每次看到那台尘封已久的HP LaserJet 1020打印机&#xff0c;我都觉得特别可惜。这台老伙计在Windows系统下表现一直很稳定&#xff0c;但当我尝试把它接入刷了梅林固件的华硕路由器时&#xff0c;却遇到…...

企业如何防御LockBit 3.0?从IOC到实战检测规则编写指南

企业级防御实战&#xff1a;LockBit 3.0勒索病毒全维度对抗指南 1. 勒索病毒威胁态势与企业防御挑战 2023年全球网络安全报告显示&#xff0c;勒索软件攻击同比增长47%&#xff0c;其中LockBit系列占比高达28%。不同于传统恶意软件&#xff0c;LockBit 3.0采用模块化设计&#…...

Cookie 和 Session 分别存储在客户端还是服务端?

从“存包凭条”到“后台存包柜”&#xff1a;Cookie 与 Session 的存储位置深度剖析1. 引言&#xff1a;超市存包处的“凭条”与“存包柜”2. 前置知识&#xff1a;HTTP 的“健忘症”3. Cookie&#xff1a;客户端的“小凭条”3.1 是什么&#xff1f;3.2 解决什么问题&#xff1…...

AutoJS与按键精灵实战:微信抢红包脚本开发指南(附完整代码)

1. 微信抢红包脚本开发入门指南 最近几年&#xff0c;手机自动化工具越来越受到开发者欢迎&#xff0c;特别是像AutoJS和按键精灵这样的工具&#xff0c;能够帮助我们完成很多重复性的手机操作。今天我要分享的是如何用这些工具开发一个微信抢红包脚本&#xff0c;这个需求在过…...

从Vaihingen数据集到训练样本:高分辨率遥感影像语义分割全流程实战

1. 初识Vaihingen数据集&#xff1a;遥感语义分割的黄金标准 第一次接触Vaihingen数据集时&#xff0c;我被它5厘米的超高分辨率震撼到了。这个由ISPRS提供的基准数据集&#xff0c;虽然只包含38张60006000像素的影像&#xff0c;但每张都清晰地展现了德国小镇Vaihingen的街道、…...

周红伟:OpenClaw 企业级智能体架构与全栈实战

周红伟“世界级 OpenClaw 智能体全栈实战培训方案”。 这套方案融合了架构设计、全链路开发、安全部署与商业落地四大维度&#xff0c;旨在帮助企业团队从“理论认知”跨越到“工程化落地”&#xff0c;构建具备生产级能力的AI智能体系统。 &#x1f680; 培训主题&#xff1a;…...

Wireshark网络协议分析技术与实践指南

1. 网络协议分析技术概述1.1 Wireshark工具简介Wireshark&#xff08;前称Ethereal&#xff09;是目前最主流的开源网络协议分析工具&#xff0c;采用WinPCAP接口直接与网卡进行数据报文交换。该工具支持超过2000种网络协议的解析&#xff0c;能够实时捕获和分析网络数据包。1.…...

【CryptoJS】------CryptoJS版本选择与下载指南

1. CryptoJS简介与版本选择策略 CryptoJS是一个纯JavaScript实现的加密算法库&#xff0c;支持常见的哈希算法&#xff08;如MD5、SHA系列&#xff09;、对称加密&#xff08;如AES、DES&#xff09;和非对称加密&#xff08;如RSA&#xff09;。我在实际项目中使用这个库已有…...

当固体力学遇上AI:Energy-based PINN如何搞定超弹性橡胶材料仿真?

Energy-based PINN&#xff1a;颠覆超弹性材料仿真的无网格革命 橡胶密封圈在高压环境下的变形预测误差超过40%、人工心脏瓣膜材料的疲劳寿命仿真需要72小时计算、柔性电子器件在弯曲状态下的应力分布难以精确建模——这些困扰研究者的难题&#xff0c;正在被一种结合深度学习和…...

实时手机检测模型应用场景:打电话检测、安防监控实战案例

实时手机检测模型应用场景&#xff1a;打电话检测、安防监控实战案例 1. 模型概述与技术优势 1.1 高性能检测框架DAMOYOLO 实时手机检测-通用模型基于DAMOYOLO-S框架开发&#xff0c;这是一种面向工业落地的高性能目标检测解决方案。相比传统YOLO系列方法&#xff0c;DAMOYO…...