野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20831|回复: 9

STM32读写内部flash

[复制链接]
发表于 2018-8-31 17:09:26 | 显示全部楼层 |阅读模式
1火花
STM32读写内部flash,以字写进去,以字节读出来,数据为什么会反过来,比如写进去的为0x33550069,读出来却为0x69005533,请问各位大佬这是怎么回事?

回复

使用道具 举报

发表于 2018-8-31 18:51:08 | 显示全部楼层
地址要算好,这是大小端的问题影响了
回复

使用道具 举报

 楼主| 发表于 2018-9-3 11:50:15 | 显示全部楼层
相津童 发表于 2018-8-31 18:51
地址要算好,这是大小端的问题影响了

请问这个问题怎么解决
回复

使用道具 举报

发表于 2018-9-4 14:50:39 | 显示全部楼层
怎么写的可以贴出来看看,用的库函数FLASH_PorgramWord吗?
回复

使用道具 举报

 楼主| 发表于 2018-9-4 15:29:59 | 显示全部楼层
八戒 发表于 2018-9-4 14:50
怎么写的可以贴出来看看,用的库函数FLASH_PorgramWord吗?

int InternalFlash_Write(uint32_t Address,uint32_t *Data,uint8_t length)
{

        uint32_t EraseCounter = 0x00;         //记录要擦除多少页
        uint32_t NbrOfPage = 0x00;                        //记录写入多少页
        uint8_t i=0;
        FLASH_Status FLASHStatus = FLASH_COMPLETE; //记录每次擦除的结果       
        TestStatus MemoryProgramStatus = PASSED;//记录整个测试结果
       

  /* 解锁 */
  FLASH_Unlock();

  /* 计算要擦除多少页 */
  NbrOfPage = (WRITE_END_ADDR - WRITE_START_ADDR) / FLASH_PAGE_SIZE;

  /* 清空所有标志位 */
  FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);       

  /* 按页擦除*/
  for(EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)
  {
    FLASHStatus = FLASH_ErasePage(WRITE_START_ADDR + (FLASH_PAGE_SIZE * EraseCounter));
  
        }
  
  /* 向内部FLASH写入数据 */
  //Address = WRITE_START_ADDR;

  while((Address < WRITE_END_ADDR) && (FLASHStatus == FLASH_COMPLETE))
  {
    FLASHStatus = FLASH_ProgramWord(Address,Data);
                i++;
    Address = Address + 4;
  }

  FLASH_Lock();
  
  /* 检查写入的数据是否正确 */
        i=0;
  while((Address < WRITE_END_ADDR) && (MemoryProgramStatus != FAILED))
  {
    if((*(__IO uint32_t*) Address) != Data)
    {
      MemoryProgramStatus = FAILED;
    }
                i++;
    Address += 4;
  }
        return MemoryProgramStatus;
}

void InternalFlash_Read(uint32_t addr,uint8_t *p,uint16_t Byte_Num)
{
        uint8_t i=0;
        TestStatus MemoryProgramStatus = PASSED;//记录整个测试结果
        while((addr < WRITE_END_ADDR) && (MemoryProgramStatus != FAILED))
  {
    p=(*(__IO uint8_t*) addr);
                i++;
    addr++;
  }
}
这是读写代码,请帮忙看看错在哪里
回复

使用道具 举报

发表于 2018-9-4 17:06:48 | 显示全部楼层
你好 有两个地方不明白,问一下
1、
int InternalFlash_Write(uint32_t Address,uint32_t *Data,uint8_t length)函数中,参数uint32_t *Data是个指针,
  调用时库函数 FLASH_ProgramWord(Address,Data); Data参数是个uint32_t的变量,不是一个指针。这儿是要把这个Data指针地址写进内部flash吗?
2、
void InternalFlash_Read(uint32_t addr,uint8_t *p,uint16_t Byte_Num)函数中,参数uint8_t *p是个指针
调用时 p=(*(__IO uint8_t*) addr); 这儿应该无法正常编译吧?
回复

使用道具 举报

 楼主| 发表于 2018-9-7 15:47:43 | 显示全部楼层
八戒 发表于 2018-9-4 17:06
你好 有两个地方不明白,问一下
1、
int InternalFlash_Write(uint32_t Address,uint32_t *Data,uint8_t  ...

int InternalFlash_Write(uint32_t Address,uint32_t *Data,uint8_t length)
{

        uint32_t EraseCounter = 0x00;         //记录要擦除多少页
        uint32_t NbrOfPage = 0x00;                        //记录写入多少页
        uint8_t i=0;
        FLASH_Status FLASHStatus = FLASH_COMPLETE; //记录每次擦除的结果       
        TestStatus MemoryProgramStatus = PASSED;//记录整个测试结果
       

  /* 解锁 */
  FLASH_Unlock();

  /* 计算要擦除多少页 */
  NbrOfPage = (WRITE_END_ADDR - WRITE_START_ADDR) / FLASH_PAGE_SIZE;

  /* 清空所有标志位 */
  FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);       

  /* 按页擦除*/
  for(EraseCounter = 0; (EraseCounter < NbrOfPage) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++)
  {
    FLASHStatus = FLASH_ErasePage(WRITE_START_ADDR + (FLASH_PAGE_SIZE * EraseCounter));
  
        }
  
  /* 向内部FLASH写入数据 */
  //Address = WRITE_START_ADDR;

  while((Address < WRITE_END_ADDR) && (FLASHStatus == FLASH_COMPLETE))
  {
    FLASHStatus = FLASH_ProgramWord(Address,Data);
                i++;
    Address = Address + 4;
  }

  FLASH_Lock();
  
  /* 检查写入的数据是否正确 */
        i=0;
  while((Address < WRITE_END_ADDR) && (MemoryProgramStatus != FAILED))
  {
    if((*(__IO uint32_t*) Address) != Data)
    {
      MemoryProgramStatus = FAILED;
    }
                i++;
    Address += 4;
  }
        return MemoryProgramStatus;
}

void InternalFlash_Read(uint32_t addr,uint8_t *p,uint16_t Byte_Num)
{
        uint8_t i=0;
        TestStatus MemoryProgramStatus = PASSED;//记录整个测试结果
        while((addr < WRITE_END_ADDR) && (MemoryProgramStatus != FAILED))
  {
    p=(*(__IO uint8_t*) addr);
                i++;
    addr++;
  }
}
不知道是否粘贴错误,这是我又在程序上复制了一份,你说的那两个问题不存在
回复

使用道具 举报

 楼主| 发表于 2018-9-7 15:49:20 | 显示全部楼层
八戒 发表于 2018-9-4 17:06
你好 有两个地方不明白,问一下
1、
int InternalFlash_Write(uint32_t Address,uint32_t *Data,uint8_t  ...

我知道你为什么会发现这两个问题了,我从程序上粘贴过来时网页不知道为什么将给漏掉了
回复

使用道具 举报

 楼主| 发表于 2018-9-7 15:49:54 | 显示全部楼层
八戒 发表于 2018-9-4 17:06
你好 有两个地方不明白,问一下
1、
int InternalFlash_Write(uint32_t Address,uint32_t *Data,uint8_t  ...

【i】网页不显示
回复

使用道具 举报

发表于 2018-9-10 16:15:36 | 显示全部楼层
因为你是按照字写入flash的,arm是小端存储。
4字节的0x33550069, 0x69字节在flash低地址,0x33字节在flash高地址,
按照字节读取的时候,是先读低地址,就变成了 0x69 0x00 0x55 0x33;
回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 22:46 , Processed in 0.039943 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表