1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html 3)对正点原子Linux感兴趣的同学可以加群讨论:935446741
4)关注正点原子公众号,获取最新资料更新
在上一章中,我们参考ST官方给STM32编写的stm32f10x.h来自行编写I.MX6U的寄存器定义文件。自己编写这些寄存器定义不仅费时费力,没有任何意义,而且很容易写错,幸好NXP官方为I.MX6ULL编写了SDK包,在SDK包里面NXP已经编写好了寄存器定义文件,所以我们可以直接移植SDK包里面的文件来用。虽然NXP是为I.MX6ULL编写的SDK包,但是I.MX6UL也是可以使用的!本章我们就来讲解如何移植SDK包里面重要的文件,方便我们的开发。
12.1 I.MX6ULL官方SDK包简介 NXP针对I.MX6ULL编写了一个SDK包,这个SDK包就类似于STM32的STD库或者HAL库,这个SDK包提供了Windows和Linux两种版本,分别针对主机系统是Windows和Linux。因为我们是在Windows下使用Source Insight来编写代码的,因此我们使用的是Windows版本的。Windows版本SDK里面的例程提供了IAR版本,肯定有人会问既然NXP提供了IAR版本的SDK,那我们为什么不用IAR来完成裸机试验,偏偏要用复杂的GCC?因为我们要从简单的裸机开始掌握Linux下的GCC开发方法,包括Ubuntu操作系统的使用、Makefile的编写、shell等等。如果为了偷懒而使用IAR开发裸机的话,那么后续学习Uboot移植、Linux移植和Linux驱动开发就会很难上手,因为开发环境都不熟悉!再者,不是所有的半导体厂商都会为Cortex-A架构的芯片编写裸机SDK包,我使用过那么多的Cotex-A系列芯片,也就发现了NXP给I.MX6ULL编写了裸机SDK包。而且去NXP官网看一下,会发现只有I.MX6ULL这一款Cotex-A内核的芯片有裸机SDK包,NXP的其它Cotex-A芯片都没有。说明在NXP的定位里面,I.MX6ULL就是一个Cotex-A内核的高端单片机,定位类似ST的STM32H7。说这么多的目的就是想告诉大家,使用Cortex-A内核芯片的时候不要想着有类似STM32库一样的东西,I.MX6ULL是一个特例,基本所有的Cortex-A内核的芯片都不会提供裸机SDK包。因此在使用STM32的时候那些用起来很顺手的库文件,在Cotex-A芯片下基本都需要我们自行编写,比如.s启动文件、寄存器定义等等。 因为本教程是教大家Linux驱动开发入门的,本教程需要尽可能的降低入门难度,这也是为什么本教程会选择I.MX6U芯片的一个重要的原因,因为其提供了I.MX6ULL的裸机SDK包,大家上手会很容易。I.MX6ULL的SDK包在NXP官网下载,下载界面如图12.1.1所示:
图12.1.1 I.MX6ULL SDK包下载界面 我们下载图12.1.1中的WIN版本SDK,也就是“SDK2.2_iMX6ULL_WIN”,我们已经下载好放到光盘中,路径为:开发板光盘-> 7、I.MX6U参考资料->3、I.MX6ULL SDK包->SDK_2.2_MCIM6ULL_RFP_Win.exe。双击SDK_2.2_MCIM6ULL_RFP_Win.exe安装SDK包,安装的时候需要设置好安装位置,安装完成以后的SDK包如图12.1.2所示:
图12.1.2 SDK包 我们本教程不是讲解SDK包如何开发的,我们只是需要SDK包里面的几个文件,所以就不去详细的讲解这个SDK包了,感兴趣的可以看一下,所有的例程都在boards这个文件夹里面。我们重点是需要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。 整个SDK包我们就需要上面这三个文件,把这三个文件准备好,我们后面移植要用。 12.2硬件原理图分析 本章使用到的硬件资源和第八章一样,就是一个LED0。 12.3试验程序编写 本实验对应的例程路径为:开发板光盘-> 1、裸机例程->4_ledc_sdk。 12.3.1 SDK文件移植 使用VSCode新建工程,将fsl_common.h、fsl_iomuxc.h和MCIMX6Y2.h这三个文件拷贝到工程中,这三个文件直接编译的话肯定会出错的!需要对其做删减,因为这三个文件里面的代码都比较大,所以就不详细列出这三个文件删减以后的内容了。大家可以参考我们提供的裸机例程来修改这三个文件,很简单的。修改完成以后的工程目录如图12.3.1.1所示:
图12.3.1.1工程目录 12.3.2 创建cc.h文件 新建一个名为cc.h的头文件,cc.h里面存放一些SDK库文件需要使用到的数据类型,在cc.h里面输入如下代码:
```c
示例代码12.3.2.1 cc.h文件代码
1 #ifndef __CC_H
2 #define __CC_H
3/***************************************************************
4 Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
5文件名 : cc.h
6作者 : 左忠凯
7版本 : V1.0
8描述 : 有关变量类型的定义,NXP官方SDK的一些移植文件会用到。
9其他 : 无
10日志 : 初版V1.0 2019/1/3 左忠凯创建
11 ***************************************************************/
12
13/*
14 * 自定义一些数据类型供库文件使用
15 */
16 #define __I volatile
17 #define __O volatile
18 #define __IO volatile
19
20 #define ON 1
21 #define OFF 0
22
23typedefsigned char int8_t;
24typedefsigned short int int16_t;
25typedefsigned int int32_t;
26typedefunsigned char uint8_t;
27typedefunsigned short int uint16_t;
28typedefunsigned int uint32_t;
29typedefunsigned long long uint64_t;
30typedefsigned char s8;
31typedefsigned short int s16;
32typedefsigned int s32;
33typedefsigned long long int s64;
34typedefunsigned char u8;
35typedefunsigned short int u16;
36typedefunsigned int u32;
37typedefunsigned long long int u64;
38
39 #endif
在cc.h文件中我们定义了很多的数据类型,因为有些第三方库会用到这些变量类型。
12.3.3编写实验代码
新建start.S和main.c这两个文件,start.S文件的内容和上一章一样,直接复制过来就可以,创建完成以后工程目录如图12.3.3.1所示:

图12.3.3.1 工程目录文件
在main.c中输入如下所示代码:
示例代码12.3.3.1 main.c文件代码
/**************************************************************
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名 : mian.c
作者 : 左忠凯
版本 : V1.0
描述 : I.MX6U开发板裸机实验4 使用NXP提供的I.MX6ULL官方IAR SDK包开发
其他 : 前面其他所有实验中,寄存器定义都是我们自己手写的,但是I.MX6U
的寄存器有很多,全部自己写太费时间,而且没意义。NXP官方提供了
针对I.MX6ULL的SDK开发包,是基于IAR环境的,这个SDK包里面已经提
供了I.MX6ULL所有相关寄存器定义,虽然是针对I.MX6ULL编写的,但是同样
适用于I.MX6UL。本节我们就将相关的寄存器定义文件移植到Linux环境下,
要移植的文件有:
```c
fsl_common.h
fsl_iomuxc.h
MCIMX6Y2.h
自定义文件 cc.h
日志 : 初版V1.0 2019/1/3 左忠凯创建
**************************************************************/
1 #include "fsl_common.h"
2 #include "fsl_iomuxc.h"
3 #include "MCIMX6Y2.h"
4
5/*
6 * @description : 使能I.MX6U所有外设时钟
7 * @param : 无
8 * @return : 无
9 */
10void clk_enable(void)
11{
12 CCM->CCGR0 =0XFFFFFFFF;
13 CCM->CCGR1 =0XFFFFFFFF;
14
15 CCM->CCGR2 =0XFFFFFFFF;
16 CCM->CCGR3 =0XFFFFFFFF;
17 CCM->CCGR4 =0XFFFFFFFF;
18 CCM->CCGR5 =0XFFFFFFFF;
19 CCM->CCGR6 =0XFFFFFFFF;
20
21}
22
23/*
24 * @description : 初始化LED对应的GPIO
25 * @param : 无
26 * @return : 无
27 */
28void led_init(void)
29{
30/* 1、初始化IO复用 */
31 IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03,0);
32
33/* 2、、配置GPIO1_IO03的IO属性
34 *bit 16:0 HYS关闭
35 *bit [15:14]: 00 默认下拉
36 *bit [13]: 0 kepper功能
37 *bit [12]: 1 pull/keeper使能
38 *bit [11]: 0 关闭开路输出
39 *bit [7:6]: 10 速度100Mhz
40 *bit [5:3]: 110 R0/6驱动能力
41 *bit [0]: 0 低转换率
42 */
43 IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03,0X10B0);
44
45/* 3、初始化GPIO,设置GPIO1_IO03设置为输出 */
46 GPIO1->GDIR |=(1
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?