aicuicui 发表于 2019-9-8 10:53:54

STM32F407怎样编写ns级延时函数 以实现500ns延时

请问STM32F407(168Mhz)怎样编写ns级延时函数 可实现500ns延时

哀歌与世无争 发表于 2019-9-8 11:24:13

用个定时器配置分频21,就是8M,周期125ns
每次要延时保证从0开始计数,TIMx->CNT =0,使能定时器,
while(TIMx->CNT<4)判断计数值达到4,就是500ns了,再关闭定时器,下次要延时再使能

发表于 2019-9-8 20:36:57

for循环或者定时器。

aicuicui 发表于 2019-9-8 20:50:57

安 发表于 2019-9-8 20:36
for循环或者定时器。

您好 请问定时器具体怎样能够实现 可以大概跟我说一下么
我用定时器更新中断写过一次 由于进出中断加中断处理程序已经大于500ns 没能成功 请问可以怎样实现呢
下面是我使用中断的代码
void TIM2_IRQHandler(void)
{        
        if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
        {                                 
                TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
                counter_x500ns++;
        }          
}


void delay_x500ns(u16 x_500ns)
{
        counter_x500ns=0;
        while(x_500ns!=counter_x500ns);
}

定时器初始化为TIM2_Init(42-1,1-1); //500ns
delay使用为delay_x500ns(1);

mylovemcu 发表于 2019-9-9 08:02:32

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



aicuicui 发表于 2019-9-9 11:08:41

mylovemcu 发表于 2019-9-9 08:02
for循环或者滴答定时器

for循环也可以出500ns但是容易被其他中断打断不稳定


哇~多谢~

你若安好_清风徐来 发表于 2019-9-10 18:03:00

滴答咯 简单易懂
页: [1]
查看完整版本: STM32F407怎样编写ns级延时函数 以实现500ns延时