我想实现一个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);
答案 0 :(得分:9)
由于@Mouin为您描述了这些步骤并且您已经在使用HAL,因此以下是如何执行这些步骤,以及使用ST Microelectronics提供的STM32CubeMX软件进行配置的方法。 (注意:建议浏览该链接,因为STM32系列有很多例子,例如STM32CubeF3包。)
因此,简单下载它,为STM32F3 Discovery板创建一个新项目。
在 Pinout 标签上,MCU将显示其所有引脚。只需单击一个引脚并选择所需的功能即可。在你的情况下{PA}引脚GPIO_EXTI2
:
现在切换到配置标签,在名为系统的最后一栏中,点击 GPIO按钮。可用选项如下图所示:
下一步是启用相应的中断。为此,请关闭引脚配置窗口,然后从系统列中单击 NVIC按钮。如果您还记得,在PA2上选择了 EXTI2 ,请勾选启用复选框 EXTI line2 。您也可以在此处设置优先级。
一切准备就绪,点击根据用户设置生成源代码按钮→。以下源文件将被生成:
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之间的链接。我希望我能给你一些帮助,你可以在互联网上搜索简洁的代码。