前些天写程序的时候,需要做一个自动复位的功能,也就是当收到外部通讯设备复位指令时,主设备立刻执行复位操作。当时是想到的用看门狗实现。但是觉得似乎不太妥当,因为看门狗的复位是需要一定的时间。而在这段时间内系统还是处于正常运行当中,而且所有中断都会正常响应。这恰好与要实现的功能南辕北辙。需求是当收到复位指令时,系统停止执行后面的所有操作,包含中断响应。所以看门狗无法实现。
我用的是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如何使用内部时钟源当系统时钟
下一篇:STM32F4系统时钟设置之二
推荐阅读最新更新时间:2024-11-09 18:43
设计资源 培训 开发板 精华推荐
- LT3497EDDB 演示板,双路白光 LED 驱动器转换器
- 用于通信/电信的 2.7 至 12V 差分放大器
- LTC3892HUH 具有 8V 栅极驱动器的高效、双相降压型 5V/8.5V 转换器的典型应用电路
- 用于 SMPS 电源的 L6566BTR 多模式控制器在电源过压应用时的典型锁存关断
- 显示 A8518 LED 驱动器灵活输入/输出电压比的 SEPIC 配置的典型应用
- VNQ7003SY评估板
- 开源60W小型UPS电源参考设计
- EVAL_PAN1026,基于 PAN1026 系列放置和播放蓝牙模块的评估套件
- STGIPS14K60T专用电源IC和模块的典型应用
- 【训练营】多用途RGB灯控制板-402304A