DSP的核心中断与芯片中断

C66xDSP的中断主要由两部分组成:核心中断控制器和芯片中断控制器。

1、核心中断控制器

C6678有很多的外设和大量的事件源。核心中断控制器支持多达128个系统事件。

主要有三个部分组成:

中断选择器

事件组合器

异常组合器

C66x处理器有数百个中断源,但是核心中断控制器最多只支持128个显然是远远不够的,于是引入了芯片中断控制器,其可以理解为是对核心中断控制器的扩展。芯片中断控制器事件的响应需要经过两级的映射,首先需要先映射到核心中断再映射到CPU

芯片中断主要有五部分组成:

使能器

中断状态

通道映射

主机中断映射

优先级

下面详细介绍一下核心中断控制器

 核心中断的中断类型可以分为4类:

复位中断:主要作用是给整个系统进行复位

12个可屏蔽中断(INT4-INT15):使用的外设中断基本都是映射到这12个中断上

不可屏蔽中断

可屏蔽硬件异常

核心中断支持128个系统事件 EVT0~EVT127

其中4~127号事件是由外设提供的,0~3是由事件组合器输出

4~127可以输入到中断选择器、事件组合器、异常组合器

而事件0~3只能输入到中断选择器

事件的理解:外设或者某个模块输出的中断信号。例如GPIO设置为上升沿信号中断,当GPIO检测到上升沿信号的时候就会将中断信号以事件的方式输入到中断控制器上进而触发CPU相应中断。

中断选择器:

CPU中断4到CPU中断15分别有对应的中断向量,这12个中断接收到中断信号后就可以跳转到中断服务函数里。

中断选择器的主要功能就是把事件映射到CPU中断上。

硬件异常中断是可屏蔽中断,允许多个系统事件组合为单个异常事件输入到CPU上,组合器通过EXPMASK[3:0] 选择组合事件。

事件组合器是将多个事件组合为1个系统事件再输入到中断选择器上。允许多个系统事件组合为单个事件,将EVT4~EVT127分为4组事件组合器通过EVTMASK[3:0] 选择组合事件。

共有4个EVTMASK寄存器每个寄存器32位,每一位代表1个事件,默认为1,也就是全部事件都被屏蔽,若想使能系统事件作为核心事件的话就将对应事件的位清零。

 核心中断控制器与芯片中断控制器的关系

 核心中断控制器是属于核心的一个功能模块,CIC芯片中断控制器是属于SOC芯片上的一个模块,所以这里也可以把CIC理解为一个外设,它的输入是事件,输出也是事件,输出的就是核心中断控制器的事件,就是核心中断控制器128个事件中的某个事件,因此,通过CIC扩展的事件经过芯片中断控制器的映射之后输出到核心中断控制器的事件上,而核心中断控制器又将这个事件映射到CPU中断上,CPU就可以相应芯片中断控制器上的中断了。

C6678有4个CIC模块,

CIC0提供17个2级事件和8个广播事件到核心0~3上。

CIC1提供17个2级事件和8个广播事件到核心4~8上。

CIC2提供26个2级事件到EDMA3_CC1上

        提供24个2级事件到EDMA3_CC2上。

CIC3提供32个2级事件到HyperLink上。

        提供8个2级事件到EDMA3_CC0上。

多个芯片级事件可以提供CIC组合、映射为一个事件输出。

广播事件可用于多核同步和多核通讯。

 核心事件与CIC输出事件对应关系

表中第一列为核心中断事件,第二列为CIC输出事件,其中上部分的n代表核号,n取值为0~7

核心事件与CIC输入事件也是类似。

 芯片中断的系统中断使能:

系统中断使能通过STATUS_SET_INDEX_REG寄存器配置,只有一个寄存器,使能哪个事件就将要使能的事件号写到index里。

INDEX = CIC输入事件号,可以使能对应的事件中断

 芯片中断的中断状态:

当使能的系统事件产生中断后,对应的中断状态就会被设置,它会跳转到中断服务函数,一般需要清除这个中断状态,一般需要通过STATUS_CLR_INDEX_REG寄存器清楚这个状态。清除哪一号事件就将事件号写到index里。

INDEX = CIC输入事件号,可以清楚对应事件中断状态。

 芯片中断的通道映射:

CIC中最重要的一个模块,它与核心中断事件选择器的功能相似,它的主要功能是将系统事件映射到某个的通道,映射的方法是通过CH_MAP_REGx寄存器配置,一共256个,x的取值为0~255,每个寄存器有4个系统事件,每8位代表一个事件,共32位,一共1024个事件。在每个事件对应的域写入通道号,就可以将系统中断映射到想要的通道了。

主机中断映射:

主机中断寄存器为只读寄存器,因为通道核主机中断的对应关系是固定的。也就是说通道0映射到主机中断0,通道1映射到主机中断1上,以此类推。通道数是由设备决定的,最大256个。寄存器最大为64个,每8位1个通道,一个寄存器有4个通道。

优先级:

芯片中断的优先级是不可配的,所以中断优先级的寄存器也是只读的。多个系统事件可以映射到同一个通道上或者主机中断上,系统事件号越小优先级越高,每个主机中断都有一个优先级索引寄存器与之对应,由于主机中断/通道的数目最大256个所以优先级索引寄存器最大也是256个。

示例1:按键中断

在程序中首先初始化DSP中断寄存器,然后使能dsp全局中断,将一个91号事件映射到CPU中断4上,然后在这个CPU中断4上注册一个中断服务函数,也就是CPU中断4发生后就跳转到中断服务函数里面,使能CPU中断4,然后开始配置GPIO,把GPIO0配置为下降沿触发,然后使能GPIO0中断。

示例2:组合事件中断

因为GPIO0的中断事件是91,而91号事件是在EVT64到EVT95之间的,所以它的组合事件是EVT2,将EVT2事件映射到CPU中断4上。

在程序中首先初始化DSP中断寄存器,然后使能dsp全局中断,然后将EVT2号事件映射到CPU中断4上,然后使能91号事件为组合事件,也就是在EVT MASK这个寄存器里将91号事件那个位清零,它就使能了91号事件为组合事件,映射到组合事件2上,然后组合事件2会输入到中断选择器上,中断选择器会将它映射到CPU中断4上,然后将中断服务函数注册到91号事件上,接下来配置GPIO,把GPIO0配置为下降沿触发,然后使能GPIO0中断。

示例3:CIC中断

串口0中断是CIC0的第164号事件,映射到主机中断0上,而CIC0对应的系统事件是EVT22,再将EVT22映射到CPU中断4上,若程序运行在CPU1上,就不能将CIC0_EVT164映射到主机中断0上了,而是映射到主机中断20上,对于核1来说它对应的系统中断是22。

在程序中,首先获取芯片号,用于接下来初始化串口,然后初始化中断控制器,然后使能全局中断,先配置CIC中断控制器,首先禁用CIC所有的主机中断,然后将串口0的事件也就是164号事件映射到CIC0事件上,然后再使能CIC0这个主机中断,然后完成了将164号事件映射到主机中断0上,也就是CIC输出0上,对应的系统事件是22,接下来注册中断服务函数到主机中断4,然后将CIC0系统中断映射到CPU4主机中断上,再使能CPU中断4,然后配置串口0,包括波特率,长度,初始化完串口完后,使能串口0的发送和接收中断,发送串口0的发送中断的触发条件是输出数据寄存器为空,所以一旦使能了发送中断,一开始就为空,就会马上跳进中断服务函数,对于接收中断的触发条件是接收到了数据就触发,一旦受到外部发来的串口数据就会跳转到中断服务函数。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值