首页 > 解决方案 > STM32的不可靠延迟功能

问题描述

我想为我的 STM32 微控制器提供可靠的延迟功能,但我一直在使用的所有功能都不可靠。我现在使用的延迟功能大约有 5 秒的延迟,即使它应该是 1 秒。Keil中的时钟设置是否错误?简单的解决方案是将 1000 除以 5,但我想了解为什么我的代码不能正常工作。

#include "stm32f4xx_hal.h"


void configureLEDPins(void);
void delay_ms(uint16_t delay_ms);
void delay_us(uint32_t delay_us);

int main(void)
{
    
    configureLEDPins();
    
    while(1)
    {
        delay_ms(1000);
        HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
        
    
    }
    
}


void configureLEDPins(void)
{
     
    
    GPIO_InitTypeDef myLeds;
    myLeds.Mode = GPIO_MODE_OUTPUT_PP;
    myLeds.Pin = (GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15); 
    
    __HAL_RCC_GPIOD_CLK_ENABLE(); 
    HAL_GPIO_Init(GPIOD, &myLeds);
    
}

//Microsecond delay
void delay_us(uint32_t delay_us)
{
  volatile unsigned int num;
  volatile unsigned int t;


  for (num = 0; num < delay_us; num++)
  {
    t = 11;
    while (t != 0)
    {
      t--;
    }
  }
}
//Millisecond delay
void delay_ms(uint16_t delay_ms)
{
  volatile unsigned int num;
  for (num = 0; num < delay_ms; num++)
  {
    delay_us(1000);
  }
}

标签: functiondelaystm32clock

解决方案


这不是实现延迟功能的正确方法。的持续时间delay_us很大程度上取决于编译器、编译选项以及执行上下文(预取、流水线、中断等)。

正确的方法是使用 STM32 定时器之一,或 ARM Cortex Systick。有不同的使用方法,但最简单的方法(如果您有单线程且没有功耗问题)是设置和启动计时器并轮询适当的状态位。注意延迟功能中间可能发生的中断。


推荐阅读