当前位置: 首页 > news >正文

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博客

http://www.dtcms.com/a/295324.html

相关文章:

  • 期待更好的发展
  • 文件管理困境如何破?ZFile+cpolar打造随身云盘新体验
  • 亲测有效:EPLAN导出CAD图纸,DWG文件里的图纸复制粘贴出错和无法编辑的解决方法
  • EIDE 创建基于STM32-HD的项目快速创建流程
  • 精通Python PDF裁剪:从入门到专业的三重境界
  • 回调后门 函数
  • 微信格式插件 建的文件位置
  • 边缘智能体:轻量化部署与离线运行
  • MIT线性代数02_矩阵消元
  • C语言实现BIOS定义的WMI调用
  • NumPy 线性代数
  • 分布式推客系统开发全解:微服务拆分、佣金结算与风控设计
  • Sklearn 机器学习 数值标准化
  • 变量和函数底层工作原理
  • Mysql常用武功招式
  • 大脑各脑区功能解析:从痛觉处理到动作执行的协作机制
  • runc源码解读(一)——runc create
  • 技术赋能与体验升级:高端网站建设的核心要义
  • 【VSCode】复制到下一行快捷键
  • SparkSQL 子查询 IN/NOT IN 对 NULL 值的处理
  • 【分布式锁】什么是分布式锁?分布式锁的作用?
  • Windows计算器项目全流程案例:从需求到架构到实现
  • 宝塔通过docker部署JupyterHub指南【常见错误处理】
  • 深入解析文件操作(下)- 文件的(顺序/随机)读写,文件缓冲区,更新文件
  • 【AI】Jupyterlab中数据集的位置和程序和Pycharm中的区别
  • 20-ospf技术
  • MIT线性代数01_方程组的几何解释
  • 绿色转向的时代红利:创新新材如何以技术与标准主导全球铝业低碳重构
  • 旅行短视频模糊的常见原因及应对方法
  • 内网穿透:打破网络限制的利器,内外网概念、穿透原理、实际操作方法步骤