为什么我这个延时函数一直死在while里,跳不出来啊?

2019-07-20 05:37发布

static u8 fac_us=0;
static u16 fac_ms=0;

void delay_init(u8 SYSCLK)
{
       
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
        fac_us=SYSCLK/(8*1000000);
        fac_ms=(u16)fac_us*1000;
}
       
void delay_us(u32 time)
{
        SysTick->LOAD=time*fac_us;
        SysTick->VAL=0;
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;
  while((SysTick->CTRL&(1<<16))==0);
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
        SysTick->VAL=0;
}
       
       
void delay_ms(u16 time)
{
        SysTick->LOAD=(u32)time*fac_ms;
        SysTick->VAL=0;
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;
        while((SysTick->CTRL&(1<<16))==0);
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
        SysTick->VAL=0;
}

void delay_nms(u16 time)
{                  
        u8 integer=time/500;                                                               
        u16 remainder=time%500;
        while(integer)
        {
                delay_ms(500);
                integer--;
        }
        if(remainder)delay_ms(remainder);
}

我把原子哥例程里的void delay_nms(u16 time)copy过来也一样,还是死在do{}while()里。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
NickWu
1楼-- · 2019-07-20 05:38
紅 {MOD}地方改成這樣試試

void delay_ms(u16 time)
{
         SysTick->LOAD=(u32)time*fac_ms;
         SysTick->VAL=0;
         SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;

         while( (SysTick->CTRL&0x01)&&!(SysTick->CTRL&(1<<16)) );

         SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
         SysTick->VAL=0;
}
过客随风
2楼-- · 2019-07-20 06:49
NickWu 发表于 2018-10-18 13:45
紅 {MOD}地方改成這樣試試

void delay_ms(u16 time)

不行啊,还是一样的
NickWu
3楼-- · 2019-07-20 12:38
 精彩回答 2  元偷偷看……

一周热门 更多>