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.

[参考译文] TMDS570LS31HDK:手动更新状态(而不是 GPIO 触发器)

Guru**** 2470220 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1012718/tmds570ls31hdk-update-status-manually-instead-of-gpio-trigger

器件型号:TMDS570LS31HDK
主题中讨论的其他器件:HALCOGEN

APP_STATUS_ADDRESS -您能否从应用内部手动更改值(0x5A5A5A)、而不是等待 GPIO 触发?

我想向应用程序发送命令、更改状态、重置、引导加载程序会看到状态更改并准备接收新固件。

我知道您需要处于特权模式(SVC)、但 Fapi_setActiveFlashBank 方法在尝试在该位置写入值之前挂起。

void RaisePrivilege()
{
//    __asm volatile
//    (
//        "   movs pc, r14_svc                     \n"
//    );

    __asm volatile
    (
        "   mrs     r12, spsr                              \n"
        "   ands    r0, r12, #0x0F      ; return value     \n"
        "   orreq   r12, r12, #0x1F                        \n"
        "   msreq   spsr_c, r12                            \n"
        "   bx      r14                                    \n"
    );
}

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

    当前的 UART 引导加载程序示例不支持此功能。 您可以修改示例代码以从 UART 终端接收状态。 编程前、状态字的存储器位置应该被擦除。  

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

     Fapi_setActiveFlashBank 正在挂起--用户应用程序处于用户模式--我是否需要处于特权模式才能更改状态(APP_STATUS_ADDRESS)? 如果是这样--你如何进入特权模式?

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

    是的、所有 F021闪存 API 都应在 特权模式下运行。  

    进入用户模式后、您不能像上面所示那样简单地切换到系统或监控器模式。  在用户模式下、需要一个例外才能再次进入权限、从而将受控入口点从用户返回到权限。

    软件可以通过两种方式启动此操作: (a)使用 SVC 调用、它将使您进入 SWI 处理程序并进入管理员模式、(b)使用系统模块(SSI)的系统软件中断、它将为您生成 IRQ 中断并使您进入 IRQ 模式。

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

    谢谢、但我不断地读到、SVC 是我所需要的、但没有说明如何执行它。  我不想从特权模式返回、我想设置该值并重新启动。  

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

    尊敬的 Chris:

    请参阅此应用手册和示例代码:

    https://www.ti.com/lit/an/spna218/spna218.pdf?ts=1624563017717&ref_url=https%253A%252F%252Fwww.google.com%252F

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

    当系统处于 监控器模式时、R14_SVC 为 R14。 请使用 R14而不是 R14_Svc。

    请使用应用手册中的示例代码:

    https://www.ti.com/lit/an/spna218/spna218.pdf?ts=1624563017717&ref_url=https%253A%252F%252Fwww.google.com%252F

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

    段配置中的对齐有多重要? 创建应用程序时使用的默认值为 align (32)、应用程序注释中的代码是使用 palign (8)构建的。

    ; default
    	.intvecs : {} > VECTORS
        .text   align(32) : {} > FLASH0
        .const  align(32) : {} > FLASH0
        .cinit  align(32) : {} > FLASH0
        .pinit  align(32) : {} > FLASH0
        .bss     : {} > RAM
        .data    : {} > RAM
        .sysmem  : {} > RAM
        
    ; app note code
        .intvecs : {} palign(8) > VECTORS
        .text    : {} palign(8) > FLASH0 | FLASH1
        .const   : {} palign(8) > FLASH0 | FLASH1
        .cinit   : {} palign(8) > FLASH0 | FLASH1
        .pinit   : {} palign(8) > FLASH0 | FLASH1
        .bss     : {} > RAM
        .data    : {} > RAM
    	.sysmem  : {} > RAM

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

    我已经实现了应用手册中的代码、在尝试切换到监控器- switchCpuMode 时、我将获得"break at address "0x8"、no debug information available、or outside of program code"。 地址08是 SVC、但它似乎缺少代码了一个偏移量?

    更新:我尝试了其中一个预构建链接文件(TMS570LC43xxFlashLnk.cmd)、当代码达到 switchCpuMode 时、应用程序跳转到_Svc。 是否要求必须将向量设置为 origin=0x00000000? 如果我要将此应用程序与引导加载程序结合使用、则需要为 origin=0x00020020。

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

    我刚刚测试了应用手册中的代码、它符合预期。

    1.将 Svc.c、svc.h 和_Svc.asm 复制到您的项目中

    2.将_Svc 中断 ISR 添加到异常矢量表中。  

       

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

    我也让它工作。  但问题是、此应用程序必须与引导加载程序(为 APP_START_ADDRESS 20020设置的矢量)配合使用。 vector 似乎必须为零(0)、_svc 才位于正确的位置?

    // VECTOR set for bootloader address - APP_START_ADDRESS
        VECTORS (X)      : origin=0x00020020 length=0x00000020 fill=0xFFFFFFFF
        FLASH0  (RX)     : origin=0x00021020 length=0x00027D20 fill=0xFFFFFFFF
        FLASH1  (RX)     : origin=0x00200000 length=0x00200000
        STACKS  (RW)     : origin=0x08000000 length=0x00001300
        RAM     (RWX)    : origin=0x08001300 length=0x0007ED00

    注意很明显、这是对上载到引导加载程序时更新的应用程序的链接文件的讨论!

    换句话说、这适用于引导加载程序、但适用于 SVC:
    向量(X)   :origin=0x00020020 length=0x00000020 fill=0xFFFFFFFF

    这适用于 SVC、但不适用于引导加载程序:
    向量(X)   :origin=0x00000000 length=0x00000020 fill=0xFFFFFFFF

    更新了: 我将向量设置为:
    引导程序(X)   :origin=0x00000050 length=0x00000020 fill=0xFFFFFFFF

    而产生的反汇编显示 SVC 为58...  
    20 b _Svc
    00000058:EA009586 b _Svc

    这似乎表明中断依赖于位于零(0)的矢量--不可重定位... 偶数 HalCoGen 列出了位置00000008处的 SVC。

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

    _coreInitRegisters_();启动时将 Hercules 置于 SVC (监控器模式)-您是否可以将其保持在该模式? 我查看了 HL_SYS_CORE.asm、无法判断它在何处返回到用户模式。

    单步执行启动- CPSR->M 始终为1111。