正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-10.1-NXP SDK 移植

 前言:

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

引用:

正点原子IMX6U仓库 (GuangzhouXingyi) - Gitee.com

《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5.2.pdf》

正点原子资料下载中心 — 正点原子资料下载中心 1.0.0 文档

正文:

本文是 “正点原子[第二期]Linux之ARM(MX6U)裸机篇--第10.1讲” 的读书笔记。第10.1 讲教程介绍了使用一直NXP SDK 的头文件来给我们自己使用。

NXP I.MX6ULL 芯片的有很多的外设寄存器,如果我们像上一节中一个一个的对照的芯片参考手册来自己写,工作量很大而且很容易写错,幸运的是NXP已经写到了SDK来提供给用户使用,在NXP的SDK里已经定义好了所有 NXP I.MX6ULL 的寄存器和设置使用寄存器的API。如果使用NXP的SDK中的API,我们就可以减少很多的工作量。

这一节我们将会移植NXP官方的SDK到我们的C语言LED灯驱动程序。

0.  移植NXP I.MX6U SDK 的头文件

参考正点原子的第10.1 教程视频,安装正点原子资料盘里附带的NXP正点原子SDK安装包,这个NXP SDK安装之后会把NXP官方提供的芯片文档和芯片SDK API源码解压都指定的目录。我们在解压目录里就可以找到NXP SDK的源码文件。

参考正点原子的第10.1 教程视频,需要移植的NXP SDK 有如下几个头文件:

  • fsl_common.h
  • fsl_iomuxc.h
  • MCIMX6y2.h

将这3个头文件放到我们的 “C语言LED驱动程序”文件夹,把这3个文件放到我们目录后,我们需要对这3个头文件进行一些修改。如果3个NXP SDK头文件直接进行编译会出现很多编译错误,原因是没有移植NXP SDK中的所有文件,我们删除头文件一些我们暂时不用内容,让文件能够通过编译。

正点原子I.MX6ULL ALPHA/Mini开发板使用的 I.MX6ULL 处理器的型号是 "MCIMX6Y2",我们到SDK NXP 的目录里找到需要移植的头文件。

nxp\SDK_2.2_MCIM6ULL\devices\MCIMX6Y2
1nxp\SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\MCIMX6Y2.h
2nxp\SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\drivers\fsl_common.h
3nxp\SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\drivers\fsl_iomuxc.h

参考正点原子提供的示例源码中的头文件,修改NXP SDK中的这3个头文件,删除头文件中我们暂时不需要的内容,让头文件可以通过编译。这里修改 NXP SDK 3个头文件的细节这里不再截图详细展示,主要的就是参考正点原子提供的示例程序和正点原子第10.1讲的视频教程进行修改。

1. 修改 main.c 使用 NXP SDK 里提供的GPIO寄存器配置API接口函数

1.1 调用 NXP SDK 'IOMUXC_SetPinMux()' 设置IO复用

修改 main.c 使用 NXP SDK 里提供的GPIO寄存器配置API接口函数。在上一节博文中我们使用,"IOMUX_SW_MUX->GPIO1_IO03 = 0x5" 来设置 GPIO1_IO03 寄存器的值为 0x5 来选择复用 GPIO1_IO03 芯片管脚为 GPIO 模式。本节我们使用 NXP SDK 官方定义在 'fsl_iomuxc.h' 头文件里的 api 接口函数 "void IOMUXC_SetPinMux()" ,这个函数有6个形参,在调用的时候我们需要传入6参数给这个 api 。

在main.c中调用  "void IOMUXC_SetPinMux()" 的时候怎样传入6个实参哪?在mian.c 中我们通过如下方式来调用这个api:

IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0);	/*复用GPIO1_IO03为GPIO模式*/

下面解释一下这种调用方式是如何展开为传递6个参数给api  "IOMUXC_SetPinMux()" 的。在 ‘fsl_iomuxc.h’ 中定义了宏:

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

这样函数展开之后就是如下形式,宏 ‘IOMUXC_GPIO1_IO03_GPIO1_IO03’ 展开为了5个参数,加上最后一个参数'0',就传递了6个参数给 api  "IOMUXC_SetPinMux()",NXP SDK 定义的这种宏方式还是比较巧妙的。

IOMUXC_SetPinMux(0x020E0068U, 0x5U, 0x00000000U, 0x0U, 0x020E02F4U, 0);	/*复用GPIO1_IO03为GPIO模式*/

再来分析宏 ‘IOMUXC_GPIO1_IO03_GPIO1_IO03’ 展开为了5个参数:

  • “0x020E0068U” 就是I.MX6U 参考手册中GPIO1_IO03寄存器的地址。
  • "0x05" 就是 GPIO1_IO03 中选择复用模式5 (5为GPIO模式)。
  • 然后是 'inputRegister', 'iputDaisy' 这两个有有些 input 接口需要的这里我们不条轮其细节。
  • 然后是 'configRegister' 展开的宏中值为 ''0x020E02F4U" 就是I.MX6U 参考手册中GPIO1_IO03 电气特性寄存器的地址。
  • 最后一个参数'0' 是 'inputOnFiled' 对应着I.MX6U 参考手册中 GPIO1_IO03 寄存器中的 'SION' 域,这里关闭 'SION',所以传递的 'SION=0'值给api。

 

1.2 调用 NXP SDK 'IOMUXC_SetPinConfig()' 设置IO电气特性

同理,调用 NXP SDK 'IOMUXC_SetPinConfig()' 设置IO电气特性,这里需要传递给 'SDK 'IOMUXC_SetPinConfig()' api 第二个参数的值为 '0x10B0',这个值也就是前面一节中 ‘C语言LED驱动程序’中根据I.MX6U 参考手册中选择出来的GPIO 电气特性。

IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0x10B0); /*设置GPIO1_IO03电气特性*/

 

1.3 修改 Makefile

修改Makefile,这一次我们使用 'CROSS_COMPILE' 和 'CC=$(CROSS_COMPILE)gcc' , 'LD=$(CROSS_COMPILE)ld' 的方式来定义makefile变量,来更方便的使用 arm 交叉编译工具,这种 makefile 也是 uboot, Kernel 编译makefile的风格。

CROSS_COMPILE	?= arm-linux-gnueabihf-
CC		:= $(CROSS_COMPILE)gcc
LD		:= $(CROSS_COMPILE)ld
OBJCOPY		:= $(CROSS_COMPILE)objcopy
OBJDUMP		:= $(CROSS_COMPILE)objdumpNAME = ledc
OBJS = start.o main.o $(NAME).bin : $(OBJS)$(LD) -Timx6u.lds -o $(NAME).elf $^$(OBJCOPY) -O binary -S $(NAME).elf $(NAME).bin$(OBJDUMP) -D -m arm $(NAME).elf > $(NAME).dis%.o : %.c$(CC)  -Wall -nostdlib -c -o $@ $<%.o : %.s$(CC) -Wall -nostdlib -c -o $@ $<clean:rm -rf *.o $(NAME).bin $(NAME).elf $(NAME).dis

2. 编译移植的 NXP SDK 风格的 LED 驱动程序

执行命令来编译编译移植的 NXP SDK 风格的 LED 驱动程序,如果遇到编译错误,需要查看下编译器输出的错误提示信息来修改错误然后再次编译。我本地实验的时候遇到的编译错误比较少,很快就验证了 NXP SDK 移植编译通过。

3. 烧录SD卡验证LED灯

烧录SD卡验证LED灯,使用正点原子提供的 'imxdownload' 烧录SD卡,然后把SD卡查到正点原子 I.MX6U APLHA/Mini 开发板上验证移植的 NXP SDK LED 灯驱动程序是否运行正常,LED灯正常闪烁。我本地实验验证结果是 LED 正常闪烁。

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

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

相关文章

夸克网盘拉新怎么做?分享网盘拉新攻略!

夸克网盘拉新怎么做&#xff1f;如何通过推广夸克网盘来赚佣金&#xff1f;相信大家应该都使用过夸克网盘&#xff0c;现在夸克网盘的拉新赚佣金活动开展的如火如荼&#xff0c;不少朋友通过夸克网盘拉新赚取收益&#xff0c;真的很香。还有一部分想要赚佣金但是不知道如何操作…

C语言例题39、输入一个正整数,将其反方向逆序输出

#include <stdio.h>void main() {int x;int ge; //个位int result 0;printf("请输入一个正整数&#xff1a;");scanf("%d", &x);while (x > 0) {//解题原理ge x % 10;//每次分解取得个位的数字result result * 10 ge;//个十百千万顺序向左…

libcity 笔记:添加自定义dataset

假设我们把libcity/data/dataset/trajectory_dataset.py复制一份到libcity/data/dataset/dataset_subclass/GeolifeDM_dataset.py&#xff0c;里面内容不变&#xff0c;只是把class的名字换了 那其他需要修改哪些内容&#xff0c;使得这个dataset生效呢 libcity/data/dataset/d…

Python应用:让生活更智能

随着科技的进步&#xff0c;Python已成为一种非常受欢迎的编程语言&#xff0c;它在数据分析、人工智能、Web开发等领域有着广泛的应用。今天&#xff0c;我们将探讨一个Python应用的例子&#xff0c;这个应用将帮助我们更智能地管理日常生活。 应用名称&#xff1a;智能生活助…

福建 | 福建铭发用行动诠释“敢为天下先”的泉州精神

福建铭发 泉州TOP级企业 在福建&#xff0c;提到混凝土搅拌站&#xff0c;铭发是绕不开的一个存在。 他们是当地最早一批建成的商砼企业&#xff0c;也是如今发展规模最大的TOP级企业。 从2007年建站至今&#xff0c;近15年的发展&#xff0c;他们形成了一套铭发特色的企业经…

Windows平台PyCharm之PySide6开发环境搭建与配置

PySide6 是一个用于创建跨平台 GUI 应用程序的库&#xff0c;它是 Qt for Python 的官方库。Qt 是一个跨平台的 C 应用程序框架&#xff0c;用于开发具有图形用户界面&#xff08;GUI&#xff09;的应用程序。PySide6 允许开发者使用 Python 语言访问 Qt 的功能&#xff0c;从而…

数据结构(十一)----图的应用

目录 一.最小生成树 1.Prim算法&#xff08;普里姆&#xff09; 2.Kruskal算法(克鲁斯卡尔): 二.最短路径&#xff08;BFS算法&#xff09; 1.单源最短路径 &#xff08;1&#xff09;BFS算法&#xff08;无权图&#xff09; &#xff08;2&#xff09;Dijkstra算法&…

不走寻常路!酷开科技不断升级酷开系统满足消费者日益增长的需求

在科技日新月异的今天&#xff0c;人们对生活品质的要求越来越高。为此&#xff0c;酷开科技不断升级酷开系统&#xff0c;以满足消费者日益增长的需求。为了让消费者体验更好的服务&#xff0c;在酷开系统中设立了酷开会员&#xff0c;满足消费者的更多需求。丰富的特权和定制…

STL学习笔记

1 基本概念 1.1 STL STL(Standard Template Library,标准模板库)STL从广义上分为: 容器(container) 算法(algorithm) 选代器(iterator)容器和算法之间通过迭代器&#xff08;看作指针&#xff09;进行无缝连接STL 几乎所有的代码都采用了横板类或者模板函数 1.2 容器 STL容器…

图片如何压缩到500kb以下?3步完成图片压缩

在日常生活和工作中&#xff0c;经常需要处理各种图片&#xff0c;而有时候图片文件过大&#xff0c;不仅占用了大量的存储空间&#xff0c;还可能影响文件的传输速度和加载速度。因此&#xff0c;如何将图片压缩到500kb以内成为了许多人的需求&#xff0c;普通的图片压缩可能没…

使用Docker安装Whistle Web Debugging Proxy

大家好&#xff0c;继续给大家分享如何使用docker来安装Whistle Web Debugging Proxy&#xff0c;关于Whistle Web Debugging Proxy的介绍和使用&#xff0c;大家可以参考下面文章&#xff0c;希望本文能够给大家的工作带来一定帮助。 Whistle Web Debugging Proxy介绍及使用 …

vue+lodop实现web端打印标签功能

背景&#xff1a;项目要求在web端连接标签打印机&#xff0c;打印收件人信息 lodop打印插件地址&#xff1a;Lodop和C-Lodop官网主站 在项目中使用 1、去官网下载lodop包下载中心 - Lodop和C-Lodop官网主站 windows系统直接下载windows32版的就可以 2、解压安装 点击CLodop…

SpringCloud Config 分布式配置中心

SpringCloud Config 分布式配置中心 概述分布式系统面临的——配置问题ConfigServer的作用 Config服务端配置Config客户端配置 可以有一个非常轻量级的集中式管理来协调这些服务 概述 分布式系统面临的——配置问题 微服务意味着要将单体应用中的业务拆分成一个个字服务&…

python如何整体缩进

python自带编辑器的缩进和取消缩进快捷键&#xff1a; 整体缩进 Ctrl【 整体取消缩进 Ctrl】 pycharm编辑器的缩进和取消缩进快捷键&#xff1a; 整体缩进&#xff1a; tab 整体取消缩进&#xff1a; tabshift

HDMI ARC功能详解及应用介绍

一、HDMI HDMI(High-Definition Multimedia Interface&#xff0c;高清多媒体接口)&#xff0c;是一种专用的音频/视频接口&#xff0c;用于发送未压缩的视频数据和压缩/未压缩的音频数据。HDMI是模拟视频标准的数字替代品。HDMI视频和音频信号传输通道采用了TMDS&#xff08;T…

【经验总结】Vue2中的全局变量(store

需求场景 需要在vue中存储一个可变的&#xff0c;可读写的全局变量在不同的js、页面中均可调用和读写 技术&#xff1a;使用vue的store 用法总结 一、定义变量 1、找到vue的/src/store路径&#xff0c;在modules文件夹下创建文件&#xff08;这里便于测试创建demo.js&…

51单片机入门:DS1302时钟

51单片机内部含有晶振&#xff0c;可以实现定时/计数功能。但是其缺点有&#xff1a;精度往往不高、不能掉电使用等。 我们可以通过DS1302时钟芯片来解决以上的缺点。 DS1302时钟芯片 功能&#xff1a;DS1302是一种低功耗实时时钟芯片&#xff0c;内部有自动的计时功能&#x…

SpringBoot启动流程源码解析

目录 一、SpringApplication构造方法解析 1. web应用类型 2. BootstrapRegistryInitializer 3. ApplicationContextInitializer 4. ApplicationListener 5. 推断Main方法所在类 二、SpringApplication.run(String... args)方法解析 1.创建DefaultBootstrapContext 2.获…

订单超时自动取消的实践方案

1、定时任务方案 方案流程&#xff1a; 每隔 30 秒查询数据库&#xff0c;取出最近的 N 条未支付的订单。 遍历查询出来的订单列表&#xff0c;判断当前时间减去订单的创建时间是否超过了支付超时时间&#xff0c;如果超时则对该订单执行取消操作。 定时任务方案工程实现相…

【Vue】vue中将 html 或者 md 导出为 word 文档

原博主 xh-htmlword文档 感谢这位大佬的封装优化和分享&#xff0c;亲测有用&#xff01;可以去看大佬&#x1f447;的说明&#xff01; 前端HTML转word文档&#xff0c;绝对有效&#xff01;&#xff01;&#xff01; 安装 npm install xh-htmlword导入 import handleEx…