本帖最后由 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状态的翻转为例:
执行完中断服务函数后,内核从堆栈去除压入的寄存器数据恢复现场,取出主程序中断点的地址,转到主程序中断点的地址继续运行主程序。到此,就完成了一次中断服务!最后,给大家分享一下代码运行效果:
源代码如下:
本帖最后由 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状态的翻转为例:
执行完中断服务函数后,内核从堆栈去除压入的寄存器数据恢复现场,取出主程序中断点的地址,转到主程序中断点的地址继续运行主程序。到此,就完成了一次中断服务!最后,给大家分享一下代码运行效果:
源代码如下: