I.MX6U 裸机开发2. 芯片简介、汇编基础及GPIO操作准备工作

I.MX6U 裸机开发2. 芯片简介、汇编基础及GPIO操作准备工作

  • 一、I.MX6U 芯片介绍
    • 1. 基本介绍
    • 2. 架构图如下:
    • 3. I.MX6U 管脚定义规则 :
  • 二、GPIO资源介绍
    • 1. 原理图
    • 2. 寄存器控制
      • (1) 使能时钟,CCGR0~CCGR7
      • (2) 设置引脚复用
      • (3) 设置电气属性
      • (4) 配置GPIO功能 ,设置输入输出
  • 三、汇编介绍
    • 1. GNU 汇编语法介绍
    • 2. ARM Context-A7 常用的通用寄存器
      • CPSR介绍
    • 3. Context-A处理器运行模式
    • 4. Cortext-A7常用汇编指令
      • (1) 数据处理指令
      • (2) 数据传输指令(存储器访问)
      • (3) 分支指令
      • (4) 逻辑运算指令
      • (5) 移位指令
      • (6) 条件执行
      • (7) 出栈和入栈

一、I.MX6U 芯片介绍

1. 基本介绍

官网地址:
https://www.nxp.com/products/processors-and-microcontrollers/arm-processors/i-mx-applications-processors:IMX_HOME
点击: 在这里插入图片描述

在这里插入图片描述
根据其官网介绍:
i.MX 6ULL 是一个高能效且成本优化的应用处理器系列,采用单个 Arm Cortex-A7 内核的高级实现,运行速度高达 900 MHz。i.MX 6ULL 应用处理器包括一个集成的电源管理模块,可降低外部电源的复杂性并简化电源排序。该系列中的每个处理器都提供各种内存接口,包括 16 位 LPDDR2、DDR3、DDR3L、原始和托管 NAND 闪存、NOR 闪存、eMMC、Quad SPI 以及用于连接外围设备(如 WLAN、蓝牙、GPS、显示器和摄像头传感器)的各种其他接口。

2. 架构图如下:

在这里插入图片描述

基本情况如下:

  • CPU采用ARM A7架构
  • 一级缓存的ICache(Instruction Cache指令缓存):32K
  • 一级缓存的DCache(Data Cache数据缓存):32K
  • 二级缓存:128K
  • NEON模块,用于ARM处理器的高级SIMD扩展,提供了加速多媒体和信号处理应用的能力
  • 多媒体能力,如摄像头、可编程的处理单元等
  • 24位并行CSI能力
  • 24位并行LCD能力
  • 扩展存储,支持NOR Flash,4线SPI Flash,16位的LP-DDR2/DDR3/DDR3L
  • 外设支持eMMC,NAND,UART8,SPI4,PC4,88 Keypad,GPIO,I2S,FlexCAN*2,S/PDIF Tx/Rx,USB2 OTG w/PHY *2,网口,ESAI
  • JTAG,PLL.OSC,RTC,Smart DMA, IOMUX,Timer4, PWM8,Watch Dog2,LDO,ADC2
  • 内部存储 96KROM, 128KRAM

数据手册可以在官网下载,已放在本系列博文能应开源仓库。

比较重要的是应用参考手册,由于官网下载时需要填写一些资料,为防止版权问题,开源仓库没有放这个文档,可从官网自行下载 。

3. I.MX6U 管脚定义规则 :

在这里插入图片描述
管脚定义示例:
IOMUXC_SNVS_SW_MUX_CTL_PAD_BOOT_MODE0
其名称为 PAD_BOOT_MODE0,MUX表示复用,可以在文档找到下图所示部分:
在这里插入图片描述

找到:IOMUXC_SNVS_SW_MUX_CTL_PAD_BOOT_MODE0章节里的复用功能说明。

在 IOMUXC_SNVS_SW_PAD_CTL_PAD_BOOT_MODE0 查看管脚的电气属性。

二、GPIO资源介绍

本章节为操作LED作一些准备工作。

1. 原理图

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

2. 寄存器控制

GPIO功能图:
在这里插入图片描述

