rt-thread hard fault 定位

需求 rt-thread hard fault 定位方式 解决 一般 hard fault 都是 pc 为 0 导致的,处理方法如下: 查看 lr,找到调用的位置 使用 ide 查看汇编,或者打开 map 文件,找到 lr 指向的位置。注意 map 只有函数首地址,所以定位时使用 lr 的前几位。 参考 {RTT} RT-Thread Hard Fault 死机问题定位方法

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

stm32 rtc 读取数据不正常

需求 stm32 使用 hal 读取 rtc 数据时,发现数据读取要不是 0,要不就不变,比较奇怪。 解决 经过多次调试并查看源码,才发现,API的注释里面写了,需要先调用 HAL_RTC_GetTime, 再调用 HAL_RTC_GetDate, 才行,否则就不行。因为先读取 time 可以解锁读取。 =You must call HAL_RTC_GetDate() after HAL_RTC_GetTime() to unlock the values in the higher-order calendar shadow registers to ensure consistency between the time and date values.= 参考 HAL库使用RTC设置时间显示日期不符的解决办法 STM32】HAL库 STM32CubeMX教程十三—RTC时钟 STM32电子万年历制作详解(RTC实战) 【经验分享】STM32实例-RTC实时时钟实验③-RTC设置日期时间函数 【STM32】HAL库 STM32CubeMX教程十三—RTC时钟 STM32H750中RTC简介及使用方法 STM32CubeMX学习笔记——STM32H743_RTC

2023-12-12 · 1 min · 51 words · RamLife

QT QJson 使用

