输入捕获MspInit和MspDeInit函数

HAL_TIM_IC_MspInit / HAL_TIM_IC_MspDeInit 

一、基础定义与定位

关键词拆解

  1. HAL_:STM32 HAL库标准函数前缀

  2. TIM_IC:TIM Input Capture,定时器输入捕获专用函数(你红外解码用的模式)

  3. Msp:MCU Support Package,MCU底层硬件支撑层
    • 上层 HAL_TIM_IC_Init() 只处理定时器内核配置(PSC、ARR、捕获边沿、滤波等计数逻辑)

    • Msp函数只负责硬件底层资源:外设时钟、GPIO复用引脚、NVIC中断

  4. MspInit = Msp Initialization 底层硬件初始化

  5. 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红外代码为例)

  1. 开启外设时钟

    __HAL_RCC_TIM1_CLK_ENABLE();  // 给TIM1定时器上电
    __HAL_RCC_GPIOA_CLK_ENABLE(); // 给红外引脚PA8所在GPIOA端口上电
    

    外设无时钟则完全不工作,这是所有硬件操作的前提。

  2. 配置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);
    
  3. 配置并开启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一一对应)

  1. 关闭外设时钟

    __HAL_RCC_TIM1_CLK_DISABLE();
    

    切断定时器供电,计数器、捕获电路全部停止,大幅降低静态功耗。

  2. 解除GPIO复用绑定

    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_8);
    

    清除PA8与TIM1_CH1的复用关系,引脚恢复为上电默认浮空输入,可自由用作按键、LED、串口等其他功能。

  3. 关闭定时器相关中断

    HAL_NVIC_DisableIRQ(TIM1_UP_IRQn);
    HAL_NVIC_DisableIRQ(TIM1_CC_IRQn);
    

    屏蔽定时器溢出、捕获中断触发,避免硬件残留中断标志导致程序频繁进中断、卡死主循环。

执行时机

主动调用 HAL_TIM_IC_DeInit(&htim1) 注销定时器时,库内部自动执行。

存在意义

  1. 低功耗场景:闲置外设断电,减少休眠电流;

  2. 引脚复用切换:释放引脚,避免功能冲突;

  3. 安全重初始化:清空旧硬件状态,修改定时器参数时不会出现测量错乱;

  4. 故障防护:关闭外设,杜绝无效中断、硬件误动作。


四、两者完整对照表格

对比项HAL_TIM_IC_MspInitHAL_TIM_IC_MspDeInit
函数功能硬件资源分配、上电初始化硬件资源释放、硬件复位
触发条件执行 HAL_TIM_IC_Init() 自动调用执行 HAL_TIM_IC_DeInit() 自动调用
时钟操作开启定时器、GPIO端口时钟关闭定时器时钟,外设断电
GPIO操作配置引脚为定时器复用通道解除复用,引脚恢复默认浮空输入
中断操作设置优先级并使能定时器中断关闭定时器对应的所有NVIC中断
使用场景启动红外捕获、定时器第一次初始化休眠待机、切换引脚功能、动态重配定时器、关闭红外功能

五、补充关键使用说明

  1. 成对配套Init 就应该配套 DeInit,资源有分配就要有释放,是嵌入式标准规范; 若你的设备上电后永久开启红外、不切换引脚、不进休眠,DeInit永远不会执行,不影响基础功能。

  2. 和你红外工程的关联
    • MspInit:开机给TIM1、PA8供电,开启捕获/溢出中断,实现红外脉宽采集;

    • MspDeInit:不需要红外时释放硬件,省电、释放PA8引脚、防止乱中断。

  3. 注意区分后缀 _IC_ 这组函数仅用于输入捕获;如果是PWM输出,对应函数为 HAL_TIM_PWM_MspInit / HAL_TIM_PWM_MspDeInit,不能混用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值