PaulRambo 发表于 2018-3-6 19:57:48

本帖最后由 PaulRambo 于 2018-3-6 19:58 编辑

Angel_YY 发表于 2018-3-6 17:10
可以在程序中把flash的Page固定死,一个一个的擦除,每擦除一个修改程序重新擦除,可以定位到擦除哪一个页 ...
你好!我测试了擦除单页,并写入单页。同样的结果。擦除成功,但是写入时卡死。下面是测试结果:
---------------------------------------------------------------
FirstPage =240
NbOfPages =1
Erase OK, BankNumber = 1
destination = 0x8078000
source = 0x3020100
FLASH->SR = 0x0

后面本应该反馈flash_program成功或者失败,但是程序卡死,不往下运行了。

dsjsjf 发表于 2018-3-21 11:26:53

首先,写入的地址为什么是页地址?没看到在哪转换为Flash地址啊
Address = ((uint32_t)ADDR_FLASH_PAGE_500);               
status = FLASH_If_Write(Address, (uint32_t*) ramsource, 512 / 4);
其次,你要写入的是一串数据,但没看到你调用for循环之类的
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, destination, *((uint64_t *)(p_source + 2*i))) == HAL_OK)
    {
                        printf("HAL_FLASH_Program HAL_OK \r\n");
    }

zhao.zhao 发表于 2018-3-21 11:44:10

擦除之前要解锁,写完以后要加锁

    // 擦除该页面
    HAL_FLASH_Unlock();// 解锁
    /* Fill EraseInit structure*/
    EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
    EraseInitStruct.PageAddress = page_start_addr;
    EraseInitStruct.NbPages   = 1;
    PageError = 0;
    if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
    {
      retvalue = HAL_ERROR;      // 页面擦除失败 ,退出
    }
    else
    {   // 页面擦除成功,写入该页面的数据   
      retvalue = HAL_OK;
      addrbuf= page_start_addr;
      for(i=0;i<FLASH_PAGE_SIZE_IN_WORD;i++)          // 一个页面按字节算为64个单元
      {
            if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addrbuf, DataBuf) == HAL_OK)
            {
                addrbuf += 4;
            }
            else
            {
                retvalue = HAL_ERROR;
                i         = FLASH_PAGE_SIZE_IN_WORD;
            }
      }
    }

    HAL_FLASH_Lock();

returnretvalue;
页: 1 [2]
查看完整版本: STM32的FLASH写入问题