STM32
直播中

笔画张

12年用户 913经验值
私信 关注
[问答]

STM32F103CB将中断向量表放到RAM后就不正常了,为什么?

我单独建一个   Funtion_InRAM.c   把USART2_IRQHandler()放到这个文件里。
通过修改.sct文件,把中断函数放到RAM里
sct文件:
LR_IROM1 0x08000000 0x00020000
{ ; load region size_region
  ER_IROM1 0x08000000 0x00020000
  { ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   }
  RW_IRAM1 0x20000000 0x00005000
  { ; RW data
        Funtion_InRAM.o(+RO +RW)
        .ANY (+RW +ZI)
   }
}
在MAP文件里可以看到:
    USART2_IRQHandler                        0x2000002d   Thumb Code   284  funtion_inram.o(i.USART2_IRQHandler)


然后在main()的开始中设置中断向量表到RAM中:
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x00);
但是程序没跑起来,改成 NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x00);  才可以。

谁知道把中断向量表放到RAM中,还需要什么步骤才能正常运行?
芯片是:STM32F103CB

回帖(1)

杨勇

2024-4-25 17:29:10
STM32F103CB将中断向量表放到RAM后不正常的原因可能有以下几点:

1. 中断向量表地址未正确设置:将中断向量表放到RAM后,需要确保在启动代码中正确设置中断向量表的基地址。这通常涉及到修改SCB->VTOR寄存器的值。如果未正确设置,处理器可能无法找到中断处理函数,导致异常。

2. 中断向量表未正确初始化:将中断向量表放到RAM后,需要确保在启动代码中正确初始化中断向量表。这包括将每个中断处理函数的地址设置为相应的函数。如果中断向量表未正确初始化,处理器可能调用错误的中断处理函数,导致异常。

3. 中断优先级问题:在STM32中,中断优先级是通过NVIC(嵌套向量中断控制器)管理的。如果将中断向量表放到RAM后,中断优先级设置不当,可能导致某些中断被错误地优先处理,从而影响系统的正常运行。

4. 内存分配问题:将中断向量表放到RAM后,需要确保RAM中有足够的空间来存储中断向量表。如果RAM空间不足,可能导致内存溢出,从而影响系统的正常运行。

5. 编译器/链接器设置问题:在修改.sct文件后,需要确保编译器和链接器的设置正确。这包括确保中断函数被正确地放置在RAM中,以及确保其他相关代码和数据也被正确地放置。

为了解决这个问题,你可以尝试以下步骤:

1. 确保在启动代码中正确设置SCB->VTOR寄存器的值,以指向新的中断向量表地址。

2. 确保在启动代码中正确初始化中断向量表,将每个中断处理函数的地址设置为相应的函数。

3. 检查中断优先级设置,确保它们正确地管理中断处理。

4. 确保RAM中有足够的空间来存储中断向量表,并检查内存分配是否正确。

5. 检查编译器和链接器的设置,确保中断函数被正确地放置在RAM中,以及其他相关代码和数据也被正确地放置。

6. 如果问题仍然存在,尝试将中断向量表放回Flash,以确定问题是否与将中断向量表放在RAM中有关。

通过以上步骤,你应该能够找到并解决将中断向量表放到RAM后导致的问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分