原创作品,转载请注明原作者及地址!

by 飞鸿惊雪

http://blog.csdn.net/niyufeng

Learning ADSP-TS201系列--索引

1 Learning ADSP-TS201系列--重要参考

2 Learning ADSP-TS201系列--EZ-KIT Lite评估板硬件资源

3 Learning ADSP-TS201系列--Flag Pins按键和LED灯

4  Learning ADSP-TS201系列--Interrupt Pin

Learning ADSP-TS201系列--Interrupt Pin

上一篇截图中还有另外的两个按键SW4和SW5,这两个按键涉及到中断,本篇就讲这个最简单的中断Interrupt Pin(IRQ0),后续再尝试其他的中断,例如timer定时计数器,DMA中断,LinkPort中断。。。

1 电路中的Interrupt Pin

ADSP-TS201 EZ-KIT Lite评估板上每片DSP含有4个外部中断(IRQ3–0 ),其中IRQ0接到了一个按键上(SW4和SW5)。

当按键按下时,表现为低电平(可采用高低电平触发中断的模式)。

2 Interrupt Pin的寄存器

涉及到中断的主要有以下这几个寄存器:ILAT,IMASK,PMASK,以及SQCTL下的GIE位控制全局中断,和INTCTL控制IRQ3-0的触发方式、TIME1-0的启动。

ILAT,IMASK,PMASK这三者“相与”指明了正在执行的中断为哪一个。
ILAT:中断锁存寄存器,只要发生中断相应位置1;
IMASK:中断屏蔽寄存器,只有置1才允许响应相应的中断;
PMASK:锁存正在执行的中断,如果允许中断嵌套,只有在高于目前PMASK位的中断才可以响应。

2.1 ILAT  IMASK  PMASK (H)寄存器

我们本次要试验的IRQ0就在(H)寄存器中!

2.2 ILAT  IMASK  PMASK (L)寄存器

2.3 INTCTL寄存器

INTCTL控制IRQ3-0的触发方式、TIME1-0的启动。

2.4 SQCTL寄存器

SQCTL下的SQCTL_GIE位控制全局中断。
SQCTL还有两个别名SQCTLST和SQCTLCL。

和一般的单片机如MCS-51,MSP430,以及ARM处理器相比,DSP的中断很独特。
它的中断向量表是有专门的寄存器组来存储,而非像ARM处理、单片机那样放在存储器中,更不需要ARM那样复杂的地址映射之类操作。

3 中断服务程序

第一种在C中定义中断服务程序的方法:

1 首先编写一个C函数,返回值和参数都是void;

  void irq0_isr(void){...}

2 将#pragma interrupt放在这个函数前面,定义这个函数为不可重入的中断服务;

  #pragma interruptvoid irq0_isr(void){...}

3 在main中通过__builtin_sysreg_write将服务程序的函数指针放入中断向量表中,例如IRQ0的服务程序为irq0_isr,则:

 __builtin_sysreg_write(__IVIRQ0, (int)irq0_isr);

第二种在C中定义中断服务程序的方法:

1 首先编写一个C函数,返回值是void(无返回),有一个参数int型;

  void isr_irq0(int signal){...}

2 不需将#pragma interrupt放在这个函数前面!
3 添加#include<signal.h>头文件(其中包含了SIGIRQ0等各种中断信号的定义),在main中通过interrupt系列函数将服务程序的函数指针放入中断向量表中,例如IRQ0的服务程序为isr_irq0,则:

  interrupt(SIGIRQ0, isr_irq0);

4 编程实验

#include<stdio.h>
#include<builtins.h>
#include<sysreg.h>
#include<defts201.h>#include<signal.h>void isr_irq0(int dummy);int main( void )
{//将FLAG2设为输出模式__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG2_EN);//允许外部IRQ0int imaskh=0;imaskh = __builtin_sysreg_read(__IMASKH);imaskh |= (1<<INT_IRQ0_P);__builtin_sysreg_write(__IMASKH, imaskh);//设置IRQ0中断服务程序interrupt(SIGIRQ0, isr_irq0);//设置跳沿触发__builtin_sysreg_write(__INTCTL,0);//开全局中断使能__builtin_sysreg_write(__SQCTLST, SQCTL_GIE);while(1);}void isr_irq0(int signal)
{static int button=0;//按键按下进入本中断服务,每次都反转下button状态button = !button;if(0==button){__builtin_sysreg_write(__FLAGREGCL,~FLAGREG_FLAG2_OUT);} else {__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG2_OUT);}}

对比上一个中断程序的写法,再列出另一中中断服务完整程序。

#include<stdio.h>
#include<builtins.h>
#include<sysreg.h>
#include<defts201.h> void irq0_isr(void);int main( void )
{int v;//将FLAG2设为输出模式__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG2_EN);//设置IRQ0服务程序__builtin_sysreg_write(__IVIRQ0,(int)irq0_isr);//设置跳沿触发__builtin_sysreg_write(__INTCTL,0);//允许外部IRQ0v=__builtin_sysreg_read(__IMASKH);v|=(1<<INT_IRQ0_P);__builtin_sysreg_write(__IMASKH,v);//开全局中断使能__builtin_sysreg_write(__SQCTLST,SQCTL_GIE);while(1);}#pragma interrupt
void irq0_isr(void)
{static int button=0;button=!button;if(0==button){__builtin_sysreg_write(__FLAGREGCL,~FLAGREG_FLAG2_OUT);} else {__builtin_sysreg_write(__FLAGREGST,FLAGREG_FLAG2_OUT);}}

         

ADSP-TS201 EZ-KIT Lite评估板上面有两个DSP处理器A和B。Emulator仿真时,如果不定义LDF链接文件,默认使用DSP_B。

最右边的两个LDE和3个Button按键就是DSP_B的,注意看右起第二个LED,可以使用按钮进行亮灭的控制。

Learning ADSP-TS201系列--Interrupt Pin相关推荐

  1. NXP iMX8系列处理器Pin Multiplexing定义说明

    By Toradex秦海 1). 简介 为了提高处理器的设计灵活性和可用性,NXP的所有i.MX系列处理器都配备了基于 IOMUX Controller (IOMUXC)和IOMUX来使能Pin Mu ...

  2. Reinforcement Learning强化学习系列之二:MC prediction

    引言 这几个月一直在忙找工作和毕业论文的事情,博客搁置了一段时间,现在稍微有点空闲时间,又啃起了强化学习的东西,今天主要介绍的是强化学习的免模型学习free-model learning中的最基础的部 ...

  3. BAT资深算法工程师「Deep Learning」读书系列分享(一) | 分享总结

    本文转载自:https://www.leiphone.com/news/201708/LEBNjZzvm0Q3Ipp0.html 雷锋网 AI 科技评论按:「Deep Learning」这本书是机器学 ...

  4. Learning to Rank系列之概述

    背景 排序问题是信息检索.新闻推荐.自然语言处理等领域中一个非常热门的研究问题.以google搜索为例,比如你在搜索框内输入"machine learning",回车之后googl ...

  5. Learning by doing 系列文章(之一)如何在 Python 中使用 epoll ?

    epoll 简介 参见本博前一文<epoll使用详解> Epoll Within Python Python 在 2.6 版中引入了用于处理Linux epoll系统调用的API,本文简单 ...

  6. 机器学习(MACHINE LEARNING)MathWorks系列教程

    文章目录 1 .m文件和 .mat文件的区别 1.1 性质不同 1.2 调用不同 2 format函数 3 .*的区别 4 绘图案例 5 导入工具 6 逻辑索引 7 恒星运动 8 loglog 9 摘 ...

  7. Learning to Rank系列之Pointwise方法

    上一篇综述文章 里我们简单介绍了L2R三种方法的一个概要,接下来将对这三种方法做详细介绍.本篇文章介绍第一种L2R方法–pointwise方法 1.原理 pointwise方法非常简单,考虑的是文档 ...

  8. Deep Learning(深度学习)学习笔记整理系列之(五)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  9. Deep Learning(深度学习)学习笔记整理系列之(二)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

最新文章

  1. 解决递归中的重复计算问题
  2. nth-of-type(n)
  3. Linux系统信息与系统资源
  4. 使用Lambda的装饰设计模式
  5. 图像风格转换V3算法
  6. Tomcat 改BUG之 localhost:8080 404
  7. 比赛中学习(2)-voc数据集制作中将.txt文件变为.xml文件
  8. k8s之PodIP、ClusterIP和ExternalIP
  9. 2021下半年最新编程培训机构排名出炉!
  10. macOS 终端打开提示:zsh compinit: insecure directories
  11. Java进阶-requestresponse (十一)
  12. 英语单词记忆测试软件,适用于检查学生英语单词背诵情况的软件
  13. CBitmap Detach和DeleteObject的关系
  14. 全球数字高程数据:ASTER GDEM
  15. 最小二乘擬合matlab,存在已知协方差情况下的最小二乘解
  16. codeblocks20版本无法找到编译器的解决方法!
  17. 销售宝:ERP软件系统对于企业有什么帮助?
  18. 以开发之名|斗罗大陆:创造一个尽情探险的开放式游戏世界
  19. mysql meb_mysql meb备份与恢复
  20. 同质图,异质图以及属性图

热门文章

  1. BZOJ4808马——二分图最大独立集
  2. 服务器运维浏览器,本机浏览器如何访问docker容器的内容_网站服务器运行维护,浏览器,docker...
  3. SpringBoot 使用Phoenix操作HBase数据库教程
  4. 页面实时显示当前时间
  5. java-实现桌面壁纸自动切换(有界面,可还以自己设置时间的那种哦)
  6. 2021-2027全球与中国电动汽车电子水泵市场现状及未来发展趋势
  7. 怎么下载2.5维虚拟城市地图
  8. 英语学习利器,后悔后知后觉了--------------------韦氏三宝
  9. QQ空间迁移_【群晖NAS+FRP_并获取用户真实IP 支持群辉6.0和群辉7.0】
  10. B2B2C分布式微服务电商源码(支持:小程序、公众号、H5、IOS、Android)