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.

[参考译文] LAUNCHXL2-TMS57012:GPT Autosar 驱动器、第二个定时器配置不起作用

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1167977/launchxl2-tms57012-gpt-autosar-driver-second-timer-configuration-is-not-working

器件型号:LAUNCHXL2-TMS57012

我已配置两个 GPT 计时器、如下所示。 我看到第一个 GPT 计时器'BQ761xNW1GptChannel'不工作,我看不到回调'BQ761xNW1GptCbk()'。 请检查并提供您的意见

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

    e2e.ti.com/.../Gpt.xdm

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

    尊敬的 Ravi:

    我正在处理此问题、请允许我在我的结尾处检查此问题、然后返回给您。

    谢谢、
    G Kowshik

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

    尊敬的 Ravi:

    我已将该主题帖重新分配给相应的所有者(Hercules 支持所有者)。  

    谢谢

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

    谢谢 Kowshik

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

    尊敬的 Ravi:

    您正在使用的 MCAL 应用示例来自 TI BMS 团队。 从屏幕截图中、GPT 通道0和通道1均已启用。

    您是否通过调用 GPT_StartTimer(...)来启动通道1? 例如、GPT_StartTimer (1、2000)->通道1和2ms、对于 tick=1MHz

    [引用 userid="510930" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1167977/launchxl2-tms57012-gpt-autosar-driver-second-timer-configuration-is-not-working "]我看不到回调'BQ761xNW1GptCbk()'[/quot]

    BQ761xNW1GptCbk()回调函数在 gptCallout.c 中定义

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

    您好 Q J、

    是的、我正在为两个通道调用'GPT_EnableNotification'、然后调用 GPT_StartTimer (channel、time)。 我正在使用的 MCAL 版本是5.40、我也在版本6.0.0中尝试过。 是的、我们正在使用 TI BMS CDD 软件。

    我在下面尝试过、我在这两种情况下都看到了问题。

    1) 1)为2个 GPT 计时器分配单独的计数器通道和比较单元。

    2) 2)为 GPT 计时器分配单个计数器通道、为 GPT 计时器分配单独的比较单元。

    我还尝试为所有比较单元启用中断。

    您是否在我与您共享的 GPT 配置文件中看到任何问题?

    此致、

    Ravi

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

    尊敬的 Ravi:

    配置中的 BQ761xNW1GptChannel 使用 RTI 比较2、因此应在 VIM 矢量表中定义 ISR 处理程序:

    对于 RTI 比较2、MCAL 驱动程序使用&GPT_Ch2Isr:

    更改:

    至:

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

    尊敬的 Ravi:

    请共享以下文件或 整个 EB config 项目

    GPT_PBCfg.c

    Gpt_PBCfg.h

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

    感谢 QJ 的快速响应。 附件是您要求的文件。

    我看到 GptChannelId '0'和 GptCompareUnit '0'由操作系统'vPortPreempetiveTick'使用,所以我们不能将其用于我们的应用程序,是否可以同时使用'BQ761xNW0GptChannel'(GptChannelpt1、Compare unit 1)和'BQ761xNW1GannelChannel (  Gpt1)、Compare unit 1),同时使用 GannelChannel 1 (GannelChannel 1)  如果是这样, 则每个通道作为参数传递给 GPT_StartTimer()的通道编号是多少。

    e2e.ti.com/.../4606.sys_5F00_vim.c

    e2e.ti.com/.../Gpt_5F00_PBcfg.ce2e.ti.com/.../Gpt_5F00_Cfg.he2e.ti.com/.../7317.Gpt.xdm

    谢谢、

    Ravi

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

    尊敬的 Ravi:

    我无法打开您的 GPT.xdm、因为打开模块配置 GUI 需要项目配置。  

    在文本编辑器中、我知道使用了两个 RTI 计数器(计数器0和计数器1)、并使用了三个比较寄存器:

    比较寄存器0 ->使用计数器0 -> GptOsTick

    比较寄存器1 ->使用计数器1 -> BQ761xNW0GptChannel

    比较寄存器2 ->使用计数器2 -> BQ761xNW1GptChannel

    [报价 userid="510930" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1167977/launchxl2-tms57012-gpt-autosar-driver-second-timer-configuration-is-not-working/4395622 #4395622"]是否可以同时使用"BQ761xNW0GptChannel"(GptChannelId 1、比较单元1)和"BQ761xNW1GptChannel"(  GptChannelId 1、比较单元2) ,[/报价]

    是的、您可以一次使用它们。 RTI 支持多达4个比较寄存器。  

    [引用 userid="510930" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1167977/launchxl2-tms57012-gpt-autosar-driver-second-timer-configuration-is-not-working/4395622 #4395622"]如果是, 则其中每一个将作为参数传递给 GPT_StartTimer()的通道编号是多少。

    GPT_StartTimer (ChannelID、TimeValue)中的通道 ID 是计数器的数量:count0或计数器1。 在您的情况  下、计数器1用于 BQ761xNW0GptChannel 和 BQ761xNW1GptChannel。

    TimeValue (GPT_StartTimer()中的第二个参数)是编程到比较寄存器(RTICOMP1/2)和更新比较寄存器(RTIUDCP1/2)的比较值。

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

    您好 Q J、  

    感谢您的善意回应。 我们的应用需要同时使用 "BQ761xNW0GptChannel"和"BQ761xNW1GptChannel" (不是一次一个)、因此两个通道不能使用相同的计数器值"1"。 我的理解是正确的。

    此外 、我看到生成的通道编号 不正确

    此致、

    Ravi

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

    尊敬的 Ravi:

    [引用 userid="510930" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1167977/launchxl2-tms57012-gpt-autosar-driver-second-timer-configuration-is-not-working/4397120 #4397120"]两个通道的计数器值"1"不可能发生变化

    它们可以同时使用同一个计数器。  

    这是 RTI 应用程序 ID 或比较单元的数量。  BQ761xNw0GptChannel 使用比较1、 BQ761xNw1GptChannel 使用比较2。 这里的数字(0、1、2)不代表 RTI 计数器的数量(0或1)。

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

    感谢 QJ,我的意思是我们不能像  下面那样调用 BQ761xNW0GptChannel 和 BQ761xNW1GptChannel 的 GPT_StartTimer(),因为两者都使用相同的通道编号。 我们尝试了它,但它对我们不起作用(在下面的例子 中,只有 BQ761xNW1GptChannel 正在工作并接收回叫  。'BQ761xNW1GptCbk()')

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

    在 COM_GPT_StartTime (COM_GPT_CHANNEL、...)之后 是否已调用、RTI Compare1寄存器是否已编程: RTICOMP1和  RTCUDCP1?

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

    您好 Q J、

    下面是当  COM_GPT_StartTime (COM_GPT_CHANNEL、..)时寄存器内容的屏幕截图。  被调用

    我还看到'BQ761xNw1GptCbk ()'是从'gppt_Ch1Isr'触发的、而我认为它应该从'gppt_Ch2Isr'触发

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

    com_gpt_channel  =   BQ761xNW0GptChannel -->使用比较单元1和计数器1 -->不工作

    BQ761xNW1GptChannel -->使用比较单元2和计数器1 -->工作正常

    未对 RTCUDCP1进行编程。 这意味着它只能生成一个中断。 对于单次触发模式应该是可以的。

    未对 RTCUDCP2和 RTICMP2进行编程、 此 BQ761xNW1GptChannel 将不起作用。  

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

    我认为我找到了根本原因。  GPT.c 文件中的 GPT_SetRegStartTimer()中有一个软件错误。

    对于单次触发模式、如果使用计数器0、则仅对 GPT_RTI1_COMP0进行编程;如果使用计数器1、则仅对 GPT_RTI1_COMP1进行编程。  

    在您的情况   下、计数器1用于比较1和比较2、仅对 GPT_RTI_COMP1进行编程、并对 GPT_RTI_COMP2进行编程、因此 BQ761xNW1GptChannel 不起作用。

    这可能是 MCAL 的限制。  

    您可以修改驱动程序并尝试吗?

    更改为:

    GPT_ChannelNotifyFunctions[GPT_Channel]= GPT_Config_pt->ChannelConfig_pt[通道].Notification_pt;
    if (ChannelMode_t = GPT_CH_MODE_OneShot)

    GPT_RTI1_COMP1 =值;
    switch (GPT_Config_pt->ChannelConfig_pt[通道].CompareUnit)

    案例 RTI1_COMPARE0:

    GPT_RTI1_COMP0 =值;
    GPT_RTI1_UDCP0 = 0U;
    中断;


    案例 RTI1_COMPARE1:

    GPT_RTI1_COMP1 =值;

    GPT_RTI1_UDCP1 = 0U;
    中断;


    案例 RTI1_COMPARE2:

    GPT_RTI1_COMP2 =值;
    GPT_RTI1_UDCP2 = 0U;
    中断;


    案例 RTI1_COMPARE3:

    GPT_RTI1_COMP3 =值;
    GPT_RTI1_UDCP3 = 0U;
    中断;

    默认值:
    中断;

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

    感谢 Q J 的快速响应。

    在'gppt_SetRegStartTimer()中,我看到对于所有'CompareUnit'值,我们只设置'gppt_RTI1_COMP0'。 它是 GPT MCAL 模块中的一个错误

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

    您好 QJ、

    我尝试了您建议的更改、我看到 RTICOMP2值已更新、但 'BQ761xNW1GptCbk ()'是从'GPT_Ch1Isr'触发的、'GPT_Ch2Isr'没有被触发、这是可以预料的

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

     我看到比较0/1/2的 RTI 中断被启用:

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

    好的、配置 sys_vim.c'后、我看到 'gpt_Ch2Isr'被触发、但 'BQ761xNW1GptCbk ()'仍从  'gppt_Ch1Isr'被触发  

     我认为 我们为每个通道都提供了通知功能('gpt_ChannelNotifyFunctions'),但每个比较单元都没有通知功能。

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

    您能否与我共享 EB 配置文件? 使用哪个版本的 EB tresos?

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

    我有:TI_BMS_07_15。 但我无法在 EB Tresos 21上打开它

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

    尊敬的 Ravi:

    请在 main()代码中添加一条指令以启用 RTI compare2中断:

      vimREG->REQMASKSET0 |=((uint32) 1U <<4U);

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

    您好 Q J、

    我们需要使用 EB tresos 24来打开配置文件。

    我进行了以下更改,正在接收中断 GPT_Ch2Isr, 但 'BQ761xNW1GptCbk()'仍从  'GPT_Ch1Isr'触发。 我看到'gpt_ChannelNotifyFunctions'  数组大小为'2'( 最大通道数)。

      

    此致、

    Ravi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="510930" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1167977/launchxl2-tms57012-gpt-autosar-driver-second-timer-configuration-is-not-working/4400011 #4400011"]我们需要使用 EB tresos 24来打开配置文件。

    您知道从何处下载 EB Tresos 24吗? 我在 MySecure 软件中找不到它。

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

    您好 QJ、

    下面是 mySecure 链接  

    我的安全资源| myTI |德州仪器(TI)

    谢谢、

    Ravi

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

    谢谢、我将检查我的。  

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

    您好 QJ、

    如果您能够查看此信息、请告诉我您是否有任何更新。

    此致、

    Ravi

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

    尊敬的 Ravi:

    我迷路了。 现在有什么问题吗?

    GPT 配置通道

    GptOsTick

    BQ761xNW0GptChannel

    BQ761xNW1GptChannel

    0

    1

    2.

    RTI 计数器或 GPT 通道 ID

    0

    1

    1

    RTI 比较单元

    0

    1

    2.

    运行模式

    连续

    单次触发

    单次触发

    回调函数

     

    BQ761xNw0GptCbk

    BQ761xNw1GptCbk

    中断

    调用 GPT_EnableNotification()后启用

    调用 GPT_EnableNotification()后启用

    调用 GPT_EnableNotification()后启用

    ISR (vim.c)

    vPortPreemptiveTick

    GPT_Ch1Isr

    GPT_Ch2Isr

     

     

     

     

    您能否在 gpt_ch1Isr ()和 gpt_ch12Isr ()中添加一个断点来检查您是否获得了 RTICOMP1和 RTICOMP2的中断?  

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

    您好 QJ、

    我看到在 sys_vim.c 中启用中断后触发了'gpt_Ch2Isr ()'

    问题是、我看不到"BQ761xNw1GptCbk"正因以下更改而被触发

    主要问题是调用 GPT_Ch2Isr()时,它将尝试调用 GPT_ChannelNotifyFunctions[2]指针函数,该函数组超出索引范围,因此它将崩溃。 我认为这是 GPT 中的一个错误。

      

    MAX_GPT_CHANNELS 必须为4而不是2、并且它应包含用于调用每个比较单元函数的指针。

    此致、

    Ravi

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

    尊敬的 Ravi:

    比较2用于在 CDD 项目中触发唤醒功能:

    您指定的通知不会在 WAKEUP 函数中调用:

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

    由于您的案例中的 compare2用作单次触发模式、而不是唤醒计时器、请将第三个函数更改为"gppt_NotifSingleIsr"、然后重试:

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

    您好 Q J、

    我不认为 GPT_IsrNotifyFunctions 数组 索引指示比较单元、而是按通道模式索引、"

    相反、它的索引是根据'gpt_IsrIndex[通道][RTI1_COMPARE2]'计算的  

    其值是从为比较单元2配置的模式中分配的、该模式为"GPT_CH_MODE_OneShot"、因此索引应为"1"、但我看到该值为"0"、不知道原因。

    此致、

    Ravi

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

    尊敬的 Ravi:

    快照未正确显示。 您可以再次发布吗?  

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

    再次发布图像。  

    不要认为 GPT_IsrNotifyFunctions 数组 索引表示比较单元、而是按通道模式进行索引、即"单次触发"。

    相反、它的索引是根据'gpt_IsrIndex[通道][RTI1_COMPARE2]'计算的  

    其值是从为比较单元2配置的模式中分配的、该模式为"GPT_CH_MODE_OneShot"、因此索引应为"1"、但我看到该值为"0"、不知道原因。

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

    我的理解是 、GPT_IsrNotifyFuncions 由通道编号确定、例如 BQ761xNW1GptChannel。

    如果中断由 RTI1_COMPARE2生成、 BQ761xNw1GptChannel 将返回 GPT_GetConfiguredChannelForCompareUnit (RTI1_COMPARE2)的值;

    GPT_IsrNotifyFuncions 指向  &GPT_WakeupContactIsr、

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

    a)在'gpt_Ch2Isr ()'函数中、我们可以看到'gpt_IsrNotifyFunctions'数组的索引为'gpt_IsrIndex[通道][RTI1_COMPARE2]'  

    ############################################################################################################################

    #if ((GPT_CFG_ISR_TYPE = GPT_ISR_CAT1)||(GPT_CFG_ISR_TYPE = GPT_ISR_void))
    #pragma CODE_STATE (GPT_Ch2Isr、32)
    /*SAFETYMCUSW 69S MR:3.4. "原因-指示中断子例程"*/
    #pragma INTERRUPT (GPT_Ch2Isr、IRQ)
    void GPT_Ch2Isr (void)
    #Elif (GPT_CFG_ISR_TYPE = GPT_ISR_CAT2)
    ISR( GPT_Ch2Isr )
    #endif

    uint8通道;
    通道= GPT_GetConfiguredChannelForCompareUnit (RTI1_COMPARE2);
    GPT_IsrNotifyFunctions[GPT_IsrIndex[通道][RTI1_COMPARE2]](通道);

    ############################################################################################################################

    b)在 GPT_StartTimer ()中、我们可以看到'gpt_IsrIndex'值是从通道模式分配的。

    ############################################################################################################################

    /*设置通知索引的信道模式*/
    GPT_IsrIndex[GPT_Channel][GPT_Config_pt->ChannelConfig_pt[GPT_Channel].CompareUnit]= ChannelMode_t;

    ############################################################################################################################

    如果我们看到  GPT_IsrIndex[1][2]的值为"0"。

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

    它应该是1、对吧?

    GPT_CH_MODE_OneShot = 1;

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

    是的、没错、它应该是1、我不确定为什么它是"0"

    此外、如果我们启用'GPT_DEV_ERROR_DET'、我会看到'GPT_E_BUSY'、因为'BQ761xNW0GptChannel'和'BQ761xNW1GptChannel' 被分配给同一计数器块'1'。

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

    我注意  到以下问题:如果启用了'gpt_dev_error_detect'(STD_ON)并且 RTI 计数器(0或1)已启动、则无法重新启动 RTI 计时器(0或1)、并且不会配置此通道使用的比较单元寄存器。  

     如果 GPT_DEV_ERROR_DETECT = STD_OFF、是否正常工作?

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

    否、即使 GPT_DEV_ERROR_DETECT = STD_OFF、它也不起作用

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

    尊敬的 Ravi:

    我将在获得实验后执行测试。

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

    Hercules 器件上的 RTI 模块有两个独立的64位计数器块、和四个由计数器块0或计数器块1驱动的可配置比较单元。

    在 MCAL 驱动程序中、GPT_ChannelConfigType 的 ChannelId 表示计数器时钟0或计数器块1 (RTI1_Channel1或 RTI1_CHANNEL2)。 GPT_ChannelConfigType 的 CompareUnit 表示比较单元(RTI1_COMPARE0、RTI1_COMPARE1、RTI1_COMPARE2、RTI1_COMPARE3)。

    RTI 可运行在两种模式:单次触发模式和连续模式。 GPT 驱动程序看起来具有用户指南中未提及的几个限制。

    1:单次触发模式的第一个限制:

    比较单元0 (RTI1_COMPARE0)只能在使用计数器块0时被用作单次触发模式、而比较单元1 (RTI1_COMPARE1)只能在使用计数器块1时被用作单次触发模式。

    比较单元2 (RTI1_COMPARE2)和比较单元3 (RTI1_COMPARE3)不能用作单次触发模式。

    如果消除这些限制,则应对 GPT_SetRegStartTimer()函数进行以下更改:

    对于 RTI1_Channel1:

    对于 RTI1_CHANNEL2:

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

    2.第二项限制

    如果计数器块(RTI1_Channel1、或 RTI1_CHANNEL2)被用于单次触发、这个计数器块不能被用于另外一个单次触发模式、并且不能被用于连续模式。

    例如、如果比较单元0 (RTI1_COMPARE0)和比较单元1都使用计数器块1、并且比较单元0配置为单次触发模式、 比较单元1配置为连续模式、当单次触发模式定时器超时、计数器块1停止、比较单元1也终止。

    要去除此限制,应对 GPT_NotifSingleIsr()中的代码进行以下修改:

    3.在 ISR 函数中使用 GPT_GlobalRestore()的一个建议:

    MCAL 驱动程序中的大多数函数在关键代码段之前调用 GPT_GlobalSuspend(),在关键代码段之后调用 GPT_GlobalRestore()。 通常,GPT_GlobalSuspend()是为了禁用 IRQ 中断,而 GPT_GlobalRestore()是为了启用 IRQ 中断。

    Cortex-R 架构不支持硬件嵌套中断。 当代码进入 IRQ 中断服务程序(ISR)时、IRQ 中断被自动禁用。 当代码离开 ISR 时、IRQ 被自动重新启用。 IRQ 或 FIQ ISR 中的 GPT_GlobalRestore()调用将导致数据中止。

    我建议在 ISR 中注释掉这一行代码:

    例如: