This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSPM0G3507: 片上flash在完成写入后,再次读取时会进入Default_Handler函数

Part Number: MSPM0G3507

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

  • 您好,

    已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 您好,

    请使用生成 ECC 的闪存写入:

    >>DL_FlashCTL_programMemoryFromRAM64WithECCGenerated<<

    或者每次您读取写入的闪存地址时、它都将由于 FLASHDED 而触发 NMI 中断。

    另外、您需要读回非 ECC 保护地址处的闪存地址。

  • 这颗芯片的flash空间只有128K,换算地址空间就是0x00-0x20000,非ECC保护的地址不在这个范围内,也是可以读取的么?是不是保护地址的数据部分被映射到了这个区域啊?

  • 还有个疑问,用ECC写入的扇区还能再次写入么?比如说第一次写入了0x00-0x3F地址的数据,第二次想写入0x40-0x7f地址的数据,中间需要执行扇区的擦除命令么?

  • 您好,

    使用0x0-0x0002.0000或使用0x0040.0000-0x0042.0000访问闪存是不同的访问方法。

    如果用户不想使用 EEC 保护区。 然后、用户可以使用 ECC 保护区域进行写入。 读取时、使用0x0040.0000作为读取的偏移量。

    示例:如果希望读取0x0000.10000、然后读取0x0041.0000。 它会起作用。

    还有个疑问,用ECC写入的扇区还能再次写入么?比如说第一次写入了0x00-0x3F地址的数据,第二次想写入0x40-0x7f地址的数据,中间需要执行扇区的擦除命令么?

    一个扇区为1KB、只能对同一地址进行写入应该会擦除、如果之前没有写入该地址、那么您可以对其进行写入。 请注意、最小写入单元为64位、为8个字节。