ADI Blackfin DSP处理器-BF533的开发详解18:用触摸屏的例程来理解中断(含源码)

硬件准备

ADSP-EDU-BF533:BF533开发板
AD-HP530ICE:ADI DSP仿真器

软件准备

Visual DSP++软件

硬件链接

硬件设计原理图

ADI Blackfin DSP处理器-BF533的开发详解18:用触摸屏的例程来理解中断(含源码)_第1张图片

硬件实现原理

ADSP-EDU-BF533 开发板上的中断资源连接到了 CPLD,并通过 CPLD 将中断信号连接到 PF0 触发,通过 CPLD映射的寄存器读取中断源数据。

中断功能映射到 CPLD 寄存器中的 DEVICE_OE 和 INTERRUPT_DAT 两个寄存器,其映射内容如下:

DEVICE_OE 寄存器(读/写):
DEVICE_OE 寄存器地址:0x20320000
DEVICE_OE 寄存器设置硬件设备上一些控制管脚的电平状态。
DEVICE_OE 寄存器位功能:

在这里插入图片描述

PF0_SET:PF0 模拟 IIC 总线 SCL 接口或 PF0 中断功能使能

1:关闭 I2C_SCL 输入信号, 使能 PF0 中断信号
0:使能 I2C_SCL 输入信号,关闭 PF0 中断信号

使用中断时,将 I2C_SCL 位设置为1。
INTERRUPT_DAT 寄存器(读唯一):
INTERRUPT_DAT 寄存器地址:0x20360000

INTERRUPT_DAT 寄存器是板卡上所有中断资源的中断源数据寄存器,可以通过该寄存器数据判断出当前中断是哪一个设备产生的。

INTERRUPT_DAT 寄存器位功能:

在这里插入图片描述

当中断未触发时,读取的 Bit 位值为 1,当中断触发时,读取的 Bit 位值为 0,根据 Bit 位数据,获取中断设备。

SD_INF 为 SD 卡插入查询位,该 bit 位不会触发中断,只能通过读取该寄存器来查询 SD 卡否插入。

硬件连接示意图

ADI Blackfin DSP处理器-BF533的开发详解18:用触摸屏的例程来理解中断(含源码)_第2张图片

代码实现功能

代码实现了利用板卡的中断机制,当有中断触发时,PF0脚产生中断,然后进入中断函数,通过INTERRUPT_DAT寄存器查询触发中断的中断源,并打印中断源信息。

调试步骤

  1. 将仿真器(ICE)与 ADSP-EDU-BF53x 开发板和计算机连接好。
  2. 先给 ADSP-EDU-BF53x 开发板上电,再为仿真器(ICE)上电。
  3. 运行 VisualDSP++ 5.0 软件,选择合适的 BF533 的 session 将仿真器与软件连接。
  4. 加载 VisualDSP++ 5.0 工程文件 BF53x_INTERRUPT.dpj,编译并全速运行。
  5. 点击触摸屏或者按按键测试中断触发。

测试结果

点击触摸屏或者按按键测试中断触发,代码打印出触发中断的中断源。

ADI Blackfin DSP处理器-BF533的开发详解18:用触摸屏的例程来理解中断(含源码)_第3张图片

未插入 SD 卡和插入 SD 卡中断信息比较。

程序源码

#include
#include
#include “cpld.h”

EX_INTERRUPT_HANDLER(FlagA_ISR);

void Set_PLL(unsigned int pmsel,unsigned int pssel)
{
unsigned int new_PLL_CTL;
*pPLL_DIV = pssel;
asm(“ssync;”);
new_PLL_CTL = (pmsel & 0x3f) << 9;
*pSIC_IWR |= 0xffffffff;
if (new_PLL_CTL != *pPLL_CTL)
{
*pPLL_CTL = new_PLL_CTL;
asm(“ssync;”);
asm(“idle;”);
}
}

void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0xffc07bb0;
*pEBIU_AMGCTL = 0x000f;
}

void Init_Flags(void)
{
*pFIO_INEN = 0x0001;
*pFIO_DIR = 0x0000;
*pFIO_EDGE = 0x0001;
*pFIO_POLAR = 0x0001;
*pFIO_MASKA_D = 0x0001;
}

void Init_Interrupts(void)
{
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xffffffff;
*pSIC_IAR2 = 0xffff5fff;

register_handler(ik_ivg12, FlagA_ISR);		
*pSIC_IMASK = 0x00080000;

}

EX_INTERRUPT_HANDLER(FlagA_ISR)
{
unsigned char interrupt=0;

interrupt = (~*pINTERRUPT_DAT&0x7f);	
if(interrupt&KEY_INT)
	printf("The interrupt is keyboard!\n\r");
if(interrupt&TOUCH_INT)
 	printf("The interrupt is touch interrupt!\n\r");	
if(interrupt&TOUCH_BUSY)
	printf("The interrupt is touch busy!\n\r"); 	
if(interrupt&LAN_IOWAIT)
	printf("The interrupt is lan iowait!\n\r");
if(interrupt&LAN_INT)
	printf("The interrupt is lan interrupt!\n\r");
if(interrupt&SD_INF)
	printf("SDCard inserted\n\r");
if(interrupt&EXT_IO_INT)
	printf("The interrupt is extend IO interrupt\n\r"); 		
*pFIO_FLAG_C = 0x0001;	

}

void main(void)
{
Set_PLL(16,4);
Init_EBIU();
ExtIO_Interrupt_Enable();
Interrupt_Enable();
Init_Flags();
Init_Interrupts();
while(1);
}

你可能感兴趣的:(ADI,DSP技术中心,Blackfin专题,ADI,DSP资料下载,ADI,DSP,ADI,DSP中文资料)