蓝桥杯嵌入式CT117E硬件开发平台 | 滴答定时器做精准延时设计
过去我们用51单片机大多采用软件延时方式做一个大致的MS级延时,但是这种延时不是很精准,而且浮动性大,故而本次设计则是采用了STM32F103的滴答定时器做累减操作设计的延时函数。具体实现方式为:
- 配置滴答定时器自动重装载的值 -> 启动滴答定时器 -> 累减操作 -> 累减到0 -> 关闭滴答定时器。关于滴答定时器的配置,常用数值为:1MS,10US,1US;设计宏定义,并根据设计的定时器中断时间设计MS延时值宏定义,方法如下:
#define SISTICK_1MS 1
#define SISTICK_10US 100
#define SISTICK_1US 1000
#define SISTICK_TimeSet SISTICK_1MS
#define DELAY_SISTICKTIMESET_MS(N) (N*SISTICK_TimeSet)
extern u32 TimingDelay;
void DelaySisTick_Init(u16 SisTick_StateSet)
{
if(SisTick_StateSet == SISTICK_1MS)
{
if(SysTick_Config(SystemCoreClock/1000))
{
while(1);
}
}
else if(SisTick_StateSet == SISTICK_10US)
{
if(SysTick_Config(SystemCoreClock/100000))
{
while(1);
}
}
else
{
if(SysTick_Config(SystemCoreClock/1000000))
{
while(1);
}
}
SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}
- 延时函数的设计:开定时器进行累减操作,每到定时器中断一次,就累减一次值,直到为0才停止。
u32 TimingDelay = 0;
void DelaySisTick_Time(uint32_t nTime)
{
TimingDelay = nTime;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
while(TimingDelay != 0);
SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}
- 中断函数中,记得开启滴答定时器累减操作,执行方法如下:
extern u32 TimingDelay;
void SysTick_Handler(void)
{
TimingDelay--;
}