在某些情况下,我需要通过软件重置设备。例如,我已经使用引导加载程序加载了应用程序映像,然后我需要执行微控制器的重置以重新启动。作为人类用户,我可以按下板上的重置按钮。但是如何从板上运行的软件和应用程序做到这一点,而无需用户手动干预?或者,如果我只是出于某种原因想重置系统?
使用 Kinetis Design Studio 执行软件系统重置
使用看门狗超时
过去,我对其他微控制器(例如飞思卡尔 S08 和 S12 设备)使用了以下方法:
- 设置看门狗定时器
- 然后当我想重置时,我不再*不再*踢(服务)看门狗定时器
- 结果,WDT(看门狗定时器)或 COP(计算机正常运行)将超时,并将重置该部分
这种方法很有效,但并不是最简单的方法。特别是在 ARM Cortex-M 上,有更好的方法 :-)。
使用 ARM 系统重置
包含飞思卡尔 Kinetis 系列内核的 ARM Cortex-M 在 AICR (应用程序中断和复位控制寄存器)中具有 系统复位 功能:
AIRCR 寄存器(来源:ARM Infocenter)
所以我只需要写一个 0x05FA 到 VECTKEY 和一个 1 到 SYSRESETREQ :-)。
最简单的方法是如果我使用来自 SourceForge 的 KinetisTools Processor Expert 组件(参见“ McuOnEclipse Releases on SourceForge ”):
KinetisTools 处理器专家组件
该组件提供了一个 SoftwareReset() 函数,我可以在我的应用程序中使用它。在组件中是这样定义的:
void KIN1_SoftwareReset(void) { /* Generic way to request a reset from software for ARM Cortex */ /* See https://community.freescale.com/thread/99740 To write to this register, you must write 0x5FA to the VECTKEY field, otherwise the processor ignores the write. SYSRESETREQ will cause a system reset asynchronously, so need to wait afterwards. */ #if KIN1_IS_USING_KINETIS_SDK SCB->AIRCR = (0x5FA< #else SCB_AIRCR = SCB_AIRCR_VECTKEY(0x5FA) | SCB_AIRCR_SYSRESETREQ_MASK; #endif for(;;) { /* wait until reset */ } }
所以你所需要的只是在你的应用程序中有这样一段代码来进行系统重置。
该组件具有可选的命令行界面。这样我就可以使用 shell 中的命令重置目标 :-)
从 Shell 重置系统
概括
要通过软件重置 ARM Cortex M,我可以使用 AIRCR 寄存器。我可以直接执行此操作,也可以使用处理器专家的 KinetisTools 组件 :-)。