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.

[参考译文] TMS320F28069M:如 hal_tutorial.pdf 中所述更改中断优先级不起作用

Guru**** 2553260 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/626986/tms320f28069m-changing-interrupt-priority-like-told-in-hal_tutorial-pdf-does-not-work

器件型号:TMS320F28069M

您好!

我正在使用 TimerInterrupt、SCI 中断和 ADC 中断来实现主 ISR。

在 hal_tutorial.pdf 中、有人说、在使用 sci 时、我必须为 ADC 中断提供更高的优先级。 这听起来很好、我想这样做。 实际上它不起作用。

我更改了以下代码行:

void HAL_enableAdcInts (HAL_Handle handle)

 HAL_Obj * obj =(HAL_Obj *)句柄;
 //启用与 ADC 中断相关的 PIE 中断
 PI_enableAdcInt (obj->压 电式、adc_IntNumber_1HP);
 //启用 ADC 中断
 adc_enableInt (obj->adcHandle、adc_IntNumber_1);
 //为 ADC 中断启用 CPU 中断
 cpu_enableInt (obj->cpuHandle、cpu_IntNumber_1);
 返回;
}// HAL_enableAdcInts()函数结束

和 Init 矢量表

 PIe->TINT0 =&timer0ISR;
 PIe->ADCINT1_HP = mainISR;

 PIe->SCIRXINTB =&sciBRxISR;

问题:主 ISR 未触发、DRV 未初始化。 在通道7的 EOC 上、我触发另一个转换。 这也不奏效。

由于我的计时器还启用了 CPU_IntNumber_1、我认为这可能是问题所在。 但更改计时器中断的 IntNumber 也不起作用。

我是否错过了 STH?  我查看了处理器的手册等等、但我找不到问题。

将 ADC 中断更改为 IntNumber 1不起作用。  然后、我将计时器中断的 IntNumber 更改为5、计时器中断不起作用。  是否还有其他设置需要检查?

当 sci 具有 intNumber 9和 adc hat IntNumber10时、一切都正常

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    使用上面显示的设置、您是否能够输入 Timer0或 SCI-B RX 中断?

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

    您还需要更改另外两个方面。

    1.更改 mainISR()中的中断确认函数

     //确认 ADC 中断
     HAL_acqAdcInt (halHandle、ADC_IntNumber_1);

    2.按 如下方式更改 hal.h 文件中的 HAL_acqAdcInt()

    静态内联空 HAL_acqAdcInt (HAL_Handle handle、const ADC_IntNumber_e intNumber)

     HAL_Obj * obj =(HAL_Obj *)句柄;


     //清除 ADC 中断标志
     adc_clearIntFlag (obj->adcHandle、intNumber);


     //确认 PIE 组1的中断
     PI_clearInt (obj->压 电筒、PI_GroupNumber_1);

     返回;
    }// HAL_acqAdcInt()函数结束

    此致、

    Steve

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗨、非常感谢。 我是否正确地表示可以为任何中断编号分配任何中断? PI_GROUP 编号是否会在连接模块的中断编号或硬件端口上进行去抖?
    谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果我正确理解了您的问题、不可以、中断编号是不可更改的。 定时器0中断不能由定时器1通过改变一个设置来触发、因此、定时器0将只触发定时器0 ISR、用于指定它的特定 PIE 表条目。

    肖恩
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    非常感谢您的回复! 很抱歉、没有回复、这是一个紧张的星期。
    你说的对我来说是完全清楚的。 我的问题是关于外设中断的分配。 如果我正确理解了多路复用器、我有外设中断信号和 CPU 中断编号。 我可以将任何外设分配给任何 CPU 中断编号。 但实际上、我并不真正理解该任务的发生位置。 另外,我对中断组的理解也很不好。
    现在我的所有中断都在运行、但 ADC 和计时器模块都在 CPUintNumber1上。 但 ADC 是"HP"。 我要做的是为主 ISR 提供最高优先级。 定时器和 SCI 的优先级应该较低。
    我认为这是完全容易理解的,但我没有任何联系。
    接下来、我将向您展示如何设置中断。 我不喜欢 ADC 和计时器都位于 CPUIntNumber1上。 这会导致问题吗?

    在 Main 中设置:
    //初始化中断矢量表
    HAL_initIntVectorTable (halHandle);
    //启用 ADC 中断
    HAL_enableAdcInts (halHandle);
    //启用 SCIB 中断
    HAL_enableSciInts (halHandle);
    //启用全局中断
    HAL_enableGlobalInts (halHandle);
    //禁用 PWM
    HAL_disablePwm (halHandle);
    //启用 Timer0Interrupt,每10ms 发生一次
    HAL_enableTimer0Int (halHandle);

    静态内联 void HAL_initIntVectorTable (HAL_Handle handle)

    HAL_Obj * obj =(HAL_Obj *)句柄;
    PIE_Obj * PIE =(PIE_Obj *) obj->压 电式;
    ENABLE_PROTECTED 寄存器_WRITE_MODE;
    PIe->TINT0 =&timer0ISR;
    PIe->ADCINT1_HP = mainISR;
    PIe->SCIRXINTB =&sciBRxISR;
    disable_protected_register_write_mode;

    返回;
    }// HAL_initIntVectorTable()函数结束

    void HAL_enableAdcInts (HAL_Handle handle)

    HAL_Obj * obj =(HAL_Obj *)句柄;
    //启用与 ADC 中断相关的 PIE 中断
    PI_enableAdcInt (obj->压 电式、adc_IntNumber_1HP);
    //启用 ADC 中断
    adc_enableInt (obj->adcHandle、adc_IntNumber_1);
    //为 ADC 中断启用 CPU 中断
    cpu_enableInt (obj->cpuHandle、cpu_IntNumber_1);
    返回;
    }// HAL_enableAdcInts()函数结束

    void HAL_enableSciInts (HAL_Handle handle)

    HAL_Obj * obj =(HAL_Obj *)句柄;
    //启用与 SCI 中断关联的 PIE 中断
    //在 PIE 中启用 SCIB RX 中断
    PI_enableInt (obj->压 电致、PI_GroupNumber_9、PI_InterruptSource_SCIBRX);
    //启用 SCI RX 中断
    //启用 SCIB RX 中断
    sci_enableRxInt (obj->sciHandle);
    //为 SCI 中断启用 CPU 中断
    cpu_enableInt (obj->cpuHandle、cpu_IntNumber_9);
    }// HAL_enableSciInts()函数结束

    void HAL_enableTimer0Int (HAL_Handle handle)

    HAL_Obj * obj =(HAL_Obj *)句柄;
    PI_enableTimer0Int (obj->压 电式);
    //启用中断
    Timer_enableInt (obj->timerHandle[0]);
    //为 TINT0启用 CPU 中断
    cpu_enableInt (obj->cpuHandle、cpu_IntNumber_1);
    返回;
    }// HAL_enablePwmInt()函数结束

    如果您可以看到、Timer0和 ADC 都被分配给 CPU_IntNumber_1。。。我是否正确? 实际上、它的工作方式与此类似。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    查看本文档的第173页: www.ti.com/.../spruh18f.pdf

    您将看到 PIE 表以行和列分隔。 虽然 ADCINT1和 TINT0都在同一行(CPU IntNumber 1)、但 ADCINT1在最高优先级列中、由 INTx.1表示。 对于任何 INTx.y、具有较小值"y"和相等或较小值"x"的中断首先被处理。 因此、INT1.1 (ADCINT1)将在 INT1.7 (TINT0)之前被处理

    希望这能清除问题

    肖恩
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢! 是的、这是我不确定如何理解的部分。 但现在你的解释对我来说是清楚的。 谢谢!!!
    此致

    Sebastian