1.定时器引脚分布
2.stm32定时器2~7、9~14基本配置:
tim.h
#ifndef __TIM_H
#define __TIM_H
#include "stm32f4xx_hal.h"
#include "led.h"
#include "sys.h"
/*
*
*TIM2
*
*/
extern u8 TIM2_flag1; //定时器标志位
void TIM2_Init(u16 arr,u16 psc);
/*
*
*TIM3
*
*/
//通过改变TIM3->CCR2的值来改变占空比,从而控制LED0的亮度
extern TIM_HandleTypeDef TIM3_Handler; // TIM_HandleTypeDef 结构体变量
#define LED1_PWM_VAL TIM3->CCR2
extern uint16_t TIM3_flag1; //Tim3定时器标志位
extern int TIM3_flag2; //Tim3定时器标志位
extern int TIM3_flag3; //Tim3定时器标志位
extern int TIM3_flag4; //Tim3定时器标志位
void TIM3_Init(u16 arr,u16 psc);
/*
*
*TIM4
*
*/
extern u8 TIM4_flag1; //定时器标志位
void TIM4_Init(u16 arr,u16 psc); //初始化
/*
*
*TIM5
*
*/
extern u8 TIM5_flag1; //定时器标志位
void TIM5_Init(u16 arr,u16 psc);
/*
*
*TIM6
*
*/
extern u8 TIM6_flag1; //定时器标志位
void TIM6_Init(u16 arr,u16 psc);
/*
*
*TIM7
*
*/
extern u8 TIM7_flag1; //定时器标志位
extern u8 TIM7_flag2; //定时器标志位
void TIM7_Init(u16 arr,u16 psc);
/*
*
*TIM9
*
*/
extern u8 TIM9_flag1; //定时器标志位
void TIM9_Init(u16 arr,u16 psc);
#define GENERAL_TIMx TIM9
#define GENERAL_TIM_RCC_CLK_ENABLE() __HAL_RCC_TIM9_CLK_ENABLE()
#define GENERAL_TIM_RCC_CLK_DISABLE() __HAL_RCC_TIM9_CLK_DISABLE()
#define GENERAL_TIM_GPIO_RCC_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE();
#define GENERAL_TIM_IRQ TIM1_BRK_TIM9_IRQn
#define GENERAL_TIM_INT_FUN TIM1_BRK_TIM9_IRQHandler
#define GENERAL_TIM_CH2_PORT GPIOE
#define GENERAL_TIM_CH2_PIN GPIO_PIN_6
//通用定时器TIM9~TIM11由APB2时钟提供故为168MHz,而TIM12~TIM14为84MHz
#define GENERAL_TIM_PRESCALER 1999 // 实际时钟频率为:84KHz
// 定义定时器周期,当定时器开始计数到BASIC_TIMx_PERIOD值是更新定时器并生成对应事件和中断
#define GENERAL_TIM_PERIOD 255
/* 扩展变量 ------------------------------------------------------------------*/
extern TIM_HandleTypeDef TIM9_Handler;
extern uint8_t indexWave[];
/* 函数声明 ------------------------------------------------------------------*/
void GENERAL_TIMx_Init(void);
/*
*
*TIM10
*
*/
extern u8 TIM10_flag1; //定时器标志位
void TIM10_Init(u16 arr,u16 psc);
/*
*
*TIM11
*
*/
extern u8 TIM11_flag1; //定时器标志位
void TIM11_Init(u16 arr,u16 psc);
/*
*
*TIM12
*
*/
extern u8 TIM12_flag1; //定时器标志位
void TIM12_Init(u16 arr,u16 psc);
/*
*
*TIM13
*
*/
extern u8 TIM13_flag1; //定时器标志位
void TIM13_Init(u16 arr,u16 psc);
/*
*
*TIM14
*
*/
extern u8 TIM14_flag1; //定时器标志位
void TIM14_Init(u16 arr,u16 psc);
#endif
tim.c
#include "tim.h"
/*
*
*TIM2
*
*/
u8 TIM2_flag1; //定时器标志位
TIM_HandleTypeDef TIM2_Handler; //结构体变量
/*
*
*TIM3
*
*/
uint16_t TIM3_flag1; //定时器标志位
TIM_HandleTypeDef TIM3_Handler; //结构体变量
/*
*
*TIM4
*
*/
u8 TIM4_flag1; //定时器标志位
TIM_HandleTypeDef TIM4_Handler; // TIM_HandleTypeDef 结构体变量
/*
*
*TIM5
*
*/
u8 TIM5_flag1; //定时器标志位
TIM_HandleTypeDef TIM5_Handler; //定时器句柄
/*
*
*TIM6
*
*/
u8 TIM6_flag1; //定时器标志位
TIM_HandleTypeDef TIM6_Handler; //定时器句柄
/*
*
*TIM7
*刷新串口屏;判断串口3接收标志
*/
u8 TIM7_flag1; //定时器标志位
TIM_HandleTypeDef TIM7_Handler; //定时器句柄
extern vu16 USART3_RX_STA;
/*
*
*TIM9
*
*/
u8 TIM9_flag1;
TIM_HandleTypeDef TIM9_Handler;
/* LED亮度等级 PWM表 */
uint8_t indexWave[] = {1,1,2,2,3,4,6,8,10,14,19,25,33,44,59,80,107,143,191,205,255};
/*
*
*TIM10
*
*/
u8 TIM10_flag1;
TIM_HandleTypeDef TIM10_Handler;
/*
*
*TIM11
*
*/
u8 TIM11_flag1;
TIM_HandleTypeDef TIM11_Handler;
/*
*
*TIM12
*
*/
u8 TIM12_flag1;
TIM_HandleTypeDef TIM12_Handler;
/*
*
*TIM13
*
*/
u8 TIM13_flag1;
TIM_HandleTypeDef TIM13_Handler;
/*
*
*TIM14
*
*/
u8 TIM14_flag1;
TIM_HandleTypeDef TIM14_Handler;
/***************************************************************
*
*定时器底层驱动,开启时钟,设置中断优先级
*回调函数,定时器中断服务函数调用
*
****************************************************************/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2)
{
__HAL_RCC_TIM2_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM2_IRQn,2,3);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
}
if(htim->Instance==TIM3)
{
__HAL_RCC_TIM3_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM3_IRQn,3,4);
HAL_NVIC_EnableIRQ(TIM3_IRQn);
}
if(htim->Instance==TIM4)
{
__HAL_RCC_TIM4_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM4_IRQn, 4,5);
HAL_NVIC_EnableIRQ(TIM4_IRQn);
}
if(htim->Instance==TIM5)
{
__HAL_RCC_TIM5_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM5_IRQn, 5,6);
HAL_NVIC_EnableIRQ(TIM5_IRQn);
}
if(htim->Instance==TIM6)
{
__HAL_RCC_TIM6_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 6,7);
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
}
if(htim->Instance==TIM7)
{
__HAL_RCC_TIM7_CLK_ENABLE(); // 开启时钟
HAL_NVIC_SetPriority(TIM7_IRQn, 7,8); // 配置抢占优先级,有16级抢占优先级
HAL_NVIC_EnableIRQ(TIM7_IRQn);
}
if(htim->Instance==TIM9)
{
__HAL_RCC_TIM9_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM1_BRK_TIM9_IRQn, 9,10);
HAL_NVIC_EnableIRQ(TIM1_BRK_TIM9_IRQn);
}
if(htim->Instance==TIM10)
{
__HAL_RCC_TIM10_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 10,11);
HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);
}
if(htim->Instance==TIM11)
{
__HAL_RCC_TIM11_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM1_TRG_COM_TIM11_IRQn, 11,12);
HAL_NVIC_EnableIRQ(TIM1_TRG_COM_TIM11_IRQn);
}
if(htim->Instance==TIM12)
{
__HAL_RCC_TIM12_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM8_BRK_TIM12_IRQn, 12,13);
HAL_NVIC_EnableIRQ(TIM8_BRK_TIM12_IRQn);
}
if(htim->Instance==TIM13)
{
__HAL_RCC_TIM13_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM8_UP_TIM13_IRQn, 13,14);
HAL_NVIC_EnableIRQ(TIM8_UP_TIM13_IRQn);
}
if(htim->Instance==TIM14)
{
__HAL_RCC_TIM14_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM8_TRG_COM_TIM14_IRQn, 14,15);
HAL_NVIC_EnableIRQ(TIM8_TRG_COM_TIM14_IRQn);
}
}
//回调函数,定时器中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&TIM2_Handler))
{
TIM2_flag1++;
}
if(htim==(&TIM3_Handler))
{
TIM3_flag1++;
}
if(htim==(&TIM4_Handler))
{
TIM4_flag1++;
}
if(htim==(&TIM5_Handler))
{
TIM5_flag1++;
}
if(htim==(&TIM6_Handler))
{
TIM6_flag1++;
}
if(htim==(&TIM7_Handler))
{
TIM7_flag1++;
TIM7_flag2++;
}
if(htim==(&TIM9_Handler))
{
TIM9_flag1++;
}
if(htim==(&TIM10_Handler))
{
TIM10_flag1++;
}
if(htim==(&TIM11_Handler))
{
TIM11_flag1++;
}
if(htim==(&TIM12_Handler))
{
TIM12_flag1++;
}
if(htim==(&TIM13_Handler))
{
TIM13_flag1++;
}
if(htim==(&TIM14_Handler))
{
TIM14_flag1++;
}
}
/***************************************************************
*
*
*TIM2
*
*
****************************************************************/
/***************************************************************
* 通用定时器2中断初始化
* arr:自动重装值。
* psc:时钟预分频数
* 定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
* Ft=定时器工作频率,单位:Mhz
* 这里使用的是定时器2!(定时器2挂在APB1上,时钟为HCLK/2)
****************************************************************/
void TIM2_Init(u16 arr,u16 psc)
{
TIM2_Handler.Instance=TIM2; //通用定时器2
TIM2_Handler.Init.Prescaler=psc; //分频系数
TIM2_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM2_Handler.Init.Period=arr; //自动装载值
TIM2_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV2;//时钟分频因子
HAL_TIM_Base_Init(&TIM2_Handler);
HAL_TIM_Base_Start_IT(&TIM2_Handler); //使能定时器2和定时器2更新中断:TIM_IT_UPDATE
}
//定时器2中断服务函数
void TIM2_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM2_Handler);
}
/***************************************************************
*
*
*TIM3
*
*
****************************************************************/
//通用定时器3中断初始化
//arr:自动重装值。
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器3!(定时器3挂在APB1上,时钟为HCLK/2)
void TIM3_Init(u16 arr,u16 psc)
{
TIM3_Handler.Instance=TIM3; //通用定时器3
TIM3_Handler.Init.Prescaler=psc; //分频系数
TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM3_Handler.Init.Period=arr; //自动装载值
TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
HAL_TIM_Base_Init(&TIM3_Handler);
HAL_TIM_Base_Start_IT(&TIM3_Handler); //使能定时器3和定时器3更新中断:TIM_IT_UPDATE
}
//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM3_Handler);
}
/***************************************************************
*
*
*TIM4
*
*
****************************************************************/
void TIM4_Init(u16 arr,u16 psc)
{
TIM4_Handler.Instance=TIM4;
TIM4_Handler.Init.Prescaler=psc; //分频系数
TIM4_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM4_Handler.Init.Period=arr; //自动装载值
TIM4_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV2;//时钟分频因子
HAL_TIM_Base_Init(&TIM4_Handler);
HAL_TIM_Base_Start_IT(&TIM4_Handler); //使能定时器和定时器更新中断
}
//定时器4中断服务函数
void TIM4_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM4_Handler);
}
/***************************************************************
*
*
*TIM5
*
*
****************************************************************/
void TIM5_Init(u16 arr,u16 psc)
{
TIM5_Handler.Instance=TIM5;
TIM5_Handler.Init.Prescaler=psc; //分频系数
TIM5_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM5_Handler.Init.Period=arr; //自动装载值
TIM5_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
HAL_TIM_Base_Init(&TIM5_Handler);
HAL_TIM_Base_Start_IT(&TIM5_Handler); //使能定时器和定时器更新中断
}
//定时器中断服务函数
void TIM5_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM5_Handler);
}
/***************************************************************
*
*
*TIM6
*
*
****************************************************************/
/*************************************************************************************************
* 函 数 名: TIM6_Int_Init
* 函数功能: 初始化TIM6
* 说 明:该函数中的代码由 cube 生成
*************************************************************************************************/
void TIM6_Init(u16 arr,u16 psc)
{
TIM6_Handler.Instance=TIM6; //通用定时器6
TIM6_Handler.Init.Prescaler=psc; //分频系数
TIM6_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM6_Handler.Init.Period=arr; //自动装载值
TIM6_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
HAL_TIM_Base_Init(&TIM6_Handler);
HAL_TIM_Base_Start_IT(&TIM6_Handler); //使能定时器6和定时器6更新中断:TIM_IT_UPDATE
}
//定时器6中断服务函数
void TIM6_DAC_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM6_Handler);
}
/***************************************************************
*
*
*TIM7
*用于判断串口3接收,刷新串口屏
*
****************************************************************/
void TIM7_Init(u16 arr,u16 psc)
{
TIM7_Handler.Instance=TIM7; //通用定时器
TIM7_Handler.Init.Prescaler=psc; //分频系数
TIM7_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM7_Handler.Init.Period=arr; //自动装载值
TIM7_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
HAL_TIM_Base_Init(&TIM7_Handler);
HAL_TIM_Base_Start_IT(&TIM7_Handler); //使能定时器和定时器更新中断:TIM_IT_UPDATE
}
//定时器7中断服务程序
void TIM7_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM7_Handler);
USART3_RX_STA|=1<<15; //标记接收完成
__HAL_TIM_CLEAR_FLAG(&TIM7_Handler,TIM_EventSource_Update ); //清除TIM7更新中断标志
//TIM7->CR1&=~(1<<0); //关闭定时器
}
/***************************************************************
*
*
*TIM9
*
*
****************************************************************/
void TIM9_Init(u16 arr,u16 psc)
{
TIM9_Handler.Instance=TIM9;
TIM9_Handler.Init.Prescaler=psc; //分频系数
TIM9_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM9_Handler.Init.Period=arr; //自动装载值
TIM9_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV2;//时钟分频因子
HAL_TIM_Base_Init(&TIM9_Handler);
HAL_TIM_Base_Start_IT(&TIM9_Handler); //使能定时器和定时器更新中断
}
//定时器中断服务函数
void TIM1_BRK_TIM9_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM9_Handler);
}
/***************************************************************
*
*
*TIM10
*
*
****************************************************************/
void TIM10_Init(u16 arr,u16 psc)
{
TIM10_Handler.Instance=TIM10;
TIM10_Handler.Init.Prescaler=psc; //分频系数
TIM10_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM10_Handler.Init.Period=arr; //自动装载值
TIM10_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV2;//时钟分频因子
HAL_TIM_Base_Init(&TIM10_Handler);
HAL_TIM_Base_Start_IT(&TIM10_Handler); //使能定时器和定时器更新中断
}
//定时器中断服务函数
void TIM1_UP_TIM10_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM10_Handler);
}
/***************************************************************
*
*
*TIM11
*
*
****************************************************************/
void TIM11_Init(u16 arr,u16 psc)
{
TIM11_Handler.Instance=TIM11;
TIM11_Handler.Init.Prescaler=psc; //分频系数
TIM11_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM11_Handler.Init.Period=arr; //自动装载值
TIM11_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV2;//时钟分频因子
HAL_TIM_Base_Init(&TIM11_Handler);
HAL_TIM_Base_Start_IT(&TIM11_Handler); //使能定时器和定时器更新中断
}
//定时器中断服务函数
void TIM1_TRG_COM_TIM11_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM11_Handler);
}
/***************************************************************
*
*
*TIM12
*
*
****************************************************************/
void TIM12_Init(u16 arr,u16 psc)
{
TIM12_Handler.Instance=TIM12;
TIM12_Handler.Init.Prescaler=psc; //分频系数
TIM12_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM12_Handler.Init.Period=arr; //自动装载值
TIM12_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV2;//时钟分频因子
HAL_TIM_Base_Init(&TIM12_Handler);
HAL_TIM_Base_Start_IT(&TIM12_Handler); //使能定时器和定时器更新中断
}
//定时器中断服务函数
void TIM8_BRK_TIM12_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM12_Handler);
}
/***************************************************************
*
*
*TIM13
*
*
****************************************************************/
void TIM13_Init(u16 arr,u16 psc)
{
TIM13_Handler.Instance=TIM13;
TIM13_Handler.Init.Prescaler=psc; //分频系数
TIM13_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM13_Handler.Init.Period=arr; //自动装载值
TIM13_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV2;//时钟分频因子
HAL_TIM_Base_Init(&TIM13_Handler);
HAL_TIM_Base_Start_IT(&TIM13_Handler); //使能定时器和定时器更新中断
}
//定时器中断服务函数
void TIM8_UP_TIM13_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM13_Handler);
}
/***************************************************************
*
*
*TIM14
*
*
****************************************************************/
void TIM14_Init(u16 arr,u16 psc)
{
TIM14_Handler.Instance=TIM14;
TIM14_Handler.Init.Prescaler=psc; //分频系数
TIM14_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM14_Handler.Init.Period=arr; //自动装载值
TIM14_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV2;//时钟分频因子
HAL_TIM_Base_Init(&TIM14_Handler);
HAL_TIM_Base_Start_IT(&TIM14_Handler); //使能定时器和定时器更新中断
}
//定时器中断服务函数
void TIM8_TRG_COM_TIM14_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM14_Handler);
}
main.h
#include "tim.h"
/***************************************************************************************************
* 函 数 名: main
* 入口参数: 无
* 返 回 值: 无
* 函数功能:
* 说 明: 无
****************************************************************************************************/
int main(void)
{
//((1+arr )/72M)*(1+psc )=((1+1999)/72M)*(1+35999)=1秒(1*10^6us)
//TIM1_Init(2000-1,36000-1); //1000ms,
TIM2_Init(2000-1,36000-1);//500ms
TIM3_Init(2000-1,36000-1); //1000ms,
TIM4_Init(2000-1,36000-1); //1000ms,
TIM5_Init(2000-1,36000-1);//1000ms,
TIM6_Init(2000-1,36000-1);//1000ms,
TIM7_Init(2000-1,36000-1); //1000ms,
//TIM8_Init(2000-1,36000-1);//1000ms,
TIM9_Init(2000-1,36000-1);//1000ms,
TIM10_Init(2000-1,36000-1);//1000ms,
TIM11_Init(2000-1,36000-1);//1000ms,
TIM12_Init(2000-1,36000-1);//1000ms,
TIM13_Init(2000-1,36000-1);//1000ms,
TIM14_Init(2000-1,36000-1);//1000ms,
//随便挑两个测试下:
while(1)
{
//TIM6
if(TIM6_flag1>=1){
LED1_ON;
}
if(TIM6_flag1>=2){
LED1_OFF;
TIM6_flag1=0;
}
//TIM10
if(TIM10_flag1>=1){
LED2_ON;
}
if(TIM10_flag1>=2){
LED2_OFF;
TIM10_flag1=0;
}
}
}