目录
SysTick 是一个 24 位的倒计数定时器,当计到 0 时,将从 RELOAD 寄存器中自动重装载定时初值。只要不把它在 SysTick 控制及状态寄存器中的使能位清除,就永不停息。常用来作延时,或者实时系统的心跳时钟,SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(15)中断优先级也可设置
四个寄存器控制Systick 定时器
SysTick控制及状态寄存器 CTRL
16 COUNTFLAG 如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为 1。如果读 取该位,该位将自动清零
2 CLKSOURCE R/W 0=外部时钟源(STCLK)1=内核时钟(FCLK)
1 TICKINT R/W 0 1=SysTick 倒数到 0 时产生 SysTick 异常请求 0=数到 0 时无动作
0 ENABLE R/W 0 SysTick 定时器的使能位
SysTick重装载数值寄存器 LOAD
23:0 RELOAD R/W 0 当倒数至零时,将被重装载的值
SysTick当前数值寄存器 VAL
23:0 CURRENT R/Wc 0 读取时返回当前倒计数的值,写它则使之清零,
同时还会清除在 SysTick 控制及状态寄存器中的COUNTFLAG 标志
库函数
时钟源选择函数
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)//时钟源选择函数
{
/* Check the parameters */
assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
{
SysTick->CTRL |= SysTick_CLKSource_HCLK;
}
else
{
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
}
}
SysTick结构体 (寄存器地址映射)
typedef struct
{
__IO uint32_t CTRL;
__IO uint32_t LOAD;
__IO uint32_t VAL;
__I uint32_t CALIB;
} SysTick_Type;
延时初始化
void delay_init()
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //时钟源72Mhz/8
fac_us=SystemCoreClock/8000000; //计数次数9
fac_ms=(u16)fac_us*1000;
#endif
}
systick初始化
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}
延时n us
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; // 装载初值
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; // 清空计数器
}
int main(void)
{
delay_init();
LED_Init();
while(1)
{
LED0=0;
LED1=1;
delay_ms(300);
LED0=1;
LED1=0;
delay_ms(300);
}
}