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.这样就可以避免变量的大小超过变量类型的长度进而出现莫名其妙的问题。