[求助] HC32F460,嘀嗒延时问题?

121315L   2024-5-8 14:08 楼主

使用库3.2.0时,自己的延时函数会造成芯片跑飞,串口漏打印。我测试以前库1.21时,发现没问题,具体原因不知道为什么。库2.2.0也会造成这样的问题。下面给出了嘀嗒延时初始化和毫秒延时函数,我在STM32F1的HAL库使用也没问题。

void delay_init(void)

{

    SysTick->LOAD = (uint32_t)(SystemCoreClock / 1000); // 设置重装载值1ms

    NVIC_SetPriority(SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); // 设置中断

    SysTick->VAL = 0UL; // 计数值清零

    SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |

                    SysTick_CTRL_TICKINT_Msk |

                    SysTick_CTRL_ENABLE_Msk; // 选择系统时钟,使能中断、时钟
}

void delay_ms(uint32_t u32Cnt)
{
    uint32_t ticks;
    uint32_t told, tnow, tcnt = 0;
    uint32_t reload = SysTick->LOAD; // 读取重装载值

    ticks = u32Cnt * (SystemCoreClock / 1000); // 转换成1ms基本单位的节拍
    told = SysTick->VAL;
    while (1)
    {
        tnow = SysTick->VAL;
        if (tnow != told)
        {

            if (tnow < told)
                tcnt += told - tnow;
            else
                tcnt += reload - tnow + told;
            told = tnow;
            if(tcnt >1000000)
              {
                continue;
              }
            if (tcnt >= ticks)
                break;
        }
    }
}

回复评论 (6)

有没可能SysTick这个地址不对?

点赞  2024-5-8 17:47

使用官方自带的delay函数呢?

点赞  2024-5-9 09:57
引用: wangerxian 发表于 2024-5-8 17:47 有没可能SysTick这个地址不对?

我仿真出来得到的系统时钟是200M这是对的。 image.png   

点赞  2024-5-9 17:03
引用: nmg 发表于 2024-5-9 09:57 使用官方自带的delay函数呢?

用官方自带的嘀嗒函数吗,我没有用过。用官方的DDL_DelayMS函数倒是没问题。

点赞  2024-5-9 17:04

1、官方的DDL_DelayMS函数是软件方式延时,根据当前配置的HCLK时钟频率进行计数,时间不算太精确

2、在官网可以下载当前的驱动库和样例,在HC32F460_DDL_Rev3.2.0\projects\ev_hc32f460_lqfp100_v2\examples\systick\systick_int有对应的示例程序,可参考例程实现你需要的SysTick延时函数功能

3、在你delay_init配置SysTick时,如果不需要用到中断的方式,就不要配置中断,配置了中断,就要实现中断函数

本帖最后由 xld0932 于 2024-5-10 09:34 编辑
We are a team and we work as a team !
点赞  2024-5-10 09:30
引用: xld0932 发表于 2024-5-10 09:30 1、官方的DDL_DelayMS函数是软件方式延时,根据当前配置的HCLK时钟频率进行计数,时间不算太精确 2、在 ...

我当时将中断取消了,也是会有影响。

点赞  2024-5-11 10:25
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复