背景知识

1.1 AutoSAR ICU定义

ICU驱动器是一个模块,使用输入捕捉单元(ICU)进行PWM信号的解调,脉冲计数,频率和占空比的测量,产生简单的中断以及唤醒中断。

ICU驱动程序提供如下功能:

  • 信号边缘通知

  • 控制唤醒中断

  • 周期信号时间测量

  • 边缘时间戳,可用于采集非周期性信号

  • 边缘计数

1.2 MCAL模式配置

ICU支持如下四种模式:

  1. ICU_MODE_EDGE_COUNTER​​ 脉冲计数

  2. ICU_MODE_SIGNAL_EDGE_DETECT​​ 边缘检测

  3. ICU_MODE_SIGNAL_MEASUREMENT​​ PWM计算(周期、占空比、高低电平持续时间)

  4. ICU_MODE_TIMESTAMP​​ 时间戳

Cypress 的 ICU使用的外设资源可以是GPIO或TCPWM。当选择GPIO时,仅支持脉冲计数和边缘检测模式,此时是利用IO的外部中断来实现;当选择TCPWM 时则四种模式均支持,利用的是PWM输入捕获功能实现。

1.3 ICU相关中断介绍

tcpwm的三个硬件中断:

由TCPWMx_GRPy_CNTz_INTR​ 寄存器的三个bit控制。

​TC​ 表示溢出中断

​CC0_MATCH​ 表示CAPTURE 中断

参见Icu_Defines.h

/* Interrupt request flag. */
/* TC interrupt request flag.        */
#define ICU_INT_OVERFLOW                          ((uint8) 0x01U)
/* CC0_MATCH interrupt request flag. */
#define ICU_INT_CAPTURE                           ((uint8) 0x02U)
/* CC1_MATCH interrupt request flag. */
#define ICU_INT_CC1MATCH                          ((uint8) 0x04U)

Mcal中配置的回调函数:

IcuOverflowNotification

寄存器TCPWMx_GRPy_CNTz_COUNTER 溢出中断。
该中断关联硬件中断,由寄存器TCPWMx_GRPy_CNTz_INTR 的TC位控制使能。
仅用于ICU_MODE_SIGNAL_MEASUREMENT 和ICU_MODE_TIMESTAMP 模式。

IcuTimestampNotification

ICU_MODE_TIMESTAMP 模式下的通知,该中断非硬件中断,而是边沿检测中断的回调。用法详见下述时间戳模式。

IcuSignalNotification

边沿检测中断。ICU_MODE_TIMESTAMP 模式下的通知。

四种模式的应用

2.1 边沿检测

参见:https://www.qokorii.cn/archives/Vs2AD9Ct

2.2 ICU 脉冲计数模式

参见:https://www.qokorii.cn/archives/92FWdc0Q

2.3 时间戳模式

参见:https://www.qokorii.cn/archives/mBm1jO2Q

2.4 PWM输入捕捉

参见:https://www.qokorii.cn/archives/rzdQR5IR

ICU 其他常用API

Icu_GetInputState 用于获取Icu捕获的状态,是否获取到结果。

Icu_GetInputLevel 用于获取Icu通道对应IO口的电平。

这些API都可用于调试,以下是应用方式:

Icu_InputStateType icuState = Icu_GetInputState(IcuConf_IcuChannel_IcuChannel_0);
Icu_LevelType icuLevel = Icu_GetInputLevel(IcuConf_IcuChannel_IcuChannel_0);