批量写入flash,判断接收字符数不再变化就开始更新
iap_write_appbin(FLASH_APP1_ADDR,USART_IAP_BUF,applenth);
FLASH_APP1_ADDR是写入flash的地址,USART_IAP_BUF存储待更新的程序,可能很大超过30k,先存到ram,而芯片ram是48k,这样就不够用了,applenth是写入字节长度
分页写入flash,实际可以理解为接收两字节就写入一次,判断要不要文件,下面用了state,用来判断是更新程序还是一般指令。判断接收字符数不再变化就开始更新,时间要把握好,判断addr更好
rct6的FLASH_ONEPAGE_SIZE是2048
if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET) {
ch = USART_ReceiveData(USART1);
if(state==0)
{
USART_Buffer[USART_Data_Len++]=ch;
}
else
{
if(flag==0)
{
flag=1;
Last_data=ch;
}
else
{
flag=0;
USART_Buffer[USART_Data_Len]=(u16)ch<<8;//将后得到的数据作为高位
USART_Buffer[USART_Data_Len]+=(u16)Last_data;//将先得到的数据作为低位
FLASH_ProgramHalfWord(addr,USART_Buffer[USART_Data_Len]);
USART_Data_Len++;
addr=addr+0x02;
}
if(USART_Data_Len>=FLASH_ONEPAGE_SIZE/2) //当写满一页后
{
USART_Data_Len=0;
FlashPages++;
}
USART_COUNT=0;//清空计数
USART_FLAG=1;//标识读取
}
写前一定先擦除
void EraseFlash(u32 addr,u8 pagenumber)
{
BootLoader.delay_ms(100);
if(BootLoader.USART_Buffer[0]==0xff&&BootLoader.USART_Buffer[2]==0xaa)
{
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|
FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
for(u8 i=0;i<BootLoader.USART_Buffer[1];i++)
FLASH_ErasePage(addr+i*1024);
BootLoader.USART_Data_Len=0;
SWITCH=2;
BootLoader.state=1;
BootLoader<<"please choose file.....\n";
}
BootLoader.USART_Data_Len=0;
}