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.

[参考译文] CCS/UCD3138064A:可以在 UCD3138的引导加载代码中添加"standard_interrupt#39;#39;?

Guru**** 2506025 points
Other Parts Discussed in Thread: UCD3138

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/730120/ccs-ucd3138064a-can-add-standard_interrupt-in-bootload-code-of-ucd3138

器件型号:UCD3138064A
主题中讨论的其他器件:UCD3138

工具/软件:Code Composer Studio

我想在 UCD3138的引导加载程序中获得准确的时间,但我找不到 standard_interrupt.c。

我添加了 standard_interrupt 的代码,但它始终有错误。

是否可以在 UCD3138的引导加载代码中添加"standard_interrupt"?  

如何 配置?

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    一位专家正在研究这个问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Han
    除非您绝对需要、否则我不建议在引导加载程序中使用标准中断。
    当 IRQ 异常发生时、程序计数器将始终分支到地址0x18。
    然后,该地址将包含应用程序中 IRQ 处理程序的分支指令,因此,如果您计划在应用程序(即引导加载程序之外)中使用 IRQ 处理程序,则此操作将不起作用。
    如果 IRQ 处理程序位于程序闪存的引导加载程序部分、则可能可以在应用程序和引导加载程序之间共享 IRQ 处理程序、但这会很混乱、我不建议这样做。

    如果您只想测量时间、我建议使用4个16位计时器之一或24位计时器。

    有关如何设置24位定时器的详细信息,请参阅技术参考手册的第397页(手册可在以下位置找到: www.ti.com/.../sniu028a.pdf )
    使用运行速度为15.625MHz 的计时器内部时钟,您可以在没有预分频器的情况下测量高达1秒以上的时间。
    该计时器具有预分频器、可将输入时钟频率除以256、因此在最大分频256的情况下、您可以在其溢出之前运行长达约4.5分钟。

    还有4个16位定时器、更多细节请见技术参考手册的第399页。 这些计时器还由15.625MHz 内部时钟驱动、每个计时器都有一个预分频器(根据24位计时器)、该预分频器始终将输入时钟除以高达256。
    将预分频器设置为将输入时钟除以256、16位计时器的范围仅为1秒以上。

    我建议:在引导加载程序中启用您选择的计时器、并使其自由运行。
    定期读取计时器计数值、并更新适当跟踪时间的变量。
    在使用24位计时器时、您还必须考虑两次读取在计时器绕回的任一侧、就像这样。 T24_cnt_meas _0包含之前的定时器计数读数(因此它必须是一个静态或全局变量)

    //计算当前计时器计数与前一计时器计数之间的增量
    int32 t24_cnt_meas _1 =(int32) TimerRegs.T24CNTTAT.bit.CNT_DAT;//计时器计数值的当前值
    int32 delta = t24_cnt_meas 1 - t24_cnt_meas 0;//计时器两个连续读数之间的计数增量

    //得到增量的绝对值
    如果(Δ< 0)

    Δ=Δ+(1<<24);


    t24_cnt_meas 0 = t24_cnt_meas _1;//更新以进行下一次传递

    非常重要的是、在两次读取定时器计数值之间、定时器没有完成一次完全通过。
    如果使用没有预分频器的24位计时器、则在2^24 * 64ns = 1.07s 后会发生一次完全通过。
    因此、只要连续读取计时器计数值之间的周期小于1.07秒、这将起作用。
    然后、如果1.07s 过短、您可以使用预分频器来增大计时器的范围(并降低有效分辨率)。

    这有道理吗? 如果您需要更多信息、请告诉我。

    此致
    Cormac
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复。 我将使用16位计时器或24位计时器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    我知道地址0x18是吗???

    我能从任何 UCD3138文档中找到地址0x18说明吗?谢谢。

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

    你好 Steven

    地址0x18位于程序闪存开始处的矢量表中。 在我们的示例固件中、您应该有一个名为 load.asm (或可能是 load_ucd3138.asm)的文件。

    请参阅下面的、其中有用于异常处理的矢量表。

    .sect ".bvectors"
    .state32.

    b b_int00;addr - 0x0000
    b vec_2;addr - 0x0004
    b vec_3;addr - 0x0008
    b vec_4;addr - 0x000C
    b vec_5;addr - 0x0010
    b vec_6;addr - 0x0014
    b vec_7;addr - 0x0018

    我们告诉编译器将此矢量表放置在".bvectors"段中(通过上面代码片段顶部的.sect ".bvectors")。

    在链接器命令文件(cyclone.cmd)中、我们告诉链接器将此部分放置在程序闪存的开头、请参阅下面的。

    存储器

      BVECS:org = 0x00000000,len = 0x00000024

    (笑声)

    部分

      .bvectors:{}> BVECS

    当一个标准中断异常(IRQ)发生时、程序计数器应该分支到地址0x18、它是内核的一个特性。

    在我们的示例中,当 IRQ 异常发生时,我们从地址0x18分支到标签"VEC_7"。 此标签包含在".pvectors7"部分中、请参阅下面 load.asm 中的内容。

    .sect ".pvectors7"
    .state32.
    vec_7;B _standard_interrupt

    我们通知链接器(通过链接器命令文件)将标签 VEC_7放置在应用程序的开头、请参阅下面链接器命令文件中的内容。

    PVECS1:org = BFLASH_SIZE+0x00,len = 0x00000004
    PVECS2:org = BFLASH_SIZE+0x04,len = 0x00000004
    PVECS3:org = BFLASH_SIZE+0x08,len = 0x00000004
    PVECS4:org = BFLASH_SIZE+0x0C,len = 0x00000004
    PVECS5:org = BFLASH_SIZE+0x10,len = 0x00000004
    PVECS6:org = BFLASH_SIZE+0x14,len = 0x00000004
    PVECS7:org = BFLASH_SIZE+0x18,len = 0x00000004
    PVECS8:org = BFLASH_SIZE+0x1C,len = 0x00000004

    (笑声)

    .pvectors1:{}> PVECS1
    .pvectors2:{}> PVECS2.
    .pvectors3:{}> PVECS3
    .pvectors4:{}> PVECS4
    .pvectors5:{}> PVECS5
    .pvectors6:{}>PVECS6
    .pvectors7:{}>PVECS7.
    .pvectors8:{}>PVECS8

    此处包含标签"VEC_7"的".pvectors7"段位于地址 BFLASH_SIZE + 0x18处。

    因此、如果引导加载程序的长度为0x800字节(即、BFLASH_SIZE = 0x800)、我们将 VEC_7放置在地址0x800 + 0x18 = 0x818处。 在应用程序的 load.asm 文件中、地址为0x818、我们将有另一个分支指令、这次是实际的 IRQ 处理程序、它将位于包含应用程序的程序闪存部分。

    总之、当应用程序运行时发生 IRQ 异常时、首先分支到地址0x18、然后分支到地址0x818、然后从此处分支到 IRQ 异常处理程序。

    希望这有道理

    此致

    Cormac

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