HAL_FLASHEx_DATAEEPROM_Program() bug
The Bug
I've been using HAL drivers to program an STM32L151CB chip. While trying to use the HAL_FLASHEx_DATAEEPROM_Program() function in the STM HAL library, I discovered that when I wrote a data byte, and then a "0" into the next byte, that my data was lost. I wrote a sample program, source below, which demonstrated the problem.
The Fix
It turns out that I was using the STM32L1xx_HAL_Driver V1.1.2 that came packaged with the STM32CubeMX 1.4 code. After determining that this was a bug in the HAL driver, I thought to check, and there was a newer STM32CubeMX 1.6 release, which included STM32L1xx_HAL_Driver V1.2.0. The new code worked beautifully. I did find a mention of a fix in the release notes for driver version 1.1.3, but it was quite vague:
- FLASH:
- Correct issue preventing Cat.1 devices to write data in EEPROM.
Sample code
void DemoFlashBug(void) { HAL_StatusTypeDef status; uint32_t Byte0Addr,Byte1Addr; HAL_FLASHEx_DATAEEPROM_Unlock(); //Unprotect the EEPROM to allow writing Byte0Addr = 0x08080000; Byte1Addr = 0x08080001; // Print values before we do anything trace_puts("Prior to updates"); trace_printf("Byte0 is: %d\n", *(uint8_t *) Byte0Addr); trace_printf("Byte1 is: %d\n", *(uint8_t *) Byte1Addr); // Set the first byte to 99 status = HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAMDATA_BYTE, Byte0Addr, (uint32_t) 99); if (status != HAL_OK) { Error_Handler(); } // Print values after setting byte 0 trace_puts("\nByte 0 should be set to 99"); trace_printf("Byte0 is: %d\n", *(uint8_t *) Byte0Addr); trace_printf("Byte1 is: %d\n", *(uint8_t *) Byte1Addr); status = HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAMDATA_BYTE, Byte1Addr, (uint32_t) 0); if (status != HAL_OK) { Error_Handler(); } // Print values after setting byte 1 trace_puts("\nByte 1 set to 0"); trace_printf("Byte0 is: %d\n", *(uint8_t *) Byte0Addr); trace_printf("Byte1 is: %d\n", *(uint8_t *) Byte1Addr); if ( *(uint8_t *) Byte0Addr != 99) { trace_puts("WTF?!?\n"); } else { trace_puts("OK, it worked!\n"); } HAL_FLASHEx_DATAEEPROM_Lock(); //Unprotect the EEPROM to allow writing }
Moral of the story
Grab the latest HAL drivers.
No comments:
Post a Comment