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

news2025/1/15 16:55:43

 前言:

本文是根据哔哩哔哩网站上“正点原子[第二期]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)objdump

NAME = 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.coloradmin.cn/o/1641212.html

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

相关文章

IDEA 多模块项目报错 Cannot Save Settings 问题

IDEA 多模块项目报错 Cannot Save Settings 问题 Cannot Save Settings&#xff1a; Module "spring_cloud_sentinel_demo" must not contain source root "D:\java_test\Intesij_idea\spring_cloud_sentinel_demo\order_service_rest\src\main\resources"…

一键去除衣物DeepNode合成软件下载

dn软件Windows版下载地址&#xff1a;点击下载 ai一键去除衣物(DeepNode)是一款非常好用的一键换装软件&#xff0c;它可以创造出不同的图像效果&#xff0c;还可以对人的面部特征进行微调&#xff0c;使用户的图片更有特色。软件中还有许多模板可以随意使用以供参考&#xff0…

高效时间序列分析的开源利器:QuestDB

QuestDB&#xff1a;探索数据的深度&#xff0c;加速决策的速度- 精选真开源&#xff0c;释放新价值。 概览 时序数据库&#xff08;Time Series Database&#xff0c;简称TSDB&#xff09;是一种专门设计和优化的数据库系统&#xff0c;用于高效地存储、管理和查询带有时间戳…

【neteq】tgcall的调用

G:\CDN\P2P-DEV\Libraries\tg_owt\src\call\call.cc基本是按照原生webrtc的来的:G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\group\GroupInstanceCustomImpl.cpptg对neteq的使用 worker 线程创建call Call的config需要neteqfactory Call::CreateAu…

C语言-链表实现贪吃蛇控制台游戏

使用C语言和链表实现贪吃蛇游戏 一、引言 贪吃蛇游戏是一个经典的游戏&#xff0c;它的玩法简单而富有挑战性。在这个博客中&#xff0c;我将分享如何使用C语言和链表数据结构来自主实现贪吃蛇游戏。我会详细介绍游戏的设计思路、编码过程、遇到的问题及解决方案&#xff0c;…

PG控制文件的管理与重建

一.控制文件位置与大小 逻辑位置&#xff1a;pgpobal 表空间中 物理位置&#xff1a;$PGDATA/global/pg_control --pg_global表空间的物理位置就在$PGDATA/global文件夹下 物理大小&#xff1a;8K 二.存放的内容 1.数据库初始化的时候生成的永久化参数&#xff0c;无法更改…

Java项目:基于SSM框架实现的在线医疗服务系统(ssm+B/S架构+源码+数据库+毕业论文+开题报告)

一、项目简介 本项目是一套基于SSM框架实现的在线医疗服务系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能…

基于小程序实现的投票评选系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

企业定制AI智能名片商城小程序:重塑营销场景,引领数字化营销新纪元

在数字化时代的浪潮中&#xff0c;多企业AI智能名片商城小程序以其独特的魅力和创新的功能&#xff0c;为消费者带来了前所未有的购物体验。它不仅是一个汇聚各类商品的购物平台&#xff0c;更是一个充满活力和创造力的社群生态。通过强化社群互动、鼓励用户生成内容以及引入积…

【Java从入门到精通】Java继承

继承的概念 继承是java面向对象编程技术的一块基石&#xff0c;因为它允许创建分等级层次的类。 继承就是子类继承父类的特征和行为&#xff0c;使得子类对象&#xff08;实例&#xff09;具有父类的实例域和方法&#xff0c;或子类从父类继承方法&#xff0c;使得子类具有父…

家庭用水安全新举措:保障自来水管和储水设施卫生

随着公众对家庭用水安全意识的提高&#xff0c;如何确保自来水管和楼顶储水罐的安全性和卫生已成为家庭生活中的重要议题。近期&#xff0c;专家针对此问题提出了一系列实用的注意事项和建议。 注意事项&#xff1a; 定期检查&#xff1a;专家强调&#xff0c;家庭应每季度至…

【华为 ICT HCIA eNSP 习题汇总】——题目集20

1、&#xff08;多选&#xff09;若两个虚拟机能够互相ping通&#xff0c;则通讯过程中会使用&#xff08;&#xff09;。 A、虚拟网卡 B、物理网卡 C、物理交换机 D、分布式虚拟交换机 考点&#xff1a;数据通信 解析&#xff1a;&#xff08;AD&#xff09; 物理网卡是硬件设…

./build.sh:行1: g++: 未找到命令的错误问题在centos操作系统下面如何解决

目录 g: 未找到命令报错解释g: 未找到命令解决方法 centos操作系统&#xff0c;执行一个bash&#xff0c;bash命令很简单&#xff0c;就是用g编译一个C的程序。报告错误&#xff1a; ./build.sh:行1: g: 未找到命令 g: 未找到命令报错解释 这个错误表明在执行名为 build.sh 的…

ElasticSearch01(ES简介,安装ES,操作索引,操作文档,RestAPI)【全详解】

目录 一、ES简介 1. 数据库查询的问题 2. ES简介 1 ElasticSearch简介 2 ElasticSearch发展 3. 倒排索引【面试】 1 正向索引 2 倒排索引 4. ES和MySql 5. 小结 二、安装ES 1. 方式1:使用docker安装 1 准备工作 2 创建ElasticSearch容器 3 给ElasticSearch配置i…

Mybatis之Sqlsession、Connection和Transaction三者间的关系

前言 最近在看Mybatis的源码&#xff0c;搜到这篇文章Sqlsession、Connection和Transaction原理与三者间的关系&#xff0c;debug之后发现有不少疑惑&#xff0c;于是按照原文整理了一下&#xff0c;记录下debug中的一些困惑点。 对于我们开发来讲&#xff0c;不管跟任何关系…

ARP防火墙能够为网络安全贡献什么样的力量

ARP防火墙&#xff08;Address Resolution Protocol Firewall&#xff09;作为网络安全的一环&#xff0c;起到保护网络免受ARP欺骗攻击的关键作用。今天德迅云安全给您介绍ARP防火墙的相关方面&#xff0c;帮助您深入了解和认识这一关键的安全措施。 网络安全对于现代社会的信…

Python量化择时的技术指标函数

Python量化择时的技术指标函数 技术指标通过对原始数据&#xff08;开盘价、收盘价、最低价、最高价、成交量、成交金额、成交笔数&#xff09;的处理&#xff0c;来反映出市场的某一方面深层的内涵&#xff0c;这些内涵是很难通过原始数据直接看出来的。技术指标能客观地反映…

力扣763. 划分字母区间

Problem: 763. 划分字母区间 文章目录 题目描述思路复杂度Code 题目描述 思路 1.创建一个名为 last 的数组&#xff0c;用于存储每个字母在字符串 s 中最后出现的位置。然后&#xff0c;获取字符串 s 的长度 len。 2.计算每个字母的最后位置&#xff1a;遍历字符串 s&#xff0…

springboot整合mybatis配置多数据源(mysql/oracle)

目录 前言导入依赖坐标创建mysql/oracle数据源配置类MySQLDataSourceConfigOracleDataSourceConfig application.yml配置文件配置mysql/oracle数据源编写Mapper接口编写Book实体类编写测试类 前言 springboot整合mybatis配置多数据源&#xff0c;可以都是mysql数据源&#xff…

R语言数据探索与分析-运用时间序列预测模型对成都市API进行预测分析

一、研究背景 “绿水青山就是金山银山&#xff0c;要让绿水青山变成金山银山”让人们深刻的意识到环境的重要性。与此同时&#xff0c;由于现代生活水平的不断提高&#xff0c;所带来的环境污染也不断增多&#xff0c;空气以及环境的污染带来了越来越多的疾病&#xff0c;深刻…