10216|18

67

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM8S207K6字节写EEPROM时不能执行中断程序??? [复制链接]

我使用STM8S207K6,在向EEPROM中写入3字节数据,用时25ms,这期间竟然不能产生中断(我有定时器中断正好在这个期间内发生),通过仿真观察,core的中断级别是最低(I1 I0=10)。请指教,是怎么回事?
代码如下:(c compiler 是cosmic的4.2.8)
     //Delayms(50);
     //eeprom写入操作,用时25ms
     FLASH_Unlock(FLASH_MEMTYPE_DATA); //Unlock the eeprom.
     myShortAddress_eep.Val = addr.Val; //
     currentChannel_eep = currentChannel;
     FLASH_Lock(FLASH_MEMTYPE_DATA); //Lock the eeprom
定时器中断推后了20ms,在前面增加了50ms延时之后,定时器中断准时到来。
此帖出自stm32/stm8论坛

最新回复

                                 能在这里面把问题解决了,感觉肯定还是非常不错的,非常佩服工程师回答问题的专业性  详情 回复 发表于 2010-4-11 21:55
点赞 关注
 

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
怎么没有回复咧,是我说的不详细吗???
听说这里有ST的工程师?
此帖出自stm32/stm8论坛
 
 

回复

25

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
可能这个芯片不支持RWW。STM8S的参考手册中有如下说明:
STM8S_RWW.GIF

http://www.st.com/mcu/modules.php?name=mcu&file=familiesdocs&FAM=113
Reference Manual
此帖出自stm32/stm8论坛
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 


我用的STM8S207K6是支持RWW的,在ST的文档 PM0051 Programming manual 第22页中有明确的说明。(我不知道如何把相关的内容截图挂上来,不好意识)。通过仿真也能看到程序是在运行的。
LOW density stm8s 是不支持RWW的
Medium and high density stm8s 是支持RWW的。STM8S207K6是high density。
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
                                 注意到你说的问题,所以我在3楼说“可能”,正在与设计师求证,STM8S207K6是否支持RWW。
此帖出自stm32/stm8论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

6
 
楼主的用法有问题:

你的芯片具有RWW功能,但是你在写EEPROM的时候没有判断上一次操作是否完成就连续写入下一个字节,造成MCU被HOLD住而无法响应中断。

注意:在你写EEPROM前必须保证前一次写操作已经完成,否则就会出现中断不响应的情况。跟RWW功能无关。
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
楼上的解释听起来有道理,只是datasheet上没有任何相关的描述。
如果是这样,那就是cosmic的不对了,他设计相关扩展时应该在写EEPROM之前先进行检查。 现在我可麻烦了,我的EEPROM中很多数据是多字节的,采用直接赋值的方法无法进行EEPROM写入忙检查,还得自己来写EEPROM操作函数,太不和谐了!!!!
此帖出自stm32/stm8论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

8
 
用STM8S的硬件I2C,搞了两天,还是没搞好,
只好用IO口来模拟时序,一个上午就搞定了,如果作为主机,可以考虑用IO来模拟啊
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

9
 
                                 请问6楼,你的观点“在写EEPROM的时候没有判断上一次操作是否完成就连续写入下一个字节,造成MCU被HOLD住而无法响应中断”的依据在哪里可以找到?
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

10
 
通过Disassembly窗口观察,我发现在写入EEPROM的操作中已经有一个等待指令,我猜测这就是在等待写入操作完成。只是我对寻址到0x4859不明白,资料上找不到这个地址的相关信息,请高手指点。下面是相关的代码:
mywi.c:1014                        currentChannel_eep = currentChannel;
0xa5e8 <MyWiTasks+840>      0xC602B8        LD    A,0x02b8            LD    A,currentChannel
0xa5eb <MyWiTasks+843>      0xAE4020        LDW   X,#0x4020           LDW   X,#0x4020
0xa5ee <MyWiTasks+846>      0xCDFC27        CALL  0xfc27              CALL  c_eewrc
。。。。
0xfc27 <c_eewrc>              0xF7                    LD    (X),A            
0xfc28 <c_eewrc+1>          0x72044859FB    BTJT  0x4859,#2,0xfc28   
0xfc2d <c_eewrc+6>          0x81                    RET
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

11
 
                                 版主,我的问题还没有解决,6楼的兄弟提供的方法不能解决问题。帮忙想想办法,这里先谢过了。
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

12
 
                                 你使用的Cosmic版本是多少?
此帖出自stm32/stm8论坛
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

13
 
                                 你用的那个版本似乎有Bug,寄存器的地址定义有错误!下载最新的版本试试!
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

14
 
我使用的版本号是4.2.8,编译后的list文件头几行信息如下:
  1                     ; C Compiler for STM8 (COSMIC Software)
   2                     ; Generator V4.2.8 - 03 Dec 2008
   3                     ; Optimizer V4.2.8 - 03 Dec 2008
。。。。
还有更新的版本吗? 我找找。
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

15
 
                                 我也碰到过寄存器地址定义错误的,浪费我一天时间查问题,
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

16
 
通过Disassembly窗口观察,我发现在写入EEPROM的操作中已经有一个等待指令,我猜测这就是在等待写入操作完成。只是我对寻址到0x4859不明白,资料上找不到这个地址的相关信息,请高手指点。下面是相关的代码:
mywi.c ...
晕了,这个问题还没解决啊,不好意思,好久没来了。

其实你自己已经找到问题的答案了,你用的这个库是错误的。0x4859不是eop状态位字节啊,有可能就是明明没有写入完成,但是你以为已经写完了,又写了一个新的数据,MCU就被hold住了。关于出处,我去找找看哦。这个市老问题了,所以我强烈推荐写EEPROM时不要用库
此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

17
 
非常谢谢各位,这个问题已经解决了,觉得用“EEPROM”的C扩展还是很方便的,只是它的库写错了,不仅仅是变量的地址错了,连代码也有错。我修改了cosmic的这个库文件,然后重新编译连接,测试ok。下面是错误修改:
1、IAPSR的地址错了。
2、等待指令错了,原指令如下:
wai2:
btjt IAPSR,#EOP,wai2 ; wait for completion
修改后如下:
wai2:
btjf IAPSR,#EOP,wai2 ; wait for completion

更新过的库文件如下,替换掉cosmic的同名文件即可。
Srcstm8.rar (16.49 KB)
此帖出自stm32/stm8论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

18
 
_Bool IapWriteEepromByte(unsigned int addr,unsigned char dat)
{      
        unsigned char i=0;
        FLASH->CR1 = FIXPTime;
        FLASH->DUKR = KEY2;
        FLASH->DUKR = KEY1;
        while(!EepromUnlockOk)
        {
           ++i;
           if(i==0xff)goto out;
        };
        sim();
        *((FAR u8*) addr) =dat;
        rim();
        while(!ProgramOk);
        ClearProOkSign;
        return 1;
out:    LockEeprom;
        return 0;
}
此帖出自stm32/stm8论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

19
 
                                 能在这里面把问题解决了,感觉肯定还是非常不错的,非常佩服工程师回答问题的专业性
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved