文章目录
- 一、原理分析
- 1.1 对于IMX6ULL的IO初始化
- 1.2 IO的复用(MUX)
- 1.3 电气属性寄存器(PAD)
- 1.3.1 SRE(bit0)
- 1.3.2 DSE(bit5:3)
- 1.3.3 SPEED(bit7:6)
- 1.3.4 ODE(bit11)
- 1.3.5 PKE(bit12)
- 1.3.6 PUE(bit13)
- 1.3.7 PUS(bit15:14)
- 1.3.8 HYS(bit16)
- 1.4 配置GPIO
- 二、汇编补充
- 三、驱动编写
- 3.1 使能CCGR
- 3.2 选择复用方式
一、原理分析
初始化一些SOC外设,
SOC外设通常包括但不限于以下几种:存储器管理单元(MMU)、通用输入/输出(GPIO)接口、并行和串行接口(如USB、SPI、I2C等)、定时器和计数器、中断控制器、模拟和数字信号处理模块等。
初始化DDR ,IMX6ULL、一般将SP指针指向DDR、设置好C语言环境
1.1 对于IMX6ULL的IO初始化
使能时钟,CCGR0 ~ CCGR6这7个寄存器控制着IMX6ULL所有外设时钟的使能。为了简单,设置CCGR0 ~ CCGR6这7个寄存器全部为OXFFFFFFFF.相当于使能所有外设时钟。
一个有两位,当都设为11,是即全部使能,当7个都是11时,即全部使能
1.2 IO的复用(MUX)
寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
首先根据LED所在端口时GPIO1_3,确定端口号,之后查看参考手册寻找复用
只有右下角的4位是对于模式进行选择
每一个值,就是一种模式,设置为0101=5,就复用为GPIO了
1.3 电气属性寄存器(PAD)
寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
是设置GPIO3的电气属性,包括压摆率、速度、驱动能力、开漏、上下拉等
1.3.1 SRE(bit0)
SRE是设置压摆率,,设置压摆率,当此位为0的时候是低压摆率,当为1的时候是高压摆率。这里的压摆率就是 IO电平跳变所需要的时间,比如从0到1需要多少时间,时间越小波形就越陡,说明压摆率越高;反之,时间越多波形就越缓,压摆率就越低。如果你的产品要过 EMC的话那就可以使用小的压摆率,因为波形缓和,如果你当前所使用的 IO做高速通信的话就可以使用高压摆率。
由于不要过EMC检测,所以设置为0
1.3.2 DSE(bit5:3)
用来设置 IO的驱动能力,
位数字越大,电阻越小,驱动能力越强
1.3.3 SPEED(bit7:6)
当IO用作输出,SPEED就是设置IO速度
1.3.4 ODE(bit11)
当 IO作为输出的时候,此位用来禁止或者使能开路输出,此位为0的时候禁止开路输出, 当此位为1的时候就使能开路输出功能。
1.3.5 PKE(bit12)
此位用来使能或者禁止上下拉 /状态保持器功能,为0时禁止上下拉 /状态保持器,为 1时使能上下拉和状态保持器。
1.3.6 PUE(bit13)
作为输入的时候,这个位用来设置 IO使用上下拉还是状态保持器。当为 0的时候使用状态保持器,当为 1的时候使用上下拉。状态保持器在
1.3.7 PUS(bit15:14)
设置上拉和下拉
1.3.8 HYS(bit16)
迟滞比较器(没看懂)
在整理这些电气属性时,不需要全部搞懂
1.4 配置GPIO
配置输入输出
设置GP1O_DR寄存器bit3为1.也就是设置为输出模式。设置GPIO_DR寄存器的bit3.为1表示输出高电平,为0表示输出低电平。·
二、汇编补充
对于MOV,MOVS以及LDR和STR是最常用的
LDR是,可以将一个地址进行保存(可以用立即数表达地址,然后这段地址的别名就是寄存器Rx中,而LDR中,[Rx],表示取值,即Rx表示地址,[Rx]表示这个地址上所存储的值)
STR指令就是写入,
STR R1, [R0] @表示R1的值写入R0所在地址中,也即覆盖了[R0]原本的值
这段汇编就是 a=b
解释一下:
第一行:将B的地址立即数,存入R0
第二行:读取B地址的数放入R1
第三行:将A的地址立即数,存入R0
第四行:将R1(此时不用中括号)中的值写入R0(R0需要中括号)
三、驱动编写
3.1 使能CCGR
首先打开linux操作系统,创建文件夹、工作区。
之后根据的原理分析
的步骤写汇编
第一步就是把,CCGR的寄存器全部使能,需要找到地址,进入参考手册18章,找到
ldr r0, =0x020C4068 @写入CCGR0的地址
ldr r1, =0xFFFFFFFF @要写入的数据(全部使能)
str r1, [r0] @写入CCGR0
ldr r0, =0x020C406C @写入CCGR1的地址(由于CCGR都是紧挨着的,每个间隔4位)
str r1, [r0] @写入CCGR1
ldr r0, =0x020C4070 @写入CCGR2的地址
str r1, [r0] @写入CCGR2
ldr r0, =0x020C4074 @写入CCGR3的地址
str r1, [r0] @写入CCGR3
ldr r0, =0x020C4078 @写入CCGR4的地址
str r1, [r0] @写入CCGR4
ldr r0, =0x020C407C @写入CCGR5的地址
str r1, [r0] @写入CCGR5
ldr r0, =0x020C4080 @写入CCGR6的地址
str r1, [r0] @写入CCGR6
3.2 选择复用方式
下一步就是配置复用方式,由于LED是GPIO3控制,所以找到
/*配置GPIO1_3,使复用方式变为GPIO
写入0101,即5
寄存器是IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
*/
ldr r0, =0x020E0068 @写入IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的地址
ldr r1, =0x5 @要写入的数据
str r1, [r0] @写入