打印
[技术问答]

HC32F460,嘀嗒延时问题?

[复制链接]
2216|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
长江一道浪|  楼主 | 2024-5-8 14:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用库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版本使用的,现在有问题了。

使用特权

评论回复
5
长江一道浪|  楼主 | 2024-5-10 14:03 | 只看该作者
ayb_ice 发表于 2024-5-9 10:24
用滴答不是这样延时的

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

使用特权

评论回复
6
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();
        }
}

使用特权

评论回复
7
长江一道浪|  楼主 | 2024-5-11 10:32 | 只看该作者
ayb_ice 发表于 2024-5-10 14:58
滴答中断中搞个32位变量,每次中断加1,然后取两次滴答的差值就是延时间
u32 g_ulTickCnt;

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

使用特权

评论回复
8
yang377156216| | 2024-5-11 15:50 | 只看该作者
内核的 systick 使用方式每家都一样的

使用特权

评论回复
9
stormwind123| | 2024-8-12 17:07 | 只看该作者
检查并更新你的代码与当前使用的库版本兼容。特别是与定时器、中断和串口通信相关的部分。

使用特权

评论回复
10
laocuo1142| | 2024-8-12 22:23 | 只看该作者
调整中断优先级

使用特权

评论回复
11
powerantone| | 2024-8-13 13:46 | 只看该作者
关闭不必要的编译器优化

使用特权

评论回复
12
stormwind123| | 2024-8-13 19:56 | 只看该作者
如果可能的话,尽量使用库函数提供的延时功能,而不是自己编写延时函数。这样可以减少因实现差异导致的问题。

使用特权

评论回复
13
probedog| | 2024-8-14 20:12 | 只看该作者
如果新版本库的问题无法解决,并且旧版本库满足你的需求,你可以考虑暂时回退到旧版本的库。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

47

帖子

1

粉丝