STM32批量写flash和分页写flash

227 阅读1分钟

批量写入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;
}