当前位置: 首页 > 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…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...