工具/软件:Starterware
大家好、我已经尝试并研究了 TM4C1294Xl launchpad 示例文件夹中提供的引导加载程序示例。 在我的示例中、我尝试使用 API " ROM_FlashProgram (((uint32_t *)&FirmwareData、ui32ProgAddr、4)"来刷写固件字节(成功构建后在 bin 文件中生成的字节)。 USB_stick_update 示例中对此进行了说明。
串行获取 TIVAC 上 UART3上的字节、然后按预期成功地将其写入所需的存储器块。
执行所有此操作的代码存储在存储器位置0x000中、接收到的串行数据存储在位置0x00011F40中。
在我的示例 中、我尝试刷写默认闪烁代码的应用程序启动 ADDR 更改为0x00011F40后生成的 bin 文件。
现在、在闪存字节后、我还通过 LM 闪存编程器中的"Verify flash contents "选项验证存储器的内容。
到目前为止一切都很完美。
这是代码
代码1.
uint_fast32_t ui32ProgAddr = 0x00011F40;
void CallApplication (uint_fast32_t ui32StartAddr)
{
HWREG (NVIC_vtable)= ui32StartAddr;
_asm (" LDR r1、[r0]\n"
" mov SP、R1\n");
_asm (" LDR r0、[r0、#4]\n"
" BX r0\n");
}
int
main (void)
{
G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |SYSCTL_OSC_MAIN |SYSCTL_USE_PLL |SYSCTL_CFG_VCO_480)、120000000);
SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0);
// //
SysCtlPeripheralEnable (SYSCTL_Periph_UART3);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
GPIOPinTypeGPIOOutput (GPIO_Porta_base、GPIO_PIN_6);
GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_6、GPIO_PIN_6);
GPIOPinConfigure (GPIO_PA4_U3RX);
GPIOPinConfigure (GPIO_PA5_U3TX);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_4 | GPIO_PIN_5);
UARTConfigSetExpClk (UART3_base、g_ui32SysClock、115200、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
// ////
//
while (1)
{
if (APPflag = set) CallApplication (APP_START_ADDRESS);
while (UARTCharsAvail (UART3_base))
{
i++;
RDATA[i]= UARTCharGetNonBlocking (UART3_base);
Updatefirmware(i);//此函数将写入内存,并在写入所有字节时设置 APPflag
}
}
成功刷写后被调用的 CallApplication 函数中出现了问题。
HWREG (NVIC_vtable)= 0x00011F40;
_asm (" LDR r1、[r0]\n"
" mov SP、R1\n");
_asm (" LDR r0、[r0、#4]\n"
" BX R0\n");
现在观察到的结果是 LED 快速闪烁。 现在、这是我所讨论的异常行为。
我在 CCS 调试中选择了闪存必要页面选项、并将以下代码刷写到 TIVAC 中。
代码2.
#define APP_START_ADDRESS 0x00011F40
int
main (void)
{
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOJ);
ROM_GPIODirModeSet (GPIO_PORTJ_BASE、GPIO_PIN_0、GPIO_DIR_MODE_IN);
MAP_GPIOPadConfigSet (GPIO_PORTJ_BASE、GPIO_PIN_0、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);
SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPION))
{
}
GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0);
GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_1);
while (1)
{
if (ROM_GPIOPinRead (GPIO_PORTJ_BASE、GPIO_PIN_0)=0)
{
CallApplication (APP_START_ADDRESS);
}
}
void CallApplication (uint_fast32_t ui32StartAddr)
{
HWREG (NVIC_vtable)= ui32StartAddr;
_asm (" LDR r1、[r0]\n"
" mov SP、R1\n");
_asm (" LDR r0、[r0、#4]\n"
" BX R0\n");
}
注意: 此时、我将上述代码(CODE2)从0x000开始、并将之前代码(CODE1)的闪存 bin 文件内容从0x00011F40开始(因为我选择了仅在 CCS 调试中擦除必要页面)
在运行 CODE2后、执行过程完全转到 APP_START_ADDR、在我的示例中为0x00011F40、并且 blinky 完全执行。
本实验验证我用于写入闪存存储器(CODE1)的程序是否工作正常。 但是当我尝试在 CODE1中调用 CallApplication()时,它会显示程序的异常执行,当我尝试从 CODE2调用 CallApplication()时,该程序运行得非常好。 我不确定如何调试这种问题。
此致、
Nishit。