打印

stm32内部读写flash,为什么读写会不一样呢,

[复制链接]
17961|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lovegoogle|  楼主 | 2012-7-23 13:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//
#define FLASHINT_ADDR        ((uint32_t)0x08010000)        //在60k的位置开始写配置数据
#define FLASHINT_PAGE_COUNT  (1)

int FlashInt_Write(uint32_t iAddress, uint8_t *buf, uint32_t iNbrToWrite)
{
        uint32_t i;
        uint16_t Data;
        FLASH_Status FLASHStatus = FLASH_ERROR_WRP;
        uint32_t EraseCounter = 0x00, Address = 0x00;

        FLASH_UnlockBank1();
        FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);

        for(EraseCounter = 0; (EraseCounter < FLASHINT_PAGE_COUNT) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)
        {
            FLASHStatus = FLASH_ErasePage(FLASHINT_ADDR + (FLASH_PAGE_SIZE * EraseCounter));
        }
        Address = iAddress + FLASHINT_ADDR;

        for(i = 0;i<iNbrToWrite;)
        {
            if(i==(iNbrToWrite-1)) //最后1个字节
            {
                Data = *(buf+i) << 8;//奇数的时候,补零
            }
            else
            {
                Data = (*(buf+i)) << 8 + (*(buf+i+1));
            }
           // Data= (i << 8) + (i+1);
            FLASH_ProgramHalfWord(Address,Data);
            i+=2;
            Address += 2;
        }
        FLASH_LockBank1();
        return iNbrToWrite;
}

int FlashInt_Read(uint32_t iAddress, uint8_t *buf, int32_t iNbrToRead)
{
        int i = 0;
        uint32_t Address = 0x00;
        Address = (iAddress + FLASHINT_ADDR);
        while(i < iNbrToRead ) {
           *(buf + i) = *(__IO uint8_t*) Address++;
           i++;
        }

        return i;
}


一直没对过,奇怪的,这个是hsi有没有什么关系?RCC_HSICmd(ENABLE);
沙发
figo20042005| | 2012-7-23 14:45 | 只看该作者
你去找下例程试试,可以看看这个链接,有这方面的程序 http://blog.csdn.net/ws84643557/article/details/7391642

使用特权

评论回复
板凳
lovegoogle|  楼主 | 2012-7-23 15:02 | 只看该作者
2# figo20042005
呵呵,就是从这个例子上改过来的,调试了2天了,

使用特权

评论回复
地板
figo20042005| | 2012-7-23 15:44 | 只看该作者
你看会不会是你的地址上有问题

使用特权

评论回复
5
lovegoogle|  楼主 | 2012-7-23 17:13 | 只看该作者
是STM32f103vct6,256M的flash,本意是64k后放配置数据,
64*1024=0x10000;一页是0x800,也就是在20也上放配置数据,
配置数据也很小,也就0x12个,没有超过一页大小,
奇怪的,读出来全是0x00,

下午干脆把所有的中断全部关闭,还是老样子,

麻烦了!

使用特权

评论回复
6
lovegoogle|  楼主 | 2012-7-23 17:57 | 只看该作者
Flash_ProgramHalfWord的时候,一直返回Flash_ERROR_PG错误,这个是为什么?
是和仿真器有关系吗?
怎么才能够写数据呢?

使用特权

