查看: 6195|回复: 4

【时钟延时函数配置】关于FM33LC0XX系列延时的疑惑

[复制链接]

6

主题

25

帖子

124

积分

中级工程师

Rank: 2

积分
124
发表于 2021-1-7 11:22:28 | 显示全部楼层 |阅读模式
以下是例程里延时的函数,void DelayUs(uint32_t count)函数里有读系统时钟的函数FL_RCC_GetSystemClockFreq(),再加上后面的循环查询,一圈执行下来,肯定有不少意料外的时间,我测了一下,DelayUs(1)的延时函数,会有将近20多微秒的时间消耗,这里是不是很不可思议?
void DelayUs(uint32_t count)
{
    count = (uint64_t)FL_RCC_GetSystemClockFreq() * count / 1000000;
    count = count > 16777216 ? 16777216 : count;

    SysTick->LOAD = count - 1;
    SysTick->VAL = 0;
    while (!((SysTick->CTRL >> 16) & 0x1));
}

void DelayMs(uint32_t count)
{
    while (count--)
    {
        DelayUs(1000);
    }
}

回复

使用道具 举报

154

主题

846

帖子

4624

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4624
发表于 2021-1-7 15:45:27 | 显示全部楼层
这个函数是ms级别的 1us 才8条指令。不能用这个函数的,自己做几个延时就可以了
回复

使用道具 举报

217

主题

393

帖子

3477

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3477
QQ
发表于 2021-1-8 00:46:57 | 显示全部楼层
这个函数接口主要是针对完成ms定时写的接口,us相对时间较短,所以需要重新写,最好用操作寄存器的指令,这样会比较精确
回复

使用道具 举报

6

主题

25

帖子

124

积分

中级工程师

Rank: 2

积分
124
 楼主| 发表于 2021-1-11 10:06:40 | 显示全部楼层
wangpeng 发表于 2021-1-8 00:46
这个函数接口主要是针对完成ms定时写的接口,us相对时间较短,所以需要重新写,最好用操作寄存器的指令,这 ...

谢谢你的回复。前面用了I2C延时,发现的这个问题。
回复

使用道具 举报

217

主题

393

帖子

3477

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3477
QQ
发表于 2021-1-11 23:44:07 | 显示全部楼层
皖宁港 发表于 2021-1-11 10:06
谢谢你的回复。前面用了I2C延时,发现的这个问题。

不客气,解决问题就好
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表