我现在正在开发一款stm32l152。
我的启动向量表位于闪存0x0800 0000上,其中有一个有效的复位处理程序向量和堆栈指针。其余的异常/中断向量就是无限循环。然后,我在ram中设置了另一个向量表,从0x2000 0000开始。这个向量表将包含所有必要的向量。
我的问题是,在执行内存重新映射以将0x0000 0000映射到0x2000 0000之后,当我的中断触发时,单片机似乎仍然在0x0800 0000中查找向量。我已经通过将flash表中的相关向量更改为ram表中的相关向量来确认这一点。如果flash表的相关向量指向一个无限循环,我的程序就会无休止地循环。此外,通过跨0x0000 0000、0x0800 0000、0x2000 0000写/读一些内存位置,我确认了我的内存重新映射是正确的。
接下来,我使用另一种方法来改变单片机中的电压寄存器,将向量表偏移0x2000 0000。现在,它工作了,mcu将在ram中找到向量。请注意,在此方法中,我没有进行上述任何内存重新映射。
我的问题是:我可以使用内存重新映射来重新定位我的向量表(不改变VTOR)吗?
内存重新映射还有哪些其他用途?
我可以在运行时写入0x0000 0000 (映射到0x0800 0000闪存)并修改闪存吗?
发布于 2020-11-13 04:53:48
你可能在第一次尝试时就做对了。但是,集成开发环境提供的SystemInit()函数会静默地设置VTOR = 0x8000000,因此无论您的内存重新映射设置如何,都会使用闪存开头的表。
https://stackoverflow.com/questions/23788723
复制相似问题