一、实验目的
使用定时器 2 进行中断点灯,500ms LED 灯翻转一次。
二,定时器溢出时间计算
Tout:定时器溢出时间
Ft:定时器的时钟源频率
ARR:自动重装载寄存器的值
PSC:预分频器寄存器的值
例如,要定时 500ms,则:PSC=7199,ARR=4999,Ft=72M
三、定时器中断实验配置步骤
msp 函数是对 MCU 相关的硬件进行初始化设置,通常被设计用于处理特定硬件外设或功能的底层初始化工作
四、开始配置
复制项目文件03-流水灯,重命名为17-定时器中断点灯
在Drivers\BSP目录下,新建文件夹timer,timer.c和timer.h
加载文件
编译
编译
代码:
main.c
cpp
#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();//初始化led灯
timer_init(5000-1,7200-1);
// led1_ON();
// led1_OFF();
while(1)
{
}
}
timer.c
cpp
#include "timer.h"
#include "led.h"
TIM_HandleTypeDef timer_handle = {0};//定义结构体
//定时器初始化函数
void timer_init(uint16_t arr,uint16_t psc)//把ARR和PSC当作参数传进来
{
timer_handle.Instance = TIM2; //选择使用的定时器
timer_handle.Init.Prescaler = psc; //PSC
timer_handle.Init.Period = arr; //ARR
timer_handle.Init.CounterMode = TIM_COUNTERMODE_UP;//配置成向上的,默认向上的
timer_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; //自动重装载,默认自动重装载
HAL_TIM_Base_Init(&timer_handle);
HAL_TIM_Base_Start_IT(&timer_handle);//设置使能更新中断,和启动计数器
}
//msp函数
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
__HAL_RCC_TIM2_CLK_ENABLE();
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();
}
}
timer.h
cpp
#ifndef __TIMER_H__
#define __TIMER_H__
#include "sys.h"
void timer_init(uint16_t arr,uint16_t psc);
#endif