主题中讨论的其他器件:C2000WARE
软件:
CCS 版本:12.7.0.00007
C2000Ware_5_02_00_00
硬件:
LAUNCHXL_F2800157
您好!
我正在尝试执行板的锁步功能的 POC。 我学习了 MCU 的参考手册和安全手册、还查看了 driverlib 中的 lcm.c 和 lcm.h 文件。 我想问一些有关锁步函数的问题、以及我如何将其正确集成到我的软件中。
我刚刚运行 led ex1_blinky 示例、它使用 SYSCFG 创建板级配置文件、而我在调试模式下运行所有代码。 (我知道 LCM 在调试模式下不工作)
1.
在参考手册中、它表示:
- 使用以下位锁定 LSEN 配置:
- CPU_SYS_REGS [CPUSYSLOCK2.LSEN=1]
- 使用以下位启用所需模块的比较器:
- LCM_REGS [LCM_CONTROL。 CMPEN= 1]
- 锁步比较将立即开始下一个周期、
默认情况下、应在示例中启用 LCM、这就是我在示例中看到的。 在 device.c 文件中的 Device_init 函数中、我看到
从而:
// // Enable lockstep compare module // HWREG_BP(LCM_CPU1_BASE + LCM_O_CONTROL) |= LCM_CONTROL_CMPEN;
但我看不到 LSEN 配置锁定的位置。 我在 LCM_isLockStepEnabled 函数中仅看到了一个类似的 Marco LCM_STATUS_LSEN、当我在主函数中调用它时返回的值为 true。 我需要设置任何寄存器吗、或者这足够吗?
2.
我尝试了运行下面的代码、并看到了我们如何在 调试模式下执行自检/强制错误、然后在最后清除标志。
LCM_Status stat = LCM_runSelfTest(LCM_CPU1_BASE); LCM_Status stat1 = LCM_runComp1ErrorForceTest(LCM_CPU1_BASE); LCM_Status stat2 = LCM_runComp2ErrorForceTest(LCM_CPU1_BASE);
查看代码时、我假设将在代码中以这种方式使用 LCM。 在我需要比较的任何关键算法之后、我将调用 LCM_getLockStepCompareStatus 函数、如果该函数失败、则我需要进行错误处理并清除标志以继续。 如果它通过了,我可以继续,不需要清除任何标志。 这是使用 LCM 功能的正确方法吗? 还是需要添加其他特性?
uint16_t x = 10;
uint16_t y = 5;
uint16_t z = x+y;
if (LCM_getLockStepCompareStatus(LCM_CPU1_BASE) == LCM_FAIL) {
// handle error and clear the flag
LCM_clearFlags(LCM_STATUS_CLEAR_CMP_FAIL);
} else {
// algorithm works fine
}
3.我阅读了 LCM 错误将如何生成 NMI 中断、无论是寄存器奇偶校验还是锁步比较。 我必须在 SYSCFG 中启用中断、每当出现 LCM 错误时、我都会收到 _ interrupt void Interrupt_nmiHandler (void)。 我可以使用 sysctl_getNMIFagStatus()函数来获取什么样的错误并进行错误处理。

我在这里的问题是:
a.即使我在 接收到 LCM 比较错误后调用 LCM_clearFlags (LCM_STATUS_CLEAR_CMP_FAIL)、我仍会获得中断吗? 如果是、则我需要在中断时清除 NMIFags。
b.当我收到寄存器奇偶校验错误 NMI 中断时、是否需要使用 SYSCTL_clearAllNMIRFlags (void)或 SYSCTL_clearNMiStatus (uint16_t NMiFlags)清除标志以继续执行程序、而不是结束程序?
4.我看到、为了测试 LCM 错误、有第3.5.3节"错误注入测试"强制执行错误。 是否有任何其他方法可以在没有注入的情况下创建 LCM 错误? (例如使用 α 粒子轰击硬件)





