打印
[综合信息]

MCU字库升级方案

[复制链接]
524|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2023-8-24 08:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MCU字库升级
MCU(Microcontroller Unit)字库升级是指在嵌入式系统中使用的微控制器芯片中,对字库(字符集)进行更新或升级的过程。字库升级通常用于改进显示效果、支持新的字符集或语言、修复字形错误等。

下面是一个一般的MCU字库升级的步骤:

准备新的字库数据:获取新的字库数据文件,这可以是包含字符集的二进制文件、字库库文件或其他格式的数据。

备份原有字库:在进行字库升级之前,建议先备份原有的字库数据,以防止意外情况发生。

连接到目标设备:将目标设备(嵌入式系统)与计算机连接起来,以便进行字库升级。

选择升级方式:根据目标设备的支持和升级方式,选择适合的字库升级方式。这可能包括通过串口、USB接口、编程器或其他特定的升级接口进行升级。

烧录新的字库数据:使用相应的工具或软件,将新的字库数据烧录到目标设备的存储器中。具体的烧录过程可能因芯片型号、开发环境和升级方式而有所不同。

验证升级结果:在完成字库升级后,进行验证以确保新的字库数据已正确烧录到目标设备中。可以通过显示字符、文本输入或其他相关功能来验证字库升级的效果。

请注意,具体的MCU字库升级过程可能因芯片厂商、开发环境和目标设备而有所差异。在进行字库升级之前,建议查阅相关的文档、用户手册或参考资料,以了解特定芯片和开发环境的相关指导和建议。此外,字库升级也可能需要特定的工具、软件或开发环境的支持。

字库处理存储方法
flag区
固定在后256k起始地址,即0x08040000

typedef __packed struct
{
    uint32_t exist_flag;
    uint32_t fontlib_addr;
    uint32_t fontlib_len;
    uint8_t md5[16];
} font_upgrade_flags_t;
__attribute__((at(FONT_LIB_FLAG_ADDR))) volatile const font_upgrade_flags_t font_flags = {
    .exist_flag = FONT_LIB_EXIST_FLAGS,
    .fontlib_addr = FONT_LIB_START_ADDR,
};


字库版本(与固件一致)
作为一个变量,存在于字库的开头,即 0x08040800

__attribute__((at(FONT_LIB_START_ADDR))) volatile const uint32_t font_lib_version =
                                                        (DEVICE_VERSION_A_PRJ_NUM << 24) |
                                                        (DEVICE_VERSION_B_PRJ_STAGE << 16) |
                                                        (DEVICE_VERSION_C_MAJOR << 8) |
                                                        (DEVICE_VERSION_D_MINOR << 0);


字库数据bitmap
存放于".fontconst"的section,通过attribute给所有需要的bitmap加上属性
存放于字库版本之后,即0x08040804后都是字库数据

#define LV_ATTRIBUTE_LARGE_CONST __attribute__((section(".fontconst")))


校验
开机判断:
升级过程最后会将flag区的字库存在标记置位,开机初始化阶段会进行判断,如果存在
标记位不在
标记区内的地址不合法
长度不合法
线程不运行,异常停止

合法校验:
升级过程最后会将整个字库的MD5计算值保存到标记区,开机会进行一次计算校验
开机初始化阶段不判断MD5校验是否通过(如果打开会影响keil下载调试效率,最后也可打开)
当大包升级中心或上位机查询字库版本时,如MD5校验不通过,则status=1

示例代码
由于具体的MCU芯片和开发环境有很多种,每种芯片和开发环境可能都有不同的代码实现方式。以下是一个简单的示例代码,用于演示如何使用Arduino开发环境进行MCU字库升级的过程:

#include <Wire.h>

#define EEPROM_ADDRESS 0x50 // EEPROM的I2C地址

void setup() {
  Wire.begin(); // 初始化I2C总线
  Serial.begin(9600); // 初始化串口用于调试输出
}

