【问题标题】:Unreliable delay function for STM32STM32的不可靠延迟功能
【发布时间】:2021-10-05 01:19:05
【问题描述】:

我想为我的 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);
  }
}

【问题讨论】:

    标签: function delay stm32 clock


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的意见。 HAL延迟功能怎么样,靠谱吗?
    【解决方案2】:

    如果你使用的是 HAL,那为什么不使用 HAL_Delay(ms) 呢?

    【讨论】:

    • 这是一个合理的问题,问题是我不知道 HAL 有延迟功能。感谢您的意见。
    猜你喜欢
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2018-01-15
    相关资源
    最近更新 更多