首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现STM32F3 -中断

实现STM32F3 -中断
EN

Stack Overflow用户
提问于 2016-10-15 17:55:44
回答 2查看 11.6K关注 0票数 10

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

我已经知道如何写引脚,但不会更多,请考虑到我对c或编程微控制器一无所知。

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

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-16 00:32:01

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

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

  1. 引脚输出选项卡上,将显示MCU及其所有引脚。只需单击引脚并选择所需的功能即可。在您的案例中,GPIO_EXTI2 on PA2引脚:

现在切换到do Configuration选项卡,在名为

  1. 的最后一列中,单击GPIO按钮。可用选项如下图所示:

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

一切就绪,单击Generate source code based on user settigns按钮→

。将生成以下源文件:

Gpio.c中的GPIO配置:

代码语言:javascript
复制
  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中的中断服务例程:

代码语言:javascript
复制
/**
* @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处理程序,如果一切正常,将调用以下回调函数。你必须在这里写你的处理程序代码。

代码语言:javascript
复制
/**
* @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中。

如果您想了解更多关于单片机的信息,请打开reference manual并阅读GPIO和NVIC部分,以了解如何在寄存器级别完成此操作。

票数 22
EN

Stack Overflow用户

发布于 2016-10-15 22:06:02

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

代码语言:javascript
复制
CPU +------+ Interrupt Vector (NVIC) +--------+ Peripheral

在外围设备方面:您必须配置您等待的事件类型:例如,GPIO上的上升沿,定时器ticks...besides您必须告诉您的外围设备在此事件发生时通知NVIC。

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

如果您这样做正确,一旦中断发生,CPU将执行ISR。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40057581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档