打印

STM32软件复位失败

[复制链接]
16428|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fq1110|  楼主 | 2012-10-10 09:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我的同一批STM32F103VET6的板子,在上电工作后,会执行一次软件复位,但有的板子能正常复位成功,有的板子却复位失败,再也跑不起来。
这通常是什么原因引起的呢?希望大家帮帮我。
沙发
IJK| | 2012-10-10 09:45 | 只看该作者
软件复位 是什么概念?
另外,可以试试硬件复位。

使用特权

评论回复
板凳
fq1110|  楼主 | 2012-10-10 10:01 | 只看该作者
Cortex-M3 处理器含 3 个复位输入。如表 6-3 所示。
表 6-3  复位输入
复位输入  描述
PORESETn  复位整个处理器系统,JTAG-DP除外
SYSRESETn  复位整个处理器系统,NVIC 中的调试逻辑、FPB、DWT、ITM以及AHB-AP除外
nTRST  复位JTAG-DP
注:
nTRST 复位 JTAG-DP。如果设备不含 JTAG-DP,那么必须断开(tied off)该复位端。

6.3   Cortex-M3 复位方式
通过处理器设计中出现的复位信号,用户可以单独对设计中的不同元件进行复位。表
6-4 列出了这些复位信号和他们的组合形式,以及可能的应用。
表 6-4  复位方式
复位方式  SYSRESETn  nTRST  PORESETn  应用
上电复位  x 0 0  接通电源后复位,复位整个系统。冷复位
系统复位  0 x 1  复位处理器内核和系统元件,调试元件除外
JTAG-DP复位  1 0 1  复位JTAG-DP 逻辑
注:
PORESETn复位 SYSRESETn逻辑的超集(superset) 。

我是用的软复位
指令:*((u32 *)0xE000ED0C)=0x05fa0004;

现在就是执行上述指令时,MCU就挂了。除非再次上电复位才能成功。

使用特权

评论回复
地板
fq1110|  楼主 | 2012-10-10 11:54 | 只看该作者
同一批次的板子,有些没有出现这问题,有十几块都有这种问题,就怕货做出来,发给客户,问题显露了,那就麻烦了。

使用特权

评论回复
5
pattywu| | 2012-10-10 12:57 | 只看该作者
本帖最后由 pattywu 于 2012-10-10 13:07 编辑

指令:*((u32 *)0xE000ED0C)=0x05fa0004;
必须在内核态下执行。在用户态下,进入HardFault。
当然,你在HardFault的处理函数中,再加入上述的指令,保证能复位。
因为HardFault就是在内核态下执行的。

使用特权

评论回复
6
qqatscau| | 2012-10-10 14:46 | 只看该作者
MARK

使用特权

评论回复
7
xiaocaicai111| | 2012-10-10 16:33 | 只看该作者
http://www.eeboard.com/bbs/thread-2289-1-1.html

使用特权

评论回复
8
fq1110|  楼主 | 2012-10-10 18:08 | 只看该作者
指令:*((u32 *)0xE000ED0C)=0x05fa0004;
必须在内核态下执行。在用户态下,进入HardFault。
当然,你在HardFault的处理函数中,再加入上述的指令,保证能复位。
因为HardFault就是在内核态下执行的。 ...
pattywu 发表于 2012-10-10 12:57


大哥,用了这招还是没用。

使用特权

评论回复
9
fq1110|  楼主 | 2012-10-10 18:09 | 只看该作者
126393http://www.eeboard.com/bbs/thread-2289-1-1.html
xiaocaicai111 发表于 2012-10-10 16:33


谢谢,你这个资料我看过了。
我现在是想分析怎么会引起这种现象呢?

使用特权

评论回复
10
小农wz| | 2012-10-10 20:40 | 只看该作者
踩一下

使用特权

评论回复
11
figo20042005| | 2012-10-10 21:45 | 只看该作者
这个问题会有别的硬件上不稳定因素吧

使用特权

评论回复
12
pattywu| | 2012-10-10 21:53 | 只看该作者
在RTX的改造中,我是这么重启系统的。
1、重启系统的函数:
void rt_Reset(void)                                                                        // NVIC系统重启
{
          SCB->AIRCR  = (NVIC_AIRCR_VECTKEY | (SCB->AIRCR & (0x700)) | (1<<NVIC_SYSRESETREQ)); // Keep priority group unchanged */
          __DSB();                                                     // 确保内存访问完成            
          while(1);                                                    // 等待,直至重启
}

2、做为系统的SVC服务:
#define __SVC_0                 __svc_indirect(0)                        // 系统SVC中断服务0
#define                Sys_Reset()                        _os_rt_reset((s32)rt_Reset)
void                _os_rt_reset(s32 p)                        __SVC_0;

3、在HardFault中的处理如下:
HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler         [WEAK]
                                IMPORT  rt_Reset
                                LDR     R0, =rt_Reset
                                BX                R0
                B       .
                ENDP

说明:
    1、正常情况下,在线程中需要重启系统,直接调用Sys_Reset();
    2、当出现异常情况,进入HardFault时,由HardFault重启系统。

使用特权

评论回复
13
lixiang69| | 2012-10-10 22:17 | 只看该作者
开看门狗,然后进入死循环即可

使用特权

评论回复
14
huzhulong| | 2012-10-11 15:54 | 只看该作者
跟踪看看

使用特权

评论回复
15
gdmgb520| | 2012-10-11 17:44 | 只看该作者
关注,帮顶
13L的方法应该可以实现,但是觉得有点“歪门邪道”的感觉,呵呵,或者说比较灵活变通。
12L说的应该是比较合理的吧,不是特别懂。

使用特权

评论回复
16
拿起书本| | 2012-10-13 13:59 | 只看该作者
会不会是周边的电路,比如供电部分出问题了,断电重来后,某些电容暂时可以正常工作

使用特权

评论回复
17
handlike| | 2012-10-13 17:28 | 只看该作者
检查BOOT0,BOOT1连接电路是否为低电平及上电复位后RST脚是否高电平。

使用特权

评论回复
18
fq1110|  楼主 | 2012-10-14 19:14 | 只看该作者
芯片一直在供电,只是用了软复位,就失败了.再也不能工作.看门狗也没用了.

使用特权

评论回复
19
fq1110|  楼主 | 2012-10-15 11:33 | 只看该作者
检查BOOT0,BOOT1连接电路是否为低电平及上电复位后RST脚是否高电平。
handlike 发表于 2012-10-13 17:28


用示波器测量时,软复位时有电平变换。但是还是芯片复位不起来。

使用特权

评论回复
20
fq1110|  楼主 | 2012-10-15 11:34 | 只看该作者
会不会是周边的电路,比如供电部分出问题了,断电重来后,某些电容暂时可以正常工作
拿起书本 发表于 2012-10-13 13:59

一直在供电,纹波10mV以内,应该不是电容的问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

530

帖子

1

粉丝