您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> BF51X技术支持专区 -> BF518的中断详解(1)
本帖共有1147个阅读者
发表帖子 发表投票 回复主题
BF518的中断详解(1)
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5195
金钱:34806
积分:6378
注册时间:2011/6/7
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
BF518的中断详解(1)

ADSP-BF51x 的PF,PG,PH 接口都可以做为外部中断来使用。要使用PF 的外部中断,需要为PF 脚选择一个中断源,设置中断触发方式,为中断设置一个中断优先级,并且使能中断。

PORTFIO_MASKA 和PORTFIO_MASKB:用来为PF 管脚设置中断源,通过选择配置这两个寄存器,使用不同的中断源。
SIC_IARx:设置中断优先等级。每个中断源都有一个默认的优先等级,如不对该寄存器配置,则可以使用默认的中断优先等级配置中断源。

通过 VDSP 的帮助文件找到中断配置表,在表中找到所使用的中断源Port F interrupt A,从表中可以知道,其默认中断优先等级为IVG13,配置寄存器是SIC_IAR5 的Bit20~Bit23,使用的中断屏蔽寄存器是SIC_IMASK1,其使能位是Bit13。

上传的图片
  201264833782.jpg [ 86.10 KB 992×597 ] (缩略时请点击查看原图)

 


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2012/6/4 8:33:27
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5195
金钱:34806
积分:6378
注册时间:2011/6/7
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

中断优先等级为 IVG13,通过查询下表,获得IVG13 对应的值是6,所以SIC_IAR5 的Bit20~Bit23 应写入6。

上传的图片
  2012648341782.jpg [ 44.39 KB 991×495 ] (缩略时请点击查看原图)

 

函数:
      register_handler(ik_ivg13, FlagA_ISR);
      中断等级注册函数,该函数在头文件“exception.h”中定义,定义该头文件后直接可以使用,其功能是告知中断管理器定义的中断标识符为FlagA_ISR 和中断等级为13 级。
      EX_INTERRUPT_HANDLER(FlagA_ISR);
      中断函数,该函数在头文件“exception.h”中定义,当触发中断后,会进入该函数执行。


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2012/6/4 8:35:03
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5195
金钱:34806
积分:6378
注册时间:2011/6/7
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

接口寄存器说明

SIC_IARx:中断等级设置寄存器

SIC_IMASKx:中断屏蔽寄存器

源码分析

PF 口设置使用外部中断:
      *pPORTF_FER &= ~(PF1|PF0); //配置PF0 和PF1 管脚为IO 功能
      *pPORTFIO_DIR &= ~(PF1|PF0); //配置PF0 和PF1 管脚为输入
      *pPORTFIO_INEN |= (PF1|PF0); //配置PF0 和PF1 管脚输入使能
      *pPORTFIO_EDGE |= (PF1|PF0) ; //配置为沿触发模式
      *pPORTFIO_POLAR |= (PF1|PF0); //配置为下降沿触发

      *pPORTFIO_MASKA_SET |= (PF1|PF0); //中断源采用Port F interrupt A

配置外部中断:
      iar5 |= 0x00060000;
      iar5 &= 0xfff6ffff;
      *pSIC_IAR5 = iar5; //配置中断等级
      register_handler(ik_ivg13, FlagA_ISR); //注册中断
      imask1 = *pSIC_IMASK1;
      imask1 |= 0x00002000;
      *pSIC_IMASK1 = imask1; //使能中断

中断函数:
      EX_INTERRUPT_HANDLER(FlagA_ISR) //设置中断函数标志为FlagA_ISR
{
      if((*pPORTFIO&PF0) == PF0) //判断中断管脚
{
      printf("interrupt is PF0!\n");
}
      else if((*pPORTFIO&PF1) == PF1) //判断中断管脚
{
      printf("interrupt is PF1!\n");
}
      *pPORTFIO_CLEAR = PF1|PF0; //清除中断
}


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2012/6/4 8:37:45
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5195
金钱:34806
积分:6378
注册时间:2011/6/7
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

源码下载:

上传的附件
   201264839782.rar [ 814.08 KB ]

代码实现的功能:

代码实现了通过 PF0 和PF1 管脚触发外部中断的功能。板卡的扩展接口上引出了PF0 和PF1 管脚,但这两个管脚没有上拉电阻,所以必须在外部上拉电阻后,才能使用该代码进行外部中断测试。PF 管脚和网口复用,所以使用该管脚作为外部中断时,需将板卡上的拨码开关SW5 和SW6 全部拨到OFF,断开与网口芯片的连接。代码通过 PF0 和PF1 接口作为外部中断信号触发管脚,当有下降沿出发时进入中断函数,在中断函数中判断是哪一个PF 脚设置了中断,打印出中断PF 脚信息。


我是OP...
等级:管理员 参考IP地址:*.*.*.*
2012/6/4 8:40:08
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159059 Call, 1 Queries, Processed in 0.015625 second(s),