繁体   English   中英

STM32F3 发现 - 实现 GPIO 中断

[英]STM32F3 Discovery - Implement GPIO-Interrupt

我想实现一个 GPIO 中断,但我不知道如何实现,我也没有找到真正的示例或解释。

我已经知道如何写入 Pins,但不多,请考虑我对 c 或编程微控制器没有任何了解。

一个简单的例子或解释会对我有很大帮助。 以下代码是我已有的,但我不确定这是否正确。

GPIO_InitTypeDef   GPIO_InitStructure;
GPIO_InitStructure.Pin = GPIO_PIN_2;
GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStructure.Pull = GPIO_PULLUP;
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;

HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);

由于@Mouin 已经为您描述了这些步骤并且您已经在使用 HAL,这里是如何执行这些步骤,因此使用 ST Microelectronics 提供的STM32CubeMX软件对其进行配置的方法。 (注意:建议浏览该链接,因为 STM32 系列有很多示例,例如 STM32CubeF3 包。)

因此,简要下载它,为 STM32F3 探索板创建一个新项目。

  1. Pinout选项卡上,将显示 MCU 及其所有引脚。 只需单击一个引脚并选择您想要的功能。 在您的情况下,PA2 引脚上的GPIO_EXTI2

    在此处输入图片说明

  2. 现在切换到配置选项卡,并在名为System的最后一列中,单击GPIO 按钮 可用选项如下图所示:

    在此处输入图片说明

  3. 下一步是使能相应的中断。 为此,请关闭Pin Configuration窗口并从System列中单击NVIC 按钮 如果您还记得,已在 PA2 上选择了EXTI2 ,因此请勾选EXTI line2启用复选框 您也可以在此处设置优先级。

    在此处输入图片说明


一切就绪,点击Generate source code based on user settigns按钮 → 在此处输入图片说明 . 将生成以下源文件:

在此处输入图片说明

gpio.c 中的 GPIO 配置:

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __GPIOA_CLK_ENABLE();

  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;

  /*Configure GPIO pin : PA2 */
  GPIO_InitStruct.Pin = GPIO_PIN_2;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI2_TSC_IRQn, 0, 0); // <--- This and
  HAL_NVIC_EnableIRQ(EXTI2_TSC_IRQn); // <--- this are what were missing for you.

stm32f3xx_it.c 中的中断服务程序:

/**
* @brief This function handles EXTI line2 and Touch Sense controller.
*/
void EXTI2_TSC_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI2_TSC_IRQn 0 */

  /* USER CODE END EXTI2_TSC_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
  /* USER CODE BEGIN EXTI2_TSC_IRQn 1 */

  /* USER CODE END EXTI2_TSC_IRQn 1 */
}

这是触发中断时将调用的内容,它将调用 GPIO2 的 IRQ 处理程序,如果一切正常,将调用以下回调。 您必须在此处编写处理程序代码。

/**
* @brief Interrupt callback for GPIOs
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if ( GPIO_Pin == GPIO_PIN_2)
    {
        // Write your code here
    }
}

您必须手动添加前一部分(回调),它只有一个弱声明,但不会生成。 您可以将它放在 stm32f3xx_it.c 中。


如果您想了解有关 MCU 的更多信息,请打开参考手册并阅读 GPIO 和 NVIC 部分以了解它是如何在寄存器级别完成的。

通常,在谈论中断时,需要配置 2 个主要内容:

CPU +------+ Interrupt Vector (NVIC) +--------+ Peripheral

在外设方面:您必须配置您正在等待的事件类型:例如 GPIO 的上升沿、计时器滴答声......此外,一旦发生此事件,您必须告诉外设通知 NVIC

在中断向量方面:CPU 将通过中断向量得到通知,所以在这里,基本上,您必须配置中断的优先级和要执行的 ISR。

如果您正确执行此操作,一旦发生中断,CPU 将执行 ISR。

在您的代码中没有 NVIC 的配置,您也忘记了 NVIC 和 GPIO 之间的链接。 我希望我能给你一些帮助,你可以在互联网上搜索简洁的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM