STM32怎样实现500ns延时
请问 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延时函数不再能够实现精确延时,请问是哪个地方出了问题呢
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; //清空计数器
} mylovemcu 发表于 2019-9-9 14:39
void delay_init(u8 SYSCLK)//72
{
SysTick->CTRL&=0xfffffffb;//bit2清空,选择外 ...
多谢~学习了
页:
[1]