【STM32F407学习笔记】SysTick定时器
1.工作原理
- SysTick:系统定时器(又叫滴答定时器),24位,只能递减,存在于内核,嵌套在NVIC中,所有的cortex-M内核的单片机都具有这个定时器。
2. 相关寄存器
typedef struct
{
__IO uint32_t CTRL;
__IO uint32_t LOAD;
__IO uint32_t VAL;
__I uint32_t CALIB;
} SysTick_Type;
- SysTick->CTRL
第0位:ENABLE , SysTick使能位(0:关闭功能,1:开启功能)
第1位:TICKINIT, SysTick中断使能位(0:关闭SysTick中断,1:开启Systick中断)
第2位:CLKSOURCE,SysTick时钟源选择(0:HLCK/8作为时钟源;1:HCLK作为时钟源)
第16位:COUNTFLAG,SysTick计数比较标志(如果在上次读取本寄存器后,SysTick已经计数到0了,则该位为1;如果读取该位,该位将自动清零) - SysTick->LOAD
24位寄存器,最大计数值为:0XFFFFFF 当计数器递减至0,重装载数值寄存器中的值将被重装载,继续开始递减。 - SysTick->VAL
24位寄存器,读取它会返回当前倒计数的值,写它则会使它清零,同时清楚SysTick->CTRL寄存器中的COUNTFLAG标志位 - SysTick->CALIB
校准数值寄存器,一般不会用到
3.使用方法
3.1 轮询的方式
#include "stm32f4xx.h"
static u8 fac_us=0;
static u16 fac_ms=0;
void delay_init(u8 SysCLK)
{
SysTick_CLKSourceConfig(SystemCoreClock);
fac_us=SysCLK;
fac_ms=(u16)fac_us*1000;
}
void delay_ms(u16 nms)
{
SysTick->CTRL |= SysTick_CLKSource_HCLK;
u32 temp;
SysTick->LOAD=(u32)nms*168*1000;
SysTick->VAL=0x00;
SysTick->CTRL=SysTick_CTRL_ENABLE_Msk;
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL =0X00;
}
3.2 中断的方式