打印

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

[复制链接]
13991|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yxx284|  楼主 | 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的文件。读取和写入的过程正常。

沙发
airwill| | 2013-6-21 06:59 | 只看该作者
会不会 IAP 更改了 IO 的设置, 转 APP 没有清理?

使用特权

评论回复
板凳
yxx284|  楼主 | 2013-6-21 08:44 | 只看该作者
谢谢斑竹。 转APP的时候,我把需要初始化的GPIO,在使用之前都重新初始化了一遍,跟IAP的GPIO配置会有关系吗。不知道有没有人成功使用过M0 IAP的经验

使用特权

评论回复
地板
s99060| | 2013-6-21 13:08 | 只看该作者
向量表不对吧,m0没有向量表偏移寄存器

使用特权

评论回复
5
yxx284|  楼主 | 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的。

使用特权

评论回复
6
jackcheng1985| | 2013-8-30 20:37 | 只看该作者
楼主有进展没?我的boot单独可以运行,应用程序也单独可以,就是boot跳转到应用程序,应用程序一运行就复位

使用特权

评论回复
7
acgean| | 2013-8-31 10:08 | 只看该作者
5 楼的这段代码非常正确.
将中断向量表放到 RAM 中, 并将 SRAM 映射到 0 地址.
另外, 在芯片的存储空间设置上, 也将 SRAM 开始的 48字去掉, 内存起始地址改为 0x200000C0.
以免编译器使用这块内存.

使用特权

评论回复
8
chenyu988| | 2013-10-23 10:51 | 只看该作者
yxx284 发表于 2013-6-21 15:46
M0没有向量表偏移寄存器,在APP的开头main()里面加了一段代码,把中断向量表复制到SRAM的起始地址0x20000 ...

我用了官方的IAP,EXIT正常进入,没有问题额。
F0的NVIC与F1的还是有点区别的。

使用特权

评论回复
9
buxinshan| | 2015-7-26 17:31 | 只看该作者
acgean 发表于 2013-8-31 10:08
5 楼的这段代码非常正确.
将中断向量表放到 RAM 中, 并将 SRAM 映射到 0 地址.
另外, 在芯片的存储空间设置 ...

确实没错,在5楼的基础上需要修改SRAM的起始地址,不修改会报错。

使用特权

评论回复
10
lost27| | 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个地址去掉
楼主无外部中断问题即可解决

使用特权

评论回复
11
deyauo| | 2015-10-24 16:13 | 只看该作者
学习了,按照各位楼主的提示,已成功调试。
int main(void)
{

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

  /* MCU Configuration----------------------------------------------------------*/

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

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();

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

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

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

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}
……
static void IAP_Set(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++)
  {
    *((uint32_t*)(0x20000000 + (i << 2)))=*(__IO uint32_t*)(0x08003000 + (i<<2));
        }
  /* Enable the SYSCFG peripheral clock*/
  __HAL_RCC_SYSCFG_CLK_ENABLE();
       
        /* Remap SRAM at 0x00000000 */
        __HAL_SYSCFG_REMAPMEMORY_SRAM();
}

附图是地址偏移设置。

STM32 IAP APP设置 成功运行.png (50.47 KB )

STM32 IAP APP设置 成功运行.png

使用特权

评论回复
12
gejigeji521| | 2015-10-25 15:43 | 只看该作者
5 楼的这段代码非常正确,11楼,楼主已经轻松搞定。

使用特权

评论回复
13
zhouzhaozhen| | 2015-12-24 20:35 | 只看该作者
gejigeji521 发表于 2015-10-25 15:43
5 楼的这段代码非常正确,11楼,楼主已经轻松搞定。

为什么跳转后还不能中断?

使用特权

评论回复
14
年年有恩| | 2016-1-4 15:54 | 只看该作者
正在研究,希望能尽快移植成功

使用特权

评论回复
15
huangqi412| | 2016-1-4 16:29 | 只看该作者
M0没有向量表偏移。。。  

使用特权

评论回复
16
stjohn1650| | 2017-1-12 16:19 | 只看该作者
jackcheng1985 发表于 2013-8-30 20:37
楼主有进展没?我的boot单独可以运行,应用程序也单独可以,就是boot跳转到应用程序,应用程序一运行就复位 ...

我的也一直复位,唉,麻烦

使用特权

评论回复
17
mesutozil| | 2017-9-15 11:32 | 只看该作者
我的APP再次跳转IAP后没有中断产生了,但是通过NVIC_SystemReset();方式跳转IAP可以正常运行。 不知道是不是外设中断还是没有清理干净。

使用特权

评论回复
18
932401514| | 2020-9-22 17:50 | 只看该作者
楼主您好,我现在也在弄F030的IAP,碰上了一些麻烦,能不能把你的工程发给我参考一下,万分感谢!932401514@qq.com

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