请教STM8L的flash操作问题

[复制链接]
11350|11
 楼主| lou0908 发表于 2011-6-20 17:16 | 显示全部楼层 |阅读模式
大家好,我最近在做STM8L的自升级程序,在操作flash中遇到很多问题。
例如程序1:
void main(void)
{
    uint32_t add = 0;
    FLASH_SetProgrammingTime(FLASH_ProgramMode_Standard);
    FLASH_Unlock(FLASH_MemType_Program);
    add = 0x9000;
    FLASH_ProgramByte(add , 0x99);
    FLASH_EraseByte(add);
//    FLASH_ProgramByte(add , 0x32);
    while (1);
}
我的本意是想在0x9000的地方写入一个数据0x99,程序执行确实在0x9000的地方写入0x99了。但是再清空,问题出现了,我调用FLASH_EraseByte(add);,该条指令调用后,根本没有执行擦除命令,对应的0x9000空间中还是0x99.根本没有对这个空间进行清空。
如果我想再在0x9000的地方重新写入一个数据0x32,程序如下
void main(void)
{
    uint32_t add = 0;
    FLASH_SetProgrammingTime(FLASH_ProgramMode_Standard);
    FLASH_Unlock(FLASH_MemType_Program);
    add = 0x9000;
    FLASH_ProgramByte(add , 0x99);
    FLASH_EraseByte(add);
    FLASH_ProgramByte(add , 0x32);
    while (1);
}
运行结果连0x99这个数据都无法写入到0x9000这个地址空间,请教一下大家,这个到底是什么原因????
stm8l151f2 发表于 2011-6-20 17:18 | 显示全部楼层
本帖最后由 stm8l151f2 于 2011-6-20 17:24 编辑

void main(void)  
{  
    uint32_t add = 0;  
    FLASH_SetProgrammingTime(FLASH_ProgramMode_Standard);  
    FLASH_Unlock(FLASH_MemType_Program);  

    add = 0x9000;  

    FLASH_ProgramByte(add , 0x99);  
    FLASH_WaitForLastOperation(FLASH_MemType_Program);  

    //不需要擦除,就可以再写,
    //FLASH_EraseByte(add);    //多余的
    //FLASH_WaitForLastOperation(FLASH_MemType_Program);  

    FLASH_ProgramByte(add , 0x32);  
    FLASH_WaitForLastOperation(FLASH_MemType_Program);  

   FLASH_Lock(FLASH_MemType_Program);  

    while (1);  
}  


中间要等待FLASH操作完成。
还有,FLASH不需要擦除,就可以再写。
FLASH_EraseByte(add); 是多余的。
 楼主| lou0908 发表于 2011-6-20 17:31 | 显示全部楼层
上官兄,按你的修改还是不行,是不是其他问题
程序如下:
void main(void)
{
    uint32_t add = 0;
    FLASH_SetProgrammingTime(FLASH_ProgramMode_Standard);
    FLASH_Unlock(FLASH_MemType_Program);
    add = 0x9000;
    FLASH_ProgramByte(add , 0x99);
    //    FLASH_EraseByte(add);
    FLASH_WaitForLastOperation();  
    FLASH_ProgramByte(add , 0x32);
    FLASH_WaitForLastOperation();  
   
    while (1);
}
stm8l151f2 发表于 2011-6-20 17:49 | 显示全部楼层
用的STM8L101吗?
 楼主| lou0908 发表于 2011-6-20 17:53 | 显示全部楼层
是的啊
stm8l151f2 发表于 2011-6-20 18:10 | 显示全部楼层
本帖最后由 stm8l151f2 于 2011-6-20 18:12 编辑

  1. #include "stm8l10x.h"
  2. #include "periph_io.h"
  3. #include "delay.h"

  4. __root __no_init volatile uint8 flash_u8 @0x9000;

  5. uint32 addr;

  6. void main( void )
  7. {  
  8.       
  9.     FLASH_WaitForLastOperation();
  10.     FLASH_Unlock(FLASH_MemType_Program);  
  11.    
  12.     addr = (uint32_t)&flash_u8;  
  13.    
  14.     FLASH_ProgramByte(addr , 0xaa);  
  15.     FLASH_WaitForLastOperation();
  16.     if(flash_u8!=0xaa)
  17.     {
  18.         while(1);
  19.     }
  20.    
  21.     asm("nop");     //设置断点
  22.    
  23.     FLASH_ProgramByte(addr , 0xbb);  
  24.     FLASH_WaitForLastOperation();  
  25.     if(flash_u8!=0xbb)
  26.     {
  27.         while(1);
  28.     }
  29.    
  30.     asm("nop");  //设置断点

  31.    
  32.     FLASH_EraseByte(addr);   
  33.     FLASH_WaitForLastOperation();
  34.    
  35.     if(flash_u8!=0x00)
  36.     {
  37.         while(1);
  38.     }
  39.    
  40.     asm("nop");  //设置断点

  41.       
  42.     FLASH_Lock(FLASH_MemType_Program);      
  43.    
  44.     while(1);
  45.    
  46. }
可以写进去。
只是IAR调试显示的值不会(IAR可能认为FLASH的是不变的,没有刷新)。
你全速运行可以看到。
 楼主| lou0908 发表于 2011-6-21 08:55 | 显示全部楼层
果然是IAR的问题,多谢了
dadodo 发表于 2011-6-21 22:18 | 显示全部楼层
我查看IAR调试时的汇编代码窗口显示内容是会变的
jimmyspa110 发表于 2014-11-7 13:37 | 显示全部楼层
果然是IAR问题 完美解释 3q
lexiaoyao2012 发表于 2015-9-22 11:03 | 显示全部楼层
stm8l151f2 发表于 2011-6-20 18:10
可以写进去。
只是IAR调试显示的值不会(IAR可能认为FLASH的是不变的,没有刷新)。
你全速运行可以看到。 ...

试了挺好用的,希望能够后来学习IAP的提供帮助。希望学习stm8l的加群482808123讨论
玲玲灵灵2013 发表于 2015-9-29 11:54 | 显示全部楼层
哦哦,原来是IAR的问题,也就是说flash中写入数据,立刻读取,就能读取到吧?
linlulu 发表于 2015-11-2 11:14 | 显示全部楼层
多谢了!正好用到,解决了STM8L051Flash读写
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

193

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部