测试程序是在芯片的0x1fc00地址处写入8个字节,在写入成功后读取flash就会Default_Handler函数,我自己封装了读写函数。请问片上flash读写是有什么注意事项么?
OnChipFlashRead(0x1fc00, onchip_flash_read_data_buf, 0x08); for (int i = 0; i < 8; i++) { uart0_send_char(onchip_flash_read_data_buf[i]); } if (onchip_flash_read_data_buf[0] == 0xFF) { bool ret = OnChipFlashWrite(0x1fc00, onchip_flash_write_data_buf, 8); if (ret == false) { uart0_send_string("OnChip Flash Write Faile\r\n"); } else { uart0_send_string("OnChip Flash Write Success\r\n"); OnChipFlashRead(0x1fc00, onchip_flash_read_data_buf, 0x08); for (int i = 0; i < 8; i++) { uart0_send_char(onchip_flash_read_data_buf[i]); } } }
bool OnChipFlashWrite(uint32_t sector_addr, uint8_t buf[], uint16_t len) { DL_FLASHCTL_COMMAND_STATUS FlashAPIState; if ((len == 0) || (len % 8 != 0)) { return false; } uint32_t *write_ptr = NULL; DL_FlashCTL_executeClearStatus(FLASHCTL); DL_FlashCTL_unprotectSector(FLASHCTL, sector_addr, DL_FLASHCTL_REGION_SELECT_MAIN); for (int i = 0; i < len; i += 8) { write_ptr = (uint32_t *)(&buf[i]); sector_addr += i; FlashAPIState = DL_FlashCTL_programMemoryFromRAM64(FLASHCTL, sector_addr, write_ptr); if (FlashAPIState == DL_FLASHCTL_COMMAND_STATUS_FAILED) { return false; } } return true; }
static volatile uint32_t tmp[16] = {0}; uint8_t OnChipFlashRead(uint32_t addr, uint8_t buf[], uint16_t len) { uint32_t *read_ptr = (uint32_t *)addr; for (uint16_t i = 0; i < len; i += 4) { tmp[i / 4] = *read_ptr; buf[i] = (uint8_t)(tmp[i / 4] >> 24) & 0xFF; buf[i + 1] = (uint8_t)((tmp[i / 4] >> 16) & 0xff); buf[i + 2] = (uint8_t)((tmp[i / 4] >> 8) & 0xff); buf[i + 3] = (uint8_t)(tmp[i / 4] & 0xff); read_ptr += 1; } return len; }