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.

[参考译文] CC1310:更改默认复位矢量表地址 NoRtos、IAR

Guru**** 2562120 points
Other Parts Discussed in Thread: CC1310

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/709019/cc1310-change-default-reset-vector-table-address-nortos-iar

器件型号:CC1310

你好。

我正在为项目使用 CC1310定制板。

我将使用 IAR IDE 进行开发。

我正在我的项目中使用 Nortos。 我看到了 ble stack 目录中提供的 Bim 示例、成功创建了2个单独的项目、并在位于不同闪存位置的两个项目之间跳转。

假设 App1位于0x00、App2位于0x100。 我定义了应用程序起始地址和矢量表起始地址、如下所示。

对于 App1矢量表、起始地址为@ 0x00、而 App2矢量表起始地址为@0x100。 这两个应用程序都运行正常、我可以在它们之间切换、但假设我的执行在 App2中、并且在恢复控制器后会有一个 POR、然后开始运行 App1。

这种行为表明、除了矢量表地址之外、我还必须更改更多的内容。 我阅读了参考手册、其中指出复位后、默认情况下控制器会将执行切换为0x00。

我的问题是

1.是否有方法更改此默认跳转地址?

我还了解了可更改的矢量表偏移寄存器。

2. Vtor 是我问题的解决方案吗?

3、如果是、有人能告诉我哪个函数会让我写入该寄存器?

此外、在搜索相关问题时、我遇到了 m3hwi.resetvectoraddress、需要在.cfg 文件中更改该地址。 但这个问题与 CCS 有关、我将使用 IAR。

那么、在构建工程之前、我们可以通过更改文件中的值来更改默认矢量地址吗? 如果是、如何操作?

此致、

Nishit。

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

    您能否分享一些有关您所做工作的代码? BIM 通过指向不同的复位 ISR 来跳转到图像、而不是更改矢量表。 如果系统在 POR 之后未引导至正确的映像、我假设您需要在引导加载程序中添加其他检查来处理此问题(毕竟、POR 后器件如何知道器件已重置时处于什么状态?)。

    在不实际写入 VTOR 的情况下、无法更改0x0处的默认矢量表地址。 您无法更改任何文件、只需将其构建到我知道的 NoRTOS 项目中。

    我需要更多信息来回答问题2、但如果您要更改 VTOR 寄存器、则必须通过直接寄存器访问来执行此操作:

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

    您好、M-W

    在这个链接和我已经读取的其他位置、我们需要改变  m3Hwi.resetVectorAddress  来改变控制器在 POR 之后跳转到该地址的复位矢量地址。

    此类问题的链接如下所示。  

    那么、在用于 IAR 和 NoRtos 配置的 SDK 中是否有这样的东西?

    VTOR 的作用是否与  m3Hwi.resetVectorAddress 相同=某个地址 的作用?

    此致、

    Nishit。

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

    这是相同的、您仍然需要区分 VectorAddress 和 vectorTableAddess 以及它们如何协同工作:

    dev.ti.com/.../

    NoRTOS 没有类似的配置、NoRTOS 只是一个小型 DPL 层、可让您重复使用可用的 TI 驱动程序(同时还支持信标和一些其他功能)。

    我仍然不确定我是否真正理解了您的问题、也许您可以更详细地阐述一下这一点吗? 您有一个正常工作的引导加载程序、可以按预期在两个单独的项目之间跳转。 在 POR 之后、您确切地希望看到什么行为? POR 将是完全复位、这意味着您最终将处于与首次为器件供电相同的情况。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好。

    好的、好的、我将再次向您解释这种情况。

    我有2个代码、一个使红色 LED 闪烁、另一个使绿色 LED 闪烁。 (分别为 App1和 APP2)。

    在 APP1中、按下按钮应将控件切换为 APP2。 类似地、APP2中的按钮按压操作应将执行转移到 APP1。

    在构建 APP1时、rfEasyLinkEchoTx_CC1310_LAUNCHXL_NoRtos.ICF 中的配置如下。

    define symbol __intvec_start__= 0x00000000;
    /*- Memory regions-*/
    define symbol ROM_START__= 0x00000000;/* 0 - 40 KB */
    define symbol ROM_END_= 0x00009FFF;//
    define symbol RAM_START__= 0x20000000;
    define symbol RAM_END_= 0x20004FFF; 

    在构建 APP2时、 rfEasyLinkEchoTx_CC1310_LAUNCHXL_NoRtos.ICF 文件中的配置如下所示

    define symbol __intvec_start__= 0x0000A000;
    /*- Memory regions-*/
    define symbol ROM_START__= 0x0000A000;/* 40-80 KB */
    define symbol ROM_END_= 0x00013FFF;/* 40 KB code size */
    define symbol RAM_START__= 0x20000000;
    define symbol _FFF_= 0x04FFF_; 

    App1按钮按压例程:

    PIN_CLOSE (pinHandle);
    
    HWREG (NVIC_DIS0)= 0xFFFFFFFF;
    HWREG (NVIC_DIS1)= 0xFFFFFFFF;
    HWREG (NVIC_APINT)= NVIC_APINT_VECTKEY |NVIC_APINT_VECT_CLR_ACT;
    
    asm ("MOV R0、#0x0000A000");
    asm ("LDR R1、[R0、#0x4]");
    asm ("LDR SP、[R0、#0x0]");
    asm (" Bx R1 "); 

    App2按钮按压例程:

    PIN_CLOSE (pinHandle);
    
    HWREG (NVIC_DIS0)= 0xFFFFFFFF;
    HWREG (NVIC_DIS1)= 0xFFFFFFFF;
    HWREG (NVIC_APINT)= NVIC_APINT_VECTKEY |NVIC_APINT_VECT_CLR_ACT;
    
    asm ("MOV R0、#0x00000000");
    asm ("LDR R1、[R0、#0x4]");
    asm ("LDR SP、[R0、#0x0]");
    asm (" Bx R1 "); 

    现在、为了下载代码、我将使用 SmartRF 闪存程序2。

    开始执行批量擦除。

    选择"擦除映像中的页面"选项、以便仅擦除映像文件中的页面。

    选择 APP2文件并从地址0x0000A000下载它 、然后选择 APP1并从地址0x00000000下载它。

    现在红色 LED 开始闪烁、表示 APP1正在执行。  

    按下按钮(APP1)时、绿色 LED 开始闪烁、表示 APP2上跳转。

    按下按钮(APP2)时、红色 LED 开始闪烁、表示 APP1上发生跳转。

    现在是差异。 在 APP2中、按下复位按钮 APP1开始执行。

    这意味着复位后、控制器跳转至0x000000并开始获取指令。

    参考手册第232页说明如下

    系统复位时、复位 VectorAddress 固定在地址0x0000 0000。 特权软件可以向向向量表偏移寄存器(CPU_SCS:VTOR)写入数据、以将向量表的起始地址重新定位到范围为0x0000 0200至0x3FFF FE00的不同存储器位置。 配置 CPU_SCS:VTOR 寄存器时、偏移量必须在512字节边界上对齐。

    那么、如何在 APP2中更改向量表偏移量、以便在复位后跳转到 0x0000A000而不是 0x00000000。


    如果我需要 VTOR、哪个 CPU 函数将帮助我成功写入该寄存器、因为参考手册提到只有特权软件可以写入该寄存器。

    如果您不了解任何器件、请告诉我。

    此致、

    Nishit。

     

     

     

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

    参考手册所说的是、在系统复位之后、器件将在0x0000 0000处期待复位矢量表。 复位之后、您可以稍后使用 VTOR 重定位矢量表(注意复位矢量表和矢量表之间的差异)。 使用 TI-RTOS、您可以看到.cfg 文件会将矢量表重定位到 RAM、以便在运行时更改。 然而、复位矢量表仍然为0x0000 0000。 在系统复位期间、整个 CPU 域被上电循环、这意味着所有寄存器也将被复位、因此 VTOR 将再次被编程->在复位期间它不被保留。

    这意味着您仍需要在每次复位/启动时重新配置 VTOR 以移动矢量表。 请记住、默认情况下 TI-RTOS 和 NoRTOS 都将尝试将矢量表重定位到 RAM (否则无法动态更改中断矢量)、您无需自己进行此操作。

    要执行您描述的操作、您通常会在闪存的第一页写入一个默认引导加载程序来处理此情况。 然后、该引导加载程序会决定跳转至 app1或 app2。 您无法根据自己的愿望简单地更改 MCU 的复位行为。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、M-W

    非常感谢您的深入见解。 我首先尝试保留您在0x00000000位置提到的启动器应用程序、但我在我的应用程序中使用 TI 驱动程序、由于这些驱动程序、Nortos Init 和 Board Init 最多需要12 - 13 KB 的闪存大小。 为了减小该大小、我在主应用程序代码中整合了引导加载程序应用程序代码。

    您能不能建议我们选择不使用驱动程序并执行裸机寄存器级代码的任何方法、我认为这将占用更少的代码内存。

    [引用 user="M-W"]再次重新配置 VTOR 以移动矢量表。[/quot]

    我不知道我应该如何写入 VTOR。 如果您知道的话、您能详细说明一下吗?

    此致、

    Nishit。

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

    如果您选择不使用 TI 驱动程序、您可以选择使用直接寄存器访问自行设置所有内容、或使用 DriverLib 进行设置。 之后是对寄存器访问的极低级抽象、它基本上是裸机。

    不使用 TI 驱动程序和 NoRTOS DPL 也意味着您必须自己实现所有节能功能(TI 驱动程序可免费获得)、这本身可能是一项复杂的任务。

    您可以使用直接寄存器访问向 VTOR 写入数据、如果不确定我是如何执行此操作的、我再次建议查看可用的 DriverLib:

    dev.ti.com/.../group__cpu__api.html

    您可以看到这些函数中每个函数的源代码、这些源代码应该为您提供有关如何写入 VTOR (也在 CPU_SCS 区域中)的提示。

    关于矢量表、VTOR 在寄存第一个中断时由 interrupt.h 驱动程序库设置。 只要您在实现中使用 DriverLib、就不需要自己配置 VTOR。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、M-W

    感谢您提供相关信息。

    因此、如果我选择使用 Driverlib、我是否需要自行实现省电功能? 比如、我是否可以在需要时同时使用 TI 驱动程序来实现某些模块和 Driverlib 函数?

    我将阅读您提供的 Driverlib 文档、并在使用 TI 驱动程序时尝试更改 VTOR。

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

    是的、您必须自己实现省电逻辑。 除非您确实需要、否则我不建议混合使用 TI 驱动程序和 DriverLib、如果可能、请坚持使用两者之一。 使用 TI 驱动程序还可以让我们更轻松地为您提供支持、您不必担心所有节能问题(按正确顺序关闭和打开域、及时唤醒等)。

    我仍然想强调的是,除非你真的知道你在做什么,否则你不应该试图改变 VTOR。 由于这是低级中断 DriverLib 本身在注册中断时所完成的操作、因此进一步手动更改此操作可能会使整个应用变松。

    就引导加载程序而言、您必须跳转至应用程序的 resetVectorTable (如果您位于应用程序2的位置、则应为0x0000A000)。 如果随后使用 DriverLib 来配置中断、或者根据 TI 驱动程序(Hwi / Swi)来配置中断、则矢量表将由应用本身移动到 RAM 中。

    我可以看到您自己必须在哪里执行此操作的唯一真正原因是、如果您不使用 DriverLib 或 TI 驱动程序、而是使用直接寄存器访问来开发整个应用程序。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、M-W

    好的、好的。 我认为更正确的方法是创建引导加载程序代码、该代码将具有决定跳转的逻辑。 感谢您的支持。

    还有更多时间。 现在、对于我的应用和时间限制、我将使用 TI 驱动程序。 但将来我很想使用 DriverLib 或直接寄存器级别访问方法、因为这将让我了解如何全面配置和了解这款出色的微控制器。 那么,您能否从何处开始从头开始学习该控制器的所有基础知识,以及我需要了解哪些内容以及按什么顺序进行? 因为我已经看到在线提供了很多链接和文档、例如 TI 的 Resource Explorer、Driverlib 库文档、Simplelink 等 但是、在什么顺序中、人们应该提到在我搜索的任何地方都没有正确记录的内容。
    那么、您能不能在这方面提供一些见解呢?

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

    Nishit、您好!

    我认为,如果您为您的应用程序创建了正确的引导加载程序,这将为您节省麻烦:)

    关于基础知识(在裸机级别)、我想说的最佳方法是使用 DriverLib 并查看其构建方式、因为它基本上是直接存储器存取。 文档中提供了每个 DriverLib 函数的所有源代码以及寄存器映射链接、因此也很容易理解。 这本手册与技术参考手册一起是您探索这一方向时可以使用的工具、我不知道有什么其他文档比这更有用。

    您还可以始终查看如何围绕 DriverLib 构建 TI 驱动程序、以了解如何使用不同的外设。

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

    你好。

    [引用 user="M-W"]您还可以始终了解如何围绕 DriverLib[/quot]构建 TI 驱动程序

    TI 驱动程序的源代码是否可用? 如果是、那么我在哪里可以找到它、因为我将处于更好的状态来使用驱动程序中使用的函数、如果我查看驱动程序使用的 Driverlib 函数和顺序。 从这个序列中、我可以参考参考手册和 Driverlib 手册来准确了解每行代码的用途。

    此致、

    Nishit。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、SDK 中提供了所有 TI 驱动程序和 DriverLib 源代码、请查看 SDK 安装文件夹中源目录下的内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢你。