STM32之按键点亮LED灯(中断法)

本文介绍了一种使用STM32通过中断方式控制LED灯的方法,包括使用CubeMX生成代码、配置GPIO、编写中断服务函数及回调逻辑,并详细说明了按键和LED的管脚设置以及中断处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、操作思路

2、用CubeMX工具生成的代码——main的主函数

3、GPIO代码-----gpio.c

4、编写中断服务函数

5、用外部中断共用入口函数,来调用外部中断处理回调函数

6、编写外部中断处理回调函数(在这里编写项目设计的逻辑)

7、把上述的外部中断处理回调函数,放到main主函数中


中断(Interrupt)模式:
为了提高CPU的效率和使系统具有良好的实时性,可以采用中断控制I/O方式。采用中断方式CPU就不必花费大量时间去查询各外围设备的状态了。而是当外围设备需要请求服务时,向CPU发出中断请求(ARQ),CPU响应外围设备中断,停止执行当前程序,转去执行一个外围设备服务的程序,此服务程序称为中断服务处理程序,或称中断服务子程序。中断处理完毕,CPU又返回来执行原来的程序。
 

1、操作思路

输入(按键):
KEY1:PA0
KEY2:PA1


输出(LED灯):
LED1:PB8
LED2:PB9

2、用CubeMX工具生成的代码——main的主函数

#include "main.h"
#include "gpio.h"

void SystemClock_Config(void);  //因为这个函数在main函数中,如果想要使用这个函数,需要提前声明

int main(void)
{
  HAL_Init();                   //初始化HAL库
  SystemClock_Config();         //初始化系统时钟
  MX_GPIO_Init();               //初始化GPIO引脚口

void SystemClock_Config(void)   //配置系统时钟函数
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStru
### 使用STM32CubeMX配置按键控制LED #### 配置硬件资源 为了实现按键控制LED的功能,在STM32CubeMX中需完成如下操作: - **选择目标MCU**:启动STM32CubeMX并选取适合项目的微控制器型号,比如STM32F4系列中的某一款芯片[^1]。 - **使能时钟**:对于涉及的GPIO端口(假设为PE2, PE3用于按键输入;PF9, PF10作为LED输出),确保这些外设对应的APB2或AHB总线上的时钟已经被激活。这一步骤通常由STM32CubeMX自动生成初始化代码处理[^4]。 - **初始化引脚**: - 将PE2和PE3设定为外部中断/事件模式下的输入功能,以便检测按键状态变化。 - 把PF9和PF10设置成推挽输出类型,用来驱动连接到这两个管脚上的LED器件[^3]。 ```c // GPIO Initialization Function static void MX_GPIO_Init(void) { __HAL_RCC_GPIOD_CLK_ENABLE(); /* Configure button pins as input */ GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; // Rising edge interrupt mode GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); /* Configure LED pins as output */ GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); } ``` #### 编写软件逻辑 接下来定义当检测到特定按键按下时触发的动作函数: - 当任意一个按键被按压时,会触发相应的回调函数`HAL_GPIO_EXTI_Callback()`,在此处可以加入切换对应LED状态的语句。 ```c void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if (GPIO_Pin == GPIO_PIN_2){ // Check which pin triggered the callback static uint8_t ledState = 0; ledState ^= 1; // Toggle state between high and low HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, ledState ? GPIO_PIN_SET : GPIO_PIN_RESET); } else if (GPIO_Pin == GPIO_PIN_3){ static uint8_t ledState = 0; ledState ^= 1; HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, ledState ? GPIO_PIN_SET : GPIO_PIN_RESET); } } ``` 上述代码片段展示了如何利用STM32CubeMX生成的基础框架快速搭建起简单的按键LED应用实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值