打印

请教STM8L的flash操作问题

[复制链接]
9995|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吗?

使用特权

评论回复
5
lou0908|  楼主 | 2011-6-20 17:53 | 只看该作者
是的啊

使用特权

评论回复
6
stm8l151f2| | 2011-6-20 18:10 | 只看该作者
本帖最后由 stm8l151f2 于 2011-6-20 18:12 编辑

#include "stm8l10x.h"
#include "periph_io.h"
#include "delay.h"

__root __no_init volatile uint8 flash_u8 @0x9000;

uint32 addr;

void main( void )
{  
      
    FLASH_WaitForLastOperation();
    FLASH_Unlock(FLASH_MemType_Program);  
   
    addr = (uint32_t)&flash_u8;  
   
    FLASH_ProgramByte(addr , 0xaa);  
    FLASH_WaitForLastOperation();
    if(flash_u8!=0xaa)
    {
        while(1);
    }
   
    asm("nop");     //设置断点
   
    FLASH_ProgramByte(addr , 0xbb);  
    FLASH_WaitForLastOperation();  
    if(flash_u8!=0xbb)
    {
        while(1);
    }
   
    asm("nop");  //设置断点

   
    FLASH_EraseByte(addr);   
    FLASH_WaitForLastOperation();
   
    if(flash_u8!=0x00)
    {
        while(1);
    }
   
    asm("nop");  //设置断点

      
    FLASH_Lock(FLASH_MemType_Program);      
   
    while(1);
   
}
可以写进去。
只是IAR调试显示的值不会(IAR可能认为FLASH的是不变的,没有刷新)。
你全速运行可以看到。

使用特权

评论回复
7
lou0908|  楼主 | 2011-6-21 08:55 | 只看该作者
果然是IAR的问题,多谢了

使用特权

评论回复
8
dadodo| | 2011-6-21 22:18 | 只看该作者
我查看IAR调试时的汇编代码窗口显示内容是会变的

使用特权

评论回复
9
jimmyspa110| | 2014-11-7 13:37 | 只看该作者
果然是IAR问题 完美解释 3q

使用特权

评论回复
10
lexiaoyao2012| | 2015-9-22 11:03 | 只看该作者
stm8l151f2 发表于 2011-6-20 18:10
可以写进去。
只是IAR调试显示的值不会(IAR可能认为FLASH的是不变的,没有刷新)。
你全速运行可以看到。 ...

试了挺好用的,希望能够后来学习IAP的提供帮助。希望学习stm8l的加群482808123讨论

使用特权

评论回复
11
玲玲灵灵2013| | 2015-9-29 11:54 | 只看该作者
哦哦,原来是IAR的问题,也就是说flash中写入数据,立刻读取,就能读取到吧?

使用特权

评论回复
12
linlulu| | 2015-11-2 11:14 | 只看该作者
多谢了!正好用到,解决了STM8L051Flash读写

使用特权

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

本版积分规则

30

主题

193

帖子

1

粉丝