背景知识
1.1 AutoSAR ICU定义
ICU驱动器是一个模块,使用输入捕捉单元(ICU)进行PWM信号的解调,脉冲计数,频率和占空比的测量,产生简单的中断以及唤醒中断。
ICU驱动程序提供如下功能:
信号边缘通知
控制唤醒中断
周期信号时间测量
边缘时间戳,可用于采集非周期性信号
边缘计数
1.2 MCAL模式配置
ICU支持如下四种模式:
ICU_MODE_EDGE_COUNTER
脉冲计数
ICU_MODE_SIGNAL_EDGE_DETECT
边缘检测
ICU_MODE_SIGNAL_MEASUREMENT
PWM计算(周期、占空比、高低电平持续时间)
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);