定时器毫秒级延时函数
时间: 2023-11-19 08:05:52 浏览: 37
很多单片机都有自己的定时器模块,可以用来实现毫秒级的延时函数。下面以STM32为例,介绍一种实现定时器毫秒级延时函数的方法:
1. 配置定时器:选择一个定时器,配置为向上计数模式,时钟源选择内部时钟,预分频系数为72-1,自动重载值为1000-1,这样定时器的计数频率就为1MHz,计数器每计数1次,时间就增加1us。
2. 编写初始化函数:初始化定时器,使其开始计数,并开启定时器中断。
3. 编写中断服务函数:在中断服务函数中,判断是否为定时器溢出中断,如果是,则将计数器清零。
4. 编写延时函数:在延时函数中,先保存当前的计数器值,然后进入循环,等待计数器的值增加到指定的延时时间,最后返回延时时间。
下面是一个示例代码:
```c
#include "stm32f10x.h"
volatile uint32_t g_tick = 0;
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
g_tick++;
}
}
void Delay_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 1000 - 1;
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void Delay_ms(uint32_t ms)
{
uint32_t tickstart = g_tick;
while ((g_tick - tickstart) < ms);
}
int main(void)
{
Delay_Init();
while (1)
{
// 延时1000ms
Delay_ms(1000);
// do something
}
}
```