开发板的LED0 接的GPIO3引脚,要对IO引脚初始化,需要以下步骤:

(1) 使能时钟,CCGR0~CCGR7

(2) 设置引脚复用

在这里插入图片描述
即将 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 bit3~0设置为0x0101。

(3) 设置电气属性

在这里插入图片描述
其中:

  • bit0:SRE,压摆率(电平跳变速率),0是低压摆率,1是高压摆率。
  • bit5~3:DSE,IO口作为输出时的驱动能力,驱动能力通常使用等效电阻来表示,在3.3V下,R0是260欧,1.8V下R0是150欧,接DDR时是240欧。

等效电阻表示了IO口在输出高电平或低电平时的驱动能力,较低的等效电阻意味着更强的驱动能力,可以提供更大的电流。

  • bit7~6:SPEED速度
  • bit11: ODE,1是开漏输出
  • bit12:PKE,上拉保持 ,在输入引脚上连接一个上拉电阻。
  • bit13:PUE,上拉使能
  • bit15~14:PUS 上拉/下拉配置,可以选择上拉电阻的强度和配置
  • bit16:Hyst. Enable,迟滞使能,滞后现象常见于比较器和施密特触发器等器件中。通过引入滞后,可以确保输出信号在输入信号达到一定阈值后才发生变化,并且在输入信号回到另一阈值之前不会恢复,从而避免输出信号的抖动。

(4) 配置GPIO功能 ,设置输入输出

相关的寄存器:

  1. GPIOx_DR(Data Register):用于读写 GPIO 引脚的电平状态。
  2. GPIOx_GDIR(Direction Register):用于设置 GPIO 引脚的方向(输入或输出)。
  3. GPIOx_PSR(Pad Status Register):用于读取 GPIO 引脚的当前状态。
  4. GPIOx_ICR1/ICR2(Interrupt Configuration Registers):用于配置 GPIO 引脚的中断触发方式。
  5. GPIOx_IMR(Interrupt Mask Register):用于使能或屏蔽 GPIO 引脚的中断。
  6. GPIOx_ISR(Interrupt Status Register):用于读取和清除 GPIO 引脚的中断状态。
  7. GPIOx_EDGE_SEL(Edge Select Register):用于选择 GPIO 引脚的边沿触发方式。

具体设置步骤:

  1. GPIO1_DR的bit3设置为1,即输出模式;
  2. GPIO1_DR的bit3设置为1,输出高电平;

三、汇编介绍

大部分Cortext-A芯片,上电时C语言的运行环境未准备好,需要使用汇编进行一些初始化工作。

1. GNU 汇编语法介绍

GNU 汇编(GAS,GNU Assembler)是 GNU 工具链的一部分,使用 AT&T 语法。以下是一些基本的 GNU 汇编语法介绍:

  1. 指令格式

    • 操作码在前,操作数在后。
    • 操作数用逗号分隔,源操作数在前,目标操作数在后。
  2. 寄存器

    • 寄存器名称以 % 开头,例如 %eax%ebx
  3. 立即数

    • 立即数以 $ 开头,例如 $5$0x10
  4. 内存操作

    • 内存地址用 () 表示,例如 (%eax) 表示寄存器 %eax 指向的内存地址。
  5. 注释

    • 单行注释以 # 开头。

以下是一个简单的示例,展示了基本的 GNU 汇编语法:

.section .text
.global _start                   # 声明一个全局标号

_start:
    # 初始化堆栈指针
    ldr sp, =_stack_top

    # 初始化中断向量表
    ldr r0, =_vector_table
    ldr r1, =0x00000000
    str r0, [r1]

    # 清除 BSS 段
    ldr r0, =_bss_start
    ldr r1, =_bss_end
    mov r2, #0
clear_bss:
    cmp r0, r1
    strlo r2, [r0], #4
    blo clear_bss

    # 初始化数据段
    ldr r0, =_data_load
    ldr r1, =_data_start
    ldr r2, =_data_end
