打印
[其他ST产品]

程序中怎样区别是热复位还是冷复位?

[复制链接]
9918|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rzm2001|  楼主 | 2008-3-28 11:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序中怎样区别是热复位还是冷复位?
_stext是一个什么函数
沙发
香水城| | 2008-3-28 12:01 | 只看该作者

什么芯片?

使用特权

评论回复
板凳
香水城| | 2008-3-28 12:18 | 只看该作者

什么是热复位?什么是冷复位?

没有听说过这种说法。

使用特权

评论回复
地板
hq_y| | 2008-3-28 12:26 | 只看该作者

什么是热复位?什么是冷复位?

冷复位:上电复位
热复位:看门狗复位

使用特权

评论回复
5
香水城| | 2008-3-28 13:05 | 只看该作者

这个问题前几天你问过,我也回答了,你没有看吗?

单片机复位解决?st7flite15bf
 
请看下面文档中的7.6.4节的SICSR寄存器——SYSTEM INTEGRITY (SI) CONTROL/STATUS REGISTER
http://www.st.com/stonline/products/literature/ds/11929.pdf

使用特权

评论回复
6
香水城| | 2008-3-28 13:14 | 只看该作者

_stext是C语言的启动文件,通常你不必关心

使用特权

评论回复
7
rzm2001|  楼主 | 2008-3-28 17:01 | 只看该作者

检测出硬复位和掉电复位.

看过了,可以区分软复位,但不能检测出硬复位和掉电复位.

使用特权

评论回复
8
香水城| | 2008-3-28 17:28 | 只看该作者

什么是硬复位?什么是掉电复位?


硬复位是否指上电时的复位?掉电复位是否指LVD复位?

LVD复位有LVDRF状态位。

请看下面的列表:


RESET SourcesLVDRFWDGRF
External RESET pin 0 0
Watchdog 0 1
LVD1X

使用特权

评论回复
9
clslhy| | 2008-3-29 07:42 | 只看该作者

设立一个上电标志位

使用特权

评论回复
10
rzm2001|  楼主 | 2008-3-29 10:45 | 只看该作者

设置上电标志?

设置上电标志?

复位时候,上电标志也会初始化啊,怎样解决?

单片机硬复位,RAM数据会初始化? 我测试过,RESET一次,数据均会清除啊 

使用特权

评论回复
11
rzm2001|  楼主 | 2008-3-29 10:52 | 只看该作者

TO香水

热复位是人工进行RESET的复位?冷复位是上电复位(通电复位)

查看如你提供的表,不能区分热复位和冷复位


 RESET Sources LVDRF WDGRF 
External RESET pin 0 0 
Watchdog 0 1 
LVD 1 X 

另热复位后, RAM 数据会改变吗?


使用特权

评论回复
12
香水城| | 2008-3-29 15:32 | 只看该作者

呵呵,这个冷复位和热复位不同人有不同的定义,把我搞糊

首先楼主给出了一个热复位和冷复位的概念,4楼给出了一个定义:冷复位=上电复位,热复位=看门狗复位;后来楼主又在12楼对热复位从新定义为人工进行RESET的复位;8楼又给出了硬复位、软复位和掉电复位的概念。

这么多概念,而且不同人有不同的定义,确实把我搞糊涂了。我们是搞工程的,最好能有一个统一的名词概念,不要发明那么多概念,否则很容易误会并且耽误时间。

对我来说,在ST7Lite15B上可以有4种复位:
1)上电复位:这是MCU在上电之后由复位电路产生的复位。
2)MCU运行过程中,RESET管脚被拉低而产生的复位:此复位与上电复位的复位源是相同的。
3)看门狗复位:这是由看门狗超时引起的复位。
4)低电压复位:这是由内部低电压检测电路引起的复位。

对应到我在9楼给出的表格:
 复位1和复位2的判断条件是:LVDRF=0  WDGRF=0
 复位3的判断条件是:LVDRF=0  WDGRF=1
 复位4的判断条件是:LVDRF=1

要想区别复位1和复位2,可使用11楼的办法,因为RESET管脚被拉低而产生的复位是不会破坏RAM的内容。

使用特权

评论回复
13
rzm2001|  楼主 | 2008-3-30 15:26 | 只看该作者

谢了,香水城回答的真好

2)MCU运行过程中,RESET管脚被拉低而产生的复位:此复位与上电复位的复位源是相同的

在这种情况下, 原先的ram 中的数据均变成了0, 即每次RESET后数据均进行初始化,看了一下编译.LKF方面的资料文件,好象和.lkf文件有关,不知在程序中怎么设置?

# LINK COMMAND FILE AUTOMATICALLY GENERATED BY STVD7
# SHOULD NOT BE MANUALLY MODIFIED
#

# Put you segment configuration here
# define the .share segment when using compact or memory models only
#<BEGIN SEGMENT_CONF>
# Segment Code,Constants:
+seg .text -b 0xf000 -m 0xfff  -n .text 
+seg .const -a .text  -n .const 
# Segment Zero Page:
+seg .bsct -b 0x80 -m 0x7f  -n .bsct 
+seg .ubsct -a .bsct  -n .ubsct 
+seg .share -a .ubsct  -n .share -is 
+seg .data -a .share  -n .data 
+seg .bss -a .data  -n .bss 
#<END SEGMENT_CONF>


# Put you startup file here    (it depends on the model used)
#<BEGIN STARTUP_FILE>
crtsx.st7
#<END STARTUP_FILE>


# Put your object files here (they depend on you application)
#<BEGIN OBJECT_FILES>
Debugcleanermain_stlit15b.o
Debugcomfuntion.o
Debugeepromrelated.o
Debugi2c_drv.o
Debugmain.o
Debugmotor.o
Debugserial.o
#<END OBJECT_FILES>


# Put your library name here (it depends on the model used)
#<BEGIN LIBRARY_FILES>
libic.st7
libm.st7
#<END LIBRARY_FILES>


# Put your interrupt vectors file here if needed
#<BEGIN VECTOR_FILE>
+seg .const -b 0xffe0 -k
Debuginterrupt_vector.o
#<END VECTOR_FILE>

#<BEGIN DEFINED_VARIABLES>
+def __endzp=@.ubsct            # end of uninitialized zpage
+def __memory=@.bss                # end of bss segment
#<END DEFINED_VARIABLES>

使用特权

评论回复
14
香水城| | 2008-3-31 10:39 | 只看该作者

关于ST7芯片复位后RAM被清零的问题

这个RAM清零的操作是由启动文件完成,与lkf文件无关,lkf文件是供链接程序使用的。但在lkf文件的这几行中,描述了使用的启动文件:
# Put you startup file here    (it depends on the model used)
#<BEGIN STARTUP_FILE>
crtsx.st7
#<END STARTUP_FILE>
这个文件是自动生成的,请不要手动修改,否则无效。

这里用了crtsx.st7作为启动文件。这个文件的源程序在目录COSMICCXST7_16KHst7下,编译好的库文件在COSMICCXST7_16KLib目录下。

除了crtsx.st7,还有crtsi.st7和crts.st7两个启动文件,可以在STVD7环境中选择:ProjectSettings...LinkerGeneralStart-up file:

关于这几个启动文件的区别,请看手册“C Cross Compiler User’s Guide for STMicroelectronics ST7”。

简单地说,你可以选择crts.st7作为启动文件,这个文件不初始化任何的RAM区。

使用特权

评论回复
15
rzm2001|  楼主 | 2008-4-1 11:41 | 只看该作者

初始化时钟变慢了 急!

我按照你的使用方法,将crts.st7作为启动文件,这个文件不初始化任何的RAM区。可以用,但我原来的时钟变慢了,不知为何

我在自己的程序中

MCCSR=0X00
RCCR=0XA7;
LTCSR1=0X10;

发觉定时器中断变慢了

使用特权

评论回复
16
香水城| | 2008-4-1 12:18 | 只看该作者

使用crts.st7作为启动文件后应注意变量的初始化

对任何变量的初始化都必须通过程序语句完成,不能使用变量的初始化操作。

例如:有一个变量abc
int  abc = 10;  // 不能这样用!

必须改成:
int abc;

