1、C6726系列DSP外部中断的实现C672x系列中断实现流程TI C6727 没有提供专门的外部中断引脚,使用McASP AMUTEIN引脚作为外部中断引脚,利用McASP的AMUTEiN事件触发dMAX,使dMAX产生相应的中断递交给CPU (可用中断:INT9,INT10,INT11,INT12,INT13,INT15)。以下为配置该中断的步骤及每步所要编的程序,同时又给出了每步所要配置的寄存器在数据手册中的说明。一、配置CFGMCASPx寄存器,选择AMUTEINx引脚#define CFGMCASP0 (int*)0x40000018)#define AXR7 0xFFFFFFF8*
2、CFGMCASP0 = (*CFGMCASP0& AXR7)|0x00000001;二、将上一步选择的相应管脚配置为GPIO 输入引脚#define PFUNC (int*)0x44000010)#define PDIR (int*)0x44000014)#define POUT (int*)0x44000018)#define PDIN (int*)0x4400001C)#define PDSET (int*)0x4400001C)#define PDCLR (int*)0x44000020)#define INTERUPT 0xFFFFFF7F*PDIR = (*PDIR& INTERUP
3、T)|0x0; *PFUNC = (*PFUNC& INTERUPT)|0x00000080; 三、在相应McASP模块中,禁止AMUTEIN信号驱动AMUTE输出,通过将AMUTE寄存器的INEN位清“0”来实现:#define AMUTE (int*)0x44000048)#define INEN 0xFFFFFFFB*AMUTE = (*AMUTE& INEN)|0x0;四、配置dMAX 1) 配置DEPR寄存器,选择上升沿或下降沿触发2) 配置DEHPR或DELPR寄存器,选择高优先级或低优先级3) 配置EVENT ENTRY,选择中断号,将其保存在对应的Param位置4) 配置DEE
4、R寄存器,使能相应的dMAX事件5, 配置中断(SPRU733A)以下为在数据手册中找到的dMAX的各个寄存器的地址,以及各个寄存器内部的说明:. (1)#define DEPR (int*)0x60000008)#define RISEING 0X0 * DEPR = (*DEPR & RISEING |0xFFFFFFFF; (2)#define DEHPR (int*)0x60000014#define PRIORITY 0X0 * DEHPR = (*DEHPR & PRIORITY |0xFFFFFFFF; (3)配置EVENT ENTRY,选择中断号,将其保存在对应的Param位置
5、(4)#define DEPR *(int *)0x60000008 #define DEER *(int *)0x6000000C #define DEDR *(int *)0x60000010 #define DEHPR *(int *)0x60000014 #define DELPR *(int *)0x60000018 #define DEFR *(int *)0x6000001C #define DER0 *(int *)0x60000034 #define DER1 *(int *)0x60000054 #define DER2 *(int *)0x60000074 #define
6、 DER3 *(int *)0x60000094 #define DFSR0 *(int *)0x60000040 #define DFSR1 *(int *)0x60000060 #define DTCR0 *(int *)0x60000080 #define DTCR1 *(int *)0x600000A0 #define MAX0_EVENT_TABLE 0x61008000#define EVENT26 (*(int *)(MAX0_EVENT_TABLE+26*4) #define EVENT26_PARA 0x00060007void initdMAX( void ) EVENT2
7、6 = EVENT26_PARA; DEPR |= 0x04000000; DEHPR |= 0x04000000; DEER |= 0x04000000; 五 配置中断(SPRU733A)修改中断向量表,将相应中断的跳转地址改为对应的中断服务程序(也可通过程序实现),然后使能相应中断:1) 禁止全局中断 CSR.GIE = 02) 使能相应中断 IER.IEn = 13) 使能NMI中断 IER.NMIE=14) 使能全局中断 CSR.GIE=1下表为C672x系列DSP中各个中断的的意义,中断向量表是.asm格式的文件,里面内容如下,根据情况可自行修改 unused .macro id .
8、global unused:id:unused:id: b unused:id: ; nested branches to block interrupts nop 4 b unused:id: nop nop nop nop nop .endm .sect .vectors .align 32*8*4 ; must be aligned on 256 word boundaryRESET: unused 0 ; reset vector unused 1 unused 2 unused 3 unused 4 unused 5 unused 6 unused 7 unused 8 unused
9、 9 unused 10 unused 11 unused 12 ;unused 13 .ref _xint mvkl _xint,b0 ;load destination function address to b0 mvkh _xint,b0 b b0 nop nop nop nop nop unused 14 unused 15而对中断寄存器的操作如下所示:cregister unsigned int ISTP,CSR,IER;void initIntc( void ) CSR &= 1; /GIE = 0,global disable interrupt ISTP=0x10000000
10、; / interrupt vector base address = 0x10000000 if you change it must change xint.cmd .vectors sections IER=0x2002; / interrupt enable INT13 and NMI CSR |=1; /GIE = 1,global enable interrupt 这里的cregister在TI的技术文档中有这样的描述:The compiler extends the C/C+ language by adding the cregister keyword to allow hi
11、gh level language access to control registers.When you use the cregister keyword on an object, the compiler compares the name of the object to a list of standard control registers for the C28x (see Table 6-2 ). If the name matches, the compiler generates the code to reference the control register. I
12、f the name does not match, the compiler issues an error.Table 6-2. Valid Control Registers-Register Description-IER Interrupt enable registerIFR Interrupt flag registerTo use the control registers in Table 6-2 , you must declare each register as follows. The c28x.h include file defines all the control registers through this syntax:extern cregister volatile unsigned int register ;所以ISTP,CSR,IER这三个寄存器是可以用关键字cregister定义的寄存器,定义之后就可以直接调用了并修改了。PS:在DSP62XX系列中有更多这样的寄存器。六 中断服务程序的格式:如下void interrupt xint( void )/*此处加入中断服务程序需要执行的内容*/ 这里interrupt为关键字,xint与中断向量表中的xint是对应的,不要修改,所有的这些都弄完了,就可以进行编译、运行了。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1