Qt点亮开发板的一个LED-思维导图-学习笔记-基于正点原子阿尔法开发板

news2024/9/22 3:30:30

Qt点亮开发板的一个LED

在这里插入图片描述

Qt如何操控开发板上的一个LED

Qt与硬件控制的关系

  • Qt本身并不直接控制开发板上的硬件,而是通过中间层进行交互

驱动层的作用

  • 驱动层是连接Qt应用层和硬件的关键部分,它提供了必要的接口和功能,使得Qt能够通过这些接口来操控硬件

接口的重要性

  • 这些由驱动层提供的接口是Qt应用与硬件交互的桥梁,对于应用开发人员来说,理解这些接口的功能和使用方法是至关重要的

应用开发人员的角色

  • 作为应用开发人员,需要与驱动开发人员沟通,确保了解并能够正确使用驱动层提供的接口,以便有效地控制硬件

驱动开发人员的责任

  • 驱动开发人员负责开发和维护这些接口,确保它们稳定、高效,并且能够满足应用层的需求

出厂内核设备树中注册的LED设备

编译出厂源码内核及模块

  • 获取开发板光盘上的源码

    • 路径:A-基础资料->1、例程源码->3、正点原子 Uboot 和 Linux 出厂源码->linux-imx-4.1.15-2.1.0-gxxxxxx-vxx.tar.xz

    • 文件格式:可能是 .xz 或者 .bz2

  • 将源码文件拷贝到Ubuntu虚拟机

    • 把 linux-imx-4.1.15-2.1.0-gxxxxxx-vxx.tar.xz 文件拷贝到 Ubuntu 虚拟机中
  • 选择目标目录

    • 在 Ubuntu 虚拟机的家目录(当前用户目录)下执行操作
  • 创建目标解压目录

    • 在家目录下创建一个新目录用于存放解压后的Linux源码

    • mkdir -p IMX6/uboot-imx-2016.03-2.1.0

  • 解压源码文件

    • 将 Linux 源码文件解压到刚才创建的目录中

    • tar xf uboot-imx-2016.03-2.1.0-gd3f0479-v1.4.tar.xz -C IMX6/uboot-imx-2016.03-2.1.0/

  • cd IMX6/uboot-imx-2016.03-2.1.0

  • ls

  • 安装交叉编译工具链

    • 在编译 U-boot 之前,需要先安装Poky 交叉编译工具链
  • 准备编译脚本

    • 在 Linux 源码目录中,有一个已经写好的脚本 build.sh

    • 脚本内已经配置好了 deconfig 文件和编译的目标文件

  • 执行编译脚本

    • 直接运行 build.sh 脚本来编译 U-boot 源码

    • build.sh // 开始编译出厂 U-boot 源码,生成 u-boot.imx,第一级启动引导文件

  • 检查编译结果

    • 编译生成的目标文件会位于当前 U-boot 源码顶层目录下的 tmp 文件夹中
  • 查看编译文件

    • 在编译完成后,需要查看当前目录下的 tmp 文件夹内的编译文件目标
  • 了解文件类型

    • *imx 文件

      • 这些文件是已经添加头部信息的 U-boot 镜像

      • 可以直接使用 dd 指令烧写到 TF 卡和开发板上的 eMMC 存储设备

    • *bin 文件

      • 这些文件是未添加头部信息的 U-boot 镜像

      • 需要使用《【正点原子】I.MX6U 嵌入式 Linux 驱动开发指南》里提到的 imxdownload 工具烧写

I.MX6U设备树路径为arch/arm/boot/dts/imx6ull-14x14-evk.dts

  • 开发板的led接口

  • 正点原子的出厂内核已经默认将这个 LED 注册成了 gpio-leds
    类型设备

  • 可以直接在应用层接口直接可以操作这个 LED 设备

资源简介

ALPHA 开发板的 LED 原理图

应用实例

设置一个按钮,点击按钮即可控制 LED 的状态反转(点亮或者熄灭 LED)

