
VisualDSP++ 是一种强大的编程工具,常用于为 Blackfin 和 SHARC 这样的处理器编写嵌入式系统。它具有一系列功能,包括编译、调试、优化和与硬件进行挂接。
如果您希望挂接硬件中断,您需要使用 VisualDSP++ 提供的 API 访问硬件寄存器,并在代码中添加中断服务程序(ISR)以处理硬件中断。
以下是一般步骤:
在代码中定义中断服务程序(ISR),以处理硬件中断。
在 VisualDSP++ 中设置硬件中断源,以使代码能够检测到中断。
在代码中使用 VisualDSP++ 提供的 API 访问硬件寄存器,以控制硬件中断的发生。
编译代码,并将其下载到单片机。
最近在用2812编程,遇到一个问题,想请教各位高手,我先说一下自己的一点理解请教高手指点。 PIE一般用到的中断组是INT1-INT12。我们知道他们的优先级顺序是INT1>INT2>INT3…INT11>INT12。在开所有中断使能的前提下,如果不同组(如INT1组的TINT0和INT2组的T1CINT)的中断同时向PIE发出中断请求,
那么PIE会放中断优先级较高(INT1TINT0)的中断过去。同样的在如果是同组的中断请求同时到达的话(如INT2组的),那么也同样按照PIE中断向量表查看同组优先级,CPU响应优先级较高的中断。
我的理解是,
(1)不同组之间的中断可以实现中断嵌套。如INT1组的TINT0和INT2组的T1CINT。当CPU正在响应INT2组的T1CINT中断服务程序这时如果产生了INT1组的TINT0中断的话那么CPU便会产生中断嵌套,先停下T1CINT转而去执行TINT0,
当TINT0中断服务程序执行完之后再去执行剩余没有执行网的INT1中断服务程序。
(2)同组之间的中断不可以实现中断嵌套。如果同样是INT1组的两个中断比如ADCINT和TINT0。当CPU正在响应INT1的中断服务程序时,这时如果产生了ADCINT,尽管ADCINT在INT1组中的优先级比TINT0的优先级高,还是不会产生中断嵌套。
因为同组的中断在向CPU发出中断请求之前先要经过PIE中的应答位PIEACK验证,如果PIEACK为1说明此时正有改组的中断正在响应,PIE不会放响应该发出中断请求的中断源通过,只有等到正在响应的中断服务程序执行完才会去响应刚刚
发出中断请求的中断服务程序。这也就是为什么,我们在中断服务程序的后面都要加上一句PieCtrlPIEACKbitACKx=1;就是为了让应答位清零,可以响应同组的其他中断。
以上两点是我对2812中断嵌套的一点理解,尤其是提到的第(2)点,万望高手不吝指导。
DSP程序暂停运行后,io状态是(中断的):表示程序的执行被暂时中断的状态示教 *** 作盘画面上显示“PAUSED”(暂停) 通过再启动 *** 作,可继续执行被中断的程序在通过程序调用指令,指令运行,然后输入代码数据就可以恢复了。DSP程序暂停运行后,io状态是中断的
这是 DSP28335的例程,程序目的是通过按不同的按键,通过中断改变LED的闪动方式
,你可以对比一下。 (DSP2812和 DSP28335是差不多的)
#include "DSP2833x_Deviceh" // DSP2833x Headerfile Include File#include "DSP2833x_Examplesh" // DSP2833x Examples Include File
#define LED1_ON GpioDataRegsGPASETbitGPIO0=1
#define LED1_OFF GpioDataRegsGPACLEARbitGPIO0=1
#define LED2_ON GpioDataRegsGPASETbitGPIO1=1
#define LED2_OFF GpioDataRegsGPACLEARbitGPIO1=1
#define LED3_ON GpioDataRegsGPASETbitGPIO2=1
#define LED3_OFF GpioDataRegsGPACLEARbitGPIO2=1
#define LED4_ON GpioDataRegsGPASETbitGPIO3=1
#define LED4_OFF GpioDataRegsGPACLEARbitGPIO3=1
#define LED5_ON GpioDataRegsGPASETbitGPIO4=1
#define LED5_OFF GpioDataRegsGPACLEARbitGPIO4=1
#define LED6_ON GpioDataRegsGPASETbitGPIO5=1
#define LED6_OFF GpioDataRegsGPACLEARbitGPIO5=1
#define LED7_ON GpioDataRegsGPBSETbitGPIO51=1
#define LED7_OFF GpioDataRegsGPBCLEARbitGPIO51=1
#define LED8_ON GpioDataRegsGPBSETbitGPIO50=1
#define LED8_OFF GpioDataRegsGPBCLEARbitGPIO50=1
interrupt void ISRExint3(void);
interrupt void ISRExint4(void);
interrupt void ISRExint5(void);
interrupt void ISRExint6(void);
void configtestled(void);
Uint16 sign ;
void main(void)
{
// Step 1 Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP2833x_SysCtrlc file
InitSysCtrl();
// Step 2 Initalize GPIO:
// This example function is found in the DSP2833x_Gpioc file and
// illustrates how to set the GPIO to it's default state
// InitGpio(); // Skipped for this example
InitXintf16Gpio(); //zq
// Step 3 Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
DINT;
// Initialize the PIE control registers to their default state
// The default state is all PIE interrupts disabled and flags
// are cleared
// This function is found in the DSP2833x_PieCtrlc file
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR)
// This will populate the entire table, even if the interrupt
// is not used in this example This is useful for debug purposes
// The shell ISR routines are found in DSP2833x_DefaultIsrc
// This function is found in DSP2833x_PieVectc
InitPieVectTable();
// Interrupts that are used in this example are re-mapped to// ISR functions found within this file
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTableXINT3 = &ISRExint3;
PieVectTableXINT4 = &ISRExint4;
PieVectTableXINT5 = &ISRExint5;
PieVectTableXINT6 = &ISRExint6;
EDIS; // This is needed to disable write to EALLOW protected registers
PieCtrlRegsPIECTRLbitENPIE = 1; // Enable the PIE block
PieCtrlRegsPIEIER12bitINTx1= 1;
PieCtrlRegsPIEIER12bitINTx2= 1;
PieCtrlRegsPIEIER12bitINTx3= 1;
PieCtrlRegsPIEIER12bitINTx4= 1;
IER |= M_INT12; // Enable CPU int1
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
configtestled();
sign = 0;
while(1)
{
if(sign==0)
{ LED1_OFF;
LED2_OFF;
LED3_OFF;
LED4_OFF;
LED5_OFF;
LED6_OFF;
LED7_OFF;
LED8_OFF;
DELAY_US(50000);
LED1_ON;
DELAY_US(50000);
LED2_ON;
DELAY_US(50000);
LED3_ON;
DELAY_US(50000);
LED4_ON;
DELAY_US(50000);
LED5_ON;
DELAY_US(50000);
LED6_ON;
DELAY_US(50000);
LED7_ON;
DELAY_US(50000);
LED8_ON;
DELAY_US(50000); //NO XINT
}
if(sign==3)
{
LED1_OFF;
LED2_OFF;
LED3_OFF;
LED4_OFF;
LED5_OFF;
LED6_OFF;
LED7_OFF;
LED8_OFF;
DELAY_US(50000);
LED1_ON;
LED2_ON;
DELAY_US(50000);
LED3_ON;
LED4_ON;
DELAY_US(50000);
LED5_ON;
LED6_ON;
DELAY_US(50000);
LED7_ON;
LED8_ON;
DELAY_US(50000); // XINT3 COME
}
if(sign==4)
{ LED1_ON;
LED2_ON;
LED3_ON;
LED4_ON;
LED5_ON;
LED6_ON;
LED7_ON;
LED8_ON;
DELAY_US(50000);
LED1_OFF;
DELAY_US(50000);
LED2_OFF;
DELAY_US(50000);
LED3_OFF;
DELAY_US(50000);
LED4_OFF;
DELAY_US(50000);
LED5_OFF;
DELAY_US(50000);
LED6_OFF;
DELAY_US(50000);
LED7_OFF;
DELAY_US(50000);
LED8_OFF;
DELAY_US(50000); // XINT4 COME
}
if(sign==5)
{LED1_ON;
LED2_ON;
LED3_ON;
LED4_ON;
LED5_ON;
LED6_ON;
LED7_ON;
LED8_ON;
DELAY_US(50000);
LED1_OFF;
LED2_OFF;
DELAY_US(50000);
LED3_OFF;
LED4_OFF;
LED1_ON;
LED2_ON;
DELAY_US(50000);
LED5_OFF;
LED6_OFF;
LED3_ON;
LED4_ON;
DELAY_US(50000);
LED7_OFF;
LED8_OFF;
LED5_ON;
LED6_ON;
DELAY_US(50000); // XINT5 COME
}
if(sign==6)
{LED1_OFF;
LED2_ON;
LED3_OFF;
LED4_ON;
LED5_OFF;
LED6_ON;
LED7_OFF;
LED8_ON;
DELAY_US(50000);
LED1_ON;
LED2_OFF;
LED3_ON;
LED4_OFF;
LED5_ON;
LED6_OFF;
LED7_ON;
LED8_OFF;
DELAY_US(50000); // XINT5 COME
}
}
}
interrupt void ISRExint3(void)
{
PieCtrlRegsPIEACKall = PIEACK_GROUP12;
sign=3;
}
interrupt void ISRExint4(void)
{
PieCtrlRegsPIEACKall = PIEACK_GROUP12;
sign=4;
}
interrupt void ISRExint5(void)
{
PieCtrlRegsPIEACKall = PIEACK_GROUP12;
sign=5;
}
interrupt void ISRExint6(void)
{
PieCtrlRegsPIEACKall = PIEACK_GROUP12;
sign=6;
}
void configtestled(void)
{
EALLOW;
GpioCtrlRegsGPAMUX1bitGPIO0 = 0; // GPIO0 = GPIO0
GpioCtrlRegsGPADIRbitGPIO0 = 1;
GpioCtrlRegsGPAMUX1bitGPIO1 = 0; // GPIO1 = GPIO1
GpioCtrlRegsGPADIRbitGPIO1 = 1;
GpioCtrlRegsGPAMUX1bitGPIO2 = 0; // GPIO2 = GPIO2
GpioCtrlRegsGPADIRbitGPIO2 = 1;
GpioCtrlRegsGPAMUX1bitGPIO3 = 0; // GPIO3 = GPIO3
GpioCtrlRegsGPADIRbitGPIO3 = 1;
GpioCtrlRegsGPAMUX1bitGPIO4 = 0; // GPIO4 = GPIO4
GpioCtrlRegsGPADIRbitGPIO4 = 1;
GpioCtrlRegsGPAMUX1bitGPIO5 = 0; // GPIO5 = GPIO5
GpioCtrlRegsGPADIRbitGPIO5 = 1;
GpioCtrlRegsGPBMUX2bitGPIO51 = 0; // GPIO51 = GPIO51
GpioCtrlRegsGPBDIRbitGPIO51 = 1;
GpioCtrlRegsGPBPUDbitGPIO51=0;
GpioCtrlRegsGPBMUX2bitGPIO50 = 0; // GPIO50 = GPIO50
GpioCtrlRegsGPBDIRbitGPIO50 = 1;
GpioCtrlRegsGPBPUDbitGPIO50=0;
EDIS;
}
//===========================================================================
// No more
//===========================================================================
拿TMS320F281x来说,DSP的外部中断应该就是外设中断,支持多种外设中断。外设中断扩展模块最多支持96个独立的中断,并将这些中断分成8组,每一组有12个中断源,根据中断向量表来确定产生的中断类型。CPU将自动获取中断向量,在响应中断时CPU需要9个系统时钟完成中断向量的获取和重要CPU寄存器的保护(中断响应延时为9个系统时钟)。因为,CPU能够相当快的响应外设产生的中断。
DSP是数字信号处理器的简写 是一种单片机 处理数字信号用的 一般电视 照相机 手机的住芯片里面都会集成好几个dsp芯片 中断是电子学里面的一个概念 单片机跑程序时候外界接入一个信号或者 某种需要 让程序暂停 来处理新来的东西就叫中断 你说的 你是学电子的 还是说 哪里看到的这个概念 对普通用户 炒作这个概念没有用的
软硬件结合,在软件中,先定义某个中断是由某函数调用的,如 PieVectTableCAPINT3 = &xxISR;
则等到外部有脉冲信号输入时,内部就会产生捕获中断,调用你定义的函数
以上就是关于visualdsp挂接硬件中断全部的内容,包括:visualdsp挂接硬件中断、dsp pie怎样控制外设中断传到cpu,cpu对外设的响应过程、dsp程序暂停运行后,io状态是等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)