STM32F0 IAP编程流程说明

2019-12-12 18:16发布

STM32F0 IAP编程说明

说明:我在选择全部选择,但是图片并没有出现在帖子中,在附件中有说明和测试代码。代码是直接中官网下载来的的,做了一点改动。

一、功能概述:
a)IAP编程是我们在方便后期维护升级而使用的一种手段,在没有IAP的情况下,我们需要使用SWD等编程工具来实现相关的代码编辑,在使用IAP后,我们可以让人带烧写一个IAP自举程序,而不是我们实际的全功能程序。在IC实际贴到PCB后然后使用一个串口工具来实现对单片机的升级操作。

二、具体实现方法说明:
a)在本文件中有两个程序,一个是bootloader ,另一个是APP程序。
i.对于bootload的说明:
1.这个代码是在官网上面直接down下来的,在STM32F051开发板上面跑,但是本人手里没有这个测试版,故对代码进行了一点修改,让其在上电的时候就进入到bootload 程序,在超级终端上面进行相关来实现功能选择。
ii.在把本程序下载到051的硬件板后,正确的链接到串口,要求使用的串口配置如图所示:。
iii.复位单片机后应该出现如下界面:

iv.在超级终端中输入“1”,将看到如下界面:


v.在这种情况下则表示可以进行相关程序下载了。点击传送将出现如下界面:

vi.选择你需要下载bin文件,选择Ymodem协议点击发送,将出现如下界面:


vii.在下载完成后将出现如下界面:
viii.
ix.出现上述界面,只是你的程序已经下载成功,但是还没有跳转到你的应用APP程序,需要将单片机重新启动,并输入3后即可看到你自己的APP程序在运行了。
b)对于App成的修改如下:
i.想尽各种办法出现如下界面:并将蓝 {MOD}区域的数值修改为0x08003000

ii.修改memory的数值如下图所示:

iii.对自己的应用程序添加如下代码:
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define APPLICATION_ADDRESS     (uint32_t)0x08003000

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
static __IO uint32_t TimingDelay;  //这个可以去掉
// 下边的宏编译好像和编译器有关系
#if   (defined ( __CC_ARM ))
  __IO uint32_t VectorTable[48] __attribute__((at(0x20000000)));
#elif (defined (__ICCARM__))
#pragma location = 0x20000000
  __no_init __IO uint32_t VectorTable[48];
#elif defined   (  __GNUC__  )
  __IO uint32_t VectorTable[48] __attribute__((section(".RAMVectorTable")));
#elif defined ( __TASKING__ )
  __IO uint32_t VectorTable[48] __at(0x20000000);
#endif

iv.在单片机初始化函数中加入如下代码: 这个按照英文解释好像是中断向量表的重映射。注意这个一定要初始化在你中断启动之前,否则将出现各种神坑。
  /* 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++)
  {
    VectorTable[i] = *(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));
  }

  /* Enable the SYSCFG peripheral clock*/
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  /* Remap SRAM at 0x00000000 */
  SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
v.
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
yaoyyie2003
1楼-- · 2019-12-12 22:13
支持,可以在STM32F10x系列上用吗?
陈正杰
2楼-- · 2019-12-13 01:49
yaoyyie2003 发表于 2015-2-11 11:09
支持,可以在STM32F10x系列上用吗?

不能用,F0的flash操作方法和F1的好像不一样,你可以在官网上面下一个dome 测试一下
ApexUSB
3楼-- · 2019-12-13 04:10
ST提供的STM32F0xx_AN4065_FW_V1.0.0例程,用串口进行IAP升级的。其中有部分代码是错误的。如下 :
/* 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++)
  {
    VectorTable = *(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));
  }

  /* Enable the SYSCFG peripheral clock*/
RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  /* Remap SRAM at 0x00000000 */
  SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);

应改为:RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
WERWER
4楼-- · 2019-12-13 07:12
 精彩回答 2  元偷偷看……
videofun
5楼-- · 2019-12-13 11:05
不错,好好学习下。。  
TongIC
6楼-- · 2019-12-13 11:54
还要注意在编译器设置中去掉RAM 48个字节!

一周热门 更多>