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-F280025C:LAUNCHXL-F280025C + DRV8323RX UNIVERSAL_MOTORCONTROL_LAB -中断 motor1CtrlISR 与我自己的 LIN 中断发生冲突?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1271560/launchxl-f280025c-launchxl-f280025c-drv8323rx-universal_motorcontrol_lab---interrupt-motor1ctrlisr-conflict-with-my-own-lin-interrupt

器件型号:LAUNCHXL-F280025C

您好!

我已经为蓝牙通信添加了 LIN ISR 例程、两个 ISR (Motro 或 LIN)都可以作为独立运行、 但是 当启用 Motor1CtrlISR 时、它会停止运行- ADC 采样问题?  

sys_main.c 中的 LIN 代码  

GPIO_setPinConfig(GPIO_23_LINA_RX);
GPIO_setDirectionMode(23, GPIO_DIR_MODE_IN);
GPIO_setQualificationMode(23, GPIO_QUAL_ASYNC);

GPIO_setPinConfig(GPIO_22_LINA_TX);
GPIO_setDirectionMode(22, GPIO_DIR_MODE_OUT);
GPIO_setQualificationMode(22, GPIO_QUAL_ASYNC);

LIN_initModule(LINA_BASE);
LIN_enterSoftwareReset(LINA_BASE);
LIN_enableSCIMode(LINA_BASE);
LIN_setBaudRatePrescaler(LINA_BASE, 650, 2);
LIN_setSCICommMode(LINA_BASE, LIN_COMM_SCI_IDLELINE);
LIN_setSCIStopBits(LINA_BASE,LIN_SCI_STOP_ONE);
LIN_disableSCIParity(LINA_BASE);
LIN_disableMultibufferMode(LINA_BASE);
LIN_setDebugSuspendMode(LINA_BASE, LIN_DEBUG_COMPLETE);
LIN_setSCICharLength(LINA_BASE, CHAR_LENGTH);
LIN_setSCIFrameLength(LINA_BASE, FRAME_LENGTH);
LIN_enableSCIInterrupt(LINA_BASE, LIN_SCI_INT_RX);
LIN_setSCIInterruptLevel0(LINA_BASE, LIN_SCI_INT_RX);
LIN_exitSoftwareReset(LINA_BASE);

LIN_enableGlobalInterrupt(LINA_BASE, LIN_INTERRUPT_LINE0);
Interrupt_enable(INT_LINA_0);
Interrupt_enableInCPU(INTERRUPT_CPU_INT9);

Interrupt_register(INT_LINA_0, &linDataRxISR);

initBLEHandles(motorHandle_M1);
doSendBTInitCmd(motorHandle_M1);



motorHandle_M1 = (MOTOR_Handle)(&motorVars_M1);
userParams_M1.flag_bypassMotorId = true;  
initMotor1Handles(motorHandle_M1);
initMotor1CtrlParameters(motorHandle_M1);

 motor1_drive.c:

 

#pragma CODE_SECTION(motor1CtrlISR, ".TI.ramfunc");
#pragma INTERRUPT(motor1CtrlISR, {HP});

#pragma CODE_SECTION(linDataRxISR, ".TI.ramfunc");
#pragma INTERRUPT(linDataRxISR, {HP});

.
.
.
__interrupt void linDataRxISR(void)
{
    uint16_t rData;

    rData = LIN_readSCICharBlocking(LINA_BASE, false);

    ble_RX_IRQ_Handler(motorHandle_M1, rData);

    LIN_clearInterruptStatus(LINA_BASE, LIN_INT_RX);
    LIN_clearGlobalInterruptStatus(LINA_BASE, LIN_INTERRUPT_LINE0);
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP8);

    return;
}

当仅通过注释掉启用 LIN 中断时  

// Interrupt_register (MTR1_PIE_INT_NUM、&motor1CtrlISR);

// Interrupt_enable (MTR1_PIE_INT_NUM);

我可以通过 LIN 中断接收数据,没有任何问题!  

一些错误消息:  

C28xx_CPU1:GEL 输出:
存储器映射初始化完成
C28xx_CPU1:GEL 输出:... DCSM 初始化开始...
C28xx_CPU1:GEL 输出:... DCSM 初始化完成...
C28xx_CPU1:GEL 输出:... DCSM 初始化开始...
C28xx_CPU1:GEL 输出:... DCSM 初始化完成...
C28xx_CPU1:GEL 输出:... DCSM 初始化开始...
C28xx_CPU1:GEL 输出:... DCSM 初始化完成...
C28xx_CPU1:错误:(ERROR -1044 @ 0x0)调试探针报告了错误。 确认调试探针配置和连接、重置调试探针、然后重试此操作。 (仿真软件包9.12.0.00150)
C28xx_CPU1:尝试20次后无法确定目标状态
C28xx_CPU1:在断开连接之前从目标中删除调试状态失败。 程序存储器中仍可能嵌入了断点操作码。 建议您在连接前复位仿真器并在继续调试前重新加载程序

非常感谢你在这个问题上的帮助。

丹尼

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

    尊敬的 Danny:

    您能否转到目标配置文件并尝试对该目标配置运行"测试"? 我想知道对于正在使用的仿真器、目标配置是否错误。

    此致、

    文斯

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

    谢谢 Vince,请先忽略错误消息,universal_motorcontrol_lab 运行得很好,例如在快速/霍尔模式下 电机旋转,我添加了用于蓝牙实时视图系统的 LIN 数据电机/系统停止工作...

    案例1. 电机停止、连接蓝牙 LIN 中断触发、RX 和 TX 都工作、可以实时查看系统数据、例如电压。

    案例2. 未连接蓝牙、LIN 中断空闲、电机可根据 POT 进行加速旋转

    案例3. 当电机旋转时、连接蓝牙、接收到 LIN RX 中断、电机立即停止。

    这就是为什么我怀疑它是中断冲突的原因吧?


    随附测试连接结果。

    使用0xFFFFFFFF 执行测试。
    扫描测试:1、跳过:0、失败:0
    使用0x00000000进行测试。
    扫描测试:2、跳过:0、失败:0
    使用0xFE03E0E2进行测试。
    扫描测试:3、跳过:0、失败:0
    使用0x01FC1F1D 进行测试。
    扫描测试:4、跳过:0、失败:0
    使用0x5533CCAA 进行测试。
    扫描测试:5、跳过:0、失败:0
    使用0xAACC3355进行测试。
    扫描测试:6、跳过:0、失败:0
    所有值均已正确扫描。

    JTAG DR 完整性扫描测试已成功。

    [结束:德州仪器 XDS110 USB 调试探针]

    丹尼

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

    您好、Vince。

    奇怪的事情! 以下是 作为独立运行的简单中断代码 、例如将 GPIO 35引脚短接至地触发中断。

    当我将其放置到 universal_motorcontrol_lab 时、将 GPIO 35引脚短接地、它不会触发中断例程...  

    然而、 当我手动转动电机时、它是触发中断、看起来它与霍尔中断链接/共享、对吗?  

    __interrupt void gpioInterruptHandler(void)
    {
        interrupt_counter++;
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
    }
    
    
    
    
    GPIO_setPinConfig(35);
    GPIO_setPadConfig(35, GPIO_PIN_TYPE_STD | GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(35, GPIO_QUAL_SYNC);
    GPIO_setDirectionMode(35, GPIO_DIR_MODE_IN);
    
    GPIO_setInterruptType(GPIO_INT_XINT1, GPIO_INT_TYPE_FALLING_EDGE);
    GPIO_setInterruptPin(35, GPIO_INT_XINT1);
    GPIO_enableInterrupt(GPIO_INT_XINT1);
    
    Interrupt_register(INT_XINT1, &gpioInterruptHandler);
    Interrupt_enable(INT_XINT1);
    
    Interrupt_enableGlobal();

    丹尼

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

    尊敬的 Danny:

    这就是为什么我怀疑它有中断冲突是对的?

    感谢您提供后续信息! 我想你在这里、看起来中断就是锁定对其他中断的访问。

    我的怀疑是"LIN_readSCICharBlocking"函数导致此情况。 如果中断因任何原因触发(即使存在错误)、它也将卡在该函数上等待接收"良好的数据"。 在这种情况下、您可能需要将其更改为函数的非阻塞版本。

    此致、

    文斯

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

    您好、Vince。

    感谢您的建议,是的,这是由发送 例程,因为我使用  LIN_writeSCICharBlocking ...

    对于(index = 0;index < charSendLen;index++)

    {

      charTemp = obj->bleVarObj.charUartTxBuffer[index];

      LIN_writeSCICharBlocking (Lina_base、(charTemp&0xFF);

     

    然而,如果我使用  LIN_writeSCICharNonBlocking 而不是阻塞方法,它在另一 端崩溃  ,不幸的是我没有控制那里,看起来发送太匆忙?  

    你认为我可以使用 LIN Tx 中断来模拟 LIN_writeSCICharBlocking 方法吗?  

    丹尼

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

    尊敬的 Danny:

    但是如果我使用  LIN_writeSCICharNonBlocking 而不是阻塞方法,它在另一 端崩溃  ,不幸的是,我没有在那里控制,看起来发送太匆忙?  [/报价]

    我实际上是在谈论" 主机 IRQ SCICharNonBlocking (SCICharNonBlocking)",而不是"写"版本。 这位于您原始帖子的第14行、突出显示如下:

    这可能是导致该问题的功能。

      

    "写入"函数应处于阻塞状态、因为您发现发送过于匆忙、需要在最后一个数据完成之前添加数据。

    此致、

    文斯

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

    您好、Vince。

    我已经将 LIN_readSCICharBlocking 替换为 LIN_readSCICharNonBlocking 、问题仍然存在

    实际上我昨晚做了什么……

    1.注释掉/删除了 Tx 端  LIN_writeSCICharBlocking, Rx 中断一直接收数据 ,电机中断不受影响,这意味着看起来像是由 Tx 中断而不是 Rx 中断引起的对吗?

    2.或者  用 LIN_writeSCICharBlocking 替换为 LIN_writeSCICharNonBlocking 、motor interrupt affected,然而 Tx 非阻塞方法会导致我的移动接收端数据崩溃,例如,在收到第一个字符后,它会保持接收0字符。

    您能帮助吗?  

    丹尼

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

    尊敬的 Danny:

    感谢您进行测试。

    这意味着似乎是由 Tx 中断而不是 Rx 中断产生的?

    正确、这只涉及 TX、因此、感谢您测试 RX 以确保正确。

    然而,Tx 非阻塞方法会导致我的移动接收端数据崩溃,例如在收到第一个字符后,它会保留接收0个字符。

    好的、关于这一点、我们有几种可以做的事情可供选择。

    我认为最好的选择也设置 LIN TX 中断。 将 LIN_SCI_INT_TX 中断添加到以下函数:

    LIN_enableSCIInterrupt(LINA_BASE, LIN_SCI_INT_RX);

    现在、您需要执行以下操作之一:

    使用其它中断线路(LINA_1)并生成一个新的"TX ISR"。 然后、您可以将 TX ISR 分配给 Lina_1。 当 LINA_1触发时、您可以使用"writeChar" 分块 "。

    Interrupt_register(INT_LINA_1, &linDataTxISR); // <<--- NOTE THAT THIS SAYS TX ISR

    2.另一个选项仍然为 TX 和 RX 使用 LINA_0中断线、但更新 LIN ISR 函数"__interrupt void linDataRxISR (void)"以检查触发它的是 TX 还是 RX。 这可能不是那么容易,所以我会推荐上面的#1。

    此致、

    文斯

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

    尊敬的 Danny:

    看似代码有一个 ePIE 外设核心优先级组嵌套冲突。 因此、ADC 组1必须在 LIN 例程内部被给予全局优先级、电机在任何时候都具有外设内核优先级、而不是 LIN。 也许 Vince 会很好地展示一个如何设置的示例。 调用必须首先将 PIER 保存在温度变量中、然后在 LIN ISR 退出时将其恢复。

    仍然不像 TRM 内核优先级表中显示的外设内核优先级顺序编号的字(嵌套)。 外设优先级顺序应由编译器或 ePIE、而不是应用处理。 奇怪的是、TRM 内核表指出了显示十六进制内核值的问题、但处理 IRQ 挂起状态的智能并不完全存在。 TRM 文本假定读者理解没有逻辑来处理全局组外设内核嵌套顺序或挂起状态、具体取决于表中所示的内核编号。 也许 TRM 只是缺少 ePIE 优先级上下文、并假设设计人员知道 ePIE 不是智能中断控制器。

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

    大家好、Danny、Genatco、

    我没有意识到这是嵌套代码、LIN ISR 函数似乎缺少这方面所需的嵌套代码。

    若要启用嵌套(如 Genatco 所说、很可能会修复该问题以便电机 ISR 可以嵌套在 LIN ISR 中)、您可以按照以下指南操作:

    https://software-dl.ti.com/C2000/docs/c28x_interrupt_nesting/html/index.html

    此致、

    文斯

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

    Vince 和 Genatco、您好!

    感谢您提供的信息、我将 在周一尝试。

    但是、 我不明白 universal_motorcontrol_lab 示例是 什么、它可以是 ISR、但我认为它的嵌套中断处理不正确?  

    __interrupt void canaISR(void)
    {
        uint32_t status;
    
        // Read the CAN interrupt status to find the cause of the interrupt
        status = CAN_getInterruptCause(halHandle->canHandle);
    
    
        // If the cause is a controller status interrupt, then get the status
        if(status == CAN_INT_INT0ID_STATUS)
        {
            //
            // Read the controller status.  This will return a field of status
            // error bits that can indicate various errors.  Error processing
            // is not done in this example for simplicity.  Refer to the
            // API documentation for details about the error status bits.
            // The act of reading this status will clear the interrupt.
            status = CAN_getStatus(halHandle->canHandle);
    
            // Check to see if an error occurred.
            if(((status  & ~(CAN_STATUS_TXOK | CAN_STATUS_RXOK)) != 7) &&
               ((status  & ~(CAN_STATUS_TXOK | CAN_STATUS_RXOK)) != 0))
            {
                // Set a flag to indicate some errors may have occurred.
                canComVars.errorFlag = 1;
            }
    
        }
        // Check if the cause is the transmit message object 1
        else if(status == TX_MSG_OBJ_ID)
        {
            //
            // Getting to this point means that the TX interrupt occurred on
            // message object 1, and the message TX is complete.  Clear the
            // message object interrupt.
            //
            CAN_clearInterruptStatus(halHandle->canHandle, TX_MSG_OBJ_ID);
    
            // Increment a counter to keep track of how many messages have been
            // sent.  In a real application this could be used to set flags to
            // indicate when a message is sent.
            canComVars.txMsgCount++;
    
            // Since the message was sent, clear any error flags.
            canComVars.errorFlag = 0;
        }
    
        // Check if the cause is the receive message object 2
        else if(status == RX_MSG_OBJ_ID)
        {
            //
            // Get the received message
            //
            CAN_readMessage(halHandle->canHandle, RX_MSG_OBJ_ID,
                            (uint16_t *)(&canComVars.rxMsgData[0]));
    
            // Getting to this point means that the RX interrupt occurred on
            // message object 2, and the message RX is complete.  Clear the
            // message object interrupt.
            CAN_clearInterruptStatus(halHandle->canHandle, RX_MSG_OBJ_ID);
    
            canComVars.rxMsgCount++;
            canComVars.flagRxDone = true;
    
            // Since the message was received, clear any error flags.
            canComVars. errorFlag = 0;
        }
        // If something unexpected caused the interrupt, this would handle it.
        else
        {
            // Spurious interrupt handling can go here.
        }
    
        // Clear the global interrupt flag for the CAN interrupt line
        CAN_clearGlobalInterruptStatus(halHandle->canHandle, CAN_GLOBAL_INT_CANINT0);
    
        // Acknowledge this interrupt located in group 9
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
    
        return;
    }

    丹尼

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

    尊敬的 Danny:

    如果我正确理解了其中提到的所有内容、那么问题实际上就是:您要展示的 LIN ISR 不允许在代码运行时执行任何其他代码。 因此、如果 LIN ISR 花费较长时间、它将阻止电机 ISR 运行。

    我想这就是为什么 Genatco 推荐它的原因。

    此致、

    文斯

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

    您好、Vince。

    感谢您的回复、这意味着在比较 CAN 示例和我自己的 LIN 或任何进一步的 ISR 例程 时、如果代码小或时间短、我不需要处理嵌套中断就行吗?  

    我仍然 需要解决 PieCtrlRegs 找不到错误、您可以帮助检查下面 我的 Lina 中断例程是正确的吗?  

    __interrupt void linDataRxISR(void)
    {
    
        uint16_t rData;
    
        uint16_t TempPIEIER;
        TempPIEIER = PieCtrlRegs.PIEIER1.all; // Save PIEIER register for later
        IER |= 0x01;
        IER &= 0x01;                          // Set "global" priority
        PieCtrlRegs.PIEIER1.all &= 0x1;      // Set "group" priority
        PieCtrlRegs.PIEACK.all = 0xFFFF;      // Enable PIE interrupts
        asm("       NOP");                    // Wait one cycle
        EINT;                                 // Clear INTM to enable interrupts
    
    
    
        /* **** LIN interrupt *** */
    
        rData = LIN_readSCICharBlocking(LINA_BASE, false);
        motorHandle_M1->temp_counter_01++;
    
        ble_RX_IRQ_Handler(uartHandle, rData);
    
        LIN_clearInterruptStatus(LINA_BASE, LIN_INT_RX);
        LIN_clearGlobalInterruptStatus(LINA_BASE, LIN_INTERRUPT_LINE0);
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP8);
    
        /* **** END of LIN interrupt *** */
    
    
    
    
        DINT;
        PieCtrlRegs.PIEIER2.all = TempPIEIER;
    }

    丹尼

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

    尊敬的 Danny:

    如果 代码小或时间短,我不需要处理嵌套中断权限?  [/报价]

    是的、但是请牢记、根据你控制环路的速度、LIN ISR "多么小"无关紧要、如果你不启用嵌套、它有可能丢失关键时序。 假设您需要发送一个电机脉冲、LIN ISR 当时恰好在运行。 根据应用的不同、这个小延迟可能很关键。

      

    您发送的 ISR 有几个问题:

    0、您不应修改另一组的 PIEIER 寄存器。 您在 LIN ISR 中、因此您只能修改该组(组8或 PIEIER8)的 PIEIER。 请参阅我发送给您的中断嵌套指南中的警告:

    1.看起来您只启用 ADCA1 ISR 来嵌套 LIN 中。 这真的是你想要的吗?

    2、第34行显示 PIEIER2被回退、但我想您的意思是放置 PIEIER1 (因为这是第7行中保存的内容)。

    此致、

    文斯

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

    您好、Vince。

    您不应修改另一组的 PIEIER 寄存器。 您在 LIN ISR 中、因此您只能修改该组(组8或 PIEIER8)的 PIEIER。 查看我发送给您的中断嵌套指南中的警告:

    您的意思是我不需要以下陈述吗?  

    TempPIEIER = PieCtrlRegs.PIEIER1.all

    1. 看起来您只是启用 ADCA1 ISR 来在 LIN 中嵌套。 这真的是你想要的吗?

    抱歉、我不熟悉 universal_motorcontrol_lab 示例、我知道  示例中的关键是它的 ADCC 中断、而是由我自己的 LIN ISR 例程提供的中断。   

    interrupt_register (MTR1_PIE_INT_NUM、&motor1CtrlISR); // MTR1_PIE_INT_NUM  = INT_ADCC1  

    2、第34行显示 PIEIER2被回退、但我想您的意思是放置 PIEIER1 (因为这是第7行中保存的内容)。

    [/报价]

    对不起我的拼写错误  

    PieCtrlRegs.PIEIER1.all = TempPIEIER;

    丹尼

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

    您的意思是我不需要以下陈述吗?  

    TempPIEIER = PieCtrlRegs.PIEIER1.all

    [/报价]

    尊敬的 Danny:

    我的意思是、 当您在组1 (LIN)内时、您无法更改组8 (ADC)的 PIEIER

    "  示例中、它的 ADCC 中断是密钥、而它是由我自己的 LIN ISR 例程进行的中断吗? "

    我不熟悉电机控制示例 、因为我是 LIN 专家、但如果您愿意、我可以联系电机专家。 如果您确定它是被使用的 ADC 中断、那么您是正确的、它应该可以工作、所以应该是可以的。

    此致、

    文斯

    • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
      我的意思是, 当您在组1 (LIN)中时,您不能更改组8 (ADC)的 PIEIER
      [/报价]

      LIN 为第8组、ADCC 为第1组、右侧 吗?

      如果我不能在组8 (LIN)内更改组1 (ADC)的 PIEIER、那么我应该在 LIN ISR 中放置什么需求声明? 你能建议吗?  

      我对电机控制示例不熟悉 ,因为我是一名 LIN 专家,但如果您愿意,我可以联系电机专家。 如果您确定它是被使用的 ADC 中断、那么您是正确的、它应该可以工作、所以应该是可以的。

      是的、请转发给电机专家、因为电机和 LIN/SCI 共存是我项目的关键因素  

      丹尼

      [/quote]
    • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
      如果我无法更改组8 (lin)内组1 (ADC)的 PIEIER

      否、您可以更改 IER 或其他组、而不是其他组的 PIEIER。 您必须将 LIN 的同一 PIEIER 组编号与表行的 INTx 匹配。  

      电机 ADC 和 SCI TX/RX ISR 当前无法工作。 否则电机将突然停止12.5µs FAST 估算器时间。 SCI 串行速度和 C 应用程序无法移植数据12.5µs。 因此、必须使用 FIFO ISR 级别来缓冲多个字节。   

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

      尊敬的 Genatco:

      感谢您的帮助!

      抱歉、我不熟悉 TI 编程、从未有嵌套中断体验。  

      我有点担心 SCI 和 ADC 共存的可能性,说实话,  由于 TI 的 FOC 支持,我放弃了其他 MCU 和端口给 TI ,现在我面临另一个挑战是嵌套中断,也许 ADC 和 SCI 都不能共存... 最终、我可能会放弃并返回到以前的 MCU 模型

      看起来你对 MOTORCONTOL 以及 SCI 和嵌套中断都有经验、你能告诉我 SCI (FIFO)+嵌套句柄是否可以使它共存吗?

       

      丹尼

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

      尊敬的 Danny:

      一旦你掌握了嵌套的窍门、嵌套应该不会太困难。

      除非您拥有多核器件、否则无论您使用何种单核器件、都需要嵌套(尽管对于 C28x 器件、您需要执行嵌套 软件 ,这是与其他设备的主要区别)。

      要记住的主要内容是不要改变另一个组的 PIEIER。

        

      现在、您能否告诉我、您的所有代码中是否只有 ADC ISR 和 LIN ISR? 如果是这样、你唯一需要做的就是在 ISR 开始时更改 IER 并启用 EINT。 如果你有其他中断、那就很棘手了。

        

      你能否通读嵌套指南、并让我知道你是否对其中的特定部分有任何疑问或困惑? 我想知道哪些地方存在混淆、需要时更新指南。

      此致、

      文斯

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

      您好、Vince。

      感谢您的大力支持、 电机 ISR 与 LIN ISR 现已可共存

      是的、我将 EINT 和 DINT 放在 LIN ISR 内部、RX 和 TX 都使用阻塞模式、不会出现任何问题!

      __interrupt void linDataRxISR (void)

      {

        uint16_t RDATA;

        EINT;                 

        RDATA = LIN_readSCICharBlocking (Lina_base、false);

        BLE_RX_IRQ_Handler (uartHandle、RDATA);

        LIN_clearInterruptStatus (LINA_base、LIN_INT_RX);

        LIN_clearGlobalInterruptStatus (LINA_base、LIN_INTERRUPT_LINE0);

        INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group8);

        Dint;

        返回;

      void doSendUart (UARTHandle 句柄、uint8_t charSendLen)

      {

         uart_Vars_t * obj =(uart_Vars_t *) uartHandle;

        uint8_t 索引;

        uint16_t charTemp;

        motorHandle_M1->temp_counter_02++

        对于(index = 0;index < charSendLen;index++)

        {

          charTemp = obj->bleVarObj.charUartTxBuffer[index];

          LIN_writeSCICharBlocking (Lina_base、(charTemp&0xFF);

        

      丹尼