历史上的今天
返回首页

历史上的今天

今天是:2024年11月18日(星期一)

正在发生

2019年11月18日 | STM8单片机复位源判断

2019-11-18 来源:eefocus

最近在调试系统的时候,发现单片机老是复位,于是想着用程序来判断一个单片机的复位信号是来自于哪里。查找资料发现STM8单片机的复位源总共有9种


●NRST引脚产生的外部复位

● 上电复位(POR)

● 掉电复位(BOR)

● 独立看门狗复位

● 窗口看门狗复位

● 软件复位

● SWIM复位

● 非法操作码复位

● EMS复位:当一些关键的寄存器被破坏或错误加载时产生的复位


但是这9种复位源通过复位寄存器能看到的只有5种


复位状态寄存器(RST_SR)


位7:5 保留,必须保持为0。

位4 EMCF:EMC复位标志

位3 SWIMF:SWIM复位标志位

位2 ILLOPF:非法操作码复位标志位

位1 IWDGF:独立型看门狗复位标志位

位0 WWDGF:窗口型看门狗复位标志位

 


由于单片机没有用到看门狗,所以这两种看门狗复位用不到,SWIM复位是烧写程序或者仿真时用的。那就只剩下一个EMC复位、非法操作码复位可以判断。但是更希望看到的是单片机是电源不稳引起的掉电复位还是单片机复位引脚被干扰引起的NRST复位。但是寄存器中没有可以判断这两种复位源的标志位。那么能不能自己想办法来判断这两种复位源呢?


  首先分析一下掉电复位和NRST复位的区别,掉电复位也就是单片机完全断电,复位后内存中所有的东西会丢失。NRST复位时内存数据没有丢失,内存中的东西还是复位前存储的数据。那么根据这个特性是不是可以在内存中某个地址存数一个标志。复位后去读取这个标志,如果这个标志和存放的一样,说明单片机没有掉电,属于NRST复位。如果读取到的值不是存储的值那么说明单片机断电了,内存中存储的内容丢失了,属于掉电复位。那么这样就能区分开是掉电复位还是NRST复位了。


写个程序测试了一下,测试结果符合预期。


测试代码如下:


#include "iostm8s103F3.h"

#include "main.h"

#include "uart.h"

#include "stdio.h"

 

void SysClkInit( void )

{

    CLK_SWR = 0xe1;                  //HSI为主时钟源  16MHz CPU时钟频率

    CLK_CKDIVR = 0x00;               //CPU时钟0分频,系统时钟0分频

}

 

void main( void )

{

    __asm( "sim" );                             //禁止中断

    SysClkInit();

    Uart1_Init( 9600 );

    __asm( "rim" );                             //开启中断

    

    //复位源判断

    if( ( * ( u16* )( 0x000102 ) ) == 0x55 )    //判断0x000100这个地址中存储的值是不是0x55

    {

        printf( " key reset!rn" );                     //值等于0x55说明是程序写进去的,属于按键复位

    }

    else                                                        //如果这个地址的值不等于0x55 说明单片机是刚上电

    {

      printf( " power reset!rn" );                  //属于上电复位 然后将指定的值写入指定的地址,若单片机不断电,这个值就会一直保持不变

        * ( u16* )( 0x000102 ) = 0x55;

    }

    if( RST_SR_WWDGF )

    {

        printf( "wwdg reset!rn" );

    }

    if( RST_SR_IWDGF )

    {

        printf( "iwdg reset!rn" );

    }

    if( RST_SR_ILLOPF )

    {

        printf( "illop reset!rn" );

    }

    if( RST_SR_SWIMF )

    {

        printf( "swim reset!rn" );

    }

    if( RST_SR_EMCF )

    {

        printf( "emcf reset!rn" );

    }

    //WWDG_CR = 0x80;                    //启动独立看门狗

    //  IWDG_KR = 0xCC;                   //启动窗口看门狗

    while( 1 )

    {

    }

}


每次上电后先判断 0x000102 这个地址的值是不是0x55,如果不是说明单片机是刚上电,内存中的值是随机的。于是将0x000102这个地址中的值改为0x55,如果下一次单片机复位后读到这个地址的值是0x55的话,说明单片机没有掉电。属于复位引脚引起的复位。0x000102这个地址必须保证不会被程序用到,要不然在程序执行过程中值被改写,下次单片机复位后读到的值就不是0x55了。


其余的复位源直接去读取寄存器就可以了。

推荐阅读

史海拾趣

Euvis Inc公司的发展小趣事

随着科技的不断进步和消费者需求的日益多样化,电子行业面临着巨大的变革压力。Euvis Inc公司敏锐地洞察到这一趋势,积极调整战略方向,将业务拓展至物联网、智能家居等新兴领域。通过不断的技术创新和市场拓展,公司成功应对了行业变革带来的挑战,保持了持续的发展势头。

Gore公司的发展小趣事
在电力系统中,三电平直流变换器可用于直流输电、电力电子变压器等领域,提高电网的稳定性和效率。
Hama公司的发展小趣事

在获得多轮融资后,H&D Wireless加快了全球化战略的步伐。公司计划利用融资资金进行全球业务扩张,并发布物联网云服务平台,以支持更多应用程序实现非现金支付和位置追踪服务。此外,H&D Wireless还透露了上市计划,考虑在斯德哥尔摩纳斯达克北欧交易所(Nasdaq First North)寻求上市。这一计划将为公司带来更多的资金支持和市场关注,进一步推动其全球化发展。

