单片机/MCU论坛
直播中

李桂兰

8年用户 1534经验值
私信 关注
[问答]

CY4147S455将IO口设置成上升沿中断之后,打开看门狗定时唤醒,会自发触发这一中断,为什么?

将IO口设置成上升沿中断之后,打开看门狗定时唤醒,会自发触发这一中断,芯片CY4147S455

回帖(1)

凤求凰

2025-8-13 17:49:09

关于CY4147S455(PSoC 4系列芯片)在将GPIO配置为上升沿中断后,启用看门狗定时器(WDT)唤醒时自发触发该中断的问题,这是一个比较常见的现象,主要由以下几个相互关联的原因造成:




  1. 看门狗唤醒期间的电源/复位毛刺与IO状态不稳定:



    • 当WDT在低功耗模式下(如Sleep, Deep Sleep)唤醒芯片时,它本质上会触发一个复位信号(或类似复位的行为,取决于配置),使内核重新开始执行。

    • 这种唤醒/复位过程会引起芯片内部电源轨的微小扰动或复位线上的毛刺。

    • 关键点: GPIO模块及其相关的输入缓冲器在复位期间或刚退出复位时处于不稳定状态。输入缓冲器的电压可能在其逻辑阈值附近短暂抖动(可能在VILVIH之间快速变化)。

    • 对于配置为上升沿中断的GPIO来说,这种短暂的电压抖动(例如从低到高再到低,或者从不确定状态跳变到高再稳定下来)非常容易被误判为一个有效的上升沿,从而置位中断标志位。




  2. 内部弱上拉/下拉电阻与悬空输入:



    • 如果你的中断GPIO引脚没有外部驱动源(即悬空),或者外部驱动源是高阻抗的(如仅连接了一个按钮但未按下),那么GPIO引脚的状态主要依赖于其配置的内部电阻(上拉、下拉或高阻)。

    • PSoC 4的内部弱上拉电阻(通常几十kΩ)较弱。在WDT唤醒引起的电源扰动期间,这些弱上拉可能无法立即有效地将引脚拉高到稳定的逻辑高电平(VDDIO)。

    • 电源噪声和输入缓冲器的不稳定性更容易影响这种高阻抗或弱驱动的输入引脚,导致其电压在逻辑阈值附近波动,产生虚假边沿。




  3. 中断标志位未在唤醒后及时清除:



    • 即使虚假边沿发生在极短的复位期间,它也可能已经设置(置位)了该GPIO的中断标志位

    • 如果你的唤醒后初始化代码(通常在main()函数开始处或在唤醒特定的处理函数中)没有在重新启用中断之前,先主动清除(读取)该GPIO的中断状态寄存器,那么这个“遗留”的中断标志位会在中断重新启用后立即触发一次中断服务程序(ISR)

    • 这给人的感觉就像是中断被“自发”触发了。




  4. IO配置的初始化时机:



    • 在WDT唤醒复位后,芯片会重新执行初始化代码。如果GPIO中断的配置(开启中断)发生在清除可能存在的旧中断标志位之前,那么任何在复位期间或配置前发生的虚假边沿产生的标志位,都会在中断开启后立即触发ISR。




总结原因链:



WDT唤醒 -> 引发电源/复位扰动 -> 导致配置为上升沿中断的高阻抗/弱驱动GPIO输入状态不稳定(电压在阈值附近抖动)-> 被误检测为有效上升沿 -> 置位中断标志位 -> 唤醒后代码未及时清除该中断标志位 -> 中断重新启用 -> 立即触发ISR -> 观察到“自发”中断。



解决方案:




  1. 确保可靠的GPIO输入状态:



    • 避免悬空引脚: 为配置为中断输入的GPIO引脚提供明确的驱动源。如果外部信号可能断开(如按钮),务必启用内部上拉或下拉电阻(通常选择上拉),为该引脚在空闲时提供一个稳定状态(上拉时为高电平,下拉时为低电平)。这大大减少了电源噪声干扰的敏感性。

    • 考虑更强的外部上拉/下拉: 如果内部电阻不够强健(尤其在噪声较大环境中),可以增加外部上拉/下拉电阻(例如4.7kΩ - 10kΩ)。




  2. 在唤醒后及时清除潜在的中断标志位:



    • 修改唤醒后初始化代码: 在芯片从WDT唤醒后执行的代码中(通常在main()函数开头或CySysPmDeepSleep/CySysPmSleep之后的恢复代码中),在执行任何可能重新开启中断的操作(如CyGlobalIntEnable)或重新配置GPIO中断之前,先读取并清除可能相关的中断状态寄存器。


    • 对于GPIO中断:



      • 读取Pin Interrupt Status Register: 对于PSoC 4,通常通过读取特定引脚的中断状态寄存器 (INTR) 或其屏蔽后的状态寄存器 (INTR_MASKED) 来清除该引脚的中断标志位。具体寄存器名称请查阅CY4147S455的技术参考手册(TRM)的GPIO章节。


      • 代码示例 (概念性):


        // 在唤醒后,重新初始化外设或启用全局中断之前...
        uint32_t dummyRead;

        // 清除你配置为中断的那个GPIO引脚的中断标志位 (例如 P2.3)
        dummyRead = CyPins_ReadPinIntStatus(Pin_MyInterruptPin_NUMBER); // 假设使用Pins组件API
        // 或者直接操作寄存器,例如: (请务必查阅具体器件TRM确认!)
        // dummyRead = GPIO_PRT2_INTR; // 假设引脚在Port 2
        // 或者更精确地清除单个引脚标志位 (方法取决于寄存器设计,可能需要写入清除位)

        // ... 其他初始化代码 ...
        CyGlobalIntEnable(); // 最后再开启全局中断


      • 关键: 确保清除操作发生在重新开启中断之前






  3. 优化IO配置顺序:



    • 确保在初始化流程中,先清除可能存在的旧中断标志位,然后再配置(开启)该引脚的中断功能。




  4. 查阅勘误表:



    • 虽然以上是常见原因,但仍建议查阅CY4147S455的最新勘误表,确认是否有与该特定型号或PSoC 4系列在GPIO中断和低功耗唤醒方面相关的已知硬件问题或注意事项。




实施建议:


优先实施解决方案2(清除中断标志位)解决方案1(启用内部上拉)。这两项通常是解决此类问题的关键且最有效的步骤。检查并优化你的唤醒后初始化代码流程,确保在中断开启前清除了GPIO中断标志位,并为中断输入引脚配置了内部上拉电阻(如果适用)。如果问题在噪声较大的环境中持续存在,再考虑解决方案1中的外部电阻。


通过解决电源扰动引起的输入不稳定性和确保正确清除中断标志位,应该能够有效地消除WDT唤醒导致的虚假上升沿中断触发。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分