STM32F030的IAP应用简介
扫描二维码
随时随地手机看文章
程序收尾总想着以后更新的方便性,采用在应用编程(In Application Programming),通过Bootload引导单片机自己往程序存储器里写数据或修改程序。下面简介STM32F030的IAP方法。不同于STM32F1系列,F0没有中断向量偏移寄存器。所以在APP程序的开头要添加以下代码。为什么这样做??
可以看到函数用了for循环将矢量表拷贝到0 x20000000 SRAM的基地址,即将矢量表由Flash映射到了SRAM。所以在MDK里面设置Flash偏移地址的时候,同时要设置SRAM偏移地址。如下截图
//APP程序开头加入IAP_Set(void)函数
//Falshaddress
#defineAPPLICATION_ADDRESS((uint32_t)0x08001400)
//SRAMAddress0x020000C0
voidIAP_Set(void)
{
uint32_ti=0;
/*RelocatebysoftwarethevectortabletotheinternalSRAMat0x20000000***/
/*CopythevectortablefromtheFlash(mappedatthebaseoftheapplication
loadaddress0x08003000)tothebaseaddressoftheSRAMat0x20000000.*/
for(i=0;i<48;i++)
{
*((uint32_t*)(0x20000000+(i<<2)))=*(__IOuint32_t*)(APPLICATION_ADDRESS+(i<<2));
}
/*EnabletheSYSCFGperipheralclock*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
/*RemapSRAMat0x00000000*/
SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
}
有Target对话框可以看出APP程序有Flash地址0x8001400开始执行。Sram数据则有0x20000c0出开始存储。
说完APP代码要处理事项,下面说一下IAP代码编写
/*Keeptheuserapplicationrunning*/
/*Testifusercodeisprogrammedstartingfromaddress"APPLICATION_ADDRESS"*/
if(((*(__IOuint32_t*)APPLICATION_ADDRESS)&0x2FFE0000)==0x20000000)
{
/*Jumptouserapplication*/
JumpAddress=*(__IOuint32_t*)(APPLICATION_ADDRESS+4);
Jump_To_Application=(pFunction)JumpAddress;
/*Initializeuserapplication'sStackPointer*/
__set_MSP(*(__IOuint32_t*)APPLICATION_ADDRESS);
/*Jumptoapplication*/
Jump_To_Application();
}
程序更新完以后执行以上跳转函数即可执行更新的APP代码。关于如何通过IAP将代码将APP代码(bin文件)传到单片机Flash,可以通过串口分包传输。因为F0Flash是1K为一页所以这里我用的是1K缓存,即接收串口1K的数据量就执行一次Flash写操作,传输到最后不满1K,填写0XFF按照1K数据写。写Flash代码如下
//存满1K的数据写入Flash
if(g_nFlashDataLen==FLASH_PAGE_SIZE)
{
#if(DEBUGIAP==1)
USART1_SendBytesProc(g_nFlashBuf,FLASH_PAGE_SIZE);
g_nSysCommTimerCtrl=0;
while(g_nSysCommTimerCtrl<200);//5ms
#else
//擦除待写的Flash
FLASH_If_Erase(g_nFlashAddr);
loop1:
//写入Flash
nFlashData=(u32)g_nFlashBuf;
if(FLASH_If_Write(&g_nFlashAddr,(u32*)nFlashData,(u16)g_nFlashDataLen/4)!=0)
{
if(nCount++<5)
gotoloop1;
}
//地址增加
g_nFlashAddr+=FLASH_PAGE_SIZE;
#endif
//清除g_nFlashDataLen计数
g_nFlashDataLen=0;
}
关于IAP如何接收串口的数据,我用的是正点原子的XCOM V2.0串口调试助手通过协议传输每次传输128字节数据,执行的IAP串口数据接收。具体操作可在原子论坛搜索。再此留下参考链接:http://www.openedv.com/thread-40143-1-1.html http://www.openedv.com/thread-22994-1-1.html