当前位置: 首页 > article >正文

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第七十八章 Qt控制硬件

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7+单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板+底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐用,可满足高速信号环境下使用。共240PIN,CPU功能全部引出:底板扩展接口丰富底板板载4G接口(选配)、千兆以太网、WIFI蓝牙模块HDMI、CAN、RS485、LVDS接口、温湿度传感器(选配)光环境传感器、六轴传感器、2路USB OTG、3路串口,CAMERA接口、ADC电位器、SPDIF、SDIO接口等


第七十八章 Qt控制硬件

本章内容对应视频讲解链接(在线观看):

QT跨平台运行之使用QT控制蜂鸣器  QT跨平台运行之使用QT控制蜂鸣器_哔哩哔哩_bilibili

注意!!!视频教程是以IMXULL终结者开发板进行讲解的,以此为参考,我们也可以控制STM32MP157开发板上的硬件。

本章节,需要注意的是,在做以下实验之前,我们需要根据第五十五章 Pinctrl和GPIO子系统实验,对于设备树源码进行修改修改内容如下:

首先我们来到内核目录下,如下图所示:

然后我们使用以下命令

vim arch/arm/boot/dts/stm32mp15xx-itop.dtsi

对stm32mp15xx-itop.dtsi文件进行修改,修改test节点如下图所示:

        test: test{
                compatible = "test";
                gpios = <&gpioi 11 GPIO_ACTIVE_LOW>;
                status = "okay";
       };


&test{
        compatible = "test1234";
        status = "okay";
};

然后我们搜索一下“gpioi 11”,发现有gpioi 11被使用要注释掉相关代码,如下图所示:

修改完后保存文件,参考本使用手册51.3章节编译设备树文件,然后重新烧写编译好的镜像。

进入系统之后,需要加载对应的驱动。该驱动的存放位置为“iTOP-STM32MP157开发板网盘资料汇总\09_嵌入式Linux开发指南(iTOP-STM32MP157)手册配套资料\驱动程序例程\13-Pinctrl和GPIO子系统实验”下的driver.ko。使用“insmod driver.ko”加载成功之后如下图所示:

 然后我们使用“ls /dev/hello_misc”命令来查看是否出现了对应的设备节点,如下图所示:

那么。我们在QT上要怎么操作驱动呢?比如,我们要点亮一个led灯,我们在C语言中可以使用open,read,write,ioctl函数来进行操作,但是QT上我们使用的语言是C++,那我们要怎么来操作驱动呢?

我们可以使用C和C++进行混合编程,我们先来看一个控制蜂鸣器的APP代码,代码如下:

#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "stdlib.h"
#include "string.h"
 
#define BEEPOFF 0
#define BEEPON 1
 
/*
 * @description : main 主程序
 * @param - argc : argv 数组元素个数
 * @param - argv : 具体参数
 * @return : 0 成功;其他 失败
 */
int main(int argc, char *argv[])
{
    int fd, retvalue;
    char *filename;
    unsigned char databuf[1];
 
    if(argc != 3){
        printf("Error Usage!\r\n");
        return -1;
    }
 
    filename = argv[1];
 
    /* 打开 beep 驱动 */
    fd = open(filename, O_RDWR);
    if(fd < 0){
        printf("file %s open failed!\r\n", argv[1]);
        return -1;
    }
 
    databuf[0] = atoi(argv[2]); /* 要执行的操作:打开或关闭 */
 
    /* 向/dev/beep 文件写入数据 */
    retvalue = write(fd, databuf, sizeof(databuf));
    if(retvalue < 0){
        printf("BEEP Control Failed!\r\n");
        close(fd);
        return -1;
    }
 
    retvalue = close(fd); /* 关闭文件 */
    if(retvalue < 0){
        printf("file %s close failed!\r\n", argv[1]);
        return -1;
    }
    return 0;
}

我们对上述应用程序进行教程编译,编译成功之后nfs或者U盘的方式拷贝到开发板,然后我们分别使用以下命令来控制蜂鸣器,

./app /dev/hello_misc 1

./app /dev/hello_misc 0

 

传入1蜂鸣器打开,传入0蜂鸣器关闭。

通过上面的代码我们可以发现,使用C语言来控制一个蜂鸣器,无非就是打开设备节点,然后通过write来写入数据就可以控制蜂鸣器了。既然我们可以使用C和C++混合编程,那么我们是不是只需要把这个C控制蜂鸣器的代码直接加到QT程序里面就可以了,那我们要怎么进行混合编程呢?

我们先新建一个QT工程,然后添加两个按钮来控制蜂鸣器的打开和关闭,UI界面如

 

然后我们开始移植代码,因为C++是面向对象的,C是面向过程的,所以在QT上,我们要用面向对象的思想来进行编程,所以我们第一步,就是要先创建一个类,把C语音控制蜂鸣器的代码封装成一个类。

我们右键选中这个工程,然后选择添加新文件,添加C++ Class如下图

 

后我们添加类的名字,因为我们操作的是蜂鸣器,所以我们这里写成Beep,如 

第一步,我们把C语言控制蜂鸣器代码的头文件,添加到我们刚才添加Beep类生成的文件beep.h里面,但是头文件我们不能直接复制过去,我们要用extern C{}括起来,代码如下: 

extern "C"{
    #include "stdio.h"
    #include "unistd.h"
    #include "sys/types.h"
    #include "sys/stat.h"
    #include "fcntl.h"
    #include "stdlib.h"
    #include "string.h"
}

添加完成如所示:

第二步,把我们C语言控制蜂鸣器里面的参数定义复制到public下面,代码如下:

int fd, retvalue;

char *filename;

unsigned char databuf[1];

添加完如所示:

 

然后我们打开beep.cpp,把C语言控制蜂鸣器里面的打开设备节点的代码复制到构造函数里面,注意,QT里面我们不能使用printf,代码如下: 

/* 打开 beep 驱动 */
    fd = open(filename, O_RDWR);
    if(fd < 0){
        return ;
    }

添加完如所示:

注意:蜂鸣器的设备节点不要错,大家要依据自己节点的实际情况来写

然后我们创建一个打开蜂鸣器和一个关闭蜂鸣器的函数,第一步,现在beep.h里面声明,然后在beep.cpp里面实现。

声明:

代码如下:

 void Beep_On();
 void Beep_Off();

添加完如所示:

实现:

代码如下,注意c语言函数前面要加::,表示这个函数是C函数。 

void Beep::Beep_On()
{
    /* 向/dev/beep 文件写入数据 */
    databuf[0] = 1;
    retvalue = ::write(fd, databuf, sizeof(databuf));
     if(retvalue < 0){
          ::close(fd);
          return ;
     }
}
 
void Beep::Beep_Off()
{
    databuf[0] = 0;
    retvalue = ::write(fd, databuf, sizeof(databuf));
    if(retvalue < 0){
         ::close(fd);
         return ;
    }
}

添加完如所示:

添加好了之后,我们直接使用这个类就可以了,

我们先在widget里面新建一个beep,然后我们在构造函数里面新建一个对象,如所示:

 

然后我们在槽函数里面执行对应的打开和关闭动作即可,如所示: 

修改完以后,我们按照上一小节的方法,交叉编译QT程序到开发板即可。

 


http://www.kler.cn/a/382633.html

相关文章:

  • 安全工程师入侵加密货币交易所获罪
  • ctfshow(162)--文件上传漏洞--远程文件包含
  • 查看网路信息-ifconfig命令
  • 新160个crackme - 093-kesan
  • 【毫米波雷达(八)】车载毫米波前雷达遮挡检测功能
  • 通义灵码实操—飞机大战游戏
  • NLP论文速读|LOGO -- Long context aliGnment via efficient preference Optimization
  • ChatGPT任务设计和微调策略的优化
  • 泉州市工业和信息化局关于开展排查运维安全管理系统安全漏洞的通知
  • #JavaScript 宏任务与微任务详解
  • 2-146 基于matlab的双摆杆系统建模分析
  • Tomcat 启动卡住,日志显示 At least one JAR was scanned for TLDs yet contained no TLDs.
  • 【C语言】实战-力扣题库:回文链表
  • 【LeetCode】【算法】238. 除自身以外数组的乘积
  • Hadoop集群的高可用(HA)-(2、搭建resourcemanager的高可用)
  • dbt 数据分析工程实战教程(汇总篇)
  • Mill:比Maven快10倍的JVM构建工具
  • 如何理解美国总统Trump这个单词
  • 数据库SQL学习笔记
  • OpenCV C++ 计算两幅图像之间的多尺度结构相似性(MSSIM)
  • 前端八股文(三)JS、ES6 持续更新中。。。
  • pycharm小游戏贪吃蛇及pygame模块学习()
  • ORB-SLAM2源码学习:ORBextractor.cc:ComputePyramid构建图像金字塔①
  • 【C/C++】模拟实现strcat
  • Pr 视频过渡:沉浸式视频 - VR 光线
  • git 提交管理