MCU中的软复位
同事Jicheng在其博客 http://blog.chinaaet.com/detail/35920 介绍了软复位的原理。我再自己整理一遍以加深印象。
软复位的函数如下(用在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 */
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 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) 寄存器来判断。
文章来源: blog.csdn.net,作者:TopSemic嵌入式,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/wangwenxue1989/article/details/48141303
- 点赞
- 收藏
- 关注作者
评论(0)