HAL_TIM_IC_MspInit / HAL_TIM_IC_MspDeInit
一、基础定义与定位
关键词拆解
-
HAL_:STM32 HAL库标准函数前缀 -
TIM_IC:TIM Input Capture,定时器输入捕获专用函数(你红外解码用的模式) Msp:MCU Support Package,MCU底层硬件支撑层-
上层
HAL_TIM_IC_Init()只处理定时器内核配置(PSC、ARR、捕获边沿、滤波等计数逻辑) -
Msp函数只负责硬件底层资源:外设时钟、GPIO复用引脚、NVIC中断
-
-
MspInit= Msp Initialization 底层硬件初始化 -
MspDeInit= Msp De-Initialization 底层硬件反初始化/资源释放
核心特性
这两个是回调函数,不需要你手动调用,HAL库会自动触发:
-
调用
HAL_TIM_IC_Init(&htim1)→ 库内部自动执行HAL_TIM_IC_MspInit -
调用
HAL_TIM_IC_DeInit(&htim1)→ 库内部自动执行HAL_TIM_IC_MspDeInit
二、HAL_TIM_IC_MspInit 硬件初始化函数
核心作用
分配、使能定时器输入捕获所需的全部硬件资源,为外设正常工作提供硬件基础。
固定执行3件事(以你TIM1红外代码为例)
-
开启外设时钟
__HAL_RCC_TIM1_CLK_ENABLE(); // 给TIM1定时器上电 __HAL_RCC_GPIOA_CLK_ENABLE(); // 给红外引脚PA8所在GPIOA端口上电外设无时钟则完全不工作,这是所有硬件操作的前提。
-
配置GPIO复用功能 将PA8绑定为
TIM1_CH1复用通道,硬件把引脚内部连通到定时器捕获电路,用来读取红外电平跳变:GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); -
配置并开启NVIC中断 分配中断优先级、打开中断开关,定时器溢出、电平跳变时能进入中断处理红外脉宽:
HAL_NVIC_SetPriority(TIM1_UP_IRQn, 1, 3); HAL_NVIC_EnableIRQ(TIM1_UP_IRQn); HAL_NVIC_SetPriority(TIM1_CC_IRQn, 1, 1); HAL_NVIC_EnableIRQ(TIM1_CC_IRQn);
执行时机
程序中第一次执行 HAL_TIM_IC_Init() 时自动运行,仅分配一次硬件资源。
存在意义
把时钟、引脚、中断这类板级硬件操作和定时器逻辑配置分层,代码结构清晰,CubeMX自动生成,无需手动操作寄存器。
三、HAL_TIM_IC_MspDeInit 硬件反初始化函数
核心作用
注销、释放定时器占用的全部硬件资源,将硬件恢复到上电默认状态,消除资源占用带来的副作用。
固定执行3件对应反向操作(和MspInit一一对应)
-
关闭外设时钟
__HAL_RCC_TIM1_CLK_DISABLE();切断定时器供电,计数器、捕获电路全部停止,大幅降低静态功耗。
-
解除GPIO复用绑定
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_8);清除PA8与TIM1_CH1的复用关系,引脚恢复为上电默认浮空输入,可自由用作按键、LED、串口等其他功能。
-
关闭定时器相关中断
HAL_NVIC_DisableIRQ(TIM1_UP_IRQn); HAL_NVIC_DisableIRQ(TIM1_CC_IRQn);屏蔽定时器溢出、捕获中断触发,避免硬件残留中断标志导致程序频繁进中断、卡死主循环。
执行时机
主动调用 HAL_TIM_IC_DeInit(&htim1) 注销定时器时,库内部自动执行。
存在意义
-
低功耗场景:闲置外设断电,减少休眠电流;
-
引脚复用切换:释放引脚,避免功能冲突;
-
安全重初始化:清空旧硬件状态,修改定时器参数时不会出现测量错乱;
-
故障防护:关闭外设,杜绝无效中断、硬件误动作。
四、两者完整对照表格
| 对比项 | HAL_TIM_IC_MspInit | HAL_TIM_IC_MspDeInit |
|---|---|---|
| 函数功能 | 硬件资源分配、上电初始化 | 硬件资源释放、硬件复位 |
| 触发条件 | 执行 HAL_TIM_IC_Init() 自动调用 | 执行 HAL_TIM_IC_DeInit() 自动调用 |
| 时钟操作 | 开启定时器、GPIO端口时钟 | 关闭定时器时钟,外设断电 |
| GPIO操作 | 配置引脚为定时器复用通道 | 解除复用,引脚恢复默认浮空输入 |
| 中断操作 | 设置优先级并使能定时器中断 | 关闭定时器对应的所有NVIC中断 |
| 使用场景 | 启动红外捕获、定时器第一次初始化 | 休眠待机、切换引脚功能、动态重配定时器、关闭红外功能 |
五、补充关键使用说明
-
成对配套 有
Init就应该配套DeInit,资源有分配就要有释放,是嵌入式标准规范; 若你的设备上电后永久开启红外、不切换引脚、不进休眠,DeInit永远不会执行,不影响基础功能。 - 和你红外工程的关联
-
MspInit:开机给TIM1、PA8供电,开启捕获/溢出中断,实现红外脉宽采集;
-
MspDeInit:不需要红外时释放硬件,省电、释放PA8引脚、防止乱中断。
-
-
注意区分后缀
_IC_这组函数仅用于输入捕获;如果是PWM输出,对应函数为HAL_TIM_PWM_MspInit/HAL_TIM_PWM_MspDeInit,不能混用。

1982

被折叠的 条评论
为什么被折叠?



