有啥办法可以在 STM32 CubeIDE 中以微秒为单位进行延迟?

Posted

技术标签:

【中文标题】有啥办法可以在 STM32 CubeIDE 中以微秒为单位进行延迟?【英文标题】:Is there any way to make a delay in microseconds in STM32 CubeIDE?有什么办法可以在 STM32 CubeIDE 中以微秒为单位进行延迟? 【发布时间】:2021-11-22 06:22:04 【问题描述】:

正如我所提到的,我需要延迟 30us 才能以正确的方式初始化我的传感器。

【问题讨论】:

延迟从哪里来?上电后?传感器上电后?进入主循环后?它必须正好是 30 微秒还是只是“一点时间”? uC 是否必须同时做任何事情,或者一个简单的sleep(1) 可以解决问题? 正确的方法是使用片上硬件外设倍,然后设置一个。或 RTC 外围设备(如果有)。 数据观察点触发(DWT 延迟)方法可以给我们造成延迟 【参考方案1】:

你只能用阻塞的方式来做:

#define SYSTICKCLOCK 120000000ULL
#define SYSTICKPERUS (SYSTICKCLOCK / 1000000UL)

// delay has to constant expression
static void inline __attribute__((always_inline)) delayus(unsigned delay)

    uint32_t ticks = SYSTICKPERUS * delay;
    uint32_t start_tick = SysTick -> VAL;

    while(SysTick -> VAL - start_tick < ticks);

当然,您需要定义 SYSTICKCLOCK 以匹配您的时钟设置。

【讨论】:

为什么说只能阻塞呢?如果你可以有一个 SysTick,你可以有一个 SysTick 回调 => 我找到了一个非阻塞方式。 @Max 30 micro 秒。 是的,有什么问题。我大部分时间都在使用 1us SysTick 回调,并且使用了更高精度的中断。 @Max 祝你好运 - 所以你的 uC 几乎只处理 systick。好的设计 :) 如果你的时钟低于 40Mhz,它将花费整个核心时间来处理 systick。很棒 您可以使用中断来产生“一次性”计时器,但是中断延迟会在一定程度上影响结果。当然,这取决于您运行的时钟速度。

以上是关于有啥办法可以在 STM32 CubeIDE 中以微秒为单位进行延迟?的主要内容,如果未能解决你的问题,请参考以下文章

STM32CubeIDE中文乱码

如何通过 STM32CubeIDE 将 ESP8266 Wifi 模块连接到 Firebase

STM32CubeIDE安装问题

可以在STM32CubeIDE中手动触发自动源代码格式化吗?

stm32cubeide调试窗口用不了

如何利用stm32cubeide的原有工程改写代码