⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stm32f10x_tim.c

📁 中文固件库.rar
💻 C
📖 第 1 页 / 共 5 页
字号:
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
                   uint16_t ExtTRGFilter)
{
  uint16_t tmpsmcr = 0;
  /* 检查参数 */
  assert_param(IS_TIM_123458_PERIPH(TIMx));
  assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler));
  assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity));
  assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter));
  tmpsmcr = TIMx->SMCR;
  /* 复位 ETR 位 */
  tmpsmcr &= SMCR_ETR_Mask;
  /* 设置预分频器,过滤器值和极性 */
  tmpsmcr |= (uint16_t)(TIM_ExtTRGPrescaler | (uint16_t)(TIM_ExtTRGPolarity | (uint16_t)(ExtTRGFilter << (uint16_t)8)));
  /* 写TIMx SMCR */
  TIMx->SMCR = tmpsmcr;
}

/**
  * @简述  配置 TIMx 预分频器.
  * @参数  TIMx: 此处x可以是1到8以选择外设.
  * @参数  Prescaler: 指定预分频数的新值
  * @参数  TIM_PSCReloadMode: 指定预分频数重载模式
  *          这个参数可以取下面的值之一:
  *          TIM_PSCReloadMode_Update:    TIM 预分频值在更新事件装入.
  *          TIM_PSCReloadMode_Immediate: TIM 预分频值即时装入.
  * @返回  没有
  */
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode)
{
  /* 检查参数 */
  assert_param(IS_TIM_ALL_PERIPH(TIMx));
  assert_param(IS_TIM_PRESCALER_RELOAD(TIM_PSCReloadMode));
  /* 设置预分频器值 */
  TIMx->PSC = Prescaler;
  /* 设置 或 复位 UG 位 */
  TIMx->EGR = TIM_PSCReloadMode;
}

/**
  * @简述  指定 TIMx 计数器模式.
  * @参数  TIMx: 此处x可以是1,2,3,4,5或8以选择外设.
  * @参数  TIM_CounterMode: 待使用的计数器模式
  *          这个参数可以取下面的值之一:
  *          TIM_CounterMode_Up:             TIM 向上计数模式
  *          TIM_CounterMode_Down:           TIM 向下计数模式
  *          TIM_CounterMode_CenterAligned1: TIM 中心对齐模式1
  *          TIM_CounterMode_CenterAligned2: TIM 中心对齐模式2
  *          TIM_CounterMode_CenterAligned3: TIM 中心对齐模式3
  * @返回  没有
  */
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode)
{
  uint16_t tmpcr1 = 0;
  /* 检查参数 */
  assert_param(IS_TIM_123458_PERIPH(TIMx));
  assert_param(IS_TIM_COUNTER_MODE(TIM_CounterMode));
  tmpcr1 = TIMx->CR1;
  /* 复位 CMS 和 DIR 位 */
  tmpcr1 &= CR1_CounterMode_Mask;
  /* 设置计数模式 */
  tmpcr1 |= TIM_CounterMode;
  /* 写 TIMx CR1 寄存器 */
  TIMx->CR1 = tmpcr1;
}

/**
  * @简述  选择输入触发源
  * @参数  TIMx: 此处x可以是1,2,3,4,5或8以选择外设.
  * @参数  TIM_InputTriggerSource: 输入触发源.
  *          这个参数可以取下面的值之一:
  *          TIM_TS_ITR0:    内部触发器 0
  *          TIM_TS_ITR1:    内部触发器 1
  *          TIM_TS_ITR2:    内部触发器 2
  *          TIM_TS_ITR3:    内部触发器 3
  *          TIM_TS_TI1F_ED: TI1 边缘检测其
  *          TIM_TS_TI1FP1:  过滤器时钟输入 1
  *          TIM_TS_TI2FP2:  过滤器时钟输入 2
  *          TIM_TS_ETRF:    外部触发输入
  * @返回  没有
  */
void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource)
{
  uint16_t tmpsmcr = 0;
  /* 检查参数 */
  assert_param(IS_TIM_123458_PERIPH(TIMx));
  assert_param(IS_TIM_TRIGGER_SELECTION(TIM_InputTriggerSource));
  /* 得到 TIMx SMCR 寄存器值 */
  tmpsmcr = TIMx->SMCR;
  /* 复位 TS 位 */
  tmpsmcr &= SMCR_TS_Mask;
  /* 设置输入触发源 */
  tmpsmcr |= TIM_InputTriggerSource;
  /* 写 TIMx SMCR */
  TIMx->SMCR = tmpsmcr;
}

/**
  * @简述  配置 TIMx 编码器界面.
  * @参数  TIMx: 此处x可以是1,2,3,4,5或8以选择外设.
  * @参数  TIM_EncoderMode: 指定 TIMx 编码器模式.
  *          这个参数可以取下面的值之一:
  *          TIM_EncoderMode_TI1:  TIM编码器使用模式1.
  *          TIM_EncoderMode_TI2:  TIM编码器使用模式2.
  *          TIM_EncoderMode_TI12: TIM编码器使用模式3.
  * @参数  TIM_IC1Polarity: 指定 IC1 极性
  *          这个参数可以取下面的值之一:
  *          TIM_ICPolarity_Falling: IC 下降沿.
  *          TIM_ICPolarity_Rising:  IC 上升沿.
  * @参数  TIM_IC2Polarity: 指定 IC2 极性
  *          这个参数可以取下面的值之一:
  *          TIM_ICPolarity_Falling: IC 下降沿.
  *          TIM_ICPolarity_Rising:  IC 上升沿.
  * @返回  没有
  */
void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,
                                uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity)
{
  uint16_t tmpsmcr = 0;
  uint16_t tmpccmr1 = 0;
  uint16_t tmpccer = 0;
    
  /* 检查参数 */
  assert_param(IS_TIM_123458_PERIPH(TIMx));
  assert_param(IS_TIM_ENCODER_MODE(TIM_EncoderMode));
  assert_param(IS_TIM_IC_POLARITY(TIM_IC1Polarity));
  assert_param(IS_TIM_IC_POLARITY(TIM_IC2Polarity));

  /* 得到 TIMx SMCR 寄存器的值 */
  tmpsmcr = TIMx->SMCR;

  /* 得到 TIMx CCMR1 寄存器的值 */
  tmpccmr1 = TIMx->CCMR1;

  /* 得到 TIMx CCER 寄存器的值 */
  tmpccer = TIMx->CCER;

  /* 设置编码器模式 */
  tmpsmcr &= SMCR_SMS_Mask;
  tmpsmcr |= TIM_EncoderMode;

  /* 选择捕获比较 1 和捕获比较 2 作为输入 */
  tmpccmr1 &= CCMR_CC13S_Mask & CCMR_CC24S_Mask;
  tmpccmr1 |= CCMR_TI13Direct_Set | CCMR_TI24Direct_Set;

  /* 设置 TI1 和 TI2 极性 */
  tmpccer &= CCER_CC1P_Reset & CCER_CC2P_Reset;
  tmpccer |= (uint16_t)(TIM_IC1Polarity | (uint16_t)(TIM_IC2Polarity << (uint16_t)4));

  /* 写 TIMx SMCR */
  TIMx->SMCR = tmpsmcr;

  /* 写 TIMx CCMR1 */
  TIMx->CCMR1 = tmpccmr1;

  /* 写 TIMx CCER */
  TIMx->CCER = tmpccer;
}

/**
  * @简述  置 TIMx 输出1为活动或者非活动电平.
  * @参数  TIMx: 此处x可以是1,2,3,4,5或8以选择外设.
  * @参数  TIM_ForcedAction: 输出信号的设置动作.
  *          这个参数可以取下面的值之一:
  *          TIM_ForcedAction_Active:   强制OCxREF为有效电平
  *          TIM_ForcedAction_InActive: 强制OCxREF为无效电平
  * @返回  没有
  */
void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)
{
  uint16_t tmpccmr1 = 0;
  /* 检查参数 */
  assert_param(IS_TIM_123458_PERIPH(TIMx));
  assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction));
  tmpccmr1 = TIMx->CCMR1;
  /* 复位 OC1M 位 */
  tmpccmr1 &= CCMR_OC13M_Mask;
  /* 配置强制输出模式 */
  tmpccmr1 |= TIM_ForcedAction;
  /* 写 TIMx CCMR1 寄存器 */
  TIMx->CCMR1 = tmpccmr1;
}

/**
  * @简述  置 TIMx 输出2为活动或者非活动电平.
  * @参数  TIMx: 此处x可以是1,2,3,4,5或8以选择外设.
  * @参数  TIM_ForcedAction: 输出信号的设置动作.
  *          这个参数可以取下面的值之一:
  *          TIM_ForcedAction_Active:   强制OCxREF为有效电平
  *          TIM_ForcedAction_InActive: 强制OCxREF为无效电平
  * @返回  没有
  */
void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)
{
  uint16_t tmpccmr1 = 0;
  /* 检查参数 */
  assert_param(IS_TIM_123458_PERIPH(TIMx));
  assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction));
  tmpccmr1 = TIMx->CCMR1;
  /* 复位 OC2M 位 */
  tmpccmr1 &= CCMR_OC24M_Mask;
  /* 配置强制输出模式 */
  tmpccmr1 |= (uint16_t)(TIM_ForcedAction << 8);
  /* 写 TIMx CCMR1 寄存器 */
  TIMx->CCMR1 = tmpccmr1;
}

/**
  * @简述  置 TIMx 输出3为活动或者非活动电平.
  * @参数  TIMx: 此处x可以是1,2,3,4,5或8以选择外设.
  * @参数  TIM_ForcedAction: 输出信号的设置动作.
  *          这个参数可以取下面的值之一:
  *          TIM_ForcedAction_Active:   强制OCxREF为有效电平
  *          TIM_ForcedAction_InActive: 强制OCxREF为无效电平
  * @返回  没有
  */
void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)
{
  uint16_t tmpccmr2 = 0;
  /* 检查参数 */
  assert_param(IS_TIM_123458_PERIPH(TIMx));
  assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction));
  tmpccmr2 = TIMx->CCMR2;
  /* 复位 OC1M 位 */
  tmpccmr2 &= CCMR_OC13M_Mask;
  /* 配置强制输出模式 */
  tmpccmr2 |= TIM_ForcedAction;
  /* 写 TIMx CCMR2 寄存器 */
  TIMx->CCMR2 = tmpccmr2;
}

/**
  * @简述  置 TIMx 输出4为活动或者非活动电平.
  * @参数  TIMx: 此处x可以是1,2,3,4,5或8以选择外设.
  * @参数  TIM_ForcedAction: 输出信号的设置动作.
  *          这个参数可以取下面的值之一:
  *          TIM_ForcedAction_Active:   强制OCxREF为有效电平
  *          TIM_ForcedAction_InActive: 强制OCxREF为无效电平
  * @返回  没有
  */
void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)
{
  uint16_t tmpccmr2 = 0;
  /* 检查参数 */
  assert_param(IS_TIM_123458_PERIPH(TIMx));
  assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction));
  tmpccmr2 = TIMx->CCMR2;
  /* 复位 OC2M 位 */
  tmpccmr2 &= CCMR_OC24M_Mask;
  /* 配置强制输出模式 */
  tmpccmr2 |= (uint16_t)(TIM_ForcedAction << 8);
  /* 写 TIMx CCMR2 寄存器 */
  TIMx->CCMR2 = tmpccmr2;
}

/**
  * @简述  使能或者失能 TIMx 在 ARR 上的预装载寄存器.
  * @参数  TIMx: 此处x可以是1,2,3,4,5或8以选择外设.
  * @参数  NewState: 在TIM1_CR1寄存器中的ARPE位的新状态
  *                  这个参数可以是: ENABLE or DISABLE.
  * @返回  没有
  */
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState)
{
  /* 检查参数 */
  assert_param(IS_TIM_ALL_PERIPH(TIMx));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  if (NewState != DISABLE)
  {
    /* 设置 ARR 的预装载位 */
    TIMx->CR1 |= CR1_ARPE_Set;
  }
  else
  {
    /* 复位 ARR 的预装载位 */
    TIMx->CR1 &= CR1_ARPE_Reset;
  }
}

/**
  * @简述  选择 TIM 外设的通讯事件.
  * @参数  TIMx: 此处x可以是1到8以选择外设
  * @参数  NewState: 通讯事件的新状态.
  *                  这个参数可以是: ENABLE 或 DISABLE.
  * @返回  没有
  */
void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState)
{
  /* 检查参数 */
  assert_param(IS_TIM_18_PERIPH(TIMx));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  if (NewState != DISABLE)
  {
    /* 设置 COM 位 */
    TIMx->CR2 |= CR2_CCUS_Set;
  }
  else
  {
    /* 复位 COM 位 */
    TIMx->CR2 &= CR2_CCUS_Reset;
  }
}

/**
  * @简述  选择 TIMx 外设的捕获比较 DMA 源.
  * @参数  TIMx: 此处x可以是1,2,3,4,5或8以选择外设.
  * @参数  NewState: 捕获比较 DMA 源的新状态
  *                  这个参数可以是: ENABLE 或 DISABLE.
  * @返回  没有
  */
void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState)
{
  /* 检查参数 */
  assert_param(IS_TIM_123458_PERIPH(TIMx));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  if (NewState != DISABLE)
  {
    /* 设置 CCDS 位 */
    TIMx->CR2 |= CR2_CCDS_Set;
  }
  else
  {
    /* 复位 CCDS 位 */
    TIMx->CR2 &= CR2_CCDS_Reset;
  }
}

/**
  * @简述  设置或者复位 TIMx 捕获比较控制位.
  * @参数  TIMx: 此处x可以是1到8以选择外设
  * @参数  NewState: 捕获比较预载控制位的新状态
  *                  这个参数可以是: ENABLE 或 DISABLE.
  * @返回  没有
  */
void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState)
{ 
  /* 检查参数 */
  assert_param(IS_TIM_18_PERIPH(TIMx));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  if (NewState != DISABLE)
  {
    /* 设置 CCPC 位 */
    TIMx->CR2 |= CR2_CCPC_Set;
  }
  else

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -