回复【5楼】 正点原子 :
---------------------------------
写数据的方式基本就是参照IAP例程里面的写的,不过因为这个芯片RAM只有10K所以代码只能分段写进FLASH,所以我自己写的传输协议。
上位机软件里面写了验证写入正确性的功能,main.c文件中第57到 62行 去除“//”就可以支持,
[mw_shl_code=c,true]/*关闭IAP后加个延时,将APP程序段重新由串口发出*/[/mw_shl_code]
[mw_shl_code=c,true]//NowTime=0;
//while(1){
// NowTime++;
// if(NowTime>0x00200000)break;
//}
//UART_SendBytes((char*)0x08005000,flash_count);
[/mw_shl_code]
[mw_shl_code=c,true]{
if(CRC_Value1==CRC_Value){//CRC正确则将程序段写入
/*FLASH编程使能*/
FLASH_Unlock();
/*清标志位*/
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
/*页擦除*/
FLASH_ErasePage(FLASH_APP_ADDR+STM_SECTOR_SIZE*Data_Index);//擦除程序段相应的页
/*编程*/
for(i=0;i<=0x100;i++){
addr=FLASH_APP_ADDR+STM_SECTOR_SIZE*Data_Index+i*4;
dat=*(vu32*)(USART_RX_BUF+i*4);
FLASH_ProgramWord(addr,dat);
flash_count+=4;
}
FLASH_Lock();//上锁
// UART_SendStr("IAP Data OK!\r\n");
senddata[1]=Get_CMD;
senddata[2]=Data_Index+1;
senddata[3]=0x75;
UART_SendBytes(senddata,4);
//UART_SendBytes((char*)(FLASH_APP_ADDR+STM_SECTOR_SIZE*Data_Index),1024);/*此段将写入的APP*/
}else{
senddata[1]=Get_CMD;
senddata[2]=Data_Index;
senddata[3]=0x75;
UART_SendBytes(senddata,4);
}
}[/mw_shl_code]
写入程序后过几秒点击IAP软件的帮助可以在下面窗口输出验证结果,这行注释掉时候IAP软件帮助按钮点击会死机
用这种方法已经验证过写入芯片APP FLASH段的数据全部正确,而且bootloader在线仿真方式时直接看flash
上面右边是我写的IAP上位机载入的BIN文件,左边是在线仿真时候直接读芯片flash区域的结果,可以看出两侧数据也是一致的
但是跳转之后APP程序就是不能执行,我真是没招了
|