Mercurial > public > ostc4
comparison OtherSources/firmwareEraseProgram.c @ 5:e65d01b6a17e
MOVE files for other applications
| author | JeanDo |
|---|---|
| date | Fri, 15 Dec 2017 01:45:20 +0100 |
| parents | |
| children | 7801c5d8a562 |
comparison
equal
deleted
inserted
replaced
| 4:89a87ddc2e47 | 5:e65d01b6a17e |
|---|---|
| 1 /** | |
| 2 ****************************************************************************** | |
| 3 * @file firmwareEraseProgram.c | |
| 4 * @author heinrichs/weikamp, Christian Weikamp | |
| 5 * @version V0.0.1 | |
| 6 * @date 05-May-2015 | |
| 7 * @version V0.0.1 | |
| 8 * @since 05-May-2015 | |
| 9 * @brief erase and program the STM32F4xx internal FLASH memory | |
| 10 * | |
| 11 @verbatim | |
| 12 ============================================================================== | |
| 13 ##### How to use ##### | |
| 14 ============================================================================== | |
| 15 ADDR_FLASH_SECTOR_0 to/with ADDR_FLASH_SECTOR_5 (256KB) is used for this bootloader | |
| 16 | |
| 17 ADDR_FLASH_SECTOR_23 is blocked and used for Font T48 and image_heinrichs_weikamp | |
| 18 Font T24 for button text is not blocked / protected | |
| 19 other fonts should not be used here | |
| 20 | |
| 21 | |
| 22 ============================================================================== | |
| 23 ##### From AN2557 ##### | |
| 24 STM32F10xxx In-Application programming CD00161640.pdf 2010 | |
| 25 ============================================================================== | |
| 26 User program conditions | |
| 27 The user application to be loaded into the Flash memory using IAP should be built with | |
| 28 these configuration settings: | |
| 29 1. Set the program load address at 0x08003000, using your toolchain linker file | |
| 30 2. Relocate the vector table at address 0x08003000, using the | |
| 31 "NVIC_SetVectorTable"function or the VECT_TAB_OFFSET definition inside the | |
| 32 "system_stm32f10x.c" | |
| 33 | |
| 34 can be found here system_stm32f4xx.c | |
| 35 | |
| 36 | |
| 37 @endverbatim | |
| 38 ****************************************************************************** | |
| 39 * @attention | |
| 40 * | |
| 41 * <h2><center>© COPYRIGHT(c) 2015 heinrichs weikamp</center></h2> | |
| 42 * | |
| 43 ****************************************************************************** | |
| 44 */ | |
| 45 | |
| 46 /* Includes ------------------------------------------------------------------*/ | |
| 47 #include "stm32f4xx_hal.h" | |
| 48 #include "stdio.h" | |
| 49 #include "firmwareEraseProgram.h" | |
| 50 #include "settings.h" // to access SHardwareData | |
| 51 | |
| 52 /* Exported variables --------------------------------------------------------*/ | |
| 53 | |
| 54 /* Private types -------------------------------------------------------------*/ | |
| 55 | |
| 56 /* Base address of the Flash sectors Bank 1 */ | |
| 57 #define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 Kbytes */ | |
| 58 #define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbytes */ | |
| 59 #define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 Kbytes */ | |
| 60 #define ADDR_FLASH_SECTOR_3 ((uint32_t)0x0800C000) /* Base @ of Sector 3, 16 Kbytes */ | |
| 61 #define ADDR_FLASH_SECTOR_4 ((uint32_t)0x08010000) /* Base @ of Sector 4, 64 Kbytes */ | |
| 62 #define ADDR_FLASH_SECTOR_5 ((uint32_t)0x08020000) /* Base @ of Sector 5, 128 Kbytes */ | |
| 63 #define ADDR_FLASH_SECTOR_6 ((uint32_t)0x08040000) /* Base @ of Sector 6, 128 Kbytes */ | |
| 64 #define ADDR_FLASH_SECTOR_7 ((uint32_t)0x08060000) /* Base @ of Sector 7, 128 Kbytes */ | |
| 65 #define ADDR_FLASH_SECTOR_8 ((uint32_t)0x08080000) /* Base @ of Sector 8, 128 Kbytes */ | |
| 66 #define ADDR_FLASH_SECTOR_9 ((uint32_t)0x080A0000) /* Base @ of Sector 9, 128 Kbytes */ | |
| 67 #define ADDR_FLASH_SECTOR_10 ((uint32_t)0x080C0000) /* Base @ of Sector 10, 128 Kbytes */ | |
| 68 #define ADDR_FLASH_SECTOR_11 ((uint32_t)0x080E0000) /* Base @ of Sector 11, 128 Kbytes */ | |
| 69 | |
| 70 /* Base address of the Flash sectors Bank 2 */ | |
| 71 #define ADDR_FLASH_SECTOR_12 ((uint32_t)0x08100000) /* Base @ of Sector 0, 16 Kbytes */ | |
| 72 #define ADDR_FLASH_SECTOR_13 ((uint32_t)0x08104000) /* Base @ of Sector 1, 16 Kbytes */ | |
| 73 #define ADDR_FLASH_SECTOR_14 ((uint32_t)0x08108000) /* Base @ of Sector 2, 16 Kbytes */ | |
| 74 #define ADDR_FLASH_SECTOR_15 ((uint32_t)0x0810C000) /* Base @ of Sector 3, 16 Kbytes */ | |
| 75 #define ADDR_FLASH_SECTOR_16 ((uint32_t)0x08110000) /* Base @ of Sector 4, 64 Kbytes */ | |
| 76 #define ADDR_FLASH_SECTOR_17 ((uint32_t)0x08120000) /* Base @ of Sector 5, 128 Kbytes */ | |
| 77 #define ADDR_FLASH_SECTOR_18 ((uint32_t)0x08140000) /* Base @ of Sector 6, 128 Kbytes */ | |
| 78 #define ADDR_FLASH_SECTOR_19 ((uint32_t)0x08160000) /* Base @ of Sector 7, 128 Kbytes */ | |
| 79 #define ADDR_FLASH_SECTOR_20 ((uint32_t)0x08180000) /* Base @ of Sector 8, 128 Kbytes */ | |
| 80 #define ADDR_FLASH_SECTOR_21 ((uint32_t)0x081A0000) /* Base @ of Sector 9, 128 Kbytes */ | |
| 81 #define ADDR_FLASH_SECTOR_22 ((uint32_t)0x081C0000) /* Base @ of Sector 10, 128 Kbytes */ | |
| 82 #define ADDR_FLASH_SECTOR_23 ((uint32_t)0x081E0000) /* Base @ of Sector 11, 128 Kbytes */ | |
| 83 | |
| 84 #define SECTOR_SIZE_128KB ((uint32_t)0x00020000) | |
| 85 | |
| 86 #define FLASH_FW_START_ADDR ADDR_FLASH_SECTOR_6 | |
| 87 #define FLASH_FW_END_ADDR (ADDR_FLASH_SECTOR_12 - 1) | |
| 88 | |
| 89 #define FLASH_FW2_START_ADDR ADDR_FLASH_SECTOR_12 | |
| 90 #define FLASH_FW2_END_ADDR (ADDR_FLASH_SECTOR_22 + SECTOR_SIZE_128KB - 1) | |
| 91 | |
| 92 /* Private variables ---------------------------------------------------------*/ | |
| 93 | |
| 94 static FLASH_EraseInitTypeDef EraseInitStruct; /*Variable used for Erase procedure*/ | |
| 95 | |
| 96 uint32_t FirstSector = 0, NbOfSectors = 0, Address = 0; | |
| 97 uint32_t SectorError = 0; | |
| 98 __IO uint32_t data32 = 0 , MemoryProgramStatus = 0; | |
| 99 | |
| 100 | |
| 101 | |
| 102 /* Private function prototypes -----------------------------------------------*/ | |
| 103 //static void firmware_Error_Handler(HAL_StatusTypeDef reason); | |
| 104 static uint32_t GetSector(uint32_t Address); | |
| 105 uint8_t hardware_programm_sub(uint8_t *buffer64, uint8_t length, uint32_t startAddress); | |
| 106 | |
| 107 /* Exported functions --------------------------------------------------------*/ | |
| 108 | |
| 109 const SHardwareData* hardwareDataGetPointer(void) | |
| 110 { | |
| 111 return (SHardwareData*)HARDWAREDATA_ADDRESS; | |
| 112 } | |
| 113 | |
| 114 uint8_t hardware_programmPrimaryBluetoothNameSet(void) | |
| 115 { | |
| 116 uint8_t data = 0xF0; | |
| 117 return hardware_programm_sub(&data, 1, HARDWAREDATA_ADDRESS + 7); | |
| 118 } | |
| 119 | |
| 120 | |
| 121 uint8_t hardware_programmSecondaryBluetoothNameSet(void) | |
| 122 { | |
| 123 uint8_t data = 0xF0; | |
| 124 return hardware_programm_sub(&data, 1, HARDWAREDATA_ADDRESS + 52 + 7); | |
| 125 } | |
| 126 | |
| 127 | |
| 128 uint8_t hardware_programmProductionData(uint8_t *buffer52) | |
| 129 { | |
| 130 buffer52[7] = 0xFF;// production_bluetooth_name_set | |
| 131 return hardware_programm_sub(buffer52, 52, HARDWAREDATA_ADDRESS);// check base_bootloader.c of OSTC4bootloader code and settings.h | |
| 132 } | |
| 133 | |
| 134 | |
| 135 uint8_t hardware_programmSecondarySerial(uint8_t *buffer12) | |
| 136 { | |
| 137 buffer12[7] = 0xFF;// secondary_bluetooth_name_set | |
| 138 return hardware_programm_sub(buffer12, 12, HARDWAREDATA_ADDRESS + 52); | |
| 139 } | |
| 140 | |
| 141 | |
| 142 uint8_t hardware_programm_sub(uint8_t *buffer, uint8_t length, uint32_t startAddress) | |
| 143 { | |
| 144 HAL_StatusTypeDef answer; | |
| 145 | |
| 146 uint32_t ptr = 0; | |
| 147 uint8_t data8; | |
| 148 | |
| 149 // test empty | |
| 150 Address = startAddress; | |
| 151 for(int i=0;i<length;i++) | |
| 152 { | |
| 153 if((*(uint8_t *)Address != 0xFF) && (buffer[i] != 0xFF)) | |
| 154 return 0xE0; | |
| 155 Address = Address + 1; | |
| 156 } | |
| 157 | |
| 158 // start programming | |
| 159 HAL_FLASH_Unlock(); | |
| 160 | |
| 161 Address = startAddress; | |
| 162 ptr = 0; | |
| 163 answer = HAL_OK; | |
| 164 while (ptr < length) | |
| 165 { | |
| 166 if(buffer[ptr] != 0xFF) | |
| 167 { | |
| 168 answer = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, Address, buffer[ptr]); | |
| 169 } | |
| 170 if (answer == HAL_OK) | |
| 171 { | |
| 172 Address = Address + 1; | |
| 173 ptr++; | |
| 174 } | |
| 175 else | |
| 176 { | |
| 177 HAL_FLASH_Lock(); | |
| 178 return answer; | |
| 179 } | |
| 180 } | |
| 181 HAL_FLASH_Lock(); | |
| 182 | |
| 183 /* Check if the programmed data is OK | |
| 184 MemoryProgramStatus = 0: data programmed correctly | |
| 185 MemoryProgramStatus != 0: number of words not programmed correctly ******/ | |
| 186 Address = startAddress; // check base_bootloader.c of OSTC4bootloader code | |
| 187 MemoryProgramStatus = 0x0; | |
| 188 | |
| 189 ptr = 0; | |
| 190 while(ptr < length) | |
| 191 { | |
| 192 data8 = *(__IO uint8_t*)Address; | |
| 193 | |
| 194 if((buffer[ptr] != 0xFF) && (data8 != buffer[ptr])) | |
| 195 { | |
| 196 MemoryProgramStatus++; | |
| 197 } | |
| 198 | |
| 199 Address = Address + 1; | |
| 200 ptr++; | |
| 201 } | |
| 202 | |
| 203 /* Check if there is an issue to program data */ | |
| 204 if (MemoryProgramStatus == 0) | |
| 205 { | |
| 206 return HAL_OK; | |
| 207 } | |
| 208 else | |
| 209 { | |
| 210 return 0xEE; | |
| 211 } | |
| 212 } | |
| 213 | |
| 214 | |
| 215 uint8_t firmware2_variable_upperpart_eraseFlashMemory(uint32_t length, uint32_t offset) | |
| 216 { | |
| 217 uint32_t startAddress, endAddress; | |
| 218 | |
| 219 // HAL_StatusTypeDef answer; | |
| 220 HAL_FLASH_Unlock(); | |
| 221 | |
| 222 startAddress = FLASH_FW2_START_ADDR + offset; | |
| 223 endAddress = startAddress + length; | |
| 224 | |
| 225 if(endAddress > FLASH_FW2_END_ADDR) | |
| 226 endAddress = FLASH_FW2_END_ADDR; | |
| 227 | |
| 228 FirstSector = GetSector(startAddress); | |
| 229 NbOfSectors = GetSector(endAddress) - FirstSector + 1; | |
| 230 | |
| 231 EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; | |
| 232 EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_1; | |
| 233 EraseInitStruct.Sector = FirstSector; | |
| 234 EraseInitStruct.NbSectors = NbOfSectors; | |
| 235 | |
| 236 return HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError); | |
| 237 } | |
| 238 | |
| 239 | |
| 240 uint8_t firmware2_variable_upperpart_programFlashMemory(uint32_t length, uint32_t offset, uint8_t *pBuffer1, uint32_t pBuffer1Size, uint8_t *pBuffer2) | |
| 241 { | |
| 242 HAL_StatusTypeDef answer; | |
| 243 uint32_t ptr = 0; | |
| 244 uint32_t length1, length2; | |
| 245 | |
| 246 if((pBuffer2) && (length > pBuffer1Size)) | |
| 247 { | |
| 248 length1 = pBuffer1Size; | |
| 249 length2 = length - length1; | |
| 250 } | |
| 251 else | |
| 252 { | |
| 253 length1 = length; | |
| 254 length2 = 0; | |
| 255 } | |
| 256 | |
| 257 Address = FLASH_FW2_START_ADDR + offset; | |
| 258 | |
| 259 ptr = 0; | |
| 260 while ((Address <= FLASH_FW2_END_ADDR) && (ptr < length1)) | |
| 261 { | |
| 262 answer = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, Address, pBuffer1[ptr]); | |
| 263 if (answer == HAL_OK) | |
| 264 { | |
| 265 Address = Address + 1; | |
| 266 ptr++; | |
| 267 } | |
| 268 else | |
| 269 { | |
| 270 return answer; | |
| 271 } | |
| 272 } | |
| 273 ptr = 0; | |
| 274 while ((Address <= FLASH_FW2_END_ADDR) && (ptr < length2)) | |
| 275 { | |
| 276 answer = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, Address, pBuffer2[ptr]); | |
| 277 if (answer == HAL_OK) | |
| 278 { | |
| 279 Address = Address + 1; | |
| 280 ptr++; | |
| 281 } | |
| 282 else | |
| 283 { | |
| 284 return answer; | |
| 285 } | |
| 286 } | |
| 287 HAL_FLASH_Lock(); | |
| 288 | |
| 289 Address = FLASH_FW2_START_ADDR + offset;; | |
| 290 MemoryProgramStatus = 0x0; | |
| 291 | |
| 292 ptr = 0; | |
| 293 while ((Address <= FLASH_FW2_END_ADDR) && (ptr < length1)) | |
| 294 { | |
| 295 data32 = *(__IO uint8_t*)Address; | |
| 296 | |
| 297 if (data32 != pBuffer1[ptr]) | |
| 298 { | |
| 299 MemoryProgramStatus++; | |
| 300 } | |
| 301 | |
| 302 Address = Address + 1; | |
| 303 ptr++; | |
| 304 } | |
| 305 ptr = 0; | |
| 306 while ((Address <= FLASH_FW2_END_ADDR) && (ptr < length2)) | |
| 307 { | |
| 308 data32 = *(__IO uint8_t*)Address; | |
| 309 | |
| 310 if (data32 != pBuffer2[ptr]) | |
| 311 { | |
| 312 MemoryProgramStatus++; | |
| 313 } | |
| 314 | |
| 315 Address = Address + 1; | |
| 316 ptr++; | |
| 317 } | |
| 318 | |
| 319 if (MemoryProgramStatus == 0) | |
| 320 { | |
| 321 return HAL_OK; | |
| 322 } | |
| 323 else | |
| 324 { | |
| 325 return 0xEE; | |
| 326 } | |
| 327 } | |
| 328 | |
| 329 uint8_t firmware_eraseFlashMemory(void) | |
| 330 { | |
| 331 // HAL_StatusTypeDef answer; | |
| 332 /* Unlock the Flash to enable the flash control register access *************/ | |
| 333 HAL_FLASH_Unlock(); | |
| 334 | |
| 335 /* Erase the user Flash area | |
| 336 (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/ | |
| 337 | |
| 338 /* Get the 1st sector to erase */ | |
| 339 FirstSector = GetSector(FLASH_FW_START_ADDR); | |
| 340 /* Get the number of sector to erase from 1st sector*/ | |
| 341 NbOfSectors = GetSector(FLASH_FW_END_ADDR) - FirstSector + 1; | |
| 342 | |
| 343 /* Fill EraseInit structure*/ | |
| 344 EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; | |
| 345 EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_1; | |
| 346 EraseInitStruct.Sector = FirstSector; | |
| 347 EraseInitStruct.NbSectors = NbOfSectors; | |
| 348 | |
| 349 /* Note: If an erase operation in Flash memory also concerns data in the data or instruction cache, | |
| 350 you have to make sure that these data are rewritten before they are accessed during code | |
| 351 execution. If this cannot be done safely, it is recommended to flush the caches by setting the | |
| 352 DCRST and ICRST bits in the FLASH_CR register. */ | |
| 353 return HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError); | |
| 354 } | |
| 355 | |
| 356 uint8_t firmware_programFlashMemory(uint8_t *pBuffer1, uint32_t length1)//, uint8_t *pBuffer2, uint32_t length2) | |
| 357 { | |
| 358 HAL_StatusTypeDef answer; | |
| 359 | |
| 360 /* Program the user Flash area word by word | |
| 361 (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/ | |
| 362 | |
| 363 uint32_t ptr = 0; | |
| 364 | |
| 365 Address = FLASH_FW_START_ADDR; | |
| 366 | |
| 367 ptr = 0; | |
| 368 while ((Address <= FLASH_FW_END_ADDR) && (ptr < length1)) | |
| 369 { | |
| 370 answer = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, Address, pBuffer1[ptr]); | |
| 371 if (answer == HAL_OK) | |
| 372 // if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, DATA_32) == HAL_OK) | |
| 373 { | |
| 374 Address = Address + 1;//4; | |
| 375 ptr++; | |
| 376 } | |
| 377 else | |
| 378 { | |
| 379 return answer; | |
| 380 } | |
| 381 } | |
| 382 /* same for pBuffer2 | |
| 383 ptr = 0; | |
| 384 while ((Address < FLASH_FW_END_ADDR) && (ptr < length2)) | |
| 385 { | |
| 386 | |
| 387 if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, Address, pBuffer2[ptr]) == HAL_OK) | |
| 388 { | |
| 389 Address = Address + 1; | |
| 390 ptr++; | |
| 391 } | |
| 392 else | |
| 393 { | |
| 394 firmware_Error_Handler(); | |
| 395 } | |
| 396 } | |
| 397 */ | |
| 398 /* Lock the Flash to disable the flash control register access (recommended | |
| 399 to protect the FLASH memory against possible unwanted operation) *********/ | |
| 400 HAL_FLASH_Lock(); | |
| 401 | |
| 402 /* Check if the programmed data is OK | |
| 403 MemoryProgramStatus = 0: data programmed correctly | |
| 404 MemoryProgramStatus != 0: number of words not programmed correctly ******/ | |
| 405 Address = FLASH_FW_START_ADDR; | |
| 406 MemoryProgramStatus = 0x0; | |
| 407 | |
| 408 ptr = 0; | |
| 409 while ((Address <= FLASH_FW_END_ADDR) && (ptr < length1)) | |
| 410 { | |
| 411 data32 = *(__IO uint8_t*)Address; | |
| 412 | |
| 413 if (data32 != pBuffer1[ptr]) | |
| 414 { | |
| 415 MemoryProgramStatus++; | |
| 416 } | |
| 417 | |
| 418 Address = Address + 1;//4; | |
| 419 ptr++; | |
| 420 } | |
| 421 /* same for pBuffer2 | |
| 422 ptr = 0; | |
| 423 while ((Address < FLASH_FW_END_ADDR) && (ptr < length2)) | |
| 424 { | |
| 425 data32 = *(__IO uint32_t*)Address; | |
| 426 | |
| 427 if (data32 != pBuffer2[ptr]) | |
| 428 { | |
| 429 MemoryProgramStatus++; | |
| 430 } | |
| 431 | |
| 432 Address = Address + 1;//4; | |
| 433 ptr++; | |
| 434 } | |
| 435 */ | |
| 436 /* Check if there is an issue to program data */ | |
| 437 if (MemoryProgramStatus == 0) | |
| 438 { | |
| 439 return HAL_OK; | |
| 440 /* No error detected. Switch on LED3 */ | |
| 441 } | |
| 442 else | |
| 443 { | |
| 444 return 0xEE; | |
| 445 } | |
| 446 | |
| 447 | |
| 448 } | |
| 449 | |
| 450 /* Private functions ---------------------------------------------------------*/ | |
| 451 | |
| 452 /** | |
| 453 * @brief Gets the sector of a given address | |
| 454 * @param None | |
| 455 * @retval The sector of a given address | |
| 456 */ | |
| 457 static uint32_t GetSector(uint32_t Address) | |
| 458 { | |
| 459 uint32_t sector = 0; | |
| 460 | |
| 461 if((Address < ADDR_FLASH_SECTOR_1) && (Address >= ADDR_FLASH_SECTOR_0)) | |
| 462 { | |
| 463 sector = FLASH_SECTOR_0; | |
| 464 } | |
| 465 else if((Address < ADDR_FLASH_SECTOR_2) && (Address >= ADDR_FLASH_SECTOR_1)) | |
| 466 { | |
| 467 sector = FLASH_SECTOR_1; | |
| 468 } | |
| 469 else if((Address < ADDR_FLASH_SECTOR_3) && (Address >= ADDR_FLASH_SECTOR_2)) | |
| 470 { | |
| 471 sector = FLASH_SECTOR_2; | |
| 472 } | |
| 473 else if((Address < ADDR_FLASH_SECTOR_4) && (Address >= ADDR_FLASH_SECTOR_3)) | |
| 474 { | |
| 475 sector = FLASH_SECTOR_3; | |
| 476 } | |
| 477 else if((Address < ADDR_FLASH_SECTOR_5) && (Address >= ADDR_FLASH_SECTOR_4)) | |
| 478 { | |
| 479 sector = FLASH_SECTOR_4; | |
| 480 } | |
| 481 else if((Address < ADDR_FLASH_SECTOR_6) && (Address >= ADDR_FLASH_SECTOR_5)) | |
| 482 { | |
| 483 sector = FLASH_SECTOR_5; | |
| 484 } | |
| 485 else if((Address < ADDR_FLASH_SECTOR_7) && (Address >= ADDR_FLASH_SECTOR_6)) | |
| 486 { | |
| 487 sector = FLASH_SECTOR_6; | |
| 488 } | |
| 489 else if((Address < ADDR_FLASH_SECTOR_8) && (Address >= ADDR_FLASH_SECTOR_7)) | |
| 490 { | |
| 491 sector = FLASH_SECTOR_7; | |
| 492 } | |
| 493 else if((Address < ADDR_FLASH_SECTOR_9) && (Address >= ADDR_FLASH_SECTOR_8)) | |
| 494 { | |
| 495 sector = FLASH_SECTOR_8; | |
| 496 } | |
| 497 else if((Address < ADDR_FLASH_SECTOR_10) && (Address >= ADDR_FLASH_SECTOR_9)) | |
| 498 { | |
| 499 sector = FLASH_SECTOR_9; | |
| 500 } | |
| 501 else if((Address < ADDR_FLASH_SECTOR_11) && (Address >= ADDR_FLASH_SECTOR_10)) | |
| 502 { | |
| 503 sector = FLASH_SECTOR_10; | |
| 504 } | |
| 505 else if((Address < ADDR_FLASH_SECTOR_12) && (Address >= ADDR_FLASH_SECTOR_11)) | |
| 506 { | |
| 507 sector = FLASH_SECTOR_11; | |
| 508 } | |
| 509 else if((Address < ADDR_FLASH_SECTOR_13) && (Address >= ADDR_FLASH_SECTOR_12)) | |
| 510 { | |
| 511 sector = FLASH_SECTOR_12; | |
| 512 } | |
| 513 else if((Address < ADDR_FLASH_SECTOR_14) && (Address >= ADDR_FLASH_SECTOR_13)) | |
| 514 { | |
| 515 sector = FLASH_SECTOR_13; | |
| 516 } | |
| 517 else if((Address < ADDR_FLASH_SECTOR_15) && (Address >= ADDR_FLASH_SECTOR_14)) | |
| 518 { | |
| 519 sector = FLASH_SECTOR_14; | |
| 520 } | |
| 521 else if((Address < ADDR_FLASH_SECTOR_16) && (Address >= ADDR_FLASH_SECTOR_15)) | |
| 522 { | |
| 523 sector = FLASH_SECTOR_15; | |
| 524 } | |
| 525 else if((Address < ADDR_FLASH_SECTOR_17) && (Address >= ADDR_FLASH_SECTOR_16)) | |
| 526 { | |
| 527 sector = FLASH_SECTOR_16; | |
| 528 } | |
| 529 else if((Address < ADDR_FLASH_SECTOR_18) && (Address >= ADDR_FLASH_SECTOR_17)) | |
| 530 { | |
| 531 sector = FLASH_SECTOR_17; | |
| 532 } | |
| 533 else if((Address < ADDR_FLASH_SECTOR_19) && (Address >= ADDR_FLASH_SECTOR_18)) | |
| 534 { | |
| 535 sector = FLASH_SECTOR_18; | |
| 536 } | |
| 537 else if((Address < ADDR_FLASH_SECTOR_20) && (Address >= ADDR_FLASH_SECTOR_19)) | |
| 538 { | |
| 539 sector = FLASH_SECTOR_19; | |
| 540 } | |
| 541 else if((Address < ADDR_FLASH_SECTOR_21) && (Address >= ADDR_FLASH_SECTOR_20)) | |
| 542 { | |
| 543 sector = FLASH_SECTOR_20; | |
| 544 } | |
| 545 else if((Address < ADDR_FLASH_SECTOR_22) && (Address >= ADDR_FLASH_SECTOR_21)) | |
| 546 { | |
| 547 sector = FLASH_SECTOR_21; | |
| 548 } | |
| 549 else if((Address < ADDR_FLASH_SECTOR_23) && (Address >= ADDR_FLASH_SECTOR_22)) | |
| 550 { | |
| 551 sector = FLASH_SECTOR_22; | |
| 552 } | |
| 553 else/*(Address < FLASH_END_ADDR) && (Address >= ADDR_FLASH_SECTOR_23))*/ | |
| 554 { | |
| 555 sector = FLASH_SECTOR_23; | |
| 556 } | |
| 557 | |
| 558 return sector; | |
| 559 } | |
| 560 | |
| 561 /* | |
| 562 static void firmware_Error_Handler(HAL_StatusTypeDef reason) | |
| 563 { | |
| 564 static HAL_StatusTypeDef last_reason = HAL_OK; | |
| 565 | |
| 566 last_reason = reason; | |
| 567 while(1) | |
| 568 { | |
| 569 } | |
| 570 } | |
| 571 */ |
