STM32的FLASH写入问题
本帖最后由 PaulRambo 于 2018-3-6 16:57 编辑大家好,我现在遇到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\r\n");
}
else
{
// printf("Erase OK\r\n");
}
--------------------------------------------------------------------------------------------------------
写入
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 \r\n");
}
--------------------------------------------------------------------------------------------------------------------------------------
请问下大家,为什么整个bank擦除能用,擦除几页就不能用?
楼主,你写flash时,是不是没设临界段啊?这样也会造成卡死。 还有一个可能就是FLASH擦除期间,必须禁止数据fetch。请楼主自查程序 如果擦除整个可以写,可以考虑一下写入的地址不再擦除页的范围之内。 自己看下地址,是不是溢出了 可以在程序中把flash的Page固定死,一个一个的擦除,每擦除一个修改程序重新擦除,可以定位到擦除哪一个页出问题,然后看看这页是否溢出。 bargagebaobei 发表于 2018-3-6 16:01
楼主,你写flash时,是不是没设临界段啊?这样也会造成卡死。
你好!感谢你的回复,目前没有设置临界段。但是应该不影响,我只写512字节就停止,后面lock之后就是while(1)。应该不会出临界段。 bargagebaobei 发表于 2018-3-6 16:03
还有一个可能就是FLASH擦除期间,必须禁止数据fetch。请楼主自查程序
flash擦除的时候没有注意fetch问题,因为测试内容比较单一,只有flash擦除,所以应该不会有fetch打断。 安 发表于 2018-3-6 16:06
如果擦除整个可以写,可以考虑一下写入的地址不再擦除页的范围之内。
你好,我擦除和写入的都是第500页。可以确定写入的flash已经擦除过了。 wudianjun2001 发表于 2018-3-6 16:24
自己看下地址,是不是溢出了
你好,我现在测试的地址是第500页,我现在的STM32L476是由512页的。没有溢出
页:
[1]
2