MSP430 随机复位 'Security Violation (BOR)'
MSP430 Random Resets with 'Security Violation (BOR)'
我面临随机控制器重置,'SYSRSTIV'寄存器给出值'0x0A',这意味着'安全违规(BOR) ' 根据用户指南。我搜索了很多论坛,发现与该问题相关的主题很少,但这没有帮助。
详情:
使用的控制器: MSP430F6634
问题: 随机重启
假设
> 嵌套 ISR:但情况并非如此,因为 MSP430 在 ISR 中默认禁用全局中断,我确保我没有启用
> WatchDog Timer (WDT) :这里不是这种情况,因为 WDT 导致 'SYSRSTIV' 寄存器读取值 0x18
> Stack Overflow :这是我的最终假设,但情况似乎并非如此,因为我不断打印 Stack Pointer 以检查它是否超出了限制,而这并没有发生。
> DMA Register : 在 TI 论坛中发现了类似的问题,建议处理 DMA 寄存器,DMA 仅在我们的项目中用于 USB 并且 Disabling USB 也完全没有帮助
数据表和用户手册中的记录很少,TI 客户支持到目前为止也没有帮助。我在 3 周内一直在努力解决这个问题,但我无法解决。
请帮帮我。
提前致谢。
"Security violation" 表示您的代码试图访问 BSL 的受保护内存区域。
错误的 DMA 编程可能会发生这种情况,但在您的情况下,更有可能是您使用了错误的指针。
(这可能是其他错误指针导致内存损坏的结果。)
@CL。 谢谢的指导,真的很有收获。
我使用了 __no_init 并记录了它在重置之前的最后一个函数,但是我无法得出结论,所以我创建了一个 ARRAY使用 __no_init 并记录最后 200 functions/places 它已经在重置之前,我今天能够查明问题。 (真的等了很久)
原因是:
我正在从数组中读取数据并计算 CRC,由于数据溢出,我得到了错误的长度(负值)并且指针继续读取 ENTIRE RAM、DATA 和 CODE 内存 并最终在 BSL 内存中结束,然后才获得 RESET。
我还有一个疑问是:
1. 如果我只读数据而不是manipulating/overwriting 这些位置的信息,为什么我得到 安全违规 。
2. 为什么我只在读取指针位置 0x1010(BSL 内存)的值时才得到 RESET 而不是在任何其他位置,如 代码内存 等。BSL 内存也从 0x1000 开始,但仅在指针到达 0x1010 后才发生复位 并且没有从 0x1000 重置为 0x100F 。我很好奇。
@CL。再次感谢您:)
我面临随机控制器重置,'SYSRSTIV'寄存器给出值'0x0A',这意味着'安全违规(BOR) ' 根据用户指南。我搜索了很多论坛,发现与该问题相关的主题很少,但这没有帮助。
详情:
使用的控制器: MSP430F6634
问题: 随机重启
假设
> 嵌套 ISR:但情况并非如此,因为 MSP430 在 ISR 中默认禁用全局中断,我确保我没有启用
> WatchDog Timer (WDT) :这里不是这种情况,因为 WDT 导致 'SYSRSTIV' 寄存器读取值 0x18
> Stack Overflow :这是我的最终假设,但情况似乎并非如此,因为我不断打印 Stack Pointer 以检查它是否超出了限制,而这并没有发生。
> DMA Register : 在 TI 论坛中发现了类似的问题,建议处理 DMA 寄存器,DMA 仅在我们的项目中用于 USB 并且 Disabling USB 也完全没有帮助
数据表和用户手册中的记录很少,TI 客户支持到目前为止也没有帮助。我在 3 周内一直在努力解决这个问题,但我无法解决。
请帮帮我。
提前致谢。
"Security violation" 表示您的代码试图访问 BSL 的受保护内存区域。
错误的 DMA 编程可能会发生这种情况,但在您的情况下,更有可能是您使用了错误的指针。 (这可能是其他错误指针导致内存损坏的结果。)
@CL。 谢谢的指导,真的很有收获。
我使用了 __no_init 并记录了它在重置之前的最后一个函数,但是我无法得出结论,所以我创建了一个 ARRAY使用 __no_init 并记录最后 200 functions/places 它已经在重置之前,我今天能够查明问题。 (真的等了很久)
原因是:
我正在从数组中读取数据并计算 CRC,由于数据溢出,我得到了错误的长度(负值)并且指针继续读取 ENTIRE RAM、DATA 和 CODE 内存 并最终在 BSL 内存中结束,然后才获得 RESET。
我还有一个疑问是:
1. 如果我只读数据而不是manipulating/overwriting 这些位置的信息,为什么我得到 安全违规 。
2. 为什么我只在读取指针位置 0x1010(BSL 内存)的值时才得到 RESET 而不是在任何其他位置,如 代码内存 等。BSL 内存也从 0x1000 开始,但仅在指针到达 0x1010 后才发生复位 并且没有从 0x1000 重置为 0x100F 。我很好奇。
@CL。再次感谢您:)