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

news2025/1/16 18:30:41

文章目录

  • 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.coloradmin.cn/o/2277652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Rust自学】12.2. 读取文件

12.2.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print)&#xff0c;是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步&#xff1a; 接收命令行参数读…

新垂直电商的社交传播策略与AI智能名片2+1链动模式S2B2C商城小程序的应用探索

摘要&#xff1a;随着互联网技术的不断进步和电商行业的快速发展&#xff0c;传统电商模式已难以满足消费者日益增长的个性化和多元化需求。新垂直电商在此背景下应运而生&#xff0c;通过精准定位、用户细分以及深度社交传播策略&#xff0c;实现了用户群体的快速裂变与高效营…

【ORACLE战报】2025.1月OCP | MySQL考试

2025.1月【最新考试成绩出炉】 OCP战报 MySQL 战报 部分学员成绩及证书

九 RK3568 android11 MPU6500

一 MPU6500 内核驱动 1.1 查询设备连接地址 查看原理图, MPU6500 I2C 连接在 I2C4 上, 且中断没有使用 i2c 探测设备地址为 0x68 1.2 驱动源码 drivers/input/sensors/gyro/mpu6500_gyro.c drivers/input/sensors/accel/mpu6500_acc.c 默认 .config 配置编译了 mpu6550 …

Android JecPack组件之LifeCycles 使用详解

一、背景 LifeCycle 是一个可以感知宿主生命周期变化的组件。常见的宿主包括 Activity/Fragment、Service 和 Application。LifeCycle 会持有宿主的生命周期状态的信息&#xff0c;当宿主生命周期发生变化时&#xff0c;会通知监听宿主的观察者。 LifeCycle 的出现主要是为了…

机器学习(2):线性回归Python实现

1 概念回顾 1.1 模型假设 线性回归模型假设因变量y yy与自变量x xx之间的关系可以用以下线性方程表示&#xff1a; y β 0 β 1 ⋅ X 1 β 2 ⋅ X 2 … β n ⋅ X n ε y 是因变量 (待预测值)&#xff1b;X1, X2, ... Xn 是自变量&#xff08;特征&#xff09;β0, β1,…

2025.1.15——二、字符型注入

一、基本操作&#xff1a;整理已知信息&#xff0c;本题为字符型注入 二、解题步骤 step 1&#xff1a;确认为字符型注入 键入&#xff1a; 1 键入&#xff1a;1 and 12 # 发现报错 键入&#xff1a;1 and 11 # 未发现报错 所以确认为字符型注入 step 2&#xff1a;查询…

4、dockerfile实现lnmp和elk

dockerfile实现lnmp 使用dockerfile n&#xff1a;nginx&#xff0c;172.111.0.10 m&#xff1a;mysql&#xff0c;172.111.0.20 p&#xff1a;php&#xff0c;172.111.0.30 安装配置nginx 1、准备好nginx和wordpress安装包 2、配置dockerfile 3、配置nginx主配置文件ngin…

金融项目实战 05|Python实现接口自动化——登录接口

目录 一、代码实现自动化理论及流程 二、脚本实现的理论和准备工作 1、抽取功能转为自动化用例 2、搭建环境(测试工具) 3、搭建目录结构 三、登录接口脚本实现 1、代码编写 1️⃣api目录 2️⃣script目录 2、断言 3、参数化 1️⃣编写数据存储文件&#xff1a;jso…

Flink链接Kafka

一、基于 Flink 的 Kafka 消息生产者 Kafka 生产者的创建与配置&#xff1a; 代码通过 FlinkKafkaProducer 创建 Kafka 生产者&#xff0c;用于向 Kafka 主题发送消息。Flink 执行环境的配置&#xff1a; 配置了 Flink 的检查点机制&#xff0c;确保消息的可靠性&#xff0c;支…

基于国产麒麟操作系统,通过Kubeadm离线部署Kubernetes 1.28版本

文章目录 前言一、环境准备1.主机操作系统说明2.主机硬件配置3.ansible-playbook相关目录准备4.下载离线部署包4.1. 下载kubeclt、kubeam、kubelet RPM包4.2. 下载docker安装包4.3. 下载containerd安装包4.4. 镜像包下载 二、部署流程三、部署过程1.修改hosts文件2.部署单maste…

3、docker的数据卷和dockerfile

dockerfile--------------------自定义镜像 docker的数据卷&#xff1a; 容器与宿主机之间&#xff0c;或者容器和容器之间的数据共享&#xff08;目录&#xff09;。 创建容器的时间&#xff0c;通过指定目录&#xff0c;实现容器于宿主机之间&#xff0c;或者容器和容器之…

登上Nature!交叉注意力机制 发顶会流量密码!

在深度学习领域&#xff0c;交叉注意力融合技术正迅速崛起&#xff0c;并成为处理多模态数据的关键工具。这一技术通过有效地整合来自不同模态的信息&#xff0c;使得模型能够更好地理解和推理复杂的数据关系。 随着多模态数据的日益普及&#xff0c;如图像、文本和声音等&…

网安——CSS

一、CSS基础概念 CSS有两个重要的概念&#xff0c;分为样式和布局 CSS的样式分为两种&#xff0c;一种是文字的样式&#xff0c;一种是盒模型的样式 CSS的另一个重要的特质就是辅助页面布局&#xff0c;完成HTML不能完成的功能&#xff0c;比如并排显示或精确定位显示 从HT…

SOME/IP协议详解 基础解读 涵盖SOME/IP协议解析 SOME/IP通讯机制 协议特点 错误处理机制

车载以太网协议栈总共可划分为五层&#xff0c;分别为物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0c;传输层&#xff0c;应用层&#xff0c;其中今天所要介绍的内容SOME/IP就是一种应用层协议。 SOME/IP协议内容按照AUTOSAR中的描述&#xff0c;我们可以更进一步…

Mysql--实战篇--SQL优化(查询优化器,常用的SQL优化方法,执行计划EXPLAIN,Mysql性能调优,慢日志开启和分析等)

一、查询优化 1、查询优化器 (Query Optimizer) MySQL查询优化器&#xff08;Query Optimizer&#xff09;是MySQL数据库管理系统中的一个关键组件&#xff0c;负责分析和选择最有效的执行计划来执行SQL查询。查询优化器的目标是尽可能减少查询的执行时间和资源消耗&#xff…

CV项目详解:基于yolo8的车辆识别系统(含源码和具体教程)

使用YOLOv8&#xff08;You Only Look Once&#xff09;和OpenCV实现车道线和车辆检测&#xff0c;目标是创建一个可以检测道路上的车道并识别车辆的系统&#xff0c;并估计它们与摄像头的距离。该项目结合了计算机视觉技术和深度学习物体检测。 使用YOLOv8和OpenCV实现车道线…

osg中实现模型的大小、颜色、透明度的动态变化

以博饼状模型为对象,实现了模型大小、颜色、透明度的动态变化。 需要注意的是一点: // 创建材质对象osg::ref_ptr<osg::Material> material = new osg::Material;material->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0, 1.0, 0.0, 0.5));// 获取模型的…

小米vela系统(基于开源nuttx内核)——openvela开源项目

前言 在 2024 年 12 月 27 日的小米「人车家全生态」合作伙伴大会上&#xff0c;小米宣布全面开源 Vela 操作系统。同时&#xff0c;OpenVela 项目正式上线 GitHub 和 Gitee&#xff0c;采用的是比较宽松的 Apache 2.0 协议&#xff0c;这意味着全球的开发者都可以参与到 Vela…

《数据思维》之数据可视化_读书笔记

文章目录 系列文章目录前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 数据之道&#xff0c;路漫漫其修远兮&#xff0c;吾将上下而求索。 一、数据可视化 最基础的数据可视化方法就是统计图。一个好的统计图应该满足四个标准&#xff1a;准确、有…