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.

[参考译文] AM3358-EP:将定时器优先级设置为优先于其他 HWI

Guru**** 657930 points
Other Parts Discussed in Thread: AM3358, SYSBIOS, AM3359
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/942780/am3358-ep-set-timer-priority-level-to-preempt-other-hwis

器件型号:AM3358-EP
Thread 中讨论的其他器件:AM3358SYSBIOSAM3359

我们正在运行 AM3358的定制板上开发应用。  我们使用的是 SYS/BIOS 6.75.2、AM335x PDK 1.0.16和 CCS8。

我们同时使用多个 UART、但需要一个 UART 以非常严格的时间线(+/- 10us)发送。

我创建了一个计时器、用于开始传输。  但是、如果另一个 HWI 正忙于处理 UART、则计时器 HWI 会被延迟。  我尝试提高计时器 HWI 的优先级、但在 am3358 PDK 中、Timer_Params 不包含 hwiParams、如一些论坛讨论中所示。  因此无法设置 HWI 优先级。   

我还尝试创建了 HWI、如下所述:

https://e2e.ti.com/support/processors/f/791/t/781223

但这会导致运行时断言、因为计时器已使用中断。

下面是用于创建计时器的代码

#include

Timer_Params_init (&timerParams);
timerParams.period = 500;
timerParams.periodType = Timer_PeriodType_micros;
timerParams.startMode = Timer_StartMode_user;
timerParams.runMode = Timer_RunMode_OneShot;

tm_timer_handle = Timer_create (Timer_any、(Timer_Functr) timerFunc、&timerParams、&EB);

我需要保证、当定时器运行时、HWI 被立即调用、并且优先于任何当前运行的 HWI。  

