📄 nvic.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 + -