1 前言
这一节来看看S32K3在时钟方面的安全监测,那就是CMU(Clock Monitor Unit),这个模块就是专门来监测时钟的。
2 CMU介绍
S32K3总共有6个CMU通道,按照功能分为CMU_FC(Frequency Check)通道和CMU_FM(Frequency Meter)通道,而这6个通道则分为了CMU_FC_0,CMU_FM_1,CMU_FM_2,CMU_FC_3,CMU_FC_4,CMU_FC_5这6个通道,所以S32K3有4个监测通道和2个测量通道。另外还有一点就是这6个通道所监测的时钟对象也是一开始就定死了,如下图:
2.1 CMU_FC
下图为CMU_FU的功能框图:
CMU_FU的功能非常简单,就是用一个参考时钟去监控一个被检测时钟,如果两者的频率相差超过最高High阈值或超过最低Low阈值(两个阈值皆可配置),那么就会触发中断或者破坏性复位(同一时间二选一)。在这里需要注意一点的就是,只有CMU_FC_0才能触发中断或者破坏性复位,而CMU_FC_3, CMU_FC_4, CMU_FC_5只能触发破坏性复位,所以在中断向量表中找不到CMU_FC_3, CMU_FC_4, CMU_FC_5的中断号,只有CMU_FC_0的中断号CMU0_IRQn。
2.2 CMU_FM
下图为CMU_FM的功能框图:
CMU_FU的功能也是非常简单,就是用一个参考时钟去测量另外一个时钟,简单至极,这里就不用多说什么,当完成一次测量后就会触发一个测量完成中断,CMU_FM_1和CMU_FM_2分别对应中断向量的CMU1_IRQn,CMU2_IRQn。
2.3 总结
下面列出一个表格总结一下6个CMU通道的特征:
通道名 | 功能 | 被监测时钟 | 参考时钟 | 特征 |
---|---|---|---|---|
CMU_FC_0 | 检测 | FXOSC(8~40MHz) | FIRC | 异常时触发中断或者破坏性复位 |
CMU_FM_1 | 测量 | FIRC (48MHz) | FXOSC | 测量完成后触发中断 |
CMU_FM_2 | 测量 | SIRC (32KHz) | FXOSC | 测量完成后触发中断 |
CMU_FM_3 | 检测 | CORE_CLK | FXOSC | 异常时触发破坏性复位 |
CMU_FM_3 | 检测 | AIPS_PLAT_CLK | FIRC | 异常时触发破坏性复位 |
CMU_FM_3 | 检测 | HSE_CLK | FIRC | 异常时触发破坏性复位 |
3 MCAL配置
CMU的MCAL配置被集成到了Mcu模块中,首先第一步使能CMU的时钟:
接下来先完成CMU_FC的配置,先在McuClockSettingConfi->McuCLKMonitor中添加CMU_FC通道,之前说过,CMU最大支持4个FC通道,如下:
随后对每个通道进行配置,我以一条为例,如下:‘
前面提到了CMU_FC_0是可以支持异常时是触发中断还是触发破坏性复位,在这里的表现就是Enable FHH/FLL Asynchronous Event即发生异常时触发破坏性复位,而Enable FHH/FLL interrupt为发生异常时触发中断,同一时间这两者只能选择一个。
随后还需要在Mcu->Generate中配置一些关于CMU的选项,首先使能错误报告回调函数,如下:
在这里需要注意的是这里的McuCmuNotification并不是单单为CMU_FM_0的错误中断服务的,而是给整个时钟初始化使用的,如果在时钟初始化过程中,发现时钟初始化错误或者失败MCAL都会调用这个错误回调函数,这个通知函数是需要用户自己去实现的,可以添加一些适当的处理方法,这个通知函数会传递一个参数,为出现错误的时钟名,如下:
void McuCmuNotification(Clock_Ip_NameType clockName)
{
Clock_Ip_NameType tempclockName;
tempclockName = clockName;
switch(tempclockName)
{
case FXOSC_CLK:
break;
case SIRC_CLK:
break;
case FIRC_CLK:
break;
//.......
//.......
default:
while(1);
break;
}
}
随后再使能Clock Failure Notification,如下:
如果配置CMU_FC_0为异常时触发中断,那么我们还需要在Platfrom中使能CMU0_IRQn的中断并注册其对应的服务函数,如下:
到这里关于CMU_FC的MCAL配置就结束。这个时候就有人要问了,那CMU_FM呢?答案是,我在当前的RTD1.0.0中也没找到CMU_FM的驱动,所以我也不知道。