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 Feb 14 03:56:34 2018 +0000
Revision:
34:601effb7b7fe
Parent:
33:5b90257d2d57
Child:
35:fc800d35c1ba
* version 2.5 02-14-2017: 3rd relay is added

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 34:601effb7b7fe 80 case (RELAY3_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, RelayState3) == HAL_OK) {
DuyLionTran 34:601effb7b7fe 81 printf("Write Relay 3 State OK\r\n");
DuyLionTran 34:601effb7b7fe 82 }
DuyLionTran 34:601effb7b7fe 83 else {
DuyLionTran 34:601effb7b7fe 84 printf("Write Relay 3 State failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 34:601effb7b7fe 85 }
DuyLionTran 33:5b90257d2d57 86 break;
DuyLionTran 33:5b90257d2d57 87 default: break;
DuyLionTran 33:5b90257d2d57 88 }
DuyLionTran 33:5b90257d2d57 89 CurrentAddress = CurrentAddress + STEP_ADDRESS;
DuyLionTran 32:8226837c56ae 90 }
DuyLionTran 33:5b90257d2d57 91
DuyLionTran 33:5b90257d2d57 92 CurrentAddress = RELAY1_ADDRESS;
DuyLionTran 34:601effb7b7fe 93 while (CurrentAddress < (RELAY3_ADDRESS + STEP_ADDRESS)) {
DuyLionTran 33:5b90257d2d57 94 switch (CurrentAddress) {
DuyLionTran 33:5b90257d2d57 95 case (RELAY1_ADDRESS): if (FP_ReadValue(CurrentAddress) == RelayState1) {
DuyLionTran 33:5b90257d2d57 96 printf("Read back Relay 1 State: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 33:5b90257d2d57 97 }
DuyLionTran 33:5b90257d2d57 98 else {
DuyLionTran 33:5b90257d2d57 99 printf("Write Relay 1 State failed, wrong read back value\r\n");
DuyLionTran 33:5b90257d2d57 100 HAL_FLASH_Lock();
DuyLionTran 33:5b90257d2d57 101 return FAILED;
DuyLionTran 33:5b90257d2d57 102 }
DuyLionTran 33:5b90257d2d57 103 break;
DuyLionTran 33:5b90257d2d57 104 case (RELAY2_ADDRESS): if (FP_ReadValue(CurrentAddress) == RelayState2) {
DuyLionTran 33:5b90257d2d57 105 printf("Read back Relay 2 State: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 33:5b90257d2d57 106 }
DuyLionTran 33:5b90257d2d57 107 else {
DuyLionTran 33:5b90257d2d57 108 printf("Write Relay 2 State failed, wrong read back value\r\n");
DuyLionTran 33:5b90257d2d57 109 HAL_FLASH_Lock();
DuyLionTran 33:5b90257d2d57 110 return FAILED;
DuyLionTran 33:5b90257d2d57 111 }
DuyLionTran 33:5b90257d2d57 112 break;
DuyLionTran 34:601effb7b7fe 113 case (RELAY3_ADDRESS): if (FP_ReadValue(CurrentAddress) == RelayState3) {
DuyLionTran 34:601effb7b7fe 114 printf("Read back Relay 3 State: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 34:601effb7b7fe 115 }
DuyLionTran 34:601effb7b7fe 116 else {
DuyLionTran 34:601effb7b7fe 117 printf("Write Relay 3 State failed, wrong read back value\r\n");
DuyLionTran 34:601effb7b7fe 118 HAL_FLASH_Lock();
DuyLionTran 34:601effb7b7fe 119 return FAILED;
DuyLionTran 34:601effb7b7fe 120 }
DuyLionTran 34:601effb7b7fe 121 break;
DuyLionTran 33:5b90257d2d57 122 default: break;
DuyLionTran 33:5b90257d2d57 123 }
DuyLionTran 33:5b90257d2d57 124 CurrentAddress = CurrentAddress + STEP_ADDRESS;
DuyLionTran 32:8226837c56ae 125 }
DuyLionTran 32:8226837c56ae 126 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 127 return PASSED;
DuyLionTran 32:8226837c56ae 128 }
DuyLionTran 32:8226837c56ae 129
DuyLionTran 33:5b90257d2d57 130 int FP_WriteConfigValues(uint8_t Mode, uint8_t MinOxi, uint8_t MaxOxi, uint32_t UploadPeriod) {
DuyLionTran 32:8226837c56ae 131 uint8_t CurrentPage = FP_GetPage(CONF_BASE_ADDRESS);
DuyLionTran 33:5b90257d2d57 132 uint32_t CurrentAddress = MODE_ADDRESS;
DuyLionTran 32:8226837c56ae 133 EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
DuyLionTran 32:8226837c56ae 134 EraseInitStruct.Banks = FLASH_BANK_1;
DuyLionTran 32:8226837c56ae 135 EraseInitStruct.Page = CurrentPage;
DuyLionTran 32:8226837c56ae 136 EraseInitStruct.NbPages = 1;
DuyLionTran 32:8226837c56ae 137
DuyLionTran 32:8226837c56ae 138 if (FP_ClearFlags() != PASSED) {
DuyLionTran 32:8226837c56ae 139 return FAILED;
DuyLionTran 32:8226837c56ae 140 }
DuyLionTran 32:8226837c56ae 141 HAL_FLASH_Unlock();
DuyLionTran 32:8226837c56ae 142
DuyLionTran 33:5b90257d2d57 143 if ((FP_ReadValue(MODE_ADDRESS) == Mode) &&
DuyLionTran 33:5b90257d2d57 144 (FP_ReadValue(MIN_OXI_ADDRESS) == MinOxi) &&
DuyLionTran 32:8226837c56ae 145 (FP_ReadValue(MAX_OXI_ADDRESS) == MaxOxi) &&
DuyLionTran 33:5b90257d2d57 146 (FP_ReadValue(UPLOAD_PERIOD_ADDRESS) == UploadPeriod)) {
DuyLionTran 33:5b90257d2d57 147 printf("Configuration values don't change, no need to write\r\n");
DuyLionTran 32:8226837c56ae 148 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 149 return PASSED;
DuyLionTran 32:8226837c56ae 150 }
DuyLionTran 32:8226837c56ae 151 if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) {
DuyLionTran 32:8226837c56ae 152 printf("Erase error, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 32:8226837c56ae 153 }
DuyLionTran 33:5b90257d2d57 154 while (CurrentAddress < (UPLOAD_PERIOD_ADDRESS + STEP_ADDRESS)) {
DuyLionTran 32:8226837c56ae 155 switch (CurrentAddress) {
DuyLionTran 33:5b90257d2d57 156 case (MODE_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, Mode) == HAL_OK) {
DuyLionTran 33:5b90257d2d57 157 printf("Write Mode OK\r\n");
DuyLionTran 33:5b90257d2d57 158 }
DuyLionTran 33:5b90257d2d57 159 else {
DuyLionTran 33:5b90257d2d57 160 printf("Write Mode failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 33:5b90257d2d57 161 }
DuyLionTran 33:5b90257d2d57 162 break;
DuyLionTran 32:8226837c56ae 163 case (MIN_OXI_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, MinOxi) == HAL_OK) {
DuyLionTran 32:8226837c56ae 164 printf("Write MinOxi OK\r\n");
DuyLionTran 32:8226837c56ae 165 }
DuyLionTran 32:8226837c56ae 166 else {
DuyLionTran 32:8226837c56ae 167 printf("Write MinOxi failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 32:8226837c56ae 168 }
DuyLionTran 32:8226837c56ae 169 break;
DuyLionTran 32:8226837c56ae 170 case (MAX_OXI_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, MaxOxi) == HAL_OK) {
DuyLionTran 32:8226837c56ae 171 printf("Write MaxOxi OK\r\n");
DuyLionTran 32:8226837c56ae 172 }
DuyLionTran 32:8226837c56ae 173 else {
DuyLionTran 32:8226837c56ae 174 printf("Write MaxOxi failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 32:8226837c56ae 175 }
DuyLionTran 32:8226837c56ae 176 break;
DuyLionTran 33:5b90257d2d57 177 case (UPLOAD_PERIOD_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, UploadPeriod) == HAL_OK) {
DuyLionTran 32:8226837c56ae 178 printf("Write UploadPeriod OK\r\n");
DuyLionTran 32:8226837c56ae 179 }
DuyLionTran 32:8226837c56ae 180 else {
DuyLionTran 32:8226837c56ae 181 printf("Write UploadPeriod failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 32:8226837c56ae 182 }
DuyLionTran 32:8226837c56ae 183 break;
DuyLionTran 32:8226837c56ae 184 default: break;
DuyLionTran 32:8226837c56ae 185 }
DuyLionTran 32:8226837c56ae 186 CurrentAddress = CurrentAddress + STEP_ADDRESS;
DuyLionTran 32:8226837c56ae 187 }
DuyLionTran 32:8226837c56ae 188
DuyLionTran 33:5b90257d2d57 189 CurrentAddress = MODE_ADDRESS;
DuyLionTran 33:5b90257d2d57 190 while (CurrentAddress < (UPLOAD_PERIOD_ADDRESS + STEP_ADDRESS)) {
DuyLionTran 32:8226837c56ae 191 switch (CurrentAddress) {
DuyLionTran 33:5b90257d2d57 192 case (MODE_ADDRESS): if (FP_ReadValue(CurrentAddress) == Mode) {
DuyLionTran 33:5b90257d2d57 193 printf("Read back Mode: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 33:5b90257d2d57 194 }
DuyLionTran 33:5b90257d2d57 195 else {
DuyLionTran 33:5b90257d2d57 196 printf("Write Mode failed, wrong read back value\r\n");
DuyLionTran 33:5b90257d2d57 197 HAL_FLASH_Lock();
DuyLionTran 33:5b90257d2d57 198 return FAILED;
DuyLionTran 33:5b90257d2d57 199 }
DuyLionTran 33:5b90257d2d57 200 break;
DuyLionTran 32:8226837c56ae 201 case (MIN_OXI_ADDRESS): if (FP_ReadValue(CurrentAddress) == MinOxi) {
DuyLionTran 32:8226837c56ae 202 printf("Read back MinOxi: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 32:8226837c56ae 203 }
DuyLionTran 32:8226837c56ae 204 else {
DuyLionTran 32:8226837c56ae 205 printf("Write MinOxi failed, wrong read back value\r\n");
DuyLionTran 32:8226837c56ae 206 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 207 return FAILED;
DuyLionTran 32:8226837c56ae 208 }
DuyLionTran 32:8226837c56ae 209 break;
DuyLionTran 32:8226837c56ae 210 case (MAX_OXI_ADDRESS): if (FP_ReadValue(CurrentAddress) == MaxOxi) {
DuyLionTran 32:8226837c56ae 211 printf("Read back MaxOxi: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 32:8226837c56ae 212 }
DuyLionTran 32:8226837c56ae 213 else {
DuyLionTran 32:8226837c56ae 214 printf("Write MaxOxi failed, wrong read back value\r\n");
DuyLionTran 32:8226837c56ae 215 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 216 return FAILED;
DuyLionTran 32:8226837c56ae 217 }
DuyLionTran 32:8226837c56ae 218 break;
DuyLionTran 33:5b90257d2d57 219 case (UPLOAD_PERIOD_ADDRESS): if (FP_ReadValue(CurrentAddress) == UploadPeriod) {
DuyLionTran 32:8226837c56ae 220 printf("Read back UploadPeriod: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 32:8226837c56ae 221 }
DuyLionTran 32:8226837c56ae 222 else {
DuyLionTran 32:8226837c56ae 223 printf("Write UploadPeriod failed, wrong read back value\r\n");
DuyLionTran 32:8226837c56ae 224 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 225 return FAILED;
DuyLionTran 32:8226837c56ae 226 }
DuyLionTran 32:8226837c56ae 227 break;
DuyLionTran 32:8226837c56ae 228 default: break;
DuyLionTran 32:8226837c56ae 229 }
DuyLionTran 32:8226837c56ae 230 CurrentAddress = CurrentAddress + STEP_ADDRESS;
DuyLionTran 32:8226837c56ae 231 }
DuyLionTran 32:8226837c56ae 232 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 233 return PASSED;
DuyLionTran 26:f40cc4d011b0 234 }