【问题标题】:STM32F3 Discovery - Implement GPIO-InterruptSTM32F3 发现 - 实现 GPIO 中断
【发布时间】:2017-02-24 17:41:11
【问题描述】:

我想实现一个 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);

【问题讨论】:

    标签: c arm microcontroller interrupt stm32


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      所以简单地下载它,为 STM32F3 探索板创建一个新项目。

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

      2. 现在切换到Configuration标签,在最后一列System中,点击GPIO按钮。可用选项如下图所示:

      3. 下一步是启用相应的中断。为此,请关闭 Pin 配置 窗口并在 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 的更多信息,请打开 reference manual 并阅读 GPIO 和 NVIC 部分以了解它是如何在寄存器级别完成的。

      猜你喜欢
      • 2021-11-08
      • 2013-09-11
      • 2021-07-07
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      相关资源
      最近更新 更多