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.

[参考译文] 编译器/TMS570LC4357:引导加载程序 LC43x

Guru**** 2601915 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/735341/compiler-tms570lc4357-boot-loader-lc43x

器件型号:TMS570LC4357

工具/软件:TI C/C++编译器

我的问题:我的器件是 tms570LC43x、引导加载程序在第一个闪存扇区中编程、如果应用程序发生中断、则应用程序在第一个扇区中编程、如何跳转正确的条目以运行 中断响应程序。

tms570LC43x 是否有示例项目(应用)?

我的引导加载程序是以下示例,/cfs-file/__key/communityserver-discussions-components-files/312/0245.TMS570LC4357_5F00_UART_5F00_Boot.7z  , 示例中的应用程序只是  一个二进制文件,我运行自己的应用程序并按 以下方式配置 cmd 文件:


/*------------------ *
/*链接器设置*/

--retain="*(.intvecs)"

/*------------------ *
/*内存映射*/

存储器

/*用户代码开始(2)*/
/*用户代码结束*/
引导程序(X):origin=0x00200100 length=0x00000020
FLASH1 (RX):origin=0x00200120 length=0x001FFFE0
堆栈(RW):origin=0x08000000 length=0x00001500
RAM (RW):origin=0x08001500 length=0x0007EB00

/*用户代码开始(3)*/
/*用户代码结束*/


/*------------------ *
/*段配置*/

部分


.intvecs:{}>向量
.text align(8):{}>FLASH1
.const align(8):{}> FLASH1
.cinit align(8):{}> FLASH1
.pinit align (8):{}> FLASH1
.bss:{}> RAM
.data :{}> RAM
.sysmem:{}>RAM


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

    您需要修改 sys_intvecs.asm 来告诉 CPU ISR 在哪里。 适合您的应用:

    ;------------------------------------------------------------------
    ;中断向量
    ;请更改#0x??? 在 bl_config.h 中定义的指定图像位置

    b _c_int00
    b #0x200F8 ;0x200F8=$20100-0x8;0x20100是应用程序起始地址
    b #0x200F8 ;软件中断
    b #0x200F8 ;中止(预取)
    b #0x200F8 ;,中止(数据)
    保留尝试
    b 保留尝试
    LDR PC、[PC、#-0x1b0] ; IRQ
    LDR PC、[PC、#-0x1b0] ;FIQ
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ Wang,

    非常感谢您的回复,我 按照您的建议修改了应用程序项目中的 sys_intvecs.asm,并发现了一个奇怪的现象:当应用程序第一次运行时,它从中断矢量表加载 ISR 的正确地址,但在复位,之后 CPU 从中断矢量加载 ISR 的地址 由引导加载程序而不是应用程序程序;定义的表

    我知道 “LDR PC,[PC,#-0x1b0]; IRQ”是指将存储在 RQVECREG 中的地址(__LW_AT__0xFFFFFE70)加载到 PC ,所以我不知道 sys_intvecs.asm 与 ISR 地址,有关的默认 sys_intvecs.asm 之间的差异,并且在我使用默认 sys_intvecs.asm 时运行的 resault;是相同的

    我在 引导加载程序中发现了另一个问题:Fapi_BlockProgram() 闪存 API 不能正常工作,在将数据写入闪存时会出现一些位错误。比如说我写入0x2043BC, 结果是0X2043EC,我使用 Flash_Program_Check ()比较之前和之后的日期,检查默认也是错误。

     是否有任何使用引导加载程序更新 μ?的应用程序工程示例非常有用!谢谢!  

    Fllfing 是我 的 sys_intvecs.asm,我的应用程序映像位于0X200100:


    .sect ".intvecs"
    ARM

    ;------------------------------------------------------------------
    ;中断例程的导入引用

    .ref _c_int00
    .ref phantomInterrupt
    .def resetEntry

    ;------------------------------------------------------------------
    ;中断向量

     resetEntry

    b _c_int00
    b #0x2000F8;0x2000F8=$200100-0x8;0x200100是应用程序起始地址
    b #0x2000F8;软件中断
    b #0x2000F8;中止(预取)
    B #0x2000F8;、中止(数据)

    保留尝试

    b 保留尝试
    LDR PC,[PC,#-0x1b0];IRQ
    LDR PC,[PC,#-0x1b0];FIQ

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 QJWang,
    我‘s 了一个问题,我发现告诉应用程序 ISR 在哪里、而是_c_int00中用于初始化中断矢量表的函数 vimInit()的不是 sys_intvecs.asm。
    接下来、我想解决闪存写入错误的问题,希望您能给我一些建议,谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ Wang,

    Fllfing 是我的应用程序项目,因为应用程序在复位后无法找到 ISR,所以我在中添加了 vimInit() main()要再次初始化中断矢量表,还有一件事需要说引导加载程序应该禁用 跳转到 application.e2e.ti.com/.../7824.RTI_5F00_LED_5F00_TOGGLE.zip 之前的中断

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

    很抱歉我迟到了。 更改 sys_intvecs.asm 会告诉 CPU 在发生异常时跳转至应用程序的中断表。 例如、如果执行应用程序时发生数据中止、代码将跳转至0x00000010 (引导加载程序的数据中止、sys_intvecs.asm)。 如果您使用原始文件、代码将跳转到您的中止处理程序定义 DIN 引导加载程序。 如果您更改我的示例、代码将跳转到0x00000010、然后跳转到应用程序中断矢量的应用程序数据中止地址、然后跳转到应用程序代码中的数据中止处理程序。

    闪存中的数据问题可能是由 ECC 错误引起的、也可能是由缓存引起的。

    我有一个适用于 TMS570LS43x 的 UART 引导加载程序示例并发布到 E2E 上。 在此示例中、应用程序位于第二个闪存组中、引导加载程序在闪存中执行、而不是在 SRAM 中执行。

    e2e.ti.com/.../2605850