完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前言
嵌入式系统中,外部中断,是一个比较常见的功能。 中断的灵活使用,大大增强了系统的实时性。 使用STM32 最新的HAL库,如何配置一个引脚中断呢? 配置中断 可以借助STM32提供的可视化软件:STM32CubeMX,轻松的配置引脚中断、系统时钟、管理各个外设,并且,可以生成Keil MDK、IAR工程。用起来高效,便捷。 无需自己去码一堆引脚配置代码,工具会自动生成。后面只需要修修改改。 打开STM32CubeMX,先选择STM32的型号,这个决定了引脚的具体配置。 使能NVIC中断: 这样就配置好了引脚外部中断,点击【生成工程】按钮,生成Keil MDK5的工程。打开工程,就可以看到CubeMX工具软件已经帮我们配置好了引脚中断。 在 MX_GPIO_Init函数里,配置了引脚,并使能了NVIC中断。 /** * @brief GPIO Initialization Function * @param None * @retval None */ void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6, GPIO_PIN_RESET); /*Configure GPIO pin : PE4 */ GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); /*Configure GPIO pins : KEY_RIGHT_Pin KEY_LEFT_Pin KEY_PA_Pin */ GPIO_InitStruct.Pin = KEY_RIGHT_Pin|KEY_LEFT_Pin|KEY_PA_Pin; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); } 此时编译下载,按键,就可以进入中断处理函数: /** * @brief This function handles EXTI line[15:10] interrupts. */ void EXTI15_10_IRQHandler(void) { /* USER CODE BEGIN EXTI15_10_IRQn 0 */ /* USER CODE END EXTI15_10_IRQn 0 */ HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12); HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13); HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15); /* USER CODE BEGIN EXTI15_10_IRQn 1 */ /* USER CODE END EXTI15_10_IRQn 1 */ } 中断处理函数 自己的中断函数加在什么位置? 使用STM32 HAL库,可以不用修改 void EXTI15_10_IRQHandler(void) 这样的函数。 可以重写: void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) void KEY_RIGHT_CallBack(void) { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET); } void KEY_LEFT_CallBack(void) { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET); } void KEY_PA_CallBack(void) { static uint8_t flag = 0x00; if (flag == 0x00) { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_RESET); } else { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_SET); } flag ^= 0x01; } /** * @brief EXTI line detection callbacks. * @param GPIO_Pin: Specifies the pins connected EXTI line * @retval None */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == GPIO_PIN_12) { KEY_RIGHT_CallBack(); } else if (GPIO_Pin == GPIO_PIN_13) { KEY_LEFT_CallBack(); } else if (GPIO_Pin == GPIO_PIN_15) { KEY_PA_CallBack(); } } 重写:HAL_GPIO_EXTI_Callback,注意,这个函数(中断回调)是所有引脚中断都会进入,因此,需要根据引脚进行判断,进入不同的【用户中断处理函数】。 软件调试 发现按键后,GPIO 中断产生,并进入:EXTI15_10_IRQHandler,然后执行:HAL_GPIO_EXTI_Callback,最后执行到自己定义的按键中断函数。 使用STM32标准库,直接在:EXTI15_10_IRQHandler 实现用户的中断处理,也是可以的。 小结 除了【流水灯】这种简单的GPIO控制,中断,是一个比较重要的应用。 使用ST官方的工具:STM32CubeMX,可以让开发STM32更高效与便捷。 中断对系统的实时处理,比轮询引脚状态,有着先天的优势,可以让CPU空闲下来干别的。 中断在低功耗场景应用下,非常的普及,如唤醒MCU,保证低功耗与通信。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1780 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1081 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1679 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
596浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
556浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 02:39 , Processed in 0.989929 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号