CH32V203F6 通过Systick生成dealy_ms延时,当使用HSI作为时钟源时,HCLK设置为96M或144M时,延时误差相差达到数倍。

请问如何设置能够消除误差?延时函数使用的是EVT中的示例:

void Delay_Ms(uint32_t n)

{

    uint32_t i;

    SysTick->SR &= ~(1 << 0);

    i = (uint32_t)n * p_ms;


    SysTick->CMP = i;

    SysTick->CTLR |= (1 << 4);

    SysTick->CTLR |= (1 << 5) | (1 << 0);


    while((SysTick->SR & (1 << 0)) != (1 << 0));

    SysTick->CTLR &= ~(1 << 0);

}


您好,关于延时函数的初始化,如下图1,配置是根据系统主频不同进行调整的,使延时的大小不会因主频的变化而改动。正常不会有太大误差的,我这边基于EVT例程测试基本也是没有问题的,请问一下你那边所描述的延时误差相差数倍具体是多少,若方便可使用EVT例程直接测试一下,可直接通过修改宏定义修改主频,如下图2。后续若有问题,可邮箱(lzs@wch.cn)和我进行沟通。

image.png

图1

image.png

图2


#define SYSCLK_FREQ_96MHz_HSI  96000000

int main(void)

{

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

    SystemCoreClockUpdate();

    Delay_Init();

    GPIO_INIT();

    while(1){

        GPIO_SetBits(GPIOD, GPIO_Pin_0);

        GPIO_ResetBits(GPIOD, GPIO_Pin_1);

        Delay_Ms(100);

        GPIO_SetBits(GPIOD, GPIO_Pin_1);

        GPIO_ResetBits(GPIOD, GPIO_Pin_0);

        Delay_Ms(100);

    }

以上代码是基于EVT改的,延时函数采用EVT中的没改动。

用逻辑分析仪抓取PD0引脚波形如下:

PixPin_2024-11-28_15-44-32.jpg


您好,PD0和PD1作为晶振引脚,作为普通IO使用时,注意开启复用时钟和GPIO复用,此外可关闭外部晶振试一下。附件是我的测试例程,测试是没有问题的,可以参考一下,如下图。你可以直接使用附件例程测试一下

icon_rar.gifCH32V203 PD0_1.zipimage.png


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