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.

[参考译文] TM4C1290NCPDT:写入闪存时出现访问错误

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1391684/tm4c1290ncpdt-access-error-when-writing-to-flash

器件型号:TM4C1290NCPDT
Thread 中讨论的其他器件:EK-TM4C1294XL

工具与软件:

我将写入引导加载程序并将程序数据写入闪存(从地址0x0001 0000开始)这正常运行、直到我点击地址0x0002 0000、然后程序在原始中断状态寄存器中检测到访问错误。 我已经检查了 FMPREn 和 FMPPEn 寄存器、发现所有的位都被置位。  我还检查了应该进行写入的闪存地址、发现它全为0、而不是要写入的数据。 以下是用于写入闪存的代码。  

BOOL amd_WriteWord(volatile ULONG* pulDest, ULONG* pulSource)
{
   BOOL bOK = TRUE;
   union
   {
      UBYTE ubByte[4];
      ULONG ulWord;
   } atTemp;
   MAP_IntMasterDisable();
   patFlash->FCMISC = (FLASH_FCMISC_AMISC | FLASH_FCMISC_VOLTMISC |
                           FLASH_FCMISC_ERMISC);
   patFlash->FMA = pulDest;
   atTemp.ubByte[0] = *((UBYTE*)pulSource);
   atTemp.ubByte[1] = *((UBYTE*)pulSource+1);
   atTemp.ubByte[2] = *((UBYTE*)pulSource+2);
   atTemp.ubByte[3] = *((UBYTE*)pulSource+3);
   patFlash->FMD = atTemp.ulWord;

   patFlash->FMC = FLASH_FMC_WRKEY | FLASH_FMC_WRITE; 
   while (patFlash->FMC & FLASH_FMC_WRITE) {} //wait for the write to complete
   if (patFlash->FCRIS & (FLASH_FCRIS_ARIS | FLASH_FCRIS_VOLTRIS |
                             FLASH_FCRIS_INVDRIS | FLASH_FCRIS_PROGRIS))
   {
      bOK = FALSE; 
   }
   MAP_IntMasterEnable(); 
   return(bOK);
}

当 pulDest = 0x0002 0000时会发生该错误。 传递给该函数的数据也是有效的。  

感谢任何帮助调试。  

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

    您好!

     我有几个评论,我希望它会有所帮助。  

    - TivaWare SDK 中有几个引导加载程序示例。 不清楚为什么要编写自己的引导加载程序。 我认为您至少需要参考示例引导加载程序、可以自由添加/修改/调整以满足您自己的要求。 您可以 通过 examples 文件夹中的其他通信端口、在 C:\ti\TivaWare_C_Series-2.2.0.295\boot_loader 文件夹中找到引导加载程序源代码、在 C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\boot_serial 中找到串行引导加载程序示例、以及其他引导加载程序示例。  

    -在 TM4C129 MCU 上,每个逻辑闪存扇区均为16kB。 有关详细信息、请参阅数据表。 第一个扇区 (16kB)将放置引导加载程序。 如果您尝试在0x2000处进行某些编程、则会出现问题。 原因是您可能需要先擦除该扇区、然后才能进行编程。 如果您允许、擦除第一个扇区将擦除引导加载程序本身。  
    在时、由于存储器是双向交错的、且每个存储体都单独是一个8KB 扇区
    用户使用 Flash 存储器控制(FMC)寄存器中的 ERASE 位擦除扇区
    一个16KB 的擦除。 擦除一个块会将块中的所有位都复位为1。

    - 如果您引用常用的 TivaWare 引导加载程序示例,引导加载程序代码将被复制到 SRAM 并从 SRAM 运行。 不能在闪存之外运行代码、也不能同时对闪存进行编程。  

    -有编程和擦除闪存的 API。 通过提供要编程的地址和数据以及数据大小、可以使用 FlashProgram()和 FlashErase ()。 有关详细信息、请参阅外设驱动程序用户指南。  

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

    您好!  

    感谢您的答复! 我在设置链接器脚本时考虑了闪存组。 这是我的闪存存储器映射。  

    /* partitioning of flash in new applicatoin
    0x0000 0000  Flash start
    0x0000 0000  Vector table (512B) and Boot loader start
    0x0000 8000  PARAMBLOCK1 16K
    0x0000 C000  PARAMBLOCK2 16K
    0x0001 0000  FPGA Code 134K actual size
    0x0003 1A00  Application code 825K Allocated 
    0x000F FFFF  Flash End 1MB
    */

    我切换到了 API 函数、以便可以确保写入闪存、但行为是相同的。 我可以尝试用 SRAM 而不是闪存运行、但鉴于我写入的闪存部分与我正在执行的闪存部分不同、我认为这不会有什么不同。 同样、我似乎正在成功地针对地址0x0001 0000到0x0001 FFFC (应用的前64KB)写入闪存、它仅在地址0x0002 0000上失败。  

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

    您好、Sam、

     我尝试了一个非常简单的程序。 我可以写入0x20000。 请参阅以下内容。  

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

    我正在为该地址提供一个指向 FlashErase 和 FlashProgram 的指针、而不是一个 int。 虽然我认为这是相同的行为,把它转换为 int 似乎可以解决这个问题。 感谢你的帮助。