void loop() {
  // 检测是否需要进行字库升级的触发条件,例如按下一个按钮或接收到特定的指令等

  // 备份原有字库数据
  backupFontData();

  // 获取新的字库数据
  byte newFontData[] = {0x00, 0x01, 0x02, ...}; // 替换为实际的新字库数据

  // 进行字库升级
  updateFontData(newFontData);

  // 验证升级结果
  if (verifyFontData(newFontData)) {
    Serial.println("字库升级成功!");
  } else {
    Serial.println("字库升级失败!");
  }

  // 延时等待下一次字库升级的触发条件
  delay(1000);
}

void backupFontData() {
  // 实现备份原有字库数据的代码
  // 将原有字库数据读取并保存到一个备份文件中
}

void updateFontData(byte* newFontData) {
  // 实现字库升级的代码
  // 将新的字库数据写入到MCU的存储器中,可以使用I2C总线或其他适合的接口进行通信和写入操作
  // 例如,使用Wire库的write函数将数据写入EEPROM
  for (int i = 0; i < sizeof(newFontData); i++) {
    Wire.beginTransmission(EEPROM_ADDRESS);
    Wire.write(i, newFontData);
    Wire.endTransmission();
    delay(5); // 延时等待写入完成
  }
}

bool verifyFontData(byte* newFontData) {
  // 实现验证升级结果的代码
  // 读取MCU存储器中的字库数据,并与新字库数据进行比较,确保升级结果正确
  // 返回true表示验证通过,返回false表示验证失败
}



请注意,上述示例代码仅供参考,具体的实现方式可能因芯片型号、开发环境和升级方式的不同而有所差异。在实际应用中,您需要根据您使用的具体芯片和开发环境的文档、用户手册或参考资料来编写适合的代码。
————————————————
版权声明:本文为CSDN博主「墨染 锦年」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44710568/article/details/131636922

使用特权

评论回复

相关帖子

沙发
pangb| | 2023-8-27 10:31 | 只看该作者
可以通过显示字符、文本输入或其他相关功能来验证字库升级的效果。

使用特权

评论回复
板凳
tpgf|  楼主 | 2023-9-8 15:40 | 只看该作者
pangb 发表于 2023-8-27 10:31
可以通过显示字符、文本输入或其他相关功能来验证字库升级的效果。

这个办法应该是非常直观简便的方法了

使用特权

评论回复
地板
guanjiaer| | 2023-9-8 16:04 | 只看该作者
如果字库所需的存储空间比较大怎么办呢

使用特权

评论回复
5
keaibukelian| | 2023-9-8 16:43 | 只看该作者
可以在不擦除老字库的情况下添加新的字库吗

使用特权

评论回复
6
观海| | 2023-9-8 18:59 | 只看该作者
我们可以改变字库中的字符的编码方式吗

使用特权

评论回复
评论
9pin 2023-9-28 09:21 回复TA
啥编码方式?自己做一个。 一般汉字都是按照GB标准排布,矢量字库就是按照unicode。 繁体就是按照big5.... 
7
heimaojingzhang| | 2023-9-8 19:26 | 只看该作者
可以使用外挂的存储芯片在存储这个字库吗

使用特权

评论回复
8
paotangsan| | 2023-9-8 19:53 | 只看该作者
keaibukelian 发表于 2023-9-8 16:43
可以在不擦除老字库的情况下添加新的字库吗

应该是不容易实现 毕竟是对存储空间操作

使用特权

评论回复
9
七毛钱| | 2023-9-11 15:41 | 只看该作者
这个升级方案对字库的储存空间有要求吗

使用特权

评论回复
10
daichaodai| | 2023-9-11 20:09 | 只看该作者
升级字库其实和升级固件是一样的操作

使用特权

评论回复
11
单片小菜| | 2023-9-28 16:56 | 只看该作者
直接外挂字库芯片是不是会好一些呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1897

主题

15568

帖子

11

粉丝