OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3378|回复: 5

STM32F10X delay_ms(3000)函数

[复制链接]

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2018-1-11
在线时间
24 小时
发表于 2018-1-23 14:34:03 | 显示全部楼层 |阅读模式
1金钱
STM32函数库里的delay_ms(3000)不是延时3秒吗?怎么我看有1秒,这是怎么算的?

最佳答案

查看完整内容[请看2#楼]

//延时nms //注意nms的范围 //SysTick->LOAD为24位寄存器,所以,最大延时为: //nmsLOAD为24bit) SysTick->VAL =0x00; //清空计数器 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数 do { temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1VAL =0X00; //清空计数器 }
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-1-23 14:34:04 | 显示全部楼层
//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864
void delay_ms(u16 nms)
{                                     
        u32 temp;                  
        SysTick->LOAD=(u32)nms*fac_ms;                                //时间加载(SysTick->LOAD为24bit)
        SysTick->VAL =0x00;                                                        //清空计数器
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;        //开始倒数  
        do
        {
                temp=SysTick->CTRL;
        }while((temp&0x01)&&!(temp&(1<<16)));                //等待时间到达   
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;        //关闭计数器
        SysTick->VAL =0X00;                                               //清空计数器                      
}
回复

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-1-23 15:27:37 | 显示全部楼层
这个时间是通过单片机的时钟频率计算得到的延时,如果单片机时钟频率与程序中所设置的不同,那么延时也将不是正确的。
回复

使用道具 举报

57

主题

316

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1344
金钱
1344
注册时间
2018-1-11
在线时间
156 小时
发表于 2018-1-23 21:08:14 | 显示全部楼层
首先,提问你,你知道他如何实现延时ms级别的吗?然后再解释,不知道,就得先解决提问的这个问题
回复

使用道具 举报

57

主题

316

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1344
金钱
1344
注册时间
2018-1-11
在线时间
156 小时
发表于 2018-1-23 21:28:22 | 显示全部楼层
还是直接给你答案吧。你犯得错误是没理解这个。
“但是要注意因为 LOAD 仅仅是一个 24bit 的寄存器,延时的 ms数不能太长。否则超出了 LOAD 的范围,高位会被舍去,导致延时不准。最大延迟 ms 数可以通过公式:nms<=0xffffff*8*1000/SYSCLK  计算。SYSCLK 单位为 Hz,nms 的单位为 ms。如果时钟为 72M,那么 nms 的最大值为 1864ms。超过这个值,建议通过多次调用 delay_ms 实现,否则就会导致延时不准确。“”

所以你的参数值位3000明显大于1864.我觉得这个回答不可能不明白了!!!!!
回复

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2018-1-11
在线时间
24 小时
 楼主| 发表于 2018-1-24 11:17:35 | 显示全部楼层
活到老,学到老 发表于 2018-1-23 21:28
还是直接给你答案吧。你犯得错误是没理解这个。
“但是要注意因为 LOAD 仅仅是一个 24bit 的寄存器,延时 ...

感谢你们的回复,我大概了解了,Reload 寄存器的局限,0XFFFFFFF是代表24位寄器,8*1000是8MHZ的外部时间,除以72000000sysclk 时系时钟得出来的ms数是吗?如果我们要延时大于2秒以上就要通过多个delay_ms()来实现,这样理解对吗?
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 02:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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