0
点赞
收藏
分享

微信扫一扫

正点原子阿尔法ARM开发板-IMX6ULL(三)——汇编LED驱动实验-上



文章目录

  • 一、原理分析
  • 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,确定端口号,之后查看参考手册寻找复用

正点原子阿尔法ARM开发板-IMX6ULL(三)——汇编LED驱动实验-上_汇编


只有右下角的4位是对于模式进行选择

正点原子阿尔法ARM开发板-IMX6ULL(三)——汇编LED驱动实验-上_寄存器_02


每一个值,就是一种模式,设置为0101=5,就复用为GPIO了

1.3 电气属性寄存器(PAD)

寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03是设置GPIO3的电气属性,包括压摆率、速度、驱动能力、开漏、上下拉等

正点原子阿尔法ARM开发板-IMX6ULL(三)——汇编LED驱动实验-上_arm开发_03

1.3.1 SRE(bit0)

SRE是设置压摆率,,设置压摆率,当此位为0的时候是低压摆率,当为1的时候是高压摆率。这里的压摆率就是 IO电平跳变所需要的时间,比如从0到1需要多少时间,时间越小波形就越陡,说明压摆率越高;反之,时间越多波形就越缓,压摆率就越低。如果你的产品要过 EMC的话那就可以使用小的压摆率,因为波形缓和,如果你当前所使用的 IO做高速通信的话就可以使用高压摆率

由于不要过EMC检测,所以设置为0

1.3.2 DSE(bit5:3)

用来设置 IO的驱动能力,

正点原子阿尔法ARM开发板-IMX6ULL(三)——汇编LED驱动实验-上_初始化_04


位数字越大,电阻越小,驱动能力越强

1.3.3 SPEED(bit7:6)

当IO用作输出,SPEED就是设置IO速度

正点原子阿尔法ARM开发板-IMX6ULL(三)——汇编LED驱动实验-上_寄存器_05

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)

设置上拉和下拉

正点原子阿尔法ARM开发板-IMX6ULL(三)——汇编LED驱动实验-上_寄存器_06

1.3.8 HYS(bit16)

迟滞比较器(没看懂)

在整理这些电气属性时,不需要全部搞懂

1.4 配置GPIO

配置输入输出

正点原子阿尔法ARM开发板-IMX6ULL(三)——汇编LED驱动实验-上_寄存器_07


设置GP1O_DR寄存器bit3为1.也就是设置为输出模式。设置GPIO_DR寄存器的bit3.为1表示输出高电平,为0表示输出低电平。·

二、汇编补充

对于MOV,MOVS以及LDR和STR是最常用的

LDR是,可以将一个地址进行保存(可以用立即数表达地址,然后这段地址的别名就是寄存器Rx中,而LDR中,[Rx],表示取值,即Rx表示地址,[Rx]表示这个地址上所存储的值)

正点原子阿尔法ARM开发板-IMX6ULL(三)——汇编LED驱动实验-上_寄存器_08


STR指令就是写入,

STR R1, [R0] @表示R1的值写入R0所在地址中,也即覆盖了[R0]原本的值

正点原子阿尔法ARM开发板-IMX6ULL(三)——汇编LED驱动实验-上_汇编_09

正点原子阿尔法ARM开发板-IMX6ULL(三)——汇编LED驱动实验-上_汇编_10


这段汇编就是 a=b

解释一下:

第一行:将B的地址立即数,存入R0

第二行:读取B地址的数放入R1

第三行:将A的地址立即数,存入R0

第四行:将R1(此时不用中括号)中的值写入R0(R0需要中括号)

三、驱动编写

3.1 使能CCGR

首先打开linux操作系统,创建文件夹、工作区。

之后根据的原理分析的步骤写汇编

第一步就是把,CCGR的寄存器全部使能,需要找到地址,进入参考手册18章,找到

正点原子阿尔法ARM开发板-IMX6ULL(三)——汇编LED驱动实验-上_arm开发_11

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控制,所以找到

正点原子阿尔法ARM开发板-IMX6ULL(三)——汇编LED驱动实验-上_寄存器_12

/*配置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]        @写入


举报

相关推荐

0 条评论