copy_data:
    cmp r1, r2
    ldrlo r3, [r0], #4
    strlo r3, [r1], #4
    blo copy_data

    # 跳转到 C 语言的 main 函数
    bl main

    # 死循环,防止返回
hang:
    b hang

.section .bss
_bss_start:
    .space 1024
_bss_end:

.section .data
_data_load:
    .word 0x12345678
_data_start:
    .space 4
_data_end:

.section .stack
_stack_top:
    .space 1024

.section .vector_table
_vector_table:
    .word _start

这个示例展示了如何使用 GNU 汇编语法编写一个简单的程序,该程序将 “Hello, World!” 消息写入标准输出并退出。

2. ARM Context-A7 常用的通用寄存器

  • R0-R12:这些是通用寄存器,可以用于任意数据操作。
  • R13 (SP):堆栈指针寄存器,用于指向当前堆栈的顶部。
  • R14 (LR):链接寄存器,用于存储子程序调用的返回地址。
  • R15 (PC):程序计数器寄存器,用于存储当前指令的地址。
  • CPSR:用于存储当前程序的状态信息。
  • SPSR:用于保存异常处理时的程序状态(备份程序状态寄存器)。

CPSR介绍

CPSR(Current Program Status Register)是 ARM 处理器中的一个重要寄存器,用于存储当前程序的状态信息。CPSR 包含以下几个主要字段:

  • N(Negative flag): 表示上一次运算结果为负。
  • Z(Zero flag): 表示上一次运算结果为零。
  • C(Carry flag): 表示上一次运算产生了进位或借位。
  • V(Overflow flag): 表示上一次运算产生了溢出。
  • Q(Saturation flag): 表示饱和运算的状态。
  • I(IRQ disable bit): 用于屏蔽 IRQ 中断。
  • F(FIQ disable bit): 用于屏蔽 FIQ 中断。
  • T(Thumb state bit): 表示处理器是否在 Thumb 状态下运行。
  • M[4:0](Mode bits): 表示当前处理器模式。

下面是使用 ARM 汇编指令读取和修改 CPSR的示例:

# 读取 CPSR 到通用寄存器 r0
MRS r0, CPSR

# 修改 CPSR 的模式位,将处理器切换到 Supervisor 模式
BIC r0, r0, #0x1F      # 清除模式位
ORR r0, r0, #0x13      # 设置模式位为 Supervisor 模式
MSR CPSR_c, r0         # 写回 CPSR

3. Context-A处理器运行模式

  • Cortex-A 处理器支持多种处理器模式,每种模式用于不同的操作场景:
  • User mode: 普通程序运行的模式。
  • FIQ mode: 快速中断请求模式,用于处理高优先级中断。
  • IRQ mode: 普通中断请求模式,用于处理一般中断。
  • Supervisor mode: 操作系统内核运行的模式。
  • Abort mode: 数据或指令访问失败时进入的模式。
  • Undefined mode: 未定义指令异常时进入的模式。
  • System mode: 特权模式,通常用于操作系统。
    不同运行模式下使用的寄存器有所不同,如下表所示:
    在这里插入图片描述

4. Cortext-A7常用汇编指令

(1) 数据处理指令

MOV     r0, r1           # 将寄存器 r1 中的数据传递到寄存器 r0
MOV     r0, #1          # 将立即数 1 移动到寄存器 r0
ADD     r1, r0, r2      # 将 r0 和 r2 相加,结果存储在 r1 中
SUB     r3, r1, #4      # 将 r1 减去立即数 4,结果存储在 r3 中
MUL     r4, r2, r3      # 将 r2 和 r3 相乘,结果存储在 r4 中
MRS r0, CPSR        # 将当前程序状态寄存器 (CPSR) 的值移动到通用寄存器 r0
MSR CPSR, r1        # 将通用寄存器 r1 的值移动到当前程序状态寄存器 (CPSR)

(2) 数据传输指令(存储器访问)

LDR     r5, [r6]        # 从内存地址 r6 处加载数据到 r5
STR     r7, [r8]        # 将 r7 中的数据存储到内存地址 r8 处
LDMIA   r9!, {r0-r3}    # 从内存地址 r9 开始加载多个寄存器,地址递增
STMIA   r10!, {r4-r7}   # 将多个寄存器存储到内存地址 r10 开始,地址递增

