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

I.MX6ULL IO初始化

一、使能时钟

使能时钟,CCGR0~ CCGR6这7个寄存器控制着6ULL所有外设时钟的使能。为了简单,设置CCGR0~CCGR6这7个寄存器全部为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张图片

二、IO复用

将寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的bit3~0设置为0101=5,这样GPIO1_IO03就复用为GPIO

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

三、设置GPIO1_IO03的电气属性

寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03是设置GPIO1_IO03的电气属性。包括压摆率、速度、驱动能力、开漏、上下拉等。
Linux之ARM(MX6U)裸机汇编LED驱动实验-编写驱动代码_第11张图片
Linux之ARM(MX6U)裸机汇编LED驱动实验-编写驱动代码_第12张图片
汇编代码实现:
Linux之ARM(MX6U)裸机汇编LED驱动实验-编写驱动代码_第13张图片

四、配置GPIO功能,设置输入输出。

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

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

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

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

设置GPIO1_DR寄存器的bit3,为1表示输出高电平,为0表示输出低电平。
Linux之ARM(MX6U)裸机汇编LED驱动实验-编写驱动代码_第17张图片
在这里插入图片描述
Linux之ARM(MX6U)裸机汇编LED驱动实验-编写驱动代码_第18张图片
全部汇编代码(.s):

.global _start @全局标号 

_start:
  
/* 使能外设时钟
*CCGR0~CCGR6这7个寄存器全部使能,设置CCGR0~CCGR6这7个寄存器地址全部为0XFFFFFFFF
*/
ldr r0, =0x020c4068   @CCGR0
ldr r1, =0xffffffff   @向CCGR0写入的数据
str r1, [r0]          @将oxffffffff写到CCGRO中

ldr r0, =0x020c406c   @CCGR1
str r1, [r0]

ldr r0, =0x020c4070   @CCGR2
str r1, [r0]

ldr r0, =0x020c4074   @CCGR3
str r1, [r0]

ldr r0, =0x020c4078   @CCGR4
str r1, [r0]

ldr r0, =0x020c407c   @CCGR5
str r1, [r0]

ldr r0, =0x020c4080   @CCGR6
str r1, [r0]


/*IO复用,将寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的bit3~0设置为0101=5,
*这样GPIO1_IO03就复用为GPIO。
* IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03寄存器的地址为0x020E0068
*/

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是设置GPIO1_IO03的电气属性
*IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03的地址为0x020e02f4

*bit0:     0 低速率
*bit5-3:   110  R0/6驱动能力
*bit7-6:   10  100MHz速度
*bit11:    0 关闭开路输出
*bit12:    1 使 Pull/Keeper 
*bit13:    0  Keeper
*bit15-14: 00  100k下拉
*bit16:    0  关闭hys
*/

ldr r0, =0x020e02f4
ldr r1, =0x10b0
str r1, [r0]

/*  设置GPIO
*   设置GPIO1_GDIR寄存器 设置GPIO1_GPIO03为输出
*   寄存器GPIO1_GDIR的地址是  0x0209c004
*   设置GPIO1_GDIR寄存器bit3为1,也就是GPIO01_GPIO03为输出
*/

ldr r0, =0x0209c004
ldr r1, =0x8
str r1, [r0]

/*打开LED,也就是设置GPIO1_GPIO03为0
*GPIO01_DR寄存器地址为0x0209c000
 */
ldr r0, =0x0209c000
ldr r1, =0
str r1, [r0]

loop:
b  loop

你可能感兴趣的:(IMX6ULL)