STM32 纳秒级延时实现及测定

STM32 纳秒级延时 (ns delay) 的指令延时实现方式及测定

STM32的主频一般在几十到几百MHz,因此其时钟周期在纳秒级,如果要实现纳秒级延时,除了用定时器方式实现,可以用如下两种指令延时方式。但是需要注意,这两种方式不能直接表达延时的具体时长,随MCU的主频其延时时长会变化,需要经过测定方式来了解具体时长。

nop延时方式

通过nop指令可以实现一个空指令周期, 属于纳秒级延时,HAL库的实现方式:

__NOP();

实际上就是:

__ASM volatile ("nop")

移位延时方式

右移一位操作是各种计算过程里占用时间最少的操作,也是纳秒级,先定义一个变量:

uint32_t ns_delay = 0xffffffff;

然后在需要实现纳秒级延时的位置,实现延时:

ns_delay >>= 1;

延时测定

虽然单次纳秒级延时的时间不确定,但是可以通过多次叠加扩大延时到微秒级以上,并通过GPIO输出电平变化和示波器测试来确定微秒延时间隔,再将微秒延时间隔除以纳秒延时次数,得到纳秒延时时长。如:

uint32_t ns_delay = 0xffffffff;

while(1)
{
HAL_GPIO_WritePin(GPIOA,0, GPIO_PIN_SET);
ns_delay >>= 1;
ns_delay >>= 1;
ns_delay >>= 1;
ns_delay >>= 1;
ns_delay >>= 1;
ns_delay >>= 1;
ns_delay >>= 1;
ns_delay >>= 1;
ns_delay >>= 1;
ns_delay >>= 1;
//...continue 
HAL_GPIO_WritePin(GPIOA,0, GPIO_PIN_RESET);
ns_delay >>= 1;
ns_delay >>= 1;
ns_delay >>= 1;
ns_delay >>= 1;
ns_delay >>= 1;
ns_delay >>= 1;
ns_delay >>= 1;
ns_delay >>= 1;
ns_delay >>= 1;
ns_delay >>= 1;
//...continue 

}

通过示波器测出管脚输出对应的方波的半周期,这个半周期是多次纳秒级延时的叠加和一次管脚输出延时的组合,管脚输出延时的介绍参考: STM32 HAL us delay(微秒延时)的指令延时实现方式及优化 。所以从半周期减去管脚输出延时,再除以纳秒级延时次数,就得到纳秒级延时时长。

需要注意,上述纳秒级延时叠加部分,只能一条一条列出,不能采用循环语句实现,因为循环语句进行继续循环与否的判断也是要消耗指令周期,故此处不能偷懒。

–End–

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 纳秒级延时实现及测定

发表评论