Duy tran / Mbed OS iot_water_monitor_v2

Dependencies:   easy-connect-v16 Watchdog FP MQTTPacket RecordType-v-16 watersenor_and_temp_code

Committer:
DuyLionTran
Date:
Wed Jan 03 17:33:03 2018 +0000
Revision:
26:f40cc4d011b0
Child:
32:8226837c56ae
version 1.9: Flash added, Json parser added

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DuyLionTran 26:f40cc4d011b0 1 #include "flash_programming.h"
DuyLionTran 26:f40cc4d011b0 2 #include "stm32l4xx_hal_flash.h"
DuyLionTran 26:f40cc4d011b0 3
DuyLionTran 26:f40cc4d011b0 4 uint32_t PageError = 0;
DuyLionTran 26:f40cc4d011b0 5
DuyLionTran 26:f40cc4d011b0 6 FLASH_EraseInitTypeDef EraseInitStruct;
DuyLionTran 26:f40cc4d011b0 7
DuyLionTran 26:f40cc4d011b0 8 uint32_t FP_GetPage(uint32_t Addr) {
DuyLionTran 26:f40cc4d011b0 9 uint32_t page = 0;
DuyLionTran 26:f40cc4d011b0 10
DuyLionTran 26:f40cc4d011b0 11 if (Addr < (FLASH_BASE + FLASH_BANK_SIZE))
DuyLionTran 26:f40cc4d011b0 12 {
DuyLionTran 26:f40cc4d011b0 13 /* Bank 1 */
DuyLionTran 26:f40cc4d011b0 14 page = (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;
DuyLionTran 26:f40cc4d011b0 15 }
DuyLionTran 26:f40cc4d011b0 16 else
DuyLionTran 26:f40cc4d011b0 17 {
DuyLionTran 26:f40cc4d011b0 18 /* Bank 2 */
DuyLionTran 26:f40cc4d011b0 19 page = (Addr - (FLASH_BASE + FLASH_BANK_SIZE)) / FLASH_PAGE_SIZE;
DuyLionTran 26:f40cc4d011b0 20 }
DuyLionTran 26:f40cc4d011b0 21
DuyLionTran 26:f40cc4d011b0 22 return page;
DuyLionTran 26:f40cc4d011b0 23 }
DuyLionTran 26:f40cc4d011b0 24
DuyLionTran 26:f40cc4d011b0 25 int FP_ClearFlags() {
DuyLionTran 26:f40cc4d011b0 26 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_PGAERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_PGSERR);
DuyLionTran 26:f40cc4d011b0 27 if((__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PROGERR)) ||
DuyLionTran 26:f40cc4d011b0 28 (__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR)) ||
DuyLionTran 26:f40cc4d011b0 29 (__HAL_FLASH_GET_FLAG(FLASH_FLAG_SIZERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR))) {
DuyLionTran 26:f40cc4d011b0 30 printf("Clear flag error\r\n");
DuyLionTran 26:f40cc4d011b0 31 return FAILED;
DuyLionTran 26:f40cc4d011b0 32 }
DuyLionTran 26:f40cc4d011b0 33 return PASSED;
DuyLionTran 26:f40cc4d011b0 34 }
DuyLionTran 26:f40cc4d011b0 35
DuyLionTran 26:f40cc4d011b0 36 uint32_t FP_ReadValue(uint32_t Addr) {
DuyLionTran 26:f40cc4d011b0 37 uint32_t ReturnValue = *(__IO uint32_t*)Addr;
DuyLionTran 26:f40cc4d011b0 38 return ReturnValue;
DuyLionTran 26:f40cc4d011b0 39 }
DuyLionTran 26:f40cc4d011b0 40
DuyLionTran 26:f40cc4d011b0 41 int FP_WriteMode(uint32_t WriteModeValue) {
DuyLionTran 26:f40cc4d011b0 42 uint8_t CurrentPage = FP_GetPage(MODE_BASE_ADDRESS);
DuyLionTran 26:f40cc4d011b0 43 uint32_t CurrentAddress = (MODE_BASE_ADDRESS + STEP_ADDRESS);
DuyLionTran 26:f40cc4d011b0 44
DuyLionTran 26:f40cc4d011b0 45 EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
DuyLionTran 26:f40cc4d011b0 46 EraseInitStruct.Banks = FLASH_BANK_1;
DuyLionTran 26:f40cc4d011b0 47 EraseInitStruct.Page = CurrentPage;
DuyLionTran 26:f40cc4d011b0 48 EraseInitStruct.NbPages = 1;
DuyLionTran 26:f40cc4d011b0 49
DuyLionTran 26:f40cc4d011b0 50 if (FP_ClearFlags() != PASSED) {
DuyLionTran 26:f40cc4d011b0 51 return FAILED;
DuyLionTran 26:f40cc4d011b0 52 }
DuyLionTran 26:f40cc4d011b0 53 HAL_FLASH_Unlock();
DuyLionTran 26:f40cc4d011b0 54
DuyLionTran 26:f40cc4d011b0 55 if (FP_ReadValue(CurrentAddress) == WriteModeValue) {
DuyLionTran 26:f40cc4d011b0 56 printf("Value does not change, no need to write\r\n");
DuyLionTran 26:f40cc4d011b0 57 HAL_FLASH_Lock();
DuyLionTran 26:f40cc4d011b0 58 return PASSED;
DuyLionTran 26:f40cc4d011b0 59 }
DuyLionTran 26:f40cc4d011b0 60 if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) {
DuyLionTran 26:f40cc4d011b0 61 printf("Erase error, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 26:f40cc4d011b0 62 }
DuyLionTran 26:f40cc4d011b0 63 if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, WriteModeValue) == HAL_OK) {
DuyLionTran 26:f40cc4d011b0 64 printf("Write OK\r\n");
DuyLionTran 26:f40cc4d011b0 65 }
DuyLionTran 26:f40cc4d011b0 66 else {
DuyLionTran 26:f40cc4d011b0 67 printf("Write failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 26:f40cc4d011b0 68 }
DuyLionTran 26:f40cc4d011b0 69 uint32_t readBack = FP_ReadValue(CurrentAddress);
DuyLionTran 26:f40cc4d011b0 70 printf("Read back: %d\r\n", readBack);
DuyLionTran 26:f40cc4d011b0 71 if (readBack != WriteModeValue) {
DuyLionTran 26:f40cc4d011b0 72 printf("Write failed, wrong read back value\r\n");
DuyLionTran 26:f40cc4d011b0 73 HAL_FLASH_Lock();
DuyLionTran 26:f40cc4d011b0 74 return FAILED;
DuyLionTran 26:f40cc4d011b0 75 }
DuyLionTran 26:f40cc4d011b0 76 HAL_FLASH_Lock();
DuyLionTran 26:f40cc4d011b0 77 return PASSED;
DuyLionTran 26:f40cc4d011b0 78 }
DuyLionTran 26:f40cc4d011b0 79
DuyLionTran 26:f40cc4d011b0 80 int FP_WriteConfigValues(uint8_t MinOxi, uint8_t MaxOxi, uint32_t UploadPeriod) {
DuyLionTran 26:f40cc4d011b0 81 uint8_t CurrentPage = FP_GetPage(CONF_BASE_ADDRESS);
DuyLionTran 26:f40cc4d011b0 82 uint32_t CurrentAddress = MIN_OXI_ADDRESS;
DuyLionTran 26:f40cc4d011b0 83 EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
DuyLionTran 26:f40cc4d011b0 84 EraseInitStruct.Banks = FLASH_BANK_1;
DuyLionTran 26:f40cc4d011b0 85 EraseInitStruct.Page = CurrentPage;
DuyLionTran 26:f40cc4d011b0 86 EraseInitStruct.NbPages = 1;
DuyLionTran 26:f40cc4d011b0 87
DuyLionTran 26:f40cc4d011b0 88 if (FP_ClearFlags() != PASSED) {
DuyLionTran 26:f40cc4d011b0 89 return FAILED;
DuyLionTran 26:f40cc4d011b0 90 }
DuyLionTran 26:f40cc4d011b0 91 HAL_FLASH_Unlock();
DuyLionTran 26:f40cc4d011b0 92
DuyLionTran 26:f40cc4d011b0 93 if ((FP_ReadValue(MIN_OXI_ADDRESS) == MinOxi) &&
DuyLionTran 26:f40cc4d011b0 94 (FP_ReadValue(MAX_OXI_ADDRESS) == MaxOxi) &&
DuyLionTran 26:f40cc4d011b0 95 (FP_ReadValue(UPLOAD_PERIOD_ARRESS) == UploadPeriod)) {
DuyLionTran 26:f40cc4d011b0 96 printf("Value does not change, no need to write\r\n");
DuyLionTran 26:f40cc4d011b0 97 HAL_FLASH_Lock();
DuyLionTran 26:f40cc4d011b0 98 return PASSED;
DuyLionTran 26:f40cc4d011b0 99 }
DuyLionTran 26:f40cc4d011b0 100 if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) {
DuyLionTran 26:f40cc4d011b0 101 printf("Erase error, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 26:f40cc4d011b0 102 }
DuyLionTran 26:f40cc4d011b0 103 while (CurrentAddress < (UPLOAD_PERIOD_ARRESS + STEP_ADDRESS)) {
DuyLionTran 26:f40cc4d011b0 104 switch (CurrentAddress) {
DuyLionTran 26:f40cc4d011b0 105 case (MIN_OXI_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, MinOxi) == HAL_OK) {
DuyLionTran 26:f40cc4d011b0 106 printf("Write MinOxi OK\r\n");
DuyLionTran 26:f40cc4d011b0 107 }
DuyLionTran 26:f40cc4d011b0 108 else {
DuyLionTran 26:f40cc4d011b0 109 printf("Write MinOxi failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 26:f40cc4d011b0 110 }
DuyLionTran 26:f40cc4d011b0 111 break;
DuyLionTran 26:f40cc4d011b0 112 case (MAX_OXI_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, MaxOxi) == HAL_OK) {
DuyLionTran 26:f40cc4d011b0 113 printf("Write MaxOxi OK\r\n");
DuyLionTran 26:f40cc4d011b0 114 }
DuyLionTran 26:f40cc4d011b0 115 else {
DuyLionTran 26:f40cc4d011b0 116 printf("Write MaxOxi failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 26:f40cc4d011b0 117 }
DuyLionTran 26:f40cc4d011b0 118 break;
DuyLionTran 26:f40cc4d011b0 119 case (UPLOAD_PERIOD_ARRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, UploadPeriod) == HAL_OK) {
DuyLionTran 26:f40cc4d011b0 120 printf("Write UploadPeriod OK\r\n");
DuyLionTran 26:f40cc4d011b0 121 }
DuyLionTran 26:f40cc4d011b0 122 else {
DuyLionTran 26:f40cc4d011b0 123 printf("Write UploadPeriod failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 26:f40cc4d011b0 124 }
DuyLionTran 26:f40cc4d011b0 125 break;
DuyLionTran 26:f40cc4d011b0 126 default: break;
DuyLionTran 26:f40cc4d011b0 127 }
DuyLionTran 26:f40cc4d011b0 128 CurrentAddress = CurrentAddress + STEP_ADDRESS;
DuyLionTran 26:f40cc4d011b0 129 }
DuyLionTran 26:f40cc4d011b0 130
DuyLionTran 26:f40cc4d011b0 131 CurrentAddress = MIN_OXI_ADDRESS;
DuyLionTran 26:f40cc4d011b0 132 while (CurrentAddress < (UPLOAD_PERIOD_ARRESS + STEP_ADDRESS)) {
DuyLionTran 26:f40cc4d011b0 133 switch (CurrentAddress) {
DuyLionTran 26:f40cc4d011b0 134 case (MIN_OXI_ADDRESS): if (FP_ReadValue(CurrentAddress) == MinOxi) {
DuyLionTran 26:f40cc4d011b0 135 printf("Read back MinOxi: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 26:f40cc4d011b0 136 }
DuyLionTran 26:f40cc4d011b0 137 else {
DuyLionTran 26:f40cc4d011b0 138 printf("Write MinOxi failed, wrong read back value\r\n");
DuyLionTran 26:f40cc4d011b0 139 HAL_FLASH_Lock();
DuyLionTran 26:f40cc4d011b0 140 return FAILED;
DuyLionTran 26:f40cc4d011b0 141 }
DuyLionTran 26:f40cc4d011b0 142 break;
DuyLionTran 26:f40cc4d011b0 143 case (MAX_OXI_ADDRESS): if (FP_ReadValue(CurrentAddress) == MaxOxi) {
DuyLionTran 26:f40cc4d011b0 144 printf("Read back MaxOxi: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 26:f40cc4d011b0 145 }
DuyLionTran 26:f40cc4d011b0 146 else {
DuyLionTran 26:f40cc4d011b0 147 printf("Write MaxOxi failed, wrong read back value\r\n");
DuyLionTran 26:f40cc4d011b0 148 HAL_FLASH_Lock();
DuyLionTran 26:f40cc4d011b0 149 return FAILED;
DuyLionTran 26:f40cc4d011b0 150 }
DuyLionTran 26:f40cc4d011b0 151 break;
DuyLionTran 26:f40cc4d011b0 152 case (UPLOAD_PERIOD_ARRESS): if (FP_ReadValue(CurrentAddress) == UploadPeriod) {
DuyLionTran 26:f40cc4d011b0 153 printf("Read back UploadPeriod: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 26:f40cc4d011b0 154 }
DuyLionTran 26:f40cc4d011b0 155 else {
DuyLionTran 26:f40cc4d011b0 156 printf("Write UploadPeriod failed, wrong read back value\r\n");
DuyLionTran 26:f40cc4d011b0 157 HAL_FLASH_Lock();
DuyLionTran 26:f40cc4d011b0 158 return FAILED;
DuyLionTran 26:f40cc4d011b0 159 }
DuyLionTran 26:f40cc4d011b0 160 break;
DuyLionTran 26:f40cc4d011b0 161 default: break;
DuyLionTran 26:f40cc4d011b0 162 }
DuyLionTran 26:f40cc4d011b0 163 CurrentAddress = CurrentAddress + STEP_ADDRESS;
DuyLionTran 26:f40cc4d011b0 164 }
DuyLionTran 26:f40cc4d011b0 165 HAL_FLASH_Lock();
DuyLionTran 26:f40cc4d011b0 166 return PASSED;
DuyLionTran 26:f40cc4d011b0 167 }