小白菜的STM32cubeMX学习(2)中断的配置

0 前言

小白菜的STM32cubeMX学习(1)点亮第一颗LED中,我总结了一下如何用CubeMX配置GPIO并且点亮第一颗LED。
这一篇则介绍如何配置中断,包括外部中断和定时中断,串口中断下次和串口一起说吧。
这里我默认大家知道一些关于中断的基本原理了。

1 外部中断

1.1 CubeMX配置

外部中断可以用按键来触发,偷偷瞄一眼开发板的原理图
按键原理图
核心板接线
这里就用KEY0/1/2三个按键吧,根据原理图的接线呢,我们需要对PH2/3和PC13设置上拉电阻。先在CubeMX芯片上找到这几个引脚,设置成GPIO_EXTI
引脚配置
接下来在GPIO中将中断模式改成下降沿触发,并设置上拉电阻,这里的设置和按键那里的电路图有关。
引脚配置
在NVIC中将三个引脚的中断打上对勾,算是使能吧,然后把中断优先级改成1,这里的数字越大表示优先级越低。这里将中断优先级降低,是因为如果优先级为0的话,会导致HAL_DELAY()无法在外部中断函数中使用。
中断使能和优先级配置
中断函数得有个啥子现象吧,这里将LED亮灭的IO口也配置好,和上一篇一样。
至此,CubeMX端的配置完成,按照上一篇的介绍完成其他配置并生成代码。

1.2 代码编写

打开工程,找到中断的Handler,按图中顺藤摸瓜找到回调函数
在这里插入图片描述
回调函数
三个中断执行完之后都会进入到这个回调函数,可以直接把这个函数copy到main.c里面 进行修改。也可以直接把要干的事写道中断的Handler里面。
我这里写的是不同按键,就闪烁不同次数
在这里插入图片描述

这个buling()我是写在main.c里面了,调用的话在前面加extern关键词就好。
在这里插入图片描述
编译上传,没得问题。

2 定时器中断

先说一下想法,我这个板子上有两个灯,一个灯用来外部中断,按键会闪烁对应的次数。
另外一个灯用来定时器中断定时闪烁。
开始干活~

CubeMX配置

在这里插入图片描述
在Timers中打开TIM1定时器,选择内部时钟源。这里时钟源是APB2 Timer clocks,即16M.
在这里插入图片描述
设置频率,频率=APB2 Timer clocks/(预分频+1)/(自动重装值+1),所以设置的时候要-1,这个误差其实不大~
这里我们让它2s闪一下,即1s反转一下引脚IO,所以设置成16000-1和1000-1
在这里插入图片描述
最后在NVIC里面打开TIM1的中断使能,其实只需要打开溢出中断updata就行。
在这里插入图片描述
CubeMX配置完了,生成代码并打开

2.2 代码编写

打开代码,找到MX_TIM1_Init();顺藤摸瓜到__HAL_RCC_TIM1_CLK_ENABLE();
这里表明了TIM1是使用了APB2的时钟。
在这里插入图片描述
定时器初始化已经写在main()里面了,找到HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);这个函数是用来开始定时器计时的。把该函数写到main()中
在这里插入图片描述

找到回调函数HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim),将会点函数copy到main.c中进行更改即可。
在这里插入图片描述
也可以直接在TIM1_UP_TIM10_IRQHandler()函数中写中断
在这里插入图片描述
编译烧录没得问题
这次的工程已经上传到https://github.com/MercerD/interrupt.
这次步骤有很多省略,对stm32的中断也不是很清楚,我是按照51单片机的理解去走的,欢迎大家一起交流