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

📄 nvic.c

📁 最新版IAR FOR ARM(EWARM)5.11中的代码例子
💻 C
字号:
/*************************************************************************
 *
 *    Used with ICCARM and AARM.
 *
 *    (c) Copyright IAR Systems 2006
 *
 *    File name   : nvic.c
 *    Description : Driver for the NVIC Interrupt Controller
 *
 *    History :
 *    1. Data        :
 *       Author      : Stanimir Bonev
 *       Description : 28, April 2006
 *
 *
 *    $Revision: 6827 $
 **************************************************************************/
#include "nvic.h"

#ifndef ROM_VEC_TABLE
#pragma data_alignment=256
VoidFpnt_t VectTable[MAX_VEC_NUMB+1];

#endif

/*************************************************************************
 * Function Name: NVIC_Init
 * Parameters: PriorityGroup_t PriorityGroup
 *
 * Return: none
 *
 * Description: Initialize NVIC
 *
 *************************************************************************/
void NVIC_Init (PriorityGroup_t PriorityGroup)
{
#ifndef ROM_VEC_TABLE
Int32U i;
Int32U * pVec;
	// Copy Vector table from ROM to RAM
	for(i = 0, pVec = NULL; i < 4; ++i)
	{
		VectTable[i] = (VoidFpnt_t)*pVec++;
	}
	
	for (; i < MAX_VEC_NUMB ; ++i)
	{
		VectTable[i] = 0;
	}
	// Point NVIC at the RAM vector table
	VTOR = (Int32U)VectTable;
#endif
	// Sets the priority grouping of the interrupt controller
	AITCR = NVIC_VECTKEY_WR | (PriorityGroup << 8);
}

/*************************************************************************
 * Function Name: NVIC_IntrRegister
 * Parameters: VoidFpnt_t Fpnt, Int8U IntrLine, Int8U Priority
 *
 * Return: VoidFpnt_t
 *
 * Description: Register the handler and set priority of
 * the interrupt
 *
 *************************************************************************/
VoidFpnt_t NVIC_IntrRegister (VoidFpnt_t Fpnt, Int8U IntrLine,
                              Int8U Priority)
{
Int32U * pNvicPrio;
Int32U Priority32 = Priority;
VoidFpnt_t FpntTemp;
Int32U * pVec;
	if((IntrLine > MAX_VEC_NUMB) || (IntrLine == 0))
	{
		return ((VoidFpnt_t)NVIC_Fault);
	}
  // Set interrupt priority
	pNvicPrio  = (Int32U *)&IP0;
	pNvicPrio += IntrLine / 4;
	*pNvicPrio = (Priority32 << (8*(IntrLine % 4))) | \
	             (*pNvicPrio & ~(0xFFUL << (8*(IntrLine % 4))));
	pVec  = (Int32U *)(VTOR & 0x3FFFFF80);
  pVec += IntrLine;
  FpntTemp = (VoidFpnt_t)*pVec;
#ifndef ROM_VEC_TABLE
	// Save the interrupt handler
  *pVec = (Int32U)Fpnt;
#endif
  return(FpntTemp);
}

/*************************************************************************
 * Function Name: NVIC_IntrEnable
 * Parameters: Int8U IntrLine
 *
 * Return: NVIC_Status_t
 *
 * Description: Enable an interrupt
 *
 *************************************************************************/
NVIC_Status_t NVIC_IntrEnable (Int8U IntrLine)
{
Int32U * pPoint;
	pPoint = (Int32U *)(VTOR & 0x3FFFFF80);
  pPoint += IntrLine;
	if(*pPoint == 0)
	{
		return (NVIC_Fault);
	}

	if(IntrLine == MMI)
	{
		SHCSR_bit.MEMFAULTENA = 1;  // Enable MPU Fault Interrupt
	}
	else if (IntrLine == BFI)
	{
		SHCSR_bit.BUSFAULTENA = 1;  // Disable Bus Fault Interrupt
	}
	else if (IntrLine == UFI)
	{
		SHCSR_bit.USGFAULTENA = 1;  // Disable Usage Interrupt
	}
	else if (IntrLine == STI)
	{
		SYSTICKCSR_bit.TICKINT = 1; // Disable SysTick timer interrupt
	}
	else if ((IntrLine >= EII) && (IntrLine <= MAX_VEC_NUMB))
	{
		// Enable the general interrupt.
		pPoint = (Int32U *)&SETENA0;
		IntrLine -= EII;
		pPoint += IntrLine / 32;
		*pPoint = (1UL << (IntrLine % 32));
	}
	else
	{
		return(NVIC_Fault);
	}
	return (NVIC_Pass);		
}

/*************************************************************************
 * Function Name: NVIC_IntrDisable
 * Parameters: Int8U IntrLine
 *
 * Return: NVIC_Status_t
 *
 * Description: Disable an interrupt
 *
 *************************************************************************/
NVIC_Status_t NVIC_IntrDisable (Int8U IntrLine)
{
Int32U * pPoint;
	if(IntrLine == MMI)
	{
		SHCSR_bit.MEMFAULTENA = 0;  // Disable MPU Fault Interrupt
	}
	else if (IntrLine == BFI)
	{
		SHCSR_bit.BUSFAULTENA = 0;  // Disable Bus Fault Interrupt
	}
	else if (IntrLine == UFI)
	{
		SHCSR_bit.USGFAULTENA = 0;  // Disable Usage Interrupt
	}
	else if (IntrLine == STI)
	{
		SYSTICKCSR_bit.TICKINT = 0; // Disable SysTick timer interrupt
	}
	else if ((IntrLine >= EII) && (IntrLine <= MAX_VEC_NUMB))
	{
		// Disable the general interrupt
		pPoint = (Int32U *)&CLRENA0;
		IntrLine -= EII;
		pPoint += IntrLine / 32;
		*pPoint = (1UL << (IntrLine % 32));
	}
	else
	{
		return(NVIC_Fault);
	}
	return (NVIC_Pass);		
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -