在STM32中使用定时器实现延时

Implementing a delay using timers in STM32

简单地说,我想用stm32定时器实现一个延迟功能,就像AVR微控制器中的那样"Normal mode"。有人可以帮忙吗?我只是在 stm32 数据表中找不到它!它只支持PWM、输入捕捉、输出比较和单脉冲模式输出! N.B: 忘了说我用的是stm32F401单片机

为此,您有一个非常特殊的计时器,称为 SysTick。将其设置为每 1ms 溢出一次。在它的处理程序中

static volatile uint32_t counter;

void SysTick_Handler(void)
{
    counter++;
}

inline uint32_t __attribute__((always_inline)) GetCounter(void)
{
    return counter;
}

void Dealy(uint32_t ms)
{
  uint32_t tickstart = GetCounter();

  while((GetCounter() - tickstart) < ms);
}

如果您希望能够延迟小于毫秒的时间 您可以设置一个定时器来自动重新加载并使用内部时钟。 设置为定时器的内部时钟频率显示在立方体 MX 中 时钟选项卡。在我的 NUCLEO-F446RE 上,大多数定时器的频率为 84MHz 或 42MHz。

定时器 3 默认为 42 MHz。 因此,如果我将预分频器设置为 42 并将计数周期设置为最大值(0xFFFF 如果是 16 位)我将有一个每微秒改变一次的循环时钟。

然后我可以使用 属性 的二进制补码数学,简单地减去 旧时间从新时间取经。

void wait_us (int16_t delay) {
    int16_t t1= htim3.Instance->CNT;

    while (( htim3.Instance->CNT - t1 ) < delay) {
        asm ("\t nop"); 
    }
}

这是 PIC18 C 编码的老把戏