Icu模块用户手册
Icu模块用户手册
目录
- 1. 简介
- 2. 文件结构
- 3. 数据结构
- 4. 驱动函数
- 4.1 函数接口
- 4.1.1 HLI_Icu_Init
- 4.1.2 HLI_Icu_DeInit
- 4.1.3 HLI_Icu_EnableEdgeDetection
- 4.1.4 HLI_Icu_DisableEdgeDetection
- 4.1.5 HLI_Icu_EnableEdgeCount
- 4.1.6 HLI_Icu_DisableEdgeCount
- 4.1.7 HLI_Icu_ResetEdgeCount
- 4.1.8 HLI_Icu_GetEdgeNumbers
- 4.1.9 HLI_Icu_EnableSignalMeasurement
- 4.1.10 HLI_Icu_DisableSignalMeasurement
- 4.1.11 HLI_Icu_GetDutyCycleValue
- 4.1.12 HLI_Icu_EnableEdgeIntervalMeasure
- 4.1.13 HLI_Icu_DisableEdgeIntervalMeasure
- 4.1.14 HLI_Icu_GetEdgeIntervalTime
- 4.1.15 HLI_Icu_EnableInterrupt
- 4.1.16 HLI_Icu_DisableInterrupt
- 4.2 中断回调
- 4.1 函数接口
- 5. 使用示例
- 6. 限制与假设
- 7. 变更记录
1. 简介
本模块提供了对 ICU (Input Capture Unit) 的抽象接口,利用CCP硬件资源,实现对输入信号的精确测量和监控。主要功能包括:
- 初始化与反初始化: 通过
HLI_Icu_Init和HLI_Icu_DeInit对一个或多个ICU通道进行配置和资源释放。 - 边沿检测 (
HLI_ICU_MODE_EDGE_DETECTION): 在检测到指定边沿(上升沿/下降沿)时触发中断,并通过回调函数通知应用层。 - 边沿计数 (
HLI_ICU_MODE_EDGE_COUNTER): 对指定类型的边沿进行计数,可以通过HLI_Icu_GetEdgeNumbers获取计数值。 - PWM信号测量:
- 硬件模式 (
HLI_ICU_MODE_SIGNAL_MEASUREMENT): 利用CCP模块的硬件特性,自动测量PWM信号的周期和占空比,此模式会独占一个CCP模块。 - 软件模式 (
HLI_ICU_MODE_SIGNAL_MEASUREMENT_SOFTWARE): 通过边沿触发和定时器中断结合的方式,用软件计算PWM信号的周期和占空比,支持多通道同时测量,但对输入信号频率有一定限制。
- 硬件模式 (
- 边沿间隔测量 (
HLI_ICU_MODE_EDGE_INTERVAL): 测量两个相邻边沿(同向或异向)之间的时间间隔。
1.1 支持的设备
当前软件适用于以下芯片:
- KF32A158xxxSF
1.2 名词及缩写
| 缩写 | 解释 |
|---|---|
| MCU | 微控制器 |
| ICU | 输入捕捉单元 |
| ISR | 中断服务例程 |
| CCP | 捕捉/比较/PWM模块 |
2. 文件结构
| 文件名称 | 描述 |
|---|---|
| kf32axxx_hli_icu.c | 此文件包含ICU驱动程序的通用功能 |
| kf32axxx_hli_icu.h | 此头文件输出ICU驱动程序的类型定义和函数原型 |
| kf32axxx_hli_icu_Lcfg.c | 链接时参数(用户需重点关注, 并根据实际应用进行修改) |
| kf32axxx_hli_icu_Lcfg.h | 链接时参数的声明 |
| kf32axxx_hli_icu_cfg.h | 所有宏定义、预编译参数 |
3. 数据结构
3.1 数据类型
3.1.1 宏定义
无。
3.1.2 枚举
ICU状态 (HLI_Icu_StatusType)
枚举值 解释 HLI_ICU_STATUS_OK ICU状态OK HLI_ICU_STATUS_NOK ICU状态NOT OK ICU模块编号 (HLI_Icu_ModuleType)
枚举值 说明 HLI_ICU_MODULE_0 ICU0 HLI_ICU_MODULE_1 ICU1 HLI_ICU_MODULE_2 ICU2 HLI_ICU_MODULE_3 ICU3 HLI_ICU_MODULE_4 ICU4 HLI_ICU_MODULE_20 ICU20 HLI_ICU_MODULE_21 ICU21 ICU通道 (HLI_Icu_ChannelType)
枚举值 说明 HLI_ICU_CHANNEL_1 ICU通道1, 对应CCP通道1 HLI_ICU_CHANNEL_2 ICU通道2, 对应CCP通道2 HLI_ICU_CHANNEL_3 ICU通道3, 对应CCP通道3 HLI_ICU_CHANNEL_4 ICU通道4, 对应CCP通道4 HLI_ICU_CHANNEL_INVALID 无效通道 ICU触发事件 (HLI_Icu_ActiveEventType)
枚举值 说明 HLI_ICU_FALLING_EDGE ICU下降沿触发 HLI_ICU_RISING_EDGE ICU上升沿触发 HLI_ICU_RISING4_EDGES ICU每4个上升沿触发一次 HLI_ICU_RISING16_EDGES ICU每16个上升沿触发一次 HLI_ICU_PWM_WAVE PWM测量模式 ICU工作模式 (HLI_Icu_MeasureModeType)
枚举值 说明 HLI_ICU_MODE_EDGE_COUNTER ICU边沿计数模式 HLI_ICU_MODE_EDGE_DETECTION ICU边沿触发中断模式 HLI_ICU_MODE_SIGNAL_MEASUREMENT ICU硬件测量PWM(占用一个CCP模块) HLI_ICU_MODE_SIGNAL_MEASUREMENT_SOFTWARE ICU软件测量PWM(占用一个通道) HLI_ICU_MODE_EDGE_INTERVAL ICU边沿计时模式
3.1.3 类型定义
占空比与周期 (HLI_Icu_DutyCycleType)
成员 解释 ActiveTime 高电平时间 PeriodTime 周期时间
3.2 配置项说明
静态配置
静态配置在
kf32axxx_hli_icu_cfg.h文件中通过宏定义完成。宏定义 解释 取值范围 ICU_INTERVAL_MEASURE_TYPE边沿计时模式选择,默认为 MEASURE_TOGGLE_EDGE_INTERVAL。MEASURE_SAME_EDGE_INTERVAL(同向边沿) 或MEASURE_TOGGLE_EDGE_INTERVAL(异向边沿)ICU_FEATURE_PWM_CALLBACK定义此宏以使能PWM测量完成时的中断回调函数。 定义或注释掉 模块配置 (HLI_Icu_ModuleConfigType)
成员 解释 取值范围 HwModule 当前ICU通道组所使用的硬件CCP模块。 可选范围参考 HLI_Icu_ModuleType。Period 计数器周期(最大计数值)。 16位或32位无符号整数,取决于CCP模块。 PreScaler 计数器预分频值。 16位或32位无符号整数,取决于CCP模块。 EdgeCaptureCallback 边沿检测模式下的回调函数指针。 HLI_Icu_EdgeCaptureCallbackType类型的函数指针。SignalMeasurementCallback PWM测量完成回调函数(仅当定义 ICU_FEATURE_PWM_CALLBACK时有效)。HLI_Icu_SignalMeasurementCallbackType类型的函数指针。通道配置 (HLI_Icu_ChannelConfigType)
成员 解释 取值范围 HwModule 当前ICU通道所使用的硬件CCP模块。 可选范围参考 HLI_Icu_ModuleType。HwChannel 当前ICU通道所使用的硬件CCP通道。 可选范围参考 HLI_Icu_ChannelType。MeasureMode 测量模式(边沿检测/计数/PWM测量等)。 可选范围参考 HLI_Icu_MeasureModeType。CaptureEdge 捕获的边沿类型。 可选范围参考 HLI_Icu_ActiveEventType。顶层配置 (HLI_Icu_ConfigType)
成员 解释 取值范围 ModuleConfigPtr 指向模块配置数组的指针。 指向一个 HLI_Icu_ModuleConfigType类型的数组。ChannelConfigPtr 指向通道配置数组的指针。 指向一个 HLI_Icu_ChannelConfigType类型的数组。ModuleNum 配置的模块数量。 需要与 ModuleConfigPtr指向的数组元素个数一致。ChannelNum 配置的通道数量。 需要与 ChannelConfigPtr指向的数组元素个数一致。
4. 驱动函数
4.1 函数接口
4.1.1 HLI_Icu_Init
| Name | Description |
|---|---|
| 函数名称 | HLI_Icu_Init |
| 语法 | void HLI_Icu_Init(const HLI_Icu_ConfigType *ConfigPtr) |
| 同步/异步 | 同步 |
| 重入性 | 不可重入 |
| 形参(输入) | ConfigPtr : 指向ICU配置信息的指针 |
| 返回值 | 无 |
| 描述 | 初始化所有在配置结构体中定义的ICU模块和通道。 |
| 注意事项 | 无 |
4.1.2 HLI_Icu_DeInit
| Name | Description |
|---|---|
| 函数名称 | HLI_Icu_DeInit |
| 语法 | void HLI_Icu_DeInit(void) |
| 同步/异步 | 同步 |
| 重入性 | 不可重入 |
| 形参(输入) | 无 |
| 返回值 | 无 |
| 描述 | 反初始化所有已配置的ICU模块。 |
| 注意事项 | 无 |
4.1.3 HLI_Icu_EnableEdgeDetection
| Name | Description |
|---|---|
| 函数名称 | HLI_Icu_EnableEdgeDetection |
| 语法 | HLI_Icu_StatusType HLI_Icu_EnableEdgeDetection(HLI_Icu_ChannelIndexType IcuChannelIndex) |
| 同步/异步 | 同步 |
| 重入性 | 不可重入 |
| 形参(输入) | IcuChannelIndex : ICU通道索引号 |
| 返回值 | HLI_ICU_STATUS_OK : 执行成功HLI_ICU_STATUS_NOK: 执行失败 |
| 描述 | 使能指定ICU通道的边沿监测功能。 |
| 注意事项 | 仅对工作在 HLI_ICU_MODE_EDGE_DETECTION 模式的通道有效。 |
4.1.4 HLI_Icu_DisableEdgeDetection
| Name | Description |
|---|---|
| 函数名称 | HLI_Icu_DisableEdgeDetection |
| 语法 | HLI_Icu_StatusType HLI_Icu_DisableEdgeDetection(HLI_Icu_ChannelIndexType IcuChannelIndex) |
| 同步/异步 | 同步 |
| 重入性 | 不可重入 |
| 形参(输入) | IcuChannelIndex : ICU通道索引号 |
| 返回值 | HLI_ICU_STATUS_OK : 执行成功HLI_ICU_STATUS_NOK: 执行失败 |
| 描述 | 关闭指定ICU通道的边沿监测功能。 |
| 注意事项 | 仅对工作在 HLI_ICU_MODE_EDGE_DETECTION 模式的通道有效。 |
4.1.5 HLI_Icu_EnableEdgeCount
| Name | Description |
|---|---|
| 函数名称 | HLI_Icu_EnableEdgeCount |
| 语法 | HLI_Icu_StatusType HLI_Icu_EnableEdgeCount(HLI_Icu_ChannelIndexType IcuChannelIndex) |
| 同步/异步 | 同步 |
| 重入性 | 不可重入 |
| 形参(输入) | IcuChannelIndex : ICU通道索引号 |
| 返回值 | HLI_ICU_STATUS_OK : 执行成功HLI_ICU_STATUS_NOK: 执行失败 |
| 描述 | 使能指定ICU通道的边沿计数功能。 |
| 注意事项 | 仅对工作在 HLI_ICU_MODE_EDGE_COUNTER 模式的通道有效。 |
4.1.6 HLI_Icu_DisableEdgeCount
| Name | Description |
|---|---|
| 函数名称 | HLI_Icu_DisableEdgeCount |
| 语法 | HLI_Icu_StatusType HLI_Icu_DisableEdgeCount(HLI_Icu_ChannelIndexType IcuChannelIndex) |
| 同步/异步 | 同步 |
| 重入性 | 可重入 |
| 形参(输入) | IcuChannelIndex : ICU通道索引号 |
| 返回值 | HLI_ICU_STATUS_OK : 执行成功HLI_ICU_STATUS_NOK: 执行失败 |
| 描述 | 关闭指定ICU通道的边沿计数功能。 |
| 注意事项 | 仅对工作在 HLI_ICU_MODE_EDGE_COUNTER 模式的通道有效。 |
4.1.7 HLI_Icu_ResetEdgeCount
| Name | Description |
|---|---|
| 函数名称 | HLI_Icu_ResetEdgeCount |
| 语法 | HLI_Icu_StatusType HLI_Icu_ResetEdgeCount(HLI_Icu_ChannelIndexType IcuChannelIndex) |
| 同步/异步 | 同步 |
| 重入性 | 不可重入 |
| 形参(输入) | IcuChannelIndex : ICU通道索引号 |
| 返回值 | HLI_ICU_STATUS_OK : 执行成功HLI_ICU_STATUS_NOK: 执行失败 |
| 描述 | 重置指定ICU通道的边沿计数值为0。 |
| 注意事项 | 仅对工作在 HLI_ICU_MODE_EDGE_COUNTER 模式的通道有效。 |
4.1.8 HLI_Icu_GetEdgeNumbers
| Name | Description |
|---|---|
| 函数名称 | HLI_Icu_GetEdgeNumbers |
| 语法 | uint32_t HLI_Icu_GetEdgeNumber(HLI_Icu_ChannelIndexType IcuChannelIndex) |
| 同步/异步 | 同步 |
| 重入性 | 不可重入 |
| 形参(输入) | IcuChannelIndex : ICU通道索引号 |
| 返回值 | uint32_t: 当前ICU通道的边沿计数值。 |
| 描述 | 获取指定ICU通道的当前边沿计数值。 |
| 注意事项 | 仅对工作在 HLI_ICU_MODE_EDGE_COUNTER 模式的通道有效。 |
4.1.9 HLI_Icu_EnableSignalMeasurement
| Name | Description |
|---|---|
| 函数名称 | HLI_Icu_EnableSignalMeasurement |
| 语法 | HLI_Icu_StatusType HLI_Icu_EnableSignalMeasurement(HLI_Icu_ChannelIndexType IcuChannelIndex) |
| 同步/异步 | 同步 |
| 重入性 | 不可重入 |
| 形参(输入) | IcuChannelIndex : ICU通道索引号 |
| 返回值 | HLI_ICU_STATUS_OK : 执行成功HLI_ICU_STATUS_NOK: 执行失败 |
| 描述 | 开启指定ICU通道的PWM信号测量功能。 |
| 注意事项 | 仅对工作在 HLI_ICU_MODE_SIGNAL_MEASUREMENT 或 HLI_ICU_MODE_SIGNAL_MEASUREMENT_SOFTWARE 模式的通道有效。 |
4.1.10 HLI_Icu_DisableSignalMeasurement
| Name | Description |
|---|---|
| 函数名称 | HLI_Icu_DisableSignalMeasurement |
| 语法 | HLI_Icu_StatusType HLI_Icu_DisableSignalMeasurement(HLI_Icu_ChannelIndexType IcuChannelIndex) |
| 同步/异步 | 同步 |
| 重入性 | 不可重入 |
| 形参(输入) | IcuChannelIndex : ICU通道索引号 |
| 返回值 | HLI_ICU_STATUS_OK : 执行成功HLI_ICU_STATUS_NOK: 执行失败 |
| 描述 | 关闭指定ICU通道的PWM信号测量功能。 |
| 注意事项 | 仅对工作在 HLI_ICU_MODE_SIGNAL_MEASUREMENT 或 HLI_ICU_MODE_SIGNAL_MEASUREMENT_SOFTWARE 模式的通道有效。 |
4.1.11 HLI_Icu_GetDutyCycleValue
| Name | Description |
|---|---|
| 函数名称 | HLI_Icu_GetDutyCycleValue |
| 语法 | HLI_Icu_DutyCycleType HLI_Icu_GetDutyCycleValue(HLI_Icu_ChannelIndexType IcuChannelIndex) |
| 同步/异步 | 同步 |
| 重入性 | 不可重入 |
| 形参(输入) | IcuChannelIndex : ICU通道索引号 |
| 返回值 | HLI_Icu_DutyCycleType: 包含PWM周期和高电平时间的结构体。 |
| 描述 | 获取指定ICU通道的PWM信号测量结果。 |
| 注意事项 | 仅对工作在 HLI_ICU_MODE_SIGNAL_MEASUREMENT 或 HLI_ICU_MODE_SIGNAL_MEASUREMENT_SOFTWARE 模式的通道有效。 |
4.1.12 HLI_Icu_EnableEdgeIntervalMeasure
| Name | Description |
|---|---|
| 函数名称 | HLI_Icu_EnableEdgeIntervalMeasure |
| 语法 | HLI_Icu_StatusType HLI_Icu_EnableEdgeIntervalMeasure(HLI_Icu_ChannelIndexType IcuChannelIndex) |
| 同步/异步 | 同步 |
| 重入性 | 不可重入 |
| 形参(输入) | IcuChannelIndex : ICU通道索引号 |
| 返回值 | HLI_ICU_STATUS_OK : 执行成功HLI_ICU_STATUS_NOK: 执行失败 |
| 描述 | 开启指定ICU通道的边沿时间间隔测量功能。 |
| 注意事项 | 仅对工作在 HLI_ICU_MODE_EDGE_INTERVAL 模式的通道有效。 |
4.1.13 HLI_Icu_DisableEdgeIntervalMeasure
| Name | Description |
|---|---|
| 函数名称 | HLI_Icu_DisableEdgeIntervalMeasure |
| 语法 | HLI_Icu_StatusType HLI_Icu_DisableEdgeIntervalMeasure(HLI_Icu_ChannelIndexType IcuChannelIndex) |
| 同步/异步 | 同步 |
| 重入性 | 不可重入 |
| 形参(输入) | IcuChannelIndex : ICU通道索引号 |
| 返回值 | HLI_ICU_STATUS_OK : 执行成功HLI_ICU_STATUS_NOK: 执行失败 |
| 描述 | 关闭指定ICU通道的边沿时间间隔测量功能。 |
| 注意事项 | 仅对工作在 HLI_ICU_MODE_EDGE_INTERVAL 模式的通道有效。 |
4.1.14 HLI_Icu_GetEdgeIntervalTime
| Name | Description |
|---|---|
| 函数名称 | HLI_Icu_GetEdgeIntervalTime |
| 语法 | uint32_t HLI_Icu_GetEdgeIntervalTime(HLI_Icu_ChannelIndexType IcuChannelIndex) |
| 同步/异步 | 同步 |
| 重入性 | 不可重入 |
| 形参(输入) | IcuChannelIndex : ICU通道索引号 |
| 返回值 | uint32_t: 测得的边沿时间间隔(单位:tick)。 |
| 描述 | 获取指定ICU通道的边沿时间间隔测量结果。 |
| 注意事项 | 仅对工作在 HLI_ICU_MODE_EDGE_INTERVAL 模式的通道有效。 |
4.1.15 HLI_Icu_EnableInterrupt
| Name | Description |
|---|---|
| 函数名称 | HLI_Icu_EnableInterrupt |
| 语法 | HLI_Icu_StatusType HLI_Icu_EnableInterrupt(HLI_Icu_ChannelIndexType IcuChannelIndex) |
| 同步/异步 | 同步 |
| 重入性 | 不可重入 |
| 形参(输入) | IcuChannelIndex : ICU通道索引号 |
| 返回值 | HLI_ICU_STATUS_OK : 执行成功HLI_ICU_STATUS_NOK: 执行失败 |
| 描述 | 开启指定ICU通道的中断。 |
| 注意事项 | 无 |
4.1.16 HLI_Icu_DisableInterrupt
| Name | Description |
|---|---|
| 函数名称 | HLI_Icu_DisableInterrupt |
| 语法 | HLI_Icu_StatusType HLI_Icu_DisableInterrupt(HLI_Icu_ChannelIndexType IcuChannelIndex) |
| 同步/异步 | 同步 |
| 重入性 | 不可重入 |
| 形参(输入) | IcuChannelIndex : ICU通道索引号 |
| 返回值 | HLI_ICU_STATUS_OK : 执行成功HLI_ICU_STATUS_NOK: 执行失败 |
| 描述 | 关闭指定ICU通道的中断。 |
| 注意事项 | 无 |
4.2 中断回调
4.2.1 HLI_Icu_EdgeCaptureCallbackFcnType
| Name | Description |
|---|---|
| 函数指针名称 | HLI_Icu_EdgeCaptureCallbackFcnType |
| 语法 | void (*HLI_Icu_EdgeCaptureCallbackFcnType)(HLI_Icu_ChannelType HwIndex); |
| 形参(输入) | HwIndex : 触发中断的CCP硬件通道序号 |
| 返回值 | 无 |
| 描述 | ICU模块边沿捕捉回调函数。 |
| 注意事项 | 传入的通道序号为硬件通道,非初始化时的虚拟通道配置序号。 |
4.2.1 HLI_Icu_SignalMeasurementCallbackFcnType
| Name | Description |
|---|---|
| 函数指针名称 | HLI_Icu_SignalMeasurementCallbackFcnType |
| 语法 | void (*HLI_Icu_SignalMeasurementCallbackFcnType)(HLI_Icu_ChannelType HwIndex, uint32_t ActiveTime, uint32_t PeriodTime); |
| 形参(输入) | HwIndex : 触发中断的CCP硬件通道序号 |
| 形参(输入) | ActiveTime : 高电平时间 |
| 形参(输入) | PeriodTime: 周期时间 |
| 返回值 | 无 |
| 描述 | ICU PWM测量完成回调函数。 |
| 注意事项 | 传入的通道序号为硬件通道,非初始化时的虚拟通道配置序号。 |
5. 使用示例
注
示例中使用的参数仅用作示例演示,应用时以实际为准。
5.1 边沿检测模式 (Edge Detection)
此模式用于在检测到特定边沿时触发中断。
5.2 边沿计数模式 (Edge Counter)
此模式用于对输入信号的边沿进行计数。
5.3 PWM信号测量模式 (Signal Measurement)
此模式用于测量PWM信号的周期和占空比。硬件PWM测量需要独占整个CCP模块,且对信号输入通道有一定要求,具体参考对应的用户手册。
5.4 边沿间隔测量模式 (Edge Interval)
此模式用于测量两个边沿之间的时间。
6. 限制与假设
硬件资源复用: CCP模块如被用于其他功能(如OCU、PWM、GPT), 则不能作为ICU使用。
边沿监测: ICU无法对信号的上升沿和下降沿同时进行监测或计数。
功能互斥: 无法通过配置同时开启同一通道的边沿监测和计数功能。
频率限制:
边沿触发模式输入信号频率建议小于100kHz。
边沿计数模式输入信号频率建议小于400kHz。
硬件PWM测量模式输入信号频率建议小于200kHz,下限频率与定时器预分频系数有关。
软件PWM测量模式输入信号频率建议小于10kHz,下限频率与定时器预分频系数有关。
注
以上数据使用主频120MHz进行测量,测量时无其他中断或者硬件干扰供参考。实际上下限频率应根据具体应用场景确定,避免中断处理时间过长。
PWM测量: 调用
HLI_Icu_GetDutyCycleValue的频率应小于待测PWM信号的周期。模式限制:
HLI_ICU_MODE_SIGNAL_MEASUREMENT模式会独占一个CCP模块的所有通道。HLI_ICU_MODE_SIGNAL_MEASUREMENT_SOFTWARE和HLI_ICU_MODE_EDGE_INTERVAL模式下,定时器的 (预分频值 * 周期值) 建议大于3000,以避免频繁进入溢出中断。(系统时钟为120MHz时)
7. 变更记录
| 版本 | 时间 | 变更记录 |
|---|---|---|
| v1.0 | 2025-11-20 | 新增初版文档 |
