ARM(IMX6U)裸机官方SDK包使用

参考:Linux之ARM(IMX6U)裸机C语言LED驱动实验–驱动编写,编译
作者:一只青木呀
发布时间: 2020-08-11 11:20:17
网址:https://blog.csdn.net/weixin_45309916/article/details/107930284

目录

  • 1、I.MX6ULL 官方 SDK 包简介
  • 2、实验程序的编写
    • 2.1、SDK文件的移植
    • 2.2、创建cc.h文件
    • 2.3、编写实验代码
      • 2.3.1、main.c
      • 2.3.2、start.s
      • 2.3.3、编写链接脚本
      • 2.3.4、编写Makefile
  • 3.编译下载

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 启动文件、寄存器定义等等

学习裸机目的就是为了后面的驱动做准备的(高端芯片肯定要跑操作系统的,不可能像STM32那样跑纯裸机),所以我们尽可能的自己原生态的操作寄存器,少用这些库,这里只是了解一下恩智浦公司开发的这些库以及如何使用。

下载地址:
1.官方下载:https://www.nxp.com/
2.网盘:https://pan.baidu.com/s/17jrT_DhMZof4_KYHjgWOWg
提取码:8hdo

下载后安装,安装后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 包我们就需要上面这三个文件,把这三个文件准备好,我们后面移植要用。

2、实验程序的编写

2.1、SDK文件的移植

使用 VSCode 新建工程,将 fsl_common.h、 fsl_iomuxc.h 和 MCIMX6Y2.h 这三个文件拷贝到工程中,这三个文件直接编译的话肯定会出错的!需要对其做删减,因为这三个文件里面的代码都比较大,所以就不详细列出这三个文件删减以后的内容了。

删减后的资源下载地址:

链接:https://pan.baidu.com/s/1FTyJe-AZUtjjXAlgUcHbIw
提取码:y2r4

2.2、创建cc.h文件

新建一个名为 cc.h 的头文件, cc.h 里面存放一些 SDK 库文件需要使用到的数据类型,不定义的话编译是会出错的。在cc.h 里面输入如下代码:

#ifndef __CC_H
#define __CC_H/** 自定义一些数据类型供库文件使用*/
#define     __I     volatile 
#define     __O     volatile 
#define     __IO    volatiletypedef   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

2.3、编写实验代码

新建 start.S 和 main.c 这两个文件

2.3.1、main.c

#include "fsl_common.h"
#include "fsl_iomuxc.h"
#include "MCIMX6Y2.h"/*使能外设时钟*/
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;}/*初始化LED灯*/
void led_init(void)
{IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03,0); /*复用为GPIO--IO03 */IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03,0x10B0);/*设置GPIO__IO03电器属性*/GPIO1->GDIR=0x8;//设置为输出GPIO1->DR=0x0; //设置为低电平,打开LED灯}
/*短延时*/
void delay_short(volatile unsigned int n)
{while(n--){}}
/** 延时  一次循环大概是1ms 在主频396MHz* n:延时ms数
*/
void delay(volatile unsigned int n)
{while (n--){delay_short(0x7ff);}}
/*打开LED灯*/
void  led_on(void)
{GPIO1->DR&= ~(1<<3); //bit3清零}
/*关闭LED灯*/
void led_off(void )
{GPIO1->DR |= (1<<3);  //bit3置1
}
int main() 
{clk_enable();  //使能外设时钟led_init(); //初始化LEDwhile(1){led_off();  delay(1000);led_on();delay(1000);}return 0;
}

我们重点来看一下 led_init 函数中的第 22 行和第 25 行,这两行的内容如下:

IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0);
IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0X10B0);

这 里 使 用 了 两 个 函 数 IOMUXC_SetPinMux 和 IOMUXC_SetPinConfig , 其 中 函 数IOMUXC_SetPinMux 是 用 来 设 置 IO 复 用 功 能 的 , 最 终 肯 定 设 置 的 是 寄 存 器“IOMUXC_SW_MUX_CTL_PAD_XX”。函数 IOMUXC_SetPinConfig 设置的是 IO 的上下拉、速度等的,也就是寄存器“IOMUXC_SW_PAD_CTL_PAD_XX”,所以上面两个函数其实就是上一章中的:

IOMUX_SW_MUX->GPIO1_IO03 = 0X5;
IOMUX_SW_PAD->GPIO1_IO03 = 0X10B0;

函数 IOMUXC_SetPinMux 在文件 fsl_iomuxc.h 中定义,函数源码如下:

static inline void IOMUXC_SetPinMux(uint32_t muxRegister,uint32_t muxMode,uint32_t inputRegister,uint32_t inputDaisy,uint32_t configRegister,uint32_t inputOnfield)
{
*((volatile uint32_t *)muxRegister) =IOMUXC_SW_MUX_CTL_PAD_MUX_MODE(muxMode) |IOMUXC_SW_MUX_CTL_PAD_SION(inputOnfield);
if (inputRegister){*((volatile uint32_t *)inputRegister) =IOMUXC_SELECT_INPUT_DAISY(inputDaisy);}
}

函数 IOMUXC_SetPinMux 有 6 个参数,这 6 个参数的函数如下:

  • muxRegister : IO 的 复 用 寄 存 器 地 址 , 比 如 GPIO1_IO03 的 IO 复 用 寄 存 SW_MUX_CTL_PAD_GPIO1_IO03 的地址为 0X020E0068。
  • muxMode: IO 复用值,也就是 ALT0~ALT8,对应数字 0~8,比如要将 GPIO1_IO03 设置为 GPIO 功能的话此参数就要设置为 5。
  • inputRegister: 外设输入 IO 选择寄存器地址,有些 IO 在设置为其他的复用功能以后还需要设置 IO 输入寄存器,比如 GPIO1_IO03 要复用为 UART1_RX 的话还需要设置寄存器UART1_RX_DATA_SELECT_INPUT,此寄存器地址为0X020E0624。
  • inputDaisy: 寄存器 inputRegister 的值,比如 GPIO1_IO03 要作为 UART1_RX 引脚的话此参数就是 1。
  • configRegister:未使用,函数 IOMUXC_SetPinConfig 会使用这个寄存器。
  • inputOnfield : IO 软 件 输 入 使 能 , 以 GPIO1_IO03 为 例 就 是 寄 存 器SW_MUX_CTL_PAD_GPIO1_IO03 的 SION 位(bit4)。如果需要使能 GPIO1_IO03 的软件输入功能的话此参数应该为 1,否则的话就为 0。

第一次看到上面代码的时候肯定会奇怪,为何只有两个参数?不是应该 6 个参数的吗?不要着急,先看一个 IOMUXC_GPIO1_IO03_GPIO1_IO03 是个什么玩意。这是个宏,在文件fsl_iomuxc.h 中有定义, NXP 的 SDK 库将一个 IO 的所有复用功能都定义了一个宏,比如GPIO1_IO03 就有如下 9 个宏定义:

IOMUXC_GPIO1_IO03_I2C1_SDA
IOMUXC_GPIO1_IO03_GPT1_COMPARE3
IOMUXC_GPIO1_IO03_USB_OTG2_OC
IOMUXC_GPIO1_IO03_USDHC1_CD_B
IOMUXC_GPIO1_IO03_GPIO1_IO03
IOMUXC_GPIO1_IO03_CCM_DI0_EXT_CLK
IOMUXC_GPIO1_IO03_SRC_TESTER_ACK
IOMUXC_GPIO1_IO03_UART1_RX
IOMUXC_GPIO1_IO03_UART1_TX

上面 9 个宏定义分别对应着 GPIO1_IO03 的九种复用功能,比如复用为 GPIO 的宏定义就是:

#define IOMUXC_GPIO1_IO03_GPIO1_IO03 0x020E0068U, 0x5U, 0x00000000U, 0x0U, 0x020E02F4U

将这个宏带入到“示例代码 22 行以后就是

IOMUXC_SetPinMux (0x020E0068U, 0x5U, 0x00000000U, 0x0U, 0x020E02F4U, 0);

这样就与函数 IOMUXC_SetPinMux 的 6 个参数对应起来了,如果我们要将 GPIO1_IO03 复用为 I2C1_SDA 的话就可以使用如下代码:

IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_I2C1_SDA, 0);

函数 IOMUXC_SetPinConfig,此函数同样在文件 fsl_iomuxc.h 中有定义,函数源码如下:

static inline void IOMUXC_SetPinConfig(uint32_t muxRegister,uint32_t muxMode,uint32_t inputRegister,uint32_t inputDaisy,uint32_t configRegister,uint32_t configValue)
{
if (configRegister)
{
*((volatile uint32_t *)configRegister) = configValue;
}
}

函数 IOMUXC_SetPinConfig 有 6 个参数,其中前五个参数和函数 IOMUXC_SetPinMux 一样,但是此函数只使用了参数 configRegister 和 configValue, cofigRegister 参数是 IO 配置寄存器地址,比如 GPIO1_IO03 的 IO 配置寄存器为 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03,其地址为 0X020E02F4,参数 configValue 就是要写入到寄存器 configRegister 的值。同理,25 行展开以后就是:

IOMUXC_SetPinConfig(0x020E0068U, 0x5U, 0x00000000U, 0x0U, 0x020E02F4U, 0X10B0);

根据函数 IOMUXC_SetPinConfig 的源码可以知道,上面函数就是将寄存器 0x020E02F4 的值设置为 0X10B0。函数 IOMUXC_SetPinMux 和 IOMUXC_SetPinConfig 就讲解到这里,我们以后就可以使用这两个函数来方便的配置 IO 的复用功能和 IO 配置。

