接上一篇,繼續(xù)來整Blackfin的IO跟中斷!
ADSP-BF53x 的16 個PF 接口都可以做為外部中斷來使用。要使用PF 的外部中斷,需要為PF 腳選擇一個中斷源,設(shè)置中斷觸發(fā)方式,為中斷設(shè)置一個中斷優(yōu)先級,并且使能中斷。
FIO_MASKA_D 和FIO_MASKB_D:用來為PF 管腳設(shè)置中斷源,ADSP-BF53x 共有PFA 和PFB 兩個中斷源,通過選擇配置這兩個寄存器,使用不同的中斷源。
SIC_IARx:設(shè)置中斷優(yōu)先等級。每個中斷源都有一個默認(rèn)的優(yōu)先等級,如不對該寄存器配置,則可以使用默認(rèn)的中斷優(yōu)先等級配置中斷源。
從表中可以看出 PF 管腳相關(guān)的中斷源PFA 和PFB 位于SIC_IAR2,其默認(rèn)配置值都為5,根據(jù)其配置值,通過下表獲知其對應(yīng)的中斷等級為IVG12,如將SIC_IAR2 配置值改為下表中的數(shù)值,則中斷等級變?yōu)樵摂?shù)值對應(yīng)的中斷等級。
SIC_IMASK:中斷屏蔽寄存器,使能中斷使用。
函數(shù):register_handler(ik_ivg12, FlagA_ISR);
中斷等級注冊函數(shù),該函數(shù)在頭文件“exception.h”中定義,定義該頭文件后直接可以使用,其功能是告知中斷管理器定義的中斷標(biāo)識符為FlagA_ISR 和中斷等級為12 級。
EX_INTERRUPT_HANDLER(FlagA_ISR);
中斷函數(shù),該函數(shù)在頭文件“exception.h”中定義,當(dāng)觸發(fā)中斷后,會進(jìn)入該函數(shù)執(zhí)行。
接口寄存器說明:
SIC_IARx:中斷等級設(shè)置寄存器
SIC_IMASK:中斷屏蔽寄存器
例子代碼分析:
PF 口設(shè)置使用外部中斷:
*pFIO_INEN |= PF0|PF1; //設(shè)置PF0,PF1 輸入使能
*pFIO_DIR &=~(PF0|PF1); //設(shè)置PF0,PF1 為輸入接口
*pFIO_EDGE |= PF0|PF1; //設(shè)置為沿觸發(fā)
*pFIO_MASKA_D |= PF0|PF1; //使用中斷源為PFA,使能PF 外部中斷
配置外部中斷:
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xffffffff;
*pSIC_IAR2 = 0xffff5fff; //設(shè)置中斷等級參數(shù)為5
register_handler(ik_ivg12, FlagA_ISR); //告知中斷管理器使用中斷等級為12,中斷標(biāo)志為 FlagA_ISR
*pSIC_IMASK = 0x00080000; //使能外部中斷
中斷函數(shù):
EX_INTERRUPT_HANDLER(FlagA_ISR) //設(shè)置中斷函數(shù)標(biāo)志為FlagA_ISR
{
if(*pFIO_FLAG_D == PF0) //判斷是否為PF0 中斷
{
printf("interrupt is PF0!\n");
}
else if(*pFIO_FLAG_D == PF1) //判斷是否為PF1 中斷
{
printf("interrupt is PF1!\n");
}
*pFIO_FLAG_C = PF0|PF1; //清除中斷標(biāo)志
}
代碼實現(xiàn)了通過 PF0 和PF1 接口作為外部中斷信號觸發(fā)管腳,當(dāng)有下降沿出發(fā)時進(jìn)入中斷函數(shù),在中斷函數(shù)中判斷是哪一個PF 腳設(shè)置了中斷,打印出中斷PF 腳信息。運行代碼后,利用接地的導(dǎo)線觸發(fā) PF0 和PF1 管腳,會進(jìn)入相應(yīng)的中斷,打印出中斷信息。
源碼下載: 鏈接: http://pan.baidu.com/s/1gdswdXL 密碼: kl1f
視頻教程奉送,GPIO與中斷的這2章視頻
清晰版的視頻下載: 鏈接: http://pan.baidu.com/s/1mgke0AW 密碼: aid7
下一章準(zhǔn)備寫一下PLL和EBIU,都是外設(shè),索性這幾章就把Blackfin的通用外設(shè)都講完吧。 |