stm32 cube ide 编译提示 undefined reference to

需求 编译的时候,提示 undefined reference to 解决 这种问题经常会碰到,一般就是相关源文件没有在编译列表里面,结果经过仔细查找,都添加进去了。后来经过仔细查找,发现原来是 c++ 和 c 混合编译的问题,在 c++ 中文件里面调用的函数,其所在的头文件没有使用 extern "C" 包含,导致的。想要修改也很简单,不需要改动头文件,只需要在 c++ 文件中这样: #include "gx_api.h" extern "C" { #include "gx_display.h" } 而且其实在 map 文件中是有相关线索的,下面分别是没有用 extern 包含,和用了 extern 包含的 map 文件中的函数信息。可以明显看到有 extern 包含的,有相关地址。 .text._gx_display_driver_565rgb_setup 0x0000000000000000 0x260 ./guix/common/src/gx_display_driver_565rgb_setup.o .text._gx_display_driver_565rgb_setup 0x000000000801e6e8 0x260 ./guix/common/src/gx_display_driver_565rgb_setup.o 0x000000000801e6e8 _gx_display_driver_565rgb_setup 参考 gcc “undefined reference to” 问题解决方法

2023-11-17 · 1 min · 53 words · RamLife

Guix 移植

需求 使用 stm32cubeide 移植 guix 到 stm32u575 上面。 解决 简单界面设计 下载 guix studio 按照例子做个最简单界面 导出 resource 和 specification 源码 下载 guix studio 对应版本源码 把源码中的 common 整个文件夹放到工程中 把源码中的 port 中相应架构的 gx_port.h 放到工程中 开启 GX_INCLUDE_USER_DEFINE_FILE, 把 guix studio 的例子中的 gx_user.h 复制到工程中。 板级相关 在 port 文件夹中新增 gx_display_driver_rgb565_stm32u575 相关源文件和头文件。 在文件中新增: UINT GuixDriverSetupRgb565(GX_DISPLAY *display) { LcdInit(); _gx_display_driver_565rgb_setup(display, (VOID*)GUIX_SCREEN_HANDLE, GuixBufferToggleRgb565); display -> gx_display_driver_horizontal_line_draw = GuixHorizontalLineDirectDrawRgb565; display -> gx_display_driver_vertical_line_draw = GuixVerticalLineDirectDrawRgb565; display -> gx_display_driver_pixel_write = GuixPixelDirectWriteRgb565; display -> gx_display_driver_pixel_blend = GuixPixelDirectBlendRgb565; // display -> gx_display_driver_buffer_toggle = stm324xg_16bpp_buffer_toggle; display -> gx_display_handle = GUIX_SCREEN_HANDLE; return(GX_SUCCESS); } 新增上面相关的这些画点和线的函数。 线程 新增线程函数, 其中设置都是和 guix studio 导出的文件相关的。 GX_WINDOW *pScreen; GX_WINDOW_ROOT *root; void GuixMainEntry(ULONG thread_input) { (void)thread_input; gx_system_initialize(); // gx_system_memory_allocator_set(memory_allocate, memory_free); gx_studio_display_configure(PRIMARY, GuixDriverSetupRgb565, LANGUAGE_ENGLISH, PRIMARY_THEME_1, &root); gx_studio_named_widget_create((char *)"Button_Screen", (GX_WIDGET *)root, (GX_WIDGET **)&pScreen); gx_widget_show(root); gx_system_start(); while (1) { tx_thread_sleep(20); } } 把线程函数添加到启动线程中即可。 参考 {ThreadX全家桶} ThreadX GUIX直驱方案搞定,任何显示屏,低资源的MCU都可以跑了,不再需要画布,附工程下载 {ThreadX全家桶} 第3版emWin教程和ThreadX GUIX教程开工,双管齐下,GUIX更新至第30章,emWin更新至第57章(2022-04-04)

2023-11-16 · 1 min · 134 words · RamLife

QT mysql 里面的日期时间和 QDateTime 转换

需求 qt 使用 mysql 的时候,日期时间格式和 QDateTime 互相转换 解决 QDateTime 转 mysql 时间格式 QDateTime dateTime = QDateTime(QDate(2024, 5, 3), QTime(22, 0, 0)); QString dateTimeString = dateTime.toString("yyyy-MM-dd HH:mm:ss"); // 转换为 MySQL 理解的格式 QString insertQuery = "INSERT INTO version (version_no, version_datetime) VALUES (:version_no, :version_datetime)"; // 执行 SQL 插入语句 // QSqlQuery query; query.prepare(insertQuery); query.bindValue(":version_no", 3); query.bindValue(":version_datetime", dateTimeString); mysql 时间格式转 QDateTime data.time = query.value("analysis_datetime").toDateTime(); 参考 QT读取服务器mysql数据库中日期字段问题

2023-11-16 · 1 min · 61 words · RamLife

mipi, dsi, dbi, dpi

需求 mipi, dsi, dbi, dpi 分别是啥,有啥区别? 解决 mipi 是一整套的标准,包含了 dbi-2, dpi-2, dsi, dcs dbi DBI(Display Bus Interface), 一般叫做 MCU接口或 8080 接口。 DBI 的特点是: LCM 自带 framebuffer,存储 host 发过来的数据,并且内部的 Driver controller 会不断的把数据刷新到 LCD 上, host 只需要发送一次数据既可,没有同步时钟线。 一般的 MCU 按照时序发送数据就可以显示,可以使用 GPIO, SPI, FMC 等接口来驱动。 dpi DPI(Display Pixel Interface), 一般叫做 RGB 接口或者像素接口。 DPI 的特点是: LCM 没有 framebuffer, Host 有 framebuffer, 并且 Host 需要不断的把屏幕数据发送到 LCM 来显示,需要有 Vsync/Hsync 这样的同步信号。有点类似于以前的 CRT 显示器。如果 MCU 需要使用,必须要额外的外设来支持,比如说 STM32 部分高端芯片自带的 LTDC 外设,就是用来驱动这种接口的。...

2023-11-15 · 1 min · 77 words · RamLife

QT 使用mysql,提示 QSqlDatabasePrivate::database: requested database does not belong to the calling thread.

需求 qt 使用 mysql 的时候,提示: QSqlDatabasePrivate::database: requested database does not belong to the calling thread. 解决 使用 QSqlQuery 的时候,指明数据库连接。 int DataBaseProcess::ConnectDataBase(QSqlDatabase& db, const QString& name) { // if (db_.open()) { // return 1; // } qDebug() << "ConnectDataBase: " << name; if (QSqlDatabase::contains(name))//判断testConnect连接是否存在并连接 { db = QSqlDatabase::database(name); } else //未连接则新建数据库连接 { // QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db = QSqlDatabase::addDatabase("QMYSQL", name); db.setHostName("localhost"); // 设置数据库服务器地址 db.setPort(3306); db.setDatabaseName("ke_db"); // 设置数据库名 db.setUserName("root"); // 设置数据库用户名 db....

2023-11-15 · 1 min · 163 words · RamLife

QT 应用图标

需求 qt 需要设置应用图标替换默认的图标 解决 创建 rc 文件 项目目录新建文本文件 在文件中输入: IDI_ICON1 ICON DISCARDABLE "Icon/test1.ico" 修改文件名为: “项目名称”.rc 使用 rc 文件 项目.pro 文件中,加上 RC_FILE = IconTest.rc, 注意替换 rc 文件项目名称。 参考 Windows下QT设置应用程序(exe)图标、任务栏托盘图标、任务栏窗口图标 Qt学习之自定义修改exe应用程序图标(超简单)

2023-11-14 · 1 min · 29 words · RamLife

QT 写入 mysql 中字段为 null,并读取可能为 null 的字段

需求 使用 qt 使用 mysql 的时候,某些字段可能为 null,那么如何写入?读取时如何判断? 解决 写入 写入比较简单,明文说明是 null 即可. query.exec(QString("update rfid_match set RFID2=null where WZSFM='%1'").arg(model->item(modelReIndex,4)->text())); 读取 读取时候,需要使用 isNull 判断是否为 null。 QSqlRecord::isNull QVariant::isNull 参考 Qt中SQL语句update同时更新多字段及设置字段值为空的方法 Qt数据库SQL语句绑定方式与插入空值 C++Qt开发——操作MySQL数据库 Qt: QSqlRecord字段值为null时注意事项 Qt: QSqlRecord字段值为null时注意事项

2023-11-14 · 1 min · 33 words · RamLife

QT 打印 pdf

需求 qt 需要打印 pdf 解决 简单的打印 pdf,可以使用 QPrinter. void Printer::Print(QPrinter *printer) { qDebug() << "Printer::Print"; QPainter *pPainter = new QPainter(printer); int page_border = 30 * line_ratio_; int nPdfWidth = pPainter->viewport().width(); int nPdfHeight = pPainter->viewport().height(); qDebug() << "pdf width: " << nPdfWidth << ", height: " << nPdfHeight; //绘制标题 int y = 10 * line_ratio_; int nLineHeight = 60 * line_ratio_; y = PrintInfo(pPainter, nPdfWidth, page_border, y, nLineHeight); qDebug() << "after PrintInfo y: " << y; y += 10 * line_ratio_; pPainter->drawLine(QLineF(page_border, y + 15 * line_ratio_, nPdfWidth - page_border, y + 15 * line_ratio_)); y += 30 * line_ratio_; y = PrintImage(pPainter, nPdfWidth, page_border, y, nPdfHeight * image_ratio_); qDebug() << "after PrintImage y: " << y; y = PrintTable(pPainter, nPdfWidth, page_border, y, nLineHeight); qDebug() << "after PrintTable y: " << y; delete pPainter; } int Printer::PrintInfo(QPainter *pPainter, int nPdfWidth, int page_border, int y, int nLineHeight) { pPainter->setFont(QFont("宋体", 18, QFont::Bold)); pPainter->drawText(QRect(0, y, nPdfWidth, 100), Qt::AlignCenter, tr(organization_name_....

2023-11-13 · 2 min · 312 words · RamLife

QT 显示多图片

需求 qt 显示多张 pixmap 解决 图片多了之后,需要耗费更多的资源。 QLabel + setPixmap: 简单,但是使用 cpu 资源 drawPixmap: 直接使用 gpu 资源 QPixmap image1; image1.load(":/images/chuyin1.jpg"); void PaintWidget::paintEvent(QPaintEvent *) { //void QPainter::drawPixmap(int x, int y, int width, int height, const QPixmap &pixmap) QPainter painter(this); int x1 = ui->view1Frame->pos().x(); int y1 = ui->view1Frame->pos().y(); painter.drawPixmap(x1,y1,ui->view1Frame->width(),ui->view1Frame->height(),image1); } 参考 【Qt】使用QPainter的drawPixmap()绘制多幅图片

2023-11-13 · 1 min · 49 words · RamLife

QT chart 转 图片

需求 qt 需要把 chart 曲线转为 pixmap 解决 这个其实很简单,直接调用 api 即可。 printer_.SetPixmap(test_chart_->get_view()->grab()); pPainter->drawPixmap(image_border, y, pixmap_); QPixmap p = view->grab(); QImage image = p.toImage(); image.save("chart.png"); 参考 Qt中将QChart图像导出成图片的问题 求助求助!!!QChart 图表转到QPixmap 如何将Qt窗口的内容转化为图片?

2023-11-13 · 1 min · 28 words · RamLife