本文所说的裸机编程是基于“龙芯1c库”的。“龙芯1c库”类似于STM32库,“龙芯1c库”的git地址是https://gitee.com/caogos/OpenLoongsonLib1c
中断对于任何一款CPU来说都是非常重要的,对龙芯1c也是如此。另一篇博文以linux中的中断作为实例,详细分析了龙芯1c的中断。龙芯1c的中断与arm的中断有些不同,如果对龙芯1c的中断还没有概念,请移步到《【龙芯1c库】龙芯1c的中断分析》http://blog.csdn.net/caogos/article/details/69948579
除了linux中有龙芯1c的中断实现以外,RT-Thread中也有,事实上RT-Thread的中断移植是参考了linux的,而本文提到的裸机程序的中断则主要参考了RT-Thread,所以裸机程序的和RT-Thread的中断相关接口类似,用法也类似。RT-Thread的git地址是https://github.com/RT-Thread/rt-thread
常用的中断接口简介
这里只介绍几个对“龙芯1c库”的“用户”(嵌入式软件工程师,单片机工程师)可见的,还有一些具体实现的函数接口在这里就不阐述了,感兴趣的可以移步到git查看。
主要有以下几个函数会
// 初始化异常
void exception_init(void);
/*
* 使能指定中断
* @IRQn 中断号
*/
void irq_enable(int IRQn);
/*
* 禁止指定中断
* @IRQn 中断号
*/
void irq_disable(int IRQn);
/*
* 设置中断处理函数
* @IRQn 中断号
* @new_handler 新设置的中断处理函数
* @param 传递给中断处理函数的参数
* @ret 之前的中断处理函数
*/
irq_handler_t irq_install(int IRQn, irq_handler_t new_handler, void *param);
其中,函数exception_init()默认已被调用,对于具体的中断来说,只需要先调用irq_install()设置中断处理函数,然后调用irq_enable()使能即可。
下面以按键中断和硬件定时器中断为例,演示如何使用这几个函数。感兴趣的可以跳到相应也没查看。
用龙芯1c库在裸机编程中实现外部中断(GPIO中断、按键中断)
http://blog.csdn.net/caogos/article/details/78166271
用龙芯1c库在裸机编程环境中实现硬件定时器中断
http://blog.csdn.net/caogos/article/details/78166348
函数exception_init()
龙芯1c(mips系列的cpu)中,对于异常和中断分得很清楚,中断常指外设的中断,可能外设已经集成在芯片内了,比如定时器等。中断是一种“特殊的异常”,所有中断共用一个异常入口。所以中断的初始化,就涉及异常的初始化。函数exception_init()就是对龙芯1c的整个异常进行初始化,包括初始化中断。要是用中断,函数exception_init()必须被调用,因此在函数bsp_init()中默认调用了exception_init()。
函数irq_enable()和irq_disable()
简介
/*
* 使能指定中断
* @IRQn 中断号
*/
void irq_enable(int IRQn);
/*
* 禁止指定中断
* @IRQn 中断号
*/
void irq_disable(int IRQn);
这两个函数的入参都是中断号。所有中断的中断号都可以在INTx_SR(INT0_SR、INT1_SR、……、INT4_SR)中找到,如下图所示
来看看代码中的中断号
// 中断号
#define LS1C_ACPI_IRQ 0
#define LS1C_HPET_IRQ 1
//#define LS1C_UART0_IRQ 3 // linux中是3,v1.4版本的1c手册中是2,暂屏蔽,待确认
#define LS1C_UART1_IRQ 4
#define LS1C_UART2_IRQ 5
#define LS1C_CAN0_IRQ 6
#define LS1C_CAN1_IRQ 7
#define LS1C_SPI0_IRQ 8
#define LS1C_SPI1_IRQ 9
#define LS1C_AC97_IRQ 10
#define LS1C_MS_IRQ 11
#define LS1C_KB_IRQ 12
#define LS1C_DMA0_IRQ 13
#define LS1C_DMA1_IRQ 14
#define LS1C_DMA2_IRQ 15
#define LS1C_NAND_IRQ 16
#define LS1C_PWM0_IRQ 17
#define LS1C_PWM1_IRQ 18
#define LS1C_PWM2_IRQ 19
#define LS1C_PWM3_IRQ 20
#define LS1C_RTC_INT0_IRQ 21
#define LS1C_RTC_INT1_IRQ 22
#define LS1C_RTC_INT2_IRQ 23
#define LS1C_UART3_IRQ 29
#define LS1C_ADC_IRQ 30
#define LS1C_SDIO_IRQ 31
#define LS1C_EHCI_IRQ (32+0)
#define LS1C_OHCI_IRQ (32+1)
#define LS1C_OTG_IRQ (32+2)
#define LS1C_MAC_IRQ (32+3)
#define LS1C_CAM_IRQ (32+4)
#define LS1C_UART4_IRQ (32+5)
#define LS1C_UART5_IRQ (32+6)
#define LS1C_UART6_IRQ (32+7)
#define