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.

[参考译文] TMS570LS0714:TMS570LS0714 CAN_Boot Flash 程序问题

Guru**** 2468610 points
Other Parts Discussed in Thread: TMS570LS0714

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/669218/tms570ls0714-tms570ls0714-can_boot-flash-program-issue

器件型号:TMS570LS0714

大家好、

我的客户在 TMS570LS0714平台上使用 CAN_bootloader、需要澄清一些问题。

他们使用 Fapi_BlockProgram()来执行 应用程序代码更新, 代码如下所示。 然后、他们发现 Fapi_BlockProgram 一次最多只能写入16字节。 但写入16个字节后、代码跳转到中断矢量、 引导程序无法在闪存中写入更多字节。

当前解决方案: 禁用 中断、它们可以正常写入字节。 但首先,它们使用“ _disable_Interrupt_()”来禁用中断,它不起作用; 如果它们使用“vimDisableInterrupt ()”,它就能正常工作。

问题:

                1.在进行闪存更新时是否需要禁用中断? 为什么?

                 2.“ _disable_Interrupt_()”和“vimDisableInterrupt ()”之间有何区别,为什么 “ _disable_Interrupt_()”无法成功禁用中断?

void App_CANFlashUpdate (void)
{
uint16 u16长度;
uint32 u32TargetAddress;
uint32 u32UpdateaFlag;
uint8 u8FlashBootInfo[24];
uint8 u8Ret;

if (1 = g_un_SysCANCommFlag.b1FlashUpdate)
{
G_un_SysCanCommFlag.b1FlashUpdate = 0;
u32TargetAddress = FLASH_MODULEID_ADDR;
G_u32ModuleIDBoot = 0x1234;
G_u32BootSWVer = 0x5678;
G_u32CANIDSend = 0x109;
G_u32CANIDRcvd = 0x119;

uint8 i = 0;
u8FlashBootInfo[i++]= 0x00;
u8FlashBootInfo[i++]= 0x00;
u8FlashBootInfo[i++]=(g_u32ModuleIDBoot>>8)和0xFF;
u8FlashBootInfo[i++]= g_u32ModuleIDBoot & 0xFF;

u8FlashBootInfo[i++]= 0x00;
u8FlashBootInfo[i++]= 0x00;
u8FlashBootInfo[i++]=(g_u32BootSWVer>>8)和0xFF;
u8FlashBootInfo[i++]= g_u32BootSWVer & 0xFF;

u8FlashBootInfo[i++]= 0x00;
u8FlashBootInfo[i++]= 0x00;
u8FlashBootInfo[i++]=(g_u32CANIDSend>>8)和0xFF;
u8FlashBootInfo[i++]= g_u32CANIDSend & 0xFF;

u8FlashBootInfo[i++]= 0x00;
u8FlashBootInfo[i++]= 0x00;
u8FlashBootInfo[i++]=(g_u32CANIDRcvd>8)和0xFF;
u8FlashBootInfo[i++]= g_u32CANIDRcvd & 0xFF;

u8FlashBootInfo[i++]= 0x55;
u8FlashBootInfo[i++]= 0xAA;
u8FlashBootInfo[i++]= 0x55;
u8FlashBootInfo[i++]= 0xAA;

u8FlashBootInfo[i++]= 0x55;
u8FlashBootInfo[i++]= 0xAA;
u8FlashBootInfo[i++]= 0x55;
u8FlashBootInfo[i++]= 0xAA;

u32TargetAddress = 0x30000;//FLASH_MODULEID_ADDR;
Fapi_BlockProgram (((UINT32) 0、u32TargetAddress、(UINT32)&u8FlashBootInfo[0]、24);

}
}

2. 当他们 使用 CAN_bootloader 更新应用程序十六进制文件时、他们发现无法成功执行应用程序。  

当前解决方案: 修改  .cmd 文件中的向量序列和 FLASH_API 地址。

不可用的 cmd 配置:

可用的 cmd 配置:


问题:

                1、为什么 flash_API 的地址需要 小于 矢量的地址?

                 2. 如果"存储器{}"中的地址分配必须连续? 或者、矢量和 FLASH_API 的地址是否可以分配给不同的扇区?

3、现在客户使用以下配置:CCS 输出应用程序的十六进制文件、对吗? 为什么指定的 ROM 宽度为"32"? 是否有介绍 如何配置选项的文档?

4.如何动态地从 CAN 总线获取接收日期的长度?

非常感谢。

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

    尊敬的 David:

    [引用 USER="David Bai ]他们 使用 Fapi_BlockProgram()来更新 应用程序代码, 代码如下所示。 然后、他们发现 Fapi_BlockProgram 一次最多只能写入16字节。 但写入16个字节后、代码跳转至中断矢量、 引导程序无法在闪存中写入更多字节。

    闪存 API 本身可以根据组架构从1字节编程到组宽度(8、16、32)字节。 提供的编程起始地址加上数据缓冲区长度不能超过组数据宽度。 例如、不允许对从地址0x4开始的16字节宽组上的14个字节进行编程。 LS0714的闪存组宽度为16字节。

    但是、Fapi_BlockProgram 可以对任何大小的数据块进行编程。 此函数中的闪存 API 每次用于对16字节数据进行编程。 如果在函数中增加 size 的值、则会导致问题:

    IF (SizeInBytes < 16)

      字节= SizeInBytes;
    其他
      字节= 16;

    [引用 USER="David Bai ]'在进行闪存更新时是否需要禁用中断? 为什么?[/报价]

    您不必禁用中断。 通常不会在引导加载程序中启用中断。

    [报价用户="David Bai "]" _disable_Interrupt_()"和"vimDisableInterrupt ()"之间有何区别,为什么 " _disable_Interrupt_()"无法成功禁用中断?

    disable_Interrupt_()是禁用 IRQ 和 FIQ。  vimDisableInterrupt (channel)用于禁用 选定通道的中断、该通道的中断可以是 IRQ 或 FIQ。

    我不知道 为什么_disable_Interrupt_()不起作用。 默认情况下不启用中断。

    [报价用户="David Bai a]]当他们 使用 CAN_bootloader 更新应用程序十六进制文件时、他们发现无法成功执行应用程序。  [/报价]

    引导加载程序不支持嵌入了地址的十六进制格式。 但闪存 API 无关。

    [引用 user="David Bai "]为什么 flash_API 的地址需要 小于 向量的地址?

    不明白。 引导加载程序的 INT 矢量必须位于0x00。 应用程序的 INT 矢量必须位于应用程序地址。

    [引用 user="David Bai a]"存储器{}"中的地址分配是否必须连续? 或者、矢量和 FLASH_API 的地址是否可以分配给不同的扇区?

    FLASH_API 可被分配至除0x00以外的任何位置

    [报价用户="David Bai a]]现在客户使用以下配置、即 CCS 输出应用程序的十六进制文件、对吗? 为什么指定的 ROM 宽度为"32"? 是否有介绍 如何配置选项的文档?[/quot]

    是的、您可以使用此实用程序生成 Intel 或 Motorola 格式的十六进制文件。 但引导加载程序不支持 hex 文件。

    [报价用户="David Bai "]如何从 CAN 总线动态获取接收日期的长度?

    CAN 传输的最大长度为8字节。 大小在 CAN 数据包中。 您的意思是"动态"?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    也许、他的意思是"有效的"CAN 数据
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当您读取数据包时、您会得到数据长度。 对于引导加载程序、主机侧应在传输数据之前通知接收器总数据长度。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    1。  
    戴维·白
    是否有必要在进行闪存更新时禁用中断? 为什么?

    您不必禁用中断。 通常不会在引导加载程序中启用中断。

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

    需要测试:闪存 API,带/不带执行 vimDisableInterrupt()
    2.图1看起来不错,图2不正确。 应用程序是否也会调用闪存 API?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 QJ、
    感谢您的支持。
    对于第二个问题、应用程序还会调用闪存 API。 遗憾的是、如果他们使用图1、则无法正常执行应用程序、但图2效果良好。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 David:

    我刚刚在启用 RTI 中断的情况下进行了测试(每0.1ms 一次)、闪存 API (带擦除大约需要0.3s、程序需要更长的时间)仍然可以正常工作。

    他们的应用是否需要闪存 API?