STM32CubeMX学习教程之二:GPIO输入之外部中断

发布者:创意驿站最新更新时间:2019-03-24 来源: eefocus关键字:STM32CubeMX学  GPIO输入  外部中断 手机看文章 扫描二维码
随时随地手机看文章

本篇主要讲述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"会跳转到如下代码:


/**

  * @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_GPIO_EXTI_Callback()。往下看这个回调函数定义的时候使用了__weak修饰符(关于__weak修饰符, 可以参看此博文https://blog.csdn.net/qq562029186/article/details/76216311),里面没有任何有作用的代码,我们需要重新定义这个函数。编辑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图,当然会报错的,原因请查看另一篇我的博客(https://blog.csdn.net/toopoo/article/details/79680323),所以需要右键点击  项目名Run.cfg ,给它改个名字,




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


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


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


source [find interface/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导致损坏。

关键字:STM32CubeMX学  GPIO输入  外部中断 引用地址:STM32CubeMX学习教程之二:GPIO输入之外部中断

上一篇:STM32学习笔记之DMA传输
下一篇:使用STM32CubeMX开发:按键中断实验

推荐阅读最新更新时间:2024-03-16 16:26

STM32外部中断EXTI)分析和应用
学过51单片机的外部中断的话入门会很快; 本篇博文基于STM32F103ZET6芯片,与大多数STM32F10x芯片兼容; 代码基于ST官网提供的3.5.0标准库 如有不足之处,还望前辈多多指教; 一些需要了解的基础知识 1. STM32每个GPIO口都可以作为外部中断输入口使用 2. 每个中断都设有状态位 3. 每个中断/事件都有独立的触发和屏蔽设置。 4. STM32103有19个外部中断(但是供GPIO口使用的中断只有16个) 分别是: 0~15:对应外部中断IO的输入中断 16 : 连接到PVD输出 17 :连接到RTC闹钟时间 18 :连接到USB唤醒事件 这里会容易出现一个问题说:STM32F103ZET6的GPIO管
[单片机]
C51编程13-中断篇(外部中断
CPU在执行的过程中,一般来说都是在执行主程序(main函数里面的代码)。如果希望处理其他的功能,可以通过查询的方式进行,判断是否需要处理或者通过中断的方式,进入中断服务函数程序里面执行。 前者是在主程序中判断条件是否成立,如果成立则执行其他功能,否则不执行;后者是CPU在执行过程中,判断是否有中断标志位,响应中断进入中断服务函数,执行相关功能。 MCS-51 单片机中,有两个外部中断(INT0与INT1),中断有两种方式低电平触发与负跳变(下降沿)触发。 下面通过讲INT0说明外部中断,INT1同理。 原理图: P0连接8个LED,INT0引脚连接一个按钮连接到地。 在中断系统中,INT0设计的寄存器中
[单片机]
C51编程13-中断篇(<font color='red'>外部中断</font>)
51单片机入门—中断系统和外部中断的基本使用
中断系统的基本概念 五个中断源及其基本结构 51单片机一共有五个中断源 按优先级从上到下 中断系统的结构 中断向量就是中断号,就是下图最左边的标号(在写中断服务函数的时候有用) 中断的处理函数 一般情况下,中断的处理函数有两个,其一为中断初始化函数,其二为中断服务函数。 中断服务函数的结构: 中断相关的4个寄存器 写程序的时候会用到 分为两个控制寄存器和两个中断请求标志 一个例题 代码如下: 方式一: #include reg52,h sbit L1=P0^0; sbit L2=P0^7; //中断系统的基本使用 void Delay(unsigned int t)//延时函数 { w
[单片机]
51单片机入门—中断系统和<font color='red'>外部中断</font>的基本使用
判断STM32 GPIO输入口的输入状态(高电平或低电平)
在学习STM32中的过程中,经常会遇到“高电平有效”,“低电平有效”等字眼,初看时很多时候就会从字面上理解,认为高电平有效的意思就是有效电平是高电平,低电平有效的意思就是有效电平是低电平的意思。而实际上,这样的理解是有误的。下面咱们以STM32的定时器中输出比较通道为例: 这幅图实际上就是一个pwm波产生的过程,对定时器不了解的可以去查阅相关手册,现在我们先看图中标号1的输出模式控制器,这里模式是指pwm模式,他的意思就是可以通过配置寄存器TIMx_CCMR1的OC1M两位,来选择pwm的模式,但是关于模式选择,手册中有这样一句话:在向下计数时,一旦TIMx_CNT TIMx_CCR1时通道1为无效电平(OC1REF=0),
[单片机]
判断STM32 <font color='red'>GPIO</font><font color='red'>输入</font>口的<font color='red'>输入</font>状态(高电平或低电平)
STM32 外部中断简介
STM32 IO 口中断的一些基础概念。STM32 的每个 IO 都可以作为外部中断的中断输入口,这点也是 STM32 的强大之处。STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F103 的19 个外部中断为: 线 0~15:对应外部 IO 口的输入中断。 线 16:连接到 PVD 输出。 线 17:连接到 RTC 闹钟事件。 线 18:连接到 USB 唤醒事件。 在库函数中,配置 GPIO 与中断线的映射关系的函数 GPIO_EXTILineConfig()来实现的: void GPIO_EXTILineConfig(uint8_t
[单片机]
S3C6410中断以及外部中断
6410的中断系统: 嵌入式软件里的中断处理,除了中断初始化,主要工作就是编写ISR. 在嵌入式的SOC的CPU里,在CPU里内部会带一些设备模块,它们产生的中断称为内部中断。因为联线比较固定,因此编程比较简单。而且在物理上CPU分离的芯片产生的中断,称为外部中断,外部中断可以联接不同的中断脚上,因此需要对中断IO进行较复杂的配置。 轮询模式是否一无是处?轮询的优点是在重负荷的情况下,轮询比中断效率会高很多。比如一个教室很多学生不断的问问题,这样与其不断被中断,老师还不如起身在教室走动,随机处理学生问题会高很多。 异常(Exception) -----------------------------------
[单片机]
S3C6410中断以及<font color='red'>外部中断</font>
Stm32f407 key外部中断
硬件平台: stm32f407ve 软件平台: win10 (OS Name: Microsoft Windows 10 Enterprise OS Version: 10.0.18363 N/A Build 18363) Keil5 5.26.2 HAL库版本: 2.14.0(目前下载的最新的) 中断这个部分需要参考中文手册和权威指南。 这里我还是提一下NVIC这个东西,全称是Nested vectored interrupt controller,即嵌套向量中断控制器。这个器件是用来管理stm32所有中断的(在现实
[单片机]
Stm32f407 key<font color='red'>外部中断</font>
跟我51单片机(六):单片机外部中断及红外遥控器解码
  一、内容提要   上讲介绍并应用了单片机动态扫描驱动数码管,并给出了实例。这一讲将重点介绍单片机如何通过捕获来实现对红外遥控器解码。通过该讲,读者可以掌握红外遥控器的编码原理以及如何通过单片机对遥控器进行解码。   二、原理简介   随着家用电器、视听产品的普及,红外线遥控器已被广泛使用在各种类型的家电产品上(如遥控开关、智能开关等)。其具有体积小、抗干扰能力强、功耗低、功能强、成本低等特点,在工业设备中也得到广泛应用。   一般而言,一个通用的红外遥控系统由发射和接收两大部分组成,如图1 所示: 图1 红外遥控系统框图   其中发射部分主要包括键盘矩阵、编码调制、红外发射管;接收部分包括光、电信号的转换以及放大
[单片机]
跟我<font color='red'>学</font>51单片机(六):单片机<font color='red'>外部中断</font>及红外遥控器解码
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved