OpenEdv-开源电子网

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

关于delay_ms准确性的疑问

[复制链接]

15

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2017-9-9
在线时间
36 小时
发表于 2017-12-27 16:28:49 | 显示全部楼层 |阅读模式
5金钱
void delay_ms(u16 nms)
{                                     
        u32 temp;                  
        SysTick->LOAD=(u32)nms*fac_ms;               
        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;                                           
}

疑问:在别的帖子上看到有人说:如果计数器计数到0时程序恰好进入中断, 计数器开始重新计数,COUNTFLAG是否会自动清零?
如果会自动清零,那程序从中断出来仍会在while((temp&0x01)&&!(temp&(1<<16)));中等待,开始下个周期的计数,这样的话延时岂不是会不准确?

最佳答案

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

COUNTFLAG是会自动清零的,计数到0,就停止了不会直接开启下次循环的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-12-27 16:28:50 | 显示全部楼层
COUNTFLAG是会自动清零的,计数到0,就停止了不会直接开启下次循环的
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-12-28 01:11:20 | 显示全部楼层
任何延时,被中断打断都不会准确。
回复

使用道具 举报

15

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2017-9-9
在线时间
36 小时
 楼主| 发表于 2017-12-28 19:19:05 | 显示全部楼层
正点原子 发表于 2017-12-27 16:28
COUNTFLAG是会自动清零的,计数到0,就停止了不会直接开启下次循环的

你说的对,原子哥,我的疑问是,当有中断来打断delay函数,程序进入中断中运行,这时systick定时器已经计数到0,countflag = 1;然后程序还在中断中执行,这时systick定时器不是自动加载重新开启下一次计数了吗?如果是,并且countflag自动清零,那么程序从中断执行出来,接着判断while((temp&0x01)&&!(temp&(1<<16))); ,那就继续留在delay里面了,也就是说实际上delay了两次。是这样吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 05:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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