2022-03-03 01:19 AM
/* Flash Init */
uint32_t GetPage(uint32_t Addr)
{
uint32_t page = 0;
if (Addr < (FLASH_BASE + FLASH_BANK_SIZE))
{
/* Bank 1 */
page = (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;
}
else
{
/* Bank 2 */
page = (Addr - (FLASH_BASE + FLASH_BANK_SIZE)) / FLASH_PAGE_SIZE;
}
return page;
}
void FLASH_init(void)
{
/* Initialise test status */
MemoryProgramStatus = PASSED;
/* 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);
/* Get the number of the start and end pages */
StartPage = GetPage(FLASH_USER_START_ADDR);
EndPage = GetPage(FLASH_USER_END_ADDR);
}
/* Erase operation */
void FLASH_erase(uint32_t page_address)
{
/* The desired pages are not write protected */
/* Fill EraseInit structure************************************************/
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; // Mass erase or Page erase
EraseInitStruct.Page = page_address;
EraseInitStruct.NbPages = EndPage - StartPage + 1; // Number of pages to be erased
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
{
/*
Error occurred while page erase.
User can add here some code to deal with this error.
PageError will contain the faulty page and then to know the code error on this page,
user can call function 'HAL_FLASH_GetError()'
*/
while (1)
{
printf("Error in erase operation\n");
}
}
}
/* Write Operation */
void FLASH_program(uint32_t add, uint64_t *data, uint8_t count)
{
/* FLASH Word program of DATA_32 at addresses defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR */
uint32_t Address=0;
int i=0;
Address = add;
while (i < count)
{
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, data[i]) == HAL_OK)
{
Address = Address + 8;
i++;
}
else
{
/* Error occurred while writing data in Flash memory.
User can add here some code to deal with this error */
while (1)
{
printf("Error in write operation\n");
}
}
}
}
/* Read operation */
uint64_t FLASH_read(uint32_t Address)
{
/* Check the correctness of written data */
data64 = *(__IO uint32_t *)Address;
return data64;
}
####### Storing values #######
/* WRITE OPERATION */
void Store_Config(void)
{
s_config[config_count++] = data; // uint32_t data
s_config[config_count++] = data1; // uint32_t data1
FLASH_erase(StartPage);
FLASH_program(FLASH_USER_START_ADDR,s_config,config_count); //store config
config_count=0;
}
/* READ OPERATION */
void Read_Config(void)
{
uint32_t star_address=0;
uint64_t r_config[10];
star_address=FLASH_USER_START_ADDR;
for(int i=0;i<10;i++)
{
r_config[i]=FLASH_read(star_address);
star_address+=8;
}
data = r_config[0];
data1 = r_config[1];
printf("Read Data1: %lu\n", data);
printf("Read Data2: %lu\n", data1);
}
####### Address details #######
#define FLASH_USER_START_ADDR ADDR_FLASH_PAGE_24 /* Start @ of user Flash area */
#define FLASH_USER_END_ADDR ADDR_FLASH_PAGE_25 /* End @ of user Flash area */
2022-03-03 01:43 AM
"the FLASH example code from the GitHub source files"
Which example, from which GitHub repository?
Have you got that example to work on its own?
"it is showing an error in the WRITE operation"
What, exactly, is showing an error, and what error, exactly, is that thing showing?
2022-03-03 05:40 AM
Hi,
Currently, I'm working on STM32WLE5JC with the LoRaWAN end node example,
I have referred to the following GitHub source. First of all, I'm new to this board & a beginner level in communication protocol so called LoRaWAN
Referred link,
https://github.com/STMicroelectronics/STM32CubeWL
Referred flash program from examples folder,
In this, I'm able to write/read the values in the flash memory using cubemx platform(which stores two uint32_t type variables)!
But when I'm trying the same implementation in LoRaWAN end node example code, facing an issue like "Error in write operation"
I just need to store the values in the memory using LoRaWAN end node example code! (I have attached the functions that i used in the above chain!)
Can you please help with this?
2022-03-03 07:02 AM
"facing an issue like (sic) "Error in write operation"
how do you mean, "like" ?
Again, where exactly are you getting that, and what is the exact message?
As you've got one case which does work, and one which doesn't, have you tried comparing the two to see where they differ? eg, stepping through the code?
2023-03-05 05:02 AM
Have you resolve that question? Thanks in advance.
2023-03-05 05:22 AM
Pretty sure the Flash can be written if coded properly.
It will need aligned addresses, to have been erased and written once.
Fail at a hardware level perhaps from power supply issues or repetitive cycling.
People need to learn how debug, diagnose, and address issues. Others having solved the issue is not a prerequisite to solving the issue yourself.
2023-03-05 06:41 AM
I can't found a free page to store my info into the flash memory with lorawan example sample code. I use this code adapted for my own code, but i don't know how address will must use to do it. https://github.com/STMicroelectronics/STM32CubeWL/blob/main/Projects/NUCLEO-WL55JC/Examples/FLASH/FLASH_FastProgram/Src/main.c
2023-03-05 09:56 AM
I have the same problem that Ppk1
2023-03-05 12:53 PM
I do it!
I found a pair of pages free to store my info.
:beaming_face_with_smiling_eyes: