[STM32C5] STM32C5开发板体验-基础实验

[复制链接]
16|1
dirtwillfly 发表于 2026-9-19 08:16 | 显示全部楼层 |阅读模式
本帖最后由 dirtwillfly 于 2026-9-19 10:22 编辑


主要完成了开发环境搭建,并通过STM32CubeMX2生成工程,在vscode中实现了通过io中断控制led闪烁的功能。
讲解和演示见2楼视频。

主要代码:
定义按键状态全局变量:
  1. static volatile uint8_t g_button_enable = 0U;


LED IO初始化:
  1. static void led_gpio_init(void)
  2. {
  3.   LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);

  4.   hal_gpio_config_t gpio_init = {
  5.     .mode = HAL_GPIO_MODE_OUTPUT,
  6.     .pull = HAL_GPIO_PULL_NO,
  7.     .speed = HAL_GPIO_SPEED_FREQ_LOW,
  8.     .output_type = HAL_GPIO_OUTPUT_PUSHPULL,
  9.     .alternate = HAL_GPIO_AF_0,
  10.     .init_state = HAL_GPIO_PIN_RESET
  11.   };

  12.   HAL_GPIO_Init(HAL_GPIOA, HAL_GPIO_PIN_5, &gpio_init);
  13. }


按键IO及外部中断初始化:
  1. static void button_interrupt_init(void)
  2. {
  3.   LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC);

  4.   hal_gpio_config_t button_init = {
  5.     .mode = HAL_GPIO_MODE_INPUT,
  6.     .pull = HAL_GPIO_PULL_UP,
  7.     .speed = HAL_GPIO_SPEED_FREQ_LOW,
  8.     .output_type = HAL_GPIO_OUTPUT_PUSHPULL,
  9.     .alternate = HAL_GPIO_AF_0,
  10.     .init_state = HAL_GPIO_PIN_RESET
  11.   };

  12.   HAL_GPIO_Init(HAL_GPIOC, HAL_GPIO_PIN_13, &button_init);

  13.   EXTI->EXTICR[3] = (EXTI->EXTICR[3] & ~(0xFU << 8U)) | (0x2U << 8U);
  14.   EXTI->FTSR1 |= (1UL << 13U);
  15.   EXTI->RTSR1 &= ~(1UL << 13U);
  16.   EXTI->IMR1 |= (1UL << 13U);
  17.   EXTI->FPR1 = (1UL << 13U);
  18.   EXTI->RPR1 = (1UL << 13U);

  19.   NVIC_SetPriority(EXTI13_IRQn, 2U);
  20.   NVIC_EnableIRQ(EXTI13_IRQn);
  21. }


外部中断服务函数:
  1. void EXTI13_IRQHandler(void)
  2. {
  3.   if ((EXTI->FPR1 & (1UL << 13U)) != 0U)
  4.   {
  5.     EXTI->FPR1 = (1UL << 13U);
  6.     g_button_enable = (uint8_t)!g_button_enable;
  7.   }
  8. }


LED控制业务逻辑:
  1. static void led_blink_test(void)
  2. {
  3.   led_gpio_init();
  4.   button_interrupt_init();

  5.   uint32_t last_toggle_ms = 0U;

  6.   HAL_GPIO_WritePin(HAL_GPIOA, HAL_GPIO_PIN_5, HAL_GPIO_PIN_RESET);

  7.   while (1)
  8.   {
  9.     if (g_button_enable)
  10.     {
  11.       uint32_t now = HAL_GetTick();
  12.       if ((now - last_toggle_ms) >= 500U)
  13.       {
  14.         last_toggle_ms = now;
  15.         HAL_GPIO_TogglePin(HAL_GPIOA, HAL_GPIO_PIN_5);
  16.       }
  17.     }
  18.     else
  19.     {
  20.       last_toggle_ms = HAL_GetTick();
  21.       HAL_GPIO_WritePin(HAL_GPIOA, HAL_GPIO_PIN_5, HAL_GPIO_PIN_RESET);
  22.     }
  23.   }
  24. }



 楼主| dirtwillfly 发表于 2026-9-19 08:18 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎进入TI MCU论坛      21ic TI技术交流1群:61549143(已满),  21ic TI技术交流2群:311421422 我的博客:http://blog.timcu.com/

1222

主题

35215

帖子

1122

粉丝
快速回复 在线客服 返回列表 返回顶部
0