嵌入式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卡启动,按下复位键
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

经典循环神经网络(一)RNN及其在歌词数据集上的应用

经典循环神经网络(一)RNN及其在歌词数据集上的应用 1 RNN概述 在深度学习兴起之前&#xff0c;NLP领域一直是统计模型的天下&#xff0c;例如词对齐算法GIZA&#xff0c;统计机器翻译开源框架MOSES等等。在语言模型方向&#xff0c;n-gram是当时最为流行的语言模型方法。n-gr…

计算机竞赛 题目:基于卷积神经网络的手写字符识别 - 深度学习

文章目录 0 前言1 简介2 LeNet-5 模型的介绍2.1 结构解析2.2 C1层2.3 S2层S2层和C3层连接 2.4 F6与C5层 3 写数字识别算法模型的构建3.1 输入层设计3.2 激活函数的选取3.3 卷积层设计3.4 降采样层3.5 输出层设计 4 网络模型的总体结构5 部分实现代码6 在线手写识别7 最后 0 前言…

【uniapp】小程序开发6:自定义状态栏

一、自定义状态栏 可以设置某个页面的状态栏自定义或者全局状态栏自定义。 这里以首页状态栏为例。 1&#xff09;pages.json 中配置"navigationStyle": "custom"&#xff0c;代码如下&#xff1a; {"pages": [ {"path": "pa…

Bridge Champ助力我国桥牌阔步亚运, Web3游戏为传统项目注入创新活力

本届杭州亚运会,中国桥牌队表现杰出,共斩获1金1银1铜佳绩,其中女子团体夺得冠军,混合团体获得亚军。这充分展现了我国桥牌的实力,也彰显了桥牌作为亚运会体育竞技项目的影响力。与此同时,Web3游戏Bridge Champ为传统桥牌项目带来创新模式,将有望推动桥牌运动在亚运舞台上焕发新…

SpringMVC的请求映射:路由请求的精准导航

SpringMVC的请求映射&#xff1a;路由请求的精准导航 SpringMVC是一个用于构建Web应用程序的强大框架&#xff0c;它提供了众多的特性和组件来简化开发过程。其中&#xff0c;请求映射是SpringMVC中的一个关键特性&#xff0c;用于将HTTP请求映射到具体的处理方法。本文将深入…

【Python】基于OpenCV人脸追踪、手势识别控制的求生之路FPS游戏操作

【Python】基于OpenCV人脸追踪、手势识别控制的求生之路FPS游戏操作 文章目录 手势识别人脸追踪键盘控制整体代码附录&#xff1a;列表的赋值类型和py打包列表赋值BUG复现代码改进优化总结 py打包 视频&#xff1a; 基于OpenCV人脸追踪、手势识别控制的求实之路FPS游戏操作 手…

Mysql 分布式序列算法

接上文 Mysql分库分表 1.分布式序列简介 在分布式系统下&#xff0c;怎么保证ID的生成满足以上需求&#xff1f; ShardingJDBC支持以上两种算法自动生成ID。这里&#xff0c;使用ShardingJDBC让主键ID以雪花算法进行生成&#xff0c;首先配置数据库&#xff0c;因为默认的注…

BootstrapBlazor企业级组件库:前端开发的革新之路

作为一名Web开发人员&#xff0c;开发前端我们一般都是使用JavaScript&#xff0c;而Blazor就是微软推出的基于.Net平台交互式客户Web UI 框架&#xff0c;可以使用C#替代JavaScript&#xff0c;减少我们的技术栈、降低学习前端的成本。 而采用Blazor开发&#xff0c;少不了需…

React核心原理与实际开发

学习目标 React是啥&#xff1f; 官方定义&#xff1a;将前端请求获取到的数据渲染为HTML视图的JavaScript库。 一、React入门 1、React项目创建 直接创建react&#xff0c;使用初始化会创建package.json npm init -y再安装 2、React基本使用 使用纯JS创建ReactDOM&#…

Flink学习笔记(二):Flink内存模型

