STM32F0 M0的IAP功能,执行APP后中断不正常

[复制链接]
 楼主| 发表于 2013-6-20 20:21 | 显示全部楼层 |阅读模式
请教,我采用的是STM32F051的片子,想加入IAP的功能,但是发现程序可以从IAP跳转到APP,可是跳转之后APP的外部中断无法进入,但是APP的定时器中断是OK的,主函数的运行也是正常的,就是无法响应外部中断。不使用IAP跳转的时候APP是完全OK的。
参考的例程是stm32的串口IAP的例程。
IAP存放在0x8000000的地方;可以在discovery_m0的板子上运行,通过超级终端将BIN数据下载到m0的内部flash里面,也可以从flash里面读取数据出来保存为.bin的文件。读取和写入的过程正常。

发表于 2013-6-21 06:59 | 显示全部楼层
会不会 IAP 更改了 IO 的设置, 转 APP 没有清理?
 楼主| 发表于 2013-6-21 08:44 | 显示全部楼层
谢谢斑竹。 转APP的时候,我把需要初始化的GPIO,在使用之前都重新初始化了一遍,跟IAP的GPIO配置会有关系吗。不知道有没有人成功使用过M0 IAP的经验
发表于 2013-6-21 13:08 | 显示全部楼层
向量表不对吧,m0没有向量表偏移寄存器
 楼主| 发表于 2013-6-21 15:46 | 显示全部楼层
M0没有向量表偏移寄存器,在APP的开头main()里面加了一段代码,把中断向量表复制到SRAM的起始地址0x20000000去了。
#define APPLICATION_ADDRESS     ((uint32_t)0x08003000)
#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

int main(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++)
  {
    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);

…………………………
}

是参考的例程的APP进行修改的,但是APP的定时器中断是OK的,主函数的运行也是正常的,就是无法响应外部中断。不使用IAP跳转的时候APP是完全OK的。
发表于 2013-8-30 20:37 | 显示全部楼层
楼主有进展没?我的boot单独可以运行,应用程序也单独可以,就是boot跳转到应用程序,应用程序一运行就复位
发表于 2013-8-31 10:08 | 显示全部楼层
5 楼的这段代码非常正确.
将中断向量表放到 RAM 中, 并将 SRAM 映射到 0 地址.
另外, 在芯片的存储空间设置上, 也将 SRAM 开始的 48字去掉, 内存起始地址改为 0x200000C0.
以免编译器使用这块内存.
发表于 2013-10-23 10:51 | 显示全部楼层
yxx284 发表于 2013-6-21 15:46
M0没有向量表偏移寄存器,在APP的开头main()里面加了一段代码,把中断向量表复制到SRAM的起始地址0x20000 ...

我用了官方的IAP,EXIT正常进入,没有问题额。
F0的NVIC与F1的还是有点区别的。
发表于 2015-7-26 17:31 | 显示全部楼层
acgean 发表于 2013-8-31 10:08
5 楼的这段代码非常正确.
将中断向量表放到 RAM 中, 并将 SRAM 映射到 0 地址.
另外, 在芯片的存储空间设置 ...

确实没错,在5楼的基础上需要修改SRAM的起始地址,不修改会报错。
发表于 2015-8-21 15:13 | 显示全部楼层
yxx284 发表于 2013-6-21 15:46
M0没有向量表偏移寄存器,在APP的开头main()里面加了一段代码,把中断向量表复制到SRAM的起始地址0x20000 ...


ST提供的STM32F0xx_AN4065_FW_V1.0.0例程,用串口进行IAP升级的。其中有部分代码是错误的。如下 :
  /* Enable the SYSCFG peripheral clock*/
RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE);

应改为:RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
并按照7楼所示将SRAM前48个地址去掉
楼主无外部中断问题即可解决
发表于 2015-10-24 16:13 | 显示全部楼层
学习了,按照各位楼主的提示,已成功调试。
  1. int main(void)
  2. {

  3.   /* USER CODE BEGIN 1 */
  4.   [color=Red]IAP_Set();[/color]
  5.   /* USER CODE END 1 */

  6.   /* MCU Configuration----------------------------------------------------------*/

  7.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  8.   HAL_Init();

  9.   /* Configure the system clock */
  10.   SystemClock_Config();

  11.   /* Initialize all configured peripherals */
  12.   MX_GPIO_Init();

  13.   /* USER CODE BEGIN 2 */
  14.         xTaskCreate( vLEDTask, ( const portCHAR * ) "LED", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+3, NULL );
  15.   /* USER CODE END 2 */

  16.   /* Call init function for freertos objects (in freertos.c) */
  17.   MX_FREERTOS_Init();

  18.   /* Start scheduler */
  19.   osKernelStart();
  20.   
  21.   /* We should never get here as control is now taken by the scheduler */

  22.   /* Infinite loop */
  23.   /* USER CODE BEGIN WHILE */
  24.   while (1)
  25.   {
  26.   /* USER CODE END WHILE */

  27.   /* USER CODE BEGIN 3 */

  28.   }
  29.   /* USER CODE END 3 */

  30. }
  31. ……
  32. static void IAP_Set(void)
  33. {
  34.   uint32_t i = 0;

  35.   /* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/  

  36.   /* Copy the vector table from the Flash (mapped at the base of the application
  37.      load address 0x08003000) to the base address of the SRAM at 0x20000000. */      
  38.   for(i = 0; i < 48; i++)
  39.   {
  40.     *((uint32_t*)(0x20000000 + (i << 2)))=*(__IO uint32_t*)(0x08003000 + (i<<2));
  41.         }
  42.   /* Enable the SYSCFG peripheral clock*/
  43.   __HAL_RCC_SYSCFG_CLK_ENABLE();
  44.        
  45.         /* Remap SRAM at 0x00000000 */
  46.         __HAL_SYSCFG_REMAPMEMORY_SRAM();
  47. }

附图是地址偏移设置。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2015-10-25 15:43 | 显示全部楼层
5 楼的这段代码非常正确,11楼,楼主已经轻松搞定。
发表于 2015-12-24 20:35 | 显示全部楼层
gejigeji521 发表于 2015-10-25 15:43
5 楼的这段代码非常正确,11楼,楼主已经轻松搞定。

为什么跳转后还不能中断?
发表于 2016-1-4 15:54 | 显示全部楼层
正在研究,希望能尽快移植成功
发表于 2016-1-4 16:29 | 显示全部楼层
M0没有向量表偏移。。。  
发表于 2017-1-12 16:19 | 显示全部楼层
jackcheng1985 发表于 2013-8-30 20:37
楼主有进展没?我的boot单独可以运行,应用程序也单独可以,就是boot跳转到应用程序,应用程序一运行就复位 ...

我的也一直复位,唉,麻烦
发表于 2017-9-15 11:32 | 显示全部楼层
我的APP再次跳转IAP后没有中断产生了,但是通过NVIC_SystemReset();方式跳转IAP可以正常运行。 不知道是不是外设中断还是没有清理干净。
发表于 2020-9-22 17:50 | 显示全部楼层
楼主您好,我现在也在弄F030的IAP,碰上了一些麻烦,能不能把你的工程发给我参考一下,万分感谢!932401514@qq.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝
快速回复 返回顶部 返回列表