Mei*_*els 5 c microcontroller arm 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);
Run Code Online (Sandbox Code Playgroud)
Ben*_*ics 13
由于@Mouin已经为您描述了这些步骤,并且您已经在使用HAL,以下是如何执行这些步骤,因此使用ST Microelectronics提供的STM32CubeMX软件进行配置.(注意:建议浏览该链接,因为STM32系列有很多例子,例如STM32CubeF3包.)
因此,简单下载它,为STM32F3 Discovery板创建一个新项目.
在Pinout选项卡上,MCU将显示其所有引脚.只需单击一个引脚并选择所需的功能即可.在您的GPIO_EXTI2PA2引脚的情况下:
现在切换到" 配置"选项卡,在名为" 系统"的最后一列中,单击" GPIO"按钮.可在以下图片中看到可用选项:
下一步是启用相应的中断.为此,请关闭" 引脚配置"窗口,然后从" 系统"列中单击NVIC按钮.如果你还记得,在EXTI2已被选上PA2所以勾选启用复选框为EXTI 2号线.您也可以在此处设置优先级.
一切准备就绪,点击基于用户设置按钮生成源代码 →
.以下源文件将生成:
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.
Run Code Online (Sandbox Code Playgroud)
stm32f3xx_it.c中的中断服务rutine:
/**
* @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 */
}
Run Code Online (Sandbox Code Playgroud)
这是在触发中断时将调用的内容,它将调用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
}
}
Run Code Online (Sandbox Code Playgroud)
您必须手动添加上一部分(回调),它只有一个弱声明但不会生成.您可以将它放在stm32f3xx_it.c中.
如果您想了解有关MCU的更多信息,请打开参考手册并阅读GPIO和NVIC部分,了解它是如何在寄存器级别完成的.
| 归档时间: |
|
| 查看次数: |
5953 次 |
| 最近记录: |