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****** **************************************************/