2.3.2、start.s

.global _start
.global _bss_start
_bss_start:.word __bss_start
.global _bss_end
_bss_end:.word __bss_end_start:/*设置处理器进入SVC模式 */mrs r0,cpsr      /*读取cpsr到r0 */bic r0,r0,#0x1f  /*清除cpsr的bit4--0 */orr r0,r0,#0x13  /*使用SVC模式 */msr cpsr,r0      /*将r0写入到cpsr中去 *//*清除bss段 */ldr r0, _bss_startldr r1, _bss_endmov r2, #0bss_loop:stmia r0!, {r2}cmp r0, r1ble bss_loop/*设置SP指针 */ldr sp,=0x80200000b main /*跳转到C语言main函数 */    

2.3.3、编写链接脚本

SECTIONS
{. = 0x87800000;.text :{start.o*(.text)}.rodata ALIGN(4) : {*(.rodata*)}.data ALIGN(4) : {*(.data)}__bss_start = .;.bss ALIGN(4) : { *(.bss) *(COMMON)}__bss_end = .;
}

2.3.4、编写Makefile

CROSS_COMPILE  ?= arm-linux-gnueabihf-
NAME 		   ?= ledcCC 			   := $(CROSS_COMPILE)gcc 
LD			   := $(CROSS_COMPILE)ld
OBJCOPY		   := $(CROSS_COMPILE)objcopy
OBJDUMP		   := $(CROSS_COMPILE)objdumpOBJS           := 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 : %.c $(CC) -Wall -nostdlib -c -O2 -o $@  $<%.o : %.s$(CC) -Wall -nostdlib -c -O2 -o $@ $<clean:rm -rf *.o $(NAME).elf $(NAME).bin $(NAME).dis

3.编译下载

使用 Make 命令编译代码,编译成功以后使用软件 imxdownload 将编译完成的 ledc.bin 文件下载到 SD 卡中,命令如下:

chmod 777 imxdownload //给予 imxdownload 可执行权限,一次即可
./imxdownload ledc.bin /dev/sdd //烧写到 SD 卡中

烧写成功以后将 SD 卡插到开发板的 SD 卡槽中,然后复位开发板,如果代码运行正常的话 LED0 就会以1000ms 的时间间隔亮灭

具体参考前面几篇博文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leaflet中添加的不同图层样式图标

如上图&#xff0c;具体问题请查看对应html页引用的basemaps的css样式。 如下图是本项目引用的css样式&#xff1a; .basemap img { width: 48px; border: 2px solid #FFF; margin: 0 2px; /*border-radius: 40px;*/ box-shadow: 0 1px 5px rgba(0,0,0,0.65)} 当css样式中的bor…

ARM(IMX6U)BSP工程文件管理(分文件编程)

参考&#xff1a;Linux之ARM&#xff08;IMX6U&#xff09;BSP工程管理实验 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-08-15 23:41:37 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/108028093 目录1、工程管理简介1.1、创建bsp、imx6…

php图片视频,PHP中使用php5-ffmpeg撷取视频图片实例

前几天在玩 FFmpeg 的时后&#xff0c;突然发现 Ubuntu 上多了 php5-ffmpeg 这个扩充套件&#xff0c;就想来玩玩看&#xff0c;看好不好用&#xff0c;有两个结论&#xff1a;读取影片取决于 FFmpeg 的支援性&#xff0c;如果想要什么格式都支援的话&#xff0c;建议自己重新编…

ARM(IMX6U)裸机C语言蜂鸣器驱动实验(BSP+SDK)

参考&#xff1a;Linux之ARM&#xff08;IMX6U&#xff09;裸机C语言蜂鸣器驱动实验–驱动编写,编译 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-08-16 14:47:23 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/108032168 目录1、有源蜂鸣…

java金字塔的流程图,R中的金字塔图

Plotrix可能更容易&#xff0c;但可以反汇编ggplot图表&#xff0c;并将它们排列为金字塔图 . 使用 eipi10的数据(谢谢)&#xff0c;并调整drawing-pyramid-plot-using-r-and-ggplot2中的代码&#xff0c;我为"males"&#xff0c;"females"和"country…

ARM(IMX6U)裸机按键输入实验(BSP+SDK、GPIO输入与输出、按键消抖)

参考&#xff1a;Linux之ARM&#xff08;IMX6U&#xff09;裸机按键输入实验&#xff08;GPIO的输出与输入&#xff09; 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-08-17 21:43:37 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/108057…

php 提取正文算法,PHP生成文章摘要算法_栈

