Ping

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);
}
}
Ping

有任何问题可再本帖下直接回复~
打开微信,使用“扫一扫”即可关注