aicuicui 发表于 2019-9-4 21:47:06

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延时函数不再能够实现精确延时,请问是哪个地方出了问题呢

mylovemcu 发表于 2019-9-9 14:39:19

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;       //清空计数器         
}

aicuicui 发表于 2019-9-9 19:49:26

mylovemcu 发表于 2019-9-9 14:39
void delay_init(u8 SYSCLK)//72
{            
      SysTick->CTRL&=0xfffffffb;//bit2清空,选择外 ...

多谢~学习了
页: [1]
查看完整版本: STM32怎样实现500ns延时