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.

[参考译文] TM4C123GH6PM:Tiva C Launchpad

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/894747/tm4c123gh6pm-tiva-c-launchpad

器件型号:TM4C123GH6PM
主题中讨论的其他器件:DK-TM4C123G

您好!  

我希望将程序映像从闪存复制到 SRAM、并希望从 SRAM 执行。 我将 Keil 用作 IDE、但我不介意使用 CCS。 我可以复制程序映像、如果它相当于将数据从一个存储器地址复制到另一个存储器地址、但是、在进行一些基本的 googling 后、我注意到我需要使我的代码位置独立、我不知道如何执行此操作。  

我希望从外部闪存读取代码并执行它。

P.S. 我只是一个学生、而上面的项目是我希望做的一个业余项目。 感谢您提供同样的帮助:)

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

    您好!

    请允许我公司的年轻员工/我注意到您的写作非常出色!   请注意-一次有许多/大多数"在这里"是"学生..."

    在我们多年基于 MCU 的设计/开发过程中、我们无法回忆您描述的应用/活动。   您是否可以描述您的"意图"和/或"价值主张"产生于您的"从外部闪存复制程序映像到 SRAM -然后从 SRAM 执行"?

    "更直接的方法"是否会看到您的(理想的小)程序进入(通常) MCU 的闪存-然后复制到 SRAM -然后执行?   (可能)、"Program Load into -而后从外部闪存读取"进入 MCU 的 SRAM -似乎引入了额外的需求-以及由此实现的任何优势-让我们无法快速识别...

    我们的团队使用多席位 IAR (IDE)... 在 IDE 的"帮助"部分中、详细介绍了从"MCU 闪存到 SRAM 的传输-然后执行"。。   也许这是一条"加速/缓和的桥梁"、符合您的目标...

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

    您好!

    实际上、我看到许多器件以类似的方式执行 FOTA 类升级。 但无法真正理解它们的实现。

    我们现在可以从图片中删除外部闪存。

    如果您能够深入了解如何将一些代码从内部闪存复制到 SRAM,然后从 SRAM 执行代码(SRAM),那将非常有用。

    此外、Joseph Yiu 博士的这本书指出、我们可以在基于 Cortex M 的 MCU 的 SRAM 外执行代码、并关闭闪存以节省功耗。 SRAM 访问速度也更快。

    我的想法是编写一个引导加载程序、将代码的"重要"部分复制到 SRAM 并将控制权转移给 SRAM。

    以下是目前的理论:

    在我看来、我可以编写一个函数来复制代码、然后通过一些中断- ISR (如 SysTick)修改异常堆栈中的 PC 值。  该 PC 值实际上是 SRAM 中存在的代码的地址。

    但我阅读了一些文章和论坛,声称这不是直接的。

    如果对我缺失的内容有任何见解、我们将不胜感激。 )

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

    请看一下我们先前答复中的最后一段(新)。   我们的技术团队使用了许多 ARM MCU -来自许多供应商-我不确定我们是否已经在您的 MCU 上实现了您的目标(具有最新存储器)。

    我们早就有了姚先生的书——发现他很有技能,这本书很有力量。   也就是说-我们的扫描发现(不是或隐藏)提到了 SRAM 中的"代码执行"。   (我知道我们已经这样做了、但不同供应商的器件之间的方法有所不同。)

    为了实现引导加载程序目标-该供应商已经制作了非常详细的引导加载程序指南-强烈建议您(认真)在实施您的"理论"之前查看这些指南。

    最后-与以更高的系统时钟运行的(大量) ARM MCU (长)相比、"闪存上的 SRAM "产生的任何"加速"都将出现。   (一个最新的 ARM 器件达到600MHz、但业余爱好者(目前主要)已经采用了这种器件!)

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

    您好!

    我一定会与 IAR 核实。 希望这会有所帮助。

    此外、当您提到引导加载程序指南的"此供应商"时、您是指 IAR?

    就姚先生的著作而言。 我会推荐您使用该更新版本的软件。

    第9章:低功耗和系统控制。 第310页。

    谢谢、此致

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

    我们有一个示例、可以执行我认为您想要执行的大部分操作。 代码使用不同于其运行地址的加载地址生成、而不是与位置无关的代码。 加载地址是将代码编程到闪存中时使用的地址、运行地址是它将从通常是 RAM 中执行的地址。 请查看 以下位置的示例:C:\ti\TivaWare_C_Series-2.1.4.178\examples\boards\dk-tm4c123g\boot_serial

    棘手的部分位于启动汇编文件和链接器命令文件中。 由于这两个文件都是特定于代码生成工具的、因此 TI Code Composer Studio (CCS)、IAR、Keil 和 GCC 都有这些文件的版本。  

    CCS 启动文件为 BL_STARTUP_CCS.s 函数 ProcessorInit 将整个引导加载程序复制到 SRAM、初始化.bss 段、将硬件中断矢量单元设置为在 SRAM 开头查找矢量、然后将其返回地址更改为跳转到 RAM 而不是闪存。

    thumbfunc ProcessorInit
    ProcessorInit:.asmfunc
    ;
    ;;将代码映像从闪存复制到 SRAM。
    ;
    MOV r0、#0x0000
    MOV R1、#0x0000
    MOVt R1、#0x2000
    LDR R2、BSS_START
    COPY_LOOP:
    LDR r3、[r0]、#4
    结构 R3、[R1]、#4
    CMP R1、R2
    BLT COPY_LOOP
    
    ;
    ;零填充.bss 段。
    ;
    MOV r0、#0x0000
    LDR R2、BSS_END
    ZERO LOOP:
    结构 R0、[R1]、#4
    CMP R1、R2
    BLT zero_loop
    
    ;
    ;;将矢量表指针设置为 SRAM 的开头。
    ;
    movw r0、#(NVIC_vtable & 0xFFFF)
    movt r0、#(NVIC_vtable >> 16)
    MOV R1、#0x0000
    MOVt R1、#0x2000
    结构 R1、[r0]
    
    ;
    ;;设置刚刚复制到 SRAM 的代码的返回地址。
    ;
    OR LR、LR、#0x20000000
    
    ;
    ;返回给呼叫者。
    ;
    BX LR
    endasmfunc
    

    CCS 链接器命令文件为进入闪存的所有代码提供基于 RAM 的地址、并定义一些引用加载地址、运行地址和代码大小的全局符号。

    内存
    {
    闪存(RX):origin = 0x00000000,length = 0x00010000
    SRAM (rwx):origin = 0x20000000,length = 0x00010000
    }/*
    
    在内存中的段分配*/
    
    SECTIONS
    {
    组
    {
    .intvecs
    .text
    .const
    .data
    } load = flash、run = 0x20000000、load_start (init_load)、run_start (init_run)、size (init_size)
    
    组
    {
    .bss
    .stack
    } run = SRAM、run_start (bss_run)、run_end (bss_end)、size (bss_size)、run_end (__stack_top)
    
    }
    

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

    谢谢您- SRAM 详细信息(可能)并未纳入我们的"10年前版本"。   ("及早"证明并非总是优势-除非在谈论产品介绍时!)

    引导加载程序指南-内容丰富-由 TI 提供、提供了极大的灵活性和便利。   (IDE 可能会"触摸"引导加载程序-但绝不会接近(必要)的细节)。

    我们的书列出了章节。 9作为"中断行为"-从第145页开始。   没有您注意到的章节。   (但我们只是发现了一个"SRAM"提到的地方-这在书中的索引中没有任何包含。)

    认真地-您对 TI 的引导加载程序指南的"查找和阅读"(有多个)将证明其具有很高的价值...

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

    尊敬的 Bob:  

    感谢您的回复! 您可以在此处链接该版本的 TivaWare 吗? 这将是一个大帮助! )

    我拥有的示例文件夹不包括在内。

    此致

    PRANJAL

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

    http://www.ti.com/tool/SW-TM4C

    选择第一个"Get Software"按钮、下载包含示例和文档的完整库。

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

    您好 CB1_MOBILE、  

    感谢您的参考、如果您可以在此处添加该引导加载程序指南的某个链接、那将非常棒、谢谢!  

    是的、这一章不存在于本书的旧版本中、我只是检查了它。

    非常感谢您的帮助! )  

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

    Voici mon AMI、

    TivaWARE\docs\SW-TM4C-BOOTLDR-UG.2.1.4.178

    值得一提的是、引导加载程序需要:

    • 非常注重(甚至)细节
    • 一些方向错误
    • 进行可靠测试、以确认您的实施成功

    我的技术团队认为、如果此类"引导加载程序"的主要目的是"避免获取和使用 JTAG 探头"、那么该目的证明是"错误的"。   引导加载程序非常复杂、需要"大量"您的待处理时间和注意力。   在执行引导加载程序时、您对"关键 MCU 元素和代码探索"的开发和掌握可能会被延迟(有时会长期延迟)。

    此外-适当的 JTAG 探头将始终(并显著)"快速、方便和增强"您的 MCU 编程和调试。   JTAG 探头被视为"重要"的开发工具...   

    引导加载程序很少是"早期任务"-通过"学习 MCU 手册和密集程序示例(API)审核"获得必要的经验、可以为即将面临的挑战做好准备...   (MCU 搜索框(顶部)将显示"太早"引导加载程序实现中的数百个帖子...)