1、systick配置库函数
//该函数的形参决定中断的时间
//SysTick_Config() 库函数主要配置了 SysTick 中的三个寄存器:LOAD、VAL 和 CTRL
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);
//由于是24位计数器,所以不能超过
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
//设置重装载寄存器
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
//设置中断优先级
SysTick->VAL = 0;
//设置当前数值寄存器
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
//设置系统时钟时钟源AHBCLK=72M
//使能定时器中断
//使能定时器
return (0); /* Function successful */
}
2、系统定时器的中断时间设置
计数器是向下计数,计数一次的时间 = 1 / 系统时钟;
当重装载寄存器中的数值计数到0时,将产生中断,进入void?SysTick_Handler(void)(中断服务函数);
默认系统时钟是72M,计数一次的时间= 1 / 72 000 000 秒
B = 设置的计数值
中断时间 = A * B
配置实例
/* SystemFrequency / 1000 ???1ms中断一次
?* SystemFrequency / 100000 ?10us中断一次
?* SystemFrequency / 1000000 1us中断一次
?*/
SysTick_Config(SystemCoreClock / 1000)//设置1ms中断一次,进入中断服务函数
3、系统定时器中断服务函数
系统定时器的中断标志位是自动清零的,不需要软件清零。
void SysTick_Handler(void)
{
/*
填写中断处理程序
*/
}
4、完整主函数实例
int main()
{
SysTick_Config(SystemCoreClock / 1000);
while(1)
{
}
}
//中断服务函数
void SysTick_Handler(void)
{
}
|