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:
Mon Jan 08 18:07:56 2018 +0000
Revision:
32:8226837c56ae
Parent:
26:f40cc4d011b0
Child:
33:5b90257d2d57
version 2.1;

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 32:8226837c56ae 41 int FP_WriteMode(uint32_t WriteModeValue) {
DuyLionTran 32:8226837c56ae 42 uint8_t CurrentPage = FP_GetPage(MODE_BASE_ADDRESS);
DuyLionTran 32:8226837c56ae 43 uint32_t CurrentAddress = (MODE_BASE_ADDRESS + STEP_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 32:8226837c56ae 55 if (FP_ReadValue(CurrentAddress) == WriteModeValue) {
DuyLionTran 32:8226837c56ae 56 printf("Value does not change, no need to write\r\n");
DuyLionTran 32:8226837c56ae 57 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 58 return PASSED;
DuyLionTran 32:8226837c56ae 59 }
DuyLionTran 32:8226837c56ae 60 if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) {
DuyLionTran 32:8226837c56ae 61 printf("Erase error, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 32:8226837c56ae 62 }
DuyLionTran 32:8226837c56ae 63 if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, WriteModeValue) == HAL_OK) {
DuyLionTran 32:8226837c56ae 64 printf("Write OK\r\n");
DuyLionTran 32:8226837c56ae 65 }
DuyLionTran 32:8226837c56ae 66 else {
DuyLionTran 32:8226837c56ae 67 printf("Write failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 32:8226837c56ae 68 }
DuyLionTran 32:8226837c56ae 69 uint32_t readBack = FP_ReadValue(CurrentAddress);
DuyLionTran 32:8226837c56ae 70 printf("Read back: %d\r\n", readBack);
DuyLionTran 32:8226837c56ae 71 if (readBack != WriteModeValue) {
DuyLionTran 32:8226837c56ae 72 printf("Write failed, wrong read back value\r\n");
DuyLionTran 32:8226837c56ae 73 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 74 return FAILED;
DuyLionTran 32:8226837c56ae 75 }
DuyLionTran 32:8226837c56ae 76 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 77 return PASSED;
DuyLionTran 32:8226837c56ae 78 }
DuyLionTran 32:8226837c56ae 79
DuyLionTran 32:8226837c56ae 80 int FP_WriteConfigValues(uint8_t MinOxi, uint8_t MaxOxi, uint32_t UploadPeriod) {
DuyLionTran 32:8226837c56ae 81 uint8_t CurrentPage = FP_GetPage(CONF_BASE_ADDRESS);
DuyLionTran 32:8226837c56ae 82 uint32_t CurrentAddress = MIN_OXI_ADDRESS;
DuyLionTran 32:8226837c56ae 83 EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
DuyLionTran 32:8226837c56ae 84 EraseInitStruct.Banks = FLASH_BANK_1;
DuyLionTran 32:8226837c56ae 85 EraseInitStruct.Page = CurrentPage;
DuyLionTran 32:8226837c56ae 86 EraseInitStruct.NbPages = 1;
DuyLionTran 32:8226837c56ae 87
DuyLionTran 32:8226837c56ae 88 if (FP_ClearFlags() != PASSED) {
DuyLionTran 32:8226837c56ae 89 return FAILED;
DuyLionTran 32:8226837c56ae 90 }
DuyLionTran 32:8226837c56ae 91 HAL_FLASH_Unlock();
DuyLionTran 32:8226837c56ae 92
DuyLionTran 32:8226837c56ae 93 if ((FP_ReadValue(MIN_OXI_ADDRESS) == MinOxi) &&
DuyLionTran 32:8226837c56ae 94 (FP_ReadValue(MAX_OXI_ADDRESS) == MaxOxi) &&
DuyLionTran 32:8226837c56ae 95 (FP_ReadValue(UPLOAD_PERIOD_ARRESS) == UploadPeriod)) {
DuyLionTran 32:8226837c56ae 96 printf("Value does not change, no need to write\r\n");
DuyLionTran 32:8226837c56ae 97 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 98 return PASSED;
DuyLionTran 32:8226837c56ae 99 }
DuyLionTran 32:8226837c56ae 100 if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK) {
DuyLionTran 32:8226837c56ae 101 printf("Erase error, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 32:8226837c56ae 102 }
DuyLionTran 32:8226837c56ae 103 while (CurrentAddress < (UPLOAD_PERIOD_ARRESS + STEP_ADDRESS)) {
DuyLionTran 32:8226837c56ae 104 switch (CurrentAddress) {
DuyLionTran 32:8226837c56ae 105 case (MIN_OXI_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, MinOxi) == HAL_OK) {
DuyLionTran 32:8226837c56ae 106 printf("Write MinOxi OK\r\n");
DuyLionTran 32:8226837c56ae 107 }
DuyLionTran 32:8226837c56ae 108 else {
DuyLionTran 32:8226837c56ae 109 printf("Write MinOxi failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 32:8226837c56ae 110 }
DuyLionTran 32:8226837c56ae 111 break;
DuyLionTran 32:8226837c56ae 112 case (MAX_OXI_ADDRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, MaxOxi) == HAL_OK) {
DuyLionTran 32:8226837c56ae 113 printf("Write MaxOxi OK\r\n");
DuyLionTran 32:8226837c56ae 114 }
DuyLionTran 32:8226837c56ae 115 else {
DuyLionTran 32:8226837c56ae 116 printf("Write MaxOxi failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 32:8226837c56ae 117 }
DuyLionTran 32:8226837c56ae 118 break;
DuyLionTran 32:8226837c56ae 119 case (UPLOAD_PERIOD_ARRESS): if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, CurrentAddress, UploadPeriod) == HAL_OK) {
DuyLionTran 32:8226837c56ae 120 printf("Write UploadPeriod OK\r\n");
DuyLionTran 32:8226837c56ae 121 }
DuyLionTran 32:8226837c56ae 122 else {
DuyLionTran 32:8226837c56ae 123 printf("Write UploadPeriod failed, error num %d\r\n", HAL_FLASH_GetError());
DuyLionTran 32:8226837c56ae 124 }
DuyLionTran 32:8226837c56ae 125 break;
DuyLionTran 32:8226837c56ae 126 default: break;
DuyLionTran 32:8226837c56ae 127 }
DuyLionTran 32:8226837c56ae 128 CurrentAddress = CurrentAddress + STEP_ADDRESS;
DuyLionTran 32:8226837c56ae 129 }
DuyLionTran 32:8226837c56ae 130
DuyLionTran 32:8226837c56ae 131 CurrentAddress = MIN_OXI_ADDRESS;
DuyLionTran 32:8226837c56ae 132 while (CurrentAddress < (UPLOAD_PERIOD_ARRESS + STEP_ADDRESS)) {
DuyLionTran 32:8226837c56ae 133 switch (CurrentAddress) {
DuyLionTran 32:8226837c56ae 134 case (MIN_OXI_ADDRESS): if (FP_ReadValue(CurrentAddress) == MinOxi) {
DuyLionTran 32:8226837c56ae 135 printf("Read back MinOxi: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 32:8226837c56ae 136 }
DuyLionTran 32:8226837c56ae 137 else {
DuyLionTran 32:8226837c56ae 138 printf("Write MinOxi failed, wrong read back value\r\n");
DuyLionTran 32:8226837c56ae 139 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 140 return FAILED;
DuyLionTran 32:8226837c56ae 141 }
DuyLionTran 32:8226837c56ae 142 break;
DuyLionTran 32:8226837c56ae 143 case (MAX_OXI_ADDRESS): if (FP_ReadValue(CurrentAddress) == MaxOxi) {
DuyLionTran 32:8226837c56ae 144 printf("Read back MaxOxi: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 32:8226837c56ae 145 }
DuyLionTran 32:8226837c56ae 146 else {
DuyLionTran 32:8226837c56ae 147 printf("Write MaxOxi failed, wrong read back value\r\n");
DuyLionTran 32:8226837c56ae 148 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 149 return FAILED;
DuyLionTran 32:8226837c56ae 150 }
DuyLionTran 32:8226837c56ae 151 break;
DuyLionTran 32:8226837c56ae 152 case (UPLOAD_PERIOD_ARRESS): if (FP_ReadValue(CurrentAddress) == UploadPeriod) {
DuyLionTran 32:8226837c56ae 153 printf("Read back UploadPeriod: %d\r\n", FP_ReadValue(CurrentAddress));
DuyLionTran 32:8226837c56ae 154 }
DuyLionTran 32:8226837c56ae 155 else {
DuyLionTran 32:8226837c56ae 156 printf("Write UploadPeriod failed, wrong read back value\r\n");
DuyLionTran 32:8226837c56ae 157 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 158 return FAILED;
DuyLionTran 32:8226837c56ae 159 }
DuyLionTran 32:8226837c56ae 160 break;
DuyLionTran 32:8226837c56ae 161 default: break;
DuyLionTran 32:8226837c56ae 162 }
DuyLionTran 32:8226837c56ae 163 CurrentAddress = CurrentAddress + STEP_ADDRESS;
DuyLionTran 32:8226837c56ae 164 }
DuyLionTran 32:8226837c56ae 165 HAL_FLASH_Lock();
DuyLionTran 32:8226837c56ae 166 return PASSED;
DuyLionTran 26:f40cc4d011b0 167 }