主题中讨论的其他器件:TM4C1294NCPDT、 TM4C1294KCPDT、 LM3S8971
大家好、
已尝试各种方法将串行引导加载程序(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)
}

