systick系统定时器
系统定时器存在内核中,是24位的定时器,只能向下递减,嵌套在NVIC中
counter 在时钟的驱动下 在reload的初值开始向下递减计时到0,产生中断置位标志然后又从reload值开始重新递减计数,循环
定时时间计算
t=reload*(1/clk)
clk=72M时,t=72*(1/72m)=1us
clk=72M时,t=72000*(1/72m)=1ms
clk=72M时,t=72000000*(1/72m)=1s
1s=1000MS =1000 000US=1000 000 000NS
sysTick属于内核中的外设,他的中断优先级和外设的中断优先级相比,哪个高?
sysTick中断优先级配置的是scb->shprx寄存器
而外设的中断配置的是NVIC->iprx,有优先级分组和抢占优先级和子优先级的说法。
中断优先级在内核外设同样适用。
systick的使能函数:
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
//判断tick的值是否大于2^24,如果大于,不符合规则
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);
//初始化reload寄存器的值
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
//配置中断优先级,配置为15,默认为最低优先级
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
//初始化counter的值为0
SysTick->VAL = 0;
//配置systick的时钟为72M
//使能中断
//使能systick
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}
编写微秒延时函数
void SysTick_Delay_us(uint32_t us)
{
uint32_t i;
SysTick_Config(72);
for(i=0;i<us;i++)
{
//当计数器的值时间到了后,CTRL寄存器位16会置1
while(!((SysTick->CTRL)&(1<<16)));
}
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}
利用中断来进行延时
void SysTick_Init(void)
{
if(SysTick_Config(SystemCoreClock/100000))
while(1);
}
void Delay_ms(__IO u32 nTime)
{
uint32_t TimingDelay;
TimingDelay = nTime;
while(TimingDelay!=0)
TimingDelay--;
}