历史上的今天
返回首页

历史上的今天

今天是:2024年08月22日(星期四)

正在发生

2018年08月22日 | STM32 内核复位 与 系统复位 区别及程序实现

2018-08-22 来源:eefocus

1 写在前面

某些系统允许复位,但对外设又有特殊要求:某一个IO状态不能因为复位而改变,某一个定时器计数器不能改变等。

例子:A系统通过一个IO控制B系统的电源,而这个IO置高时才开启B系统的电源。

正常工作过程中,B系统只有收到A系统关机命令任务才会进行关机(也就是说不能掉电关机),而A系统在工作过程中有复位的需求。

这个时候如果使用常规的复位方式,就会复位IO,不符合要求。如果有一种方式只复位内核而不复位外设就好了。

接下来就介绍两种复位的实现方式。

2 关于复位

说到复位,我们都不会陌生,系统基本都有一个复位按键。

复位的种类有很多:上电复位、掉电复位、复位引脚复位、看门狗复位、软件复位等。

上面说的复位按键,也就是对应复位引脚复位;而本文说的内核复位与系统复位是属于软件复位。

3 内核复位与系统复位的区别

本文说的内核是指处理器内核,也就是MPU(Microprocessor Unit)。比如STM32F103,其内核就是Cortex-M3内核。

而这里的系统就是包含内核和外设,也就是MCU(Microcontroller Unit),对于STM32F103来说,就是Cortex-M3内核+各种外设接口。

内核复位:只复位Cortex-M3处理器,而不复位外设如GPIO、TIM、USART、SPI等的寄存器。

系统复位:即复位Cortex-M3处理器,又复位外设寄存器。

因此,我们常说的复位一般指的是系统复位。

4 内核复位与系统复位的函数源代码

本文以Cortex-M3(STM32F103)为例来说明,其他芯片类似。

编写了4个复位函数,内核复位(C语言)、内核复位(汇编)和系统复位(C语言)、系统复位(汇编):

void NVIC_CoreReset(void);  //内核复位(C语言)

void NVIC_CoreReset_a(void);  //内核复位(汇编)

void NVIC_SystemReset(void);  //系统复位(C语言)

void NVIC_SystemReset_a(void);  //系统复位(汇编)


在ST官方库中的core_cm3.h文件中已经提供了NVIC_SystemReset的C语言源代码。


Cortex-M3允许由软件触发复位序列,用于特殊的调试或维护。在Cortex-M3中,有两种方法可以实现自我复位。


第一种方法:置位 NVIC 中应用程序中断与复位控制寄存器(AIRCR)的 VECTRESET 位(位偏移:0)。


4.1 NVIC_CoreReset内核复位


这种复位的作用范围覆盖了整个Cortex-M3处理器,除了调试逻辑之外的所有角落,但是它不会影响到Cortex-M3处理器外部的任何电路,所以STM32上的各片上外设和其它电路都不受影响。


编写的NVIC_CoreReset函数C语言源码:


static __INLINE void NVIC_CoreReset(void)

{

    __DSB();

    //置位VECTRESET

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

                  (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |

                   SCB_AIRCR_VECTRESET_Msk);

    __DSB();

    while(1);

}


汇编版函数源码:


__asm void NVIC_CoreReset_a(void)

{

    LDR R0, =0xE000ED0C

    LDR R1, =0x05FA0001  //置位VECTRESET

    STR R1, [R0]

    deadloop_Core

    B deadloop_Core

}


内核复位主要注意:SCB_AIRCR_VECTRESET_Msk和LDR R1, =0x05FA0001,这是和系统复位唯一的区别。


第二种方法:置位 NVIC 中应用程序中断与复位控制寄存器(AIRCR)的 SYSRESETREQ位(位偏移:2)。


4.2 NVIC_SysReset系统复位


系统复位是置位同一个寄存器中的 SYSRESETREQ 位。这种复位则会波及整个芯片上的电路:它会使Cortex-M3处理器把送往系统复位发生器的请求线置为有效。但是系统复位发生器不是Cortex-M3的一部分,而是由芯片厂商实现,因此不同的芯片对此复位的响应也不同。因此,读者需要认真参阅芯片规格书,明白当发生片内复位时,各外设和功能模块都会回到什么样的初始状态,或者有哪些功能模块不受影响(比如,STM32系列的芯片有后备存储区,该区就被特殊对待)。


大多数情况下,复位发生器在响应 SYSRESETREQ 时,它也会同时把Cortex-M3处理器的系统复位信号(SYSRESETn)置为有效。通常,SYSRESETREQ不应复位调试逻辑。


这里有一个要注意的问题:从SYSRESETREQ被置为有效到复位发生器执行复位命令,往往会有一个延时。在此延时期间,处理器仍然可以响应中断请求。但我们的本意往往是要让此次执行到此为止,不要再做任何其它事情了。所以,最好在发出复位请求前,先把FAULTMASK置位。可以采用下列汇编语句:__disable_fault_irq();。


core_cm3.h中提供的NVIC_SystemReset函数C语言源码:


static __INLINE void NVIC_SystemReset(void)

{

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

                 (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | 

                 SCB_AIRCR_SYSRESETREQ_Msk);            

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

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

}


汇编版函数:


__asm void NVIC_SysReset_a(void)

{

    LDR R0, =0xE000ED0C

    LDR R1, =0x05FA0004

    STR R1, [R0]

    deadloop_Sys

    B deadloop_Sys

}


