STM32只使用f4xx标准库写一个延时函数代码,使之可以完成流水灯控制
时间: 2024-12-06 11:22:32 浏览: 11
在STM32 F4系列单片机上编写一个简单的延时函数并利用它来控制流水灯,我们可以使用基础定时器(比如TIM4)和GPIO端口来实现。这里以TIM4为例,假设我们有一个GPIO端口用来驱动LED灯,以下是使用f4xx标准库创建延时函数以及控制流水灯的基本步骤:
```c
#include "stm32f4xx.h"
#include "stm32f4xx_tim.h"
// 定义延时宏,这里的单位是毫秒
#define DELAY_MS(ms) { \
static uint32_t start_time = 0; \
if (start_time == 0) { \
start_time = HAL_GetTick(); \
} else { \
while ((HAL_GetTick() - start_time) < (ms * 1000U)); \
} \
}
// 定义GPIO初始化函数
void GPIO_Init(void)
{
// 初始化GPIOA用于驱动LED灯
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 启动GPIOA时钟
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3; // LED灯连接到GPIOA的所有引脚
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 输出推挽
GPIO_InitStruct.Pull = GPIO_NOPULL; // 无拉力
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
// 流水灯控制函数
void Blink_Lights(uint8_t led_index)
{
GPIO_PinOutputSet(GPIOA, led_index); // 设置指定LED亮
DELAY_MS(500); // 延迟500ms
GPIO_PinOutput_Reset(GPIOA, led_index); // 熄灭LED
DELAY_MS(500); // 再次延迟500ms
}
int main(void)
{
GPIO_Init();
while (1)
{
for (uint8_t i = 0; i < 4; ++i) // 控制4个LED依次点亮
Blink_Lights(i);
}
return 0;
}
```
阅读全文