ANADIGICS公司的发展小趣事

H&D Wireless始终将产品创新和客户服务放在首位。公司不断推出新的物联网解决方案,以满足不同行业客户的需求。同时,H&D Wireless还建立了完善的客户服务体系,为客户提供全方位的技术支持和解决方案咨询。这种以客户为中心的经营理念赢得了广大客户的信赖和支持,也为公司的持续发展奠定了坚实基础。

以上五个故事展示了H&D Wireless公司在电子行业中的发展历程和成就,体现了其在物联网领域的创新能力和市场竞争力。

BESTECH公司的发展小趣事

H&D Wireless始终将产品创新和客户服务放在首位。公司不断推出新的物联网解决方案,以满足不同行业客户的需求。同时,H&D Wireless还建立了完善的客户服务体系,为客户提供全方位的技术支持和解决方案咨询。这种以客户为中心的经营理念赢得了广大客户的信赖和支持,也为公司的持续发展奠定了坚实基础。

以上五个故事展示了H&D Wireless公司在电子行业中的发展历程和成就,体现了其在物联网领域的创新能力和市场竞争力。

FOSLINK公司的发展小趣事

FOSLINK公司自成立以来,始终将技术创新视为企业发展的核心驱动力。在早期,公司专注于研发高性能的电子元器件,如混合积体电路(IC)和单石数位积体电路(ASIC)。通过不断的技术积累和优化,FOSLINK成功推出了多款具有行业领先地位的产品,不仅满足了市场对高质量电子元器件的需求,还引领了行业的技术进步。这一系列的创新成果,使FOSLINK在电子行业中逐渐崭露头角,赢得了众多客户的信赖和好评。

问答坊 | AI 解惑

被同一个坑绊倒了两次-俺的100mWZIGBEE节点调试心得

拿到一个新的PAIC,台湾某厂的UP2202,2.4G频段专用,号称增益25db,输出功率能轻而易举的达到20dbm,恰好有个zigbee项目需要增加功率,于是毫不犹豫的上了它,嘿嘿!     按照原理图,俺画了块板子,看起来貌似该ic使用起来很“弱智” ...…

查看全部问答>

妨碍你成功的性格特点

知足 只要有吃有穿,腹饱体暖,就感到满足。这种人对生活没有一点欲求,怎么会创造富有与成功呢? 自满 自己的总是最好的,甚至认为自己应该成为别人效仿的标准。这种人不屑于与外界来往,他们根本不知道社会进步到什么程度,怎么可能有更 ...…

查看全部问答>

adoce3.1 对数据库的操作

m_pConn->put_Provider(L\"\\\\DiskOnChip\\\\pda\\\\myce.sdf\");         m_pConn->Open(L\"Provider=microsoft.sqlserver.oledb.ce.2.0;Data Source=\\\\DiskOnChip\\\\pda\\\\myce.sdf\",TEXT(\"\"),TEXT(\"\"),adOpenUns ...…

查看全部问答>

VxWorks下实现了RPC Server,我在WINDOWS的PC上怎么访问?

我的设备上跑的是VxWorks,上面实现了一个RPC服务器,文档里面说是遵循SUN 的RPC规范(RFC1057),现在我在Windows平台下需要访问这个RPC服务器,这个要怎么做?…

查看全部问答>

WinCE5.0自动数据库EDB的使用问题

俺手头上有个WinCE Mobile 6.0的EDB例程(Mobile 6.0的SDK在VS2005上编译通过),在Mobile 6.0的模拟器中可以运行; 然后直接复制到自己的2440上(跑WinCE5.0),刚开始使用2440编译出来的wince5.0sdk在VS2005中编译不过,后来定制WINCE平台时 ...…

查看全部问答>

求助:ce下如何使用看门狗

三星2440的芯片,想使用看门狗, 我现在写了一个驱动,看门狗做如下初始化: //Prescaler value=254, the clock division factor=128,Enable bit of the interrupt. int nCounts = 30000; v_pWatchRegs->rWTCON &= ~0xffff; v_pWatchRegs->rWT ...…

查看全部问答>

从根本上解决PLC高速计数器的计数误差

在应用高速计数器时往往会碰到,计数器与输入计数脉冲信号的脉冲电平不匹配、旋转编码器、光栅尺数据输出是TTL电平,而PLC高速计数器却要求接受的是0 - 24v传输脉冲信号、有的编码器为了提高编码器的可靠性,提供A+、A-,B+、B-,Z+、Z- 对称反相计 ...…

查看全部问答>

香水,给我个STM8s-discovery的软件包。

在ST扯淡的网站上找了两个小时没找到。 愤怒!!! 我需要ST-link STVP STVD 再次提出强烈抗议!!!…

查看全部问答>

新人报道,多多关照

很高兴加入论坛,希望与大家共同分享,交流,进步…

查看全部问答>

本人理解的PWM占空比的PID控制【LM3S*B**】

这两天找了这一块的资料,很多写的都很抽象,自己也想了想,觉得是这样的,大家帮忙看一下并指正:通过PID的输出Uk作为匹配值从而改变PWM的占空比;而Uk一般可以通过增量式PID来计算,它和AD采样值和设定值(模拟量转化为数字量)之差有关系;比如 ...…

查看全部问答>