| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 | #include "gd_ota_flash.h"#include "gd32f10x_fmc.h"#include "systick.h"#include "string.h"void GD32_WriteFlash(uint32_t saddr, uint32_t *wdata, uint32_t wnum);void GD32_EraseFlash(uint16_t start, uint16_t num);//读取soft版本信息int read_soft_version(){	}void write_soft_version(BOOT_MESSAGE *save_message){	GD32_EraseFlash(FMC_Page,1);	GD32_WriteFlash(FMC_WRITE_START_ADDR,(uint32_t *)save_message,sizeof(BOOT_MESSAGE));}/*-------------------------------------------------*//*函数名:擦除FLASH                                *//*参  数:start:擦除起始扇区   num:擦几个扇区    *//*返回值:无                                       *//*-------------------------------------------------*/void GD32_EraseFlash(uint16_t start, uint16_t num){	uint16_t i;	fmc_unlock();	for (i = 0; i < num; i++)	{		fmc_page_erase((0x08000000 + start * 1024) + (1024 * i));	}	fmc_lock();}/*---------------------------------------------------------------------*//*函数名:写入FLASH                                                    */ /*参  数:saddr:写入地址 wdata:写入数据指针  wnum:写入多少个字节    *//*返回值:无                                                           *//*---------------------------------------------------------------------*/void GD32_WriteFlash(uint32_t saddr, uint32_t *wdata, uint32_t wnum){	fmc_unlock();	while (wnum > 0)	{		fmc_word_program(saddr, *wdata);		wnum -= 4;		saddr += 4;		wdata++;	}	fmc_lock();}//读取GD32flashvoid GD32_READ_OTA(BOOT_MESSAGE *READ){	uint32_t data=FMC_READ(FMC_WRITE_START_ADDR);	delay_1ms(10);	memcpy(READ,&data,4);}//对系统存储版本信息进行初始化void soft_init(){	BOOT_MESSAGE *currentBoot=malloc(sizeof(BOOT_MESSAGE));	GD32_READ_OTA(currentBoot);	if(currentBoot->VERSION_H ==0 && currentBoot->VERSION_L==0 && currentBoot->VERSION_M==0 )	{		currentBoot->VERSION_H=1;currentBoot->VERSION_L=0;currentBoot->VERSION_M=0;currentBoot->UP_FLAG=0;	}	write_soft_version(currentBoot);	free(currentBoot);	}
 |