1.SysTick 简介
SysTick
—系统定时器是属于
CM3
内核中的一个外设,内嵌在
NVIC
中。系统定时器
是一个
24bit
的向下递减的计数器,计数器每计数一次的时间为
1/SYSCLK
,一般我们设置
系统时钟 SYSCLK 等于 72M
。
当重装载数值寄存器的值递减到 0 的时候,系统定时器就产
生一次中断,以此循环往复。
因为
SysTick
是属于
CM3
内核的外设,所以所有基于
CM3
内核的单片机都具有这个
系统定时器,使得软件在
CM3
单片机中可以很容易的移植。系统定时器一般用于操作系统,
用于产生时基,维持操作系统的心跳。
SysTick寄存器结构体
在固件库文件 : core_cm3.h中定义
STM32里面无论是内核还是外设都是使用4个二进制位来表示中断优先级
中断优先级的分组对内核外设同样适用。
1.编写一个微秒延时函数
2.编写一个毫秒延时函数
#include "systick.h"
#include "core_cm3.h"
#if 0
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
//判断tick的值是否大于2^24,如果大于,则不符合规则
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
//初始化reload寄存器
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
//配置中断优先级,配置为15,默认为最低的优先级 /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
//初始化counter的值为0
SysTick->VAL = 0; /* Load the SysTick Counter Value */
//配置systick的时钟为72M
//使能中断
//使能定时器
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}
#endif
void SysTick_Delay_us(uint32_t us)
{
int i;
SysTick_Config(72);
for(i=0;i<us;i++)
{
while( !(( SysTick->CTRL) & (1<<16)) );
}
SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
}
void SysTick_Delay_ms(uint32_t ms)
{
int i;
SysTick_Config(72000);
for(i=0;i<ms;i++)
{
while( !(( SysTick->CTRL) & (1<<16)) );
}
SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
}
while( !((SysTick->CTRL) & (1<<16)) ); //SysTick->CTRL的第16位(COUNTFLAG)是否为1,如果条件(!((SysTick->CTRL) & (1<<16)) )为假
等待SysTick向下计时到0,第16位会置1
定时时间到了!!!
失能!