STM32嘀嗒定时器——延时函数
一 系统Systick定时器
Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。
在这里我们选用内部时钟源72M,所以SYSTICK的时钟为9M,即SYSTICK定时器以9M的频率递减。
SysTick 主要包含CTRL、LOAD、VAL、CALIB 等4 个寄存器
二 代码配置
Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
#include "stm32f10x.h"
void delay_init(void) ;
void delay_us(int32_t nus); //延时n个us
void delay_ms(int16_t nms); //延时n个ms
#endif
Delay.c
/* --------------------------------------------------------- */
// 文件名称:delay.c
// 功能描述: SysTick延时函数源文件
/* --------------------------------------------------------- */
#include "delay.h"
static int8_t fac_us=0; //us
static int16_t fac_ms=0; //ms
void delay_init()
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//选择外部时钟 HCLK/8
fac_us=72000000/8000000; //为系统时钟的1/8 /* fac_us=SystemCoreClock/8000000; */
fac_ms=(int16_t)fac_us*1000; //每个ms需要的systick时钟数
}
//延时Nus
void delay_us(int32_t nus)
{
int32_t temp;
SysTick->LOAD=nus*fac_us; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL=0X01;; //使能,开始计数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
//延时Nms
void delay_ms(int16_t nms)
{
int32_t temp;
SysTick->LOAD=(int32_t)nms*fac_ms; //时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL|=0x01 ; //使能,开始计数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
```此次代码采用为未进入NVIC中断方式,可理解为采用查询方式进行延时