主题中讨论的其他器件:HALCOGEN
您好、QJ Wang、
除了 SCI RX 和 SCI TX 引脚、请指导我处理 UART 引导加载程序的硬件电路、
我们是否需要根据 JTAG 连接任何其他引脚。
UART 引导加载程序仅在 HDK 的 UART1中工作。
它在 SCI 2、SCI3或 SCI4中不工作
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.
您好、QJ Wang、
除了 SCI RX 和 SCI TX 引脚、请指导我处理 UART 引导加载程序的硬件电路、
我们是否需要根据 JTAG 连接任何其他引脚。
UART 引导加载程序仅在 HDK 的 UART1中工作。
它在 SCI 2、SCI3或 SCI4中不工作
是的,我已经连接了 UART SCI 2 TX/RX 引脚, 是否需要使用 bl_config.h 中的 Forced_update_PIN (GIOA7)通过 UART 引导加载程序下载应用程序代码?
SCI 2已配置、工作正常。 如果没有调试器、则无法正常工作。
Forced_update_pin 的用途是什么?
如何配置 APP_START_ADDRESS 和 APP_STATUS_ADDRESS
UART 引导加载程序的 hL_sys_link.cmd 文件
/*内存映射*/
存储器
{
/*用户代码开始(2)*/
#if 0
/*用户代码结束*/
/*用户代码开始(3)*/
#endif
#if 1.
引导程序(X):origin=0x00000000 length=0x00000020 fill =0xFFFF
FLASH0 (RX):origin=0x00000020 length=0x001FFFE0 vfill = 0xffffffff
FLASH1 (RX):origin=0x00200000 length=0x00200000 vfill = 0xffffffff
/*银行7 (128KB、FEE)*/
FLASH7 (R):origin=0xF0200000 length=0x00020000 vfill = 0xffffffff
堆栈(RW):origin=0x08000000 length=0x00001500
RAM (RW):origin=0x08001500 length=0x0002EB00
/*组0 ECC */
ECC_VEC (R):origin=(0xf0400000 +(start (vectors)>> 3))
length=(size (vectors)>> 3)
ecc={algoL2R5F021、input_range=vectors}
ECC_FLA0 (R):origin=(0xf0400000 +(开始(FLASH0)>> 3))
length=(size (FLASH0)>> 3)
ecc={algoL2R5F021、input_range=FLASH0}
/*组1 ECC */
ECC_FLA1 (R):origin=(0xf0400000 +(开始(FLASH1)>> 3))
length=(size (FLASH1)>> 3)
ecc={algoL2R5F021、input_range=FLASH1}
/*组7 ECC */
ECC_FLA7 (R):origin=0xF0100000
length=(size (FLASH7)>> 3)
ecc={algoL2R5F021、input_range=FLASH7}
#endif
/*用户代码结束*/
}
/*用户代码开始(4)*/
#if 1.
ECC{
algoL2R5F021:address_mask = 0xfffffff8 //地址位31:3 */
汉明_mask = R4 /*使用掩码中的 R4/R5构建*/
奇偶校验掩码= 0x0c //设置哪些 ECC 位是偶校验和奇校验*/
镜像= F021 //* RM57Lx 和 TMS570LCx 在 F021中编译
}
#endif
/*用户代码结束*/
/*------------------ *
/*段配置*/
部分
{
/*用户代码开始(5)*/
#if 0
/*用户代码开始(6)*/
#endif
#if 1.
.intvecs:{} palign =8>vectors
闪存 API:
{
..\Boot\Fapi_UserDefinedFunctions.obj (.text)
.\Boot\BL_FLASH.obj (.text)
--library = F021_API_CortexR4_BE_L2FMC.lib (.text)
}palign = 8 load = FLASH0 |FLASH1、run = RAM、load_start (apiLoadStart)、run_start (apiRunStart)、size (apiLoadSize)
.text:{} palign =8>FLASH0 |FLASH1 /*已初始化的可执行代码和常量*/
.const:{}palign =8 load=FLASH0 |FLASH1、run = RAM、load_start (constLoadStart)、run_start (constRunStart)、size (constLoadSize)/*初始化的常量数据(例如 const flash_sects[.] =)*/
.cinit:{} palign =8>FLASH0| FLASH1 /*表,用于显式初始化的全局和静态变量*/
.pinit:{} palign =8>FLASH0|FLASH1 /* C++全局构造函数地址*/
.bss:{}>RAM /*未初始化的全局和静态变量*/
.data :{}>RAM /*显式初始化的全局和静态非常量变量。 *
.sysmem:{}>RAM /*用于动态内存分配的内存池(heap)*/
#endif
/*用户代码结束*/
}
/*用户代码开始(7)*/
/*用户代码结束*/
/*------------------ *
/*其他*/
/*用户代码开始(8)*/
/*用户代码结束*/
/*------------------ *
应用链接文件是
存储器
{
/*用户代码开始(2)*/
/*用户代码结束*/
引导程序(X):origin=0x00200000 length=0x00000020
FLASH0 (RX):origin=0x00000000 length=0x00200000
FLASH1 (RX):origin=0x00200020 length=0x001FFFE0
堆栈(RW):origin=0x08080000 length=0x00001500
RAM (RW):origin=0x08081500 length=0x0007EB00
/*用户代码开始(3)*/
/*用户代码结束*/
}
/*用户代码开始(4)*/
/*用户代码结束*/
/*------------------ *
/*段配置*/
部分
{
/*用户代码开始(5)*/
/*用户代码结束*/
.intvecs:{}>向量
.text align(32):{}>FLASH1
.const align (32):{}> FLASH1
.cinit align (32):{}> FLASH1
.pinit align (32):{}> FLASH1
.bss:{}> RAM
.data :{}> RAM
.sysmem:{}>RAM
/*用户代码开始(6)*/
/*用户代码结束*/
}
是否可以确认应用程序和引导加载程序的内存映射是否正确?
bl_config.h 中的 Forced_update_PIN (GIOA7)是否需要用于通过 UART 引导加载程序下载应用程序代码?
SCI 2已配置、工作正常。 如果没有调试器、则无法正常工作。
Forced_update_pin 的用途是什么?
[/报价]复位后,引导加载程序通过调用 ForceCheckUpdate()来检查是否应执行应用程序更新。 如果不需要 AM 更新、 则调用 APP_START_ADDRESS 处的应用程序。
检查应用程序更新(在 CheckForceUpdate()中)包括检查 APP_STATUS_ADDRESS 处的更新状态以及可选检查 GPIO 引脚的状态。
可以通过 bl_config.h 头文件中的 ENABLE_UPDATE_CHECK 启用 GPIO 引脚检查、在这种情况下、可以通过更改 GPIO 引脚的状态来强制执行更新(例如、使用 HDK 上的按钮)。
如果应用程序有效(状态= 0x5A5A5A5A)且 GPIO 引脚未请求更新、则会调用应用程序。 否则、通过进入引导加载程序的主循环来启动更新。
[引用 userid="478029" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1048559/tms570lc4357-tms570lc4357-uart-bootloader-in-tms570lc4357-custom-board/3892489 #3892489"]您能否确认应用程序和引导加载程序的内存映射正确?请检查将引导加载程序中的输出段分配给 FLASH0、而不是 FLASH0 | FLASH1
闪存 API:
{
..\Boot\Fapi_UserDefinedFunctions.obj (.text)
.\Boot\BL_FLASH.obj (.text)
--library = F021_API_CortexR4_BE_L2FMC.lib (.text)
}palign = 8 load = FLASH0、run = RAM、load_start (apiLoadStart)、run_start (apiRunStart)、size (apiLoadSize)
.text:{} palign =8>FLASH0/*已初始化的可执行代码和常量*/
.const:{}palign =8 load=FLASH0、run = RAM、load_start (constLoadStart)、run_start (constRunStart)、size (constLoadSize)/*初始化的常量数据(例如 const flash_sectors [.] =)*/
.cinit:{} palign =8>FLASH0/*表,用于显式初始化的全局和静态变量*/
.pinit:{} palign =8>FLASH0/* C++全局构造函数地址*/
.bss:{}>RAM /*未初始化的全局和静态变量*/
.data :{}>RAM /*显式初始化的全局和静态非常量变量。 *
.sysmem:{}>RAM /*用于动态内存分配的内存池(heap)*/
#endif
/*用户代码结束*/
您好、QJ Wang、
复位后,引导加载程序通过调用 ForceCheckUpdate()来检查是否应执行应用程序更新。 如果不需要 AM 更新、 则调用 APP_START_ADDRESS 处的应用程序。
--从 IDE 软件复位后,引导加载程序会检查 CheckForceUpdate()并且我启用 了 debug_MSG =1,但它会进入 UART 功能,但它不会显示在连接到 HyperTerminal 的 UART 中。
并且正在进入 CheckGPIOForceUpdate()函数 Forced_update_PIN 不是 从 myside 设置的。 因此、当我使用调试进行设置时、它会跳转到应用程序、 并且应用程序 LED 闪烁正常。
但是、如果我在没有调试的情况下运行它、那么它将进入 UART-getKey、这是除了我从 UART 输入之外的、但我在 UART 超级终端中看不到任何东西。
请从引导加载程序检查此存储器映射
#if 1.
引导程序(X):origin=0x00000000 length=0x00000020 fill =0xFFFF
FLASH0 (RX):origin=0x00000020 length=0x001FFFE0 vfill = 0xffffffff
FLASH1 (RX):origin=0x00200000 length=0x00200000 vfill = 0xffffffff
/*银行7 (128KB、FEE)*/
FLASH7 (R):origin=0xF0200000 length=0x00020000 vfill = 0xffffffff
堆栈(RW):origin=0x08000000 length=0x00001500
RAM (RW):origin=0x08001500 length=0x0002EB00
以及 LED 闪烁应用代码。
存储器
{
/*用户代码开始(2)*/
/*用户代码结束*/
引导程序(X):origin=0x00200000 length=0x00000020
FLASH0 (RX):origin=0x00000000 length=0x00200000
FLASH1 (RX):origin=0x00200020 length=0x001FFFE0
堆栈(RW):origin=0x08080000 length=0x00001500
RAM (RW):origin=0x08081500 length=0x0007EB00
/*用户代码开始(3)*/
/*用户代码结束*/
}
在这方面、我怀疑 FLASH0从 0x00000020开始、 引导加载程序长度为 0x001FFFE0
添加 FLASH0和长度时、应该为 FLASH1的值为0x00200000是应用程序代码
#define APP_START_ADDRESS 0x00200020
#define APP_STATUS_ADDRESS 0x00200000
是这样的
请确认存储器映射。
提前感谢。
这是否意味着它会正确跳转应用程序? 您是否使用引导加载程序对应用程序映像进行了编程?
[引用 userid="478029" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1048559/tms570lc4357-tms570lc4357-uart-bootloader-in-tms570lc4357-custom-board/3894161 #3894161"]我在 UART 超级终端中看不到任何内容。[/quot]终端是否具有与代码中使用的波特率和停止位相同的波特率? 您能否在终端上显示任何消息?
[引用 userid="478029" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1048559/tms570lc4357-tms570lc4357-uart-bootloader-in-tms570lc4357-custom-board/3894161 #3894161"]在这方面、我怀疑 FLASH0从 0x00000020开始 、引导加载程序长度为 0x001FFFE0引导加载程序不应太大(0x1FFE0)。 它通常适合第一个、并且应该适合前4个闪存扇区(64KB)。
QJ Wang :这是否意味着它正确跳转应用程序? 您是否使用引导加载程序对应用程序映像进行了编程?
是的、有时如果我正确调试它、则会转到应用程序代码并正常工作。
是的、我使用引导加载程序对应用程序映像进行编程。
QJ Wang :终端的波特率和停止位是否与您的代码中使用的相同? 您能否在终端上显示任何消息?
是的、我可以看到显示 UART 引导加载程序选项并从 UART 获取输入的消息、该消息工作正常、 但在它通过第三个选项转到应用程序代码后。
下一个循环未在超级终端中正确显示。
现在、应用程序代码 LED 指示灯闪烁正常。
然后、我已经提供了软件复位。
它通过 CheckGPIOForceUpdate 函数
无强制输入
UpdateerUART();
现在,它卡在 UART_getKey()函数下面,等待来自 UART 的输入,但使用超级终端
硬件复位后、它跳转到应用程序
但应用程序代码无法正常工作。 LED 不闪烁。
UART 引导加载程序存储器:
应用存储器:
请帮助我解决此问题
提前感谢
桑托什
您好、QJ Wang、
请使用 hL_sys_link.cmd 文件和 hL_sys_startup.c 文件共享应用程序内存和引导加载程序内存的内存映射、该文件的启动 函数 _c_int00在应用程序和引导加载程序代码中是相同的。
如何为应用程序和引导加载程序代码分配向量、堆栈和 RAM 内存?
如果连接了 XDS110调试探针、则执行应用程序代码、并且在从 IDE 进行系统复位后也可以正常工作。
SCI2是用于 UART 引导加载程序的 UART
但我移除了 XDS110调试探针、只将 SCI2 UART 用于 UART 引导加载程序、因此无法正常工作。
应用
引导加载程序
存储器
部分
请检查并确认我。
我卡在 UART 引导加载程序中
提前感谢
桑托什
您好、QJ Wang、
如果我需要重新编程应用程序代码,如何从应用程序中移动 UART 引导加载程序,那么在引导加载程序代码中,如何判断它是正常复位还是重新编程复位?
如何使用 F021_API "F021_API_CortexR4_BE_L2FMC_V3D16.lib"从应用代码访问闪存组1
在我的应用程序主代码中、 我在进入 Fapi_doMarginReadByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByBy
FapiReturn = Fapi_BlockRead (g_ulUpdateStatusAddr、(无符号长整型)&g_pulUpdateUpdateUpdateUpdateess、g_ulSuccessBufferSize);
但该函数位于库文件中。
fapi_doMarginReadByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByBy
(uint8_t *) dst、
(uint32_t)字节、//16
Fapi_NormalRead);
请支持以查找此函数或链接中的问题
重新编程复位可能是软件复位。
[引用 userid="478029" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1048559/tms570lc4357-tms570lc4357-uart-bootloader-in-tms570lc4357-custom-board/3951912 #3951912"]进入 Fapi_doMarginReadByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByBy [/报价]为什么在应用程序中调用 Marginiad API? 您需要将闪存 API 复制到 RAM 并从 RAM 运行。
您好、QJ Wang、重新编程复位可能是软件复位。G_ulbootTransferAddress =(uint32_t) boot_start_address;
((void (*)(void)) g_ulbootTransferAddress)();我已使用函数指针从应用程序跳转到引导加载程序如何找到使用 寄存器重新编程为软件复位的方法?为什么在应用程序中调用 Marginiad API? 您需要将闪存 API 复制到 RAM 并从 RAM 运行。它被调用来写入和读取一个闪存存储器、以发送一个应用旨在请求重新编程的信息。如果发生正常复位、引导加载程序应允许通过检查的闪存直接进入应用程序#define APP_STATUS_ADDRESS 0x00200000。如果应用程序请求重新编程、则应输入 UART 编程选项。如何从应用程序向引导加载程序发送信息以请求重新编程?提前感谢桑托什
您可以使用 EERPOM 在应用程序和引导加载程序之间共享这些信息。 HALCoGen 可以生成用于 EEPROM 读取和写入的 FEE 驱动器。