使用STM32中的计时器实现延迟

时间:2018-12-25 15:41:30

标签: timer arm delay stm32 cortex-m

简而言之,我想使用stm32计时器实现延迟功能,就像AVR微控制器“正常模式”中的计时器一样。有人可以帮忙吗?我只是在stm32数据表中找不到它!它仅支持PWM,输入捕捉,输出比较和一脉冲模式输出! N.B:我忘了提到我正在使用stm32F401微控制器

2 个答案:

答案 0 :(得分:0)

为此您有一个非常特殊的计时器,称为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);
}

答案 1 :(得分:0)

如果您希望能够延迟短于毫秒的时间段 您可以将计时器设置为自动重载并使用内部时钟。 设置为计时器的内部时钟频率显示在立方体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编码的古老技巧