Skip to main content
FFlet
Associate
February 13, 2020
Question

Deleting flash memory breaks BLE connection on P-NUCLEO-WB55

  • February 13, 2020
  • 2 replies
  • 772 views

I am using a P-NUCLEO-WB55 board and trying to delete flash from within a BLE app. I have used the p2p_server project as the basis for my project.(github.com/STMicroelectronics/STM32CubeWB/tree/master/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_p2pServer)

When a certain BLE command is called within the P2P_Server.c file, the function below is called to delete a certain area of flash. The erase operation works but the BLE connection is broken. The connection can be reestablished but ideally I do not want the BLE connection to be broken. Is this possible? What is causing the connection to break?

Thanks for any help,

FInlay

oid Flash_Wipe(uint32_t Data_Start_Point, uint32_t Timestamp_Start_Point)
{
	uint32_t DataFirstPage = 0, DataNbOfPages = 0, TimestampFirstPage = 0, TimestampNbOfPages = 0;
	uint32_t PageError = 0;
 
	/*Variable used for Erase procedure*/
	static FLASH_EraseInitTypeDef DataEraseInitStruct;
	static FLASH_EraseInitTypeDef TimestampEraseInitStruct;
 
 
 
	// Unlock the Flash to enable the flash control register access
	HAL_FLASH_Unlock();
 
 
	// Clear OPTVERR bit set on virgin samples
	__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
 
 
 
	//if non-zero input then perform the data flash area erase
	if(Data_Start_Point != 0U)
	{
 
		// Get the 1st page to erase
		DataFirstPage = (Data_Start_Point - FLASH_BASE) / FLASH_PAGE_SIZE;
 
		// Get the number of pages to erase from 1st page
		DataNbOfPages = ((SPEECH_DATA_END_ADDRESS - FLASH_BASE) / FLASH_PAGE_SIZE) - DataFirstPage + 1;
 
		// Fill EraseInit structure
		DataEraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
		DataEraseInitStruct.Page = DataFirstPage;
		DataEraseInitStruct.NbPages = DataNbOfPages;
 
		if (HAL_FLASHEx_Erase(&DataEraseInitStruct, &PageError) != HAL_OK)
		{
 
 
			while (1)
			{
				// Turn on Red LED
				HAL_GPIO_WritePin(LEDG_GPIO_Port, LEDG_Pin, SET);
			}
		}
 
 
 
	}
 
 
	//if non-zero input then perform the timestamp flash area erase
	if(Timestamp_Start_Point != 0U)
	{
 
		//Get the 1st page to erase
		TimestampFirstPage = (Timestamp_Start_Point - FLASH_BASE) / FLASH_PAGE_SIZE;
 
		// Get the number of pages to erase from 1st page
		TimestampNbOfPages = ((SPEECH_TIMESTAMP_END_ADDRESS - FLASH_BASE) / FLASH_PAGE_SIZE) - TimestampFirstPage + 1;
 
		// Fill EraseInit structure
		TimestampEraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
		TimestampEraseInitStruct.Page = TimestampFirstPage;
		TimestampEraseInitStruct.NbPages = TimestampNbOfPages;
 
 
		if (HAL_FLASHEx_Erase(&TimestampEraseInitStruct, &PageError) != HAL_OK)
		{
 
			while (1)
			{
				// Turn on Red LED
				HAL_GPIO_WritePin(LEDG_GPIO_Port, LEDG_Pin, SET);
			}
		}
 
	}
 
	// Lock the Flash to disable the flash control register access (recommended to protect the FLASH memory against possible unwanted operation)
 
	HAL_FLASH_Lock(); //we can eventually lock and unlock before and after operations
 
 
 
 
}

This topic has been closed for replies.

2 replies

Olivier GALLIEN
Technical Moderator
February 13, 2020

Hi,

"STM32 MPUs" topic is dedicated to microprocessor family STM32MP1x

Reassigned ticket to "STM32 MCUs", "STM32WB" to reach pertinent community ;)

BR,

Olivier

Olivier GALLIEN In order to give better visibility on the answered topics, please click on 'Accept as Solution' on the reply which solved your issue or answered your question.
berendi
Principal
February 14, 2020

Erasing a flash block takes a lot of time (the datasheet should tell you exactly how much). During this time, any attempt to access flash from either core blocks that core until the erase is finished. If the BLE peripheral needs constant attention from the software, it won't work.

Moving all code essential to the communication to RAM should help, but I don't know if it's possible to do with the radio coprocessor firmware.