本帖最后由 dirtwillfly 于 2026-9-19 10:22 编辑
主要完成了开发环境搭建,并通过STM32CubeMX2生成工程,在vscode中实现了通过io中断控制led闪烁的功能。
讲解和演示见2楼视频。
主要代码:
定义按键状态全局变量:
- static volatile uint8_t g_button_enable = 0U;
LED IO初始化:
- static void led_gpio_init(void)
- {
- LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);
- hal_gpio_config_t gpio_init = {
- .mode = HAL_GPIO_MODE_OUTPUT,
- .pull = HAL_GPIO_PULL_NO,
- .speed = HAL_GPIO_SPEED_FREQ_LOW,
- .output_type = HAL_GPIO_OUTPUT_PUSHPULL,
- .alternate = HAL_GPIO_AF_0,
- .init_state = HAL_GPIO_PIN_RESET
- };
- HAL_GPIO_Init(HAL_GPIOA, HAL_GPIO_PIN_5, &gpio_init);
- }
按键IO及外部中断初始化:
- static void button_interrupt_init(void)
- {
- LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC);
- hal_gpio_config_t button_init = {
- .mode = HAL_GPIO_MODE_INPUT,
- .pull = HAL_GPIO_PULL_UP,
- .speed = HAL_GPIO_SPEED_FREQ_LOW,
- .output_type = HAL_GPIO_OUTPUT_PUSHPULL,
- .alternate = HAL_GPIO_AF_0,
- .init_state = HAL_GPIO_PIN_RESET
- };
- HAL_GPIO_Init(HAL_GPIOC, HAL_GPIO_PIN_13, &button_init);
- EXTI->EXTICR[3] = (EXTI->EXTICR[3] & ~(0xFU << 8U)) | (0x2U << 8U);
- EXTI->FTSR1 |= (1UL << 13U);
- EXTI->RTSR1 &= ~(1UL << 13U);
- EXTI->IMR1 |= (1UL << 13U);
- EXTI->FPR1 = (1UL << 13U);
- EXTI->RPR1 = (1UL << 13U);
- NVIC_SetPriority(EXTI13_IRQn, 2U);
- NVIC_EnableIRQ(EXTI13_IRQn);
- }
外部中断服务函数:
- void EXTI13_IRQHandler(void)
- {
- if ((EXTI->FPR1 & (1UL << 13U)) != 0U)
- {
- EXTI->FPR1 = (1UL << 13U);
- g_button_enable = (uint8_t)!g_button_enable;
- }
- }
LED控制业务逻辑:
- static void led_blink_test(void)
- {
- led_gpio_init();
- button_interrupt_init();
- uint32_t last_toggle_ms = 0U;
- HAL_GPIO_WritePin(HAL_GPIOA, HAL_GPIO_PIN_5, HAL_GPIO_PIN_RESET);
- while (1)
- {
- if (g_button_enable)
- {
- uint32_t now = HAL_GetTick();
- if ((now - last_toggle_ms) >= 500U)
- {
- last_toggle_ms = now;
- HAL_GPIO_TogglePin(HAL_GPIOA, HAL_GPIO_PIN_5);
- }
- }
- else
- {
- last_toggle_ms = HAL_GetTick();
- HAL_GPIO_WritePin(HAL_GPIOA, HAL_GPIO_PIN_5, HAL_GPIO_PIN_RESET);
- }
- }
- }
|