STM32F103 SystemTick和delay的应用
24位的倒计数定时器,计数到0,产生一次中断,从LOAD寄存器中自动重装载,就这样永不停息。
与之相关的四个寄存器:
LOAD自动重装载值
VAL当前值寄存器
CALIB校准值寄存器
CTRL控制和状态
外部时钟源是HCLK(AHB时钟总线)的1/8.
内核时钟是HCLK时钟。
配置函数SysTick_CLKSourceConfig();
SysTick_Config(uint32_t ticks);
中断服务函数
void SysTick_Handler();
无OS的情况下,delay相关函数的说明
首先定义2个全局变量
static u8 fac_us=0; //
static u16 fac_ms=0;
含义是延时1个us或者ms需要的tick数
因为AHB时钟频率是72MHz,意味着1秒钟有72M个节拍,一个节拍的时间为1/72M 秒
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
fac_us=SystemCoreClock/8000000;
fac_ms=(u16)fac_us*1000;
system tick时钟源为HCLK的1/8分频,意味着时钟频率是9MHz。一个tick时间1/9M 秒=1/9 us
所以一个us需要9个tick,一个ms需要9×1000个tick。
void delay_us(u32 nus) { u32 temp; SysTick->LOAD=nus*fac_us; SysTick->VAL=0x00; SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; do { temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16))); // SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; // SysTick->VAL =0X00; // }
注意:倒计时为0的时候,SysTick->CTRL的COUNTFLAG(第16位)就会为1
dowhile循环终止。