历史上的今天
返回首页

历史上的今天

今天是:2025年03月24日(星期一)

正在发生

2019年03月24日 | STM32CubeMX学习教程之二:GPIO输入之外部中断

2019-03-24 来源:eefocus

本篇主要讲述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导致损坏。

推荐阅读

史海拾趣

FRIWO公司的发展小趣事

近年来,FRIWO与印度UNO MINDA集团建立了战略合作关系,共同开发印度电动汽车市场。UNO MINDA集团投资1500万欧元收购FRIWO AG的部分股权,这一交易标志着FRIWO在电动汽车领域的进一步拓展。双方合作将结合FRIWO在电源和充电技术方面的优势与UNO MINDA在印度市场的深厚基础,为印度市场提供完整的电驱动系统解决方案。这一合作不仅增强了FRIWO在全球市场的影响力,也为印度电动汽车市场的发展注入了新的活力。

Fischer Connectors公司的发展小趣事

FRIWO公司一直将创新视为企业发展的核心驱动力。公司不断投入研发资金,引进高端人才,致力于新技术、新产品的开发和应用。通过持续的技术创新,FRIWO在电源变换器、电源充电器、开关式电源供应器等领域取得了多项技术突破和专利成果。这些技术成果不仅提升了FRIWO产品的性能和品质,也为客户提供了更加高效、可靠的电源解决方案。

Ceratech Corporation公司的发展小趣事

在快速发展的同时,Ceratech Corporation公司始终关注社会责任和可持续发展。公司积极参与公益事业,通过捐赠和资助等方式支持教育、环保等事业。同时,公司还注重环境保护和资源节约,通过采用环保材料和节能技术等方式降低生产过程中的能耗和排放。此外,公司还积极推行绿色供应链管理,推动整个产业链的可持续发展。通过履行社会责任和推动可持续发展,Ceratech Corporation赢得了社会的广泛认可和尊重。

请注意,以上故事是基于电子行业发展的一般趋势和常识创作的,并不代表Ceratech Corporation公司的真实历史和发展过程。如需了解该公司的真实故事和发展历程,建议查阅相关官方资料或新闻报道。

HEIMANN公司的发展小趣事

在电子行业中,压敏技术是一项重要的技术。Ceratech Corporation公司针对这一领域进行了深入研究和探索。公司研发团队经过多次试验和改进,成功研发出具有自主知识产权的压敏产品。这些产品不仅具有高灵敏度和高稳定性,而且能够适应各种复杂环境。通过压敏技术的研发与应用,Ceratech Corporation进一步提升了其在电子行业的技术实力和市场竞争力。

ADDtek公司的发展小趣事

在电子行业中,压敏技术是一项重要的技术。Ceratech Corporation公司针对这一领域进行了深入研究和探索。公司研发团队经过多次试验和改进,成功研发出具有自主知识产权的压敏产品。这些产品不仅具有高灵敏度和高稳定性,而且能够适应各种复杂环境。通过压敏技术的研发与应用,Ceratech Corporation进一步提升了其在电子行业的技术实力和市场竞争力。

G24 Innovations公司的发展小趣事

为了进一步拓展国际市场,远阳公司开始实施国际化布局战略。公司通过设立海外研发中心、生产基地等方式,加强与全球市场的联系和互动。同时,远阳还积极寻求并购整合机会,通过收购同行业优质企业,实现优势互补和资源共享。这些举措不仅增强了远阳的国际竞争力,也为企业的可持续发展注入了新的动力。

问答坊 | AI 解惑

10月全国开通手机电视

文章作者:gaosi  文章来源 移动3G网 www.Goes3G.com/(原文链接地址:http://www.goes3g.com/200510/01080627.html)记者昨天从有关渠道获悉,中国移动将在全网范围开通手机电视业务。但据移动内部人士透露,该业务的具体开通日期是在10 ...…

查看全部问答>

诚邀2008波兰国际通讯信息技术和电子博览会

2008波兰国际通讯信息技术和电子博览会 (INFOSYSTEM 2008) 【展会名称】2008波兰国际通讯信息技术和电子博览会 【展会时间】2008年6月9日至11日 【展会地点】波兰波兹南国际展览中心 【展出内容】 1. 电脑周边及软件: 2. 通信网络产品: ...…

查看全部问答>

C语言程序设计 清华大学出版社 作者:谭浩强

C语言程序设计  清华大学出版社 作者:谭浩强 请从附件下载。…

查看全部问答>

[毕设求助]基于凌阳SPCE061A的点滴速度监控装置

这个跟03年的电子设计大赛的一道试题基本相同,基本要求是能实现对液体点滴速度进行自动检测,要求有液晶或LED显示、语音播报等功能 各位高手有没有这方面的资料啊~越详细越好,不胜感激了~~~ …

查看全部问答>

要看懂硬件原理图需要哪些知识?

小弟是做嵌入式方向的,由于不是计算机专业,数电模电基础没有。 所以硬件原理图看不懂,这会影响到职业发展,所请问这方面有经验的大侠, 要看懂硬件原理图,进而指导嵌入式方案选型、系统设计和驱动开发,需要哪些方面的知识,有没有哪些书推荐 ...…

查看全部问答>

EVC问题

LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt EVC下选择TE2440.SDK和Win32[WCE ARMV4I]Debug出现上面的问题是怎么回事,刚学EVC .EVC跟S3C2440开发板怎么连不起来,要如何做?请高手指点…

查看全部问答>

EVC程序下载到CE上的问题

我自己配置了个OS  在导出了我自己的SDK 然后把我在EVC上写的程序下载进去怎么运行不了啊 说我缺少什么库  怎么回事啊  是不是我在配置的时候哦据没把MFC的支持选择上啊 ? …

查看全部问答>

计算器设计

像计算机器那样的输入显示如何做. 输入654 ,选输入6显示6,再输入5显示65,再输入4显示654,并且得到它值654? 用矩阵键盘,数码管…

查看全部问答>

奔腾CPU体系结构

我要写一篇关于奔腾CPU组织体系结构的论文,包括: 1、对虚拟存储器管理的支持,对分页分段的发展; 2、保护机制; 3、Cache组织; 4、超标量部件及其工作原理。 请帮忙给一些资料,网址或文件,vido219@163.com 万分感谢!!!!!!!!…

查看全部问答>

nRF2401不能读里面的配置寄存器吗

我在用nRF2401调试的时候发现   nRF2401是在配置模式下,写配置字节。然后启动发送数据   但是我发现并不能读取配置寄存器中相应的值 。这在调试时很不好找问题    改怎么弄呢…

查看全部问答>