visualdsp挂接硬件中断

visualdsp挂接硬件中断,第1张

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状态是等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10162365.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存