【STM32L496G-DISCO试用体验】+按键中断之软件篇

  • SingleYork
  • LV5工程师
  • |      2017-08-28 15:31:35
  • 浏览量 863
  • 回复:2
本帖最后由 SingleYork 于 2017-8-28 15:33 编辑 bg1.png

在前面一个帖子中,笔者跟大家分析了一下按键中断的硬件部分原理,这一篇中,笔者将要跟大家一起学习一下软件部分是如何实现的。我们需要在前面介绍点灯的CubeMX工程中做一些小改动,首先,我们需要把PC13口的模式设置为“GPIO_EXTI13”,如下图所示:

然后在NVIC配置中,将EXTI LINE的中断使能,同时设定好相应的中断优先级:

接下来,我们在GPIO配置中,将PC13口的中断模式配置为:下降沿触发,由于电路设计的时候外部没有上拉电阻,所以这里还需要将PC13口设为上拉模式:

另外,我们在之前点灯程序中我们发现了原理图上的一个错误,LD2的实际网络号是LED1,而板子自带的CubeMX工程中,也直接将LD2的GPIO口的User Label定义为了LED1,这里为了避免让读者看起来别扭,在CubeMX工程中做了一些小改动,使得LD2在程序中的User Label就为LED2,便于读者更好的理解,同时,将GPIO口的初始状态置High,也就是让LD2上电后默认处于关闭状态:

配置完成后,我们就可以开始生成代码了,在生成的代码中,我们可以在main.c文件中发现MX_GPIO_Init()函数中多了一些配置:

另外,我们可以在stm32l4xx_it.c中断服务函数文件中,找到EXTI15_10中断的服务函数:

中断服务函数里面调用了GPIO外部中断处理函数HAL_GPIO_EXTI_IRQHandler();参数为GPIO_PIN_13,即EXTI0中断。GPIO外部中断处理函数主要就是清楚中断标志位,然后调用中断回调函数HAL_GPIO_EXTI_Callback()。我们值需要重构中断回调函数,在函数里面添加我们的应用代码即可,本例中以实现LD2状态的翻转为例:

执行完中断服务函数后,内核从堆栈去除压入的寄存器数据恢复现场,取出主程序中断点的地址,转到主程序中断点的地址继续运行主程序。到此,就完成了一次中断服务!最后,给大家分享一下代码运行效果:

源代码如下:

  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:1
lygo 2017-08-29
我要跟老哥学习 带带我
0   回复
举报
发布
SingleYork 回复 2017-08-30
互相学习,只是我也是在边学习边摸索,所以更新比较慢,呵呵……
0   回复
举报
x
收藏成功!点击 我的收藏 查看收藏的全部帖子