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
)__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
枚举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
中未找到),自己写以可以)。
文件较大,不复制相关代码。
文件较大,不复制相关代码。
文件较大,不复制相关代码。
定义 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
#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;
}
.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 函数 */
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 = .;
}
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 onlylove 116683 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 onlylove 1516 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 onlylove 324 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-x 1 onlylove onlylove 13488 Dec 7 04:14 imxdownload
-rwxrwxr-x 1 onlylove onlylove 497 Dec 7 04:34 ledc.bin
-rw-rw-r-- 1 onlylove onlylove 7290 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 onlylove 1381 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 Dec 7 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$