STM32F3发现 - 实现GPIO中断

时间:2016-10-15 09:55:44

标签: c arm microcontroller interrupt stm32

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

2 个答案:

答案 0 :(得分:9)

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

因此,简单下载它,为STM32F3 Discovery板创建一个新项目。

  1. Pinout 标签上,MCU将显示其所有引脚。只需单击一个引脚并选择所需的功能即可。在你的情况下{PA}引脚GPIO_EXTI2

    enter image description here

  2. 现在切换到配置标签,在名为系统的最后一栏中,点击 GPIO按钮。可用选项如下图所示:

    enter image description here

  3. 下一步是启用相应的中断。为此,请关闭引脚配置窗口,然后从系统列中单击 NVIC按钮。如果您还记得,在PA2上选择了 EXTI2 ,请勾选启用复选框 EXTI line2 。您也可以在此处设置优先级。

    enter image description here

  4. 一切准备就绪,点击根据用户设置生成源代码按钮→enter image description here。以下源文件将被生成:

    enter image description here

    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部分,了解它是如何在寄存器级别完成的。

答案 1 :(得分:4)

通常,在谈论中断时,有两件事要配置:

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

在外围设备方面:你必须配置你正在做什么样的事件:例如GPIO的上升沿,计时器滴答......除了你必须告诉你的外围设备通知NVIC一次这件事发生了

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

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

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