打印
[单片机芯片]

请问Delay_Us()与Delay_Ms()最大延时多少

[复制链接]
1298|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在MRS创建的CH32V103工程模板中有个debug.c文件,其中有两个延时函数:


板子是沁恒官方的CH32V103C8T6全功能评估板:


请问这两个延时函数,各自的最大延时是多少呢?

使用特权

评论回复
沙发
wgtwgtwgt|  楼主 | 2022-3-14 21:49 | 只看该作者
取整后,
Delay_Us()的最大延时为477,218,588us
Delay_Ms()的最大延时为477,218ms
不知对否?

使用特权

评论回复
板凳
WCHTech2| | 2022-3-15 10:26 | 只看该作者
您好,我们CH32V103的系统计数器是由32位的低位寄存器STK_CNTL和32位的高位寄存器STK_CNTH组成的64位递增的系统计数器,理论上这两个延时函数可设置的最大延时为入口参数类型uint32_t定义的最大数值,应该为4294967295。

使用特权

评论回复
地板
wgtwgtwgt|  楼主 | 2022-3-15 14:36 | 只看该作者
WCHTech2 发表于 2022-3-15 10:26
您好,我们CH32V103的系统计数器是由32位的低位寄存器STK_CNTL和32位的高位寄存器STK_CNTH组成的64位递增的 ...

在debug.c中有个Delay_Init()函数:

现在SystemCoreClock为72000000,那么p_us=72000000/8000000=9,p_ms=9*1000=9000
回到Delay_Us()函数:

i为uint32_t类型,即无符号32位整型,其最大值为4,294,967,295。根据i = (uint32_t)n*p_us,n≤4294967295/9≈477218588 us。
同样的,在Delay_Ms()函数中,有i = (uint32_t)n*p_ms,所以n≤4294967295/9000≈477218 ms。
另外,在Delay_Us()和Delay_Ms()中,均有while((*(__IO uint32_t*)0xE000F004) <= i),这表明只使用了系统计数器低位寄存器,并没有使用其高位的32位寄存器。由于i经过计算(i = (uint32_t)n*p_us及i = (uint32_t)n*p_ms)后的值肯定要小于uint32_t数据类型的最大值(4294967295),所以在执行while((*(__IO uint32_t*)0xE000F004) <= i)时,系统计数器自增到某一个数值时总会使其低32位寄存器值大于i,从而跳出while。这一过程不会用到系统计数器的高32位寄存器。

不知分析的是否正确,期望指正。

使用特权

评论回复
5
wgtwgtwgt|  楼主 | 2022-3-15 16:00 | 只看该作者
用Delay_Ms(477218)测试了一下,延时约8分钟。但是用477218+1=477219时,延时很短,因为溢出了。

使用特权

评论回复
6
WCHTech2| | 2022-3-16 10:38 | 只看该作者
wgtwgtwgt 发表于 2022-3-15 14:36
在debug.c中有个Delay_Init()函数:

现在SystemCoreClock为72000000,那么p_us=72000000/8000000=9,p_m ...

您好,你的分析是没问题的,如果你在程序中延时需要延时很久的话,可以利用for循环的方式来增加延时时间。

使用特权

评论回复
7
wgtwgtwgt|  楼主 | 2022-3-16 19:53 | 只看该作者
WCHTech2 发表于 2022-3-16 10:38
您好,你的分析是没问题的,如果你在程序中延时需要延时很久的话,可以利用for循环的方式来增加延时时间 ...

谢谢

使用特权

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

本版积分规则

45

主题

191

帖子

3

粉丝