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

【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 headervoid 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);//配置定时器中断(更新中断)//设置NVICNVIC_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;//设置抢占优先级为1NVIC_InitStruct.NVIC_IRQChannelSubPriority  = 1;//设置响应优先级为1NVIC_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 headervoid Timer_Init(void)
{    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能外部时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//配置GPIOGPIO_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);//配置定时器中断(更新中断)//设置NVICNVIC_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;//设置抢占优先级为1NVIC_InitStruct.NVIC_IRQChannelSubPriority  = 1;//设置响应优先级为1NVIC_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配置

//设置NVICNVIC_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;//设置抢占优先级为1NVIC_InitStruct.NVIC_IRQChannelSubPriority  = 1;//设置响应优先级为1NVIC_Init(&NVIC_InitStruct);

相关文章:

【STM32-学习笔记-3-】TIM定时器

文章目录 TIM定时器Ⅰ、TIM定时器函数Ⅱ、TIM_TimeBaseInitTypeDef结构体参数①、TIM_ClockDivision②、TIM_CounterMode③、TIM_Period④、TIM_Prescaler⑤、TIM_RepetitionCounter Ⅱ、定时器配置Ⅲ、定时器外部中断NVIC配置 TIM定时器 Ⅰ、TIM定时器函数 // 将定时器寄存器…...

EMS专题 | 守护数据安全:数据中心和服务器机房环境温湿度监测

您需要服务器机房温度监测解决方案吗&#xff1f; 服务器机房是企业中用于存储、管理和维护服务器及其相关组件的设施。服务器机房通常位于数据中心内&#xff0c;是一个专门设计的物理环境&#xff0c;旨在确保服务器的稳定运行和数据的安全性。服务器机房主要起到存储和管理数…...

Vue JavaScript 小写数字金额转换成大写汉字(附编程思路)

一、编程思路&#xff08;本案例只考虑9999万亿以内的数字转换&#xff0c;相信这个金额对于人民币来说已经足够庞大了&#xff0c;超过此数值的金额不保证转换汉字的准确性&#xff0c;且最多精确到小数点后四位&#xff09;&#xff1a; 1、将示例&#xff08;不管是…...

【自动化测试】—— Appium安装配置保姆教程(图文详解)

目录 一. 环境准备 二. JDK安装 1. 下载JDK 2. 安装JDK 3. 配置环境 4. 验证安装 三. Android SDK安装 1. 下载Android SDK 2. 安装Android SDK 3. 安装工具 4. 配置环境 5. 验证安装 四. NodeJS安装 1. 下载NodeJS 2. 安装NodeJS 3. 验证安装 4. 安装淘宝镜像…...

贪心算法详细讲解(沉淀中)

文章目录 1. 什么是贪心算法&#xff1f;&#xff08;贪婪鼠目寸光&#xff09;经典例题1.1.1 找零问题1.1.2最小路径和1.1.3 背包问题 2.贪心算法的特点2.1 证明例1 3.学习贪心的方向心得体会 1. 什么是贪心算法&#xff1f;&#xff08;贪婪鼠目寸光&#xff09; 贪心策略&a…...

RabbitMQ中有哪几种交换机类型?

大家好&#xff0c;我是锋哥。今天分享关于【RabbitMQ中有哪几种交换机类型&#xff1f;】面试题。希望对大家有帮助&#xff1b; RabbitMQ中有哪几种交换机类型&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在RabbitMQ中&#xff0c;交换机&#xf…...

STM32特殊功能引脚详解文章·STM32特殊功能引脚能当作GPIO使用嘛详解!!!

目录 STM32特殊功能引脚 使用STM32特殊功能引脚函数 禁止搬运&#xff0c;仅供学习&#xff0c;编写不易&#xff0c;感谢理解&#xff01;&#xff01;&#xff01; STM32特殊功能引脚 本篇详解文章仅以STM32F103C8T6芯片来讲解&#xff0c;STM32芯片除了普通的GPIO引脚以外…...

Qt QComboBox的QSS美化

美化效果 QSS设置 /*QComboBox风格设置*/ QComboBox#comboBox_1 { border:2px solid #f3f3f3;/*设置边框线宽*/ background-color:rgb(237, 242, 255);/*背景颜色*/ border-radius:5px;/*圆角*/ padding: 1px 2px 1px 2px;/*针对组合框中的文本内容*/ min-width:2em;/*组合框…...

计算机视觉算法实战——实时车辆检测和分类(主页有相关源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​​​​​​​​​​​​​​​​ 1. 领域介绍✨✨ 实时车辆检测和分类是计算机视觉中的一个重要应用领域&#xff0c;旨在从视频流或…...

what?ngify 比 axios 更好用,更强大?

文章目录 前言一、什么是ngify&#xff1f;二、npm安装三、发起请求3.1 获取 JSON 数据3.2 获取其他类型的数据3.3 改变服务器状态3.4 设置 URL 参数3.5 设置请求标头3.6 与服务器响应事件交互3.7 接收原始进度事件3.8 处理请求失败3.9 Http Observables 四、更换 HTTP 请求实现…...

安装虚拟机VMware遇到的问题

问题1&#xff1a;进入如下界面&#xff0c;不知道如何操作 解决办法 键盘⬇️&#xff0c;选择“Reset the system”回车 问题2&#xff1a;系统存放位置我给放在了VMware安装目录&#xff0c;具体D:\software\VMware\Windows安装不行 解决办法&#xff1a;D:\software\virt…...

通过ESP32和INMP441麦克风模块实现音频数据传递

在现代物联网&#xff08;IoT&#xff09;项目中&#xff0c;音频数据的采集与传输成为了一个热门的应用领域。通过结合ESP32开发板和INMP441麦克风模块&#xff0c;我们可以实现一个低成本、高效率的音频数据传输系统。本文将详细介绍如何使用这两种硬件组件来构建和测试音频传…...

Vue中nextTick实现原理

源码实现思路&#xff08;面试高分回答&#xff09; 面试官问我 Vue 的 nextTick 原理是怎么实现的&#xff0c;我这样回答&#xff1a; 在调用 this.$nextTick(cb) 之前&#xff1a; 存在一个 callbacks 数组&#xff0c;用于存放所有的 cb 回调函数。存在一个 flushCallbac…...

数据仓库基础常见面试题

1.数据仓库是什么 ‌数据仓库&#xff08;Data Warehouse&#xff09;是一个面向主题的、集成的、非易失的、随时间变化的数据集合&#xff0c;用于支持企业的管理决策‌。它不同于传统的操作型数据库&#xff0c;后者主要用于处理日常业务交易和实时查询&#xff0c;而数据仓库…...

Java设计模式——单例模式(特性、各种实现、懒汉式、饿汉式、内部类实现、枚举方式、双重校验+锁)

文章目录 单例模式1️⃣特性&#x1f4aa;单例模式的类型与实现&#xff1a;类型懒汉式实现(线程不安全)懒汉式实现(线程安全&#xff09;双重锁校验懒汉式(线程安全)饿汉式实现(线程安全)使用类的内部类实现⭐枚举方式实现单例&#xff08;推荐&#xff09;&#x1f44d; 单例…...

数字普惠金融对新质生产力的影响研究(2015-2023年)

基于2015—2023年中国制造业上市公司数据&#xff0c;探讨了数字普惠金融对制造业企业新质生产力的影响及作用机理。研究发现&#xff0c;数字普惠金融有助于促进制造业企业新质生产力的发展&#xff0c;尤其是在数字普惠金融的使用深度较大的情况下&#xff0c;其对新质生产力…...

国产编辑器EverEdit - 扩展脚本:新建同类型文件(避免编程学习者反复新建保存练习文件)

1 扩展脚本&#xff1a;在当前文件目录下新建同类型文件 1.1 应用场景 用户在进行编程语言学习时&#xff0c;比如&#xff1a;Python&#xff0c;经常做完一个小练习后&#xff0c;又需要新建一个文件&#xff0c;在新建文件的时候&#xff0c;不但要选择文件类型&#xff0c…...

jupyter notebook练手项目:线性回归——学习时间与成绩的关系

线性回归——学习时间与学习成绩的关系 第1步&#xff1a;导入工具库 pandas——数据分析库&#xff0c;提供了数据结构&#xff08;如DataFrame和Series&#xff09;和数据操作方法&#xff0c;方便对数据集进行读取、清洗、转换等操作。 matplotlib——绘图库&#xff0c;p…...

dockerfile2.0

dockerfile实现lnmp nginx centos7 mysql centos7 php centos7 自定义镜像来实现整个架构 cd /opt mkdir nginx mysql php cd nginx 拖入nginx和wordpress vim Dockerfile vim nginx.conf ↓ worker_processes 1; events {worker_connections 1024; } http {include …...

【spring mvc】文件上传、下载

文件上传&#xff0c;存储至本地目录中 一、代码1、工具类&#xff08;敏感后缀过滤&#xff09;2、文件上传&#xff0c;存储至本地3、文件下载 二、效果演示1、上传1.1、postMan 请求1.2、上传效果 2、下载2.1、下载效果 一、代码 1、工具类&#xff08;敏感后缀过滤&#x…...

论文写作“智多星”:书匠策AI,开启期刊论文新纪元

在学术的广袤天地里&#xff0c;论文写作宛如一场充满挑战的冒险之旅。尤其是期刊论文&#xff0c;它不仅是学者研究成果的集中展现&#xff0c;更是学术交流与进步的重要桥梁。但面对选题迷茫、资料繁杂、结构搭建困难等诸多难题&#xff0c;许多学者常常感到力不从心。别担心…...

Linux五种I/O模型详解与性能对比

1. Linux I/O 模型基础概念解析在深入探讨五种I/O模型之前&#xff0c;我们需要先理解几个关键的基础概念。这些概念是理解不同I/O模型差异的基石&#xff0c;也是很多开发者在实际工作中容易混淆的地方。1.1 用户态与内核态Linux系统将运行环境分为用户态(User mode)和内核态(…...

基于轮胎力学特性绘制CarSim 175/70R13轮胎附着椭圆图

基于轮胎力学特性绘制‘附着椭圆’ 1. 轮胎型号&#xff1a;CarSim 175/70R13 (Pacejka 5.2, Symmetric) 2.绘制内容&#xff1a; &#xff08;1&#xff09;路面附着系数为1时&#xff0c;不同垂向载荷下轮胎纵、侧向力学特性曲线。 &#xff08;2&#xff09;路面附着系数为1…...

CVPR 2024人脸黑科技:3D头像重建如何用单张自拍搞定?附开源项目推荐

CVPR 2024单图3D头像重建技术实战&#xff1a;从算法原理到开源工具落地 当你在社交媒体上传自拍时&#xff0c;是否想过这张平面照片能瞬间转化为可360度旋转的数字化身&#xff1f;CVPR 2024最新研究成果正在让这个想象成为现实——无需专业设备&#xff0c;仅用普通手机拍摄…...

BR DI426数字输入模块

B&R DI426 数字输入模块是一款工业自动化系统用的 I/O 模块&#xff0c;主要用于采集现场开关量信号并传输至控制系统。一、基本概述型号&#xff1a;DI426类型&#xff1a;数字输入模块用途&#xff1a;采集工业现场的开关量信号&#xff0c;为控制系统提供输入数据二、主…...

图网络梯度计算与反向传播:自动微分技术的完整指南

图网络梯度计算与反向传播&#xff1a;自动微分技术的完整指南 【免费下载链接】graph_nets Build Graph Nets in Tensorflow 项目地址: https://gitcode.com/gh_mirrors/gr/graph_nets 在深度学习领域&#xff0c;图网络&#xff08;Graph Networks&#xff09;凭借其处…...

深度解析 Claude Code v2.1.88 源码:技术栈与底层实现全揭秘(基于流出架构资料)

深度解析 Claude Code v2.1.88 源码:技术栈与底层实现全揭秘(基于流出架构资料) 摘要:2026年3月31日,Claude Code v2.1.88 相关技术资料(含TypeScript工程架构、核心模块实现逻辑,合计51.2万行代码量级)公开流出,包含其核心架构、工具系统、安全机制等全部实现细节。…...

避开Psins惯导仿真中的那些“坑”:ethupdate参数传递与setdiag内存操作详解

避开Psins惯导仿真中的那些“坑”&#xff1a;ethupdate参数传递与setdiag内存操作详解 在惯性导航系统&#xff08;SINS&#xff09;仿真中&#xff0c;Psins工具箱因其高效性和灵活性备受开发者青睐。然而&#xff0c;即便是经验丰富的工程师&#xff0c;也常在一些看似简单的…...

测试缺陷类型词云图分析:聚焦“需求理解错误”

在软件质量保障的浩瀚星图中&#xff0c;缺陷是不可避免的阴影。通过对海量缺陷报告进行文本挖掘与可视化分析&#xff0c;一张揭示问题本质的“词云图”便清晰浮现。在这张图上&#xff0c;若“需求理解错误”一词以其巨大、醒目的字体高频占据中心&#xff0c;它便不再是一个…...

AI赋能tokenp:借助快马多模型能力生成具备智能风控与建议的钱包原型

最近在尝试用AI辅助开发一个智能化的tokenp钱包原型&#xff0c;发现InsCode(快马)平台的多模型AI能力特别适合快速实现这类需求。今天就来分享下如何用React构建一个带AI风控和建议功能的增强型钱包界面。 项目整体构思 传统钱包应用主要关注资产存储和转账&#xff0c;而结合…...