mainwindow.h

  • 1 #ifndef MAINWINDOW_H
    2 #define MAINWINDOW_H
    3
    4 #include
    5 #include
    6 #include
    7
    8 class MainWindow : public QMainWindow
    9{
    10 Q_OBJECT
    11
    12 public:
    13 MainWindow(QWidget parent = nullptr);
    14 ~MainWindow();
    15
    16 private:
    17 /
    按钮 */
    18 QPushButton pushButton;
    19
    20 /
    文件 /
    21 QFile file;
    22
    23 /
    设置 lED 的状态 /
    24 void setLedState();
    25
    26 /
    获取 lED 的状态 */
    27 bool getLedState();
    28
    29 private slots:
    30 void pushButtonClicked();
    31 };
    32 #endif // MAINWINDOW_H

  • 第 24 行声明一个设置 LED 状态方法,另一个是获取状态的方法。另外声明一个槽函数,作用是点击切换 LED 的状态

mainwindow.cpp

  • 1 #include “mainwindow.h”
    2 #include
    3 #include
    4 #include
    5 #include
    6
    7 MainWindow::MainWindow(QWidget parent)
    8 : QMainWindow(parent)
    9{
    10 /
    获取屏幕的分辨率,Qt 官方建议使用这
    11 * 种方法获取屏幕分辨率,防上多屏设备导致对应不上
    12 * 注意,这是获取整个桌面系统的分辨率
    13 */
    14 QList <QScreen > list_screen = QGuiApplication::screens();
    15
    16 /
    如果是 ARM 平台,直接设置大小为屏幕的大小 /
    17 #if arm
    18 /
    重设大小 /
    19 this->resize(list_screen.at(0)->geometry().width(),
    20 list_screen.at(0)->geometry().height());
    21 /
    默认是出厂系统的 LED 心跳的触发方式,想要控制 LED,
    22 * 需要改变 LED 的触发方式,改为 none,即无 /
    23 system(“echo none > /sys/class/leds/sys-led/trigger”);
    24 #else
    25 /
    否则则设置主窗体大小为 800x480 /
    26 this->resize(800, 480);
    27 #endif
    28
    29 pushButton = new QPushButton(this);
    30
    31 /
    居中显示 /
    32 pushButton->setMinimumSize(200, 50);
    33 pushButton->setGeometry((this->width() - pushButton->width()) /2 ,
    34 (this->height() - pushButton->height()) /2,
    35 pushButton->width(),
    36 pushButton->height()
    37 );
    38 /
    开发板的 LED 控制接口 /
    39
    file.setFileName(“/sys/devices/platform/leds/leds/sys-led/brightness”);
    40
    41 if (!file.exists())
    42 /
    设置按钮的初始化文本 /
    43 pushButton->setText(“未获取到 LED 设备!”);
    44
    45 /
    获取 LED 的状态 /
    46 getLedState();
    47
    48 /
    信号槽连接 /
    49 connect(pushButton, SIGNAL(clicked()),
    50 this, SLOT(pushButtonClicked()));
    51 }
    52
    53 MainWindow::~MainWindow()
    54 {
    55 }
    56
    57 void MainWindow::setLedState()
    58 {
    59 /
    在设置 LED 状态时先读取 /
    60 bool state = getLedState();
    61
    62 /
    如果文件不存在,则返回 /
    63 if (!file.exists())
    64 return;
    65
    66 if(!file.open(QIODevice::ReadWrite))
    67 qDebug()<<file.errorString();
    68
    69 QByteArray buf[2] = {“0”, “1”};
    70
    71 /
    写 0 或 1 /
    72 if (state)
    73 file.write(buf[0]);
    74 else
    75 file.write(buf[1]);
    76
    77 /
    关闭文件 */
    78 file.close();
    79
    80 /*重新获取 LED 的状态 /
    81 getLedState();
    82 }
    83
    84 bool MainWindow::getLedState()
    85 {
    86 /
    如果文件不存在,则返回 /
    87 if (!file.exists())
    88 return false;
    89
    90 if(!file.open(QIODevice::ReadWrite))
    91 qDebug()<<file.errorString();
    92
    93 QTextStream in(&file);
    94
    95 /
    读取文件所有数据 /
    96 QString buf = in.readLine();
    97
    98 /
    打印出读出的值 /
    99 qDebug()<<"buf: "<<buf<<endl;
    100 file.close();
    101 if (buf == “1”) {
    102 pushButton->setText(“LED 点亮”);
    103 return true;
    104 } else {
    105 pushButton->setText(“LED 熄灭”);
    106 return false;
    107 }
    108 }
    109
    110 void MainWindow::pushButtonClicked()
    111 {
    112 /
    设置 LED 的状态 */
    113 setLedState();
    114 }

  • 界面初始化设置(第 9 行~24 行)

    • 在嵌入式系统中,根据实际屏幕的大小进行全屏显示的设置

    • 按钮应居中显示在屏幕上

  • 改变 LED 触发方式(第 23 行)

    • 出厂系统中,LED 的触发方式被设置为心跳方式

    • 为了控制此 LED,需要将 LED 的触发方式改为无触发方式(none)

    • 为了方便操作,直接使用 system() 函数,通过指令的方式改变 LED 的触发方式

  • 设置 LED 的方法(第 54~82 行)

    • 写入“0”或“1”分别代表关闭和开启 LED

    • 在写入之前,先读取 LED 的当前状态,以预防在其他地方有用户设置过 LED

  • 获取 LED 的状态(第 84 行~108 行)

    • 这部分代码负责获取 LED 的当前状态
  • 设置 LED 的状态(第 110 行~114 行)

    • 这部分代码是一个槽函数,由点击按钮触发

    • 该槽函数负责设置 LED 的新状态

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

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

