myxiaonia 发表于 2019-8-26 11:17:58

stc15w408as比较器中断里不能写flash

本帖最后由 myxiaonia 于 2019-8-26 11:31 编辑

我用比较器中断进行掉电保存,使用的stc的模拟eeprom,用镊子短接电阻模拟电压降,通过一个变量值已经确定进入了中断,结果重新上电发现没有保存成功
我把掉电保存代码放在中断外是可以正常保存的

我使用stc15w408as,这个料不能在中断里写模拟eeprom吗?

myxiaonia 发表于 2019-8-27 01:01:48

版主有stc15w408as的话,请测试下这个程序,我这里确实不能在比较器中断里写flash

myxiaonia 发表于 2019-8-27 23:22:47

结贴结贴,终于发现问题了,长时间不用51生疏了

因为中断指定了寄存器组,因此它调用的子函数也必须指定寄存器组

stc没有毛病,问题在我

myxiaonia 发表于 2019-8-26 13:30:04

没人能回答这个问题吗,呼叫版主

weavr 发表于 2019-8-26 13:49:58

是整个芯片供电都降低吗?这样的话,下载时不能勾选“低压时禁止EEPROM操作”,还有那个低压复位或中断的选项

myxiaonia 发表于 2019-8-26 16:01:50

weavr 发表于 2019-8-26 13:49
是整个芯片供电都降低吗?这样的话,下载时不能勾选“低压时禁止EEPROM操作”,还有那个低压复位或中断的选 ...

不是的   我之前也造成误解了   后来我回过神来你说的这个是lvd中断,等同于stm32中的lvd中断,这个中断没法用的,电压下降后写flash是不可靠的

我用的是比较器中断,是对降压前的电压用电阻分压再和内部参考源比较的

非常讨厌的是中断有了,我短接某个电阻模拟掉电,确实进入比较器中断,按理应该写flash,但是重新上电就是不行

whatcanitbe 发表于 2019-8-27 11:24:49

myxiaonia 发表于 2019-8-26 16:01
不是的   我之前也造成误解了   后来我回过神来你说的这个是lvd中断,等同于stm32中的lvd中断,这个中 ...

会不会掉电太快,写入时间不够
你把指示变量放在写入之后看看

myxiaonia 发表于 2019-8-27 11:58:00

whatcanitbe 发表于 2019-8-27 11:24
会不会掉电太快,写入时间不够
你把指示变量放在写入之后看看

我是模拟掉电的呀,把检测脚拉低,就生成中断了,如果谁手头有板子,测试一下就知道了

myxiaonia 发表于 2019-8-27 14:02:36

我再顶一顶

whatcanitbe 发表于 2019-8-27 16:04:37

本帖最后由 whatcanitbe 于 2019-8-27 16:07 编辑

你说通过一个变量判断进入中断
我的意识是你这个变量判断放到中断处理函数中保存数据的代码后面

而且你代码里面
//#define WRITE_INT
代码注释掉了,应该不会执行的

myxiaonia 发表于 2019-8-27 16:34:56

whatcanitbe 发表于 2019-8-27 16:04
你说通过一个变量判断进入中断
我的意识是你这个变量判断放到中断处理函数中保存数据的代码后面



这个测试程序,我特意为了重现这个问题做的,你可以通过串口打印内容看到:如果成功写入,只输出8个值,否则输出11个值

ldx24511 发表于 2019-8-27 16:41:43

掉电检测,我是先把lvd中断电压设高点,进入中断再把电压设低,就可写操作了

whatcanitbe 发表于 2019-8-27 17:04:56

本帖最后由 whatcanitbe 于 2019-8-27 17:07 编辑

myxiaonia 发表于 2019-8-27 16:34
这个测试程序,我特意为了重现这个问题做的,你可以通过串口打印内容看到:如果成功写入,只输出8个值, ...

//#define WRITE_INT


void COMPARE_IRQHandler(void) interrupt 21 using 1
{
    age_delay = 100;
    sys ++;
    #ifdef WRITE_INT
    write_pwd();
    #endif
    CMPCR1 = 0;
}


前面你把#define 注释掉了
所以你中断处理函数里面write_pwd是不执行的,并没有编译进去

不知道你测试的是不是就是这个工程?

sunnyplus 发表于 2019-8-27 18:03:43

掉电写flash是个神操作,你得保证足够长的掉电时间,否则很容易冲掉代码

su33691 发表于 2019-8-27 19:21:28

我用STC文档推荐的方法做掉电比较器中断写flash,1年多运行良好。
近期想用5V供电,加3.3V稳压跑STC8F。采用掉电比较器中断写flash。
因担心3.3V下STC8F芯片的稳定性,一直没有尝试。

myxiaonia 发表于 2019-8-27 19:34:09

whatcanitbe 发表于 2019-8-27 17:04
//#define WRITE_INT




这个开关,可以演示在主循环写flash和在中断里写flash,注释掉就是在主循环里写

myxiaonia 发表于 2019-8-27 19:35:08

sunnyplus 发表于 2019-8-27 18:03
掉电写flash是个神操作,你得保证足够长的掉电时间,否则很容易冲掉代码

是外部电源掉电检测,不是lvd低压中断

myxiaonia 发表于 2019-8-27 19:36:06

su33691 发表于 2019-8-27 19:21
我用STC文档推荐的方法做掉电比较器中断写flash,1年多运行良好。
近期想用5V供电,加3.3V稳压跑STC8F。采 ...

我也是用的那种办法,但是死活不能在中断里写成功,你是哪个系列s t c

weavr 发表于 2019-8-27 19:41:14

myxiaonia 发表于 2019-8-27 19:36
我也是用的那种办法,但是死活不能在中断里写成功,你是哪个系列s t c ...


比较不喜欢读别人的程序,累,直接改了一下楼主的程序,简单验证应该是没问题的,楼主可以对比验证一下。

su33691 发表于 2019-8-27 19:57:09

myxiaonia 发表于 2019-8-27 19:36
我也是用的那种办法,但是死活不能在中断里写成功,你是哪个系列s t c ...

我用STC8F2K32S2.

myxiaonia 发表于 2019-8-27 21:48:21

weavr 发表于 2019-8-27 19:41
比较不喜欢读别人的程序,累,直接改了一下楼主的程序,简单验证应该是没问题的,楼主可以对比验证一下 ...

我尝试了下你的例子,结果真能保存,但是两者没有本质不同啊,真是百思不得其解

modbus 发表于 2019-8-27 22:07:03

su33691 发表于 2019-8-27 19:21
我用STC文档推荐的方法做掉电比较器中断写flash,1年多运行良好。
近期想用5V供电,加3.3V稳压跑STC8F。采 ...

STC8F的内核也是工作在1.8伏,所以5伏3.3伏供电没区别,就是对IO口速度有影响

myxiaonia 发表于 2019-8-28 14:30:57

weavr 发表于 2019-8-27 19:41
比较不喜欢读别人的程序,累,直接改了一下楼主的程序,简单验证应该是没问题的,楼主可以对比验证一下 ...

谢谢你,终于找到了问题所在,是程序的问题,不是stc的问题

小李非刀 发表于 2019-8-28 22:26:57

再次强调:现在的KEIL C已经很智能,中断函数不要指定寄存器组,否则KEIL编译时反而不好处理局部变量,造成编译的结果有问题,但是KEIL不会提示有问题。

modbus 发表于 2019-8-28 23:27:57

小李非刀 发表于 2019-8-28 22:26
再次强调:现在的KEIL C已经很智能,中断函数不要指定寄存器组,否则KEIL编译时反而不好处理局部变量,造成 ...

现在KEIL C已经能够自动分配寄存器组了吗,而不是把所有用到的寄存器一个一个的压入堆栈

lcmdw 发表于 2020-3-21 12:34:27

标记一下,谢谢

lj0755 发表于 2020-3-21 16:15:55

了解一下

sunnyczp 发表于 2020-5-7 21:17:50

这个也是经验,留印一下!
页: [1]
查看完整版本: stc15w408as比较器中断里不能写flash