【参考】 CM3(STM32)内核复位与系统复位区别及应用 —— https://blog.csdn.net/ybhuangfugui/article/details/73354918


推荐阅读

史海拾趣

ddm hopt + schuler GmbH & Co KG公司的发展小趣事

随着全球对环境保护意识的增强,ddm hopt + schuler公司开始关注绿色制造和可持续发展。公司投入大量资源进行绿色生产技术的研发,成功开发出一系列节能、环保的电子生产设备。这些设备在保障生产效率和产品质量的同时,显著降低了能源消耗和废弃物排放。这一举措不仅提升了公司的品牌形象,也赢得了客户和市场的广泛赞誉。

EDDING公司的发展小趣事

ECLIPSE公司深知,要想在竞争激烈的电子行业中保持领先地位,必须不断创新和满足用户需求。因此,公司投入大量资源用于Eclipse的研发和更新,不断推出新版本和新功能。同时,ECLIPSE公司也非常重视社区建设,通过举办开发者大会、提供在线支持等方式,积极与全球开发者互动和交流。这些努力不仅增强了Eclipse的用户黏性,也为其带来了更多的创新思路和商业机会。

Easy Braid公司的发展小趣事

Easy Braid公司,从一家名不见经传的小型电子制造商起家,其发展的故事始于一次技术创新。在公司成立初期,面对市场上繁多的线缆管理方案,Easy Braid的创始人意识到传统方法的局限性,于是带领团队研发了一种新型的线缆编织技术——Easy Braid技术。这种技术不仅提高了线缆的耐用性和美观度,还大大简化了安装过程。随着这一技术的推出,Easy Braid开始逐渐在电子行业中崭露头角。

台湾富晶(FORTUNE)公司的发展小趣事
使用滤波器或隔离器等设备隔离输入信号的干扰。
Diconex公司的发展小趣事

在电子行业的激烈竞争中,Diconex公司凭借其卓越的技术创新能力脱颖而出。公司成立之初,便专注于研发高性能、低能耗的半导体芯片。通过不断的研发投入和团队努力,Diconex成功推出了一系列具有行业领先水平的产品,赢得了客户的广泛认可。随着技术的不断升级和市场需求的不断增长,Diconex逐渐在电子行业占据了一席之地。

浙江凡华(FANHAR)公司的发展小趣事

随着环保意识的不断提高,电子行业的环保要求也越来越高。Diconex公司积极响应环保号召,将环保理念融入生产全过程。公司采用环保材料和工艺进行生产,降低生产过程中的污染排放。同时,公司还建立了完善的废弃物处理机制,确保废弃物得到合理处理和资源化利用。这种环保理念的实施不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

问答坊 | AI 解惑

C64X DSP EDMA小结及实例详解(ZZ)

C64X DSP EDMA小结 (1)EDMA概要          ①EDMA数据传输有两种发起方式:          CPU发起的EMDA数据传输(非同步方式):需要传输时,CPU设置ESR寄存器的相应位为1 ...…

查看全部问答>

C51键盘程序

各位有知道   键盘程序中  if ((P1&0xf0)!=0xf0)        ;scancode = 0xfe;                         while((scancode&0x10)!=0)  & ...…

查看全部问答>

关于串口的一个小问题

#include #define uchar unsigned  char #define uint  unsigned  int unsigned char a        ,flag,i; void init() {    TMOD=0X20;    TH1=0XFD;     ...…

查看全部问答>

关于在程序中实现GPRS猫TCPip协议

最近因为工作需要,要开发一个多口GPRS猫发送彩信的工作。 在这里请教搞过相关开发的大侠,可以考虑酬金问题邮件地址199184796@qq.com 实现内容: 在软件中实现ppp拨号连接 本人已经完成mms的内容所有主要是关于如何实现TCPIP协议…

查看全部问答>

YLP2440为何复位不了?

各位大侠,本人菜鸟一枚,我昨天烧了一个程序之后,就复位不了,原来的显示屏只亮白屏,不显示,各各位大侠,请问怎么回事啊?不能刚开始就被我弄坏了吧?…

查看全部问答>

I2C怎么连续写

 为什么连续写不进去AT2402呢?大家帮忙看看吧 !谢谢了#include<reg52.h> #include<intrins.h> sbit SCL=P3^0; sbit SDA=P3^1; char tmp,i,*ap; char code table[]={0x3f  , 0x06 , 0x5b , 0x4f , 0x6 ...…

查看全部问答>

PCIe DMA、Nand Flash、DRAM、RocketIO/SRIO、SERDES

NAND FLASH Controller IP Core标准NAND FLASH Controller标准NAND FLASH控制器 我是一位在职者(北京),专业从事FPGA接口设计,有较多的空余时间,对FPGA有比较丰富的项目经验(6年)。熟练使用Xilinx/Altera FPGA,熟悉NAND FLASH接口时序 ...…

查看全部问答>

MSP430寄存器如何记

我们知道一款功能强大的单片机会有众多的寄存器来操作这些强大的外设和内部设备,430也是如此,因为强大所以内部结构复杂,所以TI给每个外设起名字的时候已经考虑到这些问题了,实际上所有的单片机设计商都在头文件里给寄存器起了易于记忆的名字, ...…

查看全部问答>

提问+TI无线手表大家都怎么用?

TI无线手表大家都怎么用? 是不是出去运动的时候用用,还有他的时间怎么设置!现在无线智能手表越来越多,TI的这个你应用了没? …

查看全部问答>