代码实现
以下是一个基于STM32 HAL库的示例代码:
硬件初始化
c
#include "stm32f4xx_hal.h"
#define NUM_LEDS 4 // 假设有4个LED
// LED引脚和端口定义
GPIO_TypeDef* LED_PORT[NUM_LEDS] = {GPIOA, GPIOA, GPIOA, GPIOA};
const uint16_t LED_PIN[NUM_LEDS] = {GPIO_PIN_0, GPIO_PIN_1, GPIO_PIN_2, GPIO_PIN_3};
// 按键引脚和端口定义
#define BUTTON_PORT GPIOC
#define BUTTON_PIN GPIO_PIN_13
// 当前模式
volatile uint8_t mode = 0; // 0: 呼吸灯模式, 1: 流水灯模式
// 初始化GPIO
void GPIO_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 初始化LED引脚
GPIO_InitStruct.Pin = LED_PIN[0] | LED_PIN[1] | LED_PIN[2] | LED_PIN[3];
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 初始化按键引脚
GPIO_InitStruct.Pin = BUTTON_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);
// 启用按键中断
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}
|