如何利用官方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了。
如果重复引用了会有什么后果?
- 增加编译量,编译效率低;
 - 变量的重复定义
 
但也不是所有的头文件都要用这个格式,但这是一个良好的习惯,应该保持。
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的移植。
- fsl_common.h
 - fsl_iomuxc.h
 - MCIMX6Y2.h
 
当然移植之前是要进行简单的剪裁的,因为代码过长,大多是重复性的,这里就不附了。
如何利用官方SDK文件来辅助开发的更多相关文章
- vue 辅助开发工具(利用node自动生成相关文件,自动注册路由)
		
vue 辅助开发工具 前言 有没有因为新建view,component,store的繁琐操作而苦恼,需要新建文件件,新建vue文件,新建js文件,注册路由...等一系列无价值操作浪费时间,为了解决这个 ...
 - 基于C#的钉钉SDK开发(1)--对官方SDK的重构优化
		
在前段时间,接触一个很喜欢钉钉并且已在内部场景广泛使用钉钉进行工厂内部管理的客户,如钉钉考勤.日常审批.钉钉投影.钉钉门禁等等方面,才体会到原来钉钉已经已经在企业上可以用的很广泛的,因此回过头来学习研 ...
 - 解决微信官方SDK给出1.4.0等版本没有预览文件(previewFile)等接口
		
使用苹果手机测试 调用微信的js-sdk在系统中实现上传.预览附件的功能.在自己的手机测试通过后,直接丢给QA测试了 本以为相安无事了,没想到QA用安卓手机测的时候居然不得,使用的是下载下来的jwei ...
 - Senparc.Weixin.MP SDK 微信公众平台开发教程(十二):OAuth2.0说明
		
紧接上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明>,这里专讲OAuth2.0. 理解OAuth2.0 首先我们通过一张图片来了解一下OAu ...
 - 【转】Android平台下利用zxing实现二维码开发
		
http://www.cnblogs.com/dolphin0520/p/3355728.html 现在走在大街小巷都能看到二维码,而且最近由于项目需要,所以研究了下二维码开发的东西,开源的二维码扫描 ...
 - Android平台下利用zxing实现二维码开发
		
Android平台下利用zxing实现二维码开发 现在走在大街小巷都能看到二维码,而且最近由于项目需要,所以研究了下二维码开发的东西,开源的二维码扫描库主要有zxing和zbar,zbar在iPos平 ...
 - (转载)Android平台下利用zxing实现二维码开发
		
Android平台下利用zxing实现二维码开发 现在走在大街小巷都能看到二维码,而且最近由于项目需要,所以研究了下二维码开发的东西,开源的二维码扫描库主要有zxing和zbar,zbar在iPos平 ...
 - 使用 Tye 辅助开发 k8s 应用竟如此简单(一)
		
最近正巧在进行 Newbe.Claptrap 新版本的开发,其中使用到了 Tye 来辅助 k8s 应用的开发.该系列我们就来简单了解一下其用法. Newbe.Claptrap 是一个用于轻松应对并发问 ...
 - Senparc.Weixin.MP SDK 微信公众平台开发教程(三):微信公众平台开发验证
		
要对接微信公众平台的"开发模式",即对接到自己的网站程序,必须在注册成功之后(见Senparc.Weixin.MP SDK 微信公众平台开发教程(一):微信公众平台注册),等待官方 ...
 
随机推荐
- jQuery根据地址获取经纬度
			
一.HTML部分 1 @*景区位置*@ 2 <tr> 3 <th>景区名称:</th> 4 <td><input class="txt ...
 - 第36篇-return字节码指令
			
方法返回的字节码相关指令如下表所示. 0xac ireturn 从当前方法返回int 0xad lreturn 从当前方法返回long 0xae freturn 从当前方法返回float 0xaf d ...
 - 关于axios 的responseType类型的设置
			
responseType值的类型可为如下 axios请求下载导出一个文件,请求成功时返回的是一个流形式的文件,需要设置responseType: 'arraybuffer',但是请求失败的需要返回的是 ...
 - 几十行js实现很炫的canvas交互特效
			
几十行js实现很炫的canvas交互特效 废话不多说,先上效果图! 本篇文章的示例代码都是抄的一个叫Franks的老外在yutube上的一个教学视频,他还出了很多关于canvas的视频,十分值得学习, ...
 - 【Python+postman接口自动化测试】(4)HTTP 协议
			
前言 HTTP:超文本传输协议,是用于从WWW服务器传输超文本到本地浏览器的传输协议. HTTP协议是一种无状态协议,主要包含请求和相应两大部分. 请求(Request) get请求示范: GET h ...
 - MySQL——DML数据增、删、改
			
插入 方式一(经典) 语法: insert into 表名(列名,...) values(值,...); 若要一次插入多行 create table if NOT EXISTS user( name ...
 - 动态sql & 抽取可重用sql
			
抽取可重用的sql片段 抽取:<sql id="xx"></sql> 使用:<include refid="xx">< ...
 - redis如何解决key冲突?
			
1.业务隔离 不同的业务使用不同的redis集群,或者协议使用redis的不同db. 2.良好的Redis Key的设计 格式:业务标识:系统名称:模块名称:关键词简写 比如:保险:用户管理:用户申请 ...
 - sql关联修改
			
UPDATE p set p.ClientID = c.id from PaymentTable p left JOIN ClientTable c on p.ClientID = c.Clie ...
 - SpringCloud升级之路2020.0.x版-35. 验证线程隔离正确性
			
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 上一节我们通过单元测试验证了重试的正确性,这一节我们来验证我们线程隔离的正确性,主要包括: ...