打印
[STM32F0]

STM32F0系列IAP(版主看看)

[复制链接]
7633|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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)

使用特权

评论回复
板凳
mmuuss586| | 2014-11-28 20:20 | 只看该作者

工具楼上意见参考例程试下;

使用特权

评论回复
地板
putron09|  楼主 | 2014-12-1 10:28 | 只看该作者
谢谢楼上的,我的意思不是不会写IAP这部分代码,写完这个烧录到芯片里,那么接下来就得下APP部分,首先你得设置MDK里面中断向量,并且APP代码里面也得设置跟MDK一样的偏移量类似这个NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);   但是在库里面找不到这个,这个是之前STM32F1系列的。

使用特权

评论回复
5
神的礼物| | 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文件有样例代码

使用特权

评论回复
6
putron09|  楼主 | 2014-12-4 15:24 | 只看该作者
谢谢楼上的,很好啊,用串口升级的话,IAP代码6K就可了,#define APPLICATION_ADDRESS     (uint32_t)0x08001800

使用特权

评论回复
7
gao2006good| | 2014-12-4 19:35 | 只看该作者
同问,楼主找到了怎么设置NVIC的方法了没有

使用特权

评论回复
8
yyxlmq1314| | 2014-12-5 21:53 | 只看该作者

同问,楼主找到了怎么设置NVIC的方法了没有

使用特权

评论回复
9
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);

这样就行了

使用特权

评论回复
10
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) 我想问一下,读出来的二进制代码是先写高位还是先写低位?例程里面是先写低位的

使用特权

评论回复
11
767618800| | 2015-3-18 10:57 | 只看该作者
putron09  你的代码编译不通过,

使用特权

评论回复
12
wenlong0601| | 2015-7-15 14:39 | 只看该作者
putron09 发表于 2014-12-8 09:29
/* Private typedef -----------------------------------------------------------*/
/* Private define - ...

这个貌似也是不行啊。

使用特权

评论回复
13
无帝老三| | 2015-11-7 09:29 | 只看该作者
IRAM1 修改下  start: 0x200000C0

使用特权

评论回复
14
Ω囿圉Ω| | 2016-3-29 10:26 | 只看该作者
无帝老三 发表于 2015-11-7 09:29
IRAM1 修改下  start: 0x200000C0

搞定。就是IRAM1 start的问题。

修改成 start:0x200000C0

就好了。

使用特权

评论回复
15
xmshao| | 2016-3-29 11:49 | 只看该作者

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

因为 uint32_t VectorTable[48];   占用了RAM 4*48 byte ,即 0xC0 字节。

使用特权

评论回复
16
尚磊12323| | 2016-12-13 19:35 | 只看该作者
请问VectorTable[48]; 的大小为什么是48

使用特权

评论回复
17
一般首席| | 2017-1-3 14:54 | 只看该作者
有用  15楼

使用特权

评论回复
18
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开始。但实际不需要,为什么呢?
谢谢

使用特权

评论回复
19
xmshao| | 2017-1-13 16:27 | 只看该作者
chengbq 发表于 2017-1-13 09:02
中断向量表固定在0x2000000开始的48*4字节,那么用户RAM(IRAM)从0xc开始。
但在iap或没有bootloader功能 ...

你APP里有开启中断吗?

使用特权

评论回复
20
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

粉丝