STM32H7串口IAP实现

文章详细介绍了如何通过串口在STM32H7单片机上实现固件的IAP(In-ApplicationProgramming)升级。内容包括串口初始化、不定长数据接收、Flash写入及IAP跳转的关键步骤。在数据接收中,通过检测串口无数据接收的时间间隔判断接收完成。在Flash写入部分,强调了扇区擦除和最小写入单位的注意事项。最后,提到了IAP跳转前关闭中断的重要性,并提供了封装好的IAP和Flash操作代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、概述

    通过IAP原理一文我们大概知道了IAP的工作原理和工作流程。但是现在要通过串口来将这个功能实现,我们应该怎么做呢。总体上整个代码可以分为4个部分:串口功能初始化、串口不定长数据接收、Flash写入以及IAP跳转。接下来我将一一解释。

2、串口功能初始化

    这一部分就是在给串口IAP造轮子,是功能实现的基础。在这里我通过Cubemx进行配置,将串口2配置成115200波特率,其它值默认,打开串口中断,设置中断优先级为(3,0),最后生成代码。

    生成代码后添加串口重定向语句,随后进行简单的收发测试,确定串口初始化成功。重定向语句如下:

#include "stdio.h"

int fputc(int ch, FILE *f)

{

    HAL_UART_Transmit(&huart2 , (uint8_t *)&ch, 1 , 0x0f);

   return ch;

}

3、串口接收不定长数据

    在通过串口发送待升级的bin文件时,由于我们不知道、也没办法固定bin文件内容的长度,所以我们就要将串口的接收设置称接收不定长的长度。但这里就有问题了,我该怎么样才知道它是否接收完成了呢?这里我查了一些资料,它们都是通过判断串口是否连续一段时间没有接收到数据来判断是否接收完成。在使用串口助手进行文件发送时,它会固定的没发多少个字节就会延时一段时间,我们只需要让我们判断的间隔时间大于串口助手的延时就可以。

    我是通过在滴答中断函数中添加一个不断自增的变量time,当接收到数据时就降将该变量清理,当该变量的值超过了比较的值就认为接收完成,此时就会开始处理接收的数据。如果一直接收不到数据,time的值就会一直自增。由于设定的比较值为1S,所以我让time的值在大于等于1500就置0.这样就可以避免变量的大小超过变量类型的长度进而出现莫名其妙的问题。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值