0.配置编译环境
- 复制【正点原子】STM32MP157开发板(A盘)-基础资料\05、开发工具\01、交叉编译器st-example-image-qtwayland-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1-snapshot.sh到虚拟机
- chmod添加可执行文件,./st*运行,选择安装目录在/opt/st/stm32mp1/qt_crossCompile/中
编译
- source /opt/st/stm32mp1/qt_crossCompile/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi设置环境变量
- 进入pro文件所在目录命令:/opt/st/stm32mp1/qt_crossCompile/sysroots/x86_64-ostl_sdk-linux/usr/bin/qmake生成makefile,这里面的编译路径才是stm32mp1对应的
- make -j 8开始编译生成可执行文件复制到开发板运行
15.led控制
项目简介:设置一个按钮,点击即可控制 LED 状态反转(点亮或者熄灭 LED)。项目看来很起来很简单,实际上有些需要注意的地方,我们在改变 LED 的状态时,需要先去读取 LED的状态,防止外界(外面应用程序)将 LED 的状态改变了。否则我们反转操作将不成立。在
C++里一般使用 get()和 set()方法来获取和设置。我们的 LED 程序里也有这种方法。所以需要写好一个让人看得懂的程序是有“方法”的。不能将程序功能写在一堆,最好是分开写,留有接口。让后面的人看懂!
例 01_led,控制 LED
- windows.h
/******************************************************************
Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
* @projectName 01_led
* @brief mainwindow.h
* @author Deng Zhimao
* @email 1252699831@qq.com
* @net www.openedv.com
* @date 2021-03-08
*******************************************************************/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
#include <QFile>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
/* 按钮 */
QPushButton *pushButton;
/* 文件 */
QFile file;
/* 设置lED的状态 */
void setLedState();
/* 获取lED的状态 */
bool getLedState();
private slots:
void pushButtonClicked();
};
#endif // MAINWINDOW_H
- windows.cpp
/******************************************************************
Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
* @projectName 01_led
* @brief mainwindow.cpp
* @author Deng Zhimao
* @email 1252699831@qq.com
* @net www.openedv.com
* @date 2021-03-08
*******************************************************************/
#include "mainwindow.h"
#include <QDebug>
#include <QGuiApplication>
#include <QScreen>
#include <QRect>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
/* 获取屏幕的分辨率,Qt官方建议使用这
* 种方法获取屏幕分辨率,防上多屏设备导致对应不上
* 注意,这是获取整个桌面系统的分辨率
*/
QList <QScreen *> list_screen = QGuiApplication::screens();
/* 如果是ARM平台,直接设置大小为屏幕的大小 */
#if __arm__
/* 重设大小 */
this->resize(list_screen.at(0)->geometry().width(),
list_screen.at(0)->geometry().height());
/* 默认是出厂系统的LED心跳的触发方式,想要控制LED,
* 需要改变LED的触发方式,改为none,即无 */
system("echo none > /sys/class/leds/sys-led/trigger");
#else
/* 否则则设置主窗体大小为800x480 */
this->resize(800, 480);
#endif
pushButton = new QPushButton(this);
/* 居中显示 */
pushButton->setMinimumSize(200, 50);
pushButton->setGeometry((this->width() - pushButton->width()) /2 ,
(this->height() - pushButton->height()) /2,
pushButton->width(),
pushButton->height()
);
/* 开发板的LED控制接口 */
file.setFileName("/sys/devices/platform/leds/leds/sys-led/brightness");
if (!file.exists())
/* 设置按钮的初始化文本 */
pushButton->setText("未获取到LED设备!");
/* 获取LED的状态 */
getLedState();
/* 信号槽连接 */
connect(pushButton, SIGNAL(clicked()),
this, SLOT(pushButtonClicked()));
}
MainWindow::~MainWindow()
{
}
void MainWindow::setLedState()
{
/* 在设置LED状态时先读取 */
bool state = getLedState();
/* 如果文件不存在,则返回 */
if (!file.exists())
return;
if(!file.open(QIODevice::ReadWrite))
qDebug()<<file.errorString();
QByteArray buf[2] = {
"0", "1"};
/* 写0或1 */
if (state)
file.write(buf[0]);
else
file.write(buf[1]);
/* 关闭文件 */
file.close();
/*重新获取LED的状态 */
getLedState();
}
bool MainWindow::getLedState()
{
/* 如果文件不存在,则返回 */
if (!file.exists())
return false;
if(!file.open(QIODevice::ReadWrite))
qDebug()<<file.errorString();
QTextStream in(&file);
/* 读取文件所有数据 */
QString buf = in.readLine();
/* 打印出读出的值 */
qDebug()<<"buf: "<<buf<<endl;
file.close();
if (buf == "1") {
pushButton->setText("LED点亮");
return true;
} else {
pushButton->setText("LED熄灭");
return false;
}
}
void MainWindow::pushButtonClicked()
{
/* 设置LED的状态 */
setLedState();
}
- 运行,下面为 Ubuntu 上仿真界面的效果,由于 Ubuntu 不是“开发板”,所以在读取 LED 设备时会读取失败。实际在板上运行图略。交叉编译程序到正点原子 STM32MP157 开发板上运行即可控制 LED 的状态。
16.控制beep
想要控制这个蜂鸣器(BEEP),首先正点原子的出厂内核已经默认将这个 LED 注册成了 gpio-leds 类型设备。所以实例与上一小节 LED 实例是一样的。项目简介:设置一个按钮,点击即可控制 BEEP 状态反转(打开蜂鸣器或者关闭蜂鸣器)。
例 02_beep,控制 BEEP
- windows.h
/******************************************************************
Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
* @projectName 02_beep
* @brief mainwindow.h
* @author Deng Zhimao
* @email 1252699831@qq.com
* @net www.openedv.com
* @date 2021-03-11
*******************************************************************/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
#include <QFile>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
/* 按钮 */
QPushButton *pushButton;
/* 文件 */
QFile file;
/* 设置BEEP的状态 */
void setBeepState();
/* 获取BEEP的状态 */
bool getBeepState();
private slots:
/* 槽函数 */
void pushButtonClicked();
};
#endif // MAINWINDOW_H
- windows.cpp
/******************************************************************
Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
* @projectName 02_beep
* @brief mainwindow.cpp
* @author Deng Zhimao
* @email 1252699831@qq.com
* @net www.openedv.com
* @date 2021-03-11
*******************************************************************/
#include "mainwindow.h"
#include <QDebug>
#include <QGuiApplication>
#include <QScreen>
#include <QRect>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
/* 获取屏幕的分辨率,Qt官方建议使用这
* 种方法获取屏幕分辨率,防上多屏设备导致对应不上
* 注意,这是获取整个桌面系统的分辨率
*/
QList <QScreen *> list_screen = QGuiApplication::screens();
/* 如果是ARM平台,直接设置大小为屏幕的大小 */
#if __arm__
/* 重设大小 */
this->resize(list_screen.at(0)->geometry().width(),
list_screen.at(0)->geometry().height());
#else
/* 否则则设置主窗体大小为800x480 */
this->resize(800, 480);
#endif
pushButton = new QPushButton(this);
/* 居中显示 */
pushButton->setMinimumSize(200, 50);
pushButton->setGeometry((this->width() - pushButton->width()) /2 ,
(this->height() - pushButton->height()) /2,
pushButton->width(),
pushButton->height()
);
/* 开发板的蜂鸣器控制接口 */
file.setFileName("/sys/devices/platform/leds/leds/beep/brightness");
if (!file.exists())
/* 设置按钮的初始化文本 */
pushButton->setText("未获取到BEEP设备!");
/* 获取BEEP的状态 */
getBeepState();
/* 信号槽连接 */
connect(pushButton, SIGNAL(clicked()),
this, SLOT(pushButtonClicked()));
}
MainWindow::~MainWindow()
{
}
void MainWindow::setBeepState()
{
/* 在设置BEEP状态时先读取 */
bool state = getBeepState();
/* 如果文件不存在,则返回 */
if (!file.exists())
return;
if(!file.open(QIODevice::ReadWrite))
qDebug()<<file.errorString();
QByteArray buf[2] = {
"0", "1"};
if (state)
file.write(buf[0]);
else
file.write(buf[1]);
file.close();
getBeepState();
}
bool MainWindow::getBeepState()
{
/* 如果文件不存在,则返回 */
if (!file.exists())
return false;
if(!file.open(QIODevice::ReadWrite))
qDebug()<<file.errorString();
QTextStream in(&file);
/* 读取文件所有数据 */
QString buf = in.readLine();
/* 打印出读出的值 */
qDebug()<<"buf: "<<buf<<endl;
file.close();
if (buf == "1") {
pushButton->setText("BEEP开");
return true;
} else {
pushButton->setText("BEEP关");
return false;
}
}
void MainWindow::pushButtonClicked()
{
/* 设置蜂鸣器的状态 */
setBeepState();
}
- 运行,下面为 Ubuntu 上仿真界面的效果,由于 Ubuntu 不是“开发板”,所以在读取 BEEP 设备时会读取失败。实际在板上运行图略。交叉编译程序到正点原子 STM32MP157 开发板上运行即可控制蜂鸣器的状态。
17.串口series port
在正点原子的 STM32MP157 开发板的出厂系统里,默认已经配置了三路串口可用。一路是调试串口 UART4(对应系统里的节点/dev/ttySTM0),一路是 UART3(对应系统里的节点/dev/ttySTM1),另一路是 UART5(对应系统里的节点/dev/ ttySTM2),由于 UART4 已经作为调试串口被使用。所以我们只能对 UART5/UART3 编程
例 03_serialport,Qt 串口编程(难度:一般)。在 03_serialport.pro 里,我们需要使用串口,需要在 pro 项目文件中添加串口模块的支持QT += core gui serialport
- windows.h
/******************************************************************
Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
* @projectName 03_serialport
* @brief mainwindow.h
* @author Deng Zhimao
* @email 1252699831@qq.com
* @net www.openedv.com
* @date 2021-03-12
*******************************************************************/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QPushButton>
#include <QTextBrowser>
#include <QTextEdit>
#include <QVBoxLayout>
#include <QLabel>
#include <QComboBox>
#include <QGridLayout>
#include <QMessageBox>
#include <QDebug>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
/* 串口对象 */
QSerialPort *serialPort;
/* 用作接收数据 */
QTextBrowser *textBrowser;
/* 用作发送数据 */
QTextEdit *textEdit;
/* 按钮 */
QPushButton *pushButton[2];
/* 下拉选择盒子 */
QComboBox *comboBox[5];
/* 标签 */
QLabel *label[5];
/* 垂直布局 */
QVBoxLayout *vboxLayout;
/* 网络布局 */
QGridLayout *gridLayout;
/* 主布局 */
QWidget *mainWidget;
/* 设置功能区域 */
QWidget *funcWidget;
/* 布局初始化 */
void layoutInit();
/* 扫描系统可用串口 */
void scanSerialPort();
/* 波特率项初始化 */
void baudRateItemInit();
/* 数据位项初始化 */
void dataBitsItemInit();
/* 检验位项初始化 */
void parityItemInit();
/* 停止位项初始化 */
void stopBitsItemInit();
private slots:
void