硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2789|回复: 3
收起左侧

[有问必答] 请问嘀嗒定时器延时这种写法的区别?

[复制链接]

32

主题

103

回帖

199

积分

高级会员

积分
199
发表于 2018-4-18 14:18:24 | 显示全部楼层 |阅读模式
嘀嗒定时器延时如下,第一种:while(!(SysTick->CTRL&0x00010000));这一句是我改的就是判断是否计数到0,如果计数到0,则关闭计数器,清零计数器
第二种:这个do-while循环do
        {
                temp=SysTick->CTRL;        
        }
        while(temp&0x01&&!(temp&(1<<16)));
也是判断是否计数到0,只是多判断了一下是否计数器是否开着,同时把寄存器的值放到temp里。
现在的情况是,当我在外部中断里使用这个延时函数时,第一种情况会卡死在那个while循环中,第二个就不会,我想不通了,谢谢大家。
void delay_ms(u16 times)
{
        u32 temp;

        SysTick->LOAD =times*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;  
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2018-4-18 16:58:37 | 显示全部楼层
temp = SysTick->CTRL&0x00010000 ,然后测试下这个temp看看是否正常

ps:切不可以在中断里面使用这种延迟,极其影响系统实时性,你应该仅在中断里面设置一个标志,然后在中断外面处理。
回复

使用道具 举报

32

主题

103

回帖

199

积分

高级会员

积分
199
 楼主| 发表于 2018-4-19 12:41:41 | 显示全部楼层
eric2013 发表于 2018-4-18 16:58
temp = SysTick->CTRL&0x00010000 ,然后测试下这个temp看看是否正常

ps:切不可以在中断里面使用这种延 ...

你是说把那个替换成temp,然后while(!temp)?感觉没什么分别啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2018-4-19 12:57:33 | 显示全部楼层
伊森亨特 发表于 2018-4-19 12:41
你是说把那个替换成temp,然后while(!temp)?感觉没什么分别啊

是啊,就是没分别。通过这种方法测试下你的工程是不是异常了。这种问题,多多试试各种方式就找到根本问题了。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-11 17:08 , Processed in 0.174800 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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