如何使用软件重置 ARM Cortex-M

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

在某些情况下,我需要通过软件重置设备。例如,我已经使用引导加载程序加载了应用程序映像,然后我需要执行微控制器的重置以重新启动。作为人类用户,我可以按下板上的重置按钮。但是如何从板上运行的软件和应用程序做到这一点,而无需用户手动干预?或者,如果我只是出于某种原因想重置系统?

使用 Kinetis Design Studio 执行软件系统重置

使用看门狗超时

过去,我对其他微控制器(例如飞思卡尔 S08 和 S12 设备)使用了以下方法:

  1. 设置看门狗定时器
  2. 然后当我想重置时,我不再*不再*踢(服务)看门狗定时器
  3. 结果,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 组件 :-)。