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.

[参考译文] EK-TM4C1294XL:ETH 引导加载程序更新矢量失败

Guru**** 2562970 points
Other Parts Discussed in Thread: TM4C1294NCPDT, TM4C1294KCPDT, LM3S8971

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1012858/ek-tm4c1294xl-eth-bootloader-update-vector-fails

器件型号:EK-TM4C1294XL
主题中讨论的其他器件:TM4C1294NCPDTTM4C1294KCPDTLM3S8971

大家好、

已尝试各种方法将串行引导加载程序(BL)获取到矢量跳转地址(0x2C)。 甚至是0x04 (ResetISR()),通过 Thumb 代码通过 BL 表偏移量0x2C 显式断言 UpdateHandler()或 EnterBootLoader()。

应用程序启动0x4000而不会出现任何问题。 然而、当在跳转之前禁用狗时、通过应用程序调用跳转0x2C 以及两个 Tiva 示例似乎会导致看门狗复位。  BL 代码流用于通过 TFTP 服务器客户端通过 Stellaris MCU 正常工作。 似乎 TM4C 跳转至0x2C 不会引导至 BL 矢量表调用 SRAM 0x2000.0000的位置。 此时 BL 并非硬故障、仅在一段时间后复位。

我在 BL_EMAC.c 代码路径中放置了多个 LED 切换、但 LED D1-D4仅按照下面的说明打开和从不关闭、直到发生 BL 意外复位事件。 PDF 文本错误地通过 BootP 更新而不重新配置 EMAC、这将保留在形式 Stellaris MCU 之上、并应附加。 是否有任何想法、为什么跳转地址0x2C 可能无法从 BL 矢量表中执行由于 bl_config.h 未注释而定义的条目 ENET_ENABLE_UPDATE? 如果 BL 不立即复位 MCU、我不明白为什么在跳过0x2C 后需要重新配置 MOSC。 在跳转0x2C 之前、25MHz MOSC 似乎正在运行、因为以太网客户端处于活动状态。  

文本:此外、应用程序可以调用引导加载程序来执行应用程序定向更新。 在这种情况下、引导加载程序假定应用程序已经配置了将用于更新的外设。 这允许引导加载程序按原样使用外设来执行更新。 引导加载程序还假定到内核的中断也被保持启用、这意味着该应用程序在调用引导加载程序之前不应调用 IntMasterDisable()。 应用程序调用引导加载程序后,引导加载程序会将自身复制到 SRAM,分支到引导加载程序的 SRAM 副本,并通过调用 Updater ()(用于 UART0、SSI0和 I2C0)、UpdateBOOTP (用于以太网)、AppUpdateCAN (用于 CAN)或 AppUpdateUSB (用于 USB)来启动更新。 向量表的 SVCall 条目包含应用程序定向更新入口点的位置。  

BOOTP via (TFTP)服务器需要 BL 调用 UpdateBootP(),其中通过 EnetReconfig()设置 UIP 并在 BL 内重置 EMAC0。 因此,如果不进行完全的 EMAC 重新配置,它就无法使用上述的 FAST updateR()。 这里可能会发生什么情况? 在 BL Thumb 代码中的 Updater ()在哪里,它似乎不存在?

应用程序 jump 和2nd snip configureenet()确实打开了4个 LED,然后 MCU 复位。 跳过 configureenet()和 Thumb 矢量表调用 BootP()时,会发生相同的复位,就像跳转地址0x2C 在矢量表硬偏移地址中被4字节关闭一样。   

  

//*****************************************************************************
//
//! Configures the Ethernet controller at bootloaders initinalizaition.
//!
//! This function configures the Ethernet controller, preparing it for use by
//! the boot loader. COnfigure the GPIO LED Port Pins
//!
//! \return None. Called via bl_startup_ccs.s
//
//*****************************************************************************
void
ConfigureEnet(void)
{
    //
    // Make sure the main oscillator is enabled because this is required by
    // the PHY.  The system must have a 25MHz crystal attached to the OSC
    // pins.  The SYSCTL_MOSC_HIGHFREQ parameter is used when the crystal
    // frequency is 10MHz or higher.
    //
    //HWREG(SYSCTL_MOSCCTL) = SYSCTL_MOSC_HIGHFREQ;

    //
    // Delay while the main oscillator starts up.
    //
    //Delay(5242880);

	 /* MPU uses MOSC driven PLL 480mHz/4 produce 120 MHz SYSCLK:
	    Y1 = 25mHz XTAL HIGHFREQ. */
    //while(g_ui32SysClock != 120000000)
    {
		//g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
												  // SYSCTL_OSC_MAIN |
													//SYSCTL_USE_PLL |
													//SYSCTL_CFG_VCO_480), 120000000);
    }

	//
	//! Configure SysTick with 24ms periodic interrupt for the user functions.
	//! EthernetSendRealTimeData() tick rate via TM02
	//ROM_SysTickPeriodSet(120000000 / SYSTICKHZ);
	//ROM_SysTickEnable();
	//ROM_SysTickIntEnable();


#ifdef ENET_ENABLE_LEDS
    //
    // PF0/PF1 are used for Ethernet LEDs.
    //
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    /* Link LED-0 */
    ROM_GPIOPinConfigure(GPIO_PF0_EN0LED0); //EKXL_LED0:PF0, CPCB:PK4
    /* Activity LED-1 */
    ROM_GPIOPinConfigure(GPIO_PF4_EN0LED1); //EKXL_LED1:PF4, CPCB:PK5, PF1:EN0LED2

    //Configure PHY LEDS for Link, Activity at 2ma.
    GPIOPinTypeEthernetLED(GPIO_PORTF_AHB_BASE, GPIO_PIN_0 | GPIO_PIN_4);

    // Set the LED pad(s) for standard push-pull operation.
    MAP_GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);//CPCB:PK4
    MAP_GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD); //CPCB:PK5

    /* Enable GPIO-N peripheral */
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);

    /* Run LED N1 */
    ROM_GPIOPinTypeGPIOOutput(PIN_LEDRUN_PORT, PIN_LEDRUN_PIN);
    MAP_GPIOPadConfigSet(GPIO_PORTN_BASE, GPIO_PIN_0,
                             GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);//CPCB:A2

    /* Fault LED N0 */
    ROM_GPIOPinTypeGPIOOutput(PIN_LEDFAULT_PORT, PIN_LEDFAULT_PIN);
    MAP_GPIOPadConfigSet(GPIO_PORTN_BASE, GPIO_PIN_1,
                                 GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);//CPCB:A3

    // Turn Run LED On, fault LED On
    ROM_GPIOPinWrite(PIN_LEDRUN_PORT, PIN_LEDRUN_PIN, PIN_LEDRUN_PIN);
    ROM_GPIOPinWrite(PIN_LEDFAULT_PORT, PIN_LEDFAULT_PIN, PIN_LEDFAULT_PIN);

   SysCtlDelay(120000000 * 4);

    // Turn Run LED On, fault LED Off
    ROM_GPIOPinWrite(PIN_LEDRUN_PORT, PIN_LEDRUN_PIN, 0x0);
    ROM_GPIOPinWrite(PIN_LEDFAULT_PORT, PIN_LEDFAULT_PIN, 0x2);

    SysCtlDelay(120000000 * 4);

	// Turn Run LED On, fault LED Off
	ROM_GPIOPinWrite(PIN_LEDRUN_PORT, PIN_LEDRUN_PIN, 0x1);
	ROM_GPIOPinWrite(PIN_LEDFAULT_PORT, PIN_LEDFAULT_PIN, 0x0);

#endif
//
//
    //
    // Enable and reset the Ethernet modules.
    //
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_EMAC0);
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_EPHY0);
    ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_EMAC0);
    ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_EPHY0);

    while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_EMAC0))
    {
    }

}
/* System memory map */

MEMORY
{
    FLASH (RX) : origin = 0x00000000, length = 0x00080000
    SRAM (RWX) : origin = 0x20000000, length = 0x00040000
}

/* Section allocation in memory */

SECTIONS
{
        GROUP
    {
	    .intvecs:
	    .text
	    .const
	    .cinit  :   > FLASH
	    .pinit  :   > FLASH
	    .data
	    .init_array : > FLASH //added

    } load = FLASH, run = SRAM, LOAD_START(init_load), RUN_START(init_run), SIZE(init_size)

    GROUP
    {
        .vtable:   > 0x20000000 //added
	    .bss
	    .sysmem
	    .stack

    } run = SRAM, RUN_START(bss_run), RUN_END(bss_end), SIZE(bss_size), RUN_END(__STACK_TOP)


}

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

    以下是 BL Thumb UpdateHandler()代码,其中 PDF 声明也调用 Updater ():

    ;;*****************************************************************************
    ;;
    ;; The update handler, which gets called when the application would like to
    ;; start an update.
    ;;
    ;;*****************************************************************************
        .thumbfunc UpdateHandler
    UpdateHandler: .asmfunc
        ;;
        ;; Initialize the processor.
        ;;
        bl      ProcessorInit
    
        ;;
        ;; Load the stack pointer from the vector table.
        ;;
        movs    r0, #0x0000
        ldr     sp, [r0]
    
        ;;
        ;; Call the user-supplied low level hardware initialization function
        ;; if provided.
        ;;
     ;;.if $$defined(BL_HW_INIT_FN_HOOK)
       ;; bl      BL_HW_INIT_FN_HOOK
     ;;.endif
    
        ;;
        ;; Call the user-supplied re-initialization function if provided.
        ;;
     ;;.if $$defined(BL_REINIT_FN_HOOK)
       ;; .ref    BL_REINIT_FN_HOOK
       ;; bl      BL_REINIT_FN_HOOK
     ;;.endif
    
        ;;
        ;; Branch to the update handler.
        ;; added EnterBootLoader
     .if $$defined(ENET_ENABLE_UPDATE)
     ;;  b	ConfigureEnet
        b		EnterBootLoader
        b       UpdateBOOTP
     .elseif $$defined(CAN_ENABLE_UPDATE)
        .ref    AppUpdaterCAN
        b       AppUpdaterCAN
     .elseif $$defined(USB_ENABLE_UPDATE)
        .ref    AppUpdaterUSB
        b       AppUpdaterUSB
     .else
        b       Updater
     .endif
        .endasmfunc
    

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

    我想问题是、一旦应用启用了看门狗、除了通过复位、您无法禁用看门狗:

    如果应用必须使用看门狗、我认为您有两个选项:

    1) 1)向引导加载程序添加看门狗支持

    2)定义您自己的函数、以检查引导加载程序是否运行应用程序或保持在引导加载程序中。 此函数可检查复位源。 如果复位源是看门狗、则该函数返回非零并保持在引导加载程序中。 然后、您实际上可以强制看门狗复位以在0x2C 处重新进入引导加载程序、而不是 SVC 调用。

    bl_config.h 第1462行的一个示例

    //*****************************************************************************
    //
    // Allows an application to force a new firmware download.  If hooked, this
    // function will be called during boot loader initialization to determine
    // whether a firmware update should be performed regardless of whether a valid
    // main code image is already present.  If the function returns 0, the existing
    // main code image is booted (if present), otherwise the boot loader will wait
    // for a new firmware image to be downloaded.
    //
    unsigned int MyCheckUpdateFunc(void);
    //
    // This value takes precedence over ENABLE_UPDATE_CHECK} if both are defined.
    // If you wish to perform a GPIO check in addition to any other update check
    // processing required, the GPIO code must be included within the hook function
    // itself.
    //
    //*****************************************************************************
    #define BL_CHECK_UPDATE_FN_HOOK MyCheckUpdateFunc
    
    

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

    尊敬的 Bob:

    您可能会注意到以下代码禁用了两个看门狗复位、应防止在 BL 代码执行期间使狗有效。 必须是 MCU 正在从进入 BootP 部分的灾难性代码故障复位。

    当被添加到 BootP()代码执行时,I'v 跟踪了问题的一部分,即 UART0 GPIO PA0/PA1打开 LED D1/D2,然后看门狗复位 MCU。 注意到正在构建其他几个无法通过 bl_config.h 选择的 make 对象、请参阅 SSI、i2c、USB、UART 等。

    void
    BootLoader(void)
    {
    
             /* bool (g_bStartBootLoader) = (0)-false do NOT invoke Boot Loader.
             While bool (g_bStartBootLoader) = (1)-true, Invoke Boot Loader.
             Loop Forever, the real work is done in interrupt handlers.*/
    
    	         UARTprintf("<< Boot Loader >> \n\n");
    
                    while(1)
                    {
    					 //
    					 // Put the processor to sleep.
    					 //
    					 //MAP_SysCtlSleep();
    
                  
    						/* Unlock the watchdogs Eallow */
    						MAP_WatchdogUnlock(WATCHDOG0_BASE | WATCHDOG1_BASE);
                            /* Disable the watchdog timers */
                            MAP_WatchdogResetDisable(WATCHDOG0_BASE);
                            MAP_WatchdogResetDisable(WATCHDOG1_BASE);
                			/* Disable Watchdog interrupts */
                			HWREG(WATCHDOG0_BASE + WDT_O_CTL) &= ~(WDT_CTL_INTEN);
                			HWREG(WATCHDOG1_BASE + WDT_O_CTL) &= ~(WDT_CTL_INTEN);
    
                            //
                            // Turn off all the on-board LEDs.
                            //
                            UIRunLEDBlink(0, 0);
                            UIFaultLEDBlink(0, 0);
    
                            MAP_SysCtlDelay(g_ui32SysClock / 400);
    
                            //
                            // We must make sure we turn off SysTick and its interrupt before entering
                            // the boot loader!
                            //
                            ROM_SysTickIntDisable();
                            ROM_SysTickDisable();
    
                            //
                            // Disable all processor interrupts.  Instead of disabling them
                            // one at a time, a direct write to NVIC is done to disable all
                            // peripheral interrupts.
                            //
                            HWREG(NVIC_DIS0) = 0xffffffff;
                            HWREG(NVIC_DIS1) = 0xffffffff;
                            HWREG(NVIC_DIS2) = 0xffffffff;
                            HWREG(NVIC_DIS3) = 0xffffffff;
    
                            //
                            // Clear any active interrupts.  If the boot loader uses
                            // any interrupts, they will therefore respond as expected.
                            //
                            //HWREG(NVIC_APINT) = (NVIC_APINT_VECTKEY |
                                                //NVIC_APINT_VECT_CLR_ACT);
    
                            // Return control to the boot loader.  This is a call to the SVC
                            // handler in the boot loader.
                            //
                            (*((void (*)(void))(*(uint32_t *)0x2c)))(); //ISRreset 0x04
    
                            //
                            // Control should never return here, but just in case it does.
                            //
                            while(1)
                            {
                            }
    
    				}
    
    }

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

    修补后将 BL Build 减少到6k (BL_STARTUP_CCS.c)、以使 Thumb 检查强制更新启用(BL_CONFIG.h)。 调用后应用程序不会启动应用程序。

    奇怪的是,必须配置 UART0并将 UARTStdioConfig()调用到(BL_EMAC.c)中,否则应用程序将不会启动,没有 LED 闪烁活动。 该应用通过 LaunchPad XDS110 USB0配置了 UART0、UART3和调试消息虚拟 COM (UART0)。

    在 BL_EMAC.c 中调用 UARTStdioConfig()令人困惑。 UART0未定义 UART_buffer、矢量表中不需要中断处理程序。

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

    串行引导加载程序 UpdateHandler()在 MCU 软/硬复位后执行,并通过 BL_EMAC.c.下降到 BootP() 某些 Thumb 指令可能无法通过 BL_STARTUP_CCS.s 按预期工作 UpdateHandler() thumb 代码在执行时不会被应用程序置为有效。 说明了如何在 BL_EMAC.c 中执行 UARTStdioConfig()并允许从闪存地址0x4000启动应用程序。  

    此外,我从 BL 矢量表地址0x2C 中删除了 UpdateHander -0x2000000,并仍执行位于 BL_STARTUP_CCS.s 中 UpdateHandler()下的 BootP()、EnterBootLoader() 串行引导加载程序似乎已被修改并处于部分功能状态。  

    在 MCU 复位时由应用程序或 GPIO 引脚强制更新模式置为有效之前、不应执行 BL 外设功能。 BL 代码通过 PIOSC 内部振荡器运行、直到应用程序将 MOSC 配置为 PCB 上存在的任何 XTAL 频率。

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

    在 Lauchpad 上使用串行引导加载程序启动演示项目不会导致看门狗复位。 您似乎关注的是引导加载程序。 我建议您在应用程序中对引导加载程序的调用设置一个断点、并验证看门狗确实已禁用。  

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

    尊敬的 Bob:

    在加载较新版本并添加上面的修补程序后、我最终让 BL 在下面进行了一个更改。 问题的一部分是对看门狗解锁进行逻辑或操作、并且在 BL 中将 ROM 与映射调用混合会使其行为不良、MAP 甚至会在某些 EMAC0函数调用 Tivaware v2.1.7.1上中断它。 后者 v2.1.2.111和更高版本的编译器 LTS 后缀中的所有 ROM 调用似乎中断了 BootP 调用、v5.2.8编译器构建正常。 在阅读过一篇文章后、我更改了几个地图调用、您对地图如何战胜 ROM 进行了评论、在本例中、它会使事情变得更糟。 奇怪 的是、我通过 v2.1.1.7.1 driverlib 编译了 BL v2.1.2.111、因为构建时出现错误、无法找到 EMAC0配置 LED。  

    当 MCU 断言 NmiSR:如果 ENABLE_MOSCFAIL_handler 则调用、则为 BL_STARTUP_CCS.s 编译 EnterBootLoader:函数。 EBL 在 NMI 事件上重新配置 MOSC、但在 ResetISR 中未被阻止:看起来可能需要重新配置 MOSC。 以下补丁与上述 snip 类似、但调用 NmiSR:如果 AppAddress 未添加 BL_config.h BTW 闪存块大小400需要为4000或 bin 文件不会写入闪存。 除非 TM4C1294 MOSC 具有振荡器故障检测、否则 NmiSR 可能不会太好。

    所有这些都很喜欢 USB0、以便将来进行更新、但希望证明 BL 能够正常工作。 通过更新是否需要 USB 许可证?

    ;;*****************************************************************************
    ;;
    ;; The reset handler, which gets called when the processor starts.
    ;;
    ;;*****************************************************************************
        .thumbfunc ResetISR
    ResetISR: .asmfunc
        ;;
        ;; Enable the floating-point unit.  This must be done here in case any
        ;; later C functions use floating point.  Note that some toolchains will
        ;; use the FPU registers for general workspace even if no explicit floating
        ;; point data types are in use.
        ;;
        movw    r0, #0xED88
        movt    r0, #0xE000
        ldr     r1, [r0]
        orr     r1, r1, #0x00F00000
        str     r1, [r0]
    
        ;;
        ;; Initialize the processor.
        ;;
        bl      ProcessorInit
    
        ;;
        ;; Call the user-supplied low level hardware initialization function
        ;; if provided.
        ;;
     .if $$defined(BL_HW_INIT_FN_HOOK)
        .ref    BL_HW_INIT_FN_HOOK
        bl      BL_HW_INIT_FN_HOOK
     .endif
    
        ;;
        ;; See if an update should be performed.
        ;; 6/25/21 if check bl_config.h
        ;;
     .if $$defined(ENABLE_UPDATE_CHECK)
        .ref    CheckForceUpdate
        bl      CheckForceUpdate
     .endif
       	;;
     	;; <<< Start Application >>>
     	;;
     .if $$defined(APP_START_ADDRESS)
     	bl		StartApplication
     ;; cbz     r0, CallApplication
     .else
     ;; Something went wrong so reconfigure MOSC
     	bl		NmiSR
     ;;	FaultISR
     .endif
      ;; Does not work
      ;;  cbz     r0, CallApplication
    
        ;;
        ;; Configure the microcontroller.
        ;;
        .thumbfunc EnterBootLoader
    EnterBootLoader:
     .if $$defined(ENET_ENABLE_UPDATE)
        .ref    ConfigureEnet
        bl      ConfigureEnet
     .elseif $$defined(CAN_ENABLE_UPDATE)
        .ref    ConfigureCAN
        bl      ConfigureCAN
     .elseif $$defined(USB_ENABLE_UPDATE)
        .ref    ConfigureUSB
        bl      ConfigureUSB
     .else
        .ref    ConfigureDevice
        bl      ConfigureDevice
     .endif
    
        ;;
        ;; Call the user-supplied initialization function if provided.
        ;;
     .if $$defined(BL_INIT_FN_HOOK)
        .ref    BL_INIT_FN_HOOK
        bl      BL_INIT_FN_HOOK
     .endif
    
        ;;
        ;; Branch to the update handler.
        ;;
     .if $$defined(ENET_ENABLE_UPDATE)
        .ref    UpdateBOOTP
        b       UpdateBOOTP
     .elseif $$defined(CAN_ENABLE_UPDATE)
        .ref    UpdaterCAN
        b       UpdaterCAN
     .elseif $$defined(USB_ENABLE_UPDATE)
        .ref    UpdaterUSB
        b       UpdaterUSB
     ;;.else
     ;;  .ref    Updater
     ;;   b      Updater
     .endif
        .endasmfunc
     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="48581" URL"~/support/microcontrollers/other-microcontrollers-group/other/f/other-microcontrollers-forum/1012858/ek-tm4c1294xl-eth-bootloader-update-vector-fails/3744451 #3744451"]是否通过需要 USB 许可证进行更新?[/quot]

    很高兴引导加载程序能够正常工作。 DFU 的引导加载程序更新不需要标准 TivaWare 许可证以外的任何许可证。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="96819" URL"~/support/microcontrollers/other-microcontrollers-group/other/f/other-microcontrollers-forum/1012858/ek-tm4c1294xl-eth-bootloader-update-vector-fails/3745417 #3745417">很高兴引导加载程序能够正常运行。 [/报价]

    奇怪的是、BL 在 NCPDT 上工作、但在 KCPDT 上工作。 似乎 Tivaware 2.1.4.178有时钟问题 KCPD。  在命令下面,在没有 任何构建警告的情况下,终止 EnetReconfig() Tivaware 2.1.1.71。 更改构建库~178、然后更改 BootP Works (NCPDT)。 是否知道 MOSC 为何在 KCPDT 上未通过 Tivaware ~178?

    PLL 设置为480MHz、并回忆一下、为了解决计时 PYSDIV 问题所做的更改似乎应该以相同的方式影响 NCPDT。 故障 LED 指示灯至少出现在 NCPDT 上、但 KCPDT 上没有显示。

    //
    //初始化 MAC 并设置 DMA 模式。
    //  
    ROM_EMACInit (EMAC0_BASE、ui32时钟、
    EMAC_BCONFIG_Mixed_BURST | EMAC_BCONFIG_PRIORY_FIXED、4、4、0);

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

    TivaWare v2.1.3和更高版本中进行了更改、将 VCO 设置为240MHz 而不是480MHz、以避免 RSCLKCFG.PSYSDIV 位未正确写入的问题。 这可能导致系统时钟以240MHz 运行、器件将锁定。 我建议使用最新版本的 TivaWare。 我没有解释为什么引导加载程序可以在 TM4C1294NCPDT 上运行、但不能在 TM4C1294KCPDT 上运行、除非加载的应用程序超过了较小器件上可用的512KB 闪存。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="96819" URL"~/support/microcontrollers/other-microcontrollers-group/other/f/other-microcontrollers-forum/1012858/ek-tm4c1294xl-eth-bootloader-update-vector-fails/3747363 #3747363"]除非加载的应用程序超出了较小器件上可用的512KB 闪存。

    应用程序仅为102KB、UART 更新存在与以太网 KCPDT 更新相同的问题。 几乎就像矢量表的起始地址不被复制0x2000000、而是一些其他地址或根本不被复制一样。 调试 延迟和重置 Thumb 指令之间的 IP ping 钳位。

    thumbfunc 延迟
    全局延迟
    延迟:.asmfunc
    SUS r0、#1
    BNE 延迟
    BX LR
    endasmfunc

    thumbfunc _c_int00
    全局_c_int00
    _c_int00:.asmfunc
    b ResetISR

    [引用 userid="96819" URL"~/support/microcontrollers/other-microcontrollers-group/other/f/other-microcontrollers-forum/1012858/ek-tm4c1294xl-eth-bootloader-update-vector-fails/3747363 #3747363"]这可能导致系统时钟以240MHz 运行,设备将锁定[/quot]

    然而、BL 设置 MOSC 25MHz 时、切换 LED 并拉入继电器。 BL 外设功能正常工作时、将 BL 复制到 SRAM 位置无效。

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

    如果硬件是相同的、并且闪存的上半部分没有代码、我不知道它们的行为为什么会不同。

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

    对于一个、编译器 v5.2.8向上不理解字面定义的名称 SRAM、并期望 BL_LINK_CCS.cmd 显式地址 RUN=0x20000000或 BL Thumb 代码不运行。

    其他 BL 问题则存在于 NVIC_vtable 间接存储器地址指令周围。 通过拇指调用加载 定义为 BL_CONFIG.h 的 VTABLE _START_ADDRESS 现在、闪存矢量有点正确、KCPDT 可以访问 app .data 段、但无法初始化 app 外设(main.c)。 这确实需要在 TI 实验室中进行测试、将 NCPDT 替换为 KCPDT 检查引导加载程序实际上会重新定位 NVIC_VTABLE 矢量地址。

     ;
    ;;设置应用程序的矢量表起始地址。 通常、这是
    ;应用程序起始地址,但在某些情况下,应用程序可能会重新定位
    ;;这样我们就不能假定这两个地址是相等的。

    movw r0、#(VTABLE _START_ADDRESS & 0xFFFF)
    .if (VTABLE _START_ADDRESS > 0xFFFF)
    movt r0、#(VTABLE _START_ADDRESS >> 16)
    .endif
    MOVw R1、#(NVIC_VTABLE & 0xFFFF)
    movt R1、#(NVIC_vtable >> 16)
    STR r0、[R1]  

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

    尊敬的 Bob:

    通过间接存储器寻址 Thumb 代码加载 NVIC_VTABLE 偏移的 SBL 调用不适用于 KCPDT、闪存长度= 0x00080000、origin= 0x00004000。

    该调用获取应用程序刷新的 VTABLE 偏移处的表。 需要将文本添加到 PDF 中、请注意从长度中减去原点。 奇怪的是、NCPDT 长度= 0x000100000时不需要。 LM3S8971的 μ~文件也不需要该文件、NVIC_vtable 偏移地址内容似乎会随应用程序一起重定位。 编译器 LTS 或更早版本无关紧要、当源代码向上移动时会丢失闪存长度。

    此致、