C6000系列DSP的中断系统


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

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

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

中断模块框图

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

  • 1.   Reset
  • 2.   NMI 不可屏蔽中断
  • 3.   EXCEP 硬件异常
  • 4.   12个普通中断INT[15:4]
我们使用的最多的也就是普通中断,所以这也是本文的重点。
----------------------------------------------------华丽分割------------------------------------------------------
接下来,沿着INT[15:4]往后退,看到的是Interrupt Selector,它的功能好比一个筛子(shuffle),对所有中断事件进行选择性映射。如下图示:
看了这个图,我们又不难发现,中断选择器是一个128-->12的映射,这也就意味着,有116个系统事件被过滤掉了。
接着往回走,可以看到,中断选择器有三个输入,分别是:

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

RESET不看了,硬件重启。

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

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

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

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

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

那么,怎么组合呢?

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

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

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

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

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

可以明显的看出,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的中断机制了,再贴一张图来巩固一下上面所说的内容:

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

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

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

举个例子:

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

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

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


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

中断模块CSL库使用

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

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

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

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

[cpp] view plaincopy
  1. CSL_Status                  intStat;
  2. CSL_IntcContext             gpiocontext;
  3. CSL_IntcEventHandlerRecord  isr_gpio;
  4. CSL_IntcEventHandlerRecord  record[1];
  5. CSL_IntcGlobalEnableState   state;
  6. CSL_IntcParam               vectId;
  7. CSL_IntcHandle              gpioIntcHandle;
  8. CSL_IntcObj                 gpioIntcObj;
  9. static void HANDLE_INTR4(void *arg)
  10. {
  11. //中断服务程序
  12. }
  13. /*-----------------------------------------------------------------------------------
  14. *
  15. *                  初始化外部中断4
  16. *
  17. -----------------------------------------------------------------------------------*/
  18. void InitAndEnableIntc4(void)
  19. {
  20. //初始化
  21. gpiocontext.numEvtEntries = 1;
  22. gpiocontext.eventhandlerRecord = record;
  23. intStat = CSL_intcInit(&gpiocontext);
  24. //使能NMI(不可屏蔽中断)
  25. intStat = CSL_intcGlobalNmiEnable();
  26. //全局中断使能
  27. intStat = CSL_intcGlobalEnable(&state);
  28. //打开中断模块(把GPIO4中断事件映射到系统中断INT4)
  29. vectId = CSL_INTC_VECTID_4;
  30. gpioIntcHandle = CSL_intcOpen(&gpioIntcObj, CSL_INTC_EVENTID_GPINT4, &vectId, &intStat);
  31. //绑定中断服务程序
  32. isr_gpio.handler = (CSL_IntcEventHandler)&HANDLE_INTR4;
  33. CSL_intcPlugEventHandler(gpioIntcHandle, &isr_gpio); //绑定
  34. //使能该事件(开始监听)
  35. CSL_intcHwControl(gpioIntcHandle, CSL_INTC_CMD_EVTENABLE, NULL);
  36. }

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

接下来将介绍:

  • DSP的EDMA系统与EMIFA接口
  • FPGA的乒乓RAM应用
  • CCIR656视频标准(PAL)
  • FPGA与DSP实现的视频采集与传输实验
最后,给出一些资源下载:
  • 1.C6000系列的GPIO与中断系统笔记(即两篇文章的PDF版本)
  • 2.C6455CSL库文档
  • 3.C6455的GPIO与中断系统官方文档
点此下载

转载于:https://www.cnblogs.com/huty/p/8518522.html

【DSP开发】C6000非多核非KeyStone系列DSP中断系统相关推荐

  1. Linux驱动开发学习笔记【8】:Linux中断系统

    目录 一.Linux内核中断处理过程 1.1.裸机中断 1.2.linux中断 二.linux中断的上半部和下半部 2.1 软中断 2.2 tasklet 2.3 工作队列 2.4 中断线程化 三.设 ...

  2. 【DSP开发】【Linux开发】基于ARM+DSP进行应用开发

    针对当前应用的复杂性,SOC芯片更好能能满足应用和媒体的需求,集成众多接口,用ARM做为应用处理器进行多样化的应用开发和用户界面和接口,利用DSP进行算法加速,特别是媒体的编解码算法加速,既能够保持算 ...

  3. TI公司三大系列DSP内部结构之比较

    一引言 DSP有两种解释:一种是数字信号处理器(Digital SignalProcessor),也称数字信号芯片:另一种是数字信号处理技术(Digital Signal Processing).我们 ...

  4. 从BES蓝牙耳机开发中谈DSP开发与嵌入式ARM的区别

    对比下DSP开发与嵌入式ARM的区别,DSP开发,发开算法,注意链接文件的使用. 一先看BES的DSP开发 1 lds链接文件之代码段text 存放可执行代码和浮点数常量 2 data数据段 3 .b ...

  5. 创龙TI KeyStone C66x多核定点/浮点TMS320C6678 DSP开发板处理器、NAND FLASH、NOR FLASH

    TL6678-EasyEVM是广州创龙基于SOM-TL6678核心板而研发的一款多核高性能DSP开发板.开发板采用核心板+底板方式,底板采用沉金无铅工艺的四层板设计,尺寸为200mm*106.65mm ...

  6. Android开发进阶之NIO非阻塞包(一)

    Android开发进阶之NIO非阻塞包 这个系列转载于http://www.android123.com.cn/androidkaifa/695.html,特此说明 对于Android的网络通讯性能的 ...

  7. SOM-TL665x核心板研发的一款TI C66x多核定点/浮点高性能DSP开发板 处理器/FLASH

    前    言 TL665x-EasyEVM是广州创龙基于SOM-TL665x核心板研发的一款TI C66x多核定点/浮点高性能DSP开发板,采用核心板+底板方式,底板尺寸为200mm*106.65mm ...

  8. C6678多核DSP开发——hello world

    C6678多核DSP开发--hello world 本篇学习笔记主要记录在C6678实验板上实现打印"hello world"信息功能,主要目的是熟悉CCS开发环境和硬件调试过程. ...

  9. React 可视化开发工具 Shadow Widget 非正经入门(之四:flux、mvc、mvvm)

    本系列博文从 Shadow Widget 作者的视角,解释该框架的设计要点.本篇解释 Shadow Widget 在 MVC.MVVM.Flux 框架之间如何做选择. 1. React Flux 框架 ...

最新文章

  1. Python 自带IDLE中调试程序
  2. 建立TCP连接时的三次握手与四次挥手问题
  3. 文本编辑器实现打开帮助文件的功能
  4. 气象各种资料汇总(持续更新ing)
  5. 没钱还装逼,买二手车的都是什么人?
  6. 安装 | MatlabR2021bMac链接及Matlabx运行图基本运行代码与图像
  7. java如何抽象一辆车,java新职篇:面向对象之抽象
  8. jQuery - Bootstrap 3 and Youtube in Modal
  9. C++ 求指定函数的定积分问题
  10. 离线打包报错缺少io.dcloud.PandoraEntry
  11. 《虎胆龙威4》观后感
  12. 批发进销存管理软件,商品分类管理,对商品分类批量价格管理,商品分类导入导出的操作
  13. 计算机网络之面试常考
  14. matlab 函数,matlab 语法1
  15. simulink模块,提供xpctarget下驱动源码
  16. vscode vim 分组替换_写给 VS Code 用户的 Vim 入坑指南
  17. 敏捷遇上UML(2014.4.19 广州站)- 活动报道
  18. 探究Bitmap在Android中的内存占用
  19. 贪心算法解旅行家的预算问题
  20. cadence怎么使用

热门文章

  1. typora新增主题,typora将主题导入本地
  2. python二进制打开(rb)和文本格式打开(r)什么区别?
  3. MySQL中对varchar类型排序问题的解决
  4. 机器学习常用术语词汇表
  5. vue响应式给数组中的对象添加新属性
  6. LeetCode简单题之图像渲染
  7. MLIR(Multi-Level Intermediate Representation Compiler)架构 Infrastructure
  8. 如何使用TVM Pass Relay
  9. CUDA 7流简化并发
  10. 语义分割:基于openCV和深度学习(一)