2198370_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2198370_zh-CN

2198370_zh-CN

S32K312:未知信号处理程序将程序控制转到 LPI2C IRQ 处理程序

我正在使用配备 S32K312 MCU 的定制板。我想不断更改引脚配置和时钟配置,以实现省电功能。" 测试时,MCU 会将"卡在高功率状态,导致功耗增加。

当我将 PE-Micro 调试器连接到板并连接到正在运行的目标时,控件总是显示在 " lpi2c_IP_moduleirqHandler " 函数中。调试调用堆栈显示信号处理程序位于 0xffffffe9。


造成这种情况的原因是什么?


#s32k312

Re: S32K312: unknown signal handler taking program control to LPI2C IRQ handler

嗨,@himonkoch、

如果没有 SW + HW 来重新创建,就很难找到问题的根本原因。

无论如何,只有根据版本说明配置编译器选项,恩智浦才能保证RTD的功能。热电阻是在第 2.7.2 节所述的特定设置下开发和测试的,这一点我在之前的答复中已经说过。

如果您选择使用自定义编译器标志或优化级别,则有责任验证驱动程序在这些条件下的功能。

我很高兴新垃圾桶不再有这个问题了。

致以最诚挚的问候,
Julián

Re: S32K312: unknown signal handler taking program control to LPI2C IRQ handler

你好@Julián_AragónM、


我照着做了,现在新的 bin 文件就没有这个问题了。谢谢您的帮助。

但是,我仍然想知道为什么优化首先会导致随机中断触发信号,因为后来我想减小二进制文件的大小。

Re: S32K312: unknown signal handler taking program control to LPI2C IRQ handler

嗨,@himonkoch、

你可以通过右键单击所选项目并转到 " Properties > C/C++ 版本 > 设置 > 标准 S32DS C 编译器 > Optimization " 来更改当前编译配置的优化级别。

Snag_37e90d9.png

请记住,如相应代码包的版本说明中所述,RTD 软件包经过测试和交付的优化级别为-Os:

Snag_387f777.png

致以最诚挚的问候,
Julián

Re: S32K312: unknown signal handler taking program control to LPI2C IRQ handler

你好@Julián_AragónM、

我会研究您发送的文件并尝试。


同时,当尝试在 Debug_FLASH 调试会话中重新创建问题时,这个问题从未出现过,功能的执行也没有中断。到目前为止,推送到 MCU 的固件是使用 Release_Flash 编译配置版本代码后生成的 bin 文件。据我所知,此版本配置包含编译器级别的优化。

为了证实这一理论,我最终使用DEBUG_Flash编译配置再次版本了代码,并将生成的bin文件直接推送到MCU中,等待问题发生,但事实并非如此。


有什么办法可以在 IDE 中更改 Release_Flash 版本的优化设置,以帮助改变结果吗?

Re: S32K312: unknown signal handler taking program control to LPI2C IRQ handler

嗨,@himonkoch、

很可能是的。

Arm 文档显示,0xFFFFFFE9 是指返回线程模式,异常返回使用主 SP 的浮点状态,返回后执行使用主 SP。

Snag_1a5ff30.png

你可以参考以下文档:如何调试 ARM CORTEX M MCU 上的故障异常。您可以尝试通过堆栈回溯来查找故障地址,因为在堆栈回溯中,您还没有从中断中返回,还在处理程序中。

致以最诚挚的问候,
Julián

Re: S32K312: unknown signal handler taking program control to LPI2C IRQ handler

@Julián_AragónM, 感谢您的回复。

是的,该功能是低功耗运行模式的一种实现方式,通过降低 FIRC 的输出频率和禁用 PLL,将时钟频率降至 3MHz。


我尝试了您提到的步骤
1.从低功耗运行模式切换出来时,AIPS_SLOW_CLK 和 LPI2C0_CLK 成功启用

2.IntCtrl_Ip_DisableIrq 和 IntCtrl_Ip_ClearPending 在模式切换前被调用,以禁用和清除与 I2C 相关的中断。

3.我在Lpi2c_Ip 头文件中找不到Lpi2c_Ip_MasterEndTransfer 函数。


卡在上述地址的问题依然存在。


在与我的团队进行内部讨论时,发现在调试一个不同的、不相关的问题时,执行被卡在了固件的同一个地址上。运行中的目标调试配置是否可能显示错误的问题地址?

Re: S32K312: unknown signal handler taking program control to LPI2C IRQ handler

你好@himonkoch

感谢您提供的补充信息。您是否特别使用了选项 E - 低速运行模式(CORE_CLK @ 3 MHz)?

我猜你被卡在Lpi2c_Ip_ModuleIRQHandler处,因为 LPI2C 中断仍处于启用或挂起状态,不过在不共享配置或例程的情况下很难进行测试。

例如,在切换时钟配置、中止或完成任何待处理的传输之前,可以使用 Lpi2c_Ip_MasterEndTransfer()。除此之外,还可以尝试通过 IntCtrl 驱动程序清除和禁用中断:

IntCtrl_Ip_DisableIrq(LPI2C0_Master_Slave_IRQn);
IntCtrl_Ip_ClearPending(LPI2C0_Master_Slave_IRQn) ;

最后,从 VLSR 返回时,请确保 AIPS_SLOW_CLK 和 LPI2C0_CLK 均已启用。

致以最诚挚的问候,
Julián

Re: S32K312: unknown signal handler taking program control to LPI2C IRQ handler

@Julián_AragónM

这个功能没有利用微控制器的待机电源模式,而是我通过禁用某些时钟、降低整体时钟速度和禁用某些引脚输出来降低功耗。

这需要使用不同的时钟和引脚功能组,我在它们之间切换,以获得所需的输出。

此外,在过渡之前,我还调用了Lpi2c_Ip_MasterDeinit()函数来禁用任何 i2c 参与。

Re: S32K312: unknown signal handler taking program control to LPI2C IRQ handler

嗨,@himonkoch、

" 我想持续更改引脚配置和时钟配置以实现省电功能, 请说明您使用的是什么例程和配置。"?

您会反复待机和醒来吗?您参考过 S32K3 的低功耗示例吗? S32K3 电源管理单元 AN 和演示——恩智浦社区 & [RTD400 & 500 MCAL & IP] S32K3 电源管理单元 AN 和演示 ——恩智浦社区。

另外,在进入待机状态之前,您是否对 I2C 实例进行了去初始化?

Lpi2c_Ip_MasterDeinit(instance);

请分享任何相关配置或代码片段。

致以最诚挚的问候,
Julián

Tags (1)
No ratings
Version history
Last update:
‎11-20-2025 10:18 PM
Updated by: