找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 713|回复: 2
收起左侧

求助。死循环。求解惑

[复制链接]
ID:562716 发表于 2021-11-5 12:49 | 显示全部楼层 |阅读模式
void delay_us(u32 nus)
{               
        u32 temp;                     
        SysTick->LOAD=nus*fac_us; //时间加载                           
        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;       //清空计数器         
}
//延时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;       //清空计数器                      
}
#endif


这为啥死循环。底层太深奥。。。

回复

使用道具 举报

ID:313048 发表于 2021-11-5 13:35 | 显示全部楼层
这不是死循环啊,
do
{
           temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
这里不是有判断吗?
temp为获取的systick计数值,当temp为0的时候,就是你的延时结束的时候吖。
回复

使用道具 举报

ID:562716 发表于 2021-11-5 17:12 | 显示全部楼层
AUG 发表于 2021-11-5 13:35
这不是死循环啊,
do
{

可是我这边运行用模拟就一直卡这一段里了。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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