LDR和STR按字操作(32bit),指令后面加B是按字节操作,加H是按半字操作。

(3) 分支指令

B       label              # 无条件跳转到 label
BL      subroutine    # 跳转到子程序 subroutine,并保存返回地址到链接寄存器 (LR)
BX      lr                  # 跳转到链接寄存器 (LR) 中的地址,通常用于从子程序返回
BEQ     label           # 如果上一次操作结果为零,则跳转到 label
BNE     label           # 如果上一次操作结果不为零,则跳转到 label

(4) 逻辑运算指令

AND     r0, r1, r2      # 将 r1 和 r2 进行按位与操作,结果存储在 r0 中
ORR     r3, r4, r5      # 将 r4 和 r5 进行按位或操作,结果存储在 r3 中
EOR     r6, r7, r8      # 将 r7 和 r8 进行按位异或操作,结果存储在 r6 中
BIC     r9, r10, r11    # 将 r10 和 r11 进行按位与非操作,结果存储在 r9 中

(5) 移位指令

LSL     r0, r1, #2      # 将 r1 左移 2 位,结果存储在 r0 中
LSR     r2, r3, #3      # 将 r3 右移 3 位,结果存储在 r2 中
ASR     r4, r5, #1      # 将 r5 算术右移 1 位,结果存储在 r4 中
ROR     r6, r7, #4      # 将 r7 循环右移 4 位,结果存储在 r6 中

(6) 条件执行

ADDEQ   r0, r1, r2      # 如果上一次操作结果为零,则将 r1 和 r2 相加,结果存储在 r0 中
SUBNE   r3, r4, r5      # 如果上一次操作结果不为零,则将 r4 和 r5 相减,结果存储在 r3 中

(7) 出栈和入栈

PUSH {r0, r1, r2}  # 将寄存器 r0, r1 和 r2 的内容保存到堆栈中
POP {r0, r1, r2}  # 从堆栈中恢复寄存器 r0, r1 和 r2 的内容

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DNS配置

