📄 irq.c
字号:
#include "irq.h"
/*
#define IRQBASE _ISR_STARTADDRESS+4*8
#define IRQVECTOR(x) (IRQBASE + ((unsigned int)x)*4)
void uhal_register_irq(NON_VECTOR_HANDLER IrqSrc, void* pIRQService)
{
*(unsigned *)(IRQVECTOR(IrqSrc)) = (unsigned)pIRQService;
}
*/
#define _ISR_STARTADDRESS 0xc7fff00
#define pISR_IRQ ( *( (unsigned *)(_ISR_STARTADDRESS + 0x18) ) )
extern leds_run(void);
extern leds_on(void);
void enable_IRQ(void);
void disable_IRQ(void);
/*
void irq_init(void)
{
pISR_IRQ = (unsigned) irq_ISR;
disable_IRQ();
rINTCON = 0x1; // Vectored mode, IRQ disable, FIQ disable
rINTMOD = 0x0; // IRQ mode
rINTMSK = 0x07DFFFFF; //other interrupt masked.
rI_ISPC = 0xffffffff; // Clear all interrupt pend
rPCONG = 0xffff;
rPUPG = 0x00;
rEXTINT = 0x4000000; // 上升沿,Level mode
rEXTINTPND = 0x0; // 置零,not actived。
rI_ISPC |= BIT_EINT6; // clear pending_bit
}
*/
void irq_init(void)
{
disable_IRQ();
rI_ISPC = 0x3ffffff; //清除中断状态寄存器,[21]为1的时候,清除extint4.5.6.7;
rINTMOD = 0; //中断模式选择,[21]值为0,EXTINT4.5.6.7为irq中断。
rINTCON = 0x5; //中断控制寄存器,0101,非向量,且irq模式
rINTMSK = ~(0x200000 | 0x4000000); //中断屏蔽位[21]为0,表示未屏蔽
pISR_IRQ = (unsigned) (irq_ISR); //安装服务程序
rPCONG = 0xffff; //port g控制寄存器;
rPUPG = 0x00; //上升沿有效;
rEXTINT = rEXTINT | 0x22220020; //中断4567 全部下降沿触发
rI_ISPC = rI_ISPC | 0x200000; //EINT4567 clear the pending bit
rEXTINTPND = 0xf; //EXTINT4.5.6.7同时激活
enable_IRQ();
}
void irq_ISR(void)
{
disable_IRQ();
leds_run();
rEXTINTPND = 0xf; //EXTINT4.5.6.7同时清除;
rI_ISPC = 0x3ffffff; //清除中断状态寄存器,[21]为1的时候,清除extint4.5.6.7;
enable_IRQ();
}
//内联函数enable_IRQ,使能irq中断;
__inline void enable_IRQ(void)
{
int tmp;
__asm
{
MRS tmp, CPSR
BIC tmp, tmp, #0x80
MSR CPSR_c, tmp
}
}
//内联函数enable_IRQ,关闭irq中断;
__inline void disable_IRQ(void)
{
int tmp;
__asm
{
MRS tmp, CPSR
ORR tmp, tmp, #0x80
MSR CPSR_c, tmp
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -