版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27312943/article/details/80225088
参考资料:《零死角玩转STM32F103-霸道》
1 Systick时钟简介
SysTick—系统定时器是属于CM3内核中的一个外设,内嵌在NVIC中。系统定时器是
一个 24bit 的向下递减的计数器,计数器每计数一次的时间为1/SYSCLK,一般我们设置系
统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生
一次中断,以此循环往复。
SysTick是属于CM3内核的外设,所以所有基于CM3内核的单片机都具有这个系
统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,
用于产生时基,维持操作系统的心跳
2 Systick寄存器介绍
SysTick系统定时器有4个寄存器
寄存器名称 | 寄存器描述 |
CTRL | Systick控制及状态寄存器 |
LOAD | Systick重装载数值寄存器 |
VAL | Systick当前数组寄存器 |
CALIB | Systick校准寄存器 |
3 软件设计
SysTick属于内核的外设,有关的寄存器定义和库函数都在内核相关的库文件core_cm3.h中
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 */
}
形参 ticks 用来设置重装载寄存器的值,最大不能超过重装载寄存器的值2的24次方,当重装载寄存器的值递减到0的时候产生中断,然后重装载寄存器的值又重新装载往下递减计数,以此循环往复。紧随其后设置好中断优先级,最后配置系统定时器的时钟等于 AHBCLK=72M,使能定时器和定时器中断,这样系统定时器就配置好了,一个库函数搞定。
4 Systick定时时间的计算
SystemFrequency /1000 1ms中断一次
SystemFrequency / 100000 10us中断一次
SystemFrequency / 1000000 1us中断一次
5 使用Systick编写简单的延时函数
延时微秒级函数
void SysTick_us( __IO uint32_t us)
{
uint32_t i;
SysTick_Config(SystemCoreClock/1000000);
for(i=0;i<us;i++)
{
while( !((SysTick->CTRL)&(1<<16)) );
}
//关闭Systick定时器
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}
延时毫秒级函数
void SysTick_ms(__IO uint32_t ms)
{
uint32_t i;
SysTick_Config(SystemCoreClock/1000);
for(i=0;i<ms;i++)
{
while( !((SysTick->CTRL)&(1<<16)) );
}
//关闭Systick定时器
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}
注意,由于Systick时钟设置了中断,所以要在stm32f10x_it.c中添加Systick的中断响应函数
void SysTick_Handler(void)
{
}
在中断响应函数中什么也不用做即可。
6 小结
之前一直不知道Systick时钟在初始化的时候配置了中断,没有添加中断响应函数。