最近在看利用SysTick定时器实现延时功能,总结笔记:
Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器。 Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。
Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。
SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。
Systick中断的优先级也可以设置
4个Systick寄存器
对于STM32,外部时钟源是 HCLK(AHB总线时钟)的1/8 ,内核时钟是 HCLK时钟 配置函数:
SysTick_CLKSourceConfig();
库函数相关
Systick 部分内容属于NVIC控制部分,一共有4个寄存器(core_cm3.h)
static __INLINE uint32_t SysTick_Config(uint32_t ticks)//ticks为计时间隔,多少个ticks/秒
SysTick->LOAD =ticks&SysTick_LOAD_RELOAD_Msk
//设置重载寄存器的值Systick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。
STK_LOAD 重载寄存器是个24位的寄存器最大计数0xFFFFFF
SysTick->VAL=0 //当前值寄存器,是个24位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick 控制及状态寄存器中的COUNTFLAG 标志
SysTick->CTRL |=0x06//控制寄存器,关闭Systick功能,开启Systick中断,使用HCLK作为Systick时钟
SysTick->CTRL |=0x07//开启Systick功能,开启Systick中断,使用HCLK作为Systick时钟
SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)//misc.h,选择时钟频率
代码实现
#include
#include
#include
//配置systick 寄存器
void SysTick_Configuration(void)
{
SysTick->VAL = 0;
SysTick->LOAD = (72000000/8000000)*1000;//´ú±íÿ¸ömsÐèÒªµÄ9000¸ösystickʱÖÓÊý
SysTick->CTRL |= 0x06;
}
//中断处理函数
void SysTick_Handler(void) //????
{
extern unsigned long TimingDelay; // ????,?????????
SysTick->VAL = 0;
if (TimingDelay != 0x00)
TimingDelay--;
}
//systick延时函数
unsigned long TimingDelay; //
void Delay(unsigned long nTime) //
{
SysTick->CTRL |=0x07; //
TimingDelay = nTime; //
while(TimingDelay != 0); //
SysTick->CTRL |=0x06;//
}
int main()
{
SystemInit(); //??(??)???
LED_Init();
SysTick_Configuration(); //??systick???
while(1)
{
GPIOA->ODR|=1<<8;
GPIOD->ODR|=1<<2;
Delay(1000); //1S
GPIOA->ODR&=~(1<<8);
GPIOD->ODR&=~(1<<2);
Delay(1000); //1S
}
}
(如有问题欢迎指正)
参考:https://www.cnblogs.com/dustinzhu/p/4149906.html