1.搭建dns服务器能够对自定义的正向或者反向域完成数据解析查询。 2.配置从DNS服务器,对主dns服务器进行数据备份。 options {listen-on port 53 { 192.168.111.130; };directory "/var/named";allow-query { any;};zone "openlab.com&qu…

day-81 打家劫舍 II

思路 与LCR 089. 打家劫舍相比,本题所有房屋围成了一圈,那么第一间房子和最后一间房子不能同时打劫,那么就可以分为两种情况:1.选第一间房打劫;2.选最后一间房打劫 解题过程 然后依次计算出以上两种情况的最大金额&am…

什么是进销存?进销存系统都有哪些类型?

进销存管理和企业运营之间的利害关系大家应该都已经听的不少了。上次给大家说明白了进销存系统是什么,但是进销存系统到底有哪几种?把今天这篇文章耐心读完你就懂了! 随着市场竞争的加剧和消费者需求的多样化,企业亟需灵活高效的…

spark的学习-03

RDD的创建的两种方式: 方式一:并行化一个已存在的集合 方法:parallelize 并行的意思 将一个集合转换为RDD 方式二:读取外部共享存储系统 方法:textFile、wholeTextFile、newAPIHadoopRDD等 读取外部存储系统的数…

Python练习10

Python日常练习 题目: 编写程序,输出如下所示图案。 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 要求: 使用for循环的方式完成 --------------------------------------------------------- 注意: …

【云原生开发】K8S多集群资源管理平台架构设计

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

「iOS」——知乎日报一二周总结

知乎日报仿写 前言效果Manager封装网络请求线程冲突问题下拉刷新添加网络请求的图片通过时间戳和日期格式化获取时间 总结 前言 前两周内容的仿写,主要完成了首页的仿写,进度稍慢。 效果 Manager封装网络请求 知乎日报的仿写需要频繁的申请网络请求&am…

【ArcGISPro】汉化嵌入的NoteBook界面

效果展示 下载Notebook汉化包 pip install jupyterlab-language-pack-zh-CN 添加环境变量 LANG zh_CN.UTF8 汉化结果

长亭那个检测能力超强的 WAF,出免费版啦

告诉你们一个震撼人心的消息,那个检测能力超强的 WAF——长亭雷池,他推出免费社区版啦,体验地址见文末。 八年前我刚从学校毕业,在腾讯做安全研究,看到宇森在 BlackHat 上演讲的议题 《永别了,SQL 注入》 …

了解bootstrap改造asp.net core MVC的样式模板

我们都知道,在使用默认的asp.net core MVC模板建立项目的时候,里面的样式是已经事先被写好了的。一般来说都在css目录下的site.css和bootstrap.css及下面的bootstrap.min.css中。我们打开bootstrap这些样式文件,里面有大量的样式类的定义&…

scratch计算台阶 2024年9月scratch四级真题 中国电子学会 图形化编程 scratch四级真题和答案解析

目录 scratch计算台阶 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、p…

数据结构之二叉树前序,中序,后序习题分析(递归图)

1.比较相同的树 二叉树不能轻易用断言,因为树一定有空 2.找结点值 3.单值二叉树 4.对称二叉树 5.前序遍历

mysql死锁查看和解决

文章目录 一、MySQL死锁排查1、查看正在进行中的事务2、查看正在锁的事务3、查看等待锁的事务4、查询是否锁表5、查看最近死锁的日志6、杀死死锁 本文是基于Mysql8.0进行讲解。 本文只讲解如何查询数据库中是否有死锁及死锁的解决,若想了解更多关于死锁的信息&…

【STM32笔记】定时器(TIM1)无法工作

目录 项目场景: 问题描述 原因分析: 解决方案: 项目场景: 编译环境:keil uverison5 初次学习stm32(stm32f103xx)控制舵机(mg90s)时,舵机不转动&#xf…

Spark 程序开发与提交:本地与集群模式全解析

Spark 的介绍与搭建:从理论到实践-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 目录 一、本地开发与远程提交测试 (一)问题背景 (二)解决方案 集群环境准…

利用亚马逊AWS IoT核心和MQTT进行数据采集的综合指南

论文标题:A Comprehensive Guide on Data Acquisition Utilizing Amazon AWS IOT Core and MQTT 中文标题:利用亚马逊AWS IoT核心和MQTT进行数据采集的综合指南 作者信息: Tanishq. I. KohliPradip R. Selokar 两位作者均来自印度那格浦尔…

鸿萌数据迁移服务: 企业服务器整机在线热迁移, 实现不停机业务转移

天津鸿萌科贸发展有限公司从事数据安全服务二十余年,致力于为各领域客户提供专业的数据存储、数据恢复、数据备份、数据迁移等解决方案与服务,并针对企业面临的数据安全风险,提供专业的相关数据安全培训。 鸿萌数据迁移业务为众多企业顺利高效…

软件工程笔记一

目录 软件的概念、特性和分类 软件与程序 软件的特性 软件的分类 软件危机与软件工程 软件危机 如何摆脱软件危机? 软件工程概念的提出 什么是软件工程? 软件工程的若干定义 系统工程的目标 软件工程的基本原理 软件工程的目标 软件的质量特性 软件生存…

使用VS Code 安装VUE.js开发环境的搭建并创建第一个项目

初步掌握VUE.js开发环境的搭建并创建第一个项目的操作方法和实验步骤 题目 安装Visual Studio Code。安装VS Code汉化插件。安装Vue官方支持插件。使用VS Code运行第一个HTML页面。安装Node.js并验证其版本。验证npm版本。配置npm的下载镜像源。配置Yarn的下载镜像源。使用Vi…

Java | Leetcode Java题解之第541题反转字符串II

题目&#xff1a; 题解&#xff1a; class Solution {public String reverseStr(String s, int k) {int n s.length();char[] arr s.toCharArray();for (int i 0; i < n; i 2 * k) {reverse(arr, i, Math.min(i k, n) - 1);}return new String(arr);}public void reve…