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输出函数-CSDN博客
STM32HAL库关闭PWM输出后定时器不重新启动问题_hal 关闭pwm-CSDN博客