驱动IO步骤
一编写驱动程序
初始化步骤
1.使能时钟,CCGR0~CCGR6这七个寄存器控制这6ull所有外设时钟的使能
2.IO复用,将寄存器IOmux_SW_MUX_CTL_PAD_GPIO1_IO13的bit3~0设置伟0101,这样GPIO1_13就复用伟GPIO
3.寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO13设置GPIO1_13的电气属性。包括压摆率,速度,驱动能力,开漏,上下拉等。
4配置GPIO功能,设置输入输出。以及设置输出的高低电平。
汇编代码示例
.global _start /* 全局标号 */
/*
* 描述: _start函数,程序从此函数开始执行此函数完成时钟使能、
* GPIO初始化、最终控制GPIO输出低电平来点亮LED灯。
*/
_start:
/* 例程代码 */
/* 1、使能所有时钟 */
ldr r0, =0X020C4068 /* CCGR0 */
ldr r1, =0XFFFFFFFF
str r1, [r0]
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]
/* 2、设置GPIO1_IO03复用为GPIO1_IO03 */
ldr r0, =0X020E0068 /* 将寄存器SW_MUX_GPIO1_IO03_BASE加载到r0中 */
ldr r1, =0X5 /* 设置寄存器SW_MUX_GPIO1_IO03_BASE的MUX_MODE为5 */
str r1,[r0]
/* 3、配置GPIO1_IO03的IO属性
*bit 16:0 HYS关闭
*bit [15:14]: 00 默认下拉
*bit [13]: 0 kepper功能
*bit [12]: 1 pull/keeper使能
*bit [11]: 0 关闭开路输出
*bit [7:6]: 10 速度100Mhz
*bit [5:3]: 110 R0/6驱动能力
*bit [0]: 0 低转换率
*/
ldr r0, =0X020E02F4 /*寄存器SW_PAD_GPIO1_IO03_BASE */
ldr r1, =0X10B0
str r1,[r0]
/* 4、设置GPIO1_IO03为输出 */
ldr r0, =0X0209C004 /*寄存器GPIO1_GDIR */
ldr r1, =0X0000008
str r1,[r0]
/* 5、打开LED0
* 设置GPIO1_IO03输出低电平
*/
ldr r0, =0X0209C000 /*寄存器GPIO1_DR */
ldr r1, =0
str r1,[r0]
/*
* 描述: loop死循环
*/
loop:
b loop
二编译程序
编译过程
1,将.c .s文件编译成.o文件
使用gcc工具
arm-linux-gnueablihf-gcc
2, 链接 将所有.o文件链接成可执行的.elf文件
同样使用gcc工具
arm-linux-gnueabihf-ld-Ttext 0x87800000 led.o -o led.elf
链接就是将所有的.o文件连接在一起,并且链接到指定地址。
一般corte-a系列芯片都没有内部flash
所以链接起始地址一般RAM区域,对与6ull芯片有128k的内部ram地址范围为0x90000000-0x91FFFFFF。也可一链接到外部flash中。也就是链接到DDR上。自己的芯片的DDR地址为0x80000000-0x8FFFFFFF
对于本实验的链接起始地址为0x8780000,因为要使用DDR就必须要初始化DDR。对于i.mx6ull来说bin文件不能直接运行,需要添加一个头部,而这个头部信息就包括了初始化DDR的参数,I.MX6ull系列soc内部boot rom会从SD卡,emmc等外置存储中读取初始化参数,然后初始化DDR,并将bin文件拷贝到指定的地方。
bin运行的地址一定要和链接起始地址一致,位置无关代码除外。
3,将.elf文件转为.bin文件
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
4,将.elf文件转为汇编文件,反汇编
arm-linux-gnueabihf-objdump -D led.elf > led.dis