Linux之ARM(MX6U)裸机汇编LED驱动实验--驱动编写

Linux之ARM(MX6U)裸机汇编LED驱动实验

  • 1. I.MX6ULL的初始化
    • ①、使能时钟
    • ②、配置 GPIO_I003 PIN的复用为GPIO
    • ③、配置 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03的电器属性
    • ④、配置GPIO功能,设置输入输出
    • ⑤、设置GPIO_DR寄存器的bit3,1表示输出高电平,0表示输出低电平

1. I.MX6ULL的初始化

①、使能时钟

使能时钟。CCGR0–CCGR6这七个寄存器控制着I.MX6ULL所有外设时钟的使能,为了简单,设置CCGR0–CCGR6这七个寄存器全部为0xFFFFFFFF,相当于使能所有的外设时钟

CCGR0:
Linux之ARM(MX6U)裸机汇编LED驱动实验--驱动编写_第1张图片
CCGR1:
Linux之ARM(MX6U)裸机汇编LED驱动实验--驱动编写_第2张图片

CCGR2:

Linux之ARM(MX6U)裸机汇编LED驱动实验--驱动编写_第3张图片

CCGR3:

Linux之ARM(MX6U)裸机汇编LED驱动实验--驱动编写_第4张图片

CCGR4:

Linux之ARM(MX6U)裸机汇编LED驱动实验--驱动编写_第5张图片

CCGR5:

Linux之ARM(MX6U)裸机汇编LED驱动实验--驱动编写_第6张图片

CCGR6:
Linux之ARM(MX6U)裸机汇编LED驱动实验--驱动编写_第7张图片

汇编使能所有的外设时钟:

Linux之ARM(MX6U)裸机汇编LED驱动实验--驱动编写_第8张图片

②、配置 GPIO_I003 PIN的复用为GPIO

将IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的bit3-0,设置为0101,这样GPIO_IO03就复用为GPIO

Linux之ARM(MX6U)裸机汇编LED驱动实验--驱动编写_第9张图片
汇编实现:

Linux之ARM(MX6U)裸机汇编LED驱动实验--驱动编写_第10张图片

③、配置 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03的电器属性

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

Linux之ARM(MX6U)裸机汇编LED驱动实验--驱动编写_第11张图片

Linux之ARM(MX6U)裸机汇编LED驱动实验--驱动编写_第12张图片

汇编代码实现:

Linux之ARM(MX6U)裸机汇编LED驱动实验--驱动编写_第13张图片

④、配置GPIO功能,设置输入输出

设置GPIO1_GDIR寄存器bit3为1,也就是设置为输出模式

Linux之ARM(MX6U)裸机汇编LED驱动实验--驱动编写_第14张图片
Linux之ARM(MX6U)裸机汇编LED驱动实验--驱动编写_第15张图片
汇编实现:

Linux之ARM(MX6U)裸机汇编LED驱动实验--驱动编写_第16张图片

⑤、设置GPIO_DR寄存器的bit3,1表示输出高电平,0表示输出低电平

Linux之ARM(MX6U)裸机汇编LED驱动实验--驱动编写_第17张图片
在这里插入图片描述
汇编实现:
Linux之ARM(MX6U)裸机汇编LED驱动实验--驱动编写_第18张图片

整个汇编代码(.s文件):

.global _start @全局标号

_start:
    /*使能所有外设时钟 */
    LDR R0 , =0x020c4068  @CCGR0 
    LDR R1 , =0xffffffff  @要想CCGR0写入的数据
    STR R1 , [R0]         @将R1的值写入到R0中
    
    LDR R0 , =0x020c406c  @CCGR1
    STR R1 ,[R0]

    LDR R0 , =0x020c4070  @CCGR1
    STR R1 ,[R0]

    LDR R0 , =0x020c4074  @CCGR1
    STR R1 ,[R0]

    LDR R0 , =0x020c4078  @CCGR1
    STR R1 ,[R0]

    LDR R0 , =0x020c407c  @CCGR1
    STR R1 ,[R0]

    LDR R0 , =0x020c4080  @CCGR1
    STR R1 ,[R0]

    /*配置 GPIO_I003  PIN的复用为GPIO
    * IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = 0101 =5
    * IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03寄存器的地址为0x020E_0068
    */
    LDR R0 , =0x020E0068  @IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
    LDR R1 , =0x5          @要写入的数据
    STR R1 , [R0]          @将5写入IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03

    /*配置 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03的电器属性
    * IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03的地址时0x020E_02F4
    * bit0 :    0 低速率
    * bit5-3:   110 R0/6  驱动能力
    * bit7-6:   10 100MHz速度
    * bit11:    0 关闭开路输出
    * bit12:    1 使能pull/keeper
    * bit15-14: 00 100K下拉
    * bit16:    0 关闭hys    
    * 向寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03写入 0x10b0
    */

    LDR R0 , = 0x020E02F4
    LDR R1 , = 0x10b0
    STR R1 ,[R0]

    /*设置GPIO功能
     *设置GPIO1_GDIR寄存器  设置GPIO1_GPIO03为输出
     *寄存器GPIO_GDIR的地址是  0x0209C004
     * 设置GPIO1_GDIR寄存器bit3为1也就是GPIO1_GPIO03为输出
     */
    LDR R0 , = 0x0209C004
    LDR R1 , = 0x8
    STR R1 ,[R0]

    /*打开LED,也就是设置GPIO1_GPIO03为0 
     *GPIO1_DR 寄存器地址为0x0209C000
    */

    LDR R0 , = 0x0209C000
    LDR R1 , =0
    STR R1 ,[R0]

loop:
    b loop

你可能感兴趣的:(IMX6ULL)