完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本篇主要讲述GPIO外部中断输入检测,实际物理输入方式是什么,实际上更适合外部设备信号的输入检测,物理对象输入因为有抖动,还需要硬件或者软件去抖才比较可靠这个例子不考虑防抖的情况。
软件版本: STM32CubeMX V4.25.0 系统工作台V2.4 硬件:OneNet麒麟座V2.3 在STM32CubeMX中新建项目,选择正确的MCU型号 设置RCC和SYS,然后根据板子实际情况设置时钟(麒麟座外部振是12M,STM32F103x的最高主频是72M) 根据板子的具体连接设置4个GPIO_OUTPUT(连接到LED)和4个GPIO_EXIT *(外部中断模式,连接到物理按键)。 GPIO OUTPUT设置引脚 麒麟座按键有外部上拉,所以GPIO_EXIT *不需要配置内部上拉,检测下降沿(下降沿),GPIO_EXIT *设置如下 LED名称标号我用了1/2/3/4的SW名称标号我用了2/3/4/5,实例中标号也未必相同,但是要做好一一对应关系。 在NVIC(嵌套向量中断控制器)中,勾选EXIT Line2中断和EXIT Line[15:12]中断使能中断。两个选项设置抢占优先级和响应优先级。这里我们选择默认的,不修改。 修改Project - setting ,ToolChain/IDE SW4STM32 勾选这里选择 生成代码后点击Open Project在Eclipse中打开项目,然后在stm32f7xx_it.c中断服务函数文件中,我们可以找到EXTI2和EXTI15_10中断的服务函数。 /******************************************************************************/ /* STM32F1xx Peripheral Interrupt Handlers */ /* Add here the Interrupt Handlers for the used peripherals. */ /* For the available peripheral interrupt handler names, */ /* please refer to the startup file (startup_stm32f1xx.s)。 */ /******************************************************************************/ /** * @brief This function handles EXTI line2 interrupt. */ void EXTI2_IRQHandler(void) { /* USER CODE BEGIN EXTI2_IRQn 0 */ /* USER CODE END EXTI2_IRQn 0 */ HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2); /* USER CODE BEGIN EXTI2_IRQn 1 */ /* USER CODE END EXTI2_IRQn 1 */ } /** * @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_11); HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12); HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13); /* USER CODE BEGIN EXTI15_10_IRQn 1 */ /* USER CODE END EXTI15_10_IRQn 1 */ } 精美点击HAL_GPIO_EXTI_IRQHandler 选择“Open Declaration”会跳转到如下代码: /** * @brief This function handles EXTI interrupt request. * @param GPIO_Pin: Specifies the pins connected EXTI line * @retval None */ void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) { /* EXTI line interrupt detected */ if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET) { __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); HAL_GPIO_EXTI_Callback(GPIO_Pin); } } /** * @brief EXTI line detection callbacks. * @param GPIO_Pin: Specifies the pins connected EXTI line * @retval None */ __weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { /* Prevent unused argument(s) compilation warning */ UNUSED(GPIO_Pin); /* NOTE: This function Should not be modified, when the callback is needed, the HAL_GPIO_EXTI_Callback could be implemented in the user file */ } 代码中可以看到GPIO外部中断处理函数首先清除识别位,然后调用调用函数HAL_EXTI_Callback()。里面没有任何有作用的代码,我们需要重新定义这个函数。编辑gpio.c(main.c也可以),进行修改: /* USER CODE BEGIN 2 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == SW2_Pin) { HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); } if(GPIO_Pin == SW3_Pin) { HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin); } if(GPIO_Pin == SW4_Pin) { HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin); } if(GPIO_Pin == SW5_Pin) { HAL_GPIO_TogglePin(LED4_GPIO_Port,LED4_Pin); } } /* USER CODE END 2 */然后右键点击项目,选择Properties,Run-Debug Settings,点击下一步的New,在弹出对话框中Ac6 STM32 Debugging。 然后任务栏上点击运行图,当然会的,所以需要昂贵的点击项目名Run.cfg,给它改个名字, 然后很少点击项目树里面的项目名称,选择“Propeties”,然后在Run/Debug Settings-选择项目名-Edit-Main-C/C++Application那里点击“Search Project”,然后选择出现的默认的elf文件: 然后在Debugger-User Defined-Browse那里选择你自己改名的配置文件: 然后精美点击那个新的cfg文件,选择“打开方式 - 文本编辑器”,进行如下更改: source [find interface/stlink.cfg] 为更改 source [find interface/stlink-v2. cfg] reset_config srst_only srst_nogate connect_assert_srst 这行改为reset_config none 然后再运行一下,就可以了。 然后再运行一下,就实现了四个分别控制LED的开关处理了。但是这里没有防抖,你会发现有LED会闪一下,或者没,其实是地点亮然后一次或者几次,因为速度太快报告导致你只是看不到。去抖扫描。 在实际项目中,最好加上硬件防抖,因为皮毛产生的北美电压可能会冲击GPIO导致损坏。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1649 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1566 浏览 1 评论
994 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
694 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1613 浏览 2 评论
1876浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
660浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
528浏览 3评论
546浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
517浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-28 16:44 , Processed in 0.725398 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号