英飞凌
直播中

贺服窍

7年用户 976经验值
私信 关注

关于AURIX TC39使用TOM的三个通道CH0、CH4和CH5产生中断的疑问求解

我使用的是 AURIX TC39,想使用 TOM 的三个通道 CH0、CH4 和 CH5 来产生中断。 我的目标是不使用 IfxGtm_Tom_Pwm.h 中的默认结构。 图书馆 过去,我曾使用过一种触发 TOM 通道中断的方法,其配置如下:
GTM_TOM0_CH0_IRQ_EN.B.CCU0TC_IRQ_EN=1;
GTM_TOM0_CH0_IRQ_MODE.B.IRQ_MODE=0; /* 电平模式中断 */
volatile Ifx_SRC_SRCR *src1;
src1 = IfxGtm_Tom_Ch_getSrcPointer(NULL_PTR, IfxGtm_Cluster_0, IfxGtm_Tom_Ch_0);
IfxSrc_init(src1, IfxSrc_Tos_cpu0,(uint16) WHATCHDOG_PRIO);
IfxSrc_enable(src1);
一切似乎都运转正常。 在我目前正在开发的应用程序中,我希望使用 TOM 的 3 个通道来处理三个不同的中断。 首先,我还启用了 TOM 通道 CH4,以便通过以下配置产生中断:
GTM_TOM0_CH0_IRQ_EN.B.CCU0TC_IRQ_EN=1;
GTM_TOM0_CH0_IRQ_MODE.B. IRQ_MODE=0; /* 电平模式中断 */ volatile Ifx_SRC_SRCR *src1; rc1 = IfxGtm_Tom_CH0_IRQ_MODE.B.IRQ_MODE=0; /* 电平模式中断 */IRQ_MODE=0; /* 电平模式中断 */
volatile Ifx_SRC_SRCR *src1;
src1= IfxGtm_Tom_Ch_getSrcPointer(NULL_PTR, IfxGtm_Cluster_0, IfxGtm_Tom_Ch_0);
IfxSrc_init(src1, IfxSrc_Tos_cpu0,(uint16) WHATCHDOG_PRIO);
IfxSrc_enable(src1);
/* CH4 中断配置 */
GTM_TOM0_CH4_IRQ_EN.B.CCU0TC_IRQ_EN=1;
GTM_TOM0_CH4_IRQ_MODE.B.IRQ_MODE=0; /* 电平模式中断 */
volatile Ifx_SRC_SRCR *src3;
src3 = IfxGtm_Tom_Ch_getSrcPointer(NULL_PTR, IfxGtm_Cluster_0, IfxGtm_Tom_Ch_4);
IfxSrc_init(src3, IfxSrc_Tos_cpu1,(uint16) ENABLE_TRIGGER);
IfxSrc_enable(src3);

接下来,通过添加 TOM CH5 来产生中断,我发现即使设置 GTM_TOM0_CH5_IRQ_EN.B.CCU0TC_IRQ_EN=0,程序也会停止运行;我想问一下这种中断配置方法是否正确。 如果对您有帮助,我在下面留下三个通道的最终配置:

GTM_TOM0_CH0_IRQ_EN.B.CCU0TC_IRQ_EN=1;
GTM_TOM0_CH0_IRQ_MODE.B.IRQ_MODE=0; /* 电平模式中断 */
volatile Ifx_SRC_SRCR *src1;
src1 = IfxGtm_Tom_Ch_getSrcPointer(NULL_PTR, IfxGtm_Cluster_0, IfxGtm_Tom_Ch_0);
IfxSrc_init(src1, IfxSrc_Tos_cpu0,(uint16) WHATCHDOG_PRIO);
IfxSrc_enable(src1);
/* CH4 中断配置 */
GTM_TOM0_CH4_IRQ_EN.B.CCU0TC_IRQ_EN=1;
GTM_TOM0_CH4_IRQ_MODE.B.IRQ_MODE=0; /* 电平模式中断 */
volatile Ifx_SRC_SRCR *src3;
src3 = IfxGtm_Tom_Ch_getSrcPointer(NULL_PTR, IfxGtm_Cluster_0, IfxGtm_Tom_Ch_4);
IfxSrc_init(src3, IfxSrc_Tos_cpu1,(uint16) ENABLE_TRIGGER);
IfxSrc_enable(src3);
/* CH5 中断配置 */
GTM_TOM0_CH5_IRQ_EN.B.CCU0TC_IRQ_EN=1;
gtm_tom0_ch5_irq_mode.b.irq_mode=0;
volatile Ifx_SRC_SRCR *src4;
src4 = IfxGtm_Tom_Ch_getSrcPointer(NULL_PTR, IfxGtm_Cluster_0, IfxGtm_Tom_Ch_5);
IfxSrc_init(src4, IfxSrc_Tos_cpu3,(uint16) CONTROL);
IfxSrc_enable(src4);

回帖(1)

carey123

2024-6-3 14:13:33
在这个问题中,您想要使用AURIX TC39的TOM(Timer Output Module)的三个通道CH0、CH4和CH5来产生中断,而不使用IfxGtm_Tom_Pwm.h中的默认结构。您已经提供了一种触发TOM通道中断的方法,但是您可能需要对代码进行一些调整以满足您的需求。以下是一些建议和步骤,以帮助您实现目标:

1. 首先,确保您已经正确配置了TOM模块。这包括设置时钟、预分频器、计数器模式等。您可以查阅AURIX TC39的参考手册以获取更多详细信息。

2. 对于每个通道(CH0、CH4和CH5),您需要配置相应的寄存器以启用中断。以下是一些示例代码:

```c
// 配置CH0
GTM_TOM0_CH0_IRQ_EN.B.CCU0TC_IRQ_EN = 1;
GTM_TOM0_CH0_IRQ_MODE.B.IRQ_MODE = 0; // 电平模式中断

// 配置CH4
GTM_TOM0_CH4_IRQ_EN.B.CCU0TC_IRQ_EN = 1;
GTM_TOM0_CH4_IRQ_MODE.B.IRQ_MODE = 0; // 电平模式中断

// 配置CH5
GTM_TOM0_CH5_IRQ_EN.B.CCU0TC_IRQ_EN = 1;
GTM_TOM0_CH5_IRQ_MODE.B.IRQ_MODE = 0; // 电平模式中断
```

3. 接下来,为每个通道创建并初始化中断源(SRC)。以下是一些示例代码:

```c
volatile Ifx_SRC_SRCR *src1, *src2, *src3;

// CH0中断源
src1 = IfxGtm_Tom_Ch_getSrcPointer(NULL_PTR, IfxGtm_Cluster_0, IfxGtm_Tom_Ch_0);
IfxSrc_init(src1, IfxSrc_Tos_cpu0, (uint16)WHATCHDOG_PRIO);
IfxSrc_enable(src1);

// CH4中断源
src2 = IfxGtm_Tom_Ch_getSrcPointer(NULL_PTR, IfxGtm_Cluster_0, IfxGtm_Tom_Ch_4);
IfxSrc_init(src2, IfxSrc_Tos_cpu0, (uint16)WHATCHDOG_PRIO);
IfxSrc_enable(src2);

// CH5中断源
src3 = IfxGtm_Tom_Ch_getSrcPointer(NULL_PTR, IfxGtm_Cluster_0, IfxGtm_Tom_Ch_5);
IfxSrc_init(src3, IfxSrc_Tos_cpu0, (uint16)WHATCHDOG_PRIO);
IfxSrc_enable(src3);
```

4. 最后,为每个通道编写中断服务例程(ISR)。在ISR中,您可以执行所需的任务,例如更新PWM值、处理传感器数据等。以下是一些示例代码:

```c
void CH0_ISR(void)
{
    // 在这里编写CH0中断服务例程
}

void CH4_ISR(void)
{
    // 在这里编写CH4中断服务例程
}

void CH5_ISR(void)
{
    // 在这里编写CH5中断服务例程
}
```

5. 确保在您的项目中正确连接中断服务例程与中断源。这通常在启动代码中完成。

通过遵循上述步骤,您应该能够成功地使用AURIX TC39的TOM的三个通道CH0、CH4和CH5来产生中断。如果您在实现过程中遇到任何问题,请随时提问,我会尽力帮助您。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分