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.

[参考译文] TM4C129DNCPDT:TM4C129DNCPDT:带有 TI RTOS 的 NMI 处理程序

Guru**** 2530330 points
Other Parts Discussed in Thread: TM4C129DNCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1402612/tm4c129dncpdt-tm4c129dncpdt-nmi-handler-with-ti-rtos

器件型号:TM4C129DNCPDT

工具与软件:

您好!

采用 TI RTOS 的 TM4C129DNCPDT 微控制器。 为我的应用程序实现 NMI 处理程序。

使用 GPIOD-GPIO7-NMI 处理程序  

下面是代码:

GPIO 初始化:  

_Bool initPortD (void)

uint8_t InitTry = 0;
应执行的操作

MAP_SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOD);
if (InitTry++>= peripheral_init_try_times)

return __fail;
}
appSystemDelay (SYS_DELAY);
}
while (! MAP_SysCtlPeripheralReady (SYSCTL_PERIPH_GPIOD));
MAP_GPIOPinTypeDIVSCLK (GPIO_PORTD_BASE、GPIO_PIN_7);

MAP_GPIOPinTypeGPIOOutput (GPIO_PORTD_BASE、GPIO_PIN_5 | GPIO_PIN_1);
MAP_GPIOUnlockPin (GPIO_PORTD_BASE、GPIO_PIN_7);
MAP_GPIOPinTypeGPIOInput (GPIO_PORTD_BASE、GPIO_PIN_7);
HWREG (GPIO_PORTD_BASE + GPIO_LOCK)= GPIO_LOCK_KEY;
HWREG (GPIO_PORTD_BASE + GPIO_CR)|= GPIO_PIN_7;
HWREG (GPIO_PORTD_BASE + GPIO_LOCK)= 0;

GPIOPinConfigure (GPIO_PD7_NMI);
IntRegister (FAULT_NMI、nmiHandler);
IntEnable (FAULT_NMI);
return _pass;
}

// NMI 处理程序  

void nmiHandler (void)


MAP_GPIOIntClear (GPIO_PORTD_BASE、GPIO_PIN_7);
nmiFlag = true;

GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_3、GPIO_PIN_3);
}

以上是代码。  

同时调试功能  

__attribute__((section (".text:abort"))
void 中止(void)

#if defined (EMBED_CIO_BP)
__ asm (".global C$EXITE");
#if defined (__32bis__)
_asm ("C$$EXITE:.word 0xDEFED0FE");
#else
_asm (".align 4");
#if defined (__big_endian__)
_asm ("C$$EXITE:.half 0xDEFE");
#else
_asm ("C$$EXITE:.half 0xD0FE");
#endif /*__big_endian__*/
#endif /*__32bis_*/

#else /*! Embedded_CIO_BP *
_asm (".global C$$EXIT");
__ asm ("C$$EXIT:NOP");
#endif

for (;;);/*永久旋转*/
}

请帮助解决该问题。 是否可以通过 UART 通知 NMI 发生?

提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [quote userid="617326" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1402612/tm4c129dncpdt-tm4c129dncpdt-nmi-handler-with-ti-rtos intRegister (fault_nmi、nmiHandler);
    [报价]

    您无法使用 IntRegister、因为这会破坏已由 TI-RTOS 创建和管理的矢量表。 有关说明、请参阅此帖子。   https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/849627/faq-can-i-update-the-vector-table-with-intregister-when-using-ti-rtos?tisearch=e2e-sitesearch&keymatch=ti-rtos%20vector%20table#

     如果您查看中断矢量表、会发现 NMI 映射到矢量编号2。  

    您需要使用 Hwi 模块来让 TI-RTOS 管理 NMI 中断。  

    myHwi = Hwi_create(2, (Hwi_FuncPtr)nmiHandler, &hwiParams, &eb);

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

    感谢您的沟通。

    请找到以下代码、按照建议修改了代码、但未触发 NMI 中断。

    volatile _Bool nmiFlag = false;

    静态空 NM监控 器(空)


    while (1)


    if (nmiFlag)

    nmiFlag = 0;
    GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_3、GPIO_PIN_3);
    }

    }

    }


    静态 void nmiHandler (UArg arg)

    如果(ARG =1)

    MAP_GPIOIntClear (GPIO_PORTD_BASE、GPIO_PIN_7);
    nmiFlag = true;
    GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_3、GPIO_PIN_3);
    }
    }

    void NMiMonitorTaskInit (void)

    Task_Params NMI_MONITOR_TASKPARAMS;
    Task_Params NMI_MONITOR_TASK;

    //错误块
    Error_Block eb5;
    error_init (&eb5);

    /*初始化监视器任务*/
    Task_Params_(&NMI_MONITOR_TASKPARAMS);
    NMI_MONITOR_taskParams.appTaskStackSize = 512;/*任务大小*/
    NMI_MONITOR_taskParams.appTaskPriority =
    2;/*任务优先级*/


    NMI_MONITOR_TASK = Task_create ((taskFunctionPtr) NM监控 器、
    &NMI_MONITOR_TASKPARAMS、
    &eb5);/*任务创建*/

    //注册 NMI 处理程序
    Hwi_Params hwiParams;
    Hwi_Params_(4519&hwiParams);
    hwiParams.arg = 0;
    Hwi_create (FAULT_NMI、(Hwi_Func Prtr) nmiHandler、&hwiParams、NULL);


    //启用 NMI 中断
    Hwi_enableInterrupt (FAULT_NMI);

    }

    bool initPortD (void)

    uint8_t InitTry = 0;
    应执行的操作

    MAP_SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOD);
    if (InitTry++>= peripheral_init_try_times)

    return __fail;
    }
    appSystemDelay (SYS_DELAY);
    }
    while (! MAP_SysCtlPeripheralReady (SYSCTL_PERIPH_GPIOD));
    MAP_GPIOPinTypeDIVSCLK (GPIO_PORTD_BASE、GPIO_PIN_7);


    MAP_GPIOUnlockPin (GPIO_PORTD_BASE、GPIO_PIN_7);
    MAP_GPIOPinTypeGPIOInput (GPIO_PORTD_BASE、GPIO_PIN_7);
    HWREG (GPIO_PORTD_BASE + GPIO_LOCK)= GPIO_LOCK_KEY;
    HWREG (GPIO_PORTD_BASE + GPIO_CR)|= GPIO_PIN_7;
    HWREG (GPIO_PORTD_BASE + GPIO_LOCK)= 0;
    MAP_GPIOIntTypeSet (GPIO_PORTD_BASE、GPIO_PIN_7、GPIO_FALLING_EDGE);

    GPIOPinConfigure (GPIO_PD7_NMI);
    // IntRegister (FAULT_NMI、nmiHandler);
    IntEnable (FAULT_NMI);

    return _pass;
    }

    请向我们建议我在这里遗漏的任何信息。 请提供相同的任何示例代码。

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

     FAULT_NMI 定义为什么值?

    您可以先在裸机(无 RTOS )项目上尝试以下代码,甚至尝试您自己的 initPortD ()吗? 我想知道问题是否在 TI-RTOS 方面。

    //
    //解锁端口引脚并设置 PD7的 CR 位
    //
    HWREG (GPIO_PORTD_BASE+GPIO_LOCK)= GPIO_LOCK_KEY;
    HWREG (GPIO_PORTD_BASE+GPIO_CR)|= GPIO_PIN_7;
    GPIOPinConfigure (GPIO_PD7_NMI);
    GPIOPadConfigSet (GPIO_PORTD_BASE、GPIO_PIN_7、GPIO_Sength_8mA、GPIO_PIN_TYPE_STD_WPD);
    GPIODIRModeSet (GPIO_PORTD_BASE、GPIO_PIN_7、GPIO_DIR_MODE_HW);

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

    尊敬的 Charles:  

    感谢您的沟通。

    下面是没有 RTOS 代码的 NMI。 但 NMI 不会触发以下代码中丢失的任何内容。 因此、我在  MAP_GPIOUnlockPin (GPIO_PORTD_BASE、GPIO_PIN_7)之后通过调试进行检查;函数进入 FAULT_ISR。 请帮助您做进一步的工作。

    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #define SYSTEM_CRYSTAL SYSCTL_XTAL_16MHz
    #define SYSTEM_MAIN_oscillator SYSCTL_OSC_MAIN
    #define SYSTEM_PLL SYSCTL_USE_PLL
    #define SYSTEM_VCO SYSCTL_CFG_VCO_240

    #define SYSTEM_MAIN_CLOCK 120000000
    //为系统处理程序控制及状态寄存器(SHCSR)定义寄存器地址
    #define NVIC_SYS_HND_CTRL_R (*(volatile uint32_t *) 0xE000ED24)

    // NMI 处理程序函数
    void NMI_Handler (void)

    uint16_t i;
    //处理 NMI 中断(例如、记录事件、重置特定的系统等)
    while (1)

    GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_1、
    GPIOPinRead (GPIO_PORTM_BASE、GPIO_PIN_1)^ GPIO_PIN_1);

    对于(I = 0;I < 60000;I++)

    //无限循环以指示 NMI 已触发和处理
    }
    }

    //此函数用于初始化 NMI 中断
    空 NMI_Init (空)

    //在向量表中设置 NMI 处理程序函数指针(可选、如果未自动设置)
    IntRegister (FAULT_NMI、NMI_Handler);//这会将 NMI 中断链接到处理程序。

    //在系统处理程序控制及状态寄存器(SHCSR)中启用 NMI 中断
    NVIC_SYS_HND_CTRL_R |= 0x00000002;//设置位1以启用 NMI 中断
    }

    int main (void)

    //设置系统时钟(例如使用 PLL 的120 MHz 以及晶振参考)
    // SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);
    SysCtlClockFreqSet (
    (SYSTEM_CRYSTAL | SYSTEM_MAIN_oscillator | SYSTEM_PLL | SYSTEM_VCO)、
    system_main_clock);
    SysCtlPeripheralEnable (SysCtl_Periph_GPIOM);

    while (! SysCtlPeripheralReady (SYSCTL_PERIPH_GPIOM))

    GPIOPinTypeGPIOOutput (GPIO_PORTM_BASE、GPIO_PIN_1);/* LED *

    MAP_GPIOUnlockPin (GPIO_PORTD_BASE、GPIO_PIN_7);
    MAP_GPIOPinTypeGPIOInput (GPIO_PORTD_BASE、GPIO_PIN_7);
    // HWREG (GPIO_PORTD_BASE + GPIO_LOCK)= GPIO_LOCK_KEY;
    // HWREG (GPIO_PORTD_BASE + GPIO_CR)|= GPIO_PIN_7;
    // HWREG (GPIO_PORTD_BASE + GPIO_LOCK)= 0;
    MAP_GPIOIntTypeSet (GPIO_PORTD_BASE、GPIO_PIN_7、GPIO_FALLING_EDGE);

    GPIOPinConfigure (GPIO_PD7_NMI);
    GPIOPadConfigSet (GPIO_PORTD_BASE、GPIO_PIN_7、GPIO_Stength_8mA、
    GPIO_PIN_TYPE_STD_WPD);
    GPIODIRModeSet (GPIO_PORTD_BASE、GPIO_PIN_7、GPIO_DIR_MODE_HW);

    //初始化 NMI 中断
    NMI_Init();

    //主循环
    while (1)

    //应用程序代码
    }
    }

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

    您好!

     很抱歉,因为我不在办公室,刚回来。  

    [报价 userid="617326" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1402612/tm4c129dncpdt-tm4c129dncpdt-nmi-handler-with-ti-rtos/5406487 #5406487"]所以我在  MAP_GPIOUnlockPin (GPIO_PORTD_BASE、GPIO_PIN_7)之后检查了调试功能;该函数转到 FAULT_ISR。 请帮助进行进一步操作。

    使用您的最新代码、我看不到 MAP_SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOD)被调用、您可以配置端口 D。我看到您可以调用启用端口 M、但不能调用端口 D  

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

    感谢您的通知。  

    甚至我注意到并更新了代码。

    在这里、我的观察结果将到达 NMI 处理程序。  

    裸机代码触发 NMI。

    如果我想对 TI RTOS 执行什么操作呢。 以下是我的代码。 NMI 中断未触发。

    _Bool initPortD (void)


    MAP_SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOD);

    while (! MAP_SysCtlPeripheralReady (SYSCTL_PERIPH_GPIOD));
    MAP_GPIOPinTypeDIVSCLK (GPIO_PORTD_BASE、GPIO_PIN_7);

    HWREG (GPIO_PORTD_BASE + GPIO_LOCK)= GPIO_LOCK_KEY;
    HWREG (GPIO_PORTD_BASE + GPIO_CR)|= GPIO_PIN_7;
    HWREG (GPIO_PORTD_BASE + GPIO_LOCK)= 0;

    //将 PD7设置为输入
    MAP_GPIOPinTypeGPIOInput (GPIO_PORTD_BASE、GPIO_PIN_7);

    //配置 PD7以在下降沿触发 NMI
    MAP_GPIOIntTypeSet (GPIO_PORTD_BASE、GPIO_PIN_7、GPIO_FALLING_EDGE);

    GPIOPinConfigure (GPIO_PD7_NMI);

    init_nmi();

    return _pass;
    }

    void init_NMI (void)

    //注册 NMI 处理程序
     Hwi_Params hwiParams;
     Hwi_Params_(4519&hwiParams);
     hwiParams.arg = 0;
     Hwi_create (FAULT_NMI、(Hwi_Func Prtr) nmiHandler、&hwiParams、NULL);


    //启用 NMI 中断
    Hwi_enableInterrupt (FAULT_NMI);

    }

    静态 void nmiHandler (UArg arg)


    MAP_GPIOIntClear (GPIO_PORTD_BASE、GPIO_PIN_7);


    }

    请协助进行进一步的工作。

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

    您好!

     我发现此帖子对如何处理 TI-RTOS 的 NMI 很有用。  

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/375721/nmi-interrupt-with-ti-rtos

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

    您好!

     我没有听到你的声音。 我现在结束该主题。 如果您有任何更新、您可以回写此帖子、并且状态将自动更改为"已打开"。