HAL库 用结构体 操作五个led灯的 亮灭 程序
时间: 2024-10-04 19:01:52 浏览: 30
在STM32 HAL库(Hardware Abstraction Layer)环境下,操作五个LED灯的亮灭通常会更复杂一些,因为HAL提供了一系列高级API来简化硬件操作。首先,你需要在工程中包含必要的HAL库头文件,并初始化相关的GPIO模块。
1. 定义LED和GPIO结构体:
```c
typedef enum { LED_STATE_OFF, LED_STATE_ON } LedState;
typedef struct {
GPIO_TypeDef* gpioBase; // GPIO基地址
uint16_t gpioPin[5]; // LED对应的GPIO引脚数组
LedState state[5]; // LED状态数组
} LedCtrlStruct;
```
2. 配置GPIO和LED:
```c
static void initLedCtrl(LedCtrlStruct* ledCtrl) {
for (int i = 0; i < 5; i++) {
GPIO_InitTypeDef gpioInitStruct;
gpioInitStruct.Pin = ledCtrl->gpioPin[i];
gpioInitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 输出推挽模式
gpioInitStruct.Pull = GPIO_NOPULL; // 不接拉电流
gpioInitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速
HAL_GPIO_Init(ledCtrl->gpioBase, &gpioInitStruct);
ledCtrl->state[i] = LED_STATE_OFF;
}
}
```
3. 创建一个亮灭功能的函数:
```c
static void toggleLed(LedCtrlStruct* ledCtrl, int index) {
ledCtrl->state[index] = (ledCtrl->state[index] == LED_STATE_ON) ? LED_STATE_OFF : LED_STATE_ON;
HAL_GPIO_WritePin(ledCtrl->gpioBase, ledCtrl->gpioPin[index], ledCtrl->state[index]);
}
void blinkLeds(LedCtrlStruct* ledCtrl, uint8_t ledIndex, uint32_t period_ms) {
toggleLed(ledCtrl, ledIndex);
HAL_Delay(period_ms);
}
```
4. 主函数中使用:
```c
int main() {
LedCtrlStruct ledCtrl;
initLedCtrl(&ledCtrl);
while (1) {
for (int i = 0; i < 5; i++) {
blinkLeds(&ledCtrl, i, 500); // 闪烁周期500ms,你可以根据需要调整
}
}
}
```
阅读全文