硬件准备
ADSP-EDU-BF533:BF533开发板
AD-HP530ICE:ADI DSP仿真器
软件准备
Visual DSP++软件
硬件链接
硬件设计原理图
硬件实现原理
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 卡否插入。
硬件连接示意图
代码实现功能
代码实现了利用板卡的中断机制,当有中断触发时,PF0脚产生中断,然后进入中断函数,通过INTERRUPT_DAT寄存器查询触发中断的中断源,并打印中断源信息。
调试步骤
测试结果
点击触摸屏或者按按键测试中断触发,代码打印出触发中断的中断源。
未插入 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);
}