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.

[参考译文] LP-MSPM0G3507:用于擦除和写入特定存储器位置固件的函数

Guru**** 2378650 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1527319/lp-mspm0g3507-function-used-for-erasing-and-writing-the-firmware-for-the-particular-memory-location

器件型号:LP-MSPM0G3507

工具/软件:

你好  
向我发送包含闪存控制功能的文件、例如擦除固件映像以及将固件映像写入特定存储器位置。 我已经通过 UART 收到固件映像、现在想将其写入特定存储器地址。 我应该如何在代码中处理此问题? 此外、如果您有任何示例代码或链接、请分享它。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ganavi:

    请参阅下面的 SDK 示例工程:

    https://dev.ti.com/tirex/explore/node?node=A__AIIRt1wRgvh9hKBnhFSdpg__MSPM0-SDK__a3PaaoK__LATEST&placeholder=true 

    B.R.

    Sal

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我需要从特定存储器位置逐块写入固件映像  
    起始地址为 0x5800
    大小为 0x0D000
    需要在代码中添加擦除和写入函数的应用  
    在这个函数中、我的代码需要添加闪存控制函数  

    作废处理数据(字符*ptr)
      if ((rxIndex == 2) && isInitialPacket)
      {
       totalPackets =(ptr[0]<< 8)| ptr[1]
       UART_printf (UART_1_INST、“%d\n",“,totalPackets、totalPackets);
       uint32_t totalDataSize = totalPackets * 512
       rxIndex = 0
       isInitialPacket = false
       uint8_t ACK1 = 1
       while (DL_UART_isTXFIFOFULL (UART_0_INST));
      DL_UART_transmitData (UART_0_INST、ACK1);
      }
      if ((rxIndex >=2)&&!isInitialPacket)
      {
      uint16_t 索引= 0
      INT dataCount = 0
      uint16_t startOfFrame =((uint16_t) ptr[index]<< 8)| ptr[index + 1];
      索引+= 2
      IF (startOfFrame == SOF)
      {
        
         uint16_t packetNumber =((uint16_t) ptr[index]<< 8)| ptr[index + 1];
        索引+= 2

        uint16_t packetLength =((uint16_t) ptr[index]<< 8)| ptr[index + 1];
        索引+= 2
        UART_printf (UART_1_INST、“数据包编号=%d、packetlength=%d\n“、packetNumber、packetLength);
        for (dataCount = 0;dataCount < packetLength;dataCount++)
         {
          chunkBuff[dataCount]= ptr[index++]
         }
         if (dataCount == packetLength)
        {
         uint16_t receivedCRC =((uint16_t) ptr[index]<< 8)| ptr[index + 1];
         索引+= 2
         uint16_t calculatedCRC = CalculateCRC ((const uint8_t *)(ptr + 2)、rxIndex - 6);
         uint16_t endOfFrame =((uint16_t) ptr[index]<< 8)| ptr[index + 1];
         索引+= 2
         if (endOfFrame == EOF1 && receivedCRC == calculatedCRC)
         {
         uint8_t ack = 1
         while (DL_UART_isTXFIFOFULL (UART_0_INST));
         DL_UART_transmitData (UART_0_INST、ACK);
         uint8_t progress =(packetNumber * 100)/totalPackets;
         UART_printf (UART_1_INST、“闪存进度:%d%\r\n“、progress);
         isDataReceived = true
         }

        }
          memset (chunkBuff、0、packetLength);
          
          if ((totalPackets == packetNumber)&& isDataReceived)
         {
          UART_printf (UART_1_INST、“刷写完成\n“)

         }
      }
        isDataReceived = false
        
        rxIndex = 0
     }
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    使用此选项后、它可以解决问题  

        for (dataCount = 0;dataCount < packetLength;dataCount++、addr+=1)
         {
          chunkBuff[dataCount]= ptr[index++]
          if (((dataCount+1)% 8)== 0 && dataCount!= 0)
          {
          UART_printf (UART_1_INST、“datacount =%d\n“、dataCount);
          uint16_t value =(dataCount-7);
           UART_printf (UART_1_INST、“值=%d------- \n“,值);
          UART_printf (UART_1_INST、“%d------ \n“,值);
         DL_FlashCTL_unprotectSector (FLASHCTL、addr、DL_FLASHCTL_REGION_SELECT_MAIN);
        gCmdStatus = DL_FlashCTL_programMemoryFromRAM64WithECCGenerated (FLASHCTL、(addr)、(uint32_t *)&chunkBuff[value]);
        if (gCmdStatus == DL_FLASHCTL_COMMAND_STATUS_FAILED){
        gErrorType = ERROR_8BIT_W;
        UART_printf (UART_1_INST、“写入存储器时发生错误---------------------------- \n“)
        }
          }
         }