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.

TMS320C6672: 修改中断向量表地址后中断不能触发

Part Number: TMS320C6672

您好

之前在cmd文件中将中断向量表配置在0x00800000开头的长度为0x200的内存中,gpio中断可以正常触发

后续将中断向量表配置在起始地址为0x0c000000的SL2中,发现gpio中断不能触发,并且在仿真器中发现程序经常停在0x00800000地址处,请问可能和什么原因有关

  • 您好,

    将中断向量表配置在SL2中可能会导致中断无法触发的问题。这是因为中断向量表的地址必须是内存的起始地址,而SL2并不是内存的起始地址。因此,需要在修改中断向量表地址后,还需要修改相应的中断控制器寄存器,以将中断控制器的中断向量表地址设置为新的地址。

    在TMS320C6672中,中断控制器的中断向量表地址可以通过修改INTC_BASE_ADDR寄存器来实现。具体来说,需要将INTC_BASE_ADDR寄存器设置为新的中断向量表地址,以确保中断控制器能够正确地访问中断向量表。同时,还需要确保新的中断向量表地址在内存中是合法的,并且不会与其他内存区域发生冲突。

  • 感谢回复,请问INTC_BASE_ADDR这个寄存器的定义在哪个文档里可以查到,我查询了CIC User Guide和6672的数据手册都没有找到这个寄存器

  • 您好,

    INTC_BASE_ADDR不是一个特定的寄存器,而是一个宏定义,用于表示中断控制器的基地址。它通常用于嵌入式系统中,用于访问中断控制器相关的寄存器。

  • 那我在开发中除了在cmd文件中修改中断向量表的地址之外还要如何操作呢?csl库有对应的函数支持吗?

  • 您好,

    在开发中,除了在cmd文件中修改中断向量表的地址之外,您还需要编写中断处理程序来处理中断。中断处理程序是一段特殊的代码,它会在中断发生时自动执行,以响应中断事件。在中断处理程序中,您可以执行特定的操作,如读取或写入寄存器、处理数据等。

    对于csl库是否有对应的函数支持,需要根据您所使用的MCU型号和csl库版本来确定。一般来说,csl库会提供一些用于中断处理的函数和宏定义,如中断使能、中断优先级设置、中断标志位清除等。

    下面是一个简单的中断处理程序的示例,用于处理GPIO中断:

    #include <xdc/std.h>
    #include <xdc/runtime/Error.h>
    #include <ti/sysbios/BIOS.h>
    #include <ti/sysbios/knl/Task.h>
    #include <ti/sysbios/knl/Semaphore.h>
    #include <ti/sysbios/family/arm/m3/Hwi.h>
    
    /* GPIO中断处理函数 */
    Void gpio_isr(UArg arg)
    {
    /* 处理GPIO中断事件 */
    }
    
    /* 注册GPIO中断 */
    Void register_gpio_interrupt()
    {
    Hwi_Params hwiParams;
    Error_Block eb;
    Error_init(&eb);
    
    /* 初始化中断参数 */
    Hwi_Params_init(&hwiParams);
    hwiParams.arg = (UArg)NULL;
    hwiParams.enableInt = TRUE;
    hwiParams.eventId = GPIO_EVENT_ID;
    hwiParams.priority = GPIO_INTERRUPT_PRIORITY;
    
    /* 注册中断 */
    Hwi_create(GPIO_INTERRUPT_NUMBER, (Hwi_FuncPtr)gpio_isr, &hwiParams, &eb);
    }

    在这个示例中,我们定义了一个名为`gpio_isr`的中断处理函数,用于处理GPIO中断事件。我们还定义了一个名为`register_gpio_interrupt`的函数,用于注册GPIO中断。在`register_gpio_interrupt`函数中,我们使用了`Hwi_create`函数来创建中断处理程序,并将其注册到GPIO中断号。

    请注意,这只是一个简单的示例,实际中断处理程序的实现可能会更加复杂,具体取决于您的应用程序需求。

  • 我通过网上查询到一个叫tms320c6672有名为Interrupt service table pointer register(TSIP)的寄存器,其功能为指定中断向量表的基地址,但我没有在任何官方文档中找到这个寄存器的定义,请问在哪个文档可以找到这个寄存器

  • 您好,

    是的,您说的是正确的。TSIP寄存器用于指定中断向量表的基地址。中断向量表是一个存储中断服务程序入口地址的表格,每个中断都对应着一个ISR。当中断发生时,CPU会根据中断号从中断向量表中读取对应的ISR入口地址,并跳转到该地址执行相应的中断服务程序。在TMS320C6672中,中断向量表是存储在内存中的,TSIP寄存器用于指定中断向量表的基地址。当中断发生时,CPU会从TSIP寄存器中读取中断向量表的基地址,并根据中断号和基地址计算出对应的ISR入口地址。

    需要注意的是,TSIP寄存器的值必须是4字节对齐的,否则会导致错误。在设置TSIP寄存器时,需要注意对齐要求,并确保指定的地址是有效的中断向量表的基地址。