function - 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);
}
}
解决方案
这不是实现延迟功能的正确方法。的持续时间delay_us
很大程度上取决于编译器、编译选项以及执行上下文(预取、流水线、中断等)。
正确的方法是使用 STM32 定时器之一,或 ARM Cortex Systick。有不同的使用方法,但最简单的方法(如果您有单线程且没有功耗问题)是设置和启动计时器并轮询适当的状态位。注意延迟功能中间可能发生的中断。
推荐阅读
- python - 无法在 MacOS 上从 Python 3.7.6 更新到 3.9(或任何高于 3.7.6 的版本)
- python - Python pdb 在没有断点的行处停止
- python - 如何使用 JINJA2、Python 和 HTML 创建电子邮件
- algorithm - 从列表末尾删除第 N 个节点 LeetCode
- python - ValueError:具有多个元素的数组的真值不明确。尝试找到最大值时会出现使用 a.any() 或 a.all()
- c++ - 我可以在 Qt Creator 中调试 com 服务器吗?
- sql - 如何删除此 NULLS 并将用户的日期放在同一行
- java - 在 Java 中检查值类型
- html - 使用 microsoft graph 在 onedrive 上显示/编辑文件
- rest - 在 SAP 数据服务中使用 REST Web 服务