61单片机项目 - FIQ中断

实现功能:打开并设置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 char
void 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");
}


你可能感兴趣的:(61单片机项目 - FIQ中断)