1.基本概念
SMU--Safety Management Unit;主要是硬件(少量软件)的功能安全机制触发警报后,对这些警报进行统一处理;
在阅读datasheet时,发现SMU有一个port emergency stop功能可以强制将pad拉成General Purpose Input Mode;同时还会把这个请求发给SCU;这就很有趣了,这种功能的应用场景在哪?在这之前,我们来分析下如何触发这种EMS。
2.配置
首先我们查看AGC寄存器PES位域;
SMU alarm behavior触发后,硬件是可以触发PES;这就是说我们在配置Alarm 行为时同时也要考虑PES配置。ps:alarm behavior如下:
其次,由于SMU与安全紧密相关,对于SMU寄存器的配置除了常见的endinit保护,也需要有其他的机制进行处理;因此SMU_KEYS寄存器的锁存机制也必须考虑
最后,当我们想用中断的方式来进行处理时,SMU的中断配置也必须考虑,中断向量表的设置也势在必行。那么接下来,我们来看看代码如何处理。
3.参考代码
首先,我们选用IGCS0来触发PES,那么需要配置的寄存器有,AGC.PES\IGCS0,AGCF[group][0-2]
3.1 配置密钥到SMU_KEY
配置SMU寄存器时,需要对CFGLCK写入0xBC,这时候SMU_core寄存器配置才会生效;
/* Check if SMU cfg registers is not locked */
if (MODULE_SMU.KEYS.B.PERLCK != 0xFFU)
{
passwd = IfxScuWdt_getSafetyWatchdogPassword();
/* disable the write-protection for registers */
IfxScuWdt_clearSafetyEndinit(passwd);
/*Write Config key to configure the SMU registers. */
MODULE_SMU.KEYS.U = (uint32)0x000000bc;
/* Restore back the write-protection for registers */
IfxScuWdt_setSafetyEndinit(passwd);
}
else
{
/* If SMU config is permanently locked then return false */
status = 0U;
}
当配置SMU寄存器完成后,需要给PERLCK写入0xFF,完成锁存;保证在当前上电周期SMU alarm的配置不被修改
/* Write the key reg to lock config registers */
MODULE_SMU.KEYS.B.PERLCK = 0xFFU;
3.2 配置alarm行为
我们选择软件功能安全机制group10的第0、1个机制;因此首先我们需要配置AGC。
/* Set the IGCS0 field of AGC register to 1 to trigger SMU Interrupt Request 0 */
MODULE_SMU.AGC.B.IGCS0 = 1;
/* Enable the SMU Port Emergency Stop and SMU_IGCS0 activates the PES */
MODULE_SMU.AGC.B.PES = 1;
/* configurate software alarm 0 action igcs0*/
AG10CF0 = 0x0000 0000;
AG10CF1 = 0x0000 0001;
AG10CF2 = 0x0000 0000;
3.3 配置SMU中断
SRC_SMU0.B.SPRN = priority;
SRC_SMU0.B.TOS= Tos_cpu0;
SRC_SMU0.B.CLRR= 1;
/*configurte Interupt for SMU*/
IFX_INTERRUPT(ISR_SMU, 0, ISR_PRIORITY_SMU_INT0);
3.4 软件触发alarm
IfxSmu_setAlarmStatus(IfxSmu_Alarm_Software_Alarm0);
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/djkeyzx/article/details/129861487
|