STM32F3 Discovery - 实现 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);
通常在谈论中断时,有 2 个主要的配置要点:
CPU +------+ Interrupt Vector (NVIC) +--------+ Peripheral
在外围设备方面:您必须配置您正在等待的事件类型:例如 GPIO 上的上升沿、定时器滴答......此外,您必须告诉您的外围设备一旦发生这种情况就通知 NVIC事件发生
在中断向量端:CPU 将通过中断向量的方式得到通知,所以在这里,基本上,您必须配置中断的优先级和要执行的 ISR。
如果您正确执行此操作,CPU 将在中断发生后执行 ISR。
在你的代码中没有NVIC的配置,你也忘记了NVIC和GPIO之间的link。我希望我能给你一些帮助,你可以在互联网上搜索简洁的代码。
由于@Mouin 已经为您描述了步骤,并且您已经在使用HAL,下面是如何执行这些步骤,因此使用ST Microelectronics 提供的STM32CubeMX 软件进行配置的方法。 (注意:建议浏览 link,因为有很多 STM32 系列的示例,例如 STM32CubeF3 封装。)
所以简单下载它,为STM32F3探索板创建一个新项目。
在 Pinout 选项卡上,将显示 MCU 及其所有引脚。只需单击图钉和 select 您想要的功能。在你的情况下 GPIO_EXTI2
在 PA2 引脚上:
现在切换到 Configuration 选项卡,并在名为 System 的最后一列中,单击 GPIO 按钮。可用选项如下图所示:
下一步是启用相应的中断。为此,请关闭 Pin Configuration window 并从 System 列中单击 NVIC 按钮。如果您还记得,EXTI2 已在 PA2 上选择,因此请勾选 EXTI line2 的 Enable 复选框。您也可以在这里设置优先级。
一切就绪,点击根据用户设置生成源代码按钮→。将生成以下源文件:
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 部分以了解它是如何在寄存器级别完成的。
我想实现一个 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 个主要的配置要点:
CPU +------+ Interrupt Vector (NVIC) +--------+ Peripheral
在外围设备方面:您必须配置您正在等待的事件类型:例如 GPIO 上的上升沿、定时器滴答......此外,您必须告诉您的外围设备一旦发生这种情况就通知 NVIC事件发生
在中断向量端:CPU 将通过中断向量的方式得到通知,所以在这里,基本上,您必须配置中断的优先级和要执行的 ISR。
如果您正确执行此操作,CPU 将在中断发生后执行 ISR。
在你的代码中没有NVIC的配置,你也忘记了NVIC和GPIO之间的link。我希望我能给你一些帮助,你可以在互联网上搜索简洁的代码。
由于@Mouin 已经为您描述了步骤,并且您已经在使用HAL,下面是如何执行这些步骤,因此使用ST Microelectronics 提供的STM32CubeMX 软件进行配置的方法。 (注意:建议浏览 link,因为有很多 STM32 系列的示例,例如 STM32CubeF3 封装。)
所以简单下载它,为STM32F3探索板创建一个新项目。
在 Pinout 选项卡上,将显示 MCU 及其所有引脚。只需单击图钉和 select 您想要的功能。在你的情况下
GPIO_EXTI2
在 PA2 引脚上:现在切换到 Configuration 选项卡,并在名为 System 的最后一列中,单击 GPIO 按钮。可用选项如下图所示:
下一步是启用相应的中断。为此,请关闭 Pin Configuration window 并从 System 列中单击 NVIC 按钮。如果您还记得,EXTI2 已在 PA2 上选择,因此请勾选 EXTI line2 的 Enable 复选框。您也可以在这里设置优先级。
一切就绪,点击根据用户设置生成源代码按钮→
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 部分以了解它是如何在寄存器级别完成的。