小白菜的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单片机的理解去走的,欢迎大家一起交流