应用场景
最近接触到汽车BMS产品中的高压互锁模块(内部HVIL电路来确定外围高压连接器是否正常连接),出于担任底层工程师的角色,需要验证硬件团队开发的电路板是否可以正常工作。在BMS电路板中本功能电路采用一路PWM输入和一路电压输入,然后在电路另一端口通过输入捕获和ADC采样(实际操作中会有一个接插件用于接通输入和输出),获得对应的值,如果输入和输出结果一致,则高压互锁电路模块是正常的。本章将基于S32K358介绍EMIOS ICU 相关配置。
原理介绍
EMIOS
增强型IO子系统,S32K358 提供三组实例即EMIOS_0, EMIOS_1,EMIOS_2。每组实例具有24个通道,每个通道可通过配置实现其支持的功能,比如用作普通IO口,测量周期,捕获计数等。
EMIOS细节
这些通道分为4种类型:X,Y,G,H。通过这四种类型对应映射到各支持的一些功能。比如:EMIOS_0的通道0属于X类型, X类型的通道支持普通IO,计数,测量周期等。通道22和通道23可以配置为Global计数总线,为本组的其它所有通道提供计数总线引用。详细介绍可见S32k358手册。
EMIOS Note
如果你需要计数功能,那么在选择通道的时候就需要选择X或者G类型的通道,这些通道最终和GPIO脚一一对应。所以在设计硬件电路选脚的时候就需要考虑这些因素。其它功能都需要仔细阅读一遍,比如配置PWM需要设置周期时,也需要特定的通道。因为有些通道不支持PWM周期可调,只支持占空比可调。由于ch22和ch23可以做计数总线,为所在组的其它通道提供计数总线引用,所以在实际设计电路时,这两个通道对应的引脚最好不要用作其它用途。
配置工具
工具:S32KDS3.5 。如果不知道如何使用该工具请自行查阅相关指导说明,以下内容默认读者对该软件具有一定的使用经验,比如如何导入例程等。
软件版本:导入NXP的官方例程(S32K358对应版本),由于汽车行业目前使用EB配置MCAL的居多,可以选择带Autosar封装版本的Demo。导入Autosar接口封装的版本好处在于大部分配置项和EB差不多。NXP也提供了EB版本,但是由于时间有限,后期会在EB上配置该工程并验证。
配置步骤
EMIOS ICU 配置
第一步:导入官方例程,带Autosar封装的版本。先配置所需的引脚,如PTB12。PTB12对应的是Emios0 Ch0 , Mscr值是44(鼠标点在PTB12上,可显示属性,里面就有Mscr值),需要记住,后面配置Port时需要使用。按下图操作:
第二步:打开Port组件,配置PTB12引脚。
第三步:使能EMIOS功能(此步骤和前面写的配置PWM是一致的)
第四步:配置EMIOS 的Global Counter bus A和Global Counter bus B。一共三组EMIOS, 每组配置对应的ch22和ch23。ch23对应的默认周期配置为65535。ch22对应的是32768。(此步骤和前面写的配置PWM是一致的)
第五步:使能ICU对应的函数。比如捕获到PWM时,需要计算高电平个数,这时候需要打开IcuEdgeCountAPI。
第六步:配置ICU模块里的EMIOS 实例。注意图片里面的第6步,如调试时需要计数停止,除了在这个地方使能外,上面MCL的Emios配置里,Enable Emios freez state也需要打勾使能。
第七步:配置IcuChannel。 不是所有的通道都支持计数模式。这点需要注意,X和G类型的才可以支持计数。可仔细阅读数据手册。
第八步:配置中断。 使能EMIOS0CH0对应中断。
第九步:代码部分(配置了多个ICU通道)。初始化函数这些不做说明。
下面这一张是检测跳变沿时,对应的代码部分
以上就是EMIOS配置ICU的全部。
代码详解
设置对应的中断,使能对应的函数,即可正常工作。中断名对应包含的通道数,官方Demo代码注释中会有。
注意事项
EMIOS中许多通道是不支持计数的,如果需要计数功能需要仔细阅读数据手册找到对应支持的通道类型。