0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文解析GPIO外部中断输入检测

STM32嵌入式开发 来源:CSDN博客_ 作者:CSDN博客_ 2020-08-31 11:46 次阅读

本篇主要讲述GPIO外部中断输入检测,实际物理输入方式是按键,但是实际上更适合外部设备信号的输入检测,物理按键输入因为有抖动,还需要硬件或者软件去抖才比较可靠。这个例子不考虑防抖的情况。

软件版本:
STM32CubeMX V4.25.0
System Workbench V2.4

硬件:OneNet 麒麟座V2.3

在STM32CubeMX中新建项目,选择正确的MCU型号

设置RCC和SYS,然后根据板子实际情况设置时钟(麒麟座外部晶振是12M,STM32F103x的最高主频是72M)

根据板子的具体连接设置4个GPIO_OUTPUT (连接到LED)和4个GPIO_EXIT*(外部中断模式,连接到物理按键)。

GPIO OUTPUT引脚设置

麒麟座按键有外部上拉,所以GPIO_EXIT*不需要配置内部上拉,检测下降沿(Falling Edge),GPIO_EXIT*设置如下

LED名称标号我用了1/2/3/4,SW名称标号我用了2/3/4/5,实例中标号也未必相同,但是要做好一一对应关系。

在NVIC(嵌套向量中断控制器)中,勾选EXIT Line2 interrupt 和 EXIT Line[15:12] interrupt 使能中断。右边两个选项设置抢占优先级和响应优先级。此处我们选择默认的,不修改。

同样修改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"会跳转到如下代码:

/***@briefThis function handles EXTI interrupt request.*@paramGPIO_Pin: Specifies the pins connected EXTI line*@retvalNone*/voidHAL_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);}}/***@briefEXTI line detection callbacks.*@paramGPIO_Pin: Specifies the pins connected EXTI line*@retvalNone*/__weakvoidHAL_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_GPIO_EXTI_Callback()。往下看这个回调函数定义的时候使用了__weak修饰符(关于__weak修饰符, 可以参看此博文),里面没有任何有作用的代码,我们需要重新定义这个函数。编辑gpio.c(或者main.c也可以),进行如下修改:

/* USER CODE BEGIN 2 */voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_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图,当然会报错的,原因请查看另一篇我的博客,所以需要右键点击 项目名Run.cfg ,给它改个名字,

然后右键点击项目树里面的项目名称,选择“Propeties”,然后在Run/Debug Settings-选择项目名-Edit-Main-C/C++Application那里点击“Search Project”,然后选择出现的默认的elf文件:

然后在Debugger-User Defined-Browse 那里选择你自己改名的配置文件:

然后右键点击那个新的cfg文件,选择"Open With - Text Editor", 进行如下更改:

source [findinterface/stlink.cfg]//更改为 source [find interface/stlink-v2.cfg]reset_config srst_only srst_nogate connect_assert_srst//这一行改为 reset_config none

Run一下,就可以了。然后再Run一下,就实现四个按键分别控制LED的开关切换了。但是这里没有防抖处理,你会发现有时候LED会闪一下,或者没反应,其实是很快地点亮然后熄灭一次或者若干次,只是由于速度太快电流很小导致你看不到。下一篇我们会通过使用SysTick中断来实现按键去抖扫描。在实际项目中,最好加上硬件防抖,因为抖动产生的反向电压可能会冲击GPIO导致损坏。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • GPIO
    +关注

    关注

    16

    文章

    1129

    浏览量

    50482
  • 外部中断
    +关注

    关注

    1

    文章

    131

    浏览量

    15575

原文标题:STM32CubeMX教程-GPIO输入之外部中断

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    每一个GPIO如何配置成一个外部中断触发源

    1STM32中断分组STM32 的每一个GPIO都能配置成一个外部中断触发源,这点也是 STM32 的强大之
    的头像 发表于 01-25 08:44 1.5w次阅读
    每一个<b class='flag-5'>GPIO</b>如何配置成一个<b class='flag-5'>外部</b><b class='flag-5'>中断</b>触发源

    STM32 GPIO外部中断设计

    输入引脚,还可以通过另外一种叫做外部中断的方式来对引脚的输入信号进行检测,本篇首先介绍下EXTI的结构,接着介绍
    发表于 04-14 10:51 1379次阅读
    STM32 <b class='flag-5'>GPIO</b>的<b class='flag-5'>外部</b><b class='flag-5'>中断</b>设计

    详细解析STM32的外部中断

    说明:本文旨在详细解析STM32的外部中断,以实现按键触发外部中断。其中包含“编程流程”、“程序代码”、“代码
    发表于 08-13 07:50

    GPIO外部中断输入检测

    本篇主要讲述GPIO外部中断输入检测,实际物理输入方式是按键,但是实际上更适合
    发表于 08-16 09:14

    GPIO外部输入检测的实际物理输入方式是什么

    GPIO外部输入检测的实际物理输入方式是什么?GPIO外部
    发表于 11-16 06:58

    外部中断EXTI步骤解析

    目录1-LED 使用GPIO点灯2-外部中断实验(EXTI)步骤及解析
    发表于 01-12 07:10

    GPIO做输出还能作外部中断输入吗?

    我们这里要谈的是基于硬件模式的外部中断话题。当STM32的GPIO作为输出时,可能是通用GPIO输出也可能是基于其它外设复用情况下的输出,即复用输出。
    的头像 发表于 07-05 10:42 4361次阅读
    <b class='flag-5'>GPIO</b>做输出还能作<b class='flag-5'>外部</b><b class='flag-5'>中断</b><b class='flag-5'>输入</b>吗?

    ZigBee的GPIO外部中断原理

    ​ 按键按下时端口接低电平,即低电平 0 状态-------0下拉输入:有下拉电阻​ 按键未按下时端口接低电平,即低电平 0 状态—0v​ 按键按下时端口接高电平,即高电平 1 状态------3.3v四、
    发表于 11-30 11:51 11次下载
    ZigBee的<b class='flag-5'>GPIO</b>与<b class='flag-5'>外部</b><b class='flag-5'>中断</b>原理

    STM32CubeMX_环境搭建_GPIO_外部中断

    STM32CubeMX_环境搭建_GPIO_外部中断
    发表于 12-05 14:06 3次下载
    STM32CubeMX_环境搭建_<b class='flag-5'>GPIO</b>_<b class='flag-5'>外部</b><b class='flag-5'>中断</b>

    STM32基本GPIO操作:按键输入(扫描+外部中断

    STM32基本GPIO操作:按键输入(扫描+外部中断)本文章向大家介绍STM32基本GPIO操作:按键
    发表于 12-29 19:27 13次下载
    STM32基本<b class='flag-5'>GPIO</b>操作:按键<b class='flag-5'>输入</b>(扫描+<b class='flag-5'>外部</b><b class='flag-5'>中断</b>)

    使用LL库开发STM32:GPIO口与外部中断

    文章目录目的输出与控制输入与端口值读取外部中断总结目的GPIO口使用是单片机开发中最简单的一块,STM32的GPIO口无论是使用HAL库还是
    发表于 01-13 16:13 13次下载
    使用LL库开发STM32:<b class='flag-5'>GPIO</b>口与<b class='flag-5'>外部</b><b class='flag-5'>中断</b>

    STM32外部中断

    事件(上升沿或下降沿或双边沿)并能够单独地屏蔽:有一个挂起寄存器维持所有中断请求的状态。EXTI可以检测到脉冲宽度小于内部APB2的时钟周期。多达80个通用IO口连接到16个外部中断线
    发表于 01-14 15:14 2次下载
    STM32<b class='flag-5'>外部</b><b class='flag-5'>中断</b>

    基于STM32CubMX和HAL库的外设开发(七、GPIO作为外部中断

    基于STM32CubMX和HAL库的外设开发第七讲 GPIO作为外部中断外部中断简介STM32中含有多个
    发表于 01-14 15:50 1次下载
    基于STM32CubMX和HAL库的外设开发(七、<b class='flag-5'>GPIO</b>作为<b class='flag-5'>外部</b><b class='flag-5'>中断</b>)

    STM32的IO外部中断EXTI的使用

    的方式访问输入引脚,还可以通过另外一种叫做外部中断的方式来对引脚的输入信号进行检测,本篇首先介绍下EXTI的结构,接着介绍
    的头像 发表于 06-22 10:21 1163次阅读
    STM32的IO<b class='flag-5'>外部</b><b class='flag-5'>中断</b>EXTI的使用

    如何配置GPIO中断功能呢?

    如何配置GPIO中断功能呢? GPIO在嵌入式系统中经常用于控制外设,如LED、摄像头、传感器等。除此之外,GPIO还可以被配置为中断功能
    的头像 发表于 10-30 09:57 3024次阅读