之前网上复制了一个摘要算法&#xff0c;一直使用正常。最近写的一篇前500字里含有超链接&#xff0c;就导致摘要生成有误&#xff0c;从而影响了前端样式。所以后面打算自己写&#xff0c;想起大学编译原理匹配表达式的大致思想&#xff0c;就决定采用栈的思想试试。实现目标&…

设计模式 之 《组合模式》

GOOD&#xff1a;整体和部分可以被一致对待&#xff08;如WORD中复制一个文字、一段文字、一篇文章都是一样的操作&#xff09; #ifndef __COMPOSITE_MODEL__ #define __COMPOSITE_MODEL__ #include <iostream> #include <string> #include <vector> using n…

ARM(IMX6U)裸机主频和时钟

参考&#xff1a;Linux之ARM&#xff08;IMX6U&#xff09;裸机主频和时钟配置 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-08-28 10:39:17 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/108237599 目录1、I.MX6U 时钟系统详解系统时钟…

关联矩阵古林法的matlab代码,[转载][原创]灰色关联分析及Matlab程序实现

灰色系统理论由我国著名学者邓聚龙教授于1982提出。灰色关联分析是灰色系统理论的一个分支&#xff0c;应用灰色关联分析方法对受多种因素影响的事物和现象从整体观念出发进行综合评价是一个被广为接受的方法。一、灰色关联分析法的建模过程灰色关联分析法的基本思想是根据各比…

C语言排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)

参考&#xff1a;C语言五大排序&#xff08;桶排序&#xff0c;冒泡排序&#xff0c;选择排序&#xff0c;插入排序&#xff0c;快速排序&#xff09;动态演示 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-09-09 20:18:43 网址&#xff1a;https://blog.csdn.net/we…

FIFO分枝_限界算法

问题&#xff1a; 检索4-皇后问题的状态空间树如下图的基本过程。&#xff08;4-皇后问题解空间的树结构&#xff0c;结点按深度优先检索编号&#xff09; 如果按序扩展这些结点&#xff0c;则下一个E-结点就是结点2。扩展结点2后生成结点3&#xff0c;8和13。利用限界函数(同行…

智能家居APP使用指南

参考&#xff1a;智能家居APP使用指南 作者&#xff1a;图触靓 发布时间&#xff1a; 2021-04-14 14:11:40 网址&#xff1a;https://blog.csdn.net/bhbhhyg/article/details/115694774 目录一、如何修改IP&#xff0c;端口号&#xff0c;以及发送的指令二、如何增加或者删除一…

python zlib字符串压缩

2019独角兽企业重金招聘Python工程师标准>>> 在做网络程序时,可以对字符串进行压缩来节省带宽 项目中用到 {"compress": <压缩标记>, "result":[[设备类型.设备ID, 设备名称, 单位ID, 设备功能], ...]} 只做了简单的压缩解压缩,也没crc3…

linux做一个客户端与WemosD1作为服务器的无线通信(局域网通信)

参考&#xff1a;linux做一个客户端与WemosD1作为服务器的无线通信&#xff08;局域网通信&#xff09; 作者&#xff1a;枕上 发布时间&#xff1a;2021-07-19 23:33:44 网址&#xff1a;https://blog.csdn.net/jinchi_boke/article/details/118916896?utm_sourceapp&app…

C语言学习书籍推荐《C语言程序设计 现代方法(第2版)》下载

下载地址&#xff1a;点我 C语言仍然是计算机领域的通用语言之一&#xff0c;但现在的C语言已经和当初的时候大不相同了。本书主要的一个目的就是通过一种“现代方法”来介绍C语言&#xff0c;书中强调标准C&#xff0c;强调软件工程&#xff0c;不再强调“手工优化”。这一版中…

wemosD1_WIFI模块 与 arduino

参考&#xff1a;wemosD1_WIFI模块 与 arduino 作者&#xff1a;枕上 发布时间&#xff1a;2021-07-19 21:49:55 网址&#xff1a;https://blog.csdn.net/jinchi_boke/article/details/118915142 目录作为设备接入wifi&#xff08;STA模式&#xff09;架设Wemos为ftp服务器ardu…

本机在合成图片经常提示内存不足

转载于:https://www.cnblogs.com/niyl/p/9988614.html

tp5 php7 报500,记一次TP单元测试报500错误的问题

记一次TP单元测试报500错误的问题一直听说好的单元测试能提高代码质量&#xff0c;昨天终于在下定决心弄懂单元测试&#xff0c;但第一步就把我干趴下了&#xff0c;我的问题在下面开始都没有什么问题&#xff0c;tp5单元测试的手册就那一点&#xff0c;通过看云上一位仁兄写的…

H3C配置

H3C交换机配置 1.查看设备版本,确定是否需要升级 <H3C>dis version 2.vlan及接口配置 注&#xff1a;正式配置前可以查看下现有的VLAN。命令如下 <H3C>dis vlan <H3C>sys                          //进入系统视图模式 [H3C]vlan …