STM32 HAL库 HAL_TIM_OC_Stop函数详细解释

STM32 HAL库 HAL_TIM_OC_Stop函数详细解释

关键词: STM32; HAL; PWM; HAL_TIM_OC_Stop

OC (Output Compare)输出比较: 输出比较可以通过比较CNT计数器与CCR(捕获/比较寄存器)值的关系, 来对输出电平进行置0、置1或翻转的操作, 用于输出一定频率和占空比的PWM波形.

HAL_TIM_OC_Stop函数原型

/**
  * @brief  Stops the TIM Output Compare signal generation.
  * @brief  停止TIM输出比较信号生成.

  * @param  htim TIM Output Compare handle
  * @param  htim TIM输出比较句柄

  * @param  Channel TIM Channel to be disabled
  * @param  Channel 要禁用的TIM通道
  *          This parameter can be one of the following values:
  *          可选值:
  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected   TIM通道1
  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected   TIM通道2
  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected   TIM通道3
  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected   TIM通道4
  * @retval HAL status  HAL 状态
  */

/* 停止TIM输出比较信号(Output Compare, OC)生成 */
HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)
{
  /* Check the parameters 参数检验, 检查TIM实例和通道是否有效, 防止非法操作 */
  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

  /* Disable the Output compare channel 禁用输出比较通道 */
  /* 调用底层寄存器操作, 关闭指定通道的比较输出 (PWM输出) 这里通道输出就会关闭 */
  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE);
  /* 若定时器支持刹车功能, 则禁用主输出 (MOE = Main Output Enable) 确保无意外信号输出 */
  /* TIM1和TIM8支持定时器刹车功能 */
  if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
  {
    /* Disable the Main Output */
    /* MOE位状态: 
     * 1    SET:    允许OC/OCN信号输出到引脚(正常产生PWM、OC波形)
     * 0    RESET:  强制OC/OCN引脚进入安全状态(高阻或空闲电平, 取决于OSSI/OSSR位)
     * 即: MOE = 1 才有波形; MOE = 0输出立即关断.
     * 高级定时器才具备MOE, 即带BDTR寄存器的TIM, STM32F4: TIM1、TIM8
     * 常用于电机控制、逆变器、全桥/半桥驱动等需要死区时间+故障刹车的场合
     * 当检测到刹车输入(BKIN)或软件相想紧急停机时, 软件/硬件会拉低MOE, 瞬间关闭所有输出, 防止炸管.
     * 一键切断高级定时器所有PWM/OC输出的宏, 相当于给功率器件拉闸断电.
     */
    __HAL_TIM_MOE_DISABLE(htim);
  }

  /* Disable the Peripheral 关闭定时器计数器, CNT停止累加, CEN位清零, 降低功耗 */
  /* 确定所有通道都无输出后才关闭定时器TIM1 */
  __HAL_TIM_DISABLE(htim);

  /* Set the TIM channel state 把该通道状态置为REDAY, 供下次Start使用 */
  /* 更新通道状态为就绪 Reday, 以便后续重新配置或启动 */
  TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);

  /* Return function status 返回状态 */
  return HAL_OK;
}

HAL_TIM_PWM_Stop函数原型

/**
  * @brief  Stops the PWM signal generation.
  * @param  htim TIM PWM handle
  * @param  Channel TIM Channels to be disabled
  *          This parameter can be one of the following values:
  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)
{
  /* Check the parameters */
  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

  /* Disable the Capture compare channel */
  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE);

  if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
  {
    /* Disable the Main Output */
    __HAL_TIM_MOE_DISABLE(htim);
  }

  /* Disable the Peripheral */
  __HAL_TIM_DISABLE(htim);

  /* Set the TIM channel state */
  TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY);

  /* Return function status */
  return HAL_OK;
}

__HAL_TIM_DISABLE(htim)宏定义解读

/**
  * @brief  Disable the TIM peripheral.
  * @brief  STM32 HAL库中用于安全禁用定时器(TIM)外设的核心操作.
  * @param  __HANDLE__ TIM handle
  * @retval None
  */

/* 禁用TIM1外设的计数器(停止计数), 但仅在满足条件时执行, 避免意外关闭正在使用的定时器通道 */
/* 检查所有通道(主输出CCxE和互补输出CCxNE)是否均已禁用, 确认无输出需求后停止计数器 */
/* 在C语言和宏定义中, 反斜杠\ 是行继续符, 用于将宏定义或长代码分割成多行, 以提高可读性. */
/* \后不能有空格, 反斜杠必须是行末最后一个字符(换行符前无空格) */
/* 缩进不影响功能 \后的换行符会被忽略, 缩进仅为代码美观 */
/* 注释需在\之前 */
#define __HAL_TIM_DISABLE(__HANDLE__) \
  /* do {} while(0) 宏定义安全封装, 确保宏展开后无论调用位置如何, 都能正确形成单条语句块 */
  /* 避免语法冲突, 防止与if/else 等控制流语句结合时产生歧义 */
  do { \
    /* 检查主输出通道是否禁用, TIM_CCER_CCxE_MASK  掩码覆盖所有通道的使能位 CC1E、CC2E、CC3E、CC4E */
    /* 条件成立, 表示所有主输出通道 (如PWM、OC)已关闭 (CCxE = 0) */
    /* 寄存器 TIMx_CCER 位域 CCxE 主输出通道使能 (如PWM、OC) */
    if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \
    { \
      /* 检查互补输出通道是否禁用, TIM_CCER_CCxNE_MASK 掩码覆盖互补通道使能位 CC1NE、CC2NE、CC3NE */
      /* 条件成立, 表示所有互补输出(如高级定时器的死区控制) 已关闭 (CCxNE = 0) */
      /* 寄存器 TIMx_CCER 位域 CCxNE 互补输出通道使能 (高级定时器) */
      if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \
      { \
        /* 禁用计数器, TIM_CR1_CEN 为计数器使能位 (Counter Enable) 清零该位, 停止TIM的计数器和时钟 */
        /* 寄存器TIMx_CR1 位域 CEN 计数器使能(1 = 运行, 0 = 停止) */
        (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \
      } \
    } \
  } while(0)

TIM_CCxChannelCmd函数解读

核心功能: 控制TIM定时器的捕获/比较通道输出使能位CCxE, 直接决定通道引脚是否输出信号


/**
  * @brief  Enables or disables the TIM Capture Compare Channel x.
  * @param  TIMx to select the TIM peripheral
  * @param  Channel specifies the TIM Channel
  *          This parameter can be one of the following values:
  *            @arg TIM_CHANNEL_1: TIM Channel 1
  *            @arg TIM_CHANNEL_2: TIM Channel 2
  *            @arg TIM_CHANNEL_3: TIM Channel 3
  *            @arg TIM_CHANNEL_4: TIM Channel 4
  * @param  ChannelState specifies the TIM Channel CCxE bit new state.
  *          This parameter can be: TIM_CCx_ENABLE or TIM_CCx_DISABLE.
  * @retval None
  */


/* TIMx             定时器外设指针 */
/* Channel          通道编号 */
/* ChannelState     使能/禁用状态 */
void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState)
{
  uint32_t tmp;

  /* Check the parameters 参数验证 */
  /* 验证定时器是否支持比较输出 */
  assert_param(IS_TIM_CC1_INSTANCE(TIMx));
  /* 验证通道号是否合法 */
  assert_param(IS_TIM_CHANNELS(Channel));

  /* 计算位掩码, TIM_CCER_CC1E 为通道1使能位掩码 */
  /* Channel & 0x1FU 将通道号转换为位移量 (确保不超过31位, 防御性编程 )*/
  /* Channel = 1 → tmp = 0x0001 */
  /* Channel = 2 → tmp = 0x0002 */
  /* Channel = 3 → tmp = 0x0004 */
  tmp = TIM_CCER_CC1E << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */

  /* Reset the CCxE Bit 禁用通道 */
  /* 清零对应通道的CCxE位 (无论当前状态如何, 先确保关闭) */
  TIMx->CCER &= ~tmp;

  /* Set or reset the CCxE Bit 设置新状态 */
  /* 根据ChannelState决定是否重新使用通道 */
  TIMx->CCER |= (uint32_t)(ChannelState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */

  /* CCxE = 1 引脚输出PWM/OC信号 启动PWM、单脉冲输出 */
  /* CCxE = 0 引脚变为高阻态或静态电平 紧急关闭电机驱动 */

}


__HAL_TIM_MOE_DISABLE宏定义

安全禁用高级定时器(TIM1、TIM8)主输出(Main Output Enable, MOE)的关键操作
禁用高级定时器的主输出信号(包括所有PWM和互补输出)
仅在所有主通道(CCxE)和互补通道(CCxNE)均已禁用时, 才清除MOE位, 避免意外切断正在使用的输出


/**
  * @brief  Disable the TIM main Output.
  * @param  __HANDLE__ TIM handle
  * @retval None
  * @note The Main Output Enable of a timer instance is disabled only if all the CCx and CCxN channels have been
  *       disabled
  */
#define __HAL_TIM_MOE_DISABLE(__HANDLE__) \
  do { \
    /* 检查主通道是否已禁用 条件成立表示所有主使出通道关闭 无PWM或OC信号输出 */
    if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \
    { \
      /* 检查互补通道是否已禁用 所有互补输出通道已关闭 */
      if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \
      { \
        /* 清零TIMx_BDTR寄存器位的MOE位, 彻底关闭输出级  */
        (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \
      } \
    } \
  } while(0)
  

相关参考链接

STM32中PWM控制主要函数详细解释_stm32启用或者禁用pwm输出函数-优快云博客

STM32HAL库关闭PWM输出后定时器不重新启动问题_hal 关闭pwm-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值