for循环或者滴答定时器
for循环也可以出500ns 但是容易被其他中断打断 不稳定
配置滴答定时器可以实现ns级延时
void delay_init(u8 SYSCLK) //72
{
SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟 STCLK = HCLK/8= 21M/s
fac_us=SYSCLK/8;// SYSCLK为168,所以fac_us为21
fac_ms=(u16)fac_us*1000;
}
//nus最小是50 时钟是21MHz 所以时钟最小分割是47ns
void delay_us(u32 ns)
{
u32 temp;
SysTick->LOAD=ns*fac_us/1000; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
|