STM32
直播中

王丽

7年用户 1302经验值
私信 关注
[问答]

浅析STM32F030的IAP方法

为什么要在APP程序的开头添加代码呢?

IAP如何接收串口的数据呢?

回帖(1)

孙秀英

2021-10-26 09:28:52
  程序收尾总想着以后更新的方便性,采用在应用编程(In Application Programming),通过Bootload引导单片机自己往程序存储器里写数据或修改程序。下面简介STM32F030的IAP方法。不同于STM32F1系列,F0没有中断向量偏移寄存器。所以在APP程序的开头要添加以下代码。为什么这样做??
  可以看到函数用了for循环将矢量表拷贝到0 x20000000 SRAM的基地址,即将矢量表由Flash映射到了SRAM。所以在MDK里面设置Flash偏移地址的时候,同时要设置SRAM偏移地址。如下截图
  //APP程序开头加入IAP_Set(void)函数
  //Falsh address
  #define APPLICATION_ADDRESS ((uint32_t)0x08001400)
  //SRAM Address 0x020000C0
  void IAP_Set(void)
  {
  uint32_t i = 0;
  /* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/
  /* Copy the vector table from the Flash (mapped at the base of the application
  load address 0x08003000) to the base address of the SRAM at 0x20000000. */
  for(i = 0; i 《 48; i++)
  {
  *((uint32_t*)(0x20000000 + (i 《《 2)))=*(__IO uint32_t*)(APPLICATION_ADDRESS + (i《《2));
  }
  /* Enable the SYSCFG peripheral clock*/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  /* Remap SRAM at 0x00000000 */
  SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
  }
  有Target对话框可以看出APP程序有Flash地址0x8001400开始执行。Sram数据则有0x20000c0出开始存储。
  说完APP代码要处理事项,下面说一下IAP代码编写
  /* Keep the user application running */
  /* Test if user code is programmed starting from address “APPLICATION_ADDRESS” */
  if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000) == 0x20000000)
  {
  《span style=“white-space:pre”》 《/span》/* Jump to user application */
  《span style=“white-space:pre”》 《/span》JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
  《span style=“white-space:pre”》 《/span》Jump_To_Application = (pFunction)JumpAddress;
  《span style=“white-space:pre”》 《/span》/* Initialize user application‘s Stack Pointer */
  《span style=“white-space:pre”》 《/span》__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
  《span style=“white-space:pre”》 《/span》/* Jump to application */
  《span style=“white-space:pre”》 《/span》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)
  goto loop1;
  }
  //地址增加
  g_nFlashAddr += FLASH_PAGE_SIZE;
  #endif
  //清除g_nFlashDataLen计数
  g_nFlashDataLen = 0;
  }
  关于IAP如何接收串口的数据,我用的是正点原子的XCOM V2.0串口调试助手通过协议传输每次传输128字节数据,执行的IAP串口数据接收。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分