ch32v003使用openocd开发调试问题

大家好,我的环境是VSCode+PlatformIO+OpenOCD,在搭建ch32v的开发环境,目前能够编译和烧写代码,代码烧录后的运行情况和预期不同,试图进行调试,该过程中出现如下问题:


完成GPIO配置后,main函数里有下述语句:

GPIOD->OUTDR |= GPIO_Pin_3;
GPIOD->OUTDR &= ~GPIO_Pin_3;
GPIOD->OUTDR |= GPIO_Pin_3;
GPIOD->OUTDR &= ~GPIO_Pin_3;
GPIOD->OUTDR |= GPIO_Pin_3;
GPIOD->OUTDR &= ~GPIO_Pin_3;

当进行单步调试时,随着逐语句执行,开发板上与PD3相连的LED按照预期亮和灭。但是一旦加入一些最简单的延时代码后:

void delay(uint32_t val)
{
    for (int i = val; i > 0; --i)
    {
        volatile int j = 1000;
        while (--j);
    }
}

int main()
{
    // ... GPIO clock enable and initialization
    
    while (1)
    {
        GPIOD->OUTDR |= GPIO_Pin_3;
        delay(1000);
        GPIOD->OUTDR &= ~GPIO_Pin_3;
        delay(1000);
    }

    return 0;
}

编译烧录后PD3的LED表现为常亮,当开启调试模式,执行到delay(1000)这一行并试图step over的时候,CPU似乎进入了复位,LED熄灭,调试终端持续打印:

Info : [wch_riscv.cpu.0] Hart unexpectedly reset!

[wch_riscv.cpu.0] Hart unexpectedly reset!

Info : [wch_riscv.cpu.0] Hart unexpectedly reset!

[wch_riscv.cpu.0] Hart unexpectedly reset!

Info : [wch_riscv.cpu.0] Hart unexpectedly reset!

[wch_riscv.cpu.0] Hart unexpectedly reset!

......


然而将上述代码while(1)中的两行GPIO赋值语句顺序颠倒后(即先关闭LED, 延时,再打开LED),烧录运行后表现为LED不亮。


请问上述调试报错表示哪里出现了问题?该现象是否是说明代码一旦执行到某个函数调用,就会自己崩掉?

您好,目前根据你提供的代码,我在MounRiver下测试都是没问题的。至于你的环境,目前我这边没有,目前无法从提供信息判定你的问题。若方便可将工程发过来(lzs@wch.cn)具体看一下。


只有登录才能回复,可以选择微信账号登录