Systick能做ns延时吗?

2019-07-20 15:21发布

void delay_init(uint8_t SYSCLK)
{

//        uint32_t reload;

    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//SysTick频率为HCLK
        fac_us=SYSCLK;                                                    //不论是否使用OS,fac_us都需要使用
}

void delay_us(uint32_t nus)
{               
        uint32_t ticks;
        uint32_t told,tnow,tcnt=0;
        uint32_t reload=SysTick->LOAD;                                //LOAD的值                        
        ticks=nus*fac_us;                                                 //需要的节拍数
        told=SysTick->VAL;                                        //刚进入时的计数器值
        while(1)
        {
                tnow=SysTick->VAL;       
                if(tnow!=told)
                {            
                        if(tnow<told)tcnt+=told-tnow;        //这里注意一下SYSTICK是一个递减的计数器就可以了.
                        else tcnt+=reload-tnow+told;            
                        told=tnow;
                        if(tcnt>=ticks)break;                        //时间超过/等于要延迟的时间,则退出.
                }  
        };
}

void delay_ms(uint16_t nms)
{
        uint32_t i;
        for(i=0;i<nms;i++) delay_us(1000);
}

原子哥的代码能改成ns延时吗?还是Systick定时器做不了ns延时?




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
taizonglai
1楼-- · 2019-07-20 20:53
 精彩回答 2  元偷偷看……
hyc747168998
2楼-- · 2019-07-21 01:22
zuozhongkai 发表于 2017-4-13 10:14
肯定做不了ns级别的延时!ns级别的频率都是1000MHZ了,也就是1G了。STM32最大也就H7的400M,你觉得能完成ns ...

TIM定时器可以做到吧?
461450651
3楼-- · 2019-07-21 07:07
 精彩回答 2  元偷偷看……
taizonglai
4楼-- · 2019-07-21 09:50
hyc747168998 发表于 2017-4-13 10:31
TIM定时器可以做到吧?

你去看一下定时器最大的时钟频率才多少?
正点原子
5楼-- · 2019-07-21 14:27
ns延时是个大概了。。。
调用一个函数,就近us了。。。

一周热门 更多>