Cortex-M3内核处理器有个systick 24位倒计时守时器,当计数到0时,从头装载初值.
delay_init(u8 SYSCLK) //守时初始化函数剖析
{
Systick->CTRL&=0xfffffffb; //bit2清空,挑选外部时钟 HCLK/8
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}
摘自STM32手册
6.2.6
Systick时钟那里来?
Systick时钟由体系时钟8分频后决议.
解析delay_us(u32 nus)函数
void delay_us(u32 nus)
{
u32 temp;
Systick->LOAD=nus*fac_us; //装入守时值
Systick->VAL=0x00; //清空计数器值
Systick->CTRL=0x01; //敞开倒计时守时器
do
{
temp=Systick->CTRL; //守时器状况赋给变量
}while((temp&0x01)&&(temp&(1<<16))); //判别敞开和是否计数到了0 (抵达设定值)
Systick->CTRL=0x00; //封闭守时
Systick->VAL=0x00; //清空计数值
}
守时1us剖析:
由于Systick时钟设置为是体系时钟的8分频 ,假定SYSCLK=72M 则Systick=9MHZ
由于fac_us是基数无单位
fac_us=SYSCLK/8; 即72/8=9 则Systick->LOAD=nus*fac_us, 假定守时1us 则Systick->LOAD=9.
由于Systick是9M的速度倒计时 所以9个计数时刻为9*(1/9M) 便是1us
有必要确保nus<=(2^24)/fac_us 编程实例: I/O口输出500us方波

delay_ms(u16 nms)函数剖析: