summaryrefslogtreecommitdiff
path: root/libcpu/risc-v/rv32m1/interrupt.c
blob: 8da0dcfda69f26fbcfa23a4d3653f81f5a3752c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2018/10/01     Bernard      The first version
 */

#include <rthw.h>

#include <board.h>
#include <RV32M1_ri5cy.h>

typedef void (*irq_handler_t)(void);
extern const irq_handler_t isrTable[];

void SystemIrqHandler(uint32_t mcause)
{
    uint32_t intNum;

    if (mcause & 0x80000000) /* For external interrupt. */
    {
        intNum = mcause & 0x1FUL;

        /* Clear pending flag in EVENT unit .*/
        EVENT_UNIT->INTPTPENDCLEAR = (1U << intNum);

        /* Now call the real irq handler for intNum */
        isrTable[intNum]();
    }
}