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**** 2035740 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、而不是要写入的数据。 以下是用于写入闪存的代码。  

当 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 ()。 有关详细信息、请参阅外设驱动程序用户指南。  

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

    您好!  

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

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

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

    您好、Sam、

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

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

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