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 Jan 21 13:04:06 2018 +0000
Revision:
33:5b90257d2d57
Parent:
32:8226837c56ae
Child:
34:601effb7b7fe
version 2.3

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