// Reprogram the new settings if flash writing is allowed static void program_cfg(cfg_setting_t *new_cfg) { uint32_t status; uint32_t addr; cortex_int_state_t state; addr = (uint32_t)&config_rom; state = cortex_int_get_and_disable(); status = EraseSector(addr); cortex_int_restore(state); if (status != 0) { return; } memset(write_buffer, 0xFF, sizeof(write_buffer)); memcpy(write_buffer, new_cfg, sizeof(cfg_setting_t)); state = cortex_int_get_and_disable(); status = ProgramPage(addr, sizeof(write_buffer), write_buffer); cortex_int_restore(state); if (0 != status) { return; } }
void read_unique_id(uint32_t *id) { #if defined(INTERNAL_FLASH) cortex_int_state_t local_state = cortex_int_get_and_disable(); // readUID IAP call IAP iap_entry = (IAP)IAP_LOCATION; command[0] = 58; iap_entry(command, result); *id = result[1] ^ result[2] ^ result[3] ^ result[4]; cortex_int_restore(local_state); #else // IAP commands are only supported for parts with on-chip flash. (void)command; (void)result; *id = 0xdeadbeef; #endif }
void create_unique_id(void){ cortex_int_state_t state; state = cortex_int_get_and_disable(); EFC0->EEFC_FMR |= (1UL << 16); EFC0->EEFC_FCR = 0x5A00000E; /*Monitor FRDY*/ while ((EFC0->EEFC_FSR & EEFC_FSR_FRDY) == EEFC_FSR_FRDY); unique_id[0] = *(uint32_t *)0x80000; unique_id[1] = *(uint32_t *)0x80004; unique_id[2] = *(uint32_t *)0x80008; unique_id[3] = *(uint32_t *)0x8000C; EFC0->EEFC_FCR = 0x5A00000F; /*Monitor FRDY*/ while ((EFC0->EEFC_FSR & EEFC_FSR_FRDY) != EEFC_FSR_FRDY); cortex_int_restore(state); }