Air001 TIM16/17通用定时器单脉冲输出模式使用

Air001 TIM16/17通用定时器单脉冲输出模式使用


  • 相关篇《Air001 TIM1高级定时器单脉冲输出模式使用》
✨对于单脉冲输出模式,高级定时器和通用定时器的实现是由差异的,为了在通用定时器上实现此功能,也是卡了很久。
  • 现有的SDK资源,所能提供的公开资料里面,对于单脉冲模式具体使用很少。

  • 工程的配置方法可以参考《Air001 TIM16通用定时器作PWM输出和延时使用》

⛳配置注意事项

  • 对应单脉冲模式,PWM输出比较模式只能选择:TIM_OCMODE_PWM1TIM_OCMODE_PWM2
  • 对应单脉冲模式,PWM输出极性选择:TIM_OCPOLARITY_LOWTIM_OCPOLARITY_HIGH
  • 使用定时器16/17只能选择向上计数方式。

调用方式不同

  • 高级定时器,单脉冲模式输出(从模式触发除外):
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);//开启
//给一定的延时时间
 HAL_Delay(500);//给一定的延时
HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);//关闭
  • 通用定时器,单脉冲模式输出:
        __HAL_TIM_ENABLE(&htim16);
        HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1);
        HAL_Delay(500);//给一定的延时
        __HAL_TIM_DISABLE(&htim16);//关闭定时器

代码配置

  • 定时器驱动代码配置
TIM_HandleTypeDef htim16;

/* TIM16 init function */
void MX_TIM16_Init(void)
{

  /* USER CODE BEGIN TIM16_Init 0 */

  /* USER CODE END TIM16_Init 0 */

  TIM_OC_InitTypeDef sConfigOC = {0};
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};

  /* USER CODE BEGIN TIM16_Init 1 */

  /* USER CODE END TIM16_Init 1 */
  htim16.Instance = TIM16;
  htim16.Init.Prescaler = 8-1;
  htim16.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim16.Init.Period = 5000;
  htim16.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim16.Init.RepetitionCounter = 0;
  htim16.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim16) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_OC_Init(&htim16) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_OnePulse_Init(&htim16, TIM_OPMODE_SINGLE) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 2000;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  if (HAL_TIM_OC_ConfigChannel(&htim16, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  sBreakDeadTimeConfig.DeadTime = 0;
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim16, &sBreakDeadTimeConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM16_Init 2 */

  /* USER CODE END TIM16_Init 2 */
  HAL_TIM_MspPostInit(&htim16);

}
  • main函数实现
int main(void)
{
    uint16_t plusewidth = 5000;//脉冲宽度;f=1000 000/5000=200Hz
    uint16_t plusedelay = 1000;//脉宽1MS
    /* 初始化所有外设,Flash接口,SysTick */
    HAL_Init();

    /* 系统时钟配置 */
    APP_SystemClockConfig();
    MX_GPIO_Init();
    MX_TIM16_Init();
    __HAL_TIM_SET_AUTORELOAD(&htim16, plusewidth - 1); //调整分频系数,可以改变arr以改变频率
    __HAL_TIM_SET_COMPARE(&htim16, TIM_CHANNEL_1, plusedelay); //PWM脉冲宽度,修改占空比比较值
//    if(HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1) != HAL_OK)
//    {
//        Error_Handler();
//    }

    while(1)
    {
        __HAL_TIM_ENABLE(&htim16);
        HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1);
        HAL_Delay(500);
        __HAL_TIM_DISABLE(&htim16);
    }
}

Air001 TIM16/17通用定时器单脉冲输出模式使用_第1张图片

Air001 TIM16/17通用定时器单脉冲输出模式使用_第2张图片

  • Air001 定时器17功能相同,不再赘述。
  • 测试工程
链接:https://pan.baidu.com/s/1dLwa-6uBFhZKxEnYTBIeCg 
提取码:myw9

  • 此文章仅作为个人学习探索知识的总结,不作为他人引用者的理论依据,由于学识所限,难免会出现错误或纰漏,欢迎大家指正。

你可能感兴趣的:(合宙MCU系列,Air001,定时器16单脉冲)