相关文章

2024局域网管理软件大盘点!哪款局域网软件好用?一文解答不容错过哦!

“不积跬步无以至千里&#xff0c;不积小流无以成江海。”在当今社会&#xff0c;每一项细微的技术进步都在推动着企业向前发展。 对于现代企业而言&#xff0c;高效管理局域网不仅能够提升工作效率&#xff0c;还能保障网络安全。这篇文章小编将为您盘点目前市场上优秀的局域…

星环科技×鼎捷软件强强联手,共建数智制造新引擎

近日&#xff0c;星环科技与鼎捷软件基于雅典娜新型工业互联网平台强强联手&#xff0c;围绕制造业普遍面临的生产计划、过程控制、成本管理等环节存在的经营痛点&#xff0c;以数据为核心打造工业互联网平台&#xff0c;从关键生产流程入手&#xff0c;建立了实时、系统、全面…

SSM老年人活动信息管理系统---附源码121730

目 录 摘要 1 绪论 1.1研究背景 1.2国内外研究现状 1.3系统开发技术的特色 1.4论文结构与章节安排 2 老年人活动信息管理系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.3.2数据修改流程 2.3.3数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 …

vue2表单校验:el-form表单绑定数组并使用rules进行校验

前言 vue项目中&#xff0c;大量使用element ui组件中的el-form来构建丰富且具有交互性的表单页面&#xff08;官网&#xff1a;Element - The worlds most popular Vue UI framework&#xff09;。el-form提供了丰富的表单控件&#xff0c;如输入框、下拉框、日期选择器等&am…

React原理之Fiber双缓冲

前置文章&#xff1a; React原理之 React 整体架构解读React原理之整体渲染流程React原理之Fiber详解 -----读懂这一篇需要对 React 整体架构和渲染流程有大致的概念 &#x1f60a;----- 在前面的文章中&#xff0c;简单介绍了 Fiber 架构&#xff0c;也了解了 Fiber 节点的…

Python功能强大且易于使用的命令行 shell库之xonsh使用详解

概要 Xonsh 是一种基于 Python 的跨平台、用户友好的命令行 shell。它结合了 Python 和传统 shell 命令的优势&#xff0c;允许用户在同一个环境中使用两者。Xonsh 为开发者和系统管理员提供了强大的工具&#xff0c;简化了任务自动化和脚本编写。本文将详细介绍 xonsh 库&…

基于php网上差旅费报销系统设计与实现

网上报销系统以LAMP(LinuxApacheMySQLPHP)作为平台,涉及到PHP语言、MySQL数据库、JavaScript语言、HTML语言。 2.1 PHP语言简介 PHP&#xff0c;一个嵌套的缩写名称&#xff0c;是英文 “超级文本预处理语言”&#xff08;PHP: Hypertext Preprocessor&#xff09;的缩写。P…

又学了几个新的comfyui小技巧,分享给大家!

前言 掌握一些小技巧&#xff0c;提升效率&#xff01; 1、图像选择器 出图批次是四张&#xff0c;然后想选一张图进入到之后的工作流&#xff0c;就可以用这个节点 默认是这样的 运行到这个节点的时候&#xff0c;会出现四张图片&#xff0c;选中满意的图片&#xff0c;点…

RM惯性测量单元IMU

在Robomaster比赛中&#xff0c;一般各大参赛队会在机器人的云台上搭载IMU&#xff0c;用以反馈云台的yaw轴和pitch轴的角度和角速度。 需要注意的是&#xff0c;尽管依靠云台电机6020的编码器同样可以实现以上数据的获取&#xff0c;但是由于云台控制对于灵敏度和精度的要求比…

微信删除的聊天记录怎么恢复?实测有效,3招教您轻松恢复

微信已成为我们传递信息、分享情感的重要桥梁。然而&#xff0c;不小心误删的聊天记录往往让人懊悔不已&#xff0c;尤其是那些珍贵的对话和重要的信息。面对微信删除的聊天记录怎么恢复的问题&#xff0c;很多人都会感到束手无策。 但别担心&#xff0c;无论您是技术小白还是…

单因子年化23.7%,基于deap的因子挖掘,我改进了fitness和metrics方案(附python代码和数据)

原创文章第626篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 我们目前投入使用的因子挖掘&#xff0c;基于两个框架&#xff0c;deap和gplearn&#xff0c;deap做一点点改动&#xff0c;就可以完美应用于多标的截面因子挖掘。而gplearn如果要支…

秋叶SD整合安装包更新了!8月最新版4.9【附下载】

01 SD整合包可以扫描下方&#xff0c;免费获取 02 安装步骤 下载好后解压双击打开即可使用&#xff08;第一次安装部署时间稍长&#xff0c;等待一会即可&#xff09; 安装完进入界面后&#xff0c;点击右下角一键启动&#xff0c;稍微等待一会儿就会加载WebUI。 选择大模…

期货模拟交易系统考核选拔系统资管分仓有哪些特点?

分仓账户本身是为了风险管理和资金管理的目的而设立的&#xff0c;‌通过将资金分散到不同的账户中&#xff0c;‌可以降低整体风险&#xff0c;‌避免某个合约的亏损对整个资金造成过大的影响。‌这种分散投资的策略有助于提高交易的安全性。‌然而&#xff0c;‌分仓账户的安…

MySQL 索引合并优化实践

在生产环境的数据库中&#xff0c;经常会看到有些 SQL 的 where 条件包含&#xff1a;普通索引等值 主键范围查询 order by limit。明明走普通索引效率更高&#xff0c;但是选择走了索引合并&#xff0c;本文就对这种索引合并的情况研究一下。 作者&#xff1a;张洛丹&#x…

细数目标管理的坑:避免陷阱,实现高效执行

目标管理作为一种被广泛采用的管理方法&#xff0c;通过明确的目标设定和追踪&#xff0c;提升组织绩效和员工动力。然而&#xff0c;正如任何管理工具一样&#xff0c;目标管理也并非完美无缺&#xff0c;其在实际应用中往往伴随着一系列潜在的“坑”。 一、目标设定&#x…

如何使用DataGear零编码快速制作MQTT物联网实时数据看板

DataGear是一个开源免费的数据可视化分析平台&#xff0c;企业版在开源版基础上开发&#xff0c;新增了诸多企业级特性&#xff0c;包括&#xff1a;MySQL及更多部署数据库支持、MQTT/WebSocket/Redis/MongoDB数据集、OAuth2.0/CAS/JWT/LDAP统一登录支持、前后端敏感信息加密传…

ArcGIS 数据服务在三维 Cesium/SuperMap 项目中使用遇到的一些问题及其解决方法

ArcGIS 数据服务在三维 Cesium/SuperMap 项目中使用遇到的一些问题及其解决方法 一、三维系统支持的 ArcGIS 服务及其投影 1、动态服务 ArcGIS 动态服务的数据&#xff0c;支持任意投影在三维系统中加载。 2、切片服务 ArcGIS 切片服务仅支持 3857(web 墨卡托投影)&#x…

C++ 设计模式(1. 单例模式)

单例模式是一种创建型设计模式&#xff0c; 它的核心思想是保证一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个实例。 特点 全局访问点的意思是&#xff0c;为了让其他类能够获取到这个唯一实例&#xff0c;该类提供了一个全局访问点&#xff08;通常是一个静态…

锐特驱动器ECR系列IO输出高电平配置

设置极性&#xff1a;常闭值0 默认输出极性常开&#xff0c;平时高组态或无电平输出&#xff0c;点通工作时输出低电平&#xff1b;常闭平时低电平&#xff0c;工作时输出高电平&#xff1b; 常开常闭概念具体可参考&#xff1a; http://t.csdnimg.cn/TIsW9 设置输出功能&…

如何用Java SpringBoot+Vue搭建校内跑腿业务系统?实战教程解析

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…