专栏中心

EEPW首页 > 专栏 > 可以在hardfault 中直接软件复位

可以在hardfault 中直接软件复位

发布人:电子禅石 时间:2019-10-12 来源:工程师 发布文章

重点:当时遇到一个安全芯片M4 核的,厂家资料比较少,其中就缺少软件复位功能。

解决的问题就是进入hardfault 后可以软件复位。直接用core_cm4.h 中的NVIC_SystemReset 就可以。


在嵌入式开发项目过程中,经常需要执行软件复位,基于ARM cortex-M4核的芯片,通过控制系统控制模块(System Control Block)的中断和复位寄存器可以实现设备的软件复位, 这种复位实现软件从开始运行,复位CPU的主要组件,除过调试模块。

寄存器介绍

基于ARM cortex-M4内核的芯片软件复位功能的实现是通过应用中断和复位控制寄存器(AIRCR)实现的,复位只与寄存器中的第2位,16~31位有关。下图是寄存器位的详细描述。

如果想写这个寄存器,必须先给VECTKEY域写0x5FA,负责寄存器将忽略写操作。SYSRESETREQ位,为系统复位请求位,写0,无复位请求,写1请求复位。这一位是只写位,读为0。

实现方案

知道了寄存器的定义后,如何通过软件来实现复位这一功能呢,有两种方案。

一种是直接调用ARM公司提供的core_cm4.h文件中的复位函数。对照寄存器,这个函数应该很好理解,ARM公司提供的是内联函数。

/** \brief  System Reset

The function initiates a system reset request to reset the MCU.

*/

__STATIC_INLINE void NVIC_SystemReset(void)

{

__DSB();      /* Ensure all outstanding memory accesses included

               buffered write are completed before reset */

SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)|

         (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |

SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */

__DSB();    /* Ensure completion of memory access */

while(1);                   /* wait until reset */

}

这里主要说下__DSB(), DSB(Data Synchronization Barrier.)这里插入DSB的指令函数是为了确保内存操作访问的完成。

另一种方案是自己按照数据手册对寄存器的描述实现复位功能的函数。如果是自己写函数实现,建议也插入DSB指令函数确保内存访问安全。

#define SCB_AIRCR_VECTKEY_SHIFT         16

#define SCB_AIRCR_PRIGROUP_MASK         0x700u

#define SCB_AIRCR_SYSRESETREQ_MASK      0x4u

void System_vReset(void)

{

__DSB();/* Ensure all outstanding memory accesses included

                 buffered write are completed before reset */

SCB_AIRCR = ( (0x5FA << SCB_AIRCR_VECTKEY_SHIFT) |

                         SCB_AIRCR_PRIGROUP_MASK |

                         SCB_AIRCR_SYSRESETREQ_MASK);   

__DSB();             /* Ensure completion of memory access */

while(1);                   /* wait until reset */

  }

总结

由于芯片厂商的数据手册都是基于自己芯片的描述,涉及ARM内核的知识需要参考ARM官方文档,基于ARM cortex-M4内核的芯片,可以参考ARM官方文档DUI0553A_cortex_m4_dgug,飞思卡尔kv4xMCU的复位同样涉及到ARM cortex-M4内核的操作,在飞思卡尔参考手册上是没有详细信息的,需要参考ARM的官方文档,建议大家在学习ARM时候,需要熟悉下内核知识。 https://cloud.tencent.com/developer/article/1089441


专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

理解发展哲理 领悟发展走向——关于硅技术的思考

Protel99SE快速入门

汽车应用的同轴电缆供电基础知识

研究论文欺诈:一个日益严重的问题——工程学呢?

应对团体设计项目的挑战

为什么 Matter 1.4.2 更新很重要?

汽车PoC系统的浪涌保护需求

ProtelDXP指导教程

第一次深入真正的3D-IC设计

EDA/PCB 2025-09-28

Protel 99 SE 新特性及用法

PROTEL技术大全---初学者必看

什么是注意力机制,它们在语音和音频处理中如何工作?

协作创新平台——IBM微电子和Power架构

视频 2009-12-21

人工智能在 EDA 工具中的作用的局限性

EDA/PCB 2025-09-28

用于高端电机控制的新型瑞萨电子MCU系列

asss

armchip 2005-04-28

protel99se快捷键

恒忆 Krypto 密码访问

视频 2009-12-14

PoC系统的诊断和监控技术

连接世界的SOC设计

视频 2009-12-21

闪存安全功能保护您的知识产权

视频 2009-12-14
更多 培训课堂
更多 焦点
更多 视频

技术专区