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.

[参考译文] LP-MSPM0G3507:LP-MSPM0G3507

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1518595/lp-mspm0g3507-lp-mspm0g3507

器件型号:LP-MSPM0G3507
Thread 中讨论的其他器件:MSPM0G3507、MSPM0-SDK

工具/软件:

您好:  

我正在使用 MSPM0G3507的自定义引导加载程序。 该引导加载程序使用 UART 实现、并在将新的十六进制文件写入闪存之前执行 CRC 和版本检查。

在我的引导加载程序中、重置引导加载程序后首先运行、然后在所需位置检查应用程序是否存在(如果不存在)、则跳转到该应用程序、如果不存在、则运行正常的引导加载程序代码。

如果接收到的代码的完整 CRC 和计算出的本地 CRC 匹配、则它最后会跳转到已刷写的新应用程序、但问题是当我通过跳转函数跳转、跳转应用程序的中断不起作用时、它将重置 UC 并从引导加载程序应用程序从0开始。 我之前说过、它将再次检查并跳转到该应用程序。

所以主要的错误是我的中断处理程序从不被执行,从不写入 bootcmd(1 at flash loc 0x0001F058 )。 每次中断我给出 GPIO 中断时、它都会重复。

因为我找不到这个问题、这是我的第一个引导加载程序代码、所以有人能帮我解决这个问题吗? 我附加了跳转函数和 IRQ 处理程序以及链接器文件。

  

链接器命令文件

#include "ti_msp_dl_config.h"
#include "string.h"
#include "stdio.h"
#include "core_cm0plus.h"

#define BOOTLOADER_VECTOR_TABLE_ADDRESS  0x00000000
#define BOOTLOADER_INT_LOCATION          0x0001F058 /* At this location flag set by applicant who wish to turn on boot mode to flesh nex hex */
#define VTOR_OFFSET                      (uint32_t *)0x00003E80
#define NO_ERROR                    0
#define ERROR_WRITE_32_BIT          6

void jump_to_app(uint32_t);
uint8_t BootCmdWrite(uint32_t);

volatile uint8_t gErrorType = NO_ERROR;
volatile DL_FLASHCTL_COMMAND_STATUS gCmdStatus;
uint32_t gCmd32 = 0x00000001;
uint32_t gCmdTemp;

int main(void) {

    //early_irq_enable();

    SYSCFG_DL_init();
    SCB->VTOR = (uint32_t)VTOR_OFFSET;
    __enable_irq();
    NVIC_ClearPendingIRQ(USR_BOOT_INT_IRQN);
    NVIC_EnableIRQ(USR_BOOT_INT_IRQN);

    while (1) {
        DL_GPIO_togglePins(USER_LED_PORT, USER_LED_RED_LED_PIN);
        delay_cycles(16000000);
    }
}
void GROUP1_IRQHandler(void)
{
    switch (DL_Interrupt_getPendingGroup(DL_INTERRUPT_GROUP_1)) {
        case USR_BOOT_INT_IIDX:
            /* If SW is high, turn the LED off */
            if (DL_GPIO_readPins(USR_BOOT_PORT, USR_BOOT_BT_PIN_PIN)) {
                BootCmdWrite(gCmd32);
                DL_GPIO_togglePins(RGB_PORT, RGB_GREEN_LED_PIN);
                delay_cycles(64000000);
                jump_to_app(BOOTLOADER_VECTOR_TABLE_ADDRESS);
//              NVIC_SystemReset();
            }
            break;
        default :
            break;
    }
}

uint8_t BootCmdWrite(uint32_t cmd) {
    if (gErrorType == NO_ERROR) {

        DL_FlashCTL_unprotectSector(FLASHCTL, BOOTLOADER_INT_LOCATION, DL_FLASHCTL_REGION_SELECT_MAIN);
//        gCmdStatus = DL_FlashCTL_programMemoryFromRAM64WithECCGenerated(
//                                   FLASHCTL, BOOTLOADER_INT_LOCATION, &cmd32[0]);
        DL_FlashCTL_programMemoryFromRAM32WithECCGenerated(
                                        FLASHCTL, BOOTLOADER_INT_LOCATION, &cmd);
        // Ensure write is fully committed
        __DSB();  // Data Synchronization Barrier
        __ISB();  // Instruction Synchronization Barrier
        if (gCmdStatus == DL_FLASHCTL_COMMAND_STATUS_FAILED)
        {
            /* If command was not successful, set error flag */
            gErrorType = ERROR_WRITE_32_BIT;
        }
        DL_FlashCTL_protectSector(FLASHCTL, BOOTLOADER_INT_LOCATION, DL_FLASHCTL_REGION_SELECT_MAIN);
        gCmdTemp  = *(uint32_t *)BOOTLOADER_INT_LOCATION;

    }
    return gErrorType;
}

void HardFault_Handler(void)
{
    // Debug indicator - blink LED or breakpoint
    while (1)
    {
        DL_GPIO_togglePins(RGB_PORT, RGB_GREEN_LED_PIN);
        for (volatile int i = 0; i < 100000; i++); // Simple delay
    }
}

void jump_to_app(uint32_t app_addr) {

   __disable_irq();
   // Disable and clear all interrupts
    for (uint32_t i = 0; i < 8; i++) {
        NVIC->ICER[i] = 0xFFFFFFFF;  // Disable IRQs
        NVIC->ICPR[i] = 0xFFFFFFFF;  // Clear pending IRQs
    }
       __DSB();
       __ISB();

    // Reset SysTick just in case
    SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;

    uint32_t sp = *((uint32_t *)app_addr);         // Stack pointer
    uint32_t reset = *((uint32_t *)(app_addr + 4)); // Reset handler

    __set_MSP(sp);
    SCB->VTOR = app_addr;  // If needed


    ((void (*)(void))reset)(); // Jump to reset handler
}

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

    此链接器文件应该是应用的链接器文件、因为您使用的是0x3E80的闪存起始地址。

    在您的代码中、我认为这是引导加载程序代码、引导加载程序应从0x0开始、应用程序从0x3E80开始。

    如果您使用不同的代码结构、请告诉我。

    提示:

    在跳转到 APP/BOOT 之前、需要设置 SCB->VTOR、而不是在 SYSCFG_DL_init 之后。

    您的 Group1_IRQHandler 是否从0x3E80开始?

    您正在使用"跳转到应用程序"跳转到引导模式?

    您无法在 IRQ 处理程序中跳转、请在 IRQHandler 中设置一个标志、然后在 main 中设置 JUMP_TO_APP。

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

    是的,这是应用程序代码,正如你看到我设置 vtor 和所有跳转函数(初始化后立即设置 vtor 用于测试)。 您建议我在 GPIO 处理程序中设置一个标志、但为什么我无法从 ISR 跳转? 如果我在 ISR 中设置了该标志、然后按照您的建议从 main 跳转、但问题在于我每次发出 GPIO 中断时 GPIO ISR 都没有完全执行、它将重置 UC。

    从技术上讲、我确实跳转到了应用程序引导加载程序、但我的目标是当我需要通过引导加载程序充实新的十六进制文件时、我需要发出中断(应用程序中断在复位后运行)、它将运行引导加载程序代码、以便我可以打包新的十六进制文件、在引导加载程序代码中进行检查。

    00003f41  Group1_IRQHandler 地址 in app、 00003e80 中断矢量  

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

    现在它处于处理程序模式、但当代码从运行开始时、它应该处于线程模式。

    请尝试查找有关 ARM 处理程序模式和线程模式差异和限制的一些信息。

    如果我在 ISR 中设置了该标志、然后按照您的建议从主菜单跳转、但问题是我每次发出 GPIO 中断时 GPIO ISR 都没有完全执行、它将重置 UC。

    由于 int 矢量从 xxx 移位到0x3E80、因此您需要确保 Group1_IRQHandler 位于0x3E80的 int 矢量中。

    那么、闪存中的数据在0x0处是什么? 因为启动和应用程序都不是从0x0开始。

    同样奇怪的是,00003f41  - 00003e80  = 193在12月和193/4是48 > 32。

    有效的 int 矢量长度为0xC0、通常从0xBF 的0x0末尾开始、其长度在 DEC 中为192。

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

    编程的自定义引导加载程序代码为0x0、3E80是我的应用代码。

    这意味着首先运行引导加载程序代码、但在 init 后的 bt 代码中、我检查了应用代码是否存在、如果存在、则跳转、则不会运行 bt 代码并等待来自外部的检测信号。 因此、在应用代码中设置 GPIO 中断的目的是跳回引导加载程序代码进行新的操作。  

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

    如您所述、我尝试了在 ISR 中设置标志、然后在 main 中处理跳转、并在跳转函数中的复位处理程序调用之前设置 vtor、但工作方式与之前不同。 我看到他们设置 PSP(进程堆栈指针)的代码,所以是否需要设置 PSP?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引述 userid="571933" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1518595/lp-mspm0g3507-lp-mspm0g3507/5838186 #5838186"]

    同样奇怪的是,00003f41  - 00003e80  = 193在12月和193/4是48 > 32。

    有效的 int 矢量长度为0xC0、通常从0xBF 的0x0末尾开始、其长度在 DEC 中为192。

    [/报价]

    请检查中断矢量并将其与从 MSPM0 SDK 导入的正常示例代码进行比较。

    Group1和 int 矢量地址差异过大。

    int main(void) {
    
        //early_irq_enable();
    
        SYSCFG_DL_init();
        SCB->VTOR = (uint32_t)VTOR_OFFSET;
        __enable_irq();

    无需 在 main 中设置 SCB->VTOR、无论是在 app 和 boot 中、都应在 JUMP_TO_APP 函数中设置该参数。

    我看到了他们设置 PSP (进程堆栈指针)的代码、因此是否需要设置 PSP?

    可以在跳转到其他映像之前重置 SP。

    以下是跳转到其他图像时可以参考的代码示例:

    C:\ti\mspm0_sdk_2_04_00_06\examples\nortos\LP_MSPM0G3507\boot_manager\boot_application

    static void start_app(uint32_t *vector_table)
    {
        /* The following code resets the SP to the value specified in the
         * provided vector table, and then the Reset Handler is invoked.
         *
         * Per ARM Cortex specification:
         *
         *           ARM Cortex VTOR
         *
         *
         *   Offset             Vector
         *
         * 0x00000000  ++++++++++++++++++++++++++
         *             |    Initial SP value    |
         * 0x00000004  ++++++++++++++++++++++++++
         *             |         Reset          |
         * 0x00000008  ++++++++++++++++++++++++++
         *             |          NMI           |
         *             ++++++++++++++++++++++++++
         *             |           .            |
         *             |           .            |
         *             |           .            |
         *
         * */
    
        /* Reset the SP with the value stored at vector_table[0] */
        __asm volatile(
            "LDR R3,[%[vectab],#0x0] \n"
            "MOV SP, R3       \n" ::[vectab] "r"(vector_table));
    
        /* Set the Reset Vector to the new vector table (Will be reset to 0x000) */
        SCB->VTOR = (uint32_t) vector_table;
    
        /* Jump to the Reset Handler address at vector_table[1] */
    
        ((void (*)(void))(*(vector_table + 1)))();
    }

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

    此外、我不建议您也在 IRQHandler 中执行 Flash 操作。

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

    我会检查您提到的详细信息并告诉您、我还有一个问题可以通过.map 文件检查向量吗? 这是正确的吗? 还是 其他地方? 我提到的这个地址来自.map 文件

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

    那么如何通过设置对应于响应的标志并在 main 中进行处理呢?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
     其他地方? 我提到的地址来自.map 文件

    从.map 文件中可以。 请删除所有调试文件、然后重新编译、确保.map 是最新的。

    那么我该如何通过设置对应于响应的标志并在 main 中进行处理?

    是的。 GPIO 处理程序集标志、然后在 main 中运行所有其他任务。

    [引述 userid="571933" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1518595/lp-mspm0g3507-lp-mspm0g3507/5838186 #5838186"]

    同样奇怪的是,00003f41  - 00003e80  = 193在12月和193/4是48 > 32。

    有效的 int 矢量长度为0xC0、通常从0xBF 的0x0末尾开始、其长度在 DEC 中为192。

    [/报价]

    这个地址仍然很奇怪、请检查一下。

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

    我检查了相同 GPIO 中断导入工程的映射文件、但没有引导加载程序、因此起始 addr 为0、矢量表长度为 C0、对于应用程序、从3e80和映射文件中长度相同的 C0开始。 删除组1处理程序和导入的项目 GPIO 同时中断14d 或组1的所有文件4271后重新构建 、因此您认为差异很大。   

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

    我是否可以直接在应用程序中使用引导应用程序 start_app 函数?

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

    我尝试使用此功能、但结果相同、没有任何变化。

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

    哦、我得到了你的意思、你的 00003f41  Group1_IRQHandler 是你实际的 Group1_IRQHandler 定位的地址、而不是 int 矢量中的地址。

    这个设置是可以的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我是否可以在应用程序中直接使用引导应用程序 start_app 函数?

    是的,你可以!

    我尝试使用此函数、但结果相同、没有任何更改。

    首先、请根据普通工程检查 GPIO 中断功能、而不是起始地址不是0x0的工程。

    验证 GPIO 中断后、您可以将代码移动到0x3E80、并将引导加载程序添加到0x0。

    并且您需要刷写两次器件、请在 CCS 中设置闪存必要区域:

    如果无法进入  Group1_IRQHandler、请检查是否在 syscfg 中启用 GPIO 的中断。

    下面是一个标准 GPIO 中断函数:

    void GROUP1_IRQHandler(void)
    {
        switch (DL_Interrupt_getPendingGroup(DL_INTERRUPT_GROUP_1)) {
            case DL_INTERRUPT_GROUP1_IIDX_GPIOA:
                switch (DL_GPIO_getPendingInterrupt(GPIOA)) {
                    case DL_GPIO_IIDX_DIO13:
                        break;
                    default:
                        break;
                }
                break;
            case DL_INTERRUPT_GROUP1_IIDX_GPIOB:
                switch (DL_GPIO_getPendingInterrupt(GPIOB)) {
                    case DL_GPIO_IIDX_DIO21:
                        gButtonFlag = true;
                        break;
                    default:
                        break;
                }
                break;
            default:
                break;
        }
    }

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

    感谢通过在0分页检查中断的建议,但我之前检查了这一点,这是正常的。 我在中断时切换 LED、工作正常。 相同的应用程序在0工作,但不适用于3e80。

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

    您可以参考此示例、将起始地址移动到3E80

    C:\ti\mspm0_sdk_2_04_00_06\examples\nortos\LP_MSPM0G3507\boot_manager\bim_sample_image

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

    谢谢,我会让你进一步了解

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

    对不起,但我不明白什么 BIM 和它将如何帮助我?? 您能描述一下我吗

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

    BootManager 是引导加载程序示例、您可以根据此示例并将您的逻辑添加到其中。

    此外、 bim_sample_image 是一个从0x0地址开始的应用代码、它会使用计时器中断、运行正常。

    您可以将两个映像下载到一个 MSPM0器件上、我认为一切都可以顺利进行。

    我不知道无法在您这边触发中断的根本原因。

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

    谢谢你的建议,我会尝试这件事,并发布更新

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

    Im 使用 UART 作为 MSPM0引导加载程序代码和外部世界(ESP32)之间的通信介质。 我的目标是在没有调试器或实用工具的情况下添加十六进制新固件。

    您建议的示例可以满足此条件? 您能为此提供帮助吗?

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

    我按预期使用 UART 加载到肉体中的十六进制文件、为了实现数据完整性、我检查了主机发送的每个十六进制行的 CRC、并比较了 Rx 和计算出的 CRC、然后写入肉。

    所以写操作可以正常工作,但每次跳转中断和重置 UC 时出现的问题,那么您能有示例或参考吗? 或解决我的问题?  

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

    C:\ti\mspm0_sdk_2_04_00_06\examples\nortos\LP_MSPM0G3507\boot_manager\bim_sample_image

    C:\ti\mspm0_sdk_2_04_00_06\examples\nortos\LP_MSPM0G3507\boot_manager\boot_manager

    这两个示例可供您参考。

    在这两个示例中、您是否看到了导致无法触发中断的任何跳转?

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

    请给我一些时间、我会让您知道这一点  

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

    我构建 BIM 示例并开始调试 boot_applicatio、然后暂停并加载 BIM 主槽位的映像、但它无法正常工作、因为加载后、它已擦除所有闪存存储器。

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

    你需要参考我的前一个答复:

    如果您需要刷写两次器件、请在 CCS 中设置 Flash Required Region:
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我参考了示例代码、并遵循启动映像管理器用户指南文档进行操作。 首先构建 BIM 示例、方法是选择主部分、然后在引导应用程序中为主 存储器和非主存储器设置擦除、然后运行调试并在停止运行之间、然后从 bim x5800 bin 文件粘贴图像、但加载此映像后、会导致闪存的批量擦除。

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

    您好、helic chi、

    我找到了关于矢量表偏移寄存器的重要线索、在跳转到3e80的应用之前选择了矢量表偏移寄存器 SCB->VTOR、但在应用中、如果 VTOR == 0x00003e80、则我勾选了一个条件、然后在特定时间闪烁 LED。但它不闪烁并保持关闭、因此得出结论:尽管在跳转之前引导加载程序中设置了 VTOR、但 VTOR 未设置为3e80。 你能帮助我以正确的方式设置 vtor 吗?

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

    嗨、

    有什么函数可以在 mspm0中写入 vtor 吗?

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

    和需求、以及必要的区域。 对于必要区域、它不会称为批量擦除。

    但它不会闪烁并保持关闭状态、因此得出结论:尽管在跳转之前在引导加载程序中设置了 VTOR、但 VTOR 未设置为3e80。 你能帮助我以正确的方式设置 vtor 吗?

    跳转代码与示例代码几乎相同、您没有触发复位、而是跳转到 restethandler、不应该复位 SCB 寄存器。

    示例代码在您这边是否运行良好?

    是否有任何函数可以在 mspm0中写入 vtor?

    默认情况下、vtor 保存在闪存中、需要调用闪存 API 来擦除至少1KB 闪存、这是不能令人信服的。

    但您可以添加 vtor 偏移量、将其设置为 RAM、并将 vctor 复制到 RAM、然后就可以轻松访问 RAM 来写入 vtor。

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

    没有 Bim 示例代码运行不好,因为我说我不明白我有什么用这两个代码.

    根据您的建议,您的意思是我必须设置或移动矢量表到 ram? 命令文件来更改链接器命令文件?

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

    BSL 示例中是否有任何参考?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="655847" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1518595/lp-mspm0g3507-lp-mspm0g3507/5848510 #5848510"]

    没有 Bim 示例代码运行不好,因为我说我不明白我有什么用这两个代码.

    根据您的建议,您的意思是我必须设置或移动矢量表到 ram? 命令文件来更改链接器命令文件?

    [/报价]

    BIM 和引导加载程序已可以进行测试、无需修改。

    则需要将其加载到 M0的闪存中。

    编译代码和链接器不需要修改。

    BSL 示例中的任何引用?

    对于 BSL、请参阅此:

    C:\ti\mspm0_sdk_2_05_00_04\examples\nortos\LP_MSPM0G3507\bsl

    https://www.ti.com/lit/pdf/slaae88

    https://www.ti.com/lit/pdf/slau887

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

    我的问题是,我是否能够运行 bim 和引导应用程序代码我的问题和他们的问题之间有什么关系,他们也使用相同的方法跳转,我使用和在线检查,并发现 uc 的 M0+或 uc 支持 vtor 也使用与我相同的方法,但我的中断不会在跳转后发怒,所以你能给我其他解决方案吗?  

    我检查了 BSL 示例是否存在跳转、但没有发现任何令人困惑的地方  

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

    您可以在跳转后使用有效的软件来测试中断、这将保持基本软件正常。

    我无法从我这边验证您自己的软件或逻辑。

    我们也可以回到原始问题、  

    对于那些无法进入中断的用户、请参阅以下一些参考原因:

    1.未启用 GPIO 中断(IMASK)

    2.在处理程序模式中跳转(在中断中)

    3.未启用 NVIC

    4.未启用 CPU 内部控制位。

    似乎所有这些位都已从您这边检查过。

    我将认为软件存在逻辑错误、因此我建议您在 MSPM0 SDK 中测试有效代码示例。

    以验证整体元件是否可以正常工作。

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

    感谢您的建议,我将逐一检查这些事情,并让您了解其状态。

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

    根据您的建议、我开始在参考手册中找到重新发布的这个寄存器和 NVIC、发现必须位于中才能控制 NVIC、SCB 寄存器 特权模式 这是真的吗? 我尝试更新 main while 循环中的 vtor、因为您建议从处理程序中取 no。 我是否需要显式打开特权模式?

    我也通过在所有外设的系统初始化后调用_enable_irq ()函数来启用全局中断。

    此外、为我在应用中使用的网状外设启用中断。

    我在位置0x3E80处使用 SDK 测试 UART 回显中断示例、但输出相同、在中断时复位 uC。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    NVIC、SCB 寄存器、您必须位于 特权模式 这是真的吗?

    是的、但不需要特别注意特权模式、正常线程模式处于特权模式。

    I test with SDKs UART echo interrupt example at locc 0x3E80但输出相同、但在中断时复位 uC。

    为什么外设中断会导致 M0中断?

    UC 是什么意思?

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

    好的、但通过设置特权模式、我们可以确保情况并非如此。 那么、您能告诉 我如何以及在哪里设置这个模式吗?

    我的意思是、我测试 UART 回显示例、测试代码中的任何更改(您知道需要更改的链接器命令文件除外、因为我们需要更改的位置)、并通过0x3E80处的引导加载程序灵活配置了该代码、最后可进行跳转。

    代码更改时、我的问题也是相同的、正如我所说的、问题是中断问题、以及我们讨论的根本问题。

    UC 也称为微控制器或 MCU。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、但通过设置特权模式、我们可以确保情况并非如此。 那么、您能告诉 我如何以及在哪里设置此模式吗?

    在 main.c 中或 IRQhandler 中运行时均处于特权模式、无需设置。

    另外、请尝试删除链接器文件中的入口点控件、这不是必需的控件。

    当代码更改时、我的问题也是相同的、正如我所说的、问题是中断、我们讨论的根本问题。

    是的、但我方面没有更多建议、不确定哪个部分会影响功能。

    请尝试验证闪存内容是否正确(中断向量已编程、代码位于正确的地址)

    此外、作为参考、您可以在 MSPM0-SDK 中尝试引导应用程序、以验证跳转功能是否适用于测试板。

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

    -uinterruptVectors
    --stack_size=512
    
    
    MEMORY
    {
        FLASH           (RX)  : origin = 0x00003E80, length = 0x00020000
        SRAM            (RWX) : origin = 0x20200000, length = 0x00008000
        BCR_CONFIG      (R)   : origin = 0x41C00000, length = 0x000000FF
        BSL_CONFIG      (R)   : origin = 0x41C00100, length = 0x00000080
    }
    
    SECTIONS
    {
        .intvecs:   > 0x00003E80
        .text   : palign(8) {} > FLASH
        .const  : palign(8) {} > FLASH
        .cinit  : palign(8) {} > FLASH
        .pinit  : palign(8) {} > FLASH
        .rodata : palign(8) {} > FLASH
        .ARM.exidx    : palign(8) {} > FLASH
        .init_array   : palign(8) {} > FLASH
        .binit        : palign(8) {} > FLASH
        .TI.ramfunc   : load = FLASH, palign(8), run=SRAM, table(BINIT)
    
        .vtable :   > SRAM
        .args   :   > SRAM
        .data   :   > SRAM
        .bss    :   > SRAM
        .sysmem :   > SRAM
        .stack  :   > SRAM (HIGH)
    
        .BCRConfig  : {} > BCR_CONFIG
        .BSLConfig  : {} > BSL_CONFIG
    }
    

    如果我移除、这是链接器 cmd 文件代码

    闪存中       (Rx) :origin = 0x00003E80、length = 0x00020000此或设置为0则从十六进制提取闪存地址的逻辑将无用、

    我的问题是、如果我将闪存设置为0、那么如果我在位置0x3E80处进行闪存、代码是否有效?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、我的问题是如果我将闪存设置为0、那么如果我在位置0x3E80处刷写、我的代码将起作用?

    闪存从0x00开始、编译器将代码从0x0开始。

    如果这不会覆盖其他函数、代码应该正常工作。

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

    是的、我知道这一点、但我的问题是使用引导加载程序。该代码适用于位置0x3E80?

    我认为不是这样、在我的代码中、我只将代码和矢量表的 strating 地址更改为相同、因此生成的代码直接生成、我正在刷写此代码。使用引导加载程序、您也说过我的跳转功能与引导应用程序功能相同、但它不起作用、那么故障在哪里? 为我完成道路 blcok、无法找到解决方案  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我知道这一点、但我的问题是使用引导加载程序。此代码适用于位置0x3E80?

    将引导加载程序刷写到0x3E80、或使用引导加载程序刷写0x3E80?

    只要跳转问题得到正确处理、这两种方法都是可行的。

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

    在0x3E80处使用引导加载程序刷写代码。

    我的跳转方法是通用的、也可以在 TI 示例代码中在线看到、所以我错了哪里? 我不知道

    将十六进制文件数据写入闪存是正确的、正如预期的那样、我会分享内存浏览器的图片、其中十六进制文件写入闪存、而十六进制文件则自行写入。

    :203E800000802020AD430000E3400000E3400000000000000000000000000000000000002C
    :203EA000000000000000000000000000E34000000000000000000000E3400000E340000099
    :203EC000E3400000E3400000E3400000E3400000E3400000E3400000E3400000E3400000CA
    :203EE00000000000E3400000E34000000000000000000000E3400000E3400000D54200001F
    :203F0000E3400000E3400000E3400000E3400000E3400000E34000000000000000000000CF
    :203F2000E3400000E34000000000000000000000E340000000000000E3400000E3400000D2
    :203F4000B0B500223748384B9C18995C8D00812141516578AD004151A578AD004151E57899
    :203F6000AD0041512579AD0041516579AD004151A579AD004151E579AD004151257AAD00C2
    :203F80004151657AAD004151A57AAD004151E57AAD004151257BAD004151657BAD00415177
    :203FA000A57BAD004151E57BAD004151257CAD004151657CAD004151A57CAD004151E57C42
    :203FC000AD004151257DAD004151657DAD004151A57DAD004151E57DAD004151257EAD004E
    :203FE0004151657EAD004151A47EA40001511B32362AA9D10D4A1346303B0D4C1C6014606A
    :204000000C4B0D4C1C601C63822303650B4B436501600B480160104640380A4901601160E2
    :20402000B0BDC04604804240B8430000D0120A40FE73E7FFA0320A40FFFFFF0F82000400DB
    :204040009480424001800000002A49D084468B071CD1830722D1102A08D370B4103A78C97C
    :2040600078C0103AFBD270BC103238D0042A2CD3082A05D30C2A01D308C908C008C908C008
    :2040800008C908C092072AD0920F22E00B780370491C401C521E22D08B07F7D1C30714D12F
    :2040A0008307D8D0121F12D308C903801B0C4380001D121FF8D20AE008C903701B0A43705C
    :2040C0001B0A83701B0AC370001D121FF4D2121D05D00B780370491C401C521EF9D16046C1
    :2040E0007047FEE7F0B5441C00780023082B30D02578C6070FD166782D0137097F190F25EF
    :204100003540ED1C122D0BD102256657F5B2002E08D4E61C0CE0641C4E1C0D70314615E0B0
    :20412000A61C06E0261DE4787F221540E20155191235094A97420ED0FC43002D05D00A5DF8
    :204140004F1C0A706D1E3946F7E7344640085B1CCCE72046C7E7F0BDFF0F000010B51649B3
    :20416000164C204600F006F91549204600F056F8144802680321C9038A4301210B04D218E8
    :2041800002600269104B13405A1C026142690923134336229343436142680A4043688B435F
    :2041A0009A184260094A13688C021C43146002680A43026010BDC046F84300000080104085
    :2041C000EE430000009110400000FFFF2890104010B50F48012181630E4A136804241C434B
    :2041E0001460021F13684C05A34313600A4A002313600246083A13680324E4431C401460F8
    :2042000002688A430260026809028A43026010BD08010B4010ED00E008030B4070B51122B5
    :204220001302C218C4580125AC43C4500C888D7825438C882C43C558084E2E40084D25402B
    :204240007419C4508879CB790343087A184351687E23994318400818506070BDE798FDFF4F
    :204260001867000070B50A480A4C84420CD00A4D0A4EB54208D02A686968501C12789200E7
    :20428000A25890470835F4E700BF00BF70BDC0460844000000440000104400001844000044
    :2042A00080B5074807494160074A5160074B59600749016011601960102000F06DF880BD1F
    :2042C00000080A40030000B100280A40008810400100002607480068C0B20B2808D10648E4
    :2042E0000649016006484168064A1170117801607047C04620901040B0120A400180000012
    :20430000209110400000202000F02AF862B60120C003064908600649086006480168022205
    :204320000A43026030BF30BF30BFFBE780E200E000E100E010ED00E0084880F3088800BF2D
    :2043400000BF00F035F8002801D0FFF78BFF0020FFF7DAFF012000F02DF8C046008020201D
    :2043600080B5FFF79DFFFFF7EBFDFFF731FFFFF7F5FE80BD10B50122120383180C789C6034
    :204380004978815010BD80B50B4603214258C11D184600F007F880BD811E091F00BFFCD2BE
    :1843A0007047000080B5FFF74FFE80BDC4E770470120704700BFFEE7BB
    :2043B8001D1E1F202122232526272A2B2C2D2E2F303132333435363738393A3B01020304FC
    :2043D80005060708090A0B0C0D0E0F10111213161718191A1B1C000018000000003000001A
    :0843F8000200000000000000BB
    :18440000E540000087430000000100FFF0000000084400000000202039
    :00000001FF

    跳转函数与引导应用程序示例相同或更好。

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

    您能否在 main 的开头读取复位原因? 并尝试通过 UART 等方式发送出去吗?

    这将帮助您找到重置的根本原因。

    2.6.36 RSTCAUSE (偏移= 1220h)

    将十六进制文件数据写入闪存

    是的、看起来正确、并且您使用的是 UART0。

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

    您好、Helic、

    根据您最近关于运行 BIM 和引导应用程序的建议、我再次尝试了这两个程序、运行良好、因此我必须据此得出什么样的结论、我需要对此更改源代码吗?

    好的、但如果 MCP 在中断时复位、那么我必须读取复位原因的地方是、在发生错误或硬故障时、在 UC 复位之前是否调用了任何函数? 我尝试了硬故障错误处理程序、但它没有调用此错误。

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

    您好、Helic、

    我设置了 SCB->VTOR == 0x5800的条件、然后设置 LED、使 VTOR 在引导应用程序中设置成功、但在我的中设置成功、尽管使用了引导应用程序中使用的相同功能、因此这是 MCP 在刷写应用程序中断时复位的根本原因。

    那么如何写入 vtor 呢? 我说过特权模式是需要吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    根据您最近关于运行 BIM 和引导应用程序的建议、我尝试了这两个程序再次运行、其工作正常

    很高兴听到这个消息。

    那么、我必须从这方面得出什么样的结论、我需要在源代码中对此进行哪些更改?

    请仔细比较这两个示例。

    您可以逐步将此 BIM +引导应用示例修改为代码结构、并测试每一步、以替换原始逻辑并在项目中引导。

    发生错误或硬故障时、在 UC 重置之前是否调用了任何函数?

    请尝试捕获 NMI 或 hardfault 处理程序、但并非每个错误都会出现在这两个处理程序中。

    但您仍然可以在 main 函数的开头读取 resetcause 寄存器。

    那么我该如何写入 vtor? 我告诉过特权模式是需要吗?

    方法1、尝试找到在应用代码中修改 VTOR 的正确方法:

        特权模式是 Arm Cortex M0+内核内容中的 CPU 模式、您可以在 ARM 网站 M0+ TRM 中找到相关信息。

    方法2、我这边:

        设置从地址0x00开始的引导 int 矢量、引导可以成功跳转到 APP、并使用手动触发的复位将 APP 跳回引导。