MCU软复位原理详解

控制/MCU

1828人已加入

描述

同事Jicheng在其博客介绍了软复位的原理。我再自己整理一遍以加深印象。

软复位的函数如下(用在IAR或者Keil里都可以),核心是对AIRCR寄存器进行操作。

void software_reset(void) { __DSB(); /* Ensure all outstanding memory accesses includedbuffered write are completed before reset */ SCB_AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_SHIFT) | SCB_AIRCR_SYSRESETREQ_MASK); __DSB(); /* Ensure completion of memory access */ while(1); /* wait until reset */ }

1void software_reset(void)

2{

3          __DSB();                                                           /* Ensure all outstanding memory accesses includedbuffered write are completed before reset */ 

4         SCB_AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_SHIFT) |

5                                         SCB_AIRCR_SYSRESETREQ_MASK);

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

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

8}

AIRCR:Application Interrupt and Reset Control Register 

想要实现软复位,先给VRCTKEY赋个0x05FA,再想SYSRESETEQ写1即可实现软复位。

DSB指令即Data Synchronization Barrier(数据同步屏障),它是一种特殊类型的内存屏障。 只有当此指令执行完毕后,才会执行程序中位于此指令后的指令。 当满足以下条件时,此指令才会完成:  1)位于此指令前的所有显式内存访问均完成。  2)位于此指令前的所有缓存、跳转预测和 TLB 维护操作全部完成。  另外和内存屏障相关的还有两个指令,为DMB和ISB。  DMB:Data Memory Barrier  ISB:Instruction Synchronization Barrier  具体细节可以参考ARM®v7-M Architecture Reference Manual

当软复位发生后,可以通过寄存器RCM_SRS1(Reset Control Moudle_System Reset Status Register) 寄存器来判断。 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分