FreeRTOS中实现延时1us,1ms

1us

void Delay_us(int16_t nus) 
{
	UINT ticks;
	UINT told,tnow,reload,tcnt=0;
	if((0x0001&(SysTick->CTRL)) ==0)    //定时器未工作
		vPortSetupTimerInterrupt();  //初始化定时器

	reload = SysTick->LOAD;                     //获取重装载寄存器值
	ticks = nus * (SystemCoreClock / 1000000);  //计数时间值

	vTaskSuspendAll();//阻止OS调度,防止打断us延时
	told=SysTick->VAL;  //获取当前数值寄存器值(开始时数值)
	while(1)
	{
		  tnow=SysTick->VAL; //获取当前数值寄存器值
		  if(tnow!=told)  //当前值不等于开始值说明已在计数
		  {         
				 if(tnow=ticks)break;  //时间超过/等于要延迟的时间,则退出.
		  } 
	}  
	xTaskResumeAll();	//恢复OS调度	
}

1ms

void delay_1ms(uint32_t count)
{
	uint32_t ticks;
    uint32_t told,tnow,reload,tcnt=0;
 
    reload = SysTick->LOAD;                     //获取重装载寄存器值
    ticks = count * (SystemCoreClock / 1000);    //计数时间值   括号里的代表1us秒嘀嗒定时器的value会向下降多少值
    told=SysTick->VAL;                          //获取当前数值寄存器值(开始时数值)
    while(1)
    {
          tnow=SysTick->VAL;          //获取当前数值寄存器值
          if(tnow!=told)              //当前值不等于开始值说明已在计数
          {         
				if(tnow=ticks)break;     //时间超过/等于要延迟的时间,则退出.
          } 
    } 	
}
void Delay_ms(int16_t t)
{
	vTaskDelay(1);
}

 

你可能感兴趣的:(FreeRTOS,java,linux,前端)