搭档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) 寄存器来判别。