概述

芯片使能(CHIP_EN)是一个复位控制模块,专门用于管理系统级复位逻辑。

CHIP_EN 支持三种复位模式:电平复位、中断复位和脉冲复位。该模块还具备消抖功能,消抖时间的可配置范围为 0μs ~ 16ms,默认为 100μs。

用户可以通过外接按钮或主控装置控制 CHIP_EN 模块的输入信号。

初始上电时序需遵循数据手册 CHIP_EN Reset Sequence 的章节说明。

备注

  • 该模块的计时时钟存在大约 50% 的误差,因此在设置相关时间阈值时,必须将此误差纳入考虑。

  • 下文提到的输入信号时间均指消抖后的时间。

工作模式介绍

CHIP_EN 的三种工作模式分别适用于不同的应用场景:

  • 电平复位模式(默认):用于仅需要实现简单复位功能的场景。

  • 中断复位模式:可用于需要进入低功耗模式并提供唤醒功能的场景。这种模式类似于手机的电源键操作:短按实现屏幕的息屏和亮屏,长按时提醒用户选择是否重启设备。

  • 脉冲复位模式:可用于按键按下需要复位,根据按下时间长短进行不同响应的场景。类似路由器设备恢复出厂设置的应用。

电平复位模式

在该模式下,当 CHIP_EN 模块的输入信号处于低电平时,系统将处于断电状态,并在信号跳变至高电平时重启SoC。

中断复位模式

中断复位模式主要用于省电场景。

该模式支持短按中断、长按中断两种中断事件与复位事件。

短按中断事件

  • 当低电平时间(Tlow)大于用户设定的短按阈值(Tsp)时,可触发该事件。

长按中断事件

  • 当低电平时间(Tlow)大于设定的短按阈值(Tsp)与长按阈值(Tlp)之和时,可触发该事件。

复位事件

  • 在触发长按中断后,如果程序不在 Tack 内清除长按中断状态,会引起复位,如下图中的 Reset 所示。

  • 在信号跳变至高电平时重启SoC。

../../_images/chipen_tsp_tlp_noack_reset.svg

长按中断后无程序应答产生复位

备注

重启后,CHIP_EN 会进入电平复位模式(默认)。如需工作在中断复位模式,需要重新配置工作模式。

脉冲复位模式

在该模式下,当检测到 CHIP_EN 输入信号为低电平信号时,会直接触发复位操作并重启SoC。

重启后,用户可以通过 CHIPEN_IsPress() 持续获得输入信号低电平的时间, 区分短按和长按操作

注意

一旦芯片被配置为脉冲复位模式,软件就无法再更改该模式。只有断电才能使芯片回到电平复位模式。

模式设定示例

脉冲复位模式

/* 设定消抖时间 */
CHIPEN_DebounceSet(debouce_time);

/* 设定脉冲复位工作模式 */
CHIPEN_WorkMode(CHIPEN_PULSE_RESET_MODE);

/* 重启后获取输入信号状态 */
ret = CHIPEN_IsPress();

中断复位模式

/* step1: 设定消抖时间 */
CHIPEN_DebounceSet(debouce_time);

/* step2: 设定中断复位模式 */
CHIPEN_WorkMode(CHIPEN_INT_RESET_MODE);

/* step3: 设定短按阈值,长按阈值 */
CHIPEN_ThresHoldSet(longpress_time, shortpress_time);

/* step4: 设定应答时间 */
CHIPEN_AckTimeSet(ack_time);

/* step5: 注册中断处理函数,使能中断 */
InterruptRegister((IRQ_FUN) chipen_irq_handler, PWR_DOWN_IRQ, (u32)NULL, 3);
InterruptEn(PWR_DOWN_IRQ, 3);

/* step6: 响应中断事件 */
void chipen_irq_handler(void)
{
    /* 获取中断状态 */
    u32 INTrBit = CHIPEN_GetINT();

    /* 短按中断事件 */
    if(INTrBit & AON_BIT_CHIPEN_SP_ISR) {
        /* 清除短按中断状态 */
        CHIPEN_ClearINT(INTrBit);

        /* 根据应用需求处理相关事务 */
        {
           /*
              do something
           */
        }
     }

    /* 长按中断事件 */
    if (INTrBit & AON_BIT_CHIPEN_LP_ISR) {

        /* 根据是否需要复位,处理是否延迟清除长按中断状态 */
        if (/* 需要复位 */) {
           /* 延迟清除中断状态 */
           DelayMs(clear_int_delay);

        } else (/* 不需要复位 */) {
           /* 可立即清除中断状态 */
        }

        /* 清除长按中断状态 */
        CHIPEN_ClearINT(INTrBit);
    }
}