小实验--定时器中断点灯
定时器中断点灯
1.HAL_TIM_Base_Init()

这个函数的参数有一个TIM_HandleTypeDef的结构体
下图就是这个结构体中的参数
在这些参数里面我们只需要用第一个和第二个 Instance和Init。
第一个参数Instance就是我们要用到的定时器的地址。
第二个参数Init也是一个结构体
第一个Prescaler就是PSC,Period就是ARR,CoounterMode就是计数的模式,ClockDivision和RepetitionCounter是在高级定时器中使用,目前用不到。
AutoReloadPreload就是设置用不用自动重装载预装载(影子寄存器)
下图是CoounterMode中可选的值
第一个是向上计数,第二个是向下计数,第三个四个五个是中央对齐计数
下图是AutoReloadPreload中可选的值
2.HAL_TIM_Base_MspInit()

这个是msp函数,也是传进去一个TIM_HandleTypeDef的句柄
我们在这个函数中初始化NVIC和CLOCK
3.HAL_TIM_Base_Start_IT()

这个函数的作用是使能更新中断和启动定时器,也是传进去一个TIM_HandleTypeDef的句柄
4.HAL_TIM_IRQHandler()

这个函数是中断服务函数中要调用的函数,也是传进去一个TIM_HandleTypeDef的句柄,这个函数里面调用了很多回调函数,通过各种判断来确定要使用哪一个回调函数,然后我们要用的是更新中断回调函数HAL_TIM_PeriodElapsedCallback()
5.HAL_TIM_PeriodElapsedCallback

这个函数是更新中断回调函数,也是传进去一个TIM_HandleTypeDef的句柄,我们可以在这里面写内容。
代码
1.timer.c
#include "timer.h"
#include "led.h"
TIM_HandleTypeDef timer_handle = {0}; //这个结构体在msp函数,中断服务函数,更新中断回调函数都会用到//所以定义为了全局变量,赋初值为0.//定时器初始化函数
void timer_init(uint16_t arr,uint16_t psc) //将arr和psc写为形参在main函数中就可以修改arr和psc的值
{timer_handle.Instance = TIM2; /*在TIM_HandleTypeDef结构体中只用到Instance,和Init其中Instance的作用是选择使用那个定时器Init是写PSC的值和ARR的值*/timer_handle.Init.Prescaler = psc; //Init中的Prescaler就是PSCtimer_handle.Init.Period = arr; //Init中的Period就是ARRtimer_handle.Init.CounterMode = TIM_COUNTERMODE_UP; //Init中的CounterMode就是计数模式(上升,下降,中央对齐)timer_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; //Init中的AutoReloadPreload就是设置自动重装载HAL_TIM_Base_Init(&timer_handle);HAL_TIM_Base_Start_IT(&timer_handle); //使能更新中断函数,启动定时器
}//msp函数,这个函数是在HAL_TIM_Base_Init函数中自动被调用的。
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{/*先要判断一下是不是用到了TIM2定时器,因为各种定时器都会调用HAL_TIM_Base_MspInit这个函数*/if(htim->Instance == TIM2){__HAL_RCC_TIM2_CLK_ENABLE(); //开启TIM2定时器的时钟,这个函数可以在hal_rcc函数中找到HAL_NVIC_SetPriority(TIM2_IRQn,2,2); //设置中断优先级HAL_NVIC_EnableIRQ(TIM2_IRQn); //使能中断}
}//中断服务函数
void TIM2_IRQHandler(void)
{HAL_TIM_IRQHandler(&timer_handle); //公共处理函数
}//更新中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){led1_toggle();}
}
2.main.c
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "timer.h"int main(void)
{HAL_Init(); /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();timer_init(5000 - 1,7200 - 1);while(1){ }
}



