×
单片机 > 单片机程序设计 > 详情

STM32-systick系统定时器

发布时间:2021-01-19 发布时间:
|

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>

//初始化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

{

//当计数器的值时间到了后,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--;

}

关键字:STM32  systick  系统定时器 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址