请问 STM32F407怎样实现500ns的延时呀, 我利用的是systick,修改其时钟源,可是运行结果不正确,代码如下: void delay_init(u8 SYSCLK) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); fac_500ns=SYSCLK/2; fac_us=SYSCLK; fac_ms=(u16)fac_us*1000; } void delay_x500ns(u32 x500ns) { u32 temp; SysTick->LOAD=x500ns*fac_500ns; 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; } 我将例程源码进行上面修改之后,delay延时函数不再能够实现精确延时,请问是哪个地方出了问题呢 |
{
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; //清空计数器
}
多谢~学习了