如何利用官方SDK文件来辅助开发

如何利用官方SDK文件来辅助开发

1.首先要先知道什么是SDK?

SDK或者SDK包指的是,半导体厂商针对自己研发的芯片,同步推出的一个软件开发工具包。

它可以简单的为某个程序设计语言提供应用程序接口API的一些文件,但也可能包括能与某种嵌入式系统通讯的复杂的硬件

SDK还经常包括示例代码、支持性的技术注解或者其他的为基本参考资料澄清疑点的支持文档。

我是这样理解的,SDK就像是这个芯片的使用说明书:告诉你有哪些按钮,这些按钮分别控制着什么功能。

2.如何使用?

首先要从官网上下载下来,然后安装下来,会看到这个包里有很多的文件。

这次重点放在寄存器的相关文件中。

1)cc.h数据类型头文件

#ifndef __CC_H
#define __CC_H


/*
 * 自定义一些数据类型供库文件使用
 */
#define     __I     volatile 
#define     __O     volatile 
#define     __IO    volatile

typedef   signed          char int8_t;
typedef   signed short     int int16_t;
typedef   signed           int int32_t;
typedef unsigned          char uint8_t;
typedef unsigned short     int uint16_t;
typedef unsigned           int uint32_t;
typedef unsigned long     long uint64_t;
typedef	  signed char  	 	   s8;		
typedef	  signed short 	  int  s16;
typedef	  signed int 		   s32;
typedef	  signed long long int s64;
typedef	unsigned char 		   u8;
typedef	unsigned short int     u16;
typedef	unsigned int 		   u32;
typedef	unsigned long long int u64;


#endif

大家看着很定很熟悉,没错,以前玩单片机的时候,出现的像什么u32,u64都是一开始定义好的数据类型,放在了头文件里,细心的朋友一定有印象。

这里再说个基础知识:

头文件里为什么要像下面表达呢?

#ifndef __CC_H
#define __CC_H

#endif

这就牵涉到头文件的引用的问题了。

ifndef __CC_H意思是"if not define __CC_H"

define __CC_H 就引入__CC_H

endif 否则不需要引入

主要作用是:防止该头文件被重复引用

这里的重复引用指的不是说不同的两个文件引用了同一个头文件,而是同一个文件多次引用了一个头文件。

什么会这样?

因为头函数之间的嵌套,比如说a.c里面引用了b.h,b.h里引用了c.h,这个时候就不能再用a.c引用c.h了。

如果重复引用了会有什么后果?

  1. 增加编译量,编译效率低;
  2. 变量的重复定义

但也不是所有的头文件都要用这个格式,但这是一个良好的习惯,应该保持。

2)main.c

#include "fsl_common.h"

#include "fsl_iomuxc.h"

#include "MCIMX6Y2.h"

/*

 * @description	: 使能I.MX6U所有外设时钟
 * @param 		: 无
 * @return 		: 无

 */

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;
}

/*

 * @description	: 初始化LED对应的GPIO
 * @param 		: 无
 * @return 		: 无

 */

void led_init(void)

{

	/* 1、初始化IO复用 */

	IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03,0);		/* 复用为GPIO1_IO0 */

	/* 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);			
}



/*
 * @description	: 打开LED灯
 * @param 		: 无
 * @return 		: 无
 */

void led_on(void)

{
	/* 将GPIO1_DR的bit3清零 	*/
	GPIO1->DR &= ~(1<<3); 
}



/*

 * @description	: 关闭LED灯
 * @param 		: 无
 * @return 		: 无
 */

void led_off(void)

{
	/* 将GPIO1_DR的bit3置1 */
	GPIO1->DR |= (1<<3); 
}

/*
 * @description	: 短时间延时函数
 * @param - n	: 要延时循环次数(空操作循环次数,模式延时)
 * @return 		: 无
 */

void delay_short(volatile unsigned int n)
{
	while(n--){}
}

/*

 * @description	: 延时函数,在396Mhz的主频下
 * 			  	  延时时间大约为1ms
 * @param - n	: 要延时的ms数
 * @return 		: 无
 */

void delay(volatile unsigned int n)
{
	while(n--)
	{
		delay_short(0x7ff);
	}
}

/*
 * @description	: mian函数
 * @param 		: 无
 * @return 		: 无
 */

int main(void)
{
	clk_enable();		/* 使能所有的时钟 			*/
	led_init();			/* 初始化led 			*/
	while(1)			/* 死循环 				*/
	{	
		led_off();		/* 关闭LED 			*/
		delay(500);		/* 延时500ms 			*/

		led_on();		/* 打开LED 			*/
		delay(500);		/* 延时500ms 			*/
	}
	return 0;
}

这段程与前面那个推文相似,只不过有些许变化。比如使用了下面这种方式:

CCM->CCGR0 = 0XFFFFFFFF;

GPIO1->GDIR |= (1 << 3);

这个->符号就是结构体中常见的结构体指针运算符,是用来访问结构体内部成员的。

3)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) -Timx6ul.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

注意一下变量的使用就行。

下面这三个头文件,就是来自于SDK的移植。

  1. fsl_common.h
  2. fsl_iomuxc.h
  3. MCIMX6Y2.h

当然移植之前是要进行简单的剪裁的,因为代码过长,大多是重复性的,这里就不附了。

posted @ 2021-12-03 21:50  iron2222  阅读(239)  评论(0编辑  收藏  举报