Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: easy-connect-v16 Watchdog FP MQTTPacket RecordType-v-16 watersenor_and_temp_code
Diff: Flash/flash_programming.cpp
- Revision:
- 32:8226837c56ae
- Parent:
- 26:f40cc4d011b0
- Child:
- 33:5b90257d2d57
diff -r 0f7ea3981668 -r 8226837c56ae Flash/flash_programming.cpp --- a/Flash/flash_programming.cpp Mon Jan 08 22:09:56 2018 +0700 +++ b/Flash/flash_programming.cpp Mon Jan 08 18:07:56 2018 +0000 @@ -1,167 +1,167 @@ -#include "flash_programming.h" -#include "stm32l4xx_hal_flash.h" - -uint32_t PageError = 0; - -FLASH_EraseInitTypeDef EraseInitStruct; - -uint32_t FP_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; -} - -int FP_ClearFlags() { - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_PGAERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_PGSERR); - if((__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PROGERR)) || - (__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR)) || - (__HAL_FLASH_GET_FLAG(FLASH_FLAG_SIZERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR))) { - printf("Clear flag error\r\n"); - return FAILED; - } - return PASSED; -} - -uint32_t FP_ReadValue(uint32_t Addr) { - uint32_t ReturnValue = *(__IO uint32_t*)Addr; - return ReturnValue; -} - -int FP_WriteMode(uint32_t WriteModeValue) { - uint8_t CurrentPage = FP_GetPage(MODE_BASE_ADDRESS); - uint32_t CurrentAddress = (MODE_BASE_ADDRESS + STEP_ADDRESS); - - EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; - EraseInitStruct.Banks = FLASH_BANK_1; - EraseInitStruct.Page = CurrentPage; - EraseInitStruct.NbPages = 1; - - if (FP_ClearFlags() != PASSED) { - return FAILED; - } - HAL_FLASH_Unlock(); - - if (FP_ReadValue(CurrentAddress) == WriteModeValue) { - printf("Value does not change, no need to write\r\n"); - HAL_FLASH_Lock(); - return PASSED; - } - if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) { - printf("Erase error, error num %d\r\n", HAL_FLASH_GetError()); - } - if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, WriteModeValue) == HAL_OK) { - printf("Write OK\r\n"); - } - else { - printf("Write failed, error num %d\r\n", HAL_FLASH_GetError()); - } - uint32_t readBack = FP_ReadValue(CurrentAddress); - printf("Read back: %d\r\n", readBack); - if (readBack != WriteModeValue) { - printf("Write failed, wrong read back value\r\n"); - HAL_FLASH_Lock(); - return FAILED; - } - HAL_FLASH_Lock(); - return PASSED; -} - -int FP_WriteConfigValues(uint8_t MinOxi, uint8_t MaxOxi, uint32_t UploadPeriod) { - uint8_t CurrentPage = FP_GetPage(CONF_BASE_ADDRESS); - uint32_t CurrentAddress = MIN_OXI_ADDRESS; - EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; - EraseInitStruct.Banks = FLASH_BANK_1; - EraseInitStruct.Page = CurrentPage; - EraseInitStruct.NbPages = 1; - - if (FP_ClearFlags() != PASSED) { - return FAILED; - } - HAL_FLASH_Unlock(); - - if ((FP_ReadValue(MIN_OXI_ADDRESS) == MinOxi) && - (FP_ReadValue(MAX_OXI_ADDRESS) == MaxOxi) && - (FP_ReadValue(UPLOAD_PERIOD_ARRESS) == UploadPeriod)) { - printf("Value does not change, no need to write\r\n"); - HAL_FLASH_Lock(); - return PASSED; - } - if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) { - printf("Erase error, error num %d\r\n", HAL_FLASH_GetError()); - } - while (CurrentAddress < (UPLOAD_PERIOD_ARRESS + STEP_ADDRESS)) { - switch (CurrentAddress) { - case (MIN_OXI_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, MinOxi) == HAL_OK) { - printf("Write MinOxi OK\r\n"); - } - else { - printf("Write MinOxi failed, error num %d\r\n", HAL_FLASH_GetError()); - } - break; - case (MAX_OXI_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, MaxOxi) == HAL_OK) { - printf("Write MaxOxi OK\r\n"); - } - else { - printf("Write MaxOxi failed, error num %d\r\n", HAL_FLASH_GetError()); - } - break; - case (UPLOAD_PERIOD_ARRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, UploadPeriod) == HAL_OK) { - printf("Write UploadPeriod OK\r\n"); - } - else { - printf("Write UploadPeriod failed, error num %d\r\n", HAL_FLASH_GetError()); - } - break; - default: break; - } - CurrentAddress = CurrentAddress + STEP_ADDRESS; - } - - CurrentAddress = MIN_OXI_ADDRESS; - while (CurrentAddress < (UPLOAD_PERIOD_ARRESS + STEP_ADDRESS)) { - switch (CurrentAddress) { - case (MIN_OXI_ADDRESS): if (FP_ReadValue(CurrentAddress) == MinOxi) { - printf("Read back MinOxi: %d\r\n", FP_ReadValue(CurrentAddress)); - } - else { - printf("Write MinOxi failed, wrong read back value\r\n"); - HAL_FLASH_Lock(); - return FAILED; - } - break; - case (MAX_OXI_ADDRESS): if (FP_ReadValue(CurrentAddress) == MaxOxi) { - printf("Read back MaxOxi: %d\r\n", FP_ReadValue(CurrentAddress)); - } - else { - printf("Write MaxOxi failed, wrong read back value\r\n"); - HAL_FLASH_Lock(); - return FAILED; - } - break; - case (UPLOAD_PERIOD_ARRESS): if (FP_ReadValue(CurrentAddress) == UploadPeriod) { - printf("Read back UploadPeriod: %d\r\n", FP_ReadValue(CurrentAddress)); - } - else { - printf("Write UploadPeriod failed, wrong read back value\r\n"); - HAL_FLASH_Lock(); - return FAILED; - } - break; - default: break; - } - CurrentAddress = CurrentAddress + STEP_ADDRESS; - } - HAL_FLASH_Lock(); - return PASSED; +#include "flash_programming.h" +#include "stm32l4xx_hal_flash.h" + +uint32_t PageError = 0; + +FLASH_EraseInitTypeDef EraseInitStruct; + +uint32_t FP_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; +} + +int FP_ClearFlags() { + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_PGAERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_PGSERR); + if((__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PROGERR)) || + (__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR)) || + (__HAL_FLASH_GET_FLAG(FLASH_FLAG_SIZERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR))) { + printf("Clear flag error\r\n"); + return FAILED; + } + return PASSED; +} + +uint32_t FP_ReadValue(uint32_t Addr) { + uint32_t ReturnValue = *(__IO uint32_t*)Addr; + return ReturnValue; +} + +int FP_WriteMode(uint32_t WriteModeValue) { + uint8_t CurrentPage = FP_GetPage(MODE_BASE_ADDRESS); + uint32_t CurrentAddress = (MODE_BASE_ADDRESS + STEP_ADDRESS); + + EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; + EraseInitStruct.Banks = FLASH_BANK_1; + EraseInitStruct.Page = CurrentPage; + EraseInitStruct.NbPages = 1; + + if (FP_ClearFlags() != PASSED) { + return FAILED; + } + HAL_FLASH_Unlock(); + + if (FP_ReadValue(CurrentAddress) == WriteModeValue) { + printf("Value does not change, no need to write\r\n"); + HAL_FLASH_Lock(); + return PASSED; + } + if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) { + printf("Erase error, error num %d\r\n", HAL_FLASH_GetError()); + } + if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, WriteModeValue) == HAL_OK) { + printf("Write OK\r\n"); + } + else { + printf("Write failed, error num %d\r\n", HAL_FLASH_GetError()); + } + uint32_t readBack = FP_ReadValue(CurrentAddress); + printf("Read back: %d\r\n", readBack); + if (readBack != WriteModeValue) { + printf("Write failed, wrong read back value\r\n"); + HAL_FLASH_Lock(); + return FAILED; + } + HAL_FLASH_Lock(); + return PASSED; +} + +int FP_WriteConfigValues(uint8_t MinOxi, uint8_t MaxOxi, uint32_t UploadPeriod) { + uint8_t CurrentPage = FP_GetPage(CONF_BASE_ADDRESS); + uint32_t CurrentAddress = MIN_OXI_ADDRESS; + EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; + EraseInitStruct.Banks = FLASH_BANK_1; + EraseInitStruct.Page = CurrentPage; + EraseInitStruct.NbPages = 1; + + if (FP_ClearFlags() != PASSED) { + return FAILED; + } + HAL_FLASH_Unlock(); + + if ((FP_ReadValue(MIN_OXI_ADDRESS) == MinOxi) && + (FP_ReadValue(MAX_OXI_ADDRESS) == MaxOxi) && + (FP_ReadValue(UPLOAD_PERIOD_ARRESS) == UploadPeriod)) { + printf("Value does not change, no need to write\r\n"); + HAL_FLASH_Lock(); + return PASSED; + } + if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) { + printf("Erase error, error num %d\r\n", HAL_FLASH_GetError()); + } + while (CurrentAddress < (UPLOAD_PERIOD_ARRESS + STEP_ADDRESS)) { + switch (CurrentAddress) { + case (MIN_OXI_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, MinOxi) == HAL_OK) { + printf("Write MinOxi OK\r\n"); + } + else { + printf("Write MinOxi failed, error num %d\r\n", HAL_FLASH_GetError()); + } + break; + case (MAX_OXI_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, MaxOxi) == HAL_OK) { + printf("Write MaxOxi OK\r\n"); + } + else { + printf("Write MaxOxi failed, error num %d\r\n", HAL_FLASH_GetError()); + } + break; + case (UPLOAD_PERIOD_ARRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, UploadPeriod) == HAL_OK) { + printf("Write UploadPeriod OK\r\n"); + } + else { + printf("Write UploadPeriod failed, error num %d\r\n", HAL_FLASH_GetError()); + } + break; + default: break; + } + CurrentAddress = CurrentAddress + STEP_ADDRESS; + } + + CurrentAddress = MIN_OXI_ADDRESS; + while (CurrentAddress < (UPLOAD_PERIOD_ARRESS + STEP_ADDRESS)) { + switch (CurrentAddress) { + case (MIN_OXI_ADDRESS): if (FP_ReadValue(CurrentAddress) == MinOxi) { + printf("Read back MinOxi: %d\r\n", FP_ReadValue(CurrentAddress)); + } + else { + printf("Write MinOxi failed, wrong read back value\r\n"); + HAL_FLASH_Lock(); + return FAILED; + } + break; + case (MAX_OXI_ADDRESS): if (FP_ReadValue(CurrentAddress) == MaxOxi) { + printf("Read back MaxOxi: %d\r\n", FP_ReadValue(CurrentAddress)); + } + else { + printf("Write MaxOxi failed, wrong read back value\r\n"); + HAL_FLASH_Lock(); + return FAILED; + } + break; + case (UPLOAD_PERIOD_ARRESS): if (FP_ReadValue(CurrentAddress) == UploadPeriod) { + printf("Read back UploadPeriod: %d\r\n", FP_ReadValue(CurrentAddress)); + } + else { + printf("Write UploadPeriod failed, wrong read back value\r\n"); + HAL_FLASH_Lock(); + return FAILED; + } + break; + default: break; + } + CurrentAddress = CurrentAddress + STEP_ADDRESS; + } + HAL_FLASH_Lock(); + return PASSED; } \ No newline at end of file