2021-06-04 02:52 AM
I've got the following structure to write to memory:
```
#define FLASH_CONFIG_START_ADDR ((uint32_t) 0x080E0000)
#define FLASH_CONFIG_END_ADDR ((uint32_t) 0x080E0040)
union NVRAM {
Config_t config;
uint8_t data[512];
} DevNVRAM;
```
I've used this code for writing to memory
```
uint32_t l_address = FLASH_CONFIG_START_ADDR;
uint8_t l_index = 0x00;
l_address = FLASH_CONFIG_START_ADDR;
HAL_FLASH_Unlock();
FLASH_Erase_Sector(FLASH_SECTOR_11, VOLTAGE_RANGE_1);
while (l_address < FLASH_CONFIG_END_ADDR)
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, l_address,
DevNVRAM.data[l_index]) == HAL_OK) {
l_index += 1;
l_address += 1;
}
HAL_FLASH_Lock();
```
and then I simply read from the same block of memory.
```
l_address = FLASH_CONFIG_START_ADDR;
l_index = 0x00;
while (l_address < FLASH_CONFIG_END_ADDR) {
DevNVRAM.data[l_index] = *(uint8_t*) l_address;
l_index += 1;
l_address += 1;
}
```
The problem is the following, after I have read the whole sector, data becomes different, in particular, it is filled with zeros. What is the problem with code?
P.S. How can I get first address of memory blovk in the sector without hard-coddding?
Solved! Go to Solution.
2021-06-06 03:04 AM
The problem was in address declaration. it is actually 0x81C000(viewd in st-link utility)
2021-06-04 04:14 AM
Cache-related?
Which STM32 in particular?
How is single-bank/dual-bank set?
JW
2021-06-04 04:31 AM
Is the data you want to write 64 or 512 bytes long?
Why write as bytes, doesn't this need to be words or double words?
2021-06-04 05:29 AM
STM32F767ZI dual-bank
2021-06-04 05:31 AM
Actual size of data is 14 bytes, FLASH_TYPEPROGRAM_BYTE is allowed according to hal_flash.h
2021-06-04 07:47 AM
Are you using the union properly and not overwriting data? Does reading the memory in the debugger match what you're reading in your code?
2021-06-04 06:37 PM
I am using debugger and memory monitoring, looks like writing data to memory is not working since union is correct(also have checked with debugger)
2021-06-04 06:53 PM
You shouldn't be calling FLASH_Erase_Sector directly. You should be calling HAL_FLASHEx_Erase. There are other things you're missing as a result.
2021-06-05 05:41 AM
I have changed the code:
```
static FLASH_EraseInitTypeDef EraseInitStruct;
EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;
EraseInitStruct.Sector = FLASH_CONFIG_START_ADDR;
EraseInitStruct.NbSectors = 0x01;
HAL_FLASH_Unlock();
HAL_FLASHEx_Erase(&EraseInitStruct, &l_error);
```
Now i have this instead of: FLASH_Erase_Sector(FLASH_SECTOR_11, VOLTAGE_RANGE_1);
Unfortunately, this didn't fix the problem, I suppose the problem is with wirting to memory.
2021-06-05 06:48 AM
> EraseInitStruct.Sector = FLASH_CONFIG_START_ADDR;
This is not a sector value.
Monitor the return values from HAL.