我已配置两个 GPT 计时器、如下所示。 我看到第一个 GPT 计时器'BQ761xNW1GptChannel'不工作,我看不到回调'BQ761xNW1GptCbk()'。 请检查并提供您的意见
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.
我已配置两个 GPT 计时器、如下所示。 我看到第一个 GPT 计时器'BQ761xNW1GptChannel'不工作,我看不到回调'BQ761xNW1GptCbk()'。 请检查并提供您的意见
尊敬的 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
感谢 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)的比较值。
尊敬的 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)。
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;
中断;
默认值:
中断;
您知道从何处下载 EB Tresos 24吗? 我在 MySecure 软件中找不到它。
您好 QJ、
下面是 mySecure 链接
谢谢、
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
您好 Q J、
我不认为 GPT_IsrNotifyFunctions 数组 索引指示比较单元、而是按通道模式索引、"
相反、它的索引是根据'gpt_IsrIndex[通道][RTI1_COMPARE2]'计算的
其值是从为比较单元2配置的模式中分配的、该模式为"GPT_CH_MODE_OneShot"、因此索引应为"1"、但我看到该值为"0"、不知道原因。
此致、
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"。
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 中注释掉这一行代码:
例如: