1

我现在正在研究 stm32l152。

我的启动向量表位于 flash 上0x0800 0000,其中有一个有效的复位处理程序向量和堆栈指针。其余的异常/中断向量只是无限循环。然后我在 ram 中设置另一个向量表,从0x2000 0000. 该向量表将包含所有必要的向量。

我的问题是,在进行内存重新映射以映射0x0000 00000x2000 0000之后,当我的中断触发时,似乎 mcu 仍在寻找0x0800 0000. 我已经通过将闪存表中的相关向量更改为 ram 表中的相关向量来确认这一点。如果闪存表相关向量指向无限循环,我的程序将无限循环。另外,我通过写/读回一些内存位置来确认我的内存重映射是正确的0x0000 0000, 0x0800 0000, 0x2000 0000.

接下来,我使用另一种方法更改 mcu 中的 VTOR 以将向量表偏移0x2000 0000. 现在,它可以工作了,MCU 将在 ram 中找到向量。请注意,在此方法中,我没有进行任何上述内存重新映射。

我的问题是:我可以使用内存重映射来重新定位我的向量表(不更改 VTOR)吗?

内存重映射还有哪些其他用途?

我可以在运行时写入0x0000 0000(映射到0x0800 0000闪存)和修改闪存吗?

4

1 回答 1

0

您可能在第一次尝试时就做对了。但是,IDE 提供的 SystemInit() 函数会静默设置 VTOR = 0x8000000,因此无论您的内存重映射设置如何,都会使用闪存开头的表。

于 2020-11-12T20:53:48.297 回答