[STM32F0] STM32F0系列IAP(版主看看)

[复制链接]
 楼主| putron09 发表于 2014-11-28 16:55 | 显示全部楼层 |阅读模式
大家应该都用过F1系列的IAP吧
在APP里面定义void NVIC_Configuration(void){        
#ifdef  VECT_TAB_RAM  
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);   
  //NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);
#endif  
}
就可以跳转到指定位置执行APP程序了
现在这个F0的库找遍了,都不知道哪里可以设置这个中断向量,怎么做IAP呢


做过的大侠说说
神的礼物 发表于 2014-11-28 17:58 | 显示全部楼层
给你个官方例程 stm32f0_programming_usart.zip (1.58 MB, 下载次数: 435)

mmuuss586 发表于 2014-11-28 20:20 | 显示全部楼层

工具楼上意见参考例程试下;
 楼主| putron09 发表于 2014-12-1 10:28 | 显示全部楼层
谢谢楼上的,我的意思不是不会写IAP这部分代码,写完这个烧录到芯片里,那么接下来就得下APP部分,首先你得设置MDK里面中断向量,并且APP代码里面也得设置跟MDK一样的偏移量类似这个NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);   但是在库里面找不到这个,这个是之前STM32F1系列的。
神的礼物 发表于 2014-12-2 17:28 | 显示全部楼层
本帖最后由 神的礼物 于 2014-12-2 17:29 编辑
putron09 发表于 2014-12-1 10:28
谢谢楼上的,我的意思不是不会写IAP这部分代码,写完这个烧录到芯片里,那么接下来就得下APP部分,首先你得 ...

F0没有NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);例程中Project\STM32F0xx_IAP/binary_template/src里面的mian文件有样例代码
 楼主| putron09 发表于 2014-12-4 15:24 | 显示全部楼层
谢谢楼上的,很好啊,用串口升级的话,IAP代码6K就可了,#define APPLICATION_ADDRESS     (uint32_t)0x08001800
gao2006good 发表于 2014-12-4 19:35 | 显示全部楼层
同问,楼主找到了怎么设置NVIC的方法了没有
yyxlmq1314 发表于 2014-12-5 21:53 | 显示全部楼层

同问,楼主找到了怎么设置NVIC的方法了没有
 楼主| putron09 发表于 2014-12-8 09:29 | 显示全部楼层
/* 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


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);

这样就行了
yyxlmq1314 发表于 2014-12-8 22:54 | 显示全部楼层
putron09 发表于 2014-12-8 09:29
/* Private typedef -----------------------------------------------------------*/
/* Private define - ...

楼主,我想问一下,我也是按这个来配置,但是跳转的时候出现一个问,就是stack pointer for stack 'CSTACK' (currently 0xE8080000) is outside the stack range (0x20000638 to 0x20000E38) 我想问一下,读出来的二进制代码是先写高位还是先写低位?例程里面是先写低位的
767618800 发表于 2015-3-18 10:57 | 显示全部楼层
putron09  你的代码编译不通过,
wenlong0601 发表于 2015-7-15 14:39 | 显示全部楼层
putron09 发表于 2014-12-8 09:29
/* Private typedef -----------------------------------------------------------*/
/* Private define - ...

这个貌似也是不行啊。
无帝老三 发表于 2015-11-7 09:29 | 显示全部楼层
IRAM1 修改下  start: 0x200000C0
Ω囿圉Ω 发表于 2016-3-29 10:26 | 显示全部楼层
无帝老三 发表于 2015-11-7 09:29
IRAM1 修改下  start: 0x200000C0

搞定。就是IRAM1 start的问题。

修改成 start:0x200000C0

就好了。
xmshao 发表于 2016-3-29 11:49 | 显示全部楼层

F0没有像F1/F2/F4的内核 一样中断矢量表位置可以灵活配置,M0内核的中断矢量表位置固定在00处。所以IAP时F0芯片跟其它有差异。

因为 uint32_t VectorTable[48];   占用了RAM 4*48 byte ,即 0xC0 字节。
尚磊12323 发表于 2016-12-13 19:35 | 显示全部楼层
请问VectorTable[48]; 的大小为什么是48
一般首席 发表于 2017-1-3 14:54 | 显示全部楼层
有用  15楼
chengbq 发表于 2017-1-13 09:02 | 显示全部楼层
xmshao 发表于 2016-3-29 11:49
F0没有像F1/F2/F4的内核 一样中断矢量表位置可以灵活配置,M0内核的中断矢量表位置固定在00处。所以IAP时F ...

中断向量表固定在0x2000000开始的48*4字节,那么用户RAM(IRAM)从0xc开始。
但在iap或没有bootloader功能的单片机程序中,按道理开始的RAM48*4字节被向量表占用,IRAM也要设成从0xc开始。但实际不需要,为什么呢?
谢谢
xmshao 发表于 2017-1-13 16:27 | 显示全部楼层
chengbq 发表于 2017-1-13 09:02
中断向量表固定在0x2000000开始的48*4字节,那么用户RAM(IRAM)从0xc开始。
但在iap或没有bootloader功能 ...

你APP里有开启中断吗?
chengbq 发表于 2017-1-14 09:42 | 显示全部楼层
xmshao 发表于 2017-1-13 16:27
你APP里有开启中断吗?

有开中断
我的项目:可以在app里跳回iap。
每次单片机正常启动,会跳到app运行,在app里识别到长按键,在flash做标记,然后跳到iap
iap程序会读出flash的标记,以判断运行iap代码还是app代码。。。目前运行良好

只是单片机运行的绝对起始地址和中断向量表重映射在SRAM地址中有些不明白
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

172

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部