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.

[参考译文] LAUNCHXL-F28027F:在 motorware instaspin 实验中实现外部中断

Guru**** 2541610 points
Other Parts Discussed in Thread: MOTORWARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/625311/launchxl-f28027f-implementing-external-interrupt-within-motorware-instaspin-labs

器件型号:LAUNCHXL-F28027F
主题中讨论的其他器件:MOTORWARE

您好!

通过研究 TMS320F2802x/TMS320F2802xx Piccolo 系统控制和中断、我在实现外部中断方面取得了重大进展。 我知道我需要做以下工作:

XINT1CR |= 0b1101;//启用外部中断1并在上升沿和下降沿触发

GPIOXINT1SEL |= 0b10011;//选择 GPIO 19并将其连接到外部中断1

PIEIFR1 |= 0b1000;//将 INT1.4 (外部中断1)连接到其矢量

但是、我现在意识到、我不知道如何为外部中断定义 ISR。 我已经看到一些论坛建议使用#pragma 命令、但我不确定如何操作。 有人可以澄清吗? 谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请查看 hal.h 文件中的 HAL_initIntVectorTable()函数。 您将看到、唯一启用(默认情况下)的中断是用于 mainISR 函数的 ADCINT1。 您可以在此处添加第二行以将例程分配到 XINT1/2/3 PIE 矢量表。 例如

    PIe->XINT1 =&myExternalIntISR;

    其中 myExternalIntISR 位于 main.h 中定义并在 proj_labXX.c 中创建的函数名称中

    请注意、您应该花时间将 ADCINT1设为高优先级版本、或者使用 XINT3代替 XINT1或 XINT2。 如果将 XINT 作为较高优先级的中断、则会有丢失 ADC 中断的风险、并会破坏 FOC 角度估算。 请在 motorware_hal_tutorial.pdf (在有关添加 SCI 模块的部分下)中阅读、了解如何将 ADCINT1设置为高优先级版本(如果您想执行此操作)。

    肖恩
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢! 您对 main 内的中断初始化/配置有什么建议吗? 我已经看到许多不同的资源向不同的方向指明了我、但这里有大量的重复代码、我不确定要使用哪些器件:


    GPIO_setMode (GPIO_init ((void *) GPIO_base_ADDR、sizeof (GPIO_Obj))、GPIO_Number_19、GPIO_19_Mode_generalpurpose);
    GPIO_setDirection (GPIO_init ((void *) GPIO_base_ADDR、sizeof (GPIO_Obj))、GPIO_Number_19、GPIO_Direction_Input);
    PI_enableExtInt (myPie、0);

    PI_registerPieIntHandler (myPie、PI_GroupNumber_1、PI_SubGroupNumber_4、myExtIntISR);

    //PIe->XINTnCR[3]|= 0b1101;
    //GPIOXINT1SEL |= 0b10011;
    //PIEIFR1 |= 0b1000;


    //在 PIE 矢量表中注册中断处理程序
    PI_registerPieIntHandler (myPie、PI_GroupNumber_1、PI_SubGroupNumber_4、
    (intvec_t)&XINT1_ISR);

    PI_enableInt (myPie、PI_GroupNumber_1、PI_InterruptSource_XINT_1);

    cpu_enableGlobalInts (myCpu);

    GPIO_setMode (myGpio、GPIO_Number_19、GPIO_19_Mode_generalpurpose);
    GPIO_setDirection (myGpio、GPIO_Number_19、GPIO_Direction_Input);
    GPIO_setQualification (myGpio、GPIO_Number_19、GPIO_QUAL_Sync);

    GPIO_setExtInt (myGpio、GPIO_Number_19、CPU_ExtIntNumber_1);

    PI_setExtIntPolarity (myPie、CPU_ExtIntNumber_1、PI_ExtIntPolarity_RisingAndFallingEdge);//上升沿和下降沿触发


    PI_enableExtInt (myPie、CPU_ExtIntNumber_1);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当我在 Motorware 项目中添加或编辑代码时、为了 sanity 的目的、我尽量将 API 调用保留在相应的 HAL 函数中。 以下是一些建议:

    GPIO_setXXX API 调用应位于 hal.c 源文件中的 HAL_setupGpio()中。 HAL_setupGpio()由 HAL_setParams()调用。 遵循为 GPIO_setMode()和 GPIO_setQualify()设置的原型。 GPIOX 方向寄存器在复位时也默认设置为0 (输入)、因此无需调用 GPIO_setDirection()。

    PIE 矢量表在 HAL_initIntVectorTable()中进行初始化,其中的原型仅用于取消引用 PIE 对象的 ISR 矢量成员并将其设置为 ISR 例程的地址。 我会使用与上面建议的代码行类似的内容,并跳过 PIE_registerPieIntHandler() API 调用。

    查看 hal.c 源文件中的 HAL_enableAdcInts()。 您将看到该函数依次调用 PI_enableAdcInt ()、ADC_enableInt ()和 CPU_enableInt () API。 确保为外部中断执行与 HAL_enableAdcInts()函数相同的函数调用。 您不一定需要创建新的 HAL 函数(即 HAL_enableExtInts()),但如果您想保持连续性,则可以创建该函数。 一个快速修复方法是在 HAL_enableAdcInts()之后直接在 main()例程中进行适当的函数调用。

    对于 Motorware 项目,HAL_enableGlobalInts()中已调用 cpu_enableGlobalInts(),无需再次调用它。

    一般而言,请查看 main()例程中已存在的设置/初始化函数,以了解正在发生的情况。 您将看到上面显示的一些 API 已经被调用

    肖恩