要更行数据我们首先得知道:
1.谁让OTA_FLAG标志位置位允许OTA升级?什么时候置位?怎么复位?
flash中A区OTA接收数据完成后置位OTA_FLAG;接收完成后复位不仅仅是在RAM中OTA_FLAG=0;还要将OTA_FLAG写入24C02中保存状态
2.最新版的程序下载到哪?
通过分片下载的方式下载到W25Q64中;什么叫分片下载?就是比如一个64K的文件,每次下载256字节,分数次下载
3.OTA时,最新版本的程序文件如何下载?下载多少?
服务器告知下载并将OTA_FLAG置位;下载的大小也是通过服务器告知,下载的长度这个变量也需要保存到24C02中
4.发生OTA事件时,B区如何更新A区?
根据保存在24C02中的下载长度,拿数据(一次拿1024字节),写到A区
main.h
#ifndef MAIN_H
#define MAIN_H
#include "stdint.h"
#define GD32_FLASH_SADDR 0x08000000 //FLASH起始地址
#define GD32_PAGE_SIZE 1024 //FLASH扇区大小
#define GD32_PAGE_NUM 64 //FLASH总扇区个数
#define GD32_B_PAGE_NUM 20 //B区扇区个数
#define GD32_A_PAGE_NUM GD32_PAGE_NUM - GD32_B_PAGE_NUM //A区扇区个数
#define GD32_A_START_PAGE GD32_B_PAGE_NUM //A区起始扇区编号
#define GD32_A_SADDR GD32_FLASH_SADDR + GD32_A_START_PAGE * GD32_PAGE_SIZE //A区起始地址
#define UPDATA_A_FLAG 0x00000001 //状态标志位,置位表明需要更新A了
#define OTA_SET_FLAG 0xAABB1122 //OTA_flag对勾状态对应的数值,如果OTA_flag等于该值,说