基于STM32F10X系列的TIM6&TIM7 低级定时器配置。
废话不多说,小杜贴代码!
TIM6的配置
#ifndef _TIMER_H
#define _TIMER_H
#include "stm32f10x.h"
void TIM6_Int_Init(u16 arr,u16 psc);
#endif
#include "timer.h"
/**********************************************************
** 函数名: TIM6_Int_Init
** 功能描述: 基本定时器配置
** 输入参数: 无
** 输出参数: 无
** 说明:定时时间=(预分频数+1)*(计数值+1) /TIM6时钟(72MHz),单位(s)
这里溢出时间t=(7200*10000)/72000000s=1s
***********************************************************/
void TIM6_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //使能TIM6时钟
//定时器TIM6初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
//允许更新中断,触发方式中断
TIM_ITConfig(TIM6,TIM_IT_Update, ENABLE); //使能指定的TIM6中断,允许更新中断
// TIM_ITConfig(TIM6,TIM_IT_Trigger,ENABLE);
//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM6, ENABLE); //使能定时器6
}
/**********************************************************
** 函数名: TIM6_IRQHandler
** 功能描述: 定时器6的更新中断服务程序
** 输入参数: 无
** 输出参数: 无
***********************************************************/
void TIM6_IRQHandler(void)
{
if(TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM6,TIM_IT_Update);//清除更新中断标志位
}
}
TIM7和上面同理修改就行啦!
#ifndef _TIMER_H
#define _TIMER_H
#include "stm32f10x.h"
void TIM7_Int_Init(u16 arr,u16 psc);
#endif
/**********************************************************
** 函数名: TIM7_Int_Init
** 功能描述: 基本定时器配置
** 输入参数: 无
** 输出参数: 无
** 说明:定时时间=(预分频数+1)*(计数值+1) /TIM7时钟(72MHz),单位(s)
这里溢出时间t=(7200*10000)/72000000s=1s
***********************************************************/
void TIM7_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE); //使能TIM7时钟
//定时器TIM6初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
//允许更新中断,触发方式中断
TIM_ITConfig(TIM7,TIM_IT_Update, ENABLE); //使能指定的TIM7中断,允许更新中断
// TIM_ITConfig(TIM7,TIM_IT_Trigger,ENABLE);
//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4; //从优先级4级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM7, ENABLE); //使能定时器7
}
/**********************************************************
** 函数名: TIM7_IRQHandler
** 功能描述: 定时器7的更新中断服务程序
** 输入参数: 无
** 输出参数: 无
***********************************************************/
void TIM7_IRQHandler(void)
{
if(TIM_GetITStatus(TIM7, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM7,TIM_IT_Update);//清除更新中断标志位
}
}