qeeuly 发表于 2023-1-31 15:16

延时函数

请问有没有延时函数?
自己写一个也可以,就是不如库自带的方便。

blust5 发表于 2023-1-31 16:09

写个for循环不就行了

WK520077778 发表于 2023-2-1 00:11

比较多的选择,看具体场景

jobszheng 发表于 2023-2-1 09:06

还是看具体的应用场景吧!
优选设计成状态机的模式,把延迟部分更新为一个延时状态

CXFLBH 发表于 2023-2-1 09:09

//延时程序,由delay参数确定延时时间
void Delay(unsigned int delay)
{                               
   unsigned char k;
   for(;delay>0;delay--)
   for(k=0;k<255;k++);
}

quna 发表于 2023-2-1 15:31

void systick_delay_us(u32 nus)
{      
    u32 temp;      
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);    //select system clock   
    SysTick->LOAD=nus*(SystemCoreClock/1000000); //time relode         
    SysTick->VAL=0x00;      //clear timer value
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;//Start countdown
    do
    {
      temp=SysTick->CTRL;
    }
    while(temp&0x01&&!(temp&(1<<16)));//wait for the time reach
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //close the count
    SysTick->VAL =0X00;       //clear timer value   
}

/**
* @briefus delayprogram function.
* @param nus: the setting us value.
*   note: The system clock should be an integer multiple of 1M .
*   It is ensure accuracy .
*/
void systick_delay_ms(u16 nms)
{               
    u32 temp;
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//select system clock   
    SysTick->LOAD=(u32)nms*((SystemCoreClock/1000000)*1000);//time relode(SysTick->LOAD is 24bit)
    SysTick->VAL =0x00;         //clear timer value
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //Start countdown
    do
    {
      temp=SysTick->CTRL;
    }
    while(temp&0x01&&!(temp&(1<<16)));//wait for the time reach   
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //close the count
    SysTick->VAL =0X00;       //clear timer value               
}

qeeuly 发表于 2023-2-1 16:18

quna 发表于 2023-2-1 15:31
void systick_delay_us(u32 nus)
{      
    u32 temp;      


谢谢。
再问下,如果在主循环的函数里调用这两个延时,就是操作SysTick,不会影响定时中断吧?
页: [1]
查看完整版本: 延时函数