STM32 IAP 使用 uart, ymodem

需求 需要在 STM32 芯片上,使用 uart 接口,通过 ymodem 协议,进行 IAP 升级。 解决 想用 IAP 升级,芯片上的程序需要分为两个部分,bootloader 和 app. 上位机需要一个软件通过接口,把新版本的软件发送给芯片。 bootloader bootloader 可以参考 STM32 提供的 IAP demo 进行修改。其中写 flash 的地方需要注意,不同芯片支持的写 flash 不一样,主要是支持的单次写入长度不一样,那么相关的写入次数等等都要跟着修改。 app app 部分需要改动的比较少,主要是两个地方: link: 这里需要修改 flash 起始地址,需要和 bootloader 中最后跳转的地址一致。gcc 编译器在 ld 文件中修改。 中断向量: VECT_TAB_OFFSET 也需要修改为新地址对应的偏移。 上位机 上位机软件最简单的就是使用 windows 自带的超级终端 hypertrm. 当然也可以自己写一个支持 YMODEM 协议的软件。 参考 串口YMODEM实现IAP程序升级(附完整工程) STM32 + IAP + Ymodem完美结合 YMODEM协议简介 {Windows} 网工必备:超级终端中文版及3CDaemon汉化版 STM32 IAP升级固件 + 上位机 例程 STM32中断向量表的偏移量设置方法 STM32单片机实现Bootloader跳转的关键步骤 【STM32+cubemx】0024 HAL库开发:IAP(在应用编程)的实现 STM32 用cubemx移植IAP功能,实现串口升级 STM32CubeIDE IAP原理讲解,及UART双APP交替升级IAP实现 【经验分享】STM32_IAP详解(有代码,有上位机) STM32 之八 在线升级(IAP)超详细图解 及 需要注意的问题解决

<span title='2024-02-06 14:19:00 +0800 CST'>2024-02-06</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;81 words&nbsp;·&nbsp;RamLife

QT 获取编译时间

需求 Qt 为了功能上的需要,需要获取软件编译的时间. 解决 qt 默认的编译时间,使用的是英文字符,类似 Feb 13 2024, 而且当日期小于 10 的时候,使用的还是单个字符,没有补 0. QString build_date = QString(__DATE__); // qDebug() << "build time: " << build_date; build_date.replace(" "," 0"); //注意" "是两个空格,用于日期为单数时需要转成“空格+0” QDate build = QDate::fromString(build_date, "MMM dd yyyy"); 参考 Qt 获取编译时间 Qt获取编译时间

<span title='2024-02-01 18:44:00 +0800 CST'>2024-02-01</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;41 words&nbsp;·&nbsp;RamLife

QT chart 更加清晰

需求 qt chart 在打印的时候,因为缩放的问题,导致图标不清晰,需要能够更加清晰一些。 解决 chart 其实主要就是几个部分: 曲线,坐标轴及文字,辅助线 曲线 主要就是加粗即可,使用 QPen, 修改 width 即可。 QPen pen; pen.setStyle(Qt::SolidLine); //Qt::SolidLine, Qt::DashLine, Qt::DotLine, Qt::DashDotLine pen.setWidth(2); pen.setColor(Qt::red); series0->setPen(pen); //序列series0的线条设置 坐标轴 为了方便修改也使用 QPen QPen axis_pen; axis_pen.setStyle(Qt::SolidLine); //Qt::SolidLine, Qt::DashLine, Qt::DotLine, Qt::DashDotLine axis_pen.setWidth(3); axis_pen.setColor(Qt::black); axisX->setLinePen(axis_pen); 辅助线 辅助线分为两种,一种是文字对应的辅助线,另外一种是文字之间的辅助线. QPen grid_pen; grid_pen.setStyle(Qt::DashLine); //Qt::SolidLine, Qt::DashLine, Qt::DotLine, Qt::DashDotLine grid_pen.setWidth(2); grid_pen.setColor(Qt::darkGray); QPen minor_grid_pen; minor_grid_pen.setStyle(Qt::DotLine); //Qt::SolidLine, Qt::DashLine, Qt::DotLine, Qt::DashDotLine minor_grid_pen.setWidth(1); minor_grid_pen.setColor(Qt::darkGray); axisX->setGridLinePen(grid_pen); axisX->setMinorGridLinePen(minor_grid_pen); 坐标轴文字 文字一般就是两种方法: 加粗和加大 QFont axis_font = axisX->labelsFont(); axis_font.setBold(true); int axis_font_point_size = axis_font....

<span title='2024-02-01 18:34:00 +0800 CST'>2024-02-01</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;80 words&nbsp;·&nbsp;RamLife

重命名查询后的字段名称

需求 希望查询后的字段名称修改为其他的名称 解决 其实很简单,用 as 就可以了。 select device_id as user_infos_example from user_profile limit 2; 参考 MySQL练习5——将查询后的列重新命名

<span title='2024-01-21 17:34:00 +0800 CST'>2024-01-21</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;16 words&nbsp;·&nbsp;RamLife

sql inner 查询多个表

需求 sql 使用 inner 进行多表查询 解决 INNER JOIN 语法: INNER JOIN 连接两个数据表的用法: SELECT * FROM 表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号 INNER JOIN 连接三个数据表的用法: SELECT * FROM (表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号 INNER JOIN 连接四个数据表的用法: SELECT * FROM ((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号 INNER JOIN 连接五个数据表的用法: SELECT * FROM (((表1 INNER JOIN 表2 ON 表1....

<span title='2024-01-21 16:54:00 +0800 CST'>2024-01-21</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;122 words&nbsp;·&nbsp;RamLife

sql 将查询结果转换为其他内容

需求 sql 将查询到的结果转为为其他内容。 比如原来的结果是0,那么输出不通过,是1,输出是通过。 解决 使用 case when then else end 这样的模式。 "SELECT q.`flag_check`, " "(CASE WHEN q.`flag_normal` = 0 THEN '不通过' " "WHEN q.`flag_normal` = 1 THEN '通过' " "ELSE '不通过' END) " "FROM quality AS q" 参考 sql将查到的值(如 0,1,2)转换为相关的文字

<span title='2024-01-21 16:34:00 +0800 CST'>2024-01-21</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;41 words&nbsp;·&nbsp;RamLife

QT 构造函数中,检查配置文件,有问题就退出程序

需求 Qt 需要检查配置文件中的内容,如果有问题,就退出程序 解决 一般检查配置文件,是在构造函数环节,这个时候普通的退出是不行的。只能使用 QTimer 然后连接 qApp->quit() 来退出。 QSettings* configIni = new QSettings(file_path, QSettings::IniFormat, this); server_ip_ = configIni->value("ip", "192.168.1.100").toString(); server_port_ = configIni->value("port", "6666").toInt(); if (CheckServerIpAndPort(server_ip_, server_port_) == false) { QTimer *myTimer = new QTimer(); myTimer->start(10); connect(myTimer, &QTimer::timeout, this, [=](){this->close(); qApp->quit();}); } configIni->endGroup(); bool MainWindow::CheckServerIpAndPort(const QString &ip, uint16_t port) { QStringList list = ip.split('.'); if (list.size() != 4) { QMessageBox::critical(this, "IP格式错误", "请重新配置IP"); return false; } for (auto& s : list) { int address = s....

<span title='2024-01-14 18:44:00 +0800 CST'>2024-01-14</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;113 words&nbsp;·&nbsp;RamLife

yuv 格式介绍

需求 需要熟悉 YUV 格式 解决 RGB 和 YUV 介绍 RGB 是最简单的三原色,三个字节标识一个点 YUV Y是明亮度,U是色调,V是饱和度,也是可以用三个字节标识一个点。 优点 YUV 有如下的好处: Y 可以和 UV 分离,只有 Y 也可以显示图像,就是以前的黑白电视。 多个 Y 还可以共用 UV 分量,来压缩数据。 转换 Y = 0.299 * R + 0.587 * G + 0.114 * B U = -0.147 * R - 0.289 * G + 0.436 * B V = 0.615 * R - 0.515 * G - 0.100 * B R = Y + 1....

<span title='2024-01-07 16:32:00 +0800 CST'>2024-01-07</span>&nbsp;·&nbsp;2 min&nbsp;·&nbsp;412 words&nbsp;·&nbsp;RamLife

socket 超时时间

需求 java 中 socket 超时时间是什么样的? 解决 读写超时 默认为 0,一直阻塞等待,除非使用 setSoTimeout() 来设置超时时间。 连接超时 默认为 135 秒,默认重新发送6次 sync 包。 第一次等待 1秒,第二次等 2秒,第几次就是 2 的 N次方。 参考 【计算机网络】Socket的SO_TIMEOUT与连接超时时间 Socket 基础之超时时间 Java解决Client Socket连接服务端超时问题 java.net.SocketException in Java with Examples java.net.SocketException:Connection reset java.net.SocketException四大异常解决方案 设置socket connect超时时间的几种方法 Android Socket tcp连接状态判断

<span title='2024-01-07 10:37:00 +0800 CST'>2024-01-07</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;42 words&nbsp;·&nbsp;RamLife

mysql 常用计算和字符处理

需求 mysql 中常用的字符串处理和数值计算? 解决 字符串 Concat: 拼接 Upper,Lower: 大写,小写 Left, Rigth: 返回左边,右边的字符 Length: 长度 Locate: 找出字串 LTrim, RTrim: 去掉左边,右边的空格 SubString: 字串字符 数值计算 加减乘除,都是直接用数学符号就可以了。 Abs: 绝对值 Sin, Cos, Tan: 正弦,余弦,正切 Exp, Sqrt: 指数,平方根 Mod: 余数 Pi: 圆周率 Rand: 随机数 SIGN: 获取正负号, 正1,负-1,零0 日期时间 AddDate, AddTime: 增加日期,时间 CurDate, CurTime, Now: 返回当前日期,时间, 日期和时间 Date, Time, Day, DayOfWeek, Hour, Minute, Month, Second, Year: 日期,时间,天数,星期几,小时,分钟,月,秒,年 DateDiff: 日期差 Date_Add: 灵活的日期运算 Date_Formate: 格式化的日期和时间 比较 = : 判断是否相等,相等1,不相等0 <, >, <=, >= : 正常的大于和小于 <>, !...

<span title='2024-01-04 16:34:00 +0800 CST'>2024-01-04</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;94 words&nbsp;·&nbsp;RamLife