测试程序是在芯片的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;
}
