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

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.xdnf.cn/news/16137.html

相关文章:

  • Flink-1.19.0源码详解7-Flink集群端调度
  • RWA与DeFi(去中心化金融)的关系是什么?RWA在DeFi中扮演什么角色?
  • 使用ffmpeg转码h265后mac默认播放器不支持问题
  • 亚马逊云科技实战架构:构建可扩展、高效率、无服务器应用
  • 【25-cv-08165】纸牌游戏 UNO注册商标!!由GBC律所代理发案
  • b-up:Enzo_mi:Transformer DETR系列
  • Java 实现 C/S 架构详解:从基础到实战,彻底掌握客户端/服务端编程
  • 项目质量如何提升?
  • C++常见面试题/笔试收录(一)
  • 深入探索Amazon SQS:构建弹性微服务与无服务器应用的秘密武器
  • 模拟退火算法 (Simulated Annealing, SA)简介
  • Unity GC 系列教程第四篇:GC Alloc 优化技巧与实践(下)与 GC 调优
  • Java 垃圾回收器之CMS GC问题分析与解决
  • 嵌入式开发学习———Linux环境下数据结构学习(三)
  • 《Flutter篇第一章》基于GetX 和 Binding、Dio 实现的 Flutter UI 架构
  • 跨境支付入门~国际支付结算(风控篇)
  • 学习游戏制作记录(技能系统)7.24
  • 二、计算机网络技术——第4章:网络层
  • 《计算机“十万个为什么”》之 [特殊字符] 深浅拷贝 引用拷贝:内存世界的复制魔法 ✨
  • 傅里叶转换(机器视觉方向)
  • MST技术加持,简化桌面多屏布局
  • 解决sparksql创建出来的数据库路径错误的问题
  • 音视频中一些常见的知识点
  • 《狼道》:生存智慧与处世哲学
  • sqlsuger 子表获取主表中的一个字段的写法
  • Python 程序设计讲义(8):Python 的基本数据类型——浮点数
  • 基于springboot的乡村旅游在线服务系统/乡村旅游网站
  • 使用Imgui和SDL2做的一个弹球小游戏-Bounze
  • 回顾 Palantir:八年之旅的反思
  • RCLAMP0502A.TCT Semtech:超低电容TVS二极管,高速接口+军工级防护!