学习HAL库STM32F103C8T6(输入捕获、测量按键按下时间实验、脉冲捕获、捕获按键脉冲实验)

1.输入捕获原理

  1. 信号捕获通道

    • 每个定时器通道(如TIMx_CH1)对应独立的捕获/比较寄存器(CCRx),当检测到指定边沿(上升沿/下降沿)时,当前计数器值(CNT)自动锁存至CCRx寄存器。
    • 通道支持直接模式(捕获自身引脚信号)或间接模式(映射其他通道信号)。
  2. 信号处理流程
    外部信号(TIx)需经过四级处理:

    • 滤波‌:通过数字滤波器(ICFilter)消除抖动(如连续8次采样确认有效边沿);
    • 边沿检测‌:配置极性(CCER寄存器)选择上升沿/下降沿触发;
    • 分频‌:设置预分频器(ICPrescaler)控制捕获频率(如2分频需2次跳变才触发);
    • 锁存‌:有效边沿触发时,CNT值存入CCRx寄存器。

2. 定时器输入捕获实验配置步骤

3.测量按键按下时长思路

                

4.测量按键按下时间

使用定时器2通道2来捕获按键2按下时间,并通过串口打印。

计一个数的时间:1us,PSC=71,ARR=65535

下降沿捕获、输入通道2映射在TI2上、不分频、不滤波

编写代码

主函数调用串口函数

实现效果(利用串口调试助手)

新函数讲解

4.1HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim)函数

HAL_TIM_IC_Init 是 STM32 HAL 库中用于初始化定时器输入捕获(Input Capture)功能的函数,其核心作用是为后续的输入捕获操作配置定时器的基本参数。以下是详细解析:

  1. 输入参数

    • htim:指向 TIM_HandleTypeDef 结构体的指针,包含定时器实例(如 TIM2)、计数模式、预分频值(Prescaler)、自动重装载值(Period)等配置信息‌。
    • 需通过 HAL_TIM_IC_MspInit 回调函数初始化底层硬件(如 GPIO、时钟、中断)‌。
  2. 返回值

    • HAL_OK:初始化成功。
    • HAL_ERROR:参数无效或硬件错误‌

4.2HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, const TIM_IC_InitTypeDef *sConfig, uint32_t Channel)函数

HAL_TIM_IC_ConfigChannel 是 STM32 HAL 库中用于配置定时器输入捕获通道的关键函数,其核心功能是设置捕获通道的边沿极性、滤波参数等硬件特性。以下是详细解析:

  1. 输入参数

    • htim:指向 TIM_HandleTypeDef 结构体的指针,包含定时器实例(如 TIM3)及基础配置(预分频器、计数模式等)‌。
    • sConfigTIM_IC_InitTypeDef 结构体指针,定义通道的捕获参数:
      • ICPolarity:边沿极性(上升沿/下降沿/双沿触发)‌。
      • ICSelection:输入映射模式(直接/间接通道)‌。
      • ICPrescaler:输入捕获预分频(降低捕获频率)‌。
      • ICFilter:数字滤波器长度(消除信号抖动)‌。
    • Channel:目标通道编号(如 TIM_CHANNEL_1)‌。
  2. 返回值

    • HAL_OK:配置成功。
    • HAL_ERROR:参数无效或硬件错误‌。

4.3HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)函数

HAL_TIM_IC_Start_IT 是 STM32 HAL 库中用于启动定时器输入捕获功能并启用中断的核心函数,其功能与实现机制如下:

  1. 输入参数

    • htim:指向 TIM_HandleTypeDef 结构体的指针,包含定时器实例(如 TIM2)、计数模式、预分频值等配置信息。
    • Channel:指定捕获通道(如 TIM_CHANNEL_1),支持单通道或多通道独立配置。
  2. 返回值

    • HAL_OK:启动成功。
    • HAL_ERROR:参数无效或硬件错误。

4.4__weak void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)函数

HAL_TIM_IC_MspInit 是 STM32 HAL 库中用于初始化定时器输入捕获(Input Capture)底层硬件资源的弱定义(__weak)回调函数,其核心功能与实现要点如下:

一、函数特性与调用机制

  1. 弱定义属性
    通过 __weak 关键字声明,允许用户在工程中重写该函数以覆盖默认实现1215。若未重写,则使用 HAL 库中的空函数默认实现。

  2. 调用时机
    在 HAL_TIM_IC_Init() 执行时自动触发,用于初始化与 MCU 相关的硬件资源(如 GPIO、时钟、中断等)。

二、典型实现内容

  1. 硬件资源配置

    • GPIO 初始化‌:配置输入捕获通道对应的引脚为复用功能模式(AF)。
    • 时钟使能‌:开启定时器和 GPIO 外设时钟。
    • 中断配置‌:设置 NVIC 优先级并使能中断(若使用中断模式)。
  2. DMA 配置(可选)
    若使用 DMA 传输捕获数据,需在此函数中初始化 DMA 通道并关联到定时器。

4.5__weak void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)函数

HAL_TIM_IC_CaptureCallback 是 STM32 HAL 库中用于处理输入捕获中断的弱定义(__weak)回调函数,其核心功能与实现要点如下:

  1. 弱定义属性
    通过 __weak 关键字声明,允许用户在工程中重写该函数以实现自定义捕获逻辑111。若未重写,则默认执行 HAL 库中的空实现1113。

  2. 触发条件
    当输入捕获事件(如上升沿/下降沿触发)发生时,硬件自动调用此函数,并通过 htim 参数传递触发中断的定时器实例16。

4.6uint32_t HAL_TIM_ReadCapturedValue(const TIM_HandleTypeDef *htim, uint32_t Channel)函数

HAL_TIM_ReadCapturedValue 是 STM32 HAL 库中用于读取定时器输入捕获值的核心函数,其功能与使用要点如下:

一、函数功能与参数

  1. 输入参数

    • htim:指向已初始化的定时器句柄(如 &htim2),需包含定时器实例(TIMx)和配置信息。
    • Channel:指定捕获通道(如 TIM_CHANNEL_1),支持多通道独立读取。
  2. 返回值
    返回指定通道的捕获寄存器(CCRx)值,数据类型为 uint32_t


二、底层操作原理

  1. 寄存器级操作
    直接读取定时器的捕获/比较寄存器(CCRx),不涉及 ARR 或其他寄存器。例如:

    • 对于 TIM2_CH1,实际访问的是 TIM2->CCR1 寄存器。
  2. 触发条件
    需在输入捕获事件(如上升沿/下降沿触发)发生后调用,通常结合中断使用。

4.7TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__)函数

TIM_RESET_CAPTUREPOLARITY 是 STM32 HAL 库中用于清除定时器输入捕获通道极性的宏函数,其核心功能与实现要点如下:

一、功能与作用

  1. 极性重置
    清除指定定时器通道的输入捕获极性配置(上升沿/下降沿),将 CCER 寄存器中对应通道的 CCxP 和 CCxNP 位清零。
    常用于动态切换捕获边沿(如从上升沿改为下降沿)前的寄存器清理操作。

  2. 参数说明

    • __HANDLE__:定时器句柄(如 &htim2),需包含定时器实例指针。
    • __CHANNEL__:目标通道(如 TIM_CHANNEL_1),支持通道1-4。

二、底层实现原理

  1. 寄存器操作
    直接操作定时器的 CCER 寄存器,通过位掩码清除对应通道的极性控制位:

    • 通道1-3:清除 CCxP 和 CCxNP 位(双极性控制)。
    • 通道4:仅清除 CC4P 位(单极性控制)。

4.8TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__)函数

TIM_SET_CAPTUREPOLARITY 是 STM32 HAL 库中用于动态设置定时器输入捕获极性的宏函数,其核心功能与使用要点如下:

一、功能与参数

  1. 作用
    动态配置定时器输入捕获通道的触发边沿极性(上升沿/下降沿/双边沿),通常用于实时切换信号捕获条件。

  2. 参数说明

    • __HANDLE__:定时器句柄(如 &htim2
    • __CHANNEL__:目标通道(TIM_CHANNEL_1~4
    • __POLARITY__:极性枚举值(如 TIM_INPUTCHANNELPOLARITY_RISING

二、底层实现原理

  1. 寄存器操作
    通过修改定时器的 CCER 寄存器中 CCxP 和 CCxNP 位(通道1-3)或 CC4P 位(通道4)实现极性控制。

4.9__HAL_TIM_DISABLE(__HANDLE__)函数

__HAL_TIM_DISABLE 是 STM32 HAL 库中用于禁用定时器计数器的底层宏函数,其核心功能与实现机制如下:

一、功能与作用

  1. 立即停止计数
    通过清除定时器控制寄存器(CR1)的 CEN 位,强制停止指定定时器的计数器运行。
    适用于需要紧急停止定时器的场景(如异常处理或模式切换)。

  2. 参数说明

    • __HANDLE__:定时器句柄指针(如 &htim3),需包含有效的定时器实例(TIMx)。

二、底层实现原理

  1. 寄存器级操作
    直接操作定时器的 CR1 寄存器,将 TIM_CR1_CEN 位清零

4.10__HAL_TIM_SET_COUNTER(__HANDLE__, __COUNTER__)函数

__HAL_TIM_SET_COUNTER 是 STM32 HAL 库中用于直接设置定时器计数器值的宏函数,其核心功能与使用要点如下:

一、功能与参数

  1. 作用
    动态修改定时器计数器寄存器(CNT)的当前值,适用于计数器同步、重置或精确计时调整。
    典型应用场景包括编码器计数重置、脉冲宽度测量时的基准点校准等。

  2. 参数说明

    • __HANDLE__:定时器句柄(如 &htim2),需指向已初始化的 TIM_HandleTypeDef 结构体17。
    • __COUNTER__:目标计数值(16位或32位,取决于定时器位数)

5、脉冲计数的基本概念

脉冲计数是指通过数字电路或微控制器对外部输入的周期性信号(脉冲)进行数量统计的过程。每个脉冲代表一个事件或一个单位量,通过累计这些脉冲可以实现频率测量、转速检测、位置跟踪等功能‌。

6、脉冲计数的工作原理

  1. 信号输入与处理

    • 外部脉冲信号通过专用输入引脚(如TIx或ETR)进入系统
    • 信号经过滤波和边沿检测电路消除噪声干扰‌
    • 通过极性选择确定计数边沿(上升沿或下降沿)‌
  2. 计数机制

    • 每个有效脉冲边沿触发计数器寄存器值加1
    • 计数器通常采用二进制递增模式,从初始值开始累加‌
    • 当计数值达到最大值(如16位计数器的65535)时会发生溢出‌
  3. 结果处理

    • 直接读取计数器寄存器(CNT)获取当前计数值‌
    • 溢出时通过中断或标志位进行处理,累计总脉冲数‌

7. 脉冲计数配置步骤

8、脉冲捕获按键实验

代码编写

新函数讲解

8.1.HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, const TIM_SlaveConfigTypeDef *sSlaveConfig)函数

HAL_TIM_SlaveConfigSynchro是STM32 HAL库中用于配置定时器从模式同步的重要函数,主要用于实现定时器之间的同步控制和外部时钟源配置‌。

一、函数功能概述

该函数主要用于配置定时器的从模式同步参数,主要功能包括:

  • 设置定时器作为从设备的同步方式
  • 配置外部触发输入源
  • 控制定时器之间的级联关系‌

二、函数参数解析

  1. htim参数

    • 类型:TIM_HandleTypeDef结构体指针
    • 作用:指向要配置的定时器句柄,包含定时器基本参数
    • 关键成员:
      • Instance:定时器寄存器基地址(如TIM2)
      • Init:定时器初始化结构体‌
  2. sSlaveConfig参数

    • 类型:TIM_SlaveConfigTypeDef结构体指针
    • 作用:配置从模式参数
    • 关键成员:
      • SlaveMode:从模式选择(如外部时钟模式、触发模式等)
      • InputTrigger:输入触发源选择
      • TriggerPolarity:触发极性
      • TriggerFilter:触发输入滤波器‌

8.2__HAL_TIM_GET_COUNTER(__HANDLE__)

__HAL_TIM_GET_COUNTER是STM32 HAL库中用于获取定时器计数器当前值的宏定义,主要用于实时读取定时器的计数状态。

一、基本功能与定义

参数说明

  • __HANDLE__:TIM_HandleTypeDef结构体指针,指向已初始化的定时器实例
  • 返回值:16位或32位无符号整数,表示定时器计数器寄存器(TIMx_CNT)的当前值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值