在做一个OTA升级程序的时候,发现单片机的一些flash问题
#首先第一个问题:
当程序调用函数OTA_erase_middleWay_sector()之后,程序继续运行,程序运行速度明显减慢,而且运行会出现异常,比如内部的读写指针和读写计数器紊乱,但是没死机:
OTA_erase_middleWay_sector(); //这个函数调用了系统函数void OTA_erase_middleWay_sector(){FLASH_Unlock(); //解锁写保护FLASH_EraseSector(dltSector,VoltageRange_3);//擦除这个扇区,按照字(32bit)擦除 FLASH_Lock();//上锁写保护 }
但是把函数OTA_erase_middleWay_sector()放在程序启动的时候运行一下,就没问题了。
#第二个问题:
407的一些数据块是128K的数据块,如果拆分成2k,一次一次写入的话,在写到第二个包的时候会出错。
表现的现象也是写入后运行速度变慢,且写入的数据回读发现不对
但是我每次写入2k数据块之前、之后调用FLASH_Status()函数,它返回的总是9,也就是FLASH_COMPLETE
解决方法,一次写入整个大数据块,取消分块写入
void OTA_write_a_2k_block(struct pretty_buffer* pb,int block2k_sn)
{struct ptr_and_length pl;pl=pbuf_get_buf_PL(pb);u32 ba=STM32_dltFLASH_BASE+(2048*block2k_sn);Flash_WriteMoreData(ba,pl);
}以下是OTA_write_a_2k_block层层调用的库函数
//-----------------------------------------------------
/*******************************************************************************
* Function Name : flash_write
* Description : 内部flash写函数
* Input : StartAddr flash起始地址*p_data 待写入数据指针countToWrite 写入数据的数量
* Output : 0:正确执行,非0:出错
* Return : None
* Attention : 输入数据一定是u32 的指针,即数据一定是按照4字
节对齐写入的。所以:size也是u32的个数(字节数的4分之一)
*******************************************************************************///使用本函数要擦除,再用本函数写入,从指定地址开始写入多个数据
void FLash_WriteMoreData(uint32_t startAddress,uint16_t *writeData,uint16_t countToWrite)//每次写要128K,因为擦除时,一擦就是128K
{FLASH_Unlock(); //解锁写保护for(uint16_t di=0;di<countToWrite;di++){FLASH_ProgramHalfWord(startAddress+di*2,writeData[di]);}FLASH_Lock();//上锁写保护//return 1;
}
//-----------------------------------------------------
void Flash_WriteMoreData(uint32_t startAddress,struct ptr_and_length pl)
{u16* a=(u16*)pl.ptr;u16 b=pl.len;FLash_WriteMoreData(startAddress,a,b);
}