SYS/BIOS下C6678的中断配置


前言

当涉及到在C6678上配置中断时,SYS/BIOS是一个强大的工具,它可以帮助您有效地管理和优化中断处理。本博客将为您介绍如何在SYS/BIOS环境中进行C6678中断配置,以提高系统的稳定性和性能。


一、C6678中断系统

中断是计算机系统中的一种重要机制,允许外部设备或内部事件通过触发一个特定的处理程序来打断正常的程序执行流程。C6678中断系统旨在处理各种类型的中断事件,包括硬件中断(如外部设备触发的中断)和软件中断(通过软件请求的中断)。

本文主要讲述的是硬件中断配置,对于软件中断,即SWI,的使用比较简单,通过SYS/BIOS中的示例即可学习如何注册和使用软件中断。针对SWI的使用详见:链接

C6678硬件中断是通过C66x CorePac中断控制器进行配置。中断控制器允许多达128个系统事件被编程到12个CPU中断输入(CPUINT4 - CPUINT15)等。这128个系统事件由内部生成的事件(在CorePac内)和芯片级事件组成。在芯片级有大量的事件。芯片级CIC(关键)提供了一种灵活的方式来组合和重新映射这些事件。多个事件可以通过芯片级CIC组合为单个事件。然而,一个事件只能被映射到来自芯片级CIC的单个事件输出。芯片级CIC还允许软件通过内存写入来触发系统事件。
6678中断架构简单来说,由于6678有多个核,一些的二级中断都不是直接与6678上核绑定的,通过中间的一层CIC控制器来管理配置,中断先到达CIC控制器件,然后根据CIC寄存器配置的映射关系(通过这种映射关系建立一条通路,告诉中断应该给哪个核发信号)。

如何查询6678中断号?这个对与后续编程很重要,因此先在这里介绍。详细的表在链接可以7.10.1中找到,比如需要将UART中断映射到核0,那么就需要找到对应串口的中断事件号。
首先在TMS320C6678 System Event Inputs表中寻找,如果找不到那么就需要去CIC控制的二级中断中寻找,GPIO中断事件号就可以直接找到82-90,这种就可以不用CIC映射,直接通过Hwi初始化参数配置相应eventid即可使用。
在这里插入图片描述
核0属于CIC0控制器,因此在CIC0 Event Inputs表中寻找,最后找到了串口中断是148号(如果只是处理接收中断,那么就是149号)。
在这里插入图片描述

二、SYS/BIOS下配置System Event Inputs硬件中断

本节主要介绍的是 System Event Inputs表中可直接找到的系统事件中断配置,以GPIO0中断为例子来介绍如何配置,通过第一节部分中查找中断事件号的的方法,找到了GPIO0对应的中断号为90
GPIO0中断号
在这里插入图片描述或许有人可能找不到GPIO0的中断号,这里简单解释一下:文档中表格有一个GPINTn的中断,结合注释,GPIO0的中断会被核0收到,GPIO1的中断会被核1收到,他们是不同的核不同的硬件中断,但是用的同一个系统中断号。

1.引入库

#include <ti/sysbios/family/c64p/Hwi.h>

第一个库是Hwi库,c66系列与c64+系列的Hwi架构是兼容的,故使用同一个库头文件,这个库主要提供了SYS/BIOS中的Hwi线程的相关接口函数

2.中断配置过程

下面只是给出了中断部分的配置,使用相关外设,还需要在配置中断前初始化相关外设,比如初始化串口配置波特率等
中断配置流程分两步:
1.打开外设中断(通过配置硬件外设的相关寄存器完成或者使用CSL库)
2.初始化Hwi线程

void key_init(void)
{
	  // 初始化GPIO0的相关配置,打开中断,设置为上升沿触发,GPIO模式为输入等 
    CSL_GpioHandle hGpio = CSL_GPIO_open(0);
    CSL_GPIO_bankInterruptEnable(hGpio, 0);
    CSL_GPIO_setRisingEdgeDetect(hGpio, 0);
    CSL_GPIO_setPinDirInput(hGpio, 0);
    
    Hwi_Params hwiParams;
    Int eventId;
    Hwi_Handle gpioHwi;
    Error_Block eb;

    // 根据查找的系统事件号赋值,GPIO0中断事件号为90
    eventId = 90;
    // 使用默认值初始化参数
    Hwi_Params_init(&hwiParams);
    // 中断事件
    hwiParams.eventId = eventId;
    // 传递到中断服务函数的参数
    hwiParams.arg = 0;

    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
    // 使能中断
    hwiParams.enableInt = TRUE;
    // 可屏蔽中断4,key_isr为中断服务函数的名称
    gpioHwi = Hwi_create(4, key_isr, &hwiParams, &eb);
    if (gpioHwi == NULL) {
        printf("Error create Hwi\n");
    }
}