是否有任何文档或示例可实现此目的?

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

    您好!

    它看起来可以在 Timer_create()期间修改 HWI 参数。

    请参阅 /docs/cdoc/ti/sysbios/timers/dmtimer/Timer.html:

    • 单击 Timer_Params
    • 单击 Hwi_Params。 优先级作为 HWI 参数列出。

    您可以尝试通过此 API 配置 HWI 吗?

    此致、
    弗兰克

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

    您好、Frank、

    正如我在原始帖子中所说、AM335x 上的 Timer_Params 结构中不提供 Hwi_Params。   因此文档不正确。

    这里是中定义的结构 /packages/ti/sysbios/hal/Timer.h

    /*参数*/
    struct ti_sysbios_hal_Timer_Params{
    size_t __size;
    const void *_self;
    void *_Fxns;
    xdc_runtime_IsInstance_Params *实例;
    TI_SYSBIOS_interfaces_ITIMER_RunMode 运行模式;
    TI_SYSBIOS_interfaces_ITIMER_StartMode startMode;
    XDC_UArg 参数;
    XDC_UINT32周期;
    TI_SYSBIOS_interfaces_ITIMER_PeriodType periodType periodType;
    xdc_runtime_Types_FreqHz extFreq;
    XDC_Runtime_IInstance_Params __IPRM;
    };

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

    您好、Shawn、

    我查看的是 DMTimer API、而不是 HAL Timer API。 请参阅:

    • \docs\CDOC\ti\SysBIOS\timers\dmtimer\Timer.html
    • \packages/ti\SysBIOS\timers\dmtimer\Timer.h

    此致、
    弗兰克

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

    该驱动程序是使用 timer.h 定义构建的、我目前正在使用该文件。  如果我使用 dmtimer 目录中的 timer.h,驱动程序将会崩溃。  我将按如下方式在 cfg 文件中加载驱动程序:

    VAR 计时器= xdc.useModule('ti.sysbios.hal.Timer');

    我看到有两个计时器驱动程序、因为还有:

    VAR DMTimer = xdc.useModule('ti.sysbios.timers.dmtimer.Timer'); (我没有加载这个)。

    AM3358-EP:将定时器优先级设置为优先于其他 HWI

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

    您好!

    shawnD 说:
    驱动程序是使用 timer.h[/quot]构建的

    请参阅 /docs/cdoc/ti/sysbios/hal/Timer.html:

    ti.sysbios.hal.计时 器模块提供了一个用于使用计时器外设的标准接口。 此模块是硬件抽象层(HAL)软件包的一部分、它隐藏了硬件的目标/器件特定特性。

    您可以使用此模块创建计时器(即标记计时器以供使用)、并将其配置为在计时器到期时调用 tickFxn。 仅当您不需要对计时器外设进行任何自定义配置时、才可使用此模块。

    计时器中断始终使用 Hwi 调度程序。 计时器 tickFxn 在 Hwi 线程的上下文中运行。 定时器模块自动为定时器中断创建一个 Hwi 实例。

    我看不到通过 HAL 计时器 API 访问自动创建的 HWI 的方法。

    可以使用 HWI API 访问计时器的 HWI 句柄。 请参阅请参阅 /docs/cdoc/ti/sysbios/hal/Hwi.html、所有目标实例共用的函数。 但是、我看不到一种通过动态方式更改 HWI 优先级的方法。

    我再次建议您使用 DMTimer API 而不是 HAL Timer API 来访问 HWI 优先级。

    [报价用户="ShawnD"]如果我使用 dmtimer 目录中的 timer.h,驱动程序将崩溃[/quot]

    您是否已将 DMTimer 模块包含在.cfg 文件中并且应用程序崩溃? 我以前在同一个应用中同时使用了两个模块。

    此致、
    弗兰克

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

    您好、Frank、

    由于 hal/Timer.h 和 dmtimer/Timer.h 中对 Timer_Params 有不同的定义、驱动程序崩溃  包括 DMTimer 版本会重新定义 Timer_Params、并在 Timer_Params 指针传递到 Timer_create 时导致崩溃。  回顾编译器输出后、我注意到我之前错过了以下警告:

    C:/ti/bios_6_75_02_00/packages/ti/sysbios/timers/dmtimer/Timer.h:1068:0:警告:重新定义了"TIMER_PARAMS"
    #define Timer_Params ti_SysBIOS_timer_dmtimer_Timer_Params

    仍然不清楚为什么有两种计时器实现、或者它们为什么会使用不同定义的相同结构。   

    我将尽可能从.cfg 文件中删除 timer.h 和计时器驱动程序、并仅使用 DM计时 器实现。  

    假设这允许我提高计时器中断的优先级、这只回答了我原来的一半问题。  我需要优先于任何当前运行的 HWI。  当我增加优先级时、这会自动发生吗?  或者、我是否需要做额外的工作才能使占先生效?

    谢谢

    肖恩

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

    您好、Frank、

    我成功切换到了 DMTimer 版本、并且能够设置优先级。  ROV 显示了以下内容:

    如您所见、DMTimer3和4的 HWI 的优先级设置为21。  我随意选择、只是因为 UART 驱动程序将优先级设置为32、我需要高于此优先级。

    返回到占先问题。  TRM 的以下两个部分介绍了中断占先、这很涉及中断占先。  SYS/BIOS 和/或 HWI 驱动程序是否为我处理此问题?  或者我是否需要执行所有这些操作?

    6.2.3 INTC 抢先式处理序列
    抢先式中断、也称为嵌套式中断、可以减少较高优先级中断的延迟。
    优先级更高的中断可以暂停抢先式 ISR。 因此、优先级更高的中断可以是
    立即送达。 嵌套中断必须小心使用、以避免使用损坏的数据。 程序员
    必须保存可损坏的寄存器并在 ARM 端启用 IRQ 或 FIQ。 IRQ 和 FIQ 处理序列
    非常相似、FIQ 序列的差异显示在下面代码中的'/'字符之后。
    要通过更高优先级的 IRQ/FIQ 启用 IRQ/FIQ 抢占、程序员可以按照此过程进行写入
    ISR。
    在 IRQ/FIQ ISR 开始时:
    1.保存 ARM 关键环境寄存器。
    2.在修改 INTC_THRESHOLD 字段之前保存该字段。
    3.读取 INTC_IRQ_Priority IRQPRIORITy/INTC_FIQ_PRIMARITY 中的活动中断优先级
    FIQPRIORITY 域并将其写入 PRIORITYTHRESHOLD (1)域。
    4、读取 INTC_SIR_IRQ[6:0] ACTIVEIRQ/INTC_SIR_FIQ[6:0]中的活动中断编号
    ACTIVEFIQ 域来识别中断源。
    5.在中断时向相应的 INTC_CONTROL NEWIRQAGR 位和(2) NEWFIQAGR 位写入1
    仍在处理、以便仅允许更高优先级的中断挤占。
    6.由于写操作被布置在互连总线上,因此要确保前面的写操作已经完成
    在启用 IRQ/FIQ 之前、使用数据同步边界。 此操作可确保 IRQ
    线路在 IRQ/FIQ 启用前被取消置位。
    7.在 ARM 端启用 IRQ/FIQ。
    8.跳转至相关的子例程处理程序。

     

    6.2.4中断抢占
    如果希望通过更高优先级的中断启用挤占、ISR 应读取活动中断
    并将其写入优先级阈值寄存器。 将‘1’写入相应的 new_IRQ_AGR 或
    控制寄存器的 new_FIQ_AGR 位在处理中断时现在只允许
    优先级更高的中断来挤占。
    对于每个级别的挤占、程序员必须先保存阈值、然后再修改和
    在该 ISR 级别结束时恢复它。
    当写入一个介于0至7Fh 范围内的优先级时、优先级阈值机制被自动启用
    将从 IRQ_PRIORITY 和 FIQ_PRIORITY 寄存器中读取。 写入 FFh 的值(复位
    默认)禁用优先级阈值机制。
    当硬件优先级阈值被使用时、被选为 FIQ 或 IRQ 的中断优先级变为
    否则它们是独立的。 链接时、需要将所有 FIQ 优先级设置为高于
    所有 IRQ 优先级以保持 FIQ 相对于 IRQ 的相对优先级。
    使用优先级阈值机制处理 FIQ 时、需要同时写入两个新 FIQ
    协议位和新 IRQ 协议位、以涵盖新优先级的情况
    在 IRQ 排序过程中应用阈值。 ARM 不会将此 IRQ 视为
    它在进入 FIQ ISR 时将被屏蔽。 但是、IRQ 源将保持激活状态
    当优先级阈值降至足够低的优先级时、将最终进行处理。 书写的预防措施
    在作为 FIQ 排序的 IRQ ISR 期间、不需要更改为新的 FIQ 协议(以及新的 IRQ 协议)
    将不受影响(前提是所有 FIQ 优先级都高于所有 IRQ 优先级)。

     

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

    您好、Shawn、

    根据这一 e2e 帖子、SYS/BIOS 支持 AM335x 上的嵌套中断: https://e2e.ti.com/support/processors/f/791/t/648444

    请参阅 /docs/cdoc/ti/sysbios/hal/Hwi.html:

    配置 Hwi.dotherAutoNestingSupport

    实例配置参数、IHwi_MaskingOption maskSeting

    您能否使用这些 HWI 配置参数进行实验、并查看嵌套 HWI 是否适合您?

    此致、
    弗兰克

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

    您好、Frank、

    我实施了这些更改、我看到了一些奇怪的行为、您可能会对此有所帮助。  下面是代码。  

    Timer_Params_init (&timerParams);
    timerParams.period = 500;
    timerParams.periodType = Timer_PeriodType_micros;
    timerParams.startMode = Timer_StartMode_user;
    timerParams.runMode = Timer_RunMode_OneShot;

    Hwi_Params_init (&hwi_params);
    Hwi_params.priority = 0x15;
    // hwi_params.maskSetting = Hwi_MaskingOption_LOWER;
    // timerParams.hwiParams =&hwi_params;
    // timerParams.extFreq.hi = 0;
    // timerParams.extFreq.lo = 24000000;

    tm_timer_handle = Timer_create (Timer_any、(Timer_Functr) timerFunc、&timerParams、&EB);
    if (TM_TIMER_Handle = NULL)

    System_printf ("计时器创建失败\n");

    Types_FreqHz 频率;
    Timer_getFreq (TM_timer_handle、_freq);

    system_printf ("freq low %lu\n"、freq.lo);

    我创建了一个以微秒为周期的 OneShot 计时器。  UART 驱动程序将 HWI 中断优先级设置为0x20、因此我将计时器设置为0x15。  如果 maskSettings 被设定为 Hwi_MaskingOption_LOWER、我得到一个高达25us 的定时器持续时间变化。  将其删除会将变体降低至大约1us。  但是、持续时间是错误的。  我添加了对 timer_getFreq 的调用、它返回32768、即默认32kHz 时钟。  下面是打开 ROV 的调试器的屏幕截图。。。

    驱动器将微秒转换为计数。  您可以看到时钟实际上是32kHz。  在32kHz 时、每个节拍为30.5us (1000000/32768)。  因此500us 应为16.34个周期。  通过查看 ROV、您可以看到它向下舍入到了15。  当使用逻辑分析仪进行测量时、结果为669.3us。  请参阅以下内容...

    这毫无意义。  时钟正确、计数足够正确(我可以处理舍入)、但持续时间远未完成。  如果我将周期设置为330us、则 ROV 中的计数为9、持续时间测量值为489.7us。  我尝试将时钟设置为24MHz、 ROV 中的计数为120000、确切地说是500us。  但它要么崩溃、要么计时器永远不会触发。  

    我可以将其更改为计数和测量持续时间、并算出实际为500us 的值、但这并不正确。  我想弄清楚如何让计时器进行防火校正。

    谢谢

    肖恩

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

    您好、Shawn、

    [引用用户="ShawnD"] UART 驱动程序将 HWI 中断优先级设置为0x20,因此我将计时器设置为0x15[/引用]

    在 SYS/BIOS 中、较低的中断编号与较低的优先级相一致。 您是否希望定时器的优先级低于 UART?

    我无法解释错误的计时器持续时间。 您是否有一个可以共享的简单项目来证明问题?

    您是否多次尝试过一次性计时器事件? 您是否始终观察到错误的持续时间?

    您是否曾尝试过定期计时器、以查看在这种情况下计时的持续时间是否也不正确?

    此致、
    弗兰克

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

    肖恩、

    我对 HWI 优先级编号进行了实验、发现较低的编号对应较高的优先级。 它显示的优先级编号直接映射到 INTC 中断优先级。

    此致、
    弗兰克

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

    肖恩、

    您正在驱动哪些信号来测量单次触发计时器过期所需的时间?

    此致、
    弗兰克

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

    您好、Shawn、

    关于在您尝试将时钟输入频率设置为24MHz 时发生的崩溃、您是否设置了时钟多路复用器、以便选择24MHz 时钟作为所选 DMTimer 的输入? 请参阅 TRM CLKSEL_TIMERx_CLK。 您可以更新 GEL 文件或应用中的时钟多路复用器选择。

    此致、
    弗兰克

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

    您好、Frank、

    我已经使用它几天了。  这是我找到的内容。

    我启用计时器并在代码中设置时钟。  这是一个生产应用程序、因此不使用 GEL 文件。  但是、我确实从 ICEv2电路板的 GEL 文件中获取了代码、位于此处...

    \ccsv8\ccs_base\emulation\boards\ice_am3359\gel\TMDXICE3359.gel

    它有一个用于启用时钟的脚本。  但是、我发现为 CLKSEL 定义的寄存器偏移不正确、请参阅下面的

    #define WR_MEM_32 (addr、data)*(unsigned int*)(addr)=(unsigned int)(data)
    #define RD_MEM_32 (addr)*(unsigned int*)(addr)

    //计时器配置
    #define CM_PER (0x44e00000)
    #define CM_DPLL (0x44e00500)

    #define CM_PER_TIMER2_CLKCTRL (CM_PER + 0x80)
    #define CM_PER_TIMER3_CLKCTRL (CM_PER+0x84)
    #define CM_PER_TIMER4_CLKCTRL (CM_PER+0x88)
    #define CM_PER_TIMER5_CLKCTRL (CM_PER+0xEC)
    #define CM_PER_TIMER6_CLKCTRL (CM_PER+0xF0)
    #define CM_PER_TIMER7_CLKCTRL (CM_PER + 0x7C)

    #define CLKSEL_TIMER2_CLK (CM_DPLL + 0x04)
    #define CLKSEL_TIMER3_CLK (CM_DPLL + 0x08)
    #define CLKSEL_TIMER4_CLK (CM_DPLL + 0x0C)
    #define CLKSEL_TIMER5_CLK (CM_DPLL + 0x14)
    #define CLKSEL_TIMER6_CLK (CM_DPLL + 0x18)
    #define CLKSEL_TIMER7_CLK (CM_DPLL + 0x00)

    它们接近、但不正确。  当我想设置时钟时、我实际上设置了其他寄存器、因此会出现奇怪的行为。  它们应如下:

    #define CLKSEL_TIMER2_CLK (CM_DPLL + 0x08)
    #define CLKSEL_TIMER3_CLK (CM_DPLL + 0x0C)
    #define CLKSEL_TIMER4_CLK (CM_DPLL + 0x10)
    #define CLKSEL_TIMER5_CLK (CM_DPLL + 0x18)
    #define CLKSEL_TIMER6_CLK (CM_DPLL + 0x1C)
    #define CLKSEL_TIMER7_CLK (CM_DPLL + 0x04)

    更改后、情况变得更加稳定、但持续时间仍然不正确。  下面是我如何启用计时器和设置时钟

    //启用计时器
    WR_MEM_32 (CM_PER_TIMER2_CLKCTRL、0x2);
    WR_MEM_32 (CLKSEL_TIMER2_CLK、0x2);

    WR_MEM_32 (CM_PER_TIMER3_CLKCTRL、0x2);
    WR_MEM_32 (CLKSEL_TIMER3_CLK、0x2);

    WR_MEM_32 (CM_PER_TIMER4_CLKCTRL、0x2);
    WR_MEM_32 (CLKSEL_TIMER4_CLK、0x2);

    WR_MEM_32 (CM_PER_TIMER5_CLKCTRL、0x2);
    WR_MEM_32 (CLKSEL_TIMER5_CLK、0x1);

    WR_MEM_32 (CM_PER_TIMER6_CLKCTRL、0x2);
    WR_MEM_32 (CLKSEL_TIMER6_CLK、0x2);

    WR_MEM_32 (CM_PER_TIMER7_CLKCTRL、0x2);
    WR_MEM_32 (CLKSEL_TIMER7_CLK、0x2);

    每个时钟被设定为32kHz 时钟(除了 timer5、它应该使用系统时钟)。  使用这种方法、与之前一样、时钟被设置、但持续时间始终不正确。  它们非常一致、但不正确。  调用 Timer_getFreq 时、它返回32kHz。  我已经单步执行了驱动程序代码、它将计算32kHz 时钟的周期、计算结果是正确的。  就好像时钟运行得更快。  

    当我运行时钟树工具时、它会显示19.2Mhz 频率下的所有定时器。  这似乎很奇怪、因为除了5个外、它们都配置为32kHz。  

    现在、如果我将时钟配置为32kHz、并以1500us 作为计数、我会得到大约1647us 的回调。  我使用 GPIO 通过逻辑分析仪测量持续时间。  如果我将周期下调至1175us、我现在得到一个大约为1468us 的一致中断。  因此、时钟的运行速度实际上超过32kHz。

    在 timer5上、时钟配置为使用系统时钟(Timer_getFreq 仍返回32kHz)、持续时间为1500us、HWI 回调大约在6.53us 内调用。  因此、这证明时钟以更快的速率运行。  如果以19.2Mhz 运行、则每个节拍为0.050208us。  驱动器仍在计算时钟周期、就好像它有32kHz 时钟一样、因此计数为48。  19.2Mhz 下的48个时钟周期约为2.5us。  因此、增加一些开销、并且可能 已经接近。  

    因此、我尝试更改计时器5的使用计数、而不是微秒。  在19.2Mhz 时为1500us、为28800滴答。 从未调用回调。   

    遗憾的是、由于我们在定制板上运行、因此我没有任何示例项目来证明这一问题。

    从所有这些开始、我真的在这里尝试制造损失。  请提供任何帮助。

    谢谢

    肖恩

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

    您好、Shawn、

    您的更新偏移 CLKSEL_TIMERx_CLK 与 TRM 匹配且正确。

    时钟树工具默认将 SYS_CLKIN 设置为19.2MHz。 可以通过在主视图中选择 SYS_CLKIN、然后使用下拉菜单在控制器视图中更改 SYS_CLKIN 来更改此值。

    连接到电路板上 OSC0_IN/OSC0_OUT 的晶体的频率是多少?

    确保 CLKSEL_TIMERx_CLK 中选择的定时器输入时钟频率与 Timer_create ()的定时器参数中的值相匹配。 例如:

    Timer_Params_init (&timerParams);
    timerParams.extFreq.hi = 0;
    timerParams.extFreq.lo = 24000000;// xtal freq
    //timerParams.extFreq.lo = 32768;// xtal freq
    timerParams.period = 500;
    timerParams.periodType = Timer_PeriodType_micros;
    timerParams.arg = 0;
    timerParams.startMode = Timer_StartMode_user;
    timerParams.runMode = Timer_RunMode_OneShot;
    timerParams.tclr.pt = 1;/*切换 PORTIMERPWM *
    timerParams.tclr.trg = 1;//在溢出时触发 PORTIMERPWM
    hTimer1 = Timer_create (2、(Timer_FuncPtr)&timer1Fxn、&timerParams、Error_Ignore);//计时器 ID 2是 DMTimer 4
    
    Timer_getFreq (hTimer1、&freq);
    if (freq.lo!= timerParams.extFreq.lo){
    system_abort ("错误、错误计时器频率");
    }
    

    此致、
    弗兰克

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

    您好、Frank、

    我检查了原理图、在 OSC0_IN 上有一个24MHz 晶体。  代码如下所示:

    //启用 DMTIMER4

    WR_MEM_32 (CM_PER_TIMER4_CLKCTRL、0x2);

    //使用 CLK_M_OSC
    WR_MEM_32 (CLKSEL_TIMER4_CLK、0x1);

    Timer_Params_init (&timerParams);
    timerParams.period = 500;
    timerParams.periodType = Timer_PeriodType_micros;
    timerParams.startMode = Timer_StartMode_user;
    timerParams.runMode = Timer_RunMode_OneShot;
    //使用24MHz 时钟-必须匹配 CLK_M_OSC  
    timerParams.extFreq.hi = 0;
    timerParams.extFreq.lo = 24000000;

    //Increate the priority of the HWI

    Hwi_Params_init (&hwi_params);
    Hwi_params.priority = 0x15;
    Hwi_params.maskSetting = Hwi_MaskingOption_LOWER;
    timerParams.hwiParams =&hwi_params;

    Timer_handle = Timer_create (DMTIMER4_ID、(Timer_Functr) timerFunc、&timerParams、&EB);

    以上就是我创建一个更准确的计时器的方法。  我们已经验证了 HWI 是否优先于较低优先级的 HWI。  在500us 计时器上、它非常精确。  但是、当它设置为1500us 时、它的持续时间大约为10-12us。  我们已经调整了该值、将其引入到我们需要的位置。  但它应该是准确的、无需调整。

    至于32kHz 时钟、无论是使用微秒还是计数、我都无法使其精确。

    因此、我们来回顾一下已更改的所有内容:

    • 更改为 DMTIMER 驱动程序、而不是 HAL 计时器驱动程序
    • 使用 HWI_Params 结构设置 HWI 优先级。
    • 在 HWI_Params 结构中设置中断屏蔽。
    • 切换到 OSC 时钟(本例中为24MHz)
    • 在 Timer_params 中设置频率以匹配时钟

    这样、我就能够创建具有更高优先级的时钟。

    感谢你的所有帮助。

    肖恩

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

    肖恩

    [引用用户="ShawnD"]但是,当它设置为1500us 时,它的持续时间大约为10-12uS。

    [引用 user="ShawnD"]对于32kHz 时钟,我从未使用微秒或计数来使其准确。

    我没有解释。  我将尝试一些实验、看看我是否可以重现您的发现。

    我收集到问题现在已解决、因此我将关闭此主题。  

    此致、
    弗兰克