STM32F3发现 – 实现GPIO中断
发布时间:2020-12-16 10:37:05 所属栏目:百科 来源:网络整理
导读:我想实现一个GPIO中断,但我不知道如何,我也没有找到真正的样本或解释. 我已经知道如何写Pins,但不多,请考虑我真的没有任何关于c或编程微控制器的知识. 一个简单的例子或解释将帮助我很多.以下代码是我已经拥有的,但我不确定这是否正确. GPIO_InitTypeDef GPI
我想实现一个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); 解决方法
由于@Mouin已经为您描述了这些步骤并且您已经在使用HAL,因此以下是如何执行这些步骤,以及使用ST Microelectronics提供的
STM32CubeMX软件进行配置的方法. (注意:建议浏览该链接,因为STM32系列有很多例子,例如STM32CubeF3包.)
因此,简单下载它,为STM32F3 Discovery板创建一个新项目. >在Pinout选项卡上,MCU将显示其所有引脚.只需单击一个引脚并选择所需的功能即可.在您的情况下,PA2引脚上的GPIO_EXTI2: >现在切换到“配置”选项卡,在名为“系统”的最后一列中,单击“GPIO”按钮.可在以下图片中看到可用选项: >下一步是启用相应的中断.为此,请关闭“引脚配置”窗口,然后从“系统”列中单击NVIC按钮.如果您还记得,在PA2上选择了EXTI2,请勾选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); // <--- This and HAL_NVIC_EnableIRQ(EXTI2_TSC_IRQn); // <--- this are what were missing for you. 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 */ } 这是在触发中断时将调用的内容,它将调用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部分,了解它是如何在寄存器级别完成的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |