MCU字库升级方案

字库处理存储方法

flag区

固定在后256k起始地址,即0x08040000

c 复制代码
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

c 复制代码
__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后都是字库数据

c 复制代码
#define LV_ATTRIBUTE_LARGE_CONST __attribute__((section(".fontconst")))

校验

开机判断:

升级过程最后会将flag区的字库存在标记置位,开机初始化阶段会进行判断,如果存在

标记位不在

标记区内的地址不合法

长度不合法

线程不运行,异常停止

合法校验:

复制代码
升级过程最后会将整个字库的MD5计算值保存到标记区,开机会进行一次计算校验
开机初始化阶段不判断MD5校验是否通过(如果打开会影响keil下载调试效率,最后也可打开)

当大包升级中心或上位机查询字库版本时,如MD5校验不通过,则status=1

通过升级ID兼容方案 和升级协议进行

相关推荐
m0_377108143 小时前
小智ai,esp32
单片机
是摆烂第一名呀3 小时前
RK3576+GMSL摄像头底层适配与调试
linux·arm开发·驱动开发·嵌入式硬件·数码相机
Mr-pn-junction12 小时前
clk_gate
单片机·嵌入式硬件·fpga开发
尼喃17 小时前
662K和65Z5三脚稳压芯片PW6566,附引脚定义与典型电路图
嵌入式硬件
李永奉20 小时前
杰理可视化SDK开发-【BUG】配置“TWS两边同时按消息使能”功能后,按键单击功能无效失灵
开发语言·单片机·嵌入式硬件·物联网·bug
执迷不悟82321 小时前
51单片机--中断/定时/PWM
单片机·嵌入式硬件·51单片机
A小调的码农1 天前
OPENOCD+MSYS+VSCODE:从“灯不亮“到“终于亮了“
ide·vscode·stm32·单片机·编辑器
AI的探索之旅1 天前
让 Claude Code 直接操刀画原理图和 PCB:VSCode 插件接外部 API 全流程
linux·ide·vscode·嵌入式硬件·编辑器
Dlrb12111 天前
单片机通信协议---串口及串口通信
单片机·嵌入式硬件·串口·uart·modbus·波特率·主机从机
嵌入式-老费1 天前
esp32开发与应用(用好ttl转485模块)
stm32·单片机·嵌入式硬件