用SYSTICK完成的精确延时例程-实现微秒和毫秒级延时

强调一下中断和延时的区别,
中断,在延时的时候可以做别的事情
延时,阻塞式的,进程阻塞在这里了,就只管等待时间到了往下继续做事情

/**
  ******************************************************************************
  *
	*延时函数:微秒级
	*
	*用这个函数要成立有两个条件:
	*条件一:主频要是72M
  *条件二:us要小于1864135
  ******************************************************************************
  */

void delay_us(unsigned int us)
{
	
	unsigned int tmp=	0;
	SysTick->LOAD		=	us * 9;   //72M主频,8分频就成了9MHz,
	SysTick->VAL  	= 0;
	SysTick->CTRL		=	0x01;  //时钟源是AHB/8,禁止中断,使能SYSTICK
	
	do
	{

				tmp = SysTick->CTRL;
	
	
	}while(!(tmp&(1<<16)));  //监测count flag,当CTRL=1的时候就退出
	

	//跳出do while 循环,说明时间已经到了,关闭定时器即可
	SysTick->VAL  = 0;
	SysTick->CTRL	=	0x00;  //查阅文档知


	
}
/**
  ******************************************************************************
  *
	*延时函数:用SYSTICK计数器实现毫秒级延时
	*
	*思路:先把SYSTICK的时钟源设置好,然后给一个正确的ticks,然后使能SYSTICK,
	*			 while循环等待countflag置位则时间到
  ******************************************************************************
  */

// ms不能大于 1864

void delay_ms(unsigned int ms)
{
	unsigned int tmp=0;
	SysTick->LOAD	=	ms * 9000;   //72M主频,8分频就成了9MHz,
	SysTick->VAL  = 0;
	SysTick->CTRL	=	0x01;  //时钟源是AHB/8,禁止中断,使能SYSTICK
	
	do
	{

				tmp = SysTick->CTRL;
	
	
	}while(!(tmp&(1<<16)));  //监测count flag,当CTRL=1的时候就退出
	

	//跳出do while 循环,说明时间已经到了,关闭定时器即可
	SysTick->VAL  = 0;
	SysTick->CTRL	=	0x00;  //查阅文档知

}

你可能感兴趣的:(普中PZ6806L开发板-记录)