一、中断模块寄存器介绍
本节我们主要介绍
C6748
的中断模块。
中断是硬件系统的基本功能,
DSP
通过中断实现和其他芯片的实时交互。中断是指
DSP
在执行程序的过程中,当出现异常情况或特殊请求时,
DSP
停止现行程序的运行,转向这些异常情况或特殊请求的处理,处理结束后再返回现行程序的间断处,继续执行原程序。中断是实时处理内部或外部时间的一种内部机制。
在
TMS320C6748
中一共有
127
个中断事件。如图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/46add632ca51911b59fde1dd1d980c68.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2cb0fd44e50e33c3dd46cdfe6dd91c8c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e0a9bc833b094432b14d83b3b1471cfb.png)
由中断事件可以看到前
4
个事件是复用中断事件,通过
EVTMASKn
寄存器将
4~127
个中断事件复用到这四个中断事件中,见下图。例如,
EVTMASK1
中复用了
EVT38
,当
EVT38
发出中断请求,想应的
EVT1
同时发出中断请求。另外在
MEVTFLAGn
可以查看具体是哪个事件在请求中断。也许这里你会疑问,这样的设计有什么好处呢?在下面我们详细说明。
![](https://i-blog.csdnimg.cn/blog_migrate/1ad45e9fcc94094d7484ff583393e320.png)
在
DSP
是通过中断向量表作为相应的中断服务程序的入口,中断优先级自高至低。在
TMS320C6748
中共有
16
个中断。
中断优先级
|
中断名称
|
描述
|
0
|
Reset
|
复位中断
|
1
|
NMI
|
不可屏蔽中断
|
2
|
Reserved
|
预留(不可操作)
|
3
|
Reserved
|
预留(不可操作)
|
4
|
INT4
|
用户自定义中断
|
5
|
INT5
|
用户自定义中断
|
6
|
INT6
|
用户自定义中断
|
7~13
|
INT7~13
|
用户自定义中断
|
14
|
INT14
|
用户自定义中断
|
15
|
INT15
|
用户自定义中断
|
前
4
个中断,编程一般用不到,
Ti
公司总共留给用户
12
个可自定义的中断,所以当使用到的中断特别多的情况下,复用中断事件有非常重要的意义。到此,相信大家也能猜到,我们需要把用到的中断事件分配到
12
个可用的中断。具体的寄存器为
INTMUXn(
中断复用寄存器
)
![](https://i-blog.csdnimg.cn/blog_migrate/cec4f4dd09b951e1eee685141e4739ae.png)
表
7-35~7-37
为
12
个中断选择在寄存器中的位置,表
7-9
是中断选择的格式。事件到中断的映射如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/ef42946ab8b7a536e3093c3b9aab1e99.png)
另外,常用的中断寄存器有以下几个:
ISTP
:中断向量表起始地址寄存器;
IER
:中断使能寄存器;
ICR
:中断清除寄存器;
ISR
:中断设置寄存器等等。
以上几个寄存器我们在具体介绍中断向量表汇编文件时再详细介绍。
在调制过程中,我们如果想调试其中一个中断,但是这个中断需要相关外设才能发起请求,这时我们可以设置
EVENTSETn
寄存器,设置事件发生。相应地,还有
EVENTCLRn
(中断事件清除寄存器)
[
每次完成中断设置后一定要清除所有中断标志,处理完中断后最好清除下相应标志位
]
、
EVENTFLAGn
(中断事件标志寄存器)
在主程序中中断函数使用如下的关键字:
interrupt
void
[
用户定义名]()
{
}
二、
CCS
调试的一些经验
在编写
DSP
子函数时,你也许会使用一些变量,最好不要使用数据量较大的数组,因为
DSP
在运行子函数程序时,所涉及到的局部变量在内存中有一个临时存储区域,但是
DSP
不能识别这段区域中有没有别的程序段,这样很可能造成数组被中途截断,一部分数据出错或者程序运行出错。
解决方法:
1
、直接定义全局变量,在主程序中分配确定的内存地址;
2
、使用指针传递变量,子函数中不要定义新变量;
3
、运用函数
*UTIL_allocMem(Uint32size)
在子函数中分配内存块。
// Allocatememory from the ad-hoc heap
void*UTIL_allocMem(Uint32 size)
{
void *cPtr;
Uint32 size_temp;
// Ensure word boundaries
size_temp = ((size + 4) >> 2 )<< 2;
if((currMemPtr + size_temp) > ((Uint32)&EXTERNAL_RAM_END))
{
return NULL;
}
cPtr = (void *) (((Uint32)&EXTERNAL_RAM_START) + currMemPtr);
currMemPtr += size_temp;
return cPtr;
}