⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irq_unit.c

📁 USBUSB开发资料类
💻 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 + -