龙芯1C102单片机的中断

一、概述

因学校要求使用龙芯系列作为开发板,鉴于网上关于龙芯系列的开发板的资料较少,现特写此博客作为记录。

龙芯芯片的架构相比于stm32是简单易学的,了解了整个龙芯芯片的架构对其他单片机也是很有帮助的。

二、龙芯中的中断的结构

展示了龙芯上所有的可触发的中断源。

主要分为三个部分 CPU 、 PMU、 INTC,他们之间的关系在图上给出了。

这三个部分都是芯片中的寄存器。

具体寄存器如下图所示:

当我们要使用某个中断的时候可以通过查表得知 使用的是寄存器的哪一个位置。

接着辅以对中断寄存器的配置,即可设置是否允许中断、选择中断的极性等操作。

三、GPIO中断的寄存器

1.需要配置外部中断总使能,在龙芯1c102中的关于中断是否开启的配置在:CMDSTS寄存器中

2.配置哪个引脚允许外部中断

需要特别注意的是,这个寄存器只有一个为32位的,而龙芯有64个引脚,因此并不是寄存器与引脚并不是完全匹配的。

3.配置中断极性以及中断边沿:

4.清除中断位的寄存器:

四、代码中的外部中断是如何控制的?

看完了寄存器,现在可以来讲讲如何使用中断。

触发中断后,由哪个函数执行?这个在官方例程中是固定的入口,我们直接使用即可。

当触发外部中断后,会进入到函数:ext_handler中

在这个函数中,它会遍历中断状态寄存器的所有位,从而找到是哪个引脚触发的中断,接着就调用该函数。

cpp 复制代码
void (* const exti_irq_handle[32])(void);

void (* const Ext_IrqHandle[32])(void) =
{
    exti_gpioa0_irq_handler,
    exti_gpioa1_irq_handler,
    exti_gpioa2_irq_handler,
    exti_gpioa3_irq_handler,
    exti_gpioa4_irq_handler,
    exti_gpioa5_irq_handler,
    exti_gpioa6_irq_handler,
    exti_gpioa7_irq_handler,
    exti_gpiob0_irq_handler,
    exti_gpiob1_irq_handler,
    exti_gpiob2_irq_handler,
    exti_gpiob3_irq_handler,
    exti_gpiob4_irq_handler,
    exti_gpiob5_irq_handler,
    exti_gpiob6_irq_handler,
    exti_gpiob7_irq_handler,
    exti_gpioc0_irq_handler,
    exti_gpioc1_irq_handler,
    exti_gpioc2_irq_handler,
    exti_gpioc3_irq_handler,
    exti_gpioc4_irq_handler,
    exti_gpioc5_irq_handler,
    exti_gpioc6_irq_handler,
    exti_gpioc7_irq_handler,
    exti_gpiod0_irq_handler,
    exti_gpiod1_irq_handler,
    exti_gpiod2_irq_handler,
    exti_gpiod3_irq_handler,
    exti_gpiod4_irq_handler,
    exti_gpiod5_irq_handler,
    exti_gpiod6_irq_handler,
    exti_gpiod7_irq_handler,
};


void ext_handler(void)
{
    PMU_CMDW = (1 << 24);
    INT32U regsrc;// = EXTI->EXINT_SRC;
    INT32U regen;// = EXTI->EXINT_SRC;
    INT32U irq_no;
    //BEBUG_IRQ();
    regsrc = EXTI->EXINT_SRC;
    regen = EXTI->EXINT_EN;
    regsrc = (regsrc & regen);
    asm("nop");

    for(irq_no = 0; irq_no < 32; irq_no++)
    {
        if((regsrc>>irq_no) & 0x1)
        {
            Ext_IrqHandle[irq_no]();
        }
    }
}

五、ADC中断

1.允许ADC中断:

2.中断触发寄存器:

依然在CMDSTS寄存器中,可以通过这个状态,判断是否触发中断。

3.ADC中断代码:

cpp 复制代码
void BAT_FAIL(void)
{
    uint32_t tmp = (PMU_CMDSTS & 0xf80000)>>19;
    PMU_CMDW = (PMU_CMDSTS & 0xf80000);
    switch(tmp)
    {
        case 0x1:
            printf("\r\n.............BAT_FAIL..............\r\n");
            PMU_CMDSTS  =   0x0;   // IT config
            break;
        case 0x2:
            break;
        case 0x4:
            break;
        case 0x8:
            break;
        case 0x10:
            printf("\r\n.............ADC..............\r\n");
            PMU_CMDSTS  &=   (~0x8000);   // IT dis
            break;
        default:
            break;
    }
}

4.ADC中断注意事项:

可以由寄存器中看出,ADC中断状态只有一位,而ADC有6路输入,注定了无法精准的控制哪一个ADC触发中断。因此ADC触发中断后,需要我们去关注我们需要的ADC ,若有多个ADC触发中断,会导致程序多次进入中断!

相关推荐
朱嘉鼎12 小时前
状态机的介绍
c语言·单片机
清风66666613 小时前
基于单片机的噪声波形检测与分贝测量仪设计
单片机·嵌入式硬件·毕业设计·课程设计
易享电子14 小时前
基于单片机车窗环境监测控制系统Proteus仿真(含全部资料)
单片机·嵌入式硬件·fpga开发·51单片机·proteus
三佛科技-1341638421214 小时前
LED氛围灯方案开发MCU控制芯片
单片机·嵌入式硬件·智能家居·pcb工艺
小莞尔15 小时前
【51单片机】【protues仿真】基于51单片机主从串行通信系统
c语言·单片机·嵌入式硬件·物联网·51单片机
Hello_Embed15 小时前
STM32 环境监测项目笔记(一):DHT11 温湿度传感器原理与驱动实现
c语言·笔记·stm32·单片机·嵌入式软件
三佛科技-1341638421216 小时前
便携式榨汁机方案开发,榨汁机果汁机MCU控制方案设计
单片机·嵌入式硬件·智能家居·pcb工艺
yongui4783417 小时前
基于TMS320F28027实现光伏MPPT控制
单片机·嵌入式硬件
炸膛坦客19 小时前
Cortex-M3 内核 MCU-STM32F1 开发之路:(一)单片机 MCU 的构成,包括 FLASH 和 SRAM 的区别,以及引脚类型
stm32·单片机·嵌入式硬件
A9better19 小时前
嵌入式开发学习日志39——stm32之I2C总线物理层与常用术语
stm32·单片机·嵌入式硬件·学习