STM23F407单片机编程中实现LED灯的流水灯效果的实验C语言代码
时间: 2024-11-05 07:24:01 浏览: 29
基于stm32单片机的流水灯设计
STM32F407单片机是一个基于ARM Cortex-M4内核的微控制器,要实现LED灯的流水灯效果,首先需要包含必要的头文件,设置GPIO功能以及定时器。以下是一个简单的C语言示例,使用TIM2定时器配合GPIOB实现8位流水灯:
```c
#include "stm32f4xx.h" // 包含STM32F4系列库
// 定义LED灯端口寄存器地址
#define LED_PORT GPIOB
#define LED_PIN_1 PB0
#define LED_PIN_2 PB1
#define LED_PIN_3 PB2
#define LED_PIN_4 PB3
#define LED_PIN_5 PB4
#define LED_PIN_6 PB5
#define LED_PIN_7 PB6
#define LED_PIN_8 PB7
// TIM2初始化函数
void TIM2_Init() {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 启动TIM2时钟
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Prescaler = 0; // 分频系数为1 (取决于系统时钟)
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 设置周期,如1000ms,减去1是因为计数从1开始
TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_COUNTERMODE_UP;
TIM_Init(TIM2, &TIM_TimeBaseStructure);
TIM_Cmd(TIM2, ENABLE); // 开启定时器
}
// 主循环函数,用于LED流水灯
void LED_Waterfall() {
static uint8_t led_index = 0; // 索引变量,控制LED点亮顺序
if (led_index >= 8) { // 当遍历完所有LED后回到第一个
led_index = 0;
}
GPIO_SetBits(LED_PORT, 1 << led_index); // 打开指定的LED
HAL_Delay(100); // 暂停一段时间,这里假设周期是100ms
GPIO_ResetBits(LED_PORT, 1 << led_index); // 关闭当前LED,点亮下一个
led_index++;
}
int main(void) {
TIM2_Init(); // 初始化定时器
while (1) {
LED_Waterfall(); // 运行流水灯程序
}
return 0;
}
阅读全文