..........

abc = 10;

使用特权

评论回复
17
rzm2001|  楼主 | 2008-4-1 12:48 | 只看该作者

帮助解决一下

我是指我的初始化文件还有那些参数没有初始化,


原来已经是一个现成可用的程序,现在需增加复位检测,按照你的使用方法,将crts.st7作为启动文件,这个文件不初始化任何的RAM区。可以用,但我原来的时钟变慢了,不知为何?

以下是我的初始化特殊寄存器程序

/*=========================================================
* 函 数 名: f_MCU_InitSfr()
* 功能描述: 硬件初始化,初始化MCU SFR
=========================================================*/
void f_MCU_InitSfr(void)
{
    DisableInterrupts;                                // 关闭中断
    MCCSR = 0X00;                                    //MCO CLOCK DISABLE; NORMAL MODE
    RCCR = 0XA7;                                    //CR2-CR9
    SICSR = 0X00;                                    //CR0-CR1

                                            
    PADDR = 0XFF;                                    // PA.0 
    PAOR = 0XFF;                                    // PA.1 NO USE
                                                    // PA.2 NO USE
                                                    // PA.3 NO USE
                                                    // PA.4 TXD
                                                    // PA.5 NO USE
                                                    // PA.6 NO USE
                                                    // PA.7 NO USE

    PBDDR = 0X39;                                    // PB.0BACK LIGHT
    PBOR = 0X79;                                    // PB.1 KEY1
                                                    // PB.2 KEY2
                                                    // PB.3 LCD_DATA
                                                    // PB.4 LCD_WR
                                                    // PB.5 LCD_CS
                                                    // PB.6 RXD
                                          
    PCDDR = 0X03;                                    // PC.0 OSC1
                                                    // PC.1 OSC2 
                                    
    /* 外部中断设置 */
    EICR = 0XAA;                                    //
    EISR = 0X30;                                    // PB5通信接收         ei2 下降沿中断
    
    /* 主时钟设置10ms */
    LTCSR1 = 0X30;                                    /* 基本时钟2ms,中断开启 */
    LTCSR2 = 0X02;                                    /* Timerbase 2,中断开启 */
    LTARR = 0XE6;                                    /* Timerbase 2,100us定时 */

//    LTCSR1 = 0X10;                                    /* 基本时钟2ms,中断开启 */
//    LTARR = 0XF3;                                    /* Timerbase 2,8 * 12 = 100us定时 */    
    
    /* 软件看门狗设置 */
    WDGCR = 0XFF;                                    /* 看门狗打开 */
    EnableInterrupts;                                /* 开启中断 */
}

使用特权

评论回复
18
香水城| | 2008-4-1 13:34 | 只看该作者

请按照我在17楼的说明检查变量的定义部分

另外,原来使用启动文件crtsx.st7时,所有的未初始化变量都被启动文件初始化为零,换了启动文件后,如果你不对这些变量执行初始化而直接使用,则可能造成错误。

还有,你说定时器中断变慢了,你是如何判断的?

使用特权

评论回复
19
rzm2001|  楼主 | 2008-4-2 13:26 | 只看该作者

有RESET问题,急!

谢谢香水城

变量初始化以后, 基本正常.

开始是以为定时器变慢,经测试正常.

另我crts.st7作为启动文件,自己做初始化工作, 测试如下:
单片机频繁进行人工RESET, 程序会出现不正常运行, 不能进行复位,偶尔的,不知什么原因.我的初始化文件见18楼, 是否我还有些特殊寄存器没有初始化所致.

使用特权

评论回复
20
香水城| | 2008-4-2 14:51 | 只看该作者

很难说你的问题在哪里

单片机频繁进行人工RESET:多么频繁?10次/秒还是1次/10秒?

程序会出现不正常运行, 不能进行复位:如何不正常?晶振是否启振?程序是否开始运行?什么叫“不能进行复位”?程序继续运行?

请说明。


ST7的所有寄存器都在手册中,没有什么特殊寄存器。

另外,你的程序中是否有等待振荡器稳定的部分?

使用特权

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

本版积分规则

18

主题

46

帖子

0

粉丝