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

📄 pcinterrupt.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
字号:
// GPIO.c : 模拟 GPIO
// 或者模拟所有的外围设备寄存器.
//通过地址来定位.

/******************************************************************/
#define _HW_MEMMAP_H
#include "include.h"
#include "hw_interrupt.h"
#include "..\..\peripheral\pcgpio.h"
/******************************************************************/
extern void IrqCHandler(void);
extern INTR_HANDLER irq_vector_table[INTC_MAX_IRQ];  // IRQ controller interrupt handle vector table

/*
    仿真 中断 说明:
    1. 防止 只需要 两个标志 : INTC_IECR:中断注册和允许 标志.
        INTC_ISR : 中断发生标志. INTC_IMR: 中断标志.0:一次,1:循环.
    2. 中断分为 一次性中断和 定时器中断. 定时器中断 由 TIMER 发生.
*/
/******************************************************************/

//代码调度的堆空间
void PCIGenerateIRQ(int    irq)
{
    REGISTER    cpsr ;
    REGISTER    Intc_IECR ;
    read_creg(cpsr, cpsr);

    if (cpsr & (0x0001 << PC_ARMREG_BITIRQ))
        return;

    //READ IRQ ENABLE FLAG.
    Intc_IECR = read_mem32(INTC_IECR);
    if ((Intc_IECR&(0x1 << irq)))
    {
        DECLARE_CUP_SR;
        write_mem32(INTC_ISR , irq);    //set irq flag.

        PCCEnterCritical();
        ENTER_CRITICAL();
        
        OSIntEnter();
        IrqCHandler();
        OSIntExit();
		
        //由于 中断之后可能任务要切换,因此必须首先 EXIT_CRITICAL 才能进行任务调度.
        if (OSPrioHighRdy != OSPrioCur)
        {            
            OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
            EXIT_CRITICAL();
            PCCExitCritical();
            OSIntCtxSw();
        }
        else
        {
            EXIT_CRITICAL();
            PCCExitCritical();
        }
    }
}


void PCISetIrqData(INT32U irqIndex , INT32U irqData)
{
    if (irqIndex < PCLIB_IRQIDX_MAX)
    {
        INT32U      *pIrqData = (INT32U*) & gPcLibIrqData;
        pIrqData[irqIndex] = irqData;
    }

}
/***************************************************************/
//PC 模拟中断!!
void Intr_PowerOnInit(void)
{
    // irq enable
    write_mem32(INTC_IECR, 0);

    // irq gen flag.
    write_mem32(INTC_ISR, 0);

    // irq set mask
    //write_mem32(INTC_IMR, 0);
}

InterruptHandler Intr_RegISR(int irq, InterruptHandler routine)
{
    InterruptHandler ro = irq_vector_table[irq].routine;
    irq_vector_table[irq].routine     = routine;


    // irq enable
    write_mem32(INTC_IECR, read_mem32(INTC_IECR) | (0x1 << irq));


    // irq set mask
    // write_mem32(INTC_IMR, 0x1 << irq);

    return ro;

}

int  Intr_GetState(void)
{
    return read_mem32(INTC_ISR);
}

void Intr_ClearFlag(int irq)
{
    write_mem32(INTC_ISR,  read_mem32(INTC_IECR)&(~(0x1 << irq)));
}


BOOL Intr_Enable(eIRQ_NUM_t irq)
{
    // irq enable
    write_mem32(INTC_IECR, read_mem32(INTC_IECR) | (0x1 << irq));

    return TRUE;
}

BOOL Intr_Disable(eIRQ_NUM_t irq)
{
    // irq enable
    write_mem32(INTC_IECR, read_mem32(INTC_IECR)&(~(0x1 << irq)));
    return TRUE;
}


/*--------------------------------------*/


⌨️ 快捷键说明

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