📄 irq_unit.c
字号:
/**********************************************************************************************************************
* 本单元实现中断的控制和操作
*主要函数有:
* IRQ_Init()
* IRQ_SendData()
**********************************************************************************************************************/
#include "IRQ_Unit.h"
//=====================================================================================================================
// 全局变量,
//=====================================================================================================================
//=====================================================================================================================
// 全局常量
#define cIRQ_VICVectCntl_Base 0xFFFFF200
#define cIRQ_VICVectAddr_Base 0xFFFFF100
//
uint32 const cIRQ_VICIntMask[cIRQ_ADC+1] =
{
0x00000001, 0x00000002, 0x00000004, 0x00000008,
0x00000010, 0x00000020, 0x00000040, 0x00000080,
0x00000100, 0x00000200, 0x00000400, 0x00000800,
0x00001000, 0x00002000, 0x00004000, 0x00008000,
0x00010000, 0x00020000, 0x00040000
};
//=====================================================================================================================
/*********************************************************************************************************************
初始化中断。
入口参数:
WhichInt 那一个中断,常量已定义 cIRQ_xxx,定义在IRQ_Unit.h中。
WhichSlot 分配给它哪个中断级别。
ISR_Addr 中断服务程序的入口地址。
*/
//=====================================================================================================================
void IRQ_SetInt(uint32 WhichInt, uint32 WhichSlot, uint32 ISR_Addr)
{
uint32 Mask;
volatile uint32 *MemAddr;
if (WhichInt > cIRQ_ADC) return;
if (WhichSlot > 31) return;
Mask = cIRQ_VICIntMask[WhichInt];
WhichSlot = (WhichSlot & 0x0F) << 2;
VICIntSelect = (VICIntSelect & ~Mask); // 设置本通道为IRQ中断
MemAddr = (uint32*)(cIRQ_VICVectCntl_Base + WhichSlot);
*MemAddr = 0x20 + (WhichInt & 0x1F);
MemAddr = (uint32*)(cIRQ_VICVectAddr_Base + WhichSlot);
*MemAddr = ISR_Addr;
VICIntEnable = Mask; // 使能中断
}
//=====================================================================================================================
/*********************************************************************************************************************
使能某个中断
*/
//=====================================================================================================================
void IRQ_Enable(uint32 WhichInt)
{
if (WhichInt > cIRQ_ADC) return;
VICIntEnable = cIRQ_VICIntMask[WhichInt];
}
//=====================================================================================================================
/*********************************************************************************************************************
禁止某个中断
*/
//=====================================================================================================================
void IRQ_Disable(uint32 WhichInt)
{
if (WhichInt > cIRQ_ADC) return;
VICIntEnClr = cIRQ_VICIntMask[WhichInt];
}
//=====================================================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -