IMX6ULL学习笔记(一) —— 寄存器组

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

IMX6ULL 学习笔记


version : v1.0 「2023.4.27」

author: Y.Z.T.


简介: 随记, 关于I.MX6ULL 系统SOC 的部分寄存器




⭐️ 目录





1️⃣ 裸机

简单了解原理

1.1 GUN汇编

1.1.1 与ARM汇编的伪操作差异

image-20230430150223464



1.1.2 常见GUN ARM 伪操作指令
image-20230430150409583

补充数据传输指令

image-20230428122910132



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 )

系统预留的段名

image-20230430151811342



1.1.4 基本数据格式

在定义数据的过程中需要注意 :

  • 二进制 数据通常以0B0b开头
  • 八进制 数据以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 补充

stmdbldmia

  • stmdb和ldmia指令一般配对使用
  • stmdb用于将寄存器压栈
  • ldmia用于将寄存器弹出栈
  • 它们的作用是保存使用到的寄存器

ARM指令的多数据传输(STM、LDM)中,提到:多寄存器的Load和Store指令分为2组:

  • 一组用于数据的存储与读取,对应于IA、IB、DA、DB,
  • 一组用于堆栈操作,对应于FD、ED、FA、EA,
  • STMIB(地址先增而后完成操作)、STMFA(满递增堆栈);LDMIBLDMED
  • STMIA(完成操作而后地址递增)、STMEA(空递增堆栈);LDMIALDMFD
  • STMDB(地址先减而后完成操作)、STMFD(满递减堆栈);LDMDBLDMEA
  • STMDA(完成操作而后地址递减)、STMED(空递减堆栈);LDMDALDMFA

  • IA模式表示:每次传送后地址+4;(After Increase)
  • DB模式表示:每次传送前地址-4;(Before Decrease)

1.2 IO复用表

在《imx6ull 中文参考手册》 199页

image-20230428162002702

image-20230428162114657

image-20230428162132536

image-20230428162148167

image-20230428162217127

image-20230428162232673


可以看见 :

  • 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举例:

    image-20230428164534841

    image-20230428164550307

    • 可以看到GPIO1_IO01可以复用为8种不同功能的IO

  • SW_PAD_CTL_PAD_* : 配置IO口的电气属性

    还是以GPIO1_IO00 举例:

    image-20230428165738791

    • 用于配置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.DRbit0 就是 0)

  • GDIR 寄存器 : 方向寄存器
    • 寄存器中的每一位对应一个IO , 用来设置某个IO的工作方向
    • 如果要设置一个GPIO为输入 , 则对应的位设置为0 (如 : 要设置 GPIO1_IO00 为输入,那么 GPIO1.GDIR=0)
    • 如果要设置一个GPIO为输出 , 则对应的位设置为1

  • PSR 寄存器 : 状态寄存器
    • 寄存器中的每一位对应一个IO , 获取对应GPIO的状态
    • 读取相应的位即可获取对应的 GPIO 的状态,也就是 GPIO 的高低电平值 ( 功能和输入状态下的 DR 寄存器一样。 )

  • ICR1 和 ICR2寄存器 : 中断控制寄存器

    • 寄存器中的每两位对应一个IO , ICR1用于配置低16个GPIO (IO0 ~ IO15) , ICR2 用于配置高 16 个 GPIO ( IO16~ IO31 )

    • 这两个位用来配置中断的触发方式

      举例: 设置GPIO1_IO15为上升沿触发中断 ( GPIO1.ICR1=2<<30 )

      image-20230428173120968


  • IMR 寄存器 : 中断使能寄存器
    • 寄存器中的每一位对应一个IO , 用来控制 GPIO 的中断禁止和使能
    • 如果使能某个 GPIO 的中断,那么设置相应的位为 1 ; ( : 使能 GPIO1_IO00 的中断,那么就可以设置 GPIO1.MIR=1 )
    • 禁止中断 , 则设置相应的位 0

  • ISR 寄存器 : 中断状态寄存器
    • 寄存器中的每一位对应一个IO , 用于判断GPIO 中断是否发生
    • 只要某个 GPIO 的中断发生 , 那么ISR中相应的位就会被置1
    • 在处理完中断之后 , 必须清除中断标志位

  • EDGE_SEL 寄存器 : 边沿选择寄存器
    • 寄存器中的每一位对应一个IO , 用来设置边沿中断
    • 这个寄存器会覆盖 ICR1ICR2 的设置
    • 如果相应的位被 置 1,那么就相当与设置了对应的 GPIO 是 上升沿和下降沿(双边沿) 触发
    • ( 例如 : 设置 GPIO1.EDGE_SEL=1,那么就表示 GPIO1_IO01 是双边沿触中断 )


1.4 CCM时钟控制寄存器 (CCM_CCGRx)

<
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值