长江一道浪 发表于 2024-5-8 14:06

HC32F460,嘀嗒延时问题?

使用库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;
      }
    }
}


chenqianqian 发表于 2024-5-9 08:12

什么意思?代码是直接从ST搬过来的?

ayb_ice 发表于 2024-5-9 10:24

用滴答不是这样延时的

长江一道浪 发表于 2024-5-10 14:01

chenqianqian 发表于 2024-5-9 08:12
什么意思?代码是直接从ST搬过来的?

这个延时是当时我在华大库1.21版本使用的,现在有问题了。

长江一道浪 发表于 2024-5-10 14:03

ayb_ice 发表于 2024-5-9 10:24
用滴答不是这样延时的

大佬,请问该怎么使用呢?

ayb_ice 发表于 2024-5-10 14:58

长江一道浪 发表于 2024-5-10 14:03
大佬,请问该怎么使用呢?

滴答中断中搞个32位变量,每次中断加1,然后取两次滴答的差值就是延时间
u32 g_ulTickCnt;

void TICK_Isr(void)
{
        g_ulTickCnt++;
        //....
}

void Delay_xx(u32 ulCnt)
{
        u32 ulBase = g_ulTickCnt;
       
        while (g_ulTickCnt-ulBase < ulCnt)
        {
                __nop();
        }
}

长江一道浪 发表于 2024-5-11 10:32

ayb_ice 发表于 2024-5-10 14:58
滴答中断中搞个32位变量,每次中断加1,然后取两次滴答的差值就是延时间
u32 g_ulTickCnt;



之前那种时间片取延时,不能这样做吗?
用嘀嗒中断做延时也是不错选择。

yang377156216 发表于 2024-5-11 15:50

内核的 systick 使用方式每家都一样的

stormwind123 发表于 2024-8-12 17:07

检查并更新你的代码与当前使用的库版本兼容。特别是与定时器、中断和串口通信相关的部分。

laocuo1142 发表于 2024-8-12 22:23

调整中断优先级

powerantone 发表于 2024-8-13 13:46

关闭不必要的编译器优化

stormwind123 发表于 2024-8-13 19:56

如果可能的话,尽量使用库函数提供的延时功能,而不是自己编写延时函数。这样可以减少因实现差异导致的问题。

probedog 发表于 2024-8-14 20:12

如果新版本库的问题无法解决,并且旧版本库满足你的需求,你可以考虑暂时回退到旧版本的库。
页: [1]
查看完整版本: HC32F460,嘀嗒延时问题?