汇编LED原理分析
ALPHA开发板LED灯硬件原理分析
I.MX6ULL IO初始化:
①、使能时钟,CCGR0CCGR6这7个寄存器控制着6ULL所有外设时钟的使能。为了简单,设置CCGR0CCGR6这7个寄存器全部为0XFFFFFFFF,相当于使能所有外设时钟。
②、IO复用,将寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的bit3~0设置为0101=5,这样GPIO1_IO03就复用为GPIO。
③、寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03是设置GPIO1_IO03的电气属性。包括压摆率、速度、驱动能力、开漏、上下拉等。
④、配置GPIO功能,设置输入输出。设置GPIO1_DR寄存器bit3为1,也就是设置为输出模式。设置GPIO1_DR寄存器的bit3,为1表示输出高电平,为0表示输出低电平。
可以看到下面还有CCGR0-CCGR6七个寄存器。
首先来初始化CCGR0。
.global _start @全局标号
_start:
/*初始化使能所有外设时钟*/
ldr r0, =0x020c4068 @CCGR0
ldr r1, =0xfffffff @要向CCGR0写入的数据
str r1, [r0] @将0xffffffff写入到CCGR0中
初始化使能所有外设时钟
r0是要写入的地址,r1是要写入的值
ldr r0, =0x020c4068 @CCGR0
也就是第一个寄存器CCGR0的地址
要向CCGR0写入的数据
然后通过str指令,将数据写到寄存器中。
其中ldr和str的指令介绍如下:
再看第二个寄存器CCGR1
地址为十六进制,因此将CCGR0的地址加4即可得到CCGR1的地址为0x020c406c
同理将其他的寄存器全部初始化,代码为:
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]
这样就把0xffffffff
全部写入到各个寄存器中,即把全部的时钟使能。
接下来就是IO复用
将GPIO1_IO03就复用为GPIO,
配置 GPI01_IO03 PIN的复用为GPI0
初始化寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
将其 bit3~0 设置为 0101=5 即可
找到GPIO1_IO03,将bit0-3也就是MUX_MODE设置为 5。
这个寄存器的地址在图中可以看到为20E_0068h
同上一样的方式
代码为:
ldr r0, =0X020E0068 @IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
ldr r1, =0x5 @要写入的数据为5
str r1, [r0] @将5写入到IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03中
这样复用功能就配置好了。
接下来配置电器属性
寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
是设置GPIO1_IO03
的电气属性。
包括压摆率、速度、驱动能力、开漏、上下拉等。
下面来看具体配置:
首先是bit0,有低速率和高速率两种,我们这里选择低速率,即设置为0。
bit2-1是保留的,不用管。
再看bit5-3 是设置驱动能力的。数值越大,驱动能力越强。
我们这里选择110,即R0/6。
再看bit7-6 是设置速度的。
我们这里设置中速medium,10 100Mhz的速度
接着是bit10-8,保留,不用管。
然后是bit11,是设置开路输出
我们这里设置为0,即关闭开路输出。
再看bit12,是设置拉/保持使能字段。
我们这里设置为1,使能pull/kepper开启
bit13,设置上拉还是保持
我们设置为0,kepper保持
bit15-14是选择电阻
设置上下拉阻值,我们设置为00,100k下拉
最后是bit16
设置hys,我们这里选择关闭,设置为0。
整体的值换算为十六进制为:10b0
代码为:
ldr r0, =0x020e02f4
ldr r1, =0x10b0
str r1, [r0]
接下来,配置GPIO功能
设置输入输出。设置GPIO1_DR寄存器bit3为1,也就是设置为输出模式。设置GPIO1_DR寄存器的bit3,为1表示输出高电平,为0表示输出低电平。
设置GPIO1_GDIR寄存器,设置GPIO1_GPIO03为输出
GPIO1_GDIR寄存器地址为0x0209c004,设置GPIO1_GDIR寄存器bit3为1
也就是设置GPIO1_IO03为输出
代码为:
ldr r0, =0x0209c004
ldr r1, =0x8
str r1, [r0]
最后设置一个开灯码
打开LED,也就是设置GPIO1_IO03为0,就输出低电平,灯就会亮
GPIO1_DR寄存器地址为0x0209c000
代码为:
ldr r0, =0x0209c000
ldr r1, =0
str r1, [r0]
死循环
用一个loop函数,让CPU处于可知状态。
代码为:
loop:
b loop
最后完整代码如下:
.global _start @全局标号
_start:
/*初始化使能所有外设时钟*/
ldr r0, =0x020c4068 @CCGR0
ldr r1, =0xfffffff @要向CCGR0写入打数据
str r1, [r0] @将0xffffffff写入到CCGR0中
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]
/*配置 GPI01_IO03 PIN的复用为GPI0,也就是设置
* IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03=5
* 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中
/* 配置GPIO1_IO03的电气属性 也就是寄存器:
* IOMUXC_SW_PAD_CTL_PAD_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/kepper
* bit13: 0 kepper
* 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,
* 也就是设置GPIO1_IO03为输出。
*/
ldr r0, =0x0209c004
ldr r1, =0x8
str r1, [r0]
/* 打开LED,也就是设置GPIO1_IO03为0
* GPIO1_DR寄存器地址为0x0209c000
*
*/
ldr r0, =0x0209c000
ldr r1, =0
str r1, [r0]
loop:
b loop