【龙芯1c库】在裸机编程环境中常用的中断接口简介

本文所说的裸机编程是基于“龙芯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 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值