延时函数
请问有没有延时函数?自己写一个也可以,就是不如库自带的方便。 写个for循环不就行了 比较多的选择,看具体场景 还是看具体的应用场景吧!
优选设计成状态机的模式,把延迟部分更新为一个延时状态 //延时程序,由delay参数确定延时时间
void Delay(unsigned int delay)
{
unsigned char k;
for(;delay>0;delay--)
for(k=0;k<255;k++);
} 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
} quna 发表于 2023-2-1 15:31
void systick_delay_us(u32 nus)
{
u32 temp;
谢谢。
再问下,如果在主循环的函数里调用这两个延时,就是操作SysTick,不会影响定时中断吧?
页:
[1]