STM32的FLASH写入:使用HAL库擦除几个page无法写入并且程序卡死

2019-07-14 18:25发布


大家好,我现在遇到FLASH写入的问题,我使用的是HAL库。
1、正常写入,整bank擦除,能够成功写入flash
2、写入后卡死,擦除几个page,无法写入,并且程序卡死

以下为卡死的代码:
/* Unlock the Flash to enable the flash control register access *************/
  HAL_FLASH_Unlock();

  /* Erase the user Flash area
    (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/

  /* Get the 1st page to erase */
  FirstPage = GetPage(ADDR_FLASH_PAGE_500);
  /* Get the number of pages to erase from 1st page */
  NbOfPages = GetPage(ADDR_FLASH_PAGE_501) - FirstPage + 1;
  /* Get the bank */
  BankNumber = GetBank(ADDR_FLASH_PAGE_500);
  /* Fill EraseInit structure*/
  EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
  EraseInitStruct.Banks       = BankNumber;
  EraseInitStruct.Page        = FirstPage;
  EraseInitStruct.NbPages     = NbOfPages;
        
        if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
  {
                printf("Erase error ");
  }
        else
        {
                //        printf("Erase OK ");
        }

--------------------------------------------------------------------------------------------------------
写入
                Address = ((uint32_t)ADDR_FLASH_PAGE_500);               
                status = FLASH_If_Write(Address, (uint32_t*) ramsource, 512 / 4);

-------------------------------------------------------------------------------------------------------
摘抄部分写入函数:卡死在这里
uint32_t FLASH_If_Write(uint32_t destination, uint32_t *p_source, uint32_t length)
{
  uint32_t status = FLASHIF_OK;
  uint32_t bank_to_erase, error = 0;
  uint32_t i = 0;
  uint32_t bank_active =0;
        uint8_t retry=0;
  FLASH_EraseInitTypeDef pEraseInit;
//----------------------------------卡死在这里----------------------这里就卡主了-----------------------程序无法运行下去
        if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, destination, *((uint64_t *)(p_source + 2*i))) == HAL_OK)
    {
                        printf("HAL_FLASH_Program HAL_OK ");
    }
--------------------------------------------------------------------------------------------------------------------------------------

请问下大家,为什么整个bank擦除能用,擦除几页就不能用?

        
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
yysdywerw
1楼-- · 2019-07-15 17:54
TOPCB 发表于 2018-8-23 13:10
如果擦除整个可以写,可以考虑一下写入的地址不再擦除页的范围之内。

你好,我擦除和写入的都是第500页。可以确定写入的flash已经擦除过了。
yysdywerw
2楼-- · 2019-07-15 21:40
bbslsk 发表于 2018-8-23 13:27
自己看下地址,是不是溢出了

你好,我现在测试的地址是第500页,我现在的STM32L476是由512页的。没有溢出
yysdywerw
3楼-- · 2019-07-16 00:31
vyewrewr 发表于 2018-8-23 13:44
可以在程序中把flash的Page固定死,一个一个的擦除,每擦除一个修改程序重新擦除,可以定位到擦除哪一个页出问题,然后看看这页是否溢出。

你好!我测试了擦除单页,并写入单页。同样的结果。擦除成功,但是写入时卡死。下面是测试结果:
---------------------------------------------------------------
FirstPage =  240
NbOfPages =  1
Erase OK, BankNumber = 1
destination = 0x8078000
source = 0x3020100
FLASH->SR = 0x0

后面本应该反馈flash_program成功或者失败,但是程序卡死,不往下运行了。
tianyou15
4楼-- · 2019-07-16 04:44
首先,写入的地址为什么是页地址?没看到在哪转换为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 ");
    }
苏州名之卓
5楼-- · 2019-07-16 06:26
 精彩回答 2  元偷偷看……

一周热门 更多>