- UID
- 1029342
- 性别
- 男
|
制作中断服务程序,将数据取出:
- interrupt void rint0_isr(void)
- {
- int DotRev;
- DotRev=*( volatile unsigned int *)McBSP0_DRR;
- }
复制代码
修改vectors.asm,替换unused 11为:
- INT11:
- stw b0,*--b15
- mvkl _rint0_isr,b0
- mvkh _rint0_isr,b0
- b b0
- ldw *b15++,b0
- nop 3
- nop
- nop
复制代码
添加引用:
- .ref _rint0_isr ; mcbsp 0 receive interrupt handler
复制代码
这时,所有的任务完成了,可以通过设置断点观察一下接收的数值。
另外需要注意一定要在服务程序中将数据取出,否则会停止接到新的数据。
七、 其他话题
1.设置中断向量表起始位置
上文讨论的都是将中断向量表放置在0地址,如果需要放置到任意地址(以400H对齐),那么就需要提供向量表起始地址。
比如我们的终端向量位置:INT设置为:
- MEMORY
- {
- INT : origin = 0x00000400, len = 0x0000400
- ISRAM : origin = 0x00000800, len = 0x1000000
- }
复制代码
那么我们在初始化中断时,应设置:
复制代码
2.查看现在的中断位图
可以查看中断标志寄存器IFR相应位(15:0)看是否有中断到达。
3.清除/设置原先的中断
如果需要清除原先的中断,可以通过对ICR寄存器相应位置位。如果希望人工触发中断,可以设置ISR寄存器相应位置位,它们将更新IFR位图。
比如,我们在定时器中断服务程序中,通过设置ISR的第12位,人工触发外部INT7的12号中断。
- interrupt void xint0_isr(void)
- {
- ISR=0x00001000;
- }
复制代码
那么CPU将执行extint7_isr(void)处理此中断。
又比如,在上例的外部中断中,有时会出现刚一开机,没有发送信号就有中断进来的情况,那么怎样克服呢?可以通过ICR克服。对ICR置位可以清除可屏蔽中断。对应位有效。比如在设置中断初始化时清除所有原先的中断。那么可以加入语句:
复制代码
4.DSP/BIOS下的中断设置
在DSP/BIOS管理下,我们不需要自己设定中断向量表,以及中断初始化等等,一切通过BIOS的图形化设置即可完成。
添加一个DSP/BIOS
选择File->New,在本测试下选择DSK6416,读者可根据自己实际需要选取。保存为Configuration1.cdb。
将其添加到工程。
如上例需求,选择HWI的10,11,12号中断,右键选择Properties分别填写如下参数:
- HWI_INT10 interrupt source=Timer_1 =_xint0_isr(注意下划线!)
- HWI_INT11 interrupt source=MCSP_0_Receive =_rint0_isr
- HWI_INT11 interrupt source=External_Pin_7 =_extint7_isr
复制代码
在main函数中可以通过同样的方法启动中断。
- IER |= 0x00001C02; // IE10=1 IE11=1 IE12=1
- CSR |= 0x00000001; //全局中断使能
复制代码
至此配置完毕。
5.中断进不来怎样检查?
首先检查是否设置IER相应位开启,CSR最低位置位,其次看看中断向量表地址是否设置正确。如果确认无误。在向量表中断应当进入的位置设定断点。运行看是否执行到断点。如果有,那么看看中断服务程序有没有执行到。如果中断只进来一次后就再也无法进入了,可以查看中断向量表是否能返回到原程序,如果不能返回,查看是否是8条语句。另外可以通过跟踪查看b irp语句是否被执行。如果可以正常返回到原程序,例如串口接收,看看是否没有取值导致阻塞。如果是这样需要将原先值取出才有新的中断。
6.中断若干寄存器的说明到哪里去找?
可以通过Help->Contents,搜索关键字的方法得到。也可以参考官方文档。
八、 附带程序
本教程以附件提供三个示例:
1. onlytimerint——仅包含了定时器的示例
2. int——包含了完整的3种中断
3. intbios——提供了DSP/BIOS下的此3种中断。 |
|