`

Stm32定时、延时等功能实现

阅读更多

stm32实现定时、延时一般通过调用CMSIS函数SysTick_Config实现。例如我们设置1ms中断如下:

 

/**************************************
**转载请注明:http://tedeum.iteye.com**
***************************************/

if (SysTick_Config(SystemCoreClock / 1000))
	  {
	    /* Capture error */
	    while (1);
	  }

 这时,每过1ms就会调用中断,可以在中断中进行定时逻辑处理:

 

 

void SysTick_Handler(void)
{
//进行相应的定时逻辑处理
}

 在此基础上,我们就可以进行延时,频率处理,计时的功能的开发:

一、延时,我们首先定义一个延时时间,然后调用延时函数后,延时时间在SysTick中断中减一,为0时跳出:

//延迟时间计数器
__IO uint32_t TimingDelay = 0;
//SysTick中断处理函数
void SysTick_Handler(void)
{
	//每次SysTick中断减一
	  if (TimingDelay != 0x00)
	  {
	    TimingDelay--;
	  }
}
//延时函数
void Delay(__IO uint32_t nTime)
{
	//设置终端延时计数器
  TimingDelay = nTime;
  //为0时延时等待结束
  while(TimingDelay != 0);
}

 二、计时,设置一个sysTickCount,两个sysTickCount的差就是时长:

//tick计数器,48天后重复,如用于四轴不用处理
static volatile uint32_t sysTickCount = 0;
//SysTick中断处理函数
void SysTick_Handler(void)
{
	//每次SysTick中断加1
	sysTickCount++
}
//获取当前计数
uint32_t millis(void)
{
    return sysTickCount;
}
//使用例子
uint32_t t1 = millis();
//do somethin
uint32_t t2 = millis();
uint32_t t3 = t2 - t1;

 三、频率处理,按上面没1ms处理1次,频率= 1000(每秒次数)/每次间隔时间,在中断处理函数中如下:

void SysTick_Handler(void)
{
	//每次SysTick中断加1
	sysTickCount++

	//500hz
	if ((sysTickCount % 2) == 0) {
		//do something 500hz
	}
	//250hz
	if ((sysTickCount % 4) == 0) {
		//do something 200hz
	}
	//200hz
	if ((sysTickCount % 5) == 0) {
		//do something 200hz
	}
	//100hz
	if ((sysTickCount % 10) == 0) {
		//do something 200hz
	}
	//50hz
	if ((sysTickCount % 20) == 0) {
		//do something 200hz
	}
	//20hz
	if ((sysTickCount % 50) == 0) {
		//do something 200hz
	}
	//10hz
	if ((sysTickCount % 100) == 0) {
		//do something 200hz
	}
	//5hz
	if ((sysTickCount % 200) == 0) {
		//do something 200hz
	}

}

 以上就是SysTick一些基本应用的笔记。

/*************************************************
*****转载请注明出处:http://tedeum.iteye.com******
**************************************************/

 

 

1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics