可持续发展的主动半解决方案
简体中文英语

PAC5532 Flash写入中断

技术问题 > 分类:一般 > PAC5532 Flash写入中断
罗伯特麦金托什 6在几个月前问过

我能够擦除闪存并写入擦除的闪存。 我将这些例程放入RAM中。
我发现,如果我执行此操作并启用了中断,则写入将成功,但PC将指向错误的内存位置。 这似乎是有道理的,因为中断例程不在RAM中,而是在闪存中。 我试图使用__disable_irq()全局禁用中断但这似乎并没有阻止这个问题。 唯一可行的方法是将所有IRQ处理程序和调用例程定位到RAM中。
这是预期的吗? 或者我应该能够使用__disable_irq阻止IRQ处理程序?

2答案
何塞·奎诺内斯 几个月前回答了8

罗伯特,
您应该能够使用__disable_irq()函数禁用所有中断。 这是Cortex Mx架构的标准。 现在,如果我记得,当你在RAM和FLASH中有代码时,你必须小心你如何做到这一点。 问题是,根据编译器设置,您可能正在使用一些不允许使用扩展寻址的调用的指令。 由于RAM和FLASH不在连续的地址空间中,因此从RAM运行时,调用FLASH中存在的函数的代码将无法工作,除非您添加允许这样做的编译器指令。 如果我记得,用于实现此目的的编译器指令将是“-mlong-calls”。 你在用它吗? 请注意,这会将代码执行时间添加到几乎所有函数调用中,因为现在它们都是长时间调用的。 您可以尝试的另一个选项是转到PAC52xx.h文件和我们定义PAC5XXX_RAMFUNC的位置,将属性从.data更改为.data.ramfunc。 此方法的唯一问题是,在编译项目时,您将无法看到实际的代码大小。 出于某种原因,GCC错误地计算了不同的尺寸。 顺便说一句,所有这些仅适用于GCC,如果您的IDE是IAR,Keil或非基于GCC的IDE,则可能没有意义。 希望信息有所帮助!

罗伯特麦金托什 几个月前回答了8

我在这个问题上做了一些工作,发现我真正的问题是在写忙标志变清之后我没有等待10微秒,如用户指南中所述。 因此,这可能更巧合,而不是通过良好的RAM功能组织。 现在我已经禁用了中断,我可以将这些例程保留在flash中,并且只从RAM中运行少量的flash例程。
谢谢