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:
Sun Mar 18 17:54:50 2018 +0000
Revision:
50:5a19fc4b41d9
Parent:
43:dcde0e66874a
* version 2.8.5  	03-19-2018: Set time to turn on/off the relay

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DuyLionTran 32:8226837c56ae 1 #include "flash_programming.h"
DuyLionTran 32:8226837c56ae 2 #include "stm32l4xx_hal_flash.h"
DuyLionTran 32:8226837c56ae 3
DuyLionTran 32:8226837c56ae 4 uint32_t PageError = 0;
DuyLionTran 32:8226837c56ae 5
DuyLionTran 32:8226837c56ae 6 FLASH_EraseInitTypeDef EraseInitStruct;
DuyLionTran 32:8226837c56ae 7
DuyLionTran 32:8226837c56ae 8 uint32_t FP_GetPage(uint32_t Addr) {
DuyLionTran 32:8226837c56ae 9 uint32_t page = 0;
DuyLionTran 32:8226837c56ae 10
DuyLionTran 32:8226837c56ae 11 if (Addr < (FLASH_BASE + FLASH_BANK_SIZE))
DuyLionTran 32:8226837c56ae 12 {
DuyLionTran 32:8226837c56ae 13 /* Bank 1 */
DuyLionTran 32:8226837c56ae 14 page = (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;
DuyLionTran 32:8226837c56ae 15 }
DuyLionTran 32:8226837c56ae 16 else
DuyLionTran 32:8226837c56ae 17 {
DuyLionTran 32:8226837c56ae 18 /* Bank 2 */
DuyLionTran 32:8226837c56ae 19 page = (Addr - (FLASH_BASE + FLASH_BANK_SIZE)) / FLASH_PAGE_SIZE;
DuyLionTran 32:8226837c56ae 20 }
DuyLionTran 32:8226837c56ae 21
DuyLionTran 32:8226837c56ae 22 return page;
DuyLionTran 32:8226837c56ae 23 }
DuyLionTran 32:8226837c56ae 24
DuyLionTran 32:8226837c56ae 25 int FP_ClearFlags() {
DuyLionTran 32:8226837c56ae 26 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_PGAERR | FLASH_FLAG_OPTVERR | FLASH_FLAG_PGSERR);
DuyLionTran 32:8226837c56ae 27 if((__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PROGERR)) ||
DuyLionTran 32:8226837c56ae 28 (__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR)) ||
DuyLionTran 32:8226837c56ae 29 (__HAL_FLASH_GET_FLAG(FLASH_FLAG_SIZERR)) || (__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGSERR))) {
DuyLionTran 32:8226837c56ae 30 printf("Clear flag error\r\n");
DuyLionTran 32:8226837c56ae 31 return FAILED;
DuyLionTran 32:8226837c56ae 32 }
DuyLionTran 32:8226837c56ae 33 return PASSED;
DuyLionTran 32:8226837c56ae 34 }
DuyLionTran 32:8226837c56ae 35
DuyLionTran 32:8226837c56ae 36 uint32_t FP_ReadValue(uint32_t Addr) {
DuyLionTran 32:8226837c56ae 37 uint32_t ReturnValue = *(__IO uint32_t*)Addr;
DuyLionTran 32:8226837c56ae 38 return ReturnValue;
DuyLionTran 32:8226837c56ae 39 }
DuyLionTran 32:8226837c56ae 40
DuyLionTran 34:601effb7b7fe 41 int FP_WriteRelayStates(uint8_t RelayState1, uint8_t RelayState2, uint8_t RelayState3) {
DuyLionTran 33:5b90257d2d57 42 uint8_t CurrentPage = FP_GetPage(RELAY_BASE_ADDRESS);
DuyLionTran 33:5b90257d2d57 43 uint32_t CurrentAddress = RELAY1_ADDRESS;
DuyLionTran 32:8226837c56ae 44
DuyLionTran 32:8226837c56ae 45 EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
DuyLionTran 32:8226837c56ae 46 EraseInitStruct.Banks = FLASH_BANK_1;
DuyLionTran 32:8226837c56ae 47 EraseInitStruct.Page = CurrentPage;
DuyLionTran 32:8226837c56ae 48 EraseInitStruct.NbPages = 1;
DuyLionTran 32:8226837c56ae 49
DuyLionTran 32:8226837c56ae 50 if (FP_ClearFlags() != PASSED) {
DuyLionTran 32:8226837c56ae 51 return FAILED;
DuyLionTran 32:8226837c56ae 52 }
DuyLionTran 32:8226837c56ae 53 HAL_FLASH_Unlock();
DuyLionTran 32:8226837c56ae 54
DuyLionTran 33:5b90257d2d57 55 if ((FP_ReadValue(RELAY1_ADDRESS) == RelayState1) &&
DuyLionTran 34:601effb7b7fe 56 (FP_ReadValue(RELAY2_ADDRESS) == RelayState2) &&
DuyLionTran 34:601effb7b7fe 57 (FP_ReadValue(RELAY3_ADDRESS) == RelayState3)) {
DuyLionTran 33:5b90257d2d57 58 printf("Relay values don't change, no need to write\r\n");
DuyLionTran 32:8226837c56ae 59 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 60 return PASSED;
DuyLionTran 32:8226837c56ae 61 }
DuyLionTran 32:8226837c56ae 62 if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) {
DuyLionTran 32:8226837c56ae 63 printf("Erase error, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 32:8226837c56ae 64 }
DuyLionTran 34:601effb7b7fe 65 while (CurrentAddress < (RELAY3_ADDRESS + STEP_ADDRESS)) {
DuyLionTran 33:5b90257d2d57 66 switch (CurrentAddress) {
DuyLionTran 33:5b90257d2d57 67 case (RELAY1_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, RelayState1) == HAL_OK) {
DuyLionTran 33:5b90257d2d57 68 printf("Write Relay 1 State OK\r\n");
DuyLionTran 33:5b90257d2d57 69 }
DuyLionTran 33:5b90257d2d57 70 else {
DuyLionTran 33:5b90257d2d57 71 printf("Write Relay 1 State failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 33:5b90257d2d57 72 }
DuyLionTran 33:5b90257d2d57 73 break;
DuyLionTran 33:5b90257d2d57 74 case (RELAY2_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, RelayState2) == HAL_OK) {
DuyLionTran 33:5b90257d2d57 75 printf("Write Relay 2 State OK\r\n");
DuyLionTran 33:5b90257d2d57 76 }
DuyLionTran 33:5b90257d2d57 77 else {
DuyLionTran 33:5b90257d2d57 78 printf("Write Relay 2 State failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 33:5b90257d2d57 79 }
DuyLionTran 35:fc800d35c1ba 80 break;
DuyLionTran 34:601effb7b7fe 81 case (RELAY3_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, RelayState3) == HAL_OK) {
DuyLionTran 34:601effb7b7fe 82 printf("Write Relay 3 State OK\r\n");
DuyLionTran 34:601effb7b7fe 83 }
DuyLionTran 34:601effb7b7fe 84 else {
DuyLionTran 34:601effb7b7fe 85 printf("Write Relay 3 State failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 34:601effb7b7fe 86 }
DuyLionTran 33:5b90257d2d57 87 break;
DuyLionTran 33:5b90257d2d57 88 default: break;
DuyLionTran 33:5b90257d2d57 89 }
DuyLionTran 33:5b90257d2d57 90 CurrentAddress = CurrentAddress + STEP_ADDRESS;
DuyLionTran 32:8226837c56ae 91 }
DuyLionTran 33:5b90257d2d57 92
DuyLionTran 33:5b90257d2d57 93 CurrentAddress = RELAY1_ADDRESS;
DuyLionTran 34:601effb7b7fe 94 while (CurrentAddress < (RELAY3_ADDRESS + STEP_ADDRESS)) {
DuyLionTran 33:5b90257d2d57 95 switch (CurrentAddress) {
DuyLionTran 33:5b90257d2d57 96 case (RELAY1_ADDRESS): if (FP_ReadValue(CurrentAddress) == RelayState1) {
DuyLionTran 33:5b90257d2d57 97 printf("Read back Relay 1 State: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 33:5b90257d2d57 98 }
DuyLionTran 33:5b90257d2d57 99 else {
DuyLionTran 33:5b90257d2d57 100 printf("Write Relay 1 State failed, wrong read back value\r\n");
DuyLionTran 33:5b90257d2d57 101 HAL_FLASH_Lock();
DuyLionTran 33:5b90257d2d57 102 return FAILED;
DuyLionTran 33:5b90257d2d57 103 }
DuyLionTran 33:5b90257d2d57 104 break;
DuyLionTran 33:5b90257d2d57 105 case (RELAY2_ADDRESS): if (FP_ReadValue(CurrentAddress) == RelayState2) {
DuyLionTran 33:5b90257d2d57 106 printf("Read back Relay 2 State: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 33:5b90257d2d57 107 }
DuyLionTran 33:5b90257d2d57 108 else {
DuyLionTran 33:5b90257d2d57 109 printf("Write Relay 2 State failed, wrong read back value\r\n");
DuyLionTran 33:5b90257d2d57 110 HAL_FLASH_Lock();
DuyLionTran 33:5b90257d2d57 111 return FAILED;
DuyLionTran 33:5b90257d2d57 112 }
DuyLionTran 33:5b90257d2d57 113 break;
DuyLionTran 34:601effb7b7fe 114 case (RELAY3_ADDRESS): if (FP_ReadValue(CurrentAddress) == RelayState3) {
DuyLionTran 34:601effb7b7fe 115 printf("Read back Relay 3 State: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 34:601effb7b7fe 116 }
DuyLionTran 34:601effb7b7fe 117 else {
DuyLionTran 34:601effb7b7fe 118 printf("Write Relay 3 State failed, wrong read back value\r\n");
DuyLionTran 34:601effb7b7fe 119 HAL_FLASH_Lock();
DuyLionTran 34:601effb7b7fe 120 return FAILED;
DuyLionTran 34:601effb7b7fe 121 }
DuyLionTran 34:601effb7b7fe 122 break;
DuyLionTran 33:5b90257d2d57 123 default: break;
DuyLionTran 33:5b90257d2d57 124 }
DuyLionTran 33:5b90257d2d57 125 CurrentAddress = CurrentAddress + STEP_ADDRESS;
DuyLionTran 32:8226837c56ae 126 }
DuyLionTran 32:8226837c56ae 127 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 128 return PASSED;
DuyLionTran 32:8226837c56ae 129 }
DuyLionTran 32:8226837c56ae 130
DuyLionTran 43:dcde0e66874a 131 int FP_WriteConfigValues(uint8_t Mode ,uint8_t OxyThres, uint8_t TempThres, uint32_t UploadPeriod) {
DuyLionTran 32:8226837c56ae 132 uint8_t CurrentPage = FP_GetPage(CONF_BASE_ADDRESS);
DuyLionTran 33:5b90257d2d57 133 uint32_t CurrentAddress = MODE_ADDRESS;
DuyLionTran 32:8226837c56ae 134 EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
DuyLionTran 32:8226837c56ae 135 EraseInitStruct.Banks = FLASH_BANK_1;
DuyLionTran 32:8226837c56ae 136 EraseInitStruct.Page = CurrentPage;
DuyLionTran 32:8226837c56ae 137 EraseInitStruct.NbPages = 1;
DuyLionTran 32:8226837c56ae 138
DuyLionTran 32:8226837c56ae 139 if (FP_ClearFlags() != PASSED) {
DuyLionTran 32:8226837c56ae 140 return FAILED;
DuyLionTran 32:8226837c56ae 141 }
DuyLionTran 32:8226837c56ae 142 HAL_FLASH_Unlock();
DuyLionTran 32:8226837c56ae 143
DuyLionTran 33:5b90257d2d57 144 if ((FP_ReadValue(MODE_ADDRESS) == Mode) &&
DuyLionTran 43:dcde0e66874a 145 (FP_ReadValue(OXY_THRES_ADDRESS) == OxyThres) &&
DuyLionTran 43:dcde0e66874a 146 (FP_ReadValue(TEMP_THRES_ADDRESS) == TempThres) &&
DuyLionTran 33:5b90257d2d57 147 (FP_ReadValue(UPLOAD_PERIOD_ADDRESS) == UploadPeriod)) {
DuyLionTran 33:5b90257d2d57 148 printf("Configuration values don't change, no need to write\r\n");
DuyLionTran 32:8226837c56ae 149 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 150 return PASSED;
DuyLionTran 32:8226837c56ae 151 }
DuyLionTran 32:8226837c56ae 152 if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) {
DuyLionTran 32:8226837c56ae 153 printf("Erase error, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 32:8226837c56ae 154 }
DuyLionTran 33:5b90257d2d57 155 while (CurrentAddress < (UPLOAD_PERIOD_ADDRESS + STEP_ADDRESS)) {
DuyLionTran 32:8226837c56ae 156 switch (CurrentAddress) {
DuyLionTran 33:5b90257d2d57 157 case (MODE_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, Mode) == HAL_OK) {
DuyLionTran 33:5b90257d2d57 158 printf("Write Mode OK\r\n");
DuyLionTran 33:5b90257d2d57 159 }
DuyLionTran 33:5b90257d2d57 160 else {
DuyLionTran 33:5b90257d2d57 161 printf("Write Mode failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 33:5b90257d2d57 162 }
DuyLionTran 33:5b90257d2d57 163 break;
DuyLionTran 43:dcde0e66874a 164 case (OXY_THRES_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, OxyThres) == HAL_OK) {
DuyLionTran 43:dcde0e66874a 165 printf("Write OxyThres OK\r\n");
DuyLionTran 32:8226837c56ae 166 }
DuyLionTran 32:8226837c56ae 167 else {
DuyLionTran 43:dcde0e66874a 168 printf("Write OxyThres failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 32:8226837c56ae 169 }
DuyLionTran 32:8226837c56ae 170 break;
DuyLionTran 43:dcde0e66874a 171 case (TEMP_THRES_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, TempThres) == HAL_OK) {
DuyLionTran 43:dcde0e66874a 172 printf("Write TempThres OK\r\n");
DuyLionTran 32:8226837c56ae 173 }
DuyLionTran 32:8226837c56ae 174 else {
DuyLionTran 43:dcde0e66874a 175 printf("Write TempThres failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 32:8226837c56ae 176 }
DuyLionTran 32:8226837c56ae 177 break;
DuyLionTran 33:5b90257d2d57 178 case (UPLOAD_PERIOD_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, UploadPeriod) == HAL_OK) {
DuyLionTran 32:8226837c56ae 179 printf("Write UploadPeriod OK\r\n");
DuyLionTran 32:8226837c56ae 180 }
DuyLionTran 32:8226837c56ae 181 else {
DuyLionTran 32:8226837c56ae 182 printf("Write UploadPeriod failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 32:8226837c56ae 183 }
DuyLionTran 32:8226837c56ae 184 break;
DuyLionTran 32:8226837c56ae 185 default: break;
DuyLionTran 32:8226837c56ae 186 }
DuyLionTran 32:8226837c56ae 187 CurrentAddress = CurrentAddress + STEP_ADDRESS;
DuyLionTran 32:8226837c56ae 188 }
DuyLionTran 32:8226837c56ae 189
DuyLionTran 33:5b90257d2d57 190 CurrentAddress = MODE_ADDRESS;
DuyLionTran 33:5b90257d2d57 191 while (CurrentAddress < (UPLOAD_PERIOD_ADDRESS + STEP_ADDRESS)) {
DuyLionTran 32:8226837c56ae 192 switch (CurrentAddress) {
DuyLionTran 33:5b90257d2d57 193 case (MODE_ADDRESS): if (FP_ReadValue(CurrentAddress) == Mode) {
DuyLionTran 33:5b90257d2d57 194 printf("Read back Mode: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 33:5b90257d2d57 195 }
DuyLionTran 33:5b90257d2d57 196 else {
DuyLionTran 33:5b90257d2d57 197 printf("Write Mode failed, wrong read back value\r\n");
DuyLionTran 33:5b90257d2d57 198 HAL_FLASH_Lock();
DuyLionTran 33:5b90257d2d57 199 return FAILED;
DuyLionTran 33:5b90257d2d57 200 }
DuyLionTran 33:5b90257d2d57 201 break;
DuyLionTran 43:dcde0e66874a 202 case (OXY_THRES_ADDRESS): if (FP_ReadValue(CurrentAddress) == OxyThres) {
DuyLionTran 43:dcde0e66874a 203 printf("Read back OxyThres: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 32:8226837c56ae 204 }
DuyLionTran 32:8226837c56ae 205 else {
DuyLionTran 43:dcde0e66874a 206 printf("Write OxyThres failed, wrong read back value\r\n");
DuyLionTran 32:8226837c56ae 207 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 208 return FAILED;
DuyLionTran 32:8226837c56ae 209 }
DuyLionTran 32:8226837c56ae 210 break;
DuyLionTran 43:dcde0e66874a 211 case (TEMP_THRES_ADDRESS): if (FP_ReadValue(CurrentAddress) == TempThres) {
DuyLionTran 43:dcde0e66874a 212 printf("Read back TempThres: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 32:8226837c56ae 213 }
DuyLionTran 32:8226837c56ae 214 else {
DuyLionTran 43:dcde0e66874a 215 printf("Write TempThres failed, wrong read back value\r\n");
DuyLionTran 32:8226837c56ae 216 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 217 return FAILED;
DuyLionTran 32:8226837c56ae 218 }
DuyLionTran 32:8226837c56ae 219 break;
DuyLionTran 33:5b90257d2d57 220 case (UPLOAD_PERIOD_ADDRESS): if (FP_ReadValue(CurrentAddress) == UploadPeriod) {
DuyLionTran 32:8226837c56ae 221 printf("Read back UploadPeriod: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 32:8226837c56ae 222 }
DuyLionTran 32:8226837c56ae 223 else {
DuyLionTran 32:8226837c56ae 224 printf("Write UploadPeriod failed, wrong read back value\r\n");
DuyLionTran 32:8226837c56ae 225 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 226 return FAILED;
DuyLionTran 32:8226837c56ae 227 }
DuyLionTran 32:8226837c56ae 228 break;
DuyLionTran 32:8226837c56ae 229 default: break;
DuyLionTran 32:8226837c56ae 230 }
DuyLionTran 32:8226837c56ae 231 CurrentAddress = CurrentAddress + STEP_ADDRESS;
DuyLionTran 32:8226837c56ae 232 }
DuyLionTran 32:8226837c56ae 233 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 234 return PASSED;
DuyLionTran 38:64e3e9acb49c 235 }
DuyLionTran 38:64e3e9acb49c 236
DuyLionTran 38:64e3e9acb49c 237 int FP_WriteConfigValues(uint32_t SaturationDoVoltage) {
DuyLionTran 38:64e3e9acb49c 238 uint8_t CurrentPage = FP_GetPage(SAT_DO_VOLT_ADDRESS);
DuyLionTran 38:64e3e9acb49c 239 uint32_t CurrentAddress = SAT_DO_VOLT_ADDRESS;
DuyLionTran 38:64e3e9acb49c 240 EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
DuyLionTran 38:64e3e9acb49c 241 EraseInitStruct.Banks = FLASH_BANK_1;
DuyLionTran 38:64e3e9acb49c 242 EraseInitStruct.Page = CurrentPage;
DuyLionTran 38:64e3e9acb49c 243 EraseInitStruct.NbPages = 1;
DuyLionTran 38:64e3e9acb49c 244
DuyLionTran 38:64e3e9acb49c 245 if (FP_ClearFlags() != PASSED) {
DuyLionTran 38:64e3e9acb49c 246 return FAILED;
DuyLionTran 38:64e3e9acb49c 247 }
DuyLionTran 38:64e3e9acb49c 248 HAL_FLASH_Unlock();
DuyLionTran 38:64e3e9acb49c 249
DuyLionTran 38:64e3e9acb49c 250 if ((FP_ReadValue(SAT_DO_VOLT_ADDRESS) == SaturationDoVoltage)) {
DuyLionTran 38:64e3e9acb49c 251 printf("Configuration values doesn't change, no need to write\r\n");
DuyLionTran 38:64e3e9acb49c 252 HAL_FLASH_Lock();
DuyLionTran 38:64e3e9acb49c 253 return PASSED;
DuyLionTran 38:64e3e9acb49c 254 }
DuyLionTran 38:64e3e9acb49c 255 if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) {
DuyLionTran 38:64e3e9acb49c 256 printf("Erase error, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 38:64e3e9acb49c 257 }
DuyLionTran 38:64e3e9acb49c 258 if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, SaturationDoVoltage) == HAL_OK) {
DuyLionTran 38:64e3e9acb49c 259 printf("Write SaturationDoVoltage OK\r\n");
DuyLionTran 38:64e3e9acb49c 260 }
DuyLionTran 38:64e3e9acb49c 261 else {
DuyLionTran 38:64e3e9acb49c 262 printf("Write SaturationDoVoltage failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 38:64e3e9acb49c 263 }
DuyLionTran 38:64e3e9acb49c 264 if (FP_ReadValue(CurrentAddress) == SaturationDoVoltage) {
DuyLionTran 38:64e3e9acb49c 265 printf("Read back SaturationDoVoltage: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 38:64e3e9acb49c 266 }
DuyLionTran 38:64e3e9acb49c 267 else {
DuyLionTran 38:64e3e9acb49c 268 printf("Write SaturationDoVoltage failed, wrong read back value\r\n");
DuyLionTran 38:64e3e9acb49c 269 HAL_FLASH_Lock();
DuyLionTran 38:64e3e9acb49c 270 return FAILED;
DuyLionTran 38:64e3e9acb49c 271 }
DuyLionTran 38:64e3e9acb49c 272 HAL_FLASH_Lock();
DuyLionTran 38:64e3e9acb49c 273 return PASSED;
DuyLionTran 50:5a19fc4b41d9 274 }
DuyLionTran 50:5a19fc4b41d9 275
DuyLionTran 50:5a19fc4b41d9 276 int FP_SetAlarmValues(uint32_t WriteTimeValue, uint8_t SetRelayState1, uint8_t SetRelayState2) {
DuyLionTran 50:5a19fc4b41d9 277 uint8_t CurrentPage = FP_GetPage(ALRM_BASE_ADDRESS);
DuyLionTran 50:5a19fc4b41d9 278 uint32_t CurrentAddress = ALARM_TIME_ADDRESS;
DuyLionTran 50:5a19fc4b41d9 279
DuyLionTran 50:5a19fc4b41d9 280 EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
DuyLionTran 50:5a19fc4b41d9 281 EraseInitStruct.Banks = FLASH_BANK_1;
DuyLionTran 50:5a19fc4b41d9 282 EraseInitStruct.Page = CurrentPage;
DuyLionTran 50:5a19fc4b41d9 283 EraseInitStruct.NbPages = 1;
DuyLionTran 50:5a19fc4b41d9 284
DuyLionTran 50:5a19fc4b41d9 285 if (FP_ClearFlags() != PASSED) {
DuyLionTran 50:5a19fc4b41d9 286 return FAILED;
DuyLionTran 50:5a19fc4b41d9 287 }
DuyLionTran 50:5a19fc4b41d9 288 HAL_FLASH_Unlock();
DuyLionTran 50:5a19fc4b41d9 289
DuyLionTran 50:5a19fc4b41d9 290 if ((FP_ReadValue(ALARM_TIME_ADDRESS) == WriteTimeValue) &&
DuyLionTran 50:5a19fc4b41d9 291 (FP_ReadValue(SET_RELAY_1_ADDRESS) == SetRelayState1) &&
DuyLionTran 50:5a19fc4b41d9 292 (FP_ReadValue(SET_RELAY_2_ADDRESS) == SetRelayState2)) {
DuyLionTran 50:5a19fc4b41d9 293 printf("Relay values don't change, no need to write\r\n");
DuyLionTran 50:5a19fc4b41d9 294 HAL_FLASH_Lock();
DuyLionTran 50:5a19fc4b41d9 295 return PASSED;
DuyLionTran 50:5a19fc4b41d9 296 }
DuyLionTran 50:5a19fc4b41d9 297 if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) {
DuyLionTran 50:5a19fc4b41d9 298 printf("Erase error, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 50:5a19fc4b41d9 299 }
DuyLionTran 50:5a19fc4b41d9 300 while (CurrentAddress < (SET_RELAY_2_ADDRESS + STEP_ADDRESS)) {
DuyLionTran 50:5a19fc4b41d9 301 switch (CurrentAddress) {
DuyLionTran 50:5a19fc4b41d9 302 case (ALARM_TIME_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, WriteTimeValue) == HAL_OK) {
DuyLionTran 50:5a19fc4b41d9 303 printf("Write WriteTimeValue OK\r\n");
DuyLionTran 50:5a19fc4b41d9 304 }
DuyLionTran 50:5a19fc4b41d9 305 else {
DuyLionTran 50:5a19fc4b41d9 306 printf("Write WriteTimeValue failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 50:5a19fc4b41d9 307 }
DuyLionTran 50:5a19fc4b41d9 308 break;
DuyLionTran 50:5a19fc4b41d9 309 case (SET_RELAY_1_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, SetRelayState1) == HAL_OK) {
DuyLionTran 50:5a19fc4b41d9 310 printf("Write SetRelayState1 OK\r\n");
DuyLionTran 50:5a19fc4b41d9 311 }
DuyLionTran 50:5a19fc4b41d9 312 else {
DuyLionTran 50:5a19fc4b41d9 313 printf("Write SetRelayState1 failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 50:5a19fc4b41d9 314 }
DuyLionTran 50:5a19fc4b41d9 315 break;
DuyLionTran 50:5a19fc4b41d9 316 case (SET_RELAY_2_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, SetRelayState2) == HAL_OK) {
DuyLionTran 50:5a19fc4b41d9 317 printf("Write SetRelayState2 OK\r\n");
DuyLionTran 50:5a19fc4b41d9 318 }
DuyLionTran 50:5a19fc4b41d9 319 else {
DuyLionTran 50:5a19fc4b41d9 320 printf("Write SetRelayState2 failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 50:5a19fc4b41d9 321 }
DuyLionTran 50:5a19fc4b41d9 322 break;
DuyLionTran 50:5a19fc4b41d9 323 default: break;
DuyLionTran 50:5a19fc4b41d9 324 }
DuyLionTran 50:5a19fc4b41d9 325 CurrentAddress = CurrentAddress + STEP_ADDRESS;
DuyLionTran 50:5a19fc4b41d9 326 }
DuyLionTran 50:5a19fc4b41d9 327
DuyLionTran 50:5a19fc4b41d9 328 CurrentAddress = ALARM_TIME_ADDRESS;
DuyLionTran 50:5a19fc4b41d9 329 while (CurrentAddress < (SET_RELAY_2_ADDRESS + STEP_ADDRESS)) {
DuyLionTran 50:5a19fc4b41d9 330 switch (CurrentAddress) {
DuyLionTran 50:5a19fc4b41d9 331 case (ALARM_TIME_ADDRESS): if (FP_ReadValue(CurrentAddress) == WriteTimeValue) {
DuyLionTran 50:5a19fc4b41d9 332 printf("Read back WriteTimeValue: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 50:5a19fc4b41d9 333 }
DuyLionTran 50:5a19fc4b41d9 334 else {
DuyLionTran 50:5a19fc4b41d9 335 printf("Write WriteTimeValue failed, wrong read back value\r\n");
DuyLionTran 50:5a19fc4b41d9 336 HAL_FLASH_Lock();
DuyLionTran 50:5a19fc4b41d9 337 return FAILED;
DuyLionTran 50:5a19fc4b41d9 338 }
DuyLionTran 50:5a19fc4b41d9 339 break;
DuyLionTran 50:5a19fc4b41d9 340 case (SET_RELAY_1_ADDRESS): if (FP_ReadValue(CurrentAddress) == SetRelayState1) {
DuyLionTran 50:5a19fc4b41d9 341 printf("Read back SetRelayState1: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 50:5a19fc4b41d9 342 }
DuyLionTran 50:5a19fc4b41d9 343 else {
DuyLionTran 50:5a19fc4b41d9 344 printf("Write SetRelayState1 failed, wrong read back value\r\n");
DuyLionTran 50:5a19fc4b41d9 345 HAL_FLASH_Lock();
DuyLionTran 50:5a19fc4b41d9 346 return FAILED;
DuyLionTran 50:5a19fc4b41d9 347 }
DuyLionTran 50:5a19fc4b41d9 348 break;
DuyLionTran 50:5a19fc4b41d9 349 case (SET_RELAY_2_ADDRESS): if (FP_ReadValue(CurrentAddress) == SetRelayState2) {
DuyLionTran 50:5a19fc4b41d9 350 printf("Read back SetRelayState2: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 50:5a19fc4b41d9 351 }
DuyLionTran 50:5a19fc4b41d9 352 else {
DuyLionTran 50:5a19fc4b41d9 353 printf("Write SetRelayState2 failed, wrong read back value\r\n");
DuyLionTran 50:5a19fc4b41d9 354 HAL_FLASH_Lock();
DuyLionTran 50:5a19fc4b41d9 355 return FAILED;
DuyLionTran 50:5a19fc4b41d9 356 }
DuyLionTran 50:5a19fc4b41d9 357 break;
DuyLionTran 50:5a19fc4b41d9 358 default: break;
DuyLionTran 50:5a19fc4b41d9 359 }
DuyLionTran 50:5a19fc4b41d9 360 CurrentAddress = CurrentAddress + STEP_ADDRESS;
DuyLionTran 50:5a19fc4b41d9 361 }
DuyLionTran 50:5a19fc4b41d9 362 HAL_FLASH_Lock();
DuyLionTran 50:5a19fc4b41d9 363 return PASSED;
DuyLionTran 26:f40cc4d011b0 364 }