CN / EN
CN / EN

提问

设计支持

您的项目私密技术问题如需获得一对一支持,请点击下方联系我们。

关于MSIO域GPIO MUX为功能口,deinit反初始化后没有恢复默认GPIO功能的案例及解决方案分享 GR5525

Ping

汇顶员工
2023-12-18 15:05

1. 问题现象:

近期某GR5525项目反馈,把MSIO0/MSIO1初始化为UART0的TX/RX,使用完后反初始化UART0恢复MSIO0/MSIO1默认GPIO口功能,重新把GPIO10/GPIO11初始化为UART0的TX/RX,验证UART0的RX通讯数据异常。

2. 原因分析

MSIO域GPIO deinit的时候,没有把MUX功能恢复为默认的IO功能导致,即调用ll_msio_set_pin_mux函数配置为IO功能时,只会配置MSIO_MCU_OVR寄存器,不会配置MSIO_A_PAD_MUX寄存器,导致UART信号同时MUX到2个IO上。

3. 解决方案:

在直接或间接调用hal_msio_deinit\hal_aon_gpio_deinit后,额外调用如下的set_pin_mux_patch函数,不同IC型号实现方式如下:

(1) GR5515x(SDK版本 ≤ V2.0.1)

__STATIC_INLINE void ll_msio_set_pin_mux_patch(uint32_t pin, uint32_t mux)
{
    uint32_t pos = POSITION_VAL(pin) << 2;
    GLOBAL_EXCEPTION_DISABLE();
    MODIFY_REG(MCU_SUB->MSIO_PAD_MUX_CTL, 0xF << pos, mux << pos);
    if(LL_MSIO_MUX_7 == mux)
    {
        CLEAR_BITS(AON->MSIO_PAD_CFG_1, pin << AON_MSIO_PAD_CFG_1_MCU_OVR_Pos);
    }
    else
    {
        SET_BITS(AON->MSIO_PAD_CFG_1, pin << AON_MSIO_PAD_CFG_1_MCU_OVR_Pos);
    }
    GLOBAL_EXCEPTION_ENABLE();
}

__STATIC_INLINE void ll_aon_gpio_set_mux_pin_0_7_patch(uint32_t pin, uint32_t mux)
{
    uint32_t pos = POSITION_VAL(pin) << 2;
    MODIFY_REG(MCU_SUB->AON_PAD_MUX_CTL, 0xF << pos, mux << pos);
    if(LL_AON_GPIO_MUX_7 == mux)
    {
        CLEAR_BITS(AON->AON_PAD_CTL0, pin << AON_PAD_CTL0_MCU_OVR_Pos);
    }
    else
    {
        SET_BITS(AON->AON_PAD_CTL0, pin << AON_PAD_CTL0_MCU_OVR_Pos);
    }
}

(2) GR5525x(SDK版本 ≤ V1.0.0)

__STATIC_INLINE void ll_msio_set_pin_mux_patch(msio_pad_t MSIOx, uint32_t pin, uint32_t mux)
{
    uint32_t pos = POSITION_VAL(pin) << 2;
    MODIFY_REG(MCU_RET->MSIO_A_PAD_MUX_CTL, 0xF << pos, mux << pos);
    if (LL_MSIO_MUX_7 == mux)
    {
        CLEAR_BITS(AON_MSIO->MSIO_MCU_OVR, pin << AON_MSIO_MSIO_MCU_OVR_MSIO_OVR_POS);
    }
    else
    {
        SET_BITS(AON_MSIO->MSIO_MCU_OVR, pin << AON_MSIO_MSIO_MCU_OVR_MSIO_OVR_POS);
    }
}

__STATIC_INLINE void ll_aon_gpio_set_pin_mux_patch(uint32_t pin, uint32_t mux)
{
    uint32_t pos = POSITION_VAL(pin) << 2;
    SET_BITS(AON_IO->AON_MCU_OVR, pin << AON_IO_AON_MCU_OVR_OVR_POS);
    if(LL_AON_GPIO_MUX_7 == mux)
    {
        CLEAR_BITS(AON_IO->AON_MCU_OVR, pin << AON_IO_AON_MCU_OVR_OVR_POS);
    }
    else
    {
        MODIFY_REG(MCU_RET->AON_PAD_MUX_CTL, 0xF << pos, mux << pos);
    }
}

(3) GR5526x(SDK版本 ≤ V1.0.2)

__STATIC_INLINE void ll_msio_set_pin_mux_patch(msio_pad_t MSIOx, uint32_t pin, uint32_t mux)
{
    uint32_t pos = POSITION_VAL(pin) << 2;
    MODIFY_REG(MCU_RET->MSIO_A_PAD_MUX_CTL, 0xF << pos, mux << pos);
    if (LL_MSIO_MUX_8 == mux)
    {
        CLEAR_BITS(AON_MSIO->MSIO_MCU_OVR, pin << AON_MSIO_MCU_OVR_MSIO_OVR_POS);
    }
    else
    {
        SET_BITS(AON_MSIO->MSIO_MCU_OVR, pin << AON_MSIO_MCU_OVR_MSIO_OVR_POS);
    }
}

__STATIC_INLINE void ll_aon_gpio_set_pin_mux_patch(uint32_t pin, uint32_t mux)
{
    uint32_t pos = POSITION_VAL(pin) << 2;
    MODIFY_REG(MCU_RET->AON_PAD_MUX_CTL, 0xF << pos, mux << pos);
    if(LL_AON_GPIO_MUX_8 == mux)
    {
        CLEAR_BITS(AON_IO->AON_MCU_OVR, pin << AON_IO_AON_MCU_OVR_OVR_POS);
    }
    else
    {
        SET_BITS(AON_IO->AON_MCU_OVR, pin << AON_IO_AON_MCU_OVR_OVR_POS);
    }
}


0收藏

1赞成

Ping

汇顶员工
2023-12-18 15:08

有任何问题可再本帖下直接回复~

0条评论

0赞成

0收藏

您的评论

登录后可回答问题,请 注册

我们时刻倾听您的声音
联系销售

扫描关注公众号

打开微信,使用“扫一扫”即可关注