评论回复
7
lovegoogle|  楼主 | 2012-7-23 21:37 | 只看该作者
勒,悲剧了,从网上抄了段代码:
      FLASH_Unlock();
     FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);//清标志位
   
    unsigned int WRPR_Value = FLASH_GetWriteProtectionOptionByte();
    unsigned int ProtectedPages = WRPR_Value & (FLASH_WRProt_Pages0to1 | FLASH_WRProt_Pages2to3 | FLASH_WRProt_Pages4to5 | FLASH_WRProt_Pages6to7);
  
  // pages are not write protected
  if(ProtectedPages != 0x00)
  {
    // erase option bytes (must do this before writing option bytes)
    FLASH_EraseOptionBytes();   

    // read protection needs to happen before write protection, since this
    // function erases all option bytes
    FLASH_ReadOutProtection(ENABLE);

    // program user option bytes
    FLASH_UserOptionByteConfig(OB_IWDG_SW, OB_STOP_NoRST, OB_STDBY_NoRST);

    // protect bootloader FLASH area
    FLASH_EnableWriteProtection(FLASH_WRProt_Pages0to1 | FLASH_WRProt_Pages2to3 | FLASH_WRProt_Pages4to5 | FLASH_WRProt_Pages6to7);
   
    // generate System Reset to load the new option byte values
    NVIC_SystemReset();
  }
  
    烧写到flash中后,直接进入硬件错误,然后重新烧写程序,就出现了:
error:flash download failed - cortex-m3
再也无法download 到flash上,【在jlink中设置烧写地址也没有用】

郁闷,明天准备换个片子,


哪位大哥解决过这个问题的啊,俺崩溃了:'(

使用特权

评论回复
8
lovegoogle|  楼主 | 2012-7-24 08:18 | 只看该作者
顶一下,

使用特权

评论回复
9
837175840| | 2012-12-16 16:20 | 只看该作者
我用的差不多的例子,奇怪的是软仿不成功,总是写进去后,读出总是0;但程序实际真正下到板子里时,串口又是的确可以读出数据的。所以可能还是软仿的问题。
题外话:在应用过程中,软件仿真还有一个问题是107好像不能软仿

使用特权

评论回复
10
jettlau| | 2013-1-6 09:03 | 只看该作者
lovegoogle 发表于 2012-7-24 08:18
顶一下,

stm32内部读写flash,为什么读写会不一样呢,问题解决了吗?

使用特权

评论回复
11
hotloo| | 2013-3-21 17:53 | 只看该作者
本帖最后由 hotloo 于 2013-3-21 17:56 编辑

7楼不必换片子,可以把程序烧到ram中,去除flash的写保护,这个是我做好的工程,通过测试,可以解决问题cmeee.com/index.php/forum/stm32/14-stm32-flash

使用特权

评论回复
12
a20060341039| | 2013-8-28 17:55 | 只看该作者
正在学习中

使用特权

评论回复
13
puchuang| | 2013-8-28 19:13 | 只看该作者
这个问题  就比较头大了   楼主   比较烦人  需要花时间好好看看了   楼主

使用特权

评论回复
14
minzhiman| | 2013-12-26 20:47 | 只看该作者
有钱人呀,32位里面放8位数据

使用特权

评论回复
15
tianli1980| | 2014-1-6 17:12 | 只看该作者
跟贴学习!问下朋友们存入FLASH中的值如何取出来呢?

使用特权

评论回复
16
yu3226609| | 2014-3-19 16:07 | 只看该作者
你好,stm32 flash读写问题怎么解决的,我也遇到了,flash写不进去,谢谢你了

使用特权

评论回复
17
diweo| | 2014-3-19 20:23 | 只看该作者
tianli1980 发表于 2014-1-6 17:12
跟贴学习!问下朋友们存入FLASH中的值如何取出来呢?

直接用32位地址读出来就行。例如
uint32_t FLASH_Read_Word(uint32_t address)
{
        return (*(__IO uint32_t*) address);
}

使用特权

评论回复
18
diweo| | 2014-3-19 20:24 | 只看该作者
yu3226609 发表于 2014-3-19 16:07
你好,stm32 flash读写问题怎么解决的,我也遇到了,flash写不进去,谢谢你了

看函数库里面带的例程,很容易移植的。

使用特权

评论回复
19
爱不孤单| | 2014-8-26 17:04 | 只看该作者
hotloo 发表于 2013-3-21 17:53
7楼不必换片子,可以把程序烧到ram中,去除flash的写保护,这个是我做好的工程,通过测试,可以解决问题cme ...

大哥,你的例子链接中怎么找不到你的程序啊,能把链接重新发一遍吗?

使用特权

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

本版积分规则

5

主题

19

帖子

0

粉丝