systick系统定时器
系统定时器存在内核中,是24位的定时器,只能向下递减,嵌套在NVIC中
counter 在时钟的驱动下 在reload的初值开始向下递减计时到0,产生中断置位标志然后又从reload值开始重新递减计数,循环
定时时间计算
t=reload*(1/clk)clk=72M时,t=72*(1/72m)=1usclk=72M时,t=72000*(1/72m)=1msclk=72M时,t=72000000*(1/72m)=1s1s=1000MS=1000000US=1000000000NS
sysTick属于内核中的外设,他的中断优先级和外设的中断优先级相比,哪个高?
sysTick中断优先级配置的是scb->shprx寄存器
而外设的中断配置的是NVIC->iprx,有优先级分组和抢占优先级和子优先级的说法。
中断优先级在内核外设同样适用。
systick的使能函数:
static__INLINEuint32_tSysTick_Config(uint32_tticks) { //判断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的值为0SysTick->VAL=0; //配置systick的时钟为72M//使能中断//使能systickSysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk|SysTick_CTRL_TICKINT_Msk|SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */return (0); /* Function successful */}
编写微秒延时函数
voidSysTick_Delay_us(uint32_tus) { uint32_ti; SysTick_Config(72); for(i=0;i<us;i++) { //当计数器的值时间到了后,CTRL寄存器位16会置1while(!((SysTick->CTRL)&(1<<16))); } SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; }
利用中断来进行延时
voidSysTick_Init(void) { if(SysTick_Config(SystemCoreClock/100000)) while(1); } voidDelay_ms(__IOu32nTime) { uint32_tTimingDelay; TimingDelay=nTime; while(TimingDelay!=0) TimingDelay--; }