文章目录 1、配置总内存2、JobManager 内存模型3、TaskManager 内存模型4、图形化展示5、实际案例计算内存分配 1、配置总内存 Flink JVM 进程的进程总内存&#xff08;Total Process Memory&#xff09;包含了由 Flink 应用使用的内存&#xff08;Flink 总内存&#xff09;以…

iTunes更新iOS17出现发生未知错误4000的原因和解决方案

有不少人使用iTunes更新iOS 17时出现「无法更新iPhone发生未知的错误4000」的错误提示&#xff0c;不仅不知道iTunes升级失败的原因&#xff0c;也无从解决iPhone无法更新4000的问题。 小编今天就分享iPhone更新iOS系统出现4000错误提示的原因和对应的解决方案。 为什么iPhone…

MySQL Cluster 简介

文章目录 1.简介2.组成参考文献 1.简介 MySQL Cluster 是官方推出的基于 NDB&#xff08;Network DataBase&#xff09;存储引擎的高可用和可伸缩的分布式数据库系统。 以下是 MySQL NDB Cluster 的主要特点和能力&#xff1a; 高可用&#xff1a;MySQL Cluster 具有内置的高…

Python大数据之PySpark(七)SparkCore案例

文章目录 SparkCore案例PySpark实现SouGou统计分析 总结后记 SparkCore案例 PySpark实现SouGou统计分析 jieba分词&#xff1a; pip install jieba 从哪里下载pypi 三种分词模式 精确模式&#xff0c;试图将句子最精确地切开&#xff0c;适合文本分析&#xff1b;默认的方…

洗地机怎么选?2023年洗地机推荐

洗地机结合洗地、拖地、扫地的功能&#xff0c;在日常生活中备受关注&#xff0c;他能帮助我们更加节省时间和节省体力&#xff0c;但是面对参差不齐的洗地机市场如何选到适合自己的呢&#xff0c;下文整理了几款非常值得入手的性价比型号&#xff0c;供大家选择参考。 一、CE…

C++Day2

#include <iostream>using namespace std;class Rect { private:int width;int height; public:void init(int w,int h){width w;height h;}void set_w(int w){width w;}void set_h(int h){height h;}void show(){cout << "矩形的周长为&#xff1a;"…

Java数组:没错,不装了我就是书架。

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、数组的概念1、什么是数组&#xff1f;2、数组的创建3、数组的初始化Ⅰ、动态初始化Ⅱ、静态初始化 二、数组的使用1、数组中…

Windows系统上使用CLion远程开发Linux程序

CLion远程开发Linux程序 情景说明Ubuntu配置CLion配置同步 情景说明 在Windows系统上使用CLion开发Linux程序&#xff0c;安装CLion集成化开发环境时会自动安装cmake、mingw&#xff0c;代码提示功能也比较友好。 但是在socket开发时&#xff0c;包含sys/socket.h头文件时&am…

【Java-LangChain:使用 ChatGPT API 搭建系统-4】评估输入-分类

第三章&#xff0c;评估输入-分类 如果您正在构建一个允许用户输入信息的系统&#xff0c;首先要确保人们在负责任地使用系统&#xff0c;以及他们没有试图以某种方式滥用系统&#xff0c;这是非常重要的。 在本章中&#xff0c;我们将介绍几种策略来实现这一目标。 我们将学习…

【yolo系列:YOLOV7改进-添加EIOU,SIOU,AlphaIOU,FocalEIOU.】

yolo系列文章目录 在YoloV7中添加EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU. 2023-2-7 更新 yolov7添加Wise-IoUB站链接 重磅&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; YOLO系列模型改进损失函数 文章目录 yolo系列文章目录一、初始的yolov7损失函数二、首…

7346-2015 控制电机基本外形结构型式

声明 本文是学习GB-T 7346-2015 控制电机基本外形结构型式.pdf而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了控制电机的机座号、外形及安装尺寸、轴伸型式、出线方式、标记及铭牌。 本标准适用于各类控制电机(以下简称电机),其…