打印
[STM32WB]

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

[复制链接]
1358|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
聪聪哥哥|  楼主 | 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中配置其为中断模式,可以根据自身的需要配置上升沿触发、还是下降沿触发

可以配置 中断的模式:

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

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  /* Enable SYSCFG clock */
  __HAL_RCC_SYSCFG_CLK_ENABLE();
  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2|GPIO_PIN_1|GPIO_PIN_4, GPIO_PIN_SET);
  /*Configure GPIO pins : PB2 PB4 */
  GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_4;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  /*Configure GPIO pin : PB1 */
  GPIO_InitStruct.Pin = GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  /*Configure GPIO pin : PA2 */
  GPIO_InitStruct.Pin = GPIO_PIN_2;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.Alternate = GPIO_AF7_SWDIO;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  /*Configure GPIO pin : PA0 */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  /*Configure GPIO pin : PB5 */
  GPIO_InitStruct.Pin = GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}
编写中断处理函数如下:
void HAL_GPIO_EXTI_Callback(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
  if (GPIO_Pin == GPIO_PIN_0)
  {
    /* Toggle LD1 */
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
  }
  if (GPIO_Pin == GPIO_PIN_5)
  {
    /* Toggle LD1 */
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2);
  }
  if (GPIO_Pin == GPIO_PIN_14)
  {
    /* Toggle LD1 */
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_4);
  }

}
试验现象:按下板载的三个用户按键,可以控制对应LED灯电平的翻转。
在软件配置的时,需要注意配置好IO口的工作模式,使能中断功能,直接编写中断处理函数即可。
软件代码如下:
https://bbs.21ic.com/forum.php?mod=attachment&aid=MjMxOTk1OHxkZWJlOGNjNGE2ZDlmNWY3OGI2NDQ0Njc0MDNmMDdjY3wxNzMzODI5OTgz&request=yes&_f=.zip

使用特权

评论回复
沙发
yangjiaxu| | 2024-12-5 09:44 | 只看该作者
外部中断的话其实挺好用的,尤其是按键检测or唤醒等等,确实方便不少

使用特权

评论回复
板凳
B1lanche| | 2024-12-5 10:51 | 只看该作者
ST的外部中断还算是简单,配置方面没啥难度而且使用cubemx来配置的话更是简单

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

101

帖子

0

粉丝