<>一、I.MX6ULL 官方 SDK包下载
<>二、I.MX6ULL 官方 SDK包简介
NXP 针对 I.MX6ULL 编写了一个 SDK 包,这个 SDK 包就类似于 STM32 的 STD 库或者 HAL 库,这个 SDK 包提供了
Windows 和 Linux 两种版本,分别针对主机系统是 Windows 和 Linux。
我们不是通过 SDK 进行开发,而是需要 SDK 中寄存器相关定义文件。一共需要如下三个文件:
* fsl_common.h:位置为 SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\drivers\fsl_common.h。
* fsl_iomuxc.h: 位置为 SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\drivers\fsl_iomuxc.h。
* MCIMX6Y2.h: 位置为 SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\MCIMX6YH2.h。
1、fsl_common.h 内容
* 构造代码状态
* MAKE_STATUS
* enum _status_groups
* enum _generic_status
* 版本号
* Debug 控制台类型
* status_t 类型(typedef int32_t status_t)
* 一些宏定义
* 不同链接器相关定义
* 对 C++ 的一些支持(__cplusplus)
2、fsl_iomuxc.h 内容
* IOMUXC 复用定义
* 引脚复用功能函数(IOMUXC_SetPinMux)
* 引脚配置函数(IOMUXC_SetPinConfig)
3、MCIMX6Y2.h 内容
* IRQn_Type 定义
* SW_MUX_CTL_PAD 引脚枚举
* SW_PAD_CTL_PAD_DDR 引脚枚举
* SW_PAD_CTL_PAD 引脚枚举
* IOMUXC 输入选择
* IOMUXC 组枚举
* IOMUXC_SNVS SW_MUX_CTL_PAD 枚举
* IOMUXC_SNVS SW_PAD_CTL_PAD 枚举
* 外设地址定义
* 外设结构体定义
* 外设的基本操作
<>三、SDK 移植
1、fsl_common.h 需要内容(删除宏、编译器相关内容、C++相关内容)
* 构造代码状态
* MAKE_STATUS
* enum _status_groups
* enum _generic_status
* 版本号
* Debug 控制台类型
* status_t 类型(typedef int32_t status_t)
2、fsl_iomuxc.h 内容都需要,删除包含头文件即可。
3、MCIMX6Y2.h 内容都需要,删除包含头文件即可。
4、对以上头文件使用的数据类型添加(移植官方文件也可以(SDK 中未找到),自己写以可以)。
<>四、编写代码
<>1、fsl_commom.h
文件较大,不复制相关代码。
<>2、fsl_iomuxc.h
文件较大,不复制相关代码。
<>3、MCIMX6Y2.h
文件较大,不复制相关代码。
<>4、types.h
定义 fsl_commom.h、fsl_iomuxc.h 和 MCIMX6Y2.h 文件中相关数据类型。
#ifndef __TYPES_H__ #define __TYPES_H__ #define __I volatile #define __O
volatile #define __IO volatile typedef signed char int8_t; typedef signed short
int16_t; typedef signed int int32_t; typedef unsigned char uint8_t; typedef
unsigned short uint16_t; typedef unsigned int uint32_t; #endif
<>5、main.c
#include "fsl_common.h" #include "fsl_iomuxc.h" #include "MCIMX6Y2.h" /* * 使能
I.MX6U 所有外设时钟 */ void clk_enable(void) { CCM->CCGR0 = 0xffffffff; CCM->CCGR1 =
0xffffffff; CCM->CCGR2 = 0xffffffff; CCM->CCGR3 = 0xffffffff; CCM->CCGR4 =
0xffffffff; CCM->CCGR5 = 0xffffffff; CCM->CCGR6 = 0xffffffff; } void led_init(
void) { /* 1、初始化 IO 复用, 复用为 GPIO1_IO03 */ IOMUXC_SetPinMux(
IOMUXC_GPIO1_IO03_GPIO1_IO03,0); /* 2、配置 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 低转换率 */ IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03,0X10B0); /* 3、初始化
GPIO, GPIO1_IO03 设置为输出 */ GPIO1->GDIR |= (1 << 3); /* 4、设置 GPIO1_IO03 输出低电平,打开
LED0 */ GPIO1->DR &= ~(1 << 3); } /* * 打开 LED 灯 */ void led_on(void) { GPIO1->DR
&= ~(1<<3); } /* * 关闭 LED 灯 */ void led_off(void) { GPIO1->DR |= (1<<3); } void
delay_short(volatile unsigned int n) { while(n--){} } void delay(volatile
unsigned int n) { while(n--){ delay_short(0x7ff); } } int main(void) {
clk_enable(); led_init(); while(1){ led_off(); delay(500); led_on(); delay(500);
} return 0; }
<>6、start.s
.global __start /* 全局标号 */ /* * 描述: _start 函数,程序从此函数开始执行,此函数主要功能是设置 C 运行环境。 *
注:I.MX6U 内部的 Boot ROM 会读取 DCD 数据中的 DDR 配置参数然后完成 DDR 初始化。 */ __start: /* 设置处理器进入
SVC 模式 */ mrs r0, cpsr /* 将 r0 的低 5 位清零,也就是 cpsr 的 M0~M4 */ bic r0, r0, #0x1f
/* r0或上 0x13,表示使用 SVC 模式 */ orr r0, r0, #0x13 /* 将 r0 的数据写入到 cpsr_c 中 */ msr
cpsr, r0 ldr sp, =0X80200000 /* 设置栈指针 */ b main /* 跳转到 main 函数 */
<>7、imx6ul.lds
SECTIONS{ . = 0X87800000; /* 设置定位计数器(链接起始地址) */ .text : { start.o /*
开始位置的文件为start.o, start.o 里面包含着第一个要执行的指令 */ main.o /* */ *(.text) } .rodata
ALIGN(4) : {*(.rodata*)} .data ALIGN(4) : { *(.data) } __bss_start = .; /* '.'
为定位符, __bss_start 标志方便对 .bss 段清零 */ .bss ALIGN(4) : { *(.bss) *(COMMON) }
__bss_end = .; }
<>8、Makefile
CROSS_COMPILE ?= arm-linux-gnueabihf- NAME ?= ledc CC := $(CROSS_COMPILE)gcc
LD := $(CROSS_COMPILE)ld OBJCOPY := $(CROSS_COMPILE)objcopy OBJDUMP =
$(CROSS_COMPILE)objdump OBJS := start.o main.o $(NAME).bin:$(OBJS) $(LD) -T
imx6ul.lds -o $(NAME).elf $^ $(OBJCOPY) -O binary -S $(NAME).elf $@ $(OBJDUMP)
-D -m arm $(NAME).elf > $(NAME).dis %.o:%.s $(CC) -Wall -nostdlib -c -O2 -o $@
$< %.o:%.S $(CC) -Wall -nostdlib -c -O2 -o $@ $< %.o:%.c $(CC) -Wall -nostdlib
-c -O2 -o $@ $< clean: rm -rf *.o $(NAME).bin $(NAME).elf $(NAME).dis
<>五、验证
onlylove@ubuntu:~/linux/driver/board_driver/3_ledsdk$ ls -l total 3540
-rw-rw-r--1 onlylove onlylove 7663 Dec 7 04:01 fsl_common.h -rw-rw-r-- 1
onlylove onlylove116683 Dec 7 04:00 fsl_iomuxc.h -rw-rw-r-- 1 onlylove onlylove
492 Dec 7 04:09 imx6ul.lds -rwxrwxr-x 1 onlylove onlylove 13488 Dec 7 04:14
imxdownload -rw-rw-r--1 onlylove onlylove 3569 Dec 7 04:33 load.imx -rw-rw-r-- 1
onlylove onlylove1516 Dec 7 04:08 main.c -rw-rw-r-- 1 onlylove onlylove 555 Dec
7 04:18 Makefile -rw-rw-r-- 1 onlylove onlylove 3454572 Dec 7 03:57 MCIMX6Y2.h
-rw-rw-r--1 onlylove onlylove 648 Dec 7 04:14 start.s -rw-rw-r-- 1 onlylove
onlylove324 Dec 7 04:01 types.h
onlylove@ubuntu:~/linux/driver/board_driver/3_ledsdk$make
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o start.o start.s
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o main.o main.c
arm-linux-gnueabihf-ld -T imx6ul.lds -o ledc.elf start.o main.o
arm-linux-gnueabihf-objcopy -O binary -S ledc.elf ledc.bin
arm-linux-gnueabihf-objdump -D -m arm ledc.elf> ledc.dis
onlylove@ubuntu:~/linux/driver/board_driver/3_ledsdk$ls -l total 3568 -rw-rw-r--
1 onlylove onlylove 7663 Dec 7 04:01 fsl_common.h -rw-rw-r-- 1 onlylove onlylove
116683 Dec 7 04:00 fsl_iomuxc.h -rw-rw-r-- 1 onlylove onlylove 492 Dec 7 04:09
imx6ul.lds -rwxrwxr-x1 onlylove onlylove 13488 Dec 7 04:14 imxdownload
-rwxrwxr-x1 onlylove onlylove 497 Dec 7 04:34 ledc.bin -rw-rw-r-- 1 onlylove
onlylove7290 Dec 7 04:34 ledc.dis -rwxrwxr-x 1 onlylove onlylove 66797 Dec 7
04:34 ledc.elf -rw-rw-r--1 onlylove onlylove 3569 Dec 7 04:33 load.imx
-rw-rw-r--1 onlylove onlylove 1516 Dec 7 04:08 main.c -rw-rw-r-- 1 onlylove
onlylove1381 Dec 7 04:34 main.o -rw-rw-r-- 1 onlylove onlylove 555 Dec 7 04:18
Makefile -rw-rw-r--1 onlylove onlylove 3454572 Dec 7 03:57 MCIMX6Y2.h -rw-rw-r--
1 onlylove onlylove 708 Dec 7 04:34 start.o -rw-rw-r-- 1 onlylove onlylove 648
Dec7 04:14 start.s -rw-rw-r-- 1 onlylove onlylove 324 Dec 7 04:01 types.h
onlylove@ubuntu:~/linux/driver/board_driver/3_ledsdk$