华大MCU HC32F005端口GPIO控制失效问题

发布于:2025-02-19 ⋅ 阅读:(19) ⋅ 点赞:(0)

1. 问题来源:RS485通信时,且数据量大、持续运行一段时间后,发现RS485使能引脚没有得到释放,导致总线锁死,无法通信,影响到整个总线的设备。

2. 问题分析:1)经过测试和跟踪,使能脚的释放指令已经执行,但是引脚实际并没有生效。2)网上找到的资料说是端口竞争冒险问题,在发生中断后可能发生无法有效控制的情况,与本次现象很相似。

3. 解决办法:

修改前使用的GPIO控制函数为:

en_result_t Gpio_WriteOutputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin, boolean_t bVal)

修改后使用的GPIO控制函数为:

en_result_t Gpio_ClrIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
    SetBit(((uint32_t)&M0P_GPIO->PABCLR + enPort), enPin, TRUE);

    return Ok;
}
en_result_t Gpio_SetIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
    SetBit(((uint32_t)&M0P_GPIO->PABSET + enPort), enPin, TRUE);

    return Ok;
}

以上适用于HC32F1XX系列,有置位和复位寄存器的MCU,且官方代码提供对应的函数。

但是HC32F005的DLL库里并没有上述的函数,且MCU也没有对应置位、清除寄存器,所以不适用上述的函数。

手动添加函数为:

en_result_t Gpio_SetIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
    SetBit(((uint32_t)&M0P_GPIO->P0OUT + enPort), enPin, TRUE);

    return Ok;
}
en_result_t Gpio_ClrIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
    SetBit(((uint32_t)&M0P_GPIO->P0OUT + enPort), enPin, FALSE);

    retu

4. 总结,对于HC32F003、HC32F005等低端MCU,应避免频繁中断导致参数传递异常,从而解决问题。

5. 实际测试:运行两天后,问题再次复现!!!崩溃!


网站公告

今日签到

点亮在社区的每一天
去签到