正点原子[第二期]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)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 正常闪烁。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

随便聊一下 显控科技 控制屏 通过 RS485 接口 上位机 通讯 说明

系统搭建&#xff1a; 1、自己研发的一个小系统&#xff08;采集信号&#xff0c;将采集的信号数字化&#xff09;通过COM口&#xff0c;连接显控屏 COM3 口采用 485 协议送到显控屏&#xff08;显控科技&#xff09;的显示屏展示出来&#xff09;。 2、显控屏 将 展示的数据…

【C++ | 关键字】C++ 关键字介绍

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-05-04 0…

鸿蒙内核源码分析(汇编传参篇) | 如何传递复杂的参数

汇编如何传复杂的参数? 汇编基础篇 中很详细的介绍了一段具有代表性很经典的汇编代码&#xff0c;有循环&#xff0c;有判断&#xff0c;有运算&#xff0c;有多级函数调用。但有一个问题没有涉及&#xff0c;就是很复杂的参数如何处理? 在实际开发过程中函数参数往往是很复…

小程序账号设置以及request请求的封装

一般开发在小程序时&#xff0c;都会有测试版和正式版&#xff0c;这样在开发时会比较方便。 在开发时。产品经理都会给到测试账号和正式账号&#xff0c;后端给的接口也都会有测试环境用到的接口和正式环境用到的接口。 这里讲一讲我这边如何去做的。 1.在更目录随便命名一…

吴恩达2022机器学习专项课程(一)正则化(正则化成本函数正则化线性回归正则化逻辑回归)

目录 一.正则化1.1 正则化的好处1.2 正则化的实现方式 二.正则化改进线性回归的成本函数2.1 正则化后的成本函数的意义2.2 λ参数的作用2.3 不同λ对算法的影响2.4 为什么参数b没有正则化项 三.正则化线性回归的梯度下降3.1 为什么正则化可以在梯度下降迭代中减小w3.2 导数的计…

如何在Mac上恢复格式化硬盘的数据?

“嗨&#xff0c;我格式化了我的一个Mac硬盘&#xff0c;而没有使用Time Machine备份数据。这个硬盘被未知病毒感染了&#xff0c;所以我把它格式化为出厂设置。但是&#xff0c;我忘了备份我的文件。现在&#xff0c;我想恢复格式化的硬盘驱动器并恢复我的文档&#xff0c;您能…

面试算法题精讲:最长公共子串

面试算法题精讲&#xff1a;最长公共子串 最长公共子串问题是指给定两个字符串S1和S2&#xff0c;求它们的公共子串中最长的那一个。其实就是求两个字符串的最长重复子串。 最朴素的算法就是枚举S1和S2的每一对子串&#xff0c;然后判断它们是否相等&#xff0c;时间复杂度是…

手搓堆(C语言)

Heap.h #pragma once#include <stdio.h> #include <stdlib.h> #include <assert.h> #include <stdbool.h> #include <string.h> typedef int HPDataType; typedef struct Heap {HPDataType* a;int size;int capacity; }Heap;//初始化 void Heap…

Java Jackson-jr 库是干什么用的

Jackson-jr 是一个轻量级的Java JSON 处理库。这个库被设计用来替代 Jackson 的复杂性。对比 Jackson 的复杂 API&#xff0c;Jackson-jr 的启动速度更快&#xff0c;包大小更小。 虽然Jackson databind&#xff08;如ObjectMapper&#xff09;是通用数据绑定的良好选择&#…

如何从Mac电脑恢复任何删除的视频

Microsoft Office是包括Mac用户在内的人们在世界各地创建文档时使用的最佳软件之一。该软件允许您创建任何类型的文件&#xff0c;如演示文稿、帐户文件和书面文件。您可以使用 MS Office 来完成。所有Microsoft文档都可以在Mac上使用。大多数情况下&#xff0c;您处理文档&…

苹果CEO对未来一代人工智能投资持乐观态度

尽管在动荡的第二季度&#xff0c;苹果的收入和iPhone销量有所下降&#xff0c;但其新兴的人工智能技术可能会带来急需的提振。 在5月2日的电话财报会议上&#xff0c;苹果公布季度收入为908亿美元&#xff0c;比去年下降4%。iPhone的收入也下降了10%&#xff0c;至460亿美元。…

《Python编程从入门到实践》day19

#昨日知识点回顾 使用unittest模块测试单元和类 #今日知识点学习 第12章 武装飞船 12.1 规划项目 游戏《外星人入侵》 12.2 安装pygame 终端管理器执行 pip install pygame 12.3 开始游戏项目 12.3.1 创建Pygame窗口及响应用户输入 import sysimport pygameclass…

SpringCloud微服务项目创建流程

为了模拟微服务场景&#xff0c;学习中为了方便&#xff0c;先创建一个父工程&#xff0c;后续的工程都以这个工程为准&#xff0c;实用maven聚合和继承&#xff0c;统一管理子工程的版本和配置。 后续使用中只需要只有配置和版本需要自己规定之外没有其它区别。 微服务中分为…

电脑数据怎么拷贝到u盘?操作指南与数据丢失防范

在数字时代&#xff0c;数据的传输与备份已成为我们日常生活和工作中不可或缺的一部分。U盘作为一种便捷、高效的移动存储设备&#xff0c;广泛应用于各种数据拷贝场景。无论是个人文件的备份&#xff0c;还是工作资料的传输&#xff0c;U盘都发挥着举足轻重的作用。那么&#…

【刷题(1)】链表

一、链表问题基础 移动:head=head.next 移动到最后:head.next=null 停止:if not xx: 相当于if not null: 取值:a.val 赋值:b.next=a 遍历:while head: head=head.next 或者: if not head: head=head.next 递归:单链表: def func(pre,cur): return func(pre.next,cur.…

Windows安装Ubuntu24详细教程

从官网下载ISO镜像&#xff1a; 使用VMWare创建新的虚拟机&#xff1a; 选择刚才下载的ISO镜像&#xff1a; 填写账号和密码&#xff1a; 选择安装位置和虚拟机名称&#xff0c;因为我装这个主要是为了QT开发的&#xff0c;所以名字叫ubuntu24_for_qt&#xff1a; 处理…

基于大爆炸优化算法的PID控制器参数寻优matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于大爆炸优化算法的PID控制器参数寻优matlab仿真。对比优化前后的PID控制输出。 2.系统仿真结果 3.核心程序与模型 版本&#xff1a;MATLAB2022a .....................…

前端 JS 异常那些事

前言 人无完人&#xff0c;所以代码总会出异常的&#xff0c;异常并不可怕&#xff0c;关键是怎么处理 什么是异常 程序发生了意想不到的情况&#xff0c;影响到了程序的正确运行 从根本上来说&#xff0c;异常就是一个普通的对象&#xff0c;其保存了异常发生的相关信息&a…

通过符号程序搜索提升prompt工程

原文地址&#xff1a;supercharging-prompt-engineering-via-symbolic-program-search 通过自动探索​​大量提示变体来找到更好的提示 2024 年 4 月 22 日 众所周知&#xff0c;LLMs的成功在很大程度上仍然取决于我们用正确的指导和例子来提示他们的能力。随着新一代LLMs变得越…

django搭建一个AI博客进行YouTube视频自动生成文字博客

文章目录 一、生成Django框架二、项目代码&#xff08;前端&#xff09;1、编写前端代码&#xff08;正文界面&#xff09;1.1、生产html框架1.2、添加live preview扩展1.3、更改title元素中文本1.4、添加CDN&#xff08;CSS&#xff09;样式链接1.5、nav标签1.6、在body标签中…