打印
[其他ST产品]

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

[复制链接]
1629|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
elephant00|  楼主 | 2024-7-28 14:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,我现在遇到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 errorrn");
  }
        else
        {
                //        printf("Erase OKrn");
        }

--------------------------------------------------------------------------------------------------------
写入
                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 rn");
    }
--------------------------------------------------------------------------------------------------------------------------------------

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

使用特权

评论回复
沙发
jcky001| | 2024-7-28 15:02 | 只看该作者
在写入或擦除之前调用 HAL_FLASH_Unlock()。
在操作完成后调用 HAL_FLASH_Lock()。

使用特权

评论回复
板凳
cr315| | 2024-7-28 15:02 | 只看该作者
使用调试器逐步执行代码,观察在哪一步出现了问题。

使用特权

评论回复
地板
laocuo1142| | 2024-7-28 15:03 | 只看该作者
更新HAL库至最新版本

使用特权

评论回复
5
flycamelaaa| | 2024-7-28 15:04 | 只看该作者
硬件检查以排除硬件故障

使用特权

评论回复
6
两只袜子| | 2024-7-28 20:00 | 只看该作者
检查页地址和大小与你的STM32型号是否相匹配

使用特权

评论回复
7
yutingwei| | 2024-7-29 00:16 | 只看该作者
在STM32的FLASH操作中,常见的步骤包括解锁FLASH、擦除页、编程数据,然后锁定FLASH。你已经展示了这些步骤,但我们可以详细检查一些潜在的问题。

使用特权

评论回复
8
yutingwei| | 2024-7-29 00:19 | 只看该作者
在擦除多个页时,确保页地址计算和传递的地址是正确的。GetPage函数应该能够准确返回页的编号,确保不会超出有效范围。

使用特权

评论回复
9
xionghaoyun| | 2024-7-29 08:42 | 只看该作者
用例程?中断关了没

使用特权

评论回复
10
丙丁先生| | 2024-7-29 13:03 | 只看该作者
从你提供的代码和描述来看,问题可能出在擦除和写入的过程中。整个bank擦除能够成功,但是擦除几个page时程序卡死,这可能是因为擦除page的操作没有正确完成,导致后续的写入操作无法进行。

首先,我们需要确保擦除操作是否正确完成。在你的代码中,你使用了`HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError)`函数来擦除指定的page,但是这个函数的返回值并没有被正确检查。如果擦除操作失败,`HAL_FLASHEx_Erase`函数会返回一个错误代码,而不是`HAL_OK`。因此,你需要检查`HAL_FLASHEx_Erase`的返回值,如果返回值不是`HAL_OK`,那么你需要处理这个错误,而不是继续进行后续的写入操作。

其次,你在写入操作中使用了`HAL_FLASH_Program`函数,这个函数的返回值也没有被正确检查。如果写入操作失败,`HAL_FLASH_Program`函数会返回一个错误代码,而不是`HAL_OK`。因此,你需要检查`HAL_FLASH_Program`的返回值,如果返回值不是`HAL_OK`,那么你需要处理这个错误,而不是继续进行后续的操作。

最后,你需要确保你的擦除和写入操作是在正确的地址上进行的。在你的代码中,你使用了`GetPage`函数来获取要擦除的page的地址,但是你没有提供`GetPage`函数的实现,因此我无法确定这个函数是否正确工作。你需要确保`GetPage`函数返回的是正确

使用特权

评论回复
11
linqing171| | 2024-7-29 21:13 | 只看该作者
丙丁先生 发表于 2024-7-29 13:03
从你提供的代码和描述来看,问题可能出在擦除和写入的过程中。整个bank擦除能够成功,但是擦除几个page时程 ...

chatGPT回复的吗?三个都非常到位啊,问题应该就是出在最后一点上。

使用特权

评论回复
12
申小林一号| | 2024-7-29 22:36 | 只看该作者
感谢分享

使用特权

评论回复
13
喂什么玩意| | 2024-7-31 11:42 | 只看该作者
擦除设置

确保FLASH_EraseInitTypeDef结构体中的设置是正确的。例如:

c
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.Banks = BankNumber;
EraseInitStruct.Page = FirstPage;
EraseInitStruct.NbPages = NbOfPages;



这里的TypeErase设置为FLASH_TYPEERASE_PAGES是正确的,Banks应当设置为要擦除的银行,Page和NbPages应当设置为正确的页范围。

使用特权

评论回复
14
AdaMaYun| | 2024-7-31 14:20 | 只看该作者
写入时应考虑到STM32的FLASH编程操作需要按照特定的地址对齐要求。

使用特权

评论回复
15
为你转身| | 2024-8-31 13:45 | 只看该作者
在进行任何 FLASH 操作之前,必须确保 FLASH 解锁。你已经在代码中解锁了 FLASH,但请确保 HAL_FLASH_Unlock() 函数执行成功,并且在执行写入和擦除操作时没有被锁定。

使用特权

评论回复
16
t60yz| | 2024-8-31 22:15 | 只看该作者
FLASH 操作时必须确保地址对齐、页擦除和编程操作的顺序。确保擦除和编程的地址范围是正确的,并且在写入时,目标地址已经被擦除。

使用特权

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

本版积分规则

970

主题

2980

帖子

7

粉丝