# uart-flash-helper **Repository Path**: ed3/uart-flash-helper ## Basic Information - **Project Name**: uart-flash-helper - **Description**: 用 python 编写的串口 flash 下载工具 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-19 - **Last Updated**: 2025-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### Flash 内存串口烧录工具 本工具作为一个上位机,与下位机进行串口通信,实现烧录文件到下位机的功能 ### 工具界面 ![工具界面](./img/工具界面.png) 在下载时, 起始地址就是文件在 flash 芯片上的存储地址,在擦除时自动对齐到 块/页 地址。 芯片类型下拉框内定义了作者常用的一些芯片。**此外, 还可以在设置中自定义其它的芯片类型(TODO, 暂未完成)** 数据校验上提供了校验和 与 CRC32/MPEG2 的两种校验方式,其中校验和在对数据包内所有数据累加取低八位后,再按位取反并加 1 下面是校验和的计算代码 (上位机, python) ```python def calculate_checksum(data): """计算累加和校验(取低8位)""" checksum = 0 for byte in data: checksum = (checksum + byte) checksum = checksum & 0xFF # 取低8位 # 按位取反 + 1 checksum = (~checksum + 1) & 0xFF return bytes([checksum]) ``` stm32-下位机计算校验和代码 ```c // 计算校验和 static uint8_t calc_checksum(uint8_t* buf, size_t len) { uint8_t sum = 0; for (size_t i = 0; i < len; i++) sum += buf[i]; // 按位取反 + 1 sum = (~sum) + 1; return sum; } ``` 下面是 CRC32/MPEG2 校验代码 (上位机, python) ```python def crc32mpeg2(data, crc=0xffffffff): """计算 CRC-32/MPEG-2 校验""" for byte in data: crc ^= byte << 24 for _ in range(8): if crc & 0x80000000: crc = (crc << 1) ^ 0x04c11db7 else: crc <<= 1 return crc & 0xffffffff ``` 下位机对于 STM32 来说的话,可直接使用硬件 CRC 函数进行计算, 于 cubemx 中直接启用CRC功能即可,无需做任何配置。相同的数据经过计算上位机和下位机的结果是一致的 ![stm32-cubemx 配置界面](./img/crc-cubemx.png) stm32-下位机中计算 crc 的方法 ```c // 计算 CRC static u32 calc_crc(uint8_t* buffer, size_t len) { return HAL_CRC_Calculate(&hcrc, buffer, len); } ``` ### 设置界面 ![设置界面](./img/设置界面.png) 串口高级设置中定义了串口的数据位、校验位、停止位三个高级参数 读取超时是在读取下位机回应时的最大时间,超时将判断下位机回应失败,进而判断擦除/写入操作失败, 写入超时则是写入数据到串口中的最大时间,超时则判断写入失败,进而终止当前的写入/擦除操作 擦除设置中的下拉菜单有两个值可以选 - 按**扇区**擦除: 芯片擦除时以扇区为单位进行擦除 - 按**块**擦除: 芯片擦除时以块为单位进行擦除 重置设置按钮会重置所有内容 芯片自定义按钮是后面要新增的功能,暂未完善 ### 如何打包成一个单独的 exe 文件 安装 `PyInstaller` ```shell pip install pyinstaller ``` 执行 `build_py_exe.py` ``` shell python build_py_exe.py ``` 打包好的文件会位于当前目录下的 dist 文件夹内