C6000系列DSP的中断系统

C6000系列DSP的中断系统C6000系列DSP的中断系统上一篇介绍了C6455的GPIO系统,最后把GPIO4配置成了中断/事件模式,本文将介绍C6455的中断系统,介绍完基本概念后,给出把GPIO4映射到INT4的代码。完成了GPIO和中断的配置,我们就可以开始着手DSP与FPGA之间的通讯了。废话不多说,下面开始介绍C6455的中断系统。————————-

大家好,又见面了,我是你们的朋友全栈君。

C6000系列DSP的中断系统


上一篇介绍了C6455的GPIO系统,最后把GPIO4配置成了中断/事件模式,本文将介绍C6455的中断系统,介绍完基本概念后,给出把GPIO4映射到INT4的代码。

完成了GPIO和中断的配置,我们就可以开始着手DSP与FPGA之间的通讯了。废话不多说,下面开始介绍C6455的中断系统。


—————————————————-华丽分割——————————————————


中断模块框图

C6000系列DSP的中断系统

仔细观察上图,可以看出C6455有一下几种中断:

  • 1.   Reset
  • 2.   NMI 不可屏蔽中断
  • 3.   EXCEP 硬件异常
  • 4.   12个普通中断INT[15:4]
我们使用的最多的也就是普通中断,所以这也是本文的重点。


—————————————————-华丽分割——————————————————



接下来,沿着INT[15:4]往后退,看到的是Interrupt Selector,它的功能好比一个筛子(shuffle),对所有中断事件进行选择性映射。如下图示:
C6000系列DSP的中断系统

看了这个图,我们又不难发现,中断选择器是一个128–>12的映射,这也就意味着,有116个系统事件被过滤掉了。

接着往回走,可以看到,中断选择器有三个输入,分别是:

  • RESET
  • Event[3:0]
  • Event[127:4]

      

RESET不看了,硬件重启。

EVENT[127:4]是系统事件,这个事件的编号根据芯片的不同而不同,拿6455来说,部分映射情况如下面两个图片所示:

C6000系列DSP的中断系统

C6000系列DSP的中断系统

不难看出,这些编号都是固定的,基本囊括了芯片上所有模块的事件。

 

最后,比较特别的是Event[3:0],它是组合事件,通过下图的介绍应该就一目了然了。

C6000系列DSP的中断系统

可见,Event0对应 4-31号事件的组合事件,Event2对应32-63号事件的组合事件,以此类推。

 

—————————————————-华丽分割——————————————————

那么,怎么组合呢?

这就不得不从寄存器开始说起了。首先,先看如下3个寄存器组:

C6000系列DSP的中断系统

(注:每组都是4个32位寄存器,每一组的EVTxxx0[3:0]都不使用,故这里不涉及到组合事件)

      系统事件发生时(124个),它们在事件标志寄存器中(EVTFLAGx)的对应位会被置1,此时可以通过向EVTCLR寄存器中对应位写入1来清除中断标志,然后执行中断服务程序。若不清除,那么相同事件再次发生时会产生问题。故,手动清除中断标志是必须的!且只能通过向EVTCLR寄存器中写入1来清除,不能直接向EVTFLAG寄存器写入0,因为EVTFLAG寄存器是Read Only的。


      另外,EVTSET寄存器的存在意义就是我们可以手动产生中断,这一点可以让我们测试中断服务程序的功能。

 

      介绍完上面三个基本的寄存器组,我们可以开始讨论组合事件的机制了。先看下图:

C6000系列DSP的中断系统

可以明显的看出,124个事件被分成了4组。然后经过两个寄存器的运算,产生组合事件。

下面介绍EVTMASKMEVT FLAG两个寄存器组。

  •       EVT MASK寄存器组用于决定每一个组中的哪些事件被屏蔽掉。默认情况下,没有事件被屏蔽(全0)。

  •       鉴于最终的组合事件EVTx的发生机制是对Group中所有事件进行或运算,即只要Group中有一个事件发生,就代表组合事件发生。

 

举个例子:

假如EVTMASK3=0x0FFFFFFF,那么代表只有事件124,125,126,127参与组合。其他事件96-123都被忽略。


  •       MEVT FLAG寄存器同EVT FLAG寄存器的值相同,表示事件是否发生。这样一旦知道了EVTMASK和MEVT FLAG两个寄存器的值就可以断定组合事件EVTx(0<=x<=3)是否发生了。

—————————————————-华丽分割—————————————————– 

通过上面的介绍,应该已经很清楚C6455的中断机制了,再贴一张图来巩固一下上面所说的内容:

C6000系列DSP的中断系统

说到这里,我们对上图中红色框以及它之前的东西了解的很清楚了,下面就是Interrupt Selector的机制了。

其实很简单,为12个中断分别配置对应的事件编号即可。只需要3个寄存器就OK啦。

分别是INTMUX1,INTMUX2,INTMUX3。贴一个图就应该很明了了。

C6000系列DSP的中断系统

举个例子:

假设我要让INT4映射到GPIO4,那么通过查找前面的图,发现GPINT4的事件编号是55,那么只要把INTMUX1的低7位设置成0x37即可。

 

此外,官方文档里还说了下面一段话:

C6000系列DSP的中断系统

可见,INT4优先级最高,INT15优先级最低


—————————————————-华丽分割——————————————————

中断模块CSL库使用

上面介绍了很多,其实就是想说清楚C6455的中断机制。实际使用还是CSL比较方便。

      使用CSL配置中断需要如下几个步骤:

  • 1.   初始化中断模块
  • 2.   使能NMI
  • 3.   全局中断使能
  • 4.   打开中断模块
  • 5.   绑定中断服务程序
  • 6.   使能相应事件

 

完整中断配置例子—-把GPIO4事件映射到INT4

CSL_Status              	intStat;CSL_IntcContext 			gpiocontext;CSL_IntcEventHandlerRecord 	isr_gpio;CSL_IntcEventHandlerRecord 	record[1];CSL_IntcGlobalEnableState   state;CSL_IntcParam 				vectId;CSL_IntcHandle  			gpioIntcHandle;CSL_IntcObj     			gpioIntcObj;static void HANDLE_INTR4(void *arg){	//中断服务程序}/*----------------------------------------------------------------------------------- *  * 					初始化外部中断4	 *  -----------------------------------------------------------------------------------*/void InitAndEnableIntc4(void){    	//初始化    gpiocontext.numEvtEntries = 1;    gpiocontext.eventhandlerRecord = record;    intStat = CSL_intcInit(&gpiocontext);       	//使能NMI(不可屏蔽中断)	intStat = CSL_intcGlobalNmiEnable();	    //全局中断使能    intStat = CSL_intcGlobalEnable(&state);         //打开中断模块(把GPIO4中断事件映射到系统中断INT4)    vectId = CSL_INTC_VECTID_4;	gpioIntcHandle = CSL_intcOpen(&gpioIntcObj, CSL_INTC_EVENTID_GPINT4, &vectId, &intStat);    	      //绑定中断服务程序    isr_gpio.handler = (CSL_IntcEventHandler)&HANDLE_INTR4;    CSL_intcPlugEventHandler(gpioIntcHandle, &isr_gpio); //绑定        //使能该事件(开始监听)    CSL_intcHwControl(gpioIntcHandle, CSL_INTC_CMD_EVTENABLE, NULL);}

通过本文以及上一篇文章,我们应该对DSP6000系列的GPIO和中断系统有了一定的了解。(注,本文只是基本的介绍C6000的中断系统,有不少部分没有涉及,若要了解更多,请参考TI官方文档)


接下来将介绍:

  • DSP的EDMA系统与EMIFA接口
  • FPGA的乒乓RAM应用
  • CCIR656视频标准(PAL)
  • FPGA与DSP实现的视频采集与传输实验

最后,给出一些资源下载:

  • 1.C6000系列的GPIO与中断系统笔记(即两篇文章的PDF版本)
  • 2.C6455CSL库文档
  • 3.C6455的GPIO与中断系统官方文档




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148346.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月15日 下午9:36
下一篇 2022年6月15日 下午9:36


相关推荐

  • matlab中表示拉普拉斯分布_拉普拉斯分布的随机数[通俗易懂]

    matlab中表示拉普拉斯分布_拉普拉斯分布的随机数[通俗易懂]一、功能产生拉普拉斯分布的随机数。二、方法简介1、产生随机变量的组合法将分布函数\(F(x)\)分解为若干个较为简单的子分布函数的线性组合\[F(x)=\sum_{i=1}^{K}p_{i}F_{i}(x)\]其中$p_{i}>0\(\foralli)$,且$\sum_{i=1}^{K}p_{i}=1$,\(F(x)\)是分布函数。定理若随机变量\(\xi\sim…

    2025年7月5日
    6
  • android编写单元测试用例,Android 简单的单元测试用例

    android编写单元测试用例,Android 简单的单元测试用例开发中单元测试是必不可少的。简单的一个测试用例。1.在Mainfest进行相关属性的注册。package=”com.test”android:versionCode=”1″android:versionName=”1.0″>android:targetPackage=”com.test”android:name=”android.test.InstrumentationTestRunner…

    2022年6月16日
    33
  • 二阶齐次线性微分方程的通解公式_二阶常系数齐次线性微分方程 通解

    二阶齐次线性微分方程的通解公式_二阶常系数齐次线性微分方程 通解满意答案 yanweishizu2 07 12 采纳率 46 等级 12 已帮助 13567 人 y 2y 5y 0 设 y e f x 则 y e f x f x y e f x f x 2 e f x f x 0 y 2y 5y e f x f x 2 e f x f

    2026年3月16日
    2
  • 二级菜单导航栏(左侧)「建议收藏」

    二级菜单导航栏(左侧)「建议收藏」目标:实现左侧的二级导航栏效果图:项目演示:点击跳转到演示地址代码:<!DOCTYPEhtml><html> <head> <metacharset=”utf-8″> <title>左侧导航栏</title> </head> <style> body{ margin:0; padding:0; min-width:1200px; min-he

    2022年5月27日
    39
  • 操作系统概念第五章部分作业题答案

    操作系统概念第五章部分作业题答案题目一:为什么对调度程序而言,区分CPU约束性进程和I/O约束性进程很重要解答:绝大多数进程可分为I/O主(放入I/O队列)或CPU主(放入就绪队列),I/O主的计算时间>CPU主。因此长期调度程序应选择一个合理的包含I/O主和CPU主的组合进程。在运行I/O操作前,I/0限制的程序只运行很少数量的计算机操作。而CPU约束程序一般来使用很多的CPU。另一方面,CPU约束程序会利用整个时间片,…

    2022年7月14日
    13
  • npm和cnpm(windows)安装步骤

    npm和cnpm(windows)安装步骤一、什么是npm和cnpmnpm(nodepackagemanager):nodejs的包管理器,用于node插件管理(包括安装、卸载、管理依赖等)cnpm:因为npm安装插件是从国外服务器下载,受网络的影响比较大,可能会出现异常,如果npm的服务器在中国就好了,所以我们乐于分享的淘宝团队干了这事。来自官网:“这是一个完整npmjs.org镜像,你可以用此代替官方版本(只读),同步频……………

    2022年10月16日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号