最后还需要在cfg文件中使用Hwi模块,选择进入后勾选Add即可在这里插入图片描述

三、SYS/BIOS下配置CIC硬件中断

不基于SYS/BIOS下的硬件中断只需要调用CSL库完成即可,网上有较多资料

1.引入库

#include <ti/sysbios/family/c64p/Hwi.h>
#include <ti/sysbios/family/c66/tci66xx/CpIntc.h>

第一个库是Hwi库,c66系列与c64+系列的Hwi架构是兼容的,故使用同一个库头文件,这个库主要提供了SYS/BIOS中的Hwi线程的相关接口函数
第二个库是CpIntc库,若不基于SYS/BIOS,CSL库也有个类似的库,这个库主要就是配置CIC,建立外部中断和核心中断之间的映射。使用PDK中CSL配置CIC会导致SYS/BIOS运行出错,因此必须使用SYS/BIOS下的CpIntc配置。

2.中断配置过程

下面只是给出了中断部分的配置,使用相关外设,还需要在配置中断前初始化相关外设,比如初始化串口配置波特率等
中断配置流程分三步:
1.打开外设中断(通过配置硬件外设的相关寄存器完成或者使用CSL库)
2.配置CIC,映射系统中断(需要找到对应的CIC中断号
3.初始化Hwi线程

// 这个函数是串口硬件设备开启中断的操作,整个流程的第一步
void uart_interrupt_enable(void)
{
    CSL_UartRegs *uart_reg = (CSL_UartRegs *)CSL_UART_REGS;
    
    CSL_FINS(uart_reg->IER, UART_IER_ERBI, CSL_UART_IER_ERBI_ENABLE);
    CSL_FINS(uart_reg->IER, UART_IER_ELSI, CSL_UART_IER_ELSI_ENABLE);
}
void uart_interrupt_init(void)
{
    Hwi_Params hwiParams;  //Hwi参数结构体
    Int eventId;           //事件ID
    Hwi_Handle uartHwi;    //Hwi句柄
    Error_Block eb;        //错误处理结构体
    
    // 第一步打开硬件外设的中断
    uart_interrupt_enable();
     
    // 第二步配置CIC映射
    // 针对核0映射串口中断(即148)到主机中断8
    // 第一个参数核号,第二个外设CIC中断号(查询方式见第一部分),第三个主机中断号(CIC输出的哪个中断号)
    CpIntc_mapSysIntToHostInt(0, 148, 8);

    // 配置CIC的中断服务函数,自己需要的中断配置函数需要在这进行关联
    // 第一个是外设中断号,第二个是中断服务函数地址,第三个是传入的参数,第四个是使能中断
    CpIntc_dispatchPlug(148, (CpIntc_FuncPtr)uart_isr, 148, TRUE);

    // 使能串口系统中断和主机中断
    CpIntc_enableHostInt(0, 8);
    CpIntc_enableSysInt(0, CSL_INTC0_UARTINT);

    // 可以通过获取事件ID的方式得到,其实结果就是上面关联的外设中断号148
    eventId = CpIntc_getEventId(8);
    // 使用默认值初始化参数
    Hwi_Params_init(&hwiParams);
    // 中断事件号
    hwiParams.eventId = eventId;
    // 传递到中断服务函数的参数,必须设置成CIC关联的主机中断号,否则找不到中断入口,服务函数不会执行
    hwiParams.arg = 8;
	 // 中断嵌套设置
    hwiParams.maskSetting = Hwi_MaskingOption_SELF;
    // 使能中断
    hwiParams.enableInt = TRUE;
    // 将Hwi中断号设置成13(4-15之间设置,如果运行出错说明与其他中断号冲突)
    // 这一步中传入的中断服务函数是CpIntc_dispatch,这个是由CpIntc库实现的函数
    // CpIntc_dispatch函数根据hwiParams中的arg参数寻找中断服务函数入口,因此arg必须设置正确
    uartHwi = Hwi_create(13, &CpIntc_dispatch, &hwiParams, &eb);
    if (uartHwi == NULL) {
        printf("Error create Hwi\n");
    }
    printf("Hwi init succ\n");
}

最后还需要在cfg文件中使用CpIntc模块和Hwi模块,选择进入后勾选Add即可
在这里插入图片描述


总结

通过以上这些步骤,开发者可以有效地管理和优化C6678的中断处理,以提高系统的稳定性和性能。请注意,具体的中断配置和映射可能因应用程序的需求而异,因此需要根据实际情况进行定制。感谢阅读。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值