IMX6ULL 学习笔记
version : v1.0 「2023.4.27」
author: Y.Z.T.
简介: 随记, 关于I.MX6ULL 系统SOC 的部分寄存器
⭐️ 目录
文章目录
1️⃣ 裸机
简单了解原理
1.1 GUN汇编
1.1.1 与ARM汇编的伪操作差异

1.1.2 常见GUN ARM 伪操作指令
补充数据传输指令

1.1.3
在
GUN ARM汇编语言中 , 标号_start是汇编程序的入口 , 如果希望这个标号被其他文件引用 , 只需要在定义的地方使用.globa伪操作声明即可 (.globa表示定义一个全局标号 ).globa -start ...
.section 伪操作
可以通过
.section伪操作自定义一个段.section <section name> {,"<flags>"} .section .mysection "awx" @注释 : 定义一个可写、可执行的段 .align 2
- 注意在使用伪操作
.section定义一个段时,每个段以段名开始,以 下一个段名或文件结尾 作为结束标记。- 在定义段名时,注意不要和系统预留的段名冲突,(如
.text、.data、.bss、.rodata)
系统预留的段名
1.1.4 基本数据格式
在定义数据的过程中需要注意 :
- 二进制 数据通常以
0B或0b开头- 八进制 数据以
0开头- 十六进制 数据以
0x开头- 十进制 数据则以
非0数字开头- 负数 前面加
-- 取补 用
~- 不相等 用
〈〉- 其他运算符号如
+、-、*、%、<、<<、\>、>>、|、&、^、!、==、>=、&&与C语言语法相似- 字符串常量 要用双引号
""括起来- 使用
.ascii定义字符串时要自行在结尾加\0.string伪操作可以定义多个字符串.asciz伪操作可以定义一个以NULL字符结尾的字符串- 用
.rept 伪操作可以重复定义数据- 在
GNU ARM汇编程序中经常使用小圆点.表示 当前指令的地址.ascii "hello\0" .string "hello", "world!" .asciz "hello" .rept 3 .byte 0x10 .endr
1.1.5 .equ 伪操作
使用 伪操作 定义浮点数
@标签: 命令 f: .float 3.14 .equ f,3.1415
- 上面通过使用
.float伪操作定义一个浮点数f,并初始化为3.14- 并通过
.equ伪操作 将浮点数重新赋值成3.1415
.equ伪操作除了给数据赋值,还可以把常量定义在代码段中,然后在代码中直接引用。类似C语言中的#define宏定义.section .data .equ DELAY,100 ... .section .text ... MOV R0,$DELAY ...
1.1.6 补充
stmdb和ldmia
- stmdb和ldmia指令一般配对使用
- stmdb用于将寄存器压栈
- ldmia用于将寄存器弹出栈
- 它们的作用是保存使用到的寄存器
ARM指令的多数据传输(STM、LDM)中,提到:多寄存器的Load和Store指令分为2组:
- 一组用于数据的存储与读取,对应于IA、IB、DA、DB,
- 一组用于堆栈操作,对应于FD、ED、FA、EA,
STMIB(地址先增而后完成操作)、STMFA(满递增堆栈);LDMIB、LDMED;STMIA(完成操作而后地址递增)、STMEA(空递增堆栈);LDMIA、LDMFD;STMDB(地址先减而后完成操作)、STMFD(满递减堆栈);LDMDB、LDMEA;STMDA(完成操作而后地址递减)、STMED(空递减堆栈);LDMDA、LDMFA。
IA模式表示:每次传送后地址+4;(After Increase)DB模式表示:每次传送前地址-4;(Before Decrease)
1.2 IO复用表
在《imx6ull 中文参考手册》 199页






可以看见 :
- GPIO1 有 32 个 IO
- GPIO2 有 22 个 IO
- GPIO3 有 29 个 IO
- GPIO4 有 29 个 IO
- GPIO5 有 12 个 IO
1.3 复用为GPIO时的寄存器
1.3.1 IO复用功能和IO电气属性
-
SW_MUX_CTL_PAD_*: 配置IO口的复用功能以
GPIO1_IO1举例:

- 可以看到
GPIO1_IO01可以复用为8种不同功能的IO
- 可以看到
-
SW_PAD_CTL_PAD_*: 配置IO口的电气属性还是以
GPIO1_IO00举例:
- 用于配置
IO的 上下拉电阻、IO速度、IO驱动能力、压摆率等电气属性 - 一般主要设置压摆率 (SRE)、驱动能力 (DSE)、速度 (SPEED )、上下拉 ( PUS)、 开漏 (ODE)
- 用于配置
1.3.2 复用为GPIO时其他寄存器
- DR寄存器: 数据寄存器
- 寄存器中的每一位对应一个IO
- 当 GPIO 被配置为输出功能 以后 , 向指定的位写入数据那么相应的 IO 就会输出相应的高低电平 ( 如 :
GPIO1_IO00输出高电平,那么就应该设置GPIO1.DR=1) - 当 GPIO 被配置为输出功能 以后 , 此寄存器就保存着对应 IO 的电平值 (如 : 当
GPIO1_IO00这个引脚接地的话,那么GPIO1.DR的bit0就是 0)
- GDIR 寄存器 : 方向寄存器
- 寄存器中的每一位对应一个IO , 用来设置某个IO的工作方向
- 如果要设置一个GPIO为输入 , 则对应的位设置为0 (如 : 要设置
GPIO1_IO00为输入,那么GPIO1.GDIR=0) - 如果要设置一个GPIO为输出 , 则对应的位设置为1
- PSR 寄存器 : 状态寄存器
- 寄存器中的每一位对应一个IO , 获取对应
GPIO的状态 - 读取相应的位即可获取对应的 GPIO 的状态,也就是 GPIO 的高低电平值 ( 功能和输入状态下的
DR寄存器一样。 )
- 寄存器中的每一位对应一个IO , 获取对应
-
ICR1 和 ICR2寄存器 : 中断控制寄存器
-
寄存器中的每两位对应一个IO ,
ICR1用于配置低16个GPIO (IO0 ~ IO15) , ICR2 用于配置高 16 个 GPIO ( IO16~ IO31 ) -
这两个位用来配置中断的触发方式
举例: 设置
GPIO1_IO15为上升沿触发中断 (GPIO1.ICR1=2<<30)
-
- IMR 寄存器 : 中断使能寄存器
- 寄存器中的每一位对应一个IO , 用来控制 GPIO 的中断禁止和使能
- 如果使能某个 GPIO 的中断,那么设置相应的位为 1 ; ( 如: 使能
GPIO1_IO00的中断,那么就可以设置GPIO1.MIR=1) - 禁止中断 , 则设置相应的位 0
- ISR 寄存器 : 中断状态寄存器
- 寄存器中的每一位对应一个IO , 用于判断
GPIO中断是否发生 - 只要某个 GPIO 的中断发生 , 那么ISR中相应的位就会被置1
- 在处理完中断之后 , 必须清除中断标志位
- 寄存器中的每一位对应一个IO , 用于判断
- EDGE_SEL 寄存器 : 边沿选择寄存器
- 寄存器中的每一位对应一个IO , 用来设置边沿中断
- 这个寄存器会覆盖
ICR1和ICR2的设置 - 如果相应的位被 置 1,那么就相当与设置了对应的 GPIO 是 上升沿和下降沿(双边沿) 触发
- ( 例如 : 设置
GPIO1.EDGE_SEL=1,那么就表示GPIO1_IO01是双边沿触中断 )

本文详细介绍了IMX6ULL处理器的裸机编程,包括GUNARM汇编的伪操作,如.global、.section、.equ等,并深入探讨了IO复用表、GPIO寄存器配置以及CCM时钟控制寄存器。内容涵盖GPIO的配置、时钟树结构以及裸机程序的构建过程,如镜像向量表、BootData和DCD数据。此外,还提供了点灯测试的启动文件和源代码示例。

最低0.47元/天 解锁文章
1650

被折叠的 条评论
为什么被折叠?



