61单片机项目 - FIQ中断

来源:互联网 发布:建材网发布软件 编辑:程序博客网 时间:2024/05/23 02:14

实现功能:打开并设置TimerA和TimerB定时器,并打开它们的FIQ中断,当有TimerA/B的FIQ中断请求时,响应相应的中断服务程序,在中断服务中翻转I/O端口输出电平,以控制接在I/O端口的发光二极管的亮灭。

实验现象:TimerA定时长度为2s,当进入TimerA的FIQ中断后,翻转IOA口低四位的输出电平以控制接在IOA低四位端口的发光二极管;TimerB定时长度为1s,当进入TimerB的FIQ中断后,翻转IOB口低四位的输出电平以控制接在IOB低四位端口的发光二极管。程序运行时,可以观察到接在IOA低四位端口的发光二极管亮灭的周期为4s,而接在IOB低四位端口的为2s。

#include "SPCE061A.H"#define uint unsigned int#define uchar unsigned charvoid FIQ(void)__attribute__((ISR));int main(){    //在IOA低四位端口的发光二极管    //接在IOB低四位端口的发光二极管    *P_IOA_Dir=0x000f;    *P_IOA_Attrib=0x000f;    *P_IOA_Data=0x0000;    *P_IOB_Dir=0x000f;    *P_IOB_Attrib=0x000f;    *P_IOB_Data=0x0000;    *P_TimeBase_Setup=0;    *P_TimerA_Data=0xfffb;    *P_TimerA_Ctrl=C_TMA2_TMB1+C_TMA1_1+C_TMA_PWM_D3;    *P_TimerB_Data=0xf7ff;    *P_TimerB_Ctrl=C_TMB_4KHz+C_TMA_PWM_D3;    *P_INT_Ctrl=C_FIQ_TMA|C_FIQ_TMB;    asm("INT FIQ");    while(1)    {        *P_Watchdog_Clear=C_WDTCLR;    }    return 0;}void FIQ(void){    static uint Ada=0x000f,Bda=0x000f,Adata=0,Bdata=0;   // asm("INT OFF");    if(*P_INT_Ctrl&C_FIQ_TMA)    {        Adata++;        if(Adata==4)        {            Adata=0;            Ada=~Ada;            Ada&=0x000f;            *P_IOA_Data=Ada;        }        *P_INT_Clear=C_FIQ_TMA;    }    *P_Watchdog_Clear=C_WDTCLR;    if(*P_INT_Ctrl&C_FIQ_TMB)    {        Bdata++;        if(Bdata==2)        {        Bdata=0;            Bda=~Bda;            Bda&=0x000f;            *P_IOB_Data=Bda;        }      *P_INT_Clear=C_FIQ_TMB;    }    *P_Watchdog_Clear=C_WDTCLR;    //asm("INT FIQ,IRQ");}


0 0