打印
[STM8]

求证stm8s105s4写内部EEPROM判断结束标志HVOFF是不是存在BUG

[复制链接]
6394|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
szguoguo|  楼主 | 2011-11-23 14:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
测试STM8S105S4写内部EEPROM,在主循环中对地址0X4000~0X40FF写数据0~255,每个循环判断上一个循环写EEPROM结束后向一个递增的地址写一个递增的数据。判断写EEPROM结束标志位HVOFF位置1。初始化时已经初始化了一个1ms定时器和串口接收中断,在定时器中断中翻转led,在串口接收中断中把接收到的数据马上发出去。测试发现写EEPROM时,串口丢数据或者定时器延时3ms多翻转led灯。

FLASH_IAPSR.JPG (48.08 KB )

FLASH_IAPSR.JPG
沙发
szguoguo|  楼主 | 2011-11-23 14:33 | 只看该作者
上程序
if ((FLASH->IAPSR & (uint8_t)0x40) == FLASH_FLAG_HVOFF)
{
      *(PointerAttr uint8_t*) (uint16_t)datamemaddr = datamemdata;
     datamemaddr++;
     datamemdata++;               
}
这样判断结束标志就会出现写eeprom数据堵塞。
改为这样
if ((FLASH->IAPSR & (uint8_t)0x60) == FLASH_FLAG_HVOFF)
{
      *(PointerAttr uint8_t*) (uint16_t)datamemaddr = datamemdata;
     datamemaddr++;
     datamemdata++;               
}
就正常,写eeprom数据时不影响延时中断和串口接收中断。

使用特权

评论回复
板凳
szguoguo|  楼主 | 2011-11-23 14:39 | 只看该作者
测试时发现FLASH_IAPSR的bit5被硬件改为1,而数据手册明明写道Bits 5:4 Reserved, forced by hardware to 0.,这样导致判断写EEPROM结束标志位FLASH_IAPSR【bit6,bit5】变为【1,0】才为真正的写EEPROM结束。

在勘误表上没有看到相关描述,如果我的测试程序没问题的话,要么是我测试的芯片有问题,要么是真的存在这样的bug,有没有谁遇到过或能重复这样的问题?

使用特权

评论回复
地板
秋天落叶| | 2011-11-23 18:22 | 只看该作者
没遇到过,香主给解释一下

使用特权

评论回复
5
szguoguo|  楼主 | 2011-11-30 16:40 | 只看该作者
今天搭了一个stm8s207c8的板测了一下,现象一样,用iar和stvd测试现象一样,有谁遇到和我一样的问题吗?

使用特权

评论回复
6
香水城| | 2011-11-30 17:00 | 只看该作者
ST提供的例程里是怎么操作的?

使用特权

评论回复
7
szguoguo|  楼主 | 2011-11-30 17:07 | 只看该作者
例程:FLASH_DataProgram中是这么写的
是块操作,我的是字节写
/* This function is executed from RAM */
  FLASH_ProgramBlock(BLOCK_OPERATION, FLASH_MEMTYPE_DATA, FLASH_PROGRAMMODE_STANDARD, GBuffer);
  
  /* Wait until End of high voltage flag is set*/
  while (FLASH_GetFlagStatus(FLASH_FLAG_HVOFF) == RESET)
  {}

使用特权

评论回复
8
szguoguo|  楼主 | 2011-11-30 17:08 | 只看该作者
FlagStatus FLASH_GetFlagStatus(FLASH_Flag_TypeDef FLASH_FLAG)
{
    FlagStatus status = RESET;
    /* Check parameters */
    assert_param(IS_FLASH_FLAGS_OK(FLASH_FLAG));

    /* Check the status of the specified FLASH flag */
    if ((FLASH->IAPSR & (uint8_t)FLASH_FLAG) != (uint8_t)RESET)
    {
        status = SET; /* FLASH_FLAG is set */
    }
    else
    {
        status = RESET; /* FLASH_FLAG is reset*/
    }

    /* Return the FLASH_FLAG status */
    return status;
}

使用特权

评论回复
9
香水城| | 2011-11-30 17:23 | 只看该作者
2楼程序段的前后还有什么?

使用特权

评论回复
10
szguoguo|  楼主 | 2011-11-30 17:32 | 只看该作者
uint32_t datamemadd = 0x4000;
uint32_t datamemdata = 0;
uint8_t datamemrdata = 0;
uint8_t datamemnum = 0;

void main(void)
{
  /* Clock configuration -----------------------------------------*/
  CLK_Config();  

  /* GPIO configuration -----------------------------------------*/
  GPIO_Config();  
  
  /* UART3 configuration -----------------------------------------*/
  UART3_Config();  

/* Define FLASH programming time */
  FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);
  /* Unlock Data memory */
  FLASH_Unlock(FLASH_MEMTYPE_DATA);       
  datamemadd = 0x4000;
  datamemrdata = 0;
  datamemnum = 0;
   while (1)
  {   
      /* Read a byte at a specified address */
     if(datamemadd>=0x4100)
    {
        datamemadd = 0x4000;       
        datamemnum++;
        datamemdata = 20+datamemnum;
        /* lock Data memory */
       //FLASH_Lock(FLASH_MEMTYPE_DATA);
      
    }
    else
   {
       if ((FLASH->IAPSR & (uint8_t)0x40) == 0x40)
     {
             //FLASH_ProgramByte(datamemadd, datamemdata);                             
            *(PointerAttr uint8_t*) (uint16_t)datamemadd = datamemdata;                               
            datamemadd++;
            datamemdata++;               
       }
    }       
  }
}

使用特权

评论回复
11
szguoguo|  楼主 | 2011-11-30 17:36 | 只看该作者
typedef enum {
    FLASH_PROGRAMTIME_STANDARD = (uint8_t)0x00, /*!< Standard programming time fixed at 1/2 tprog */
    FLASH_PROGRAMTIME_TPROG    = (uint8_t)0x01  /*!< Programming time fixed at tprog */
} FLASH_ProgramTime_TypeDef;

这两个都测了

使用特权

评论回复
12
香水城| | 2011-11-30 17:53 | 只看该作者
以下是我们的专家给出的回答:

1.        STM8S105 has no RWW function. So programming data in eeprom will halt the MCU
2.        Customer should use the EOP bit to judge the STM8 EEPROM programming end instead of HV OFF. HV OFF means MCU go back to normal status from halt status.
3.        Reserve bit is not for customer use. It is reserved for future or internal usage.

使用特权

评论回复
13
秋天落叶| | 2011-11-30 18:06 | 只看该作者
外国专家?

使用特权

评论回复
14
today_lucky| | 2012-4-6 14:13 | 只看该作者
MARK!很好!有用

使用特权

评论回复
15
TECHWELL| | 2014-5-14 12:21 | 只看该作者
本帖最后由 TECHWELL 于 2014-5-14 13:37 编辑

   我用STM8S105K4,也遇到了写EEPROM时程序halt之问题
   在ST官网上的、最新的文档CD00200092.PDF(STM8S105xx之datasheet,February 2014 DocID14771 Rev 13)中,明明白白地吹:
4.3 Flash program and data EEPROM memory
• Up to 32 Kbytes of Flash program single voltage Flash memory
• Up to 1 Kbytes true data EEPROM
Read while write: Writing in data memory possible while executing code in program memory
• User option byte area
   这儿的专家,却说没这个RWW功能了。
   我应该相信专家?
   还是该相信官方文档??
  我可以骂娘吗???

  香水城,能加我QQ么?
  396936661



使用特权

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

本版积分规则

7

主题

47

帖子

2

粉丝