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–