当前位置: 首页 > article >正文

【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

    • 宏定义解释

      1. TIM_CKD_DIV1
        • 描述:1分频(不分频)。这意味着定时器的时钟频率与输入时钟频率相同
      2. TIM_CKD_DIV2
        • 描述:2分频。这意味着定时器的时钟频率是输入时钟频率的1/2
      3. TIM_CKD_DIV4
        • 描述:4分频。这意味着定时器的时钟频率是输入时钟频率的1/4

      宏函数

      1. IS_TIM_CKD_DIV(DIV)
        • 描述:检查给定的时钟分频设置是否有效
        • 参数DIV,代表定时器的时钟分频设置
        • 功能:检查DIV是否等于TIM_CKD_DIV1TIM_CKD_DIV2TIM_CKD_DIV4中的任一个
        • 返回值:如果DIV有效,返回1(真),否则返回0(假)

      表格:

      宏定义描述
      TIM_CKD_DIV10x00001分频
      TIM_CKD_DIV20x01002分频
      TIM_CKD_DIV40x02004分频
      宏函数描述
      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_Up0x0000向上计数:从0开始计数,直到自动重装载寄存器(ARR)的值
      TIM_CounterMode_Down0x0010向下计数:从自动重装载寄存器(ARR)的值开始计数,直到0
      TIM_CounterMode_CenterAligned10x0020中心对齐模式1:计数器在向上计数和向下计数时都会在中间重置
      TIM_CounterMode_CenterAligned20x0040中心对齐模式2:计数器在向上计数时在中间重置,向下计数时在最大值重置
      TIM_CounterMode_CenterAligned30x0060中心对齐模式3:计数器在向上计数时在最大值重置,向下计数时在中间重置

③、TIM_Period

自动重装载寄存器的值

  • 功能:指定要加载到定时器的*自动重载寄存器(ARR)*中的周期值。该值在下一个更新事件时被加载
  • 取值范围:0x0000到0xFFFF(即0到65535)
  • 作用:这个周期值决定了定时器的溢出时间。定时器每计数到这个值时,会触发一次更新事件,并重新从0开始计数

示例

假设使用一个定时器,其时钟频率为72MHz,定时器每1秒钟触发一次中断。可以这样配置TIM_Period

  1. 计算定时器的时钟频率

    • 假设定时器的时钟频率为72MHz
    • 你使用了一个预分频器(Prescaler),其值为7200。这意味着定时器的计数频率为72MHz / 7200 = 10kHz
  2. 计算周期值

    • 你希望定时器每1秒钟触发一次中断
    • 因此,周期值(TIM_Period)应该为10kHz * 1s = 10000
  3. 配置定时器

    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定时器

Ⅱ、定时器配置

image-20241218221214553

#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);

http://www.kler.cn/a/500862.html

相关文章:

  • Kubernetes集群架构
  • 【权限管理】Apache Shiro学习教程
  • zookeeper监听机制(Watcher机制)
  • IP 地址与蜜罐技术
  • 二进制编码 和 Base64编码
  • 【C++开源库】Boost.Asio网络库使用介绍
  • 大模型训练(2):内存开销
  • 网络安全-网站协议请求报文(基础篇)
  • NVIDIA Clara平台助力医学影像处理:编程案例与实践探索(下)
  • Word表格内容批量写入Excel
  • 动态规划【打家劫舍】
  • 【python爬虫入门教程13--selenium的自动点击 --小小案例分享】
  • 挖掘用户价值:链动2+1模式、AI智能名片与S2B2C商城小程序的应用研究
  • tensor core实现flash_attn_mma_share_kv源码分析
  • WebSocket、SSE(Server-Sent Events)、HTTP 和 Axios关系总结
  • openEuler安装docker
  • 做一个 简单的Django 《股票自选助手》显示 用akshare 库(A股数据获取)
  • SpringBoot整合Easy-es
  • 计算机网络之---防火墙与入侵检测系统(IDS)
  • 【Rust自学】11.9. 单元测试
  • Kafka 深度剖析
  • MySQL 17 章——触发器
  • CSS圆形序号简单案例
  • 云原生时代的IT运维:从工具到方法论的全面升级
  • Service Work离线体验与性能优化