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

**************************************************/

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