STM32_IAP_BOOTLOADER_上位机串口升级
项目概述
我写了一个IAP 用于stm32串口升级和bootloader 采用CRC16-MODBUS 同时写了一个上位机 用于串口传输 串口处理单片机内采用了FIFO 帧解析是写了个程序和协议
程序开源 配有相对应的注释
下面是对他的现象 同时关于bootloader做了一些补充
自用 有疑问可以问我
流程演示
bootloader程序
void detect_app_key(void)
{
uint32_t startTime = HAL_GetTick();
uint32_t timeout = 5000; // 5秒超时
// 在2秒内轮询检测按键状态
while ((HAL_GetTick() - startTime) < timeout) {
// 检测 KEY0 是否被按下 (低电平有效)
if (HAL_GPIO_ReadPin(Key0_GPIO_Port, Key0_Pin) == GPIO_PIN_RESET) {
// 可选:添加简单的去抖动延迟,例如 10-20ms
HAL_Delay(20);
// 再次确认按键仍然处于按下状态
if (HAL_GPIO_ReadPin(Key0_GPIO_Port, Key0_Pin) == GPIO_PIN_RESET) {
BL_JumpToApp();
}
}
// 短暂延迟以降低 CPU 占用率,非必须但推荐
HAL_Delay(10);
}
}
这里是上电后5s内检测按键key0是否有低电平,有的话执行跳转BL_JumpToApp();
我写了一个两个LED灯常亮的程序
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);
while (1)
{
}
}
keil设置
生成bin文件

这里贴上命令
$K\ARM\ARMCC\bin\fromelf.exe --bin --output=.\Output\@L.bin !L
会在当前目录下生成output文件夹 里面有bin文件
串口操作
首先上电 显示
之后输入TX:01020000000408010000C29A

看到地址已经设定
之后发送bin文件

这里注意串口工具的参数设定 分片大小为2kb 对应page大小,校验选择CRC16 帧间隔设定为0.5秒 要不然单片机的通信解析和写flash会冲突 实际上200ms以上就够了
成功写入
现象
之后复位 复位后5s内按下key0 程序跳转

成功执行APP程序 LED0与LED1点亮
开发过程中遇到的bug
首先是通信与写入操作的bug 注意写入时间
之后是CRC校验 这个最好自己算 别问AI 问AI有时候会给一个错误的校验码 调试半天以为是算法错了 实际上是AI给的是错的
之后是bin文件的配置
这个bin文件要在keil里设置好文件大小和文件首地址

比如这个就是APP的 他在他的bin文件内的第二个字就是他的复位向量 不同的start会影响它复位向量的值 同时这个start要与代码里的设定的APP地址相同

如果不这样设置的话 会导致跳转之后程序无法正常执行 这个我当时就遇到这个问题了 一开始以为只要把bin文件烧进去 再在代码里把MSP指向存储bin文件的flash地址就行 但是发现这样无法正常执行程序啊 折磨了我好久 问了一下AI 才发现我的bin文件有问题 最后设置 设置好了
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)