STM8S001 IO口复用配PWM

最近用到STM8S001,因为一共8个Pin,所以要复用。
STM8S001 IO口复用配PWM_第1张图片
我使用的是TIM2_CH1(IO8)、TIM2_CH2(IO7)、TIM_CH3(IO5),输出3路PWM。

定时器与pwm配置

这个大同小异,大家都明白,不细说。

void TIM2_PWM_Config(uint16_t CCR1_Val,uint16_t CCR2_Val, uint16_t CCR3_Val)
{
  /* TIM2 1分频,预装载值1000 */
  TIM2_TimeBaseInit(TIM2_PRESCALER_1, 16);
  
    /* 配置TIM2_OC1为PWM1模式 ,装载值CCR1_Val,输出极性:高*/ 
  TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR1_Val, TIM2_OCPOLARITY_HIGH);
  TIM2_OC1PreloadConfig(ENABLE);        //TIM2_OC1预装载使能

  /* 配置TIM2_OC2为PWM1模式 ,装载值CCR2_Val,输出极性:高*/ 
  TIM2_OC2Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR2_Val, TIM2_OCPOLARITY_HIGH);
  TIM2_OC2PreloadConfig(ENABLE);        //TIM2_OC2预装载使能
  
  /* 配置TIM2_OC3为PWM1模式 ,装载值CCR3_Val,输出极性:高*/       
  TIM2_OC3Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR3_Val, TIM2_OCPOLARITY_HIGH);
  TIM2_OC3PreloadConfig(ENABLE);        //TIM2_OC3预装载使能

  TIM2_ARRPreloadConfig(ENABLE);        //TIM2预装载值使能

  /* 使能TIM2 */
  TIM2_Cmd(ENABLE);
}

################## 以下是子程序供参考 #######################
################# 以下是子程序供参考 ########################
################# 以下是子程序供参考 ########################
void TIM2_TimeBaseInit( TIM2_Prescaler_TypeDef TIM2_Prescaler,
                        uint16_t TIM2_Period)
{
  /* Set the Prescaler value */
  TIM2->PSCR = (uint8_t)(TIM2_Prescaler);
  /* Set the Autoreload value */
  TIM2->ARRH = (uint8_t)(TIM2_Period >> 8);
  TIM2->ARRL = (uint8_t)(TIM2_Period);
}
void TIM2_OC1Init(TIM2_OCMode_TypeDef TIM2_OCMode,
                  TIM2_OutputState_TypeDef TIM2_OutputState,
                  uint16_t TIM2_Pulse,
                  TIM2_OCPolarity_TypeDef TIM2_OCPolarity)
{
  /* Check the parameters */
  assert_param(IS_TIM2_OC_MODE_OK(TIM2_OCMode));
  assert_param(IS_TIM2_OUTPUT_STATE_OK(TIM2_OutputState));
  assert_param(IS_TIM2_OC_POLARITY_OK(TIM2_OCPolarity));
  
  /* Disable the Channel 1: Reset the CCE Bit, Set the Output State , the Output Polarity */
  TIM2->CCER1 &= (uint8_t)(~( TIM2_CCER1_CC1E | TIM2_CCER1_CC1P));
  /* Set the Output State &  Set the Output Polarity  */
  TIM2->CCER1 |= (uint8_t)((uint8_t)(TIM2_OutputState & TIM2_CCER1_CC1E ) | 
                           (uint8_t)(TIM2_OCPolarity & TIM2_CCER1_CC1P));
  
  /* Reset the Output Compare Bits  & Set the Ouput Compare Mode */
  TIM2->CCMR1 = (uint8_t)((uint8_t)(TIM2->CCMR1 & (uint8_t)(~TIM2_CCMR_OCM)) |
                          (uint8_t)TIM2_OCMode);
  
  /* Set the Pulse value */
  TIM2->CCR1H = (uint8_t)(TIM2_Pulse >> 8);
  TIM2->CCR1L = (uint8_t)(TIM2_Pulse);
}
void TIM2_OC1PreloadConfig(FunctionalState NewState)
{
  /* Check the parameters */
  assert_param(IS_FUNCTIONALSTATE_OK(NewState));
  
  /* Set or Reset the OC1PE Bit */
  if (NewState != DISABLE)
  {
    TIM2->CCMR1 |= (uint8_t)TIM2_CCMR_OCxPE;
  }
  else
  {
    TIM2->CCMR1 &= (uint8_t)(~TIM2_CCMR_OCxPE);
  }
}
void TIM2_ARRPreloadConfig(FunctionalState NewState)
{
  /* Check the parameters */
  assert_param(IS_FUNCTIONALSTATE_OK(NewState));
  
  /* Set or Reset the ARPE Bit */
  if (NewState != DISABLE)
  {
    TIM2->CR1 |= (uint8_t)TIM2_CR1_ARPE;
  }
  else
  {
    TIM2->CR1 &= (uint8_t)(~TIM2_CR1_ARPE);
  }
}
void TIM2_Cmd(FunctionalState NewState)
{
  /* Check the parameters */
  assert_param(IS_FUNCTIONALSTATE_OK(NewState));
  
  /* set or Reset the CEN Bit */
  if (NewState != DISABLE)
  {
    TIM2->CR1 |= (uint8_t)TIM2_CR1_CEN;
  }
  else
  {
    TIM2->CR1 &= (uint8_t)(~TIM2_CR1_CEN);
  }
}

IO口复用配置

  • STM8与STM32不同IO复用配置不同,32是通过代码配置,而8是通过 option bytes 配置的
    STM8S001 IO口复用配PWM_第2张图片
    STM8S001 IO口复用配PWM_第3张图片
    官方文档 第20页有这么一张表。
    文档中说明了IO5和IO8引脚第一功能就是 TIM2_CH3、TIM2_CH2而IO7第一功能是SPI_CLOCK,所以要进行option bytes 配置,而要配置TM2_CH1只需要将AFR0 选择为 Alternate Active

具体步骤

在debug模式下,选择ST-link
STM8S001 IO口复用配PWM_第4张图片
然后选择option Bytes
STM8S001 IO口复用配PWM_第5张图片
找到相应位,右击
STM8S001 IO口复用配PWM_第6张图片
选择Alternate Active --------ok 再重新编辑烧录一下。然后就成了
对了IO一定要初始化一下,不然对PWM输出有影响。

你可能感兴趣的:(STM8S001 IO口复用配PWM)