STM32软件复位的实现方法

2019-06-13来源: eefocus关键字:STM32  软件复位  实现方法

前些天写程序的时候,需要做一个自动复位的功能,也就是当收到外部通讯设备复位指令时,主设备立刻执行复位操作。当时是想到的用看门狗实现。但是觉得似乎不太妥当,因为看门狗的复位是需要一定的时间。而在这段时间内系统还是处于正常运行当中,而且所有中断都会正常响应。这恰好与要实现的功能南辕北辙。需求是当收到复位指令时,系统停止执行后面的所有操作,包含中断响应。所以看门狗无法实现。 


我用的是STM32F103芯片,了解这颗芯片能用来复位的只有5种,外部复位、独立/窗口看门狗、软件复位功耗管理。看来我能用的也就只有软件复位了。但是我查了所有STM32F103芯片相关的资料,还是没有找到具体的实现方法,最多是提到过这种复位寄存器SYSRESETRQ位。不过功夫不负有心人,我还是找到了线索,STM32F103芯片手册中提到这种复位属于内核部分,于是我翻看了cortex-m3内核相关书藉才找到,在此分享一下,表达一个喜悦之情。 


共有两种实现方法,具体方法实现如下: CM3允许由软件触发复位序列。 


第一种方法,是通过置位NVIC中应用程序中断与复位控制寄存器(AIRCR)的VECTRESET位(位偏移:0),如下所示: 

LDR R0, =0XE000ED0C  ;NVIC AIRCR address 

LDR R1, =0X05FA0001  ;置位VECTRESET位,前面的0X5FA是访问钥匙、 STR R1, [R0]     ;触发复位序列 deadloop 

B    deadloop   ;该死循环保证后面的指令不可能被执行到 

这种复位的作用范围覆盖了整个CM3微控制器中,除了调试逻辑之外的所有角落,但是它不会影响到CM3微控制器处部的电路,所以单片机上的各片上外设和其他电路都不受到影响。  


复位的第二种方法,置位同一个寄存器中的SYSRESETREQ位,这种复位则是会波及整个芯片上的电路:它会使CM3微控制器把送往系统复位发生器的请求线置为有效。但是,系统复位发生器不是CM3的一部分,而是芯片厂商实现的,因此,不同的芯片对此复位的响应也不同。因此读者需要认真 参阅该芯片的规格书,明白发生片内复位时,各外设和功能模块都会回到什么状态,或者有哪些功能模块受到影响(比如,STM32系列有后备存储区,该区就被特殊对待)。SYSRESETRQ的使用代码如下面代码段演示: LDR R0, =0XE000ED0C NVIC AIRCR address 

LDR R1, =0X05FA0004 置位SYSRESETRQ,前面的0X05FA是访问钥匙 STR R1, [R0]     ;触发复位序列 deadloop 

B    deadloop  ;该死循环保证后面的指令不会被执行到   

这里要注意一个问题:从SYSRESETRQ被置为有效,到复位发生器执行复位命令,往往会有一个延时。在些延时期间内,处理器仍然可以响应中断请求。但我们的本意往往是要让此次执行到此为止,不要再执行任何操作。所以,最好在发出复位请求前,先把FAULTMASK置位。 


这两种方法都是对CM3内核寄存器直接操作的,调试的时候可以试试看,不过正常情况下,没事不要瞎玩儿啊!


关键字:STM32  软件复位  实现方法

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic464496.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32如何使用内部时钟源当系统时钟
下一篇:STM32F4系统时钟设置之二

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8控制4位LED数码管显示数字

用4位LED显示数字 #define STB_H         GPIOC->ODR |= (uint8_t)(GPIO_PIN_2)#define STB_L         GPIOC->ODR &= (uint8_t)(~GPIO_PIN_2) #define DATA_H         GPIOE->ODR |=(uint8_t)( GPIO_PIN_5)#define DATA_L     
发表于 2019-09-21
STM8控制4位LED数码管显示数字

STM32中stm32f0xx_flash.icf文件的作用详解!

 添加额外的region   比如我要添加另一个名为ROM2的ROM区域,大小是256bytes,起始地址是0x80000.       define region ROM = Mem:[from 0x80000 size 0x100];2.2 教你怎样放置SECTION如果你要把你的只读常量放置在你指定的域而不是编译器默认的位置,你就得按如下操作了:define region CONST_region = Mem:[from 0x100 size 0x100];place in
发表于 2019-09-21
STM32中stm32f0xx_flash.icf文件的作用详解!

STM32 USART串口DMA 接收和发送的源码详解!

硬件平台:STM32F103ZET6; 开发环境:KEIL 4;先说说应用通讯模式,串口终端的工作方式和迪文屏差不多,终端被动接受MCU发的指令,终端会偶尔主动发送一些数据给MCU(像迪文屏的触摸信息上传)。串口DMA发送:发送数据的流程:前台程序中有数据要发送,则需要做如下几件事1.在数据发送缓冲区内放好要发送的数据,说明:此数据缓冲区的首地址必须要在DMA初始化的时候写入到DMA配置中去。2.将数据缓冲区内要发送的数据字节数赋值给发送DMA通道,(串口发送DMA和串口接收DAM不是同一个DMA通道)3.开启DMA,一旦开启,则DMA开始发送数据,说明一下:在KEIL调试好的时候,DMA和调试是不同步的,即不管Keil
发表于 2019-09-21

stm32上电自启动后运行不正常的故障排查分析

最近负责一个项目,用到stm32f4的一款高性能芯片。研发过程中遇到一个很诡异的现象,前前后后折腾了两三天,最后才搞定。由于是新手,经验不足,排故过程很纠结~~现象如下:采用JLINK下载程序后,断电让其上电重新启动,发现有时可以正常运行,有时候无法正常运行,大约每两、三次就有一次无法正常上电启动。2.通过JLINK调试程序,每次均正常运行。太诡异了!发现问题后开始定位原因。首先考虑是BOOT启动出问题了,stm32f4启动方式分三种:User FLash、SystemFlash和EmbeddedSRAM,通过BOOT0和BOOT1管脚配置。程序正常运行时从User FLash启动,如果BOOT0和BOOT1配置不正确,会导致无法
发表于 2019-09-21

STM32的时钟系统RCC详细整理

ate NewState);// 使能或者失能PLL//输入:ENABLE或者DISABLE#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL) void RCC_PREDIV1Config(uint32_t RCC_PREDIV1_Source, uint32_t RCC_PREDIV1_Div);//#endif#ifdef  STM32F10X_CL void RCC_PREDIV2Config(uint32
发表于 2019-09-21
STM32的时钟系统RCC详细整理

IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

=2blE__GxI1lmJglihBi5xJQPolza-NMxcZqGThxwysiY80ZOe6hLl5k6mowbTN2j30WsPftFZsBe1pRt8WlCDIT7Ce5EIReo4uGCEyegh7S(IAR 新建 STM32工程)        4,http://blog.sina.com.cn/s/blog_4c8287230100f0jw.html(IAR 新建 STM32工程)        5,http://blog.sina.com.cn/s/blog_4c8287230100eznh.html(IAR使用说明)        6,http://blog.sina.com.cn/s/blog_4c8287230100f2ah.html
发表于 2019-09-21
IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved