[STM32WB] 【STM32WB09KE】学习记录四:外部中断学习

[复制链接]
 楼主| 聪聪哥哥 发表于 2024-11-25 20:03 | 显示全部楼层 |阅读模式
<
使用工具:keil5.38a  STM32cubeMx软件
1:中断知识的介绍:
STM32的每个IO都可以作为外部中断输入。STM32的中断控制器支持多个外部中断/事件请求:
Stm32的中断配置方式:每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。

中断的应用场景:
按钮/开关控制:当用户按下按钮或切换开关时,可以触发外部中断来响应用户的操作,例如控制LED的亮灭或执行特定功能。这种中断类型常用于用户界面交互,如按键控制设备启动、停止或切换模式。
传感器触发:当传感器检测到特定事件或条件发生时(如温度达到阈值、光线强度变化等),可以触发外部中断来及时处理传感器数据。这种中断类型在环境监测、工业自动化等领域有广泛应用。

2:中断的配置过程思路:
设置IO口与中断线的映射关系。
初始化线上中断,设置触发条件等。
配置中断分组(NVIC),并使能中断。
编写中断服务函数。
清除中断标志位

3:STM32cube 软件的配置过程:
3.1查看硬件原理图:


可以看到板载的用户按键分别使用PA0,PB5和PB14IO口,我们只需要在cube中配置其为中断模式,可以根据自身的需要配置上升沿触发、还是下降沿触发

可以配置 中断的模式:

只需要配置上图中的代码就可以了,然后直接电机生成代码:
  1. void MX_GPIO_Init(void)
  2. {

  3.   GPIO_InitTypeDef GPIO_InitStruct = {0};

  4.   /* GPIO Ports Clock Enable */
  5.   __HAL_RCC_GPIOB_CLK_ENABLE();
  6.   __HAL_RCC_GPIOA_CLK_ENABLE();
  7.   /* Enable SYSCFG clock */
  8.   __HAL_RCC_SYSCFG_CLK_ENABLE();
  9.   /*Configure GPIO pin Output Level */
  10.   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2|GPIO_PIN_1|GPIO_PIN_4, GPIO_PIN_SET);
  11.   /*Configure GPIO pins : PB2 PB4 */
  12.   GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_4;
  13.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  14.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  15.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  16.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  17.   /*Configure GPIO pin : PB1 */
  18.   GPIO_InitStruct.Pin = GPIO_PIN_1;
  19.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  20.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  21.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  22.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  23.   /*Configure GPIO pin : PA2 */
  24.   GPIO_InitStruct.Pin = GPIO_PIN_2;
  25.   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  26.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  27.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  28.   GPIO_InitStruct.Alternate = GPIO_AF7_SWDIO;
  29.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  30.   /*Configure GPIO pin : PA0 */
  31.   GPIO_InitStruct.Pin = GPIO_PIN_0;
  32.   GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  33.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  34.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  35.   /*Configure GPIO pin : PB5 */
  36.   GPIO_InitStruct.Pin = GPIO_PIN_5;
  37.   GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  38.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  39.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  40. }
编写中断处理函数如下:
  1. void HAL_GPIO_EXTI_Callback(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
  2. {
  3.   if (GPIO_Pin == GPIO_PIN_0)
  4.   {
  5.     /* Toggle LD1 */
  6.     HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
  7.   }
  8.   if (GPIO_Pin == GPIO_PIN_5)
  9.   {
  10.     /* Toggle LD1 */
  11.     HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2);
  12.   }
  13.   if (GPIO_Pin == GPIO_PIN_14)
  14.   {
  15.     /* Toggle LD1 */
  16.     HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_4);
  17.   }

  18. }
试验现象:按下板载的三个用户按键,可以控制对应LED灯电平的翻转。
在软件配置的时,需要注意配置好IO口的工作模式,使能中断功能,直接编写中断处理函数即可。
软件代码如下:
https://bbs.21ic.com/forum.php?mod=attachment&aid=MjMxOTk1OHw4N2QzMGZhNXwxNzU2MTEzNTczfDB8
yangjiaxu 发表于 2024-12-5 09:44 | 显示全部楼层
外部中断的话其实挺好用的,尤其是按键检测or唤醒等等,确实方便不少
B1lanche 发表于 2024-12-5 10:51 | 显示全部楼层
ST的外部中断还算是简单,配置方面没啥难度而且使用cubemx来配置的话更是简单
您需要登录后才可以回帖 登录 | 注册

本版积分规则

93

主题

231

帖子

1

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