今天聊一聊使用STM32Cube MX配置STM32F429IGT6的定时器中断。

    定时器中断是常用的一个功能,主要是希望自己的程序经过一定的时间执行一段代码。定时器一般和PWM联系比较紧密,本文不介绍PWM的内容。STM32F429系列的定时器有很多,基本定时器、一般定时器和高级定时器,本文介绍的是基本定时器,使用的定时器是TIM2。具体哪个是基本的哪个是高级的哪个是一般的可以去查相关手册。

    硬件:野火STM32F429挑战者开发板;软件:STM32Cube MX、Keil 5、串口调试助手。

    今天要完成的目标:希望LED灯每0.5s闪烁一次。打开STM32Cube MX软件进行配置。(本程序是在《STM32Cube学习笔记-ADC_DMA调试》的基础上进行配置的);

    我们先去找定时器配置所在的位置。

cubemax配置定时器分频 cube定时器中断_初始化

在左边的Timers中选择TIM2,在TIM2 Mode and Configuration中的Clock Source中选择internal Clock,使用的是内部时钟。那么去看一下时钟频率,打开时钟树;

cubemax配置定时器分频 cube定时器中断_main函数_02

APB1的定时器时钟为90MHz,APB2的定时器时钟为180MHz。我们去查阅相关资料看一下定时器时钟2挂接在什么地方。

cubemax配置定时器分频 cube定时器中断_main函数_03

    可以看这张图,TIM2最大定时器时钟为90MHz;

我们配置分频系数为900,那么90 000 000/900 = 100 000;

那么定时一次为1/100 000 = 0.00001;

将计数周期设定为100,0.00001*100 = 0.001s,设计为向上计数,就是说,从0开始计数,一直到99计数100次,然后重新循环计数,自动重载周期重载使能。

点击NVIC Setting使能中断,然后生成代码,分析一下代码。

在main函数的初始化中多了一个MX_TIM2_Init();(再次说明,本程序是在《STM32Cube学习笔记-ADC_DMA调试》基础上继续开发的)

cubemax配置定时器分频 cube定时器中断_cubemax配置定时器分频_04

打开stm32f4xx_it.c文件,找到 void TIM2_IRQHandler(void),然后找到HAL_TIM_IRQHandler()函数。

cubemax配置定时器分频 cube定时器中断_初始化_05

cubemax配置定时器分频 cube定时器中断_cubemax配置定时器分频_06

在HAL_TIM_IRQHandler中找到了很多的回调函数,看一下主要的作用,/*Capture compare 1 event*/,比较1发生的事情。可以猜想到是使用到PWM了。

我们可以找到

cubemax配置定时器分频 cube定时器中断_stm32_07

这个是定时器更新的时候中断了。去找HAL_TIM_PeriodElapsedCallback();

cubemax配置定时器分频 cube定时器中断_cubemax配置定时器分频_08

是以__weak 引导的函数,可以直接在main文件中定义这个函数,编写自己的程序。

cubemax配置定时器分频 cube定时器中断_stm32_09

定义了一个计数器,因为定时器的中断周期是1ms,那么当计数器达到1000时就让计数器清零,然后让LED引脚跳变一次。

对了在写好这个程序后,别忘了在初始化的时候使能定时器中断,不然还是不行。

cubemax配置定时器分频 cube定时器中断_stm32_10

编译,下载,可以看到LED灯开始按照预定的思路开始闪烁了。

如果想知道定时的时间准不准,可以在定时器中断中加一个CAN发送的函数,然后使用CAN test测试一下发送的周期。