STM32F0 自动升级办法说明

2020-01-01 17:49发布

本帖最后由 陈正杰 于 2016-7-31 16:11 编辑

对于远程升级,我们实际是对单片机需要内部的flash数据进行修改。只要这个单片机可以被自身进行修改,就意味着我们可以使用boot的方式来实现对应用程序本身的升级操作。
这一次我们主要来讲解一个boot的程序架构。
Boot需要有3个部分来构成。第一个是程序的跳转。即在单片机初始化完成后,需要将PC的指针跳转到应用程序的指定位置。如果没有boot我们实际是从默认的位置开始,对于F0而言是从0x0800000位置处开始。
在做跳转的时候想,我们需要做一下校验确认该地方是否已经写入了实际的应用程序。
实际的源码如下:

void  emGoApp(void)
{
    /* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
    if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
    {
      /* Jump to user application */
      JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
      Jump_To_Application = (pFunction) JumpAddress;
      
      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
      
      /* Jump to application */
      Jump_To_Application();
    }
}

上面的if语句就是用于判断在应用地址处是否已经写入了一个正常的应用程序。如果有着进行跳转否则就不跳转。
第二个部分就是通过通信协议从第三方那里获得本设备需要运行的应用程序。并存储在指定的位置或者直接烧录到进去。
这一步的操作会伴随2个事件的发生,一个是拆除单片机本身所含有的数据,另一个是将新的应用程序写入到单片机中。对于F0而言,其擦除操作时按照块的方式来进行的。每次操作的数量是1K的空间。所以在实际进行写操作的时候,建议是每次都写入1k的数据量,以保证自己写入的效率。
实际操作源码如下:

//本函数用于实现将按照块的方式来移动内部存储的数据
void   imDateMove(u32  dateAdd ,u32 writeAdd)
{
u8  readBuf[FLASH_PAGE_SIZE] ;
STMFLASH_Read(dateAdd , (uint32_t * )readBuf, FLASH_PAGE_SIZE);
iFlashErase(writeAdd);
iFlashWrite(&writeAdd, (uint32_t *)readBuf, FLASH_PAGE_SIZE);
}
具体的操作流程是先读取指定位置的应用代码并存储到临时变量中。然后把需要写入的程序地址的数据给擦除掉,最后将临时变量存储在flash当中。
完成这些操作即表示boot的功能应用已经完成。
在附件中有一个xx_hb的hex文件,你需要使用STVP的方式导入到STM32F051X8里面,即可进行对本代码的测试。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。