【STM32-学习笔记-3-】TIM定时器
文章目录
- TIM定时器
- Ⅰ、TIM定时器函数
- Ⅱ、TIM_TimeBaseInitTypeDef结构体参数
- ①、TIM_ClockDivision
- ②、TIM_CounterMode
- ③、TIM_Period
- ④、TIM_Prescaler
- ⑤、TIM_RepetitionCounter
- Ⅱ、定时器配置
- Ⅲ、定时器外部中断
- NVIC配置
TIM定时器
Ⅰ、TIM定时器函数
// 将定时器寄存器重置到默认值
void TIM_DeInit(TIM_TypeDef* TIMx);
// 初始化定时器的基本时间基准参数
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
// 初始化定时器的输出比较通道1
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
// 初始化定时器的输出比较通道2
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
// 初始化定时器的输出比较通道3
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
// 初始化定时器的输出比较通道4
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
// 初始化定时器的输入捕获参数
void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);
// 配置PWM输入模式
void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);
// 配置定时器的BDTR寄存器,用于高级定时器功能
void TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct);
// 初始化基本时间基准结构体
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
// 初始化输出比较结构体
void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);
// 初始化输入捕获结构体
void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct);
// 初始化BDTR结构体
void TIM_BDTRStructInit(TIM_BDTRInitTypeDef* TIM_BDTRInitStruct);
// 使能或禁用定时器
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
// 控制PWM输出
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);
// 配置定时器中断
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
// 产生一个定时器事件
void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource);
// 配置DMA源和突发长度
void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength);
// 使能或禁用DMA请求
void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState);
// 配置定时器的内部时钟模式
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);
// 配置定时器的外部时钟模式1
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
// 配置定时器的TIx外部时钟模式
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
uint16_t TIM_ICPolarity, uint16_t ICFilter);
// 配置定时器的外部触发(ETR)模式1
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
uint16_t ExtTRGFilter);
// 配置定时器的外部触发(ETR)模式2
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,
uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
// 配置定时器的外部触发(ETR)
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
uint16_t ExtTRGFilter);
// 配置定时器的预分频器
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);
// 配置定时器的计数模式
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);
// 选择输入触发源
void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
// 配置编码器接口
void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,
uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);
// 配置强制输出比较1
void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
// 配置强制输出比较2
void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
// 配置强制输出比较3
void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
// 配置强制输出比较4
void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
// 配置ARR预装载
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
// 选择COM(比较输出模式)功能
void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState);
// 选择CCDMA(捕获/比较DMA请求)功能
void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState);
// 控制CC通道的预装载寄存器
void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState);
// 配置输出比较1的预装载
void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
// 配置输出比较2的预装载
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
// 配置输出比较3的预装载
void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
// 配置输出比较4的预装载
void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
// 配置输出比较1的快速模式
void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
// 配置输出比较2的快速模式
void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
// 配置输出比较3的快速模式
void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
// 配置输出比较4的快速模式
void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
// 清除输出比较1的引用
void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
// 清除输出比较2的引用
void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
// 清除输出比较3的引用
void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
// 清除输出比较4的引用
void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
// 配置输出比较1的极性
void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
// 配置输出比较1N的极性
void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
// 配置输出比较2的极性
void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
// 配置输出比较2N的极性
void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
// 配置输出比较3的极性
void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
// 配置输出比较3N的极性
void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
// 配置输出比较4的极性
void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
// 使能或禁用捕获/比较通道x
void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);
// 使能或禁用互补输出通道xN
void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);
// 选择输出比较x模式
void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);
// 禁用更新事件
void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
// 配置更新请求源
void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource);
// 选择霍尔传感器接口
void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState);
// 选择单脉冲模式
void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode);
// 选择定时器的输出触发源
void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource);
// 选择定时器的从模式
void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode);
// 选择定时器的主从模式
void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode);
// 设置定时器的计数值
void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);
// 设置定时器的自动重装载寄存器的值,这个值决定了计数器的最大值
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);
// 设置定时器的比较寄存器1的值,用于输出比较模式
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
// 设置定时器的比较寄存器2的值
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
// 设置定时器的比较寄存器3的值
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
// 设置定时器的比较寄存器4的值
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
// 设置输入捕获通道1的预分频器
void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
// 设置输入捕获通道2的预分频器
void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
// 设置输入捕获通道3的预分频器
void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
// 设置输入捕获通道4的预分频器
void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
// 设置定时器的时钟分割
void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD);
// 获取输入捕获通道1的捕获值
uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);
// 获取输入捕获通道2的捕获值
uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx);
// 获取输入捕获通道3的捕获值
uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx);
// 获取输入捕获通道4的捕获值
uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx);
// 获取定时器的计数值
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
// 获取定时器的预分频器的值
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);
// 获取定时器标志的状态
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
// 清除定时器的特定标志
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
// 获取定时器中断的状态
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
// 清除定时器的中断待处理位
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
Ⅱ、TIM_TimeBaseInitTypeDef结构体参数
①、TIM_ClockDivision
配置定时器时钟分配系数
该参数可以是
@ref TIM_Clock_Division_CKD
:
宏定义解释
TIM_CKD_DIV1
- 描述:1分频(不分频)。这意味着定时器的时钟频率与输入时钟频率相同
TIM_CKD_DIV2
- 描述:2分频。这意味着定时器的时钟频率是输入时钟频率的1/2
TIM_CKD_DIV4
- 描述:4分频。这意味着定时器的时钟频率是输入时钟频率的1/4
宏函数
IS_TIM_CKD_DIV(DIV)
- 描述:检查给定的时钟分频设置是否有效
- 参数:
DIV
,代表定时器的时钟分频设置- 功能:检查
DIV
是否等于TIM_CKD_DIV1
、TIM_CKD_DIV2
或TIM_CKD_DIV4
中的任一个- 返回值:如果
DIV
有效,返回1
(真),否则返回0
(假)表格:
宏定义 值 描述 TIM_CKD_DIV1 0x0000 1分频 TIM_CKD_DIV2 0x0100 2分频 TIM_CKD_DIV4 0x0200 4分频
宏函数 描述 IS_TIM_CKD_DIV(DIV) 检查DIV是否为有效的定时器时钟分频设置
②、TIM_CounterMode
计数器模式
该参数可以是
@ref TIM_Counter_Mode
:
枚举类型定义
typedef enum { TIM_CounterMode_Up = 0x0000, /*!< 向上计数模式 */ TIM_CounterMode_Down = 0x0010, /*!< 向下计数模式 */ TIM_CounterMode_CenterAligned1 = 0x0020, /*!< 中心对齐模式1 */ TIM_CounterMode_CenterAligned2 = 0x0040, /*!< 中心对齐模式2 */ TIM_CounterMode_CenterAligned3 = 0x0060 /*!< 中心对齐模式3 */ } TIMCounterMode_TypeDef;
TIM_CounterMode_Up
:值为0x0000
,表示定时器向上计数
- 从0开始计数,直到自动重装载寄存器(ARR)的值
TIM_CounterMode_Down
:值为0x0010
,表示定时器向下计数
- 从自动重装载寄存器(ARR)的值开始计数,直到0
TIM_CounterMode_CenterAligned1
:值为0x0020
,表示中心对齐模式1
- 计数器在向上计数和向下计数时都会在中间重置
TIM_CounterMode_CenterAligned2
:值为0x0040
,表示中心对齐模式2
- 计数器在向上计数时在中间重置,向下计数时在最大值重置
TIM_CounterMode_CenterAligned3
:值为0x0060
,表示中心对齐模式3
- 计数器在向上计数时在最大值重置,向下计数时在中间重置
宏函数
#define IS_TIM_COUNTER_MODE(MODE) (((MODE) == TIM_CounterMode_Up) || \ ((MODE) == TIM_CounterMode_Down) || \ ((MODE) == TIM_CounterMode_CenterAligned1) || \ ((MODE) == TIM_CounterMode_CenterAligned2) || \ ((MODE) == TIM_CounterMode_CenterAligned3))
- 描述:检查给定的计数模式是否有效
- 参数:
MODE
,代表定时器的计数模式- 功能:检查
MODE
是否等于预定义的计数模式中的任一个- 返回值:如果
MODE
有效,返回1
(真),否则返回0
(假)表格:
计数模式常量 值 描述 TIM_CounterMode_Up
0x0000
向上计数:从0开始计数,直到自动重装载寄存器(ARR)的值 TIM_CounterMode_Down
0x0010
向下计数:从自动重装载寄存器(ARR)的值开始计数,直到0 TIM_CounterMode_CenterAligned1
0x0020
中心对齐模式1:计数器在向上计数和向下计数时都会在中间重置 TIM_CounterMode_CenterAligned2
0x0040
中心对齐模式2:计数器在向上计数时在中间重置,向下计数时在最大值重置 TIM_CounterMode_CenterAligned3
0x0060
中心对齐模式3:计数器在向上计数时在最大值重置,向下计数时在中间重置
③、TIM_Period
自动重装载寄存器的值
- 功能:指定要加载到定时器的*自动重载寄存器(ARR)*中的周期值。该值在下一个更新事件时被加载
- 取值范围:0x0000到0xFFFF(即0到65535)
- 作用:这个周期值决定了定时器的溢出时间。定时器每计数到这个值时,会触发一次更新事件,并重新从0开始计数
示例
假设使用一个定时器,其时钟频率为72MHz,定时器每1秒钟触发一次中断。可以这样配置
TIM_Period
:
计算定时器的时钟频率:
- 假设定时器的时钟频率为72MHz
- 你使用了一个预分频器(Prescaler),其值为7200。这意味着定时器的计数频率为72MHz / 7200 = 10kHz
计算周期值:
- 你希望定时器每1秒钟触发一次中断
- 因此,周期值(
TIM_Period
)应该为10kHz * 1s = 10000配置定时器:
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // 定时器时钟频率为72MHz,预分频器为7200 TIM_TimeBaseStructure.TIM_Prescaler = 7200 - 1; // 预分频器值为7199 TIM_TimeBaseStructure.TIM_Period = 10000 - 1; // 周期值为9999 TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 时钟分频因子为0 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式 // 选择定时器,例如TIM2 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 使能定时器 TIM_Cmd(TIM2, ENABLE);
④、TIM_Prescaler
预分频器的值
- 功能:指定用于分频定时器时钟的预分频器值
- 取值范围:0x0000到0xFFFF(即0到65535)
- 作用:预分频器值为
PSC
时,定时器的计数频率为定时器时钟频率 / (PSC + 1)
。这意味着预分频器值为0时,计数频率等于定时器的时钟频率;预分频器值为65535时,计数频率为定时器时钟频率 / 65536
⑤、TIM_RepetitionCounter
重复计数器的值
若不使用直接将值取
0
即可
- 功能:指定重复计数器的值。每次重复计数器(RCR)的下计数器达到0时,会生成一个更新事件,并从RCR的值(N)重新开始计数
- 取值范围:0x00到0xFF(即0到255)
- 作用:
- 在边缘对齐模式下,
N+1
表示PWM周期的重复次数- 在中心对齐模式下,
N+1
表示半PWM周期的重复次数- 适用范围:此参数仅适用于TIM1和TIM8定时器
Ⅱ、定时器配置
#include "stm32f10x.h" // Device header
void Timer_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能时钟
TIM_InternalClockConfig(TIM2);// 配置定时器的内部时钟模式
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//设置定时器时钟分频(1分频)
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//计数模式(向上计数)
TIM_TimeBaseInitStruct.TIM_Period = 10000 - 1;//自动重装载寄存器的值
TIM_TimeBaseInitStruct.TIM_Prescaler = 7200 - 1;//预分频器的值
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除定时器的更新中断标志位
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//配置定时器中断(更新中断)
//设置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置嵌套向量中断控制器(NVIC)的优先级分组
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;//选择IRQ通道
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//启用这个IRQ通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;//设置抢占优先级为1
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;//设置响应优先级为1
NVIC_Init(&NVIC_InitStruct);
TIM_Cmd(TIM2, ENABLE);//启用定时器
}
/*
//定时中断函数
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)//获取定时器中断的状态
{
//用户代码
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清除定时器的中断标志位
}
}
*/
Ⅲ、定时器外部中断
#include "stm32f10x.h" // Device header
void Timer_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能外部时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//配置GPIO
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0F);// 配置定时器的内部时钟模式
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//设置定时器时钟分频(1分频)
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//计数模式(向上计数)
TIM_TimeBaseInitStruct.TIM_Period = 11 - 1;//自动重装载寄存器的值
TIM_TimeBaseInitStruct.TIM_Prescaler = 1 - 1;//预分频器的值
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除定时器的更新中断标志位
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//配置定时器中断(更新中断)
//设置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置嵌套向量中断控制器(NVIC)的优先级分组
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;//选择IRQ通道
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//启用这个IRQ通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;//设置抢占优先级为1
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;//设置响应优先级为1
NVIC_Init(&NVIC_InitStruct);
TIM_Cmd(TIM2, ENABLE);//启用定时器
}
uint16_t Timer_GetCount(void)
{
return TIM_GetCounter(TIM2);
}
定时中断函数
//void TIM2_IRQHandler(void)
//{
// if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)//获取定时器中断的状态
// {
// //用户代码
// TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清除定时器的中断标志位
// }
//}
NVIC配置
//设置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置嵌套向量中断控制器(NVIC)的优先级分组
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;//选择IRQ通道
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//启用这个IRQ通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;//设置抢占优先级为1
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;//设置响应优先级为1
NVIC_Init(&NVIC_InitStruct);