需求 Qt 如何使用 QJson 解析 json 解决 int NetworkDataParse::Parse(const QByteArray& data, QJsonObject& obj) { QJsonParseError error; QJsonDocument doc = QJsonDocument::fromJson(data, &error); if (doc.isNull()) { return -1; } obj = doc.object(); int type = obj.value("type").toString().toInt(); // QJsonValue type_value = obj.value("type"); // QString type_string = type_value.toString(); // qDebug() << "Parse: " << type_string << ", " << type; // switch (type) { // case kTypeAlive: // return ParseAlive(obj); // break; // default: // break; // } // return 0; return type; } 参考 Qt平台下使用QJson解析和构建JSON字符串 Qt 学习之路 :使用 QJson 处理 JSON JSON Support in Qt QJson的生成和解析 QJson读取及写入 使用fastjson解析JSON数据 QJsonArray....

2023-12-11 · 1 min · 100 words · RamLife

QT5 升级到 Qt6, QRegExp 不能用

需求 Qt5 的工程升级到 Qt6 之后,找不到 QRegExp 等一系列类。 解决 QRegExp -> QRegularExpression QRegExpValidator -> QRegularExpressionValidator // Qt5 QRegExp version(QLatin1String("(.+)_v(\\d+)")); if (version.exactMatch(completeBaseName/*QString*/)) { // some code } // Qt6 QRegularExpression version(QLatin1String("(.+)_v(\\d+)")); QRegularExpressionMatch match = version.match(completeBaseName); if (match.hasMatch()) { // Find exact match or not } 参考 QT6找不到QRegExpValidator类问题解决办法 关于QRegExpValidator头文件不存在的问题 Qt6中的端口QRegExp::exactMatch()

2023-12-02 · 1 min · 47 words · RamLife

printf 格式化输出

需求 printf 格式话输出具体有哪些? 解决 控制符 控制符 说明 %d 十进制整形输出 %ld 长整形 %md 指定宽度至少 m 输出,宽度不够就空格补,宽度超过就按照实际输出 %u 无符号整形 %c 单个字符 %f 浮点数,小数为6位,超过6位四舍五入 %s 字符串 格式 具体格式: %[flags][width][.precision][length]specifier 整形 %d, 整形 %4d, 大于等于4位宽度,补空格 %04d, 大于等于4位宽度,补0 浮点数 %f, 浮点数,小数6位 %.4f, 小数4位 %6.2f, 大于等于6位,小数2位,不足补空格 %06.2f, 大于等于6位,小数2位,不足补0 字符串 %s, 字符串 %6s, 大于等于6位,不足补空格 参考 C语言printf指定宽度的格式化输出

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

Guix text_button 设置文字,报错 0x30

需求 需要设置 text_button 上面显示的文字的时候,报错 "GX_SYSTEM_MEMORY_ERROR : (0x30) 未定义内存分配器或内存分配失败。" 解决 分析 debug 仔细追查,发现 _gx_text_button_text_set_ext 这个函数里面会判断有没有设置 private text copy, 如果设置了,那么再检查有没有开启 _gx_system_memory_allocator, 如果没有,那么就会报错 0x30 了。 解决方法 有两种解决方法: 无 private text copy + 无 gx_system_memory_allocator_set(memory_allocate, memory_free), 会直接使用传入进去的字符串参数,只要传入进去的不是局部变量,就没有必要勾选 private text copy. 有 private text copy + 有 gx_system_memory_allocator_set(memory_allocate, memory_free), 也可以,会多复制一份数据。 参考 第 4 章 - GUIX 服务说明 {ThreadX全家桶} GUIX sample 错误–>gx_prompt_text_set_ext大坑,必须正确指定有效字符串长度才可以使用

2023-11-30 · 1 min · 56 words · RamLife

c++ 成员变量初始化推断数组大小

需求 cpp 发现直接使用 const char str[] ="test"; 作为成员变量,编译会报错: error: array bound cannot be deduced from an in-class initializer. 解决 这个报错的原因是,作为成员变量,可能会被构造函数中的 类内初始化列表重新初始化。比如: Foo() : str({'a','b', 'c', 'd'}) {} // str ="abcd0". 所以,如果这个成员变量本身是不变的情况,可以使用 constexpr 这个关键字, static constexpr char str[] ="test"; 这样,变成类变量。 参考 关于c ++:不能从成员变量的初始化字符串中推断出数组大小的原因是什么? C++11关键字constexpr看这篇就够了

2023-11-30 · 1 min · 43 words · RamLife

STM32 DMA2D 使用

需求 stm32 使用 dma2d 来加速显示 解决 DMA2D 的优点 主要就是图像中的局部矩形区域的硬件数据传输。比 DMA 的好处,就是局部矩形区域中,换行的时候,自动计算地址,并转到局部区域第二行的首地址。 其他的就是颜色格式转换和透明度混合。 DMA2D 加速 lcd 显示 DMA2D 加速 LCD 显示的前提是,LCD 的驱动是硬件驱动,比如说,使用 FMC 或者 LTDC 之类的硬件驱动 LCD,程序只需要向地址写入数据,就可以显示。 能够加速的主要是: 图像数据,直线,清屏等。主要需要实现的其实就是两个函数: Dma2dCopy, Dma2dFill. // fill color void Dma2dFill(void * dest, uint32_t width, uint32_t height, uint32_t line_offset, uint32_t color, uint32_t pixel_format) { DMA2D->CR = DMA2D_R2M;//0x00030000UL | (1 << 9); DMA2D->OCOLR = color; DMA2D->OMAR = (uint32_t)dest; DMA2D->OOR = line_offset; DMA2D->OPFCCR = pixel_format; //LTDC_PIXEL_FORMAT_RGB565; DMA2D->NLR = (uint32_t)(width << 16) | (uint16_t)height; DMA2D->CR |= DMA2D_CR_START; while (DMA2D->CR & DMA2D_CR_START) {} } // copy color data void Dma2dCopy(void * dest, const void * src, uint32_t width, uint32_t height, uint32_t dest_line_offset, uint32_t src_line_offset, uint32_t pixel_format) { DMA2D->CR = DMA2D_M2M;//0x00000000UL | (1 << 9); DMA2D->FGMAR = (uint32_t)src; DMA2D->OMAR = (uint32_t)dest; DMA2D->FGOR = src_line_offset; DMA2D->OOR = dest_line_offset; DMA2D->FGPFCCR = pixel_format; //LTDC_PIXEL_FORMAT_RGB565; DMA2D->OPFCCR = pixel_format; //LTDC_PIXEL_FORMAT_RGB565; DMA2D->NLR = (uint32_t)(width << 16) | (uint16_t)height; DMA2D->CR |= DMA2D_CR_START; while (DMA2D->CR & DMA2D_CR_START) {} } DMA2D 加速显存 主要是用在实现各种 gui 的接口函数,实现中用于加速内存复制和颜色混合。...

2023-11-22 · 1 min · 167 words · RamLife

stm32使用FMC控制 LCD 时,图像不正常

需求 stm32 使用 fmc 来控制 Lcd 显示时,碰到了两个问题: 图像变小了,并且是双份显示 屏幕只显示了 4/5,最下面花屏 解决 经过网络搜索和反复的调试,终于找到问题。 图像变小 这个是 fmc 的时序配置有问题,导致使用 DMA2D 进行数据传输时,lcd 会丢数据,然后图像就变小了。这个解决只需要对照 lcd 的芯片中的时间参数,重新设置 fmc 的时序参数即可解决。 图像只显示 4/5 这个是 FMC 的地址线的问题。 我们需要重新考虑一下为什么可以使用 fmc 来控制 lcd 显示,理论上来说, DMA2D 写入数据的时候,地址是自动增长的啊! 其实因为我们只使用了一根地址线,那么写入数据的时候,这个地址线的低位就算增长也没有关系,毕竟我们只使用了最高位作为地址线,只要使用 DMA2D 写入的数据不会超过最高位,那么就不会有影响。 所以这次的错误就是 DMA2D 在全屏写入的时候, 320*240 = 76800, 而当前的地址线使用的是 A16,那么能够提供的空间只有 2的16次方 = 65536,已经溢出了。解决的方法也很简单,使用 A17 地址线即可。 参考 DMA2D skips pixels when sending directly to display over FMC STM32 FMC Display STM32的FSMC时序解析 【12】、STM32F767——————>FMC之LCD屏 STM32H755BIT DMA2D + FMC + External SRAM Write Issue STM32 FMC原理详解 STM32 FSMC/FMC原理保姆级讲解(一) FSMC中NOE引脚功能 LCD屏参:手把手教你配置LCD屏参(proch值)

2023-11-22 · 1 min · 82 words · RamLife

Guix 是否使用显存方案选择

需求 使用 guix,是否需要显存? 显存需要多大? 解决 是否需要显存? gui 显示一般就是两种方式,直驱或者显存刷新。 直驱 直驱的意思是,程序中界面需要变化时,直接向显示设备中对应的区域写入新的数据。 好处是: 不需要显存,那里变化改那里。适合于 RAM 小的情况。 坏处是: 因为没有显存,所以在更新时经历这样的过程: 1. 先清除相关区域; 绘制背景; 3. 绘制前景. 这种多步骤的实现方式,加上小容量 RAM 一般 使用的是接口屏本身的速度限制,很容易会造成整体时间过长,人眼看上去容易有闪烁和撕裂的情况。也就是闪屏的情况。 显存 显存的意思是,程序中界面需要变化时,把需要更新的数据先更新到显存中,然后 gui 会一次把最终结果写入到屏幕。 好处是: 这种情况下屏幕更新需要的时间很短,只有直驱的 1/3,显示稳定,没有闪烁的情况。 坏处是: 需要 RAM 足够大,能够容纳整个屏幕,这样才能作为显示缓冲来工作。 总结 如果 RAM 够大,推荐显存方式,不闪屏,体验好。如果 RAM 小,屏幕小,用户对于显示效果不敏感,就可以使用直驱方案。 显存容量计算 显存占用的 RAM 计算方式: 屏幕长 * 屏幕宽 * 单个像素点字节数。 比如: 320 * 240 的屏幕,使用 16bit 位宽的像素,那么显存大小就是 320 * 240 * 16 / 8 = 153.6 kB. 并且使用 gui + 显存的方案,一般会搭配 DAM2D 来加快数据传输,包括新数据写入显存,以及显存通过 fmc 更新到屏幕。...

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