在不使用delay的情况下,重新编写上述代码
时间: 2024-10-21 15:15:54 浏览: 25
如果想要在不使用`delay_ms()`或其他外部库的情况下实现精确的时间控制,可以利用STM32的系统定时器功能。这里我们可以使用SysTick定时器。首先,你需要配置SysTick并设置中断周期,然后在中断服务函数(ISR)里处理延时。以下是重构后的代码:
```c
#include "stm32f4xx_hal.h"
#define SYSTICK_DELAY_TICKS 3000 // 3秒延迟对应的SysTick计数
static uint32_t sysTickDelayCount = SYSTICK_DELAY_TICKS;
void SysTick_IRQHandler(void) {
if (HAL_GetTick() >= sysTickDelayCount) {
HAL_IncTick(); // 更新当前时间戳
sysTickDelayCount = SYSTICK_DELAY_TICKS; // 重置计数,开始下一轮延时
} else {
sysTickDelayCount -= HAL_GetTick(); // 递减计数直到到达预期时间点
}
}
void led_flash SysTick_Config(void) {
// 配置SysTick定时器
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000); // 设置一个大约每千微妙触发一次
HAL_NVIC_EnableIRQ(SysTick_IRQn); // 开启SysTick中断
}
int main(void) {
ledFlash(); // 调用新的led_flash函数
while (1); // 主循环,防止程序结束
}
void led_flash(void) {
GPIO_InitTypeDef gpio_init;
GPIO_Init(ledPort, &gpio_init);
for (;;) {
GPIO_SetBits(ledPort, ledPin);
SysTick_IRQHandler(); // 触发延时
GPIO_ResetBits(ledPort, ledPin);
}
}
```
在这个版本中,我们在主函数外定义了一个`ledFlash`函数,并在`main`里调用。另外,我们新增了`SysTick_Config`函数来配置SysTick,并在`led_flash`函数里直接调用`SysTick_IRQHandler`来代替原本的延时。
阅读全文