⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 int.c

📁 在51上运行的小的OS系统
💻 C
字号:
#define INT_GLOBAL
#include "user_includes.h"

/***************************************************************************
[Function]: 
[Input]:
[Output]:
[Note]:
 ***************************************************************************/
//PO脉冲输出的高低电平可以用timer1直接控制,而不用以20ms为单位来输出
void Timer1_Exception(void){
    //  T1MR3 += Timer100MS;
    if (T1IR &0x01){
        T1IR = 0x01;
    }
    if (T1IR &0x02){
        T1IR = 0x02;
    }
    if (T1IR &0x04){
        T1IR = 0x04;
    }
    if (T1IR & 0x08)
    {   
        T1IR = 0x08;
        if (((SSPSR &0x1)&&(SPI1Data.Mode == SPI1_TX_OK))
            || !SPI1Data.Timer ){
            T1MCR &= ~(1<<9);
            //Set1SPI1SSEL();
            DisableSPI1Interrupt();
            SPI1Data.Mode = SPI1_IDLE;
            OSSemPost(SPI1Sem);
        }
        else {
            T1MR3 = T1TC + SPI1_CPSDVSR*8;
        }
        if (SPI1Data.Timer){
            SPI1Data.Timer--;
        }
    }
    VICVectAddr = 0x00; // 中断处理结束
}

/***************************************************************************
[Function]: 定时器1初始化 
[Input]:
[Output]:
[Note]:
 ***************************************************************************/
void T1_Ini(void)
{
    T1TC   = 0;         /* 定时器设置为0                                        */
    T1PR = 0;/* 时钟不分频                                          */
    T1MCR = 1 | (1 << 3) | (1 << 6);/* 设置T0MR0匹配后复位T0TC,并产生中断标志              */
    //      |(1<<9);

//  T1MR2 = Timer20MS;
//  BeepTimePerCycle = Fpclk / 100;/* 0.01秒钟定时                                          */
    T1TCR = 0x03; //启动并复位T1TC
    T1TCR = 0x01;/* 启动定时器*/
}

/***************************************************************************
[Function]: 
[Input]:
[Output]:
[Note]:
 ***************************************************************************/
void SPI1_Init(void)
{
    SSPCR0 = (0x00 << 8) |              // SCR  设置SPI时钟分频
             (0x01 << 7) |              // CPHA 时钟输出相位,仅SPI模式有效 
             (0x01 << 6) |              // CPOL 时钟输出极性,仅SPI模式有效
             (0x00 << 4) |              // FRF  帧格式 00=SPI,01=SSI,10=Microwire,11=保留
             (0x07 << 0);               // DSS  数据长度,0000-0010=保留,0011=4位,0111=8位,1111=16位

    SSPCR1 = (0x00 << 3) |              // SOD  从机输出禁能,1=禁止,0=允许
             (0x00 << 2) |              // MS   主从选择,0=主机,1=从机
             (0x01 << 1) |              // SSE  SSP使能,1=允许SSP与其它设备通信
             (0x00 << 0);               // LBM  回写模式
//    VICIntEnable = 1 << 11;
 
    SSPCPSR = SPI1_CPSDVSR;                     // PCLK分频值
   // SSPIMSC = 0x07;                     // 中断屏蔽寄存器
    SSPICR  = 0x03;                     // 中断清除寄存器
    DisableSPI1Interrupt();
    //Set1SPI1SSEL();
}

/***************************************************************************
[Function]: 
[Input]:
[Output]:
[Note]:
 ***************************************************************************/
uint32 IntStatus;
uint32 IntE;
uint32 SPmis;
uint32 SoftInt;
void SPI1_Exception(void){
    uint32 sendByteNum = 2;
    IntStatus = VICRawIntr;
    IntE = VICIntEnable;
    SoftInt = VICSoftInt;
    SPmis = SSPMIS;
        
    if (SSPMIS & 0x8){
        SPI1Data.Timer = 10;
        while((SSPSR&0x02) && (SPI1Data.Point<SPI1Data.Count)){
            //发送FIFO未满且有要发送的数据
            //SSPDR = SPI1Data.Buff[SPI1Data.Point++];
            SSPDR = SPI1Data.Ptr_Buff[SPI1Data.Point];
            sendByteNum++;
            if (SPI1Data.Mode == SPI1_DATA_TX){
                if (!--SPI1Data.AddressCnt){
                    SPI1Data.AddressCnt=4;
                    SPI1Data.Point++;
                }
            }
            else {
                SPI1Data.Point++;
            }
        }
        if (SPI1Data.Point>=SPI1Data.Count){
            SPI1Data.Mode = SPI1_TX_OK;
            DisableSPI1Interrupt();
        }
        T1MR3 = T1TC + SPI1_CPSDVSR*8*sendByteNum;
    }
    
    VICVectAddr = 0x00;
}

/***************************************************************************
[Function]:SPI0_Init()  初始化SPI接口,设置为主机
[Input]:    
[Output]:
[Note]:
 ***************************************************************************/
void SPI0_Init(void){
    PINSEL0 = (PINSEL0 &0xFFFF00FF) | 0x00001500; //设置引脚连接SPI
    S0PCCR = 128; //设置SPI时钟分频= (11059200*2)/8=2764800Hz
    S0PCR = (1 << 3) |  //CPHA = 1,数据在SCK的第二个时钟沿采样
    (1 << 4) |  //CPOL=1,SCK为低有效
    (1 << 5) |  //MSTR=1,SPI处于主模式
    (0 << 6) |  //LSBF=0,SPI数据传输MSB(Bit7)在先
    (1 << 7); //SPIE =1,开SPI中断

    //    VICVectCntl3 = (0x20 | SPI_INT_ID);//EINT2
    //    VICVectAddr3 = (uint32)IRQ_SPI;//

    S0PINT = 1; // 
    EXTINT = 4;
    VICIntEnable = (1 << SPI_INT_ID) | (1 << 16); //
    PINSEL0 |= 3 << 14;
    Set1SPI0SSEL();
	SPI0Data.ptrBuff = SPI0Data.Buff;
    SPI0Data.Busy = 0;
    SPI0Data.Mode = SPI0_Idle;
    SPI0Data.Count = 10;
    //    VICIntEnable = 1<<16;//外部中断2
}

/***************************************************************************
[Function]: 
[Input]:
[Output]:
[Note]:
 ***************************************************************************/
void SPI0_Exception(void)
{
    uint16 temp;
    temp = S0PSR;
    S0PINT = 1;

    if ((temp &(0x80 | 0x20)) || (VICSoftInt &(1 << SPI_INT_ID)))
    {
        temp = S0PDR;
        if (SPI0Data.Point < SPI0Data.Count)
        {
            S0PDR = SPI0Data.Buff[SPI0Data.Point];            
        }
        else 
        {
             Set1SPI0SSEL();
        }
            SPI0Data.Buff[SPI0Data.Point++] = temp;
    }
    else if (temp &0x10){
        //模式错误
        S0PCR = 0xB8;
        
    }

    VICSoftIntClear = (1 << SPI_INT_ID); //清软中断
    VICVectAddr = 0x00; // 中断处理结束    
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -