单片机
返回首页

STM32F030的IAP应用简介

2017-09-25 来源:eefocus

程序收尾总想着以后更新的方便性,采用在应用编程(In Application Programming),通过Bootload引导单片机自己往程序存储器里写数据或修改程序。下面简介STM32F030的IAP方法。不同于STM32F1系列,F0没有中断向量偏移寄存器。所以在APP程序的开头要添加以下代码。为什么这样做??

可以看到函数用了for循环将矢量表拷贝到0 x20000000 SRAM的基地址,即将矢量表由Flash映射到了SRAM。所以在MDK里面设置Flash偏移地址的时候,同时要设置SRAM偏移地址。如下截图

//APP程序开头加入IAP_Set(void)函数


  1. //Falsh address  

  2. #define  APPLICATION_ADDRESS    ((uint32_t)0x08001400)  

  3. //SRAM Address 0x020000C0  

  4. void IAP_Set(void)  

  5. {  

  6.    uint32_t i = 0;  

  7. /* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/    

  8.   /* Copy the vector table from the Flash (mapped at the base of the application  

  9.      load address 0x08003000) to the base address of the SRAM at 0x20000000. */         

  10.   for(i = 0; i < 48; i++)  

  11.   {  

  12.     *((uint32_t*)(0x20000000 + (i << 2)))=*(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));  

  13. }  

  14.   /* Enable the SYSCFG peripheral clock*/   

  15.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);   

  16.   

  17. /* Remap SRAM at 0x00000000 */  

  18.   SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);  

  19.   

  20. }  




有Target对话框可以看出APP程序有Flash地址0x8001400开始执行。Sram数据则有0x20000c0出开始存储。

说完APP代码要处理事项,下面说一下IAP代码编写


  1. /* Keep the user application running */  

  2. /* Test if user code is programmed starting from address 'APPLICATION_ADDRESS' */  

  3. if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000) == 0x20000000)  

  4. {  

  5.     /* Jump to user application */  

  6.     JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);  

  7.     Jump_To_Application = (pFunction)JumpAddress;  

  8.   

  9.   

  10.     /* Initialize user application's Stack Pointer */  

  11.     __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);  

  12.   

  13.   

  14.     /* Jump to application */  

  15.     Jump_To_Application();  

  16. }  

程序更新完以后执行以上跳转函数即可执行更新的APP代码。关于如何通过IAP将代码将APP代码(bin文件)传到单片机Flash,可以通过串口分包传输。因为F0Flash是1K为一页所以这里我用的是1K缓存,即接收串口1K的数据量就执行一次Flash写操作,传输到最后不满1K,填写0XFF按照1K数据写。写Flash代码如下


  1. //存满1K的数据 写入Flash  

  2. if (g_nFlashDataLen == FLASH_PAGE_SIZE)  

  3. {  

  4. #if (DEBUGIAP ==1)  

  5.       

  6.     USART1_SendBytesProc(g_nFlashBuf,FLASH_PAGE_SIZE);  

  7.     g_nSysCommTimerCtrl=0;  

  8.     while(g_nSysCommTimerCtrl < 200);//5ms         

  9. #else   

  10.     //擦除待写的Flash  

  11.     FLASH_If_Erase(g_nFlashAddr);  

  12. loop1:  

  13.     //写入Flash  

  14.     nFlashData = (u32)g_nFlashBuf;  

  15.     if (FLASH_If_Write(&g_nFlashAddr, (u32*)nFlashData, (u16)g_nFlashDataLen / 4) != 0)  

  16.     {  

  17.         if (nCount++ < 5)  

  18.             goto loop1;  

  19.     }  

  20.     //地址增加  

  21.     g_nFlashAddr += FLASH_PAGE_SIZE;  

  22. #endif  

  23.     //清除g_nFlashDataLen计数  

  24.     g_nFlashDataLen = 0;  

  25.                   

  26. }  

关于IAP如何接收串口的数据,我用的是正点原子的XCOM V2.0串口调试助手通过协议传输每次传输128字节数据,执行的IAP串口数据接收。具体操作可在原子论坛搜索。再此留下参考链接:http://www.openedv.com/thread-40143-1-1.html         http://www.openedv.com/thread-22994-1-1.html


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 光控音效发生器电路

  • 非常简单的150W功放电路图

  • 优化电路板布局的简单方法

  • 如何使用LED驱动器LM3915制作振动计

  • 电谐波图形均衡器示意图

  • 一种构建12V和230V双直流电源的简单方法

    相关电子头条文章