aboutsummaryrefslogtreecommitdiffstats
path: root/stm32lib/src/stm32f10x_nvic.c
diff options
context:
space:
mode:
Diffstat (limited to 'stm32lib/src/stm32f10x_nvic.c')
-rw-r--r--stm32lib/src/stm32f10x_nvic.c751
1 files changed, 751 insertions, 0 deletions
diff --git a/stm32lib/src/stm32f10x_nvic.c b/stm32lib/src/stm32f10x_nvic.c
new file mode 100644
index 0000000..0ce30af
--- /dev/null
+++ b/stm32lib/src/stm32f10x_nvic.c
@@ -0,0 +1,751 @@
+/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
+* File Name : stm32f10x_nvic.c
+* Author : MCD Application Team
+* Version : V2.0.2
+* Date : 07/11/2008
+* Description : This file provides all the NVIC firmware functions.
+********************************************************************************
+* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
+* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
+* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
+* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
+* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+*******************************************************************************/
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f10x_nvic.h"
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+#define AIRCR_VECTKEY_MASK ((u32)0x05FA0000)
+
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/*******************************************************************************
+* Function Name : NVIC_DeInit
+* Description : Deinitializes the NVIC peripheral registers to their default
+* reset values.
+* Input : None
+* Output : None
+* Return : None
+*******************************************************************************/
+void NVIC_DeInit(void)
+{
+ u32 index = 0;
+
+ NVIC->ICER[0] = 0xFFFFFFFF;
+ NVIC->ICER[1] = 0x0FFFFFFF;
+ NVIC->ICPR[0] = 0xFFFFFFFF;
+ NVIC->ICPR[1] = 0x0FFFFFFF;
+
+ for(index = 0; index < 0x0F; index++)
+ {
+ NVIC->IPR[index] = 0x00000000;
+ }
+}
+
+/*******************************************************************************
+* Function Name : NVIC_SCBDeInit
+* Description : Deinitializes the SCB peripheral registers to their default
+* reset values.
+* Input : None
+* Output : None
+* Return : None
+*******************************************************************************/
+void NVIC_SCBDeInit(void)
+{
+ u32 index = 0x00;
+
+ SCB->ICSR = 0x0A000000;
+ SCB->VTOR = 0x00000000;
+ SCB->AIRCR = AIRCR_VECTKEY_MASK;
+ SCB->SCR = 0x00000000;
+ SCB->CCR = 0x00000000;
+ for(index = 0; index < 0x03; index++)
+ {
+ SCB->SHPR[index] = 0;
+ }
+ SCB->SHCSR = 0x00000000;
+ SCB->CFSR = 0xFFFFFFFF;
+ SCB->HFSR = 0xFFFFFFFF;
+ SCB->DFSR = 0xFFFFFFFF;
+}
+
+/*******************************************************************************
+* Function Name : NVIC_PriorityGroupConfig
+* Description : Configures the priority grouping: pre-emption priority
+* and subpriority.
+* Input : - NVIC_PriorityGroup: specifies the priority grouping bits
+* length. This parameter can be one of the following values:
+* - NVIC_PriorityGroup_0: 0 bits for pre-emption priority
+* 4 bits for subpriority
+* - NVIC_PriorityGroup_1: 1 bits for pre-emption priority
+* 3 bits for subpriority
+* - NVIC_PriorityGroup_2: 2 bits for pre-emption priority
+* 2 bits for subpriority
+* - NVIC_PriorityGroup_3: 3 bits for pre-emption priority
+* 1 bits for subpriority
+* - NVIC_PriorityGroup_4: 4 bits for pre-emption priority
+* 0 bits for subpriority
+* Output : None
+* Return : None
+*******************************************************************************/
+void NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup)
+{
+ /* Check the parameters */
+ assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
+
+ /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
+ SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
+}
+
+/*******************************************************************************
+* Function Name : NVIC_Init
+* Description : Initializes the NVIC peripheral according to the specified
+* parameters in the NVIC_InitStruct.
+* Input : - NVIC_InitStruct: pointer to a NVIC_InitTypeDef structure
+* that contains the configuration information for the
+* specified NVIC peripheral.
+* Output : None
+* Return : None
+*******************************************************************************/
+void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
+{
+ u32 tmppriority = 0x00, tmpreg = 0x00, tmpmask = 0x00;
+ u32 tmppre = 0, tmpsub = 0x0F;
+
+ /* Check the parameters */
+ assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd));
+ assert_param(IS_NVIC_IRQ_CHANNEL(NVIC_InitStruct->NVIC_IRQChannel));
+ assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority));
+ assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));
+
+ if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
+ {
+ /* Compute the Corresponding IRQ Priority --------------------------------*/
+ tmppriority = (0x700 - (SCB->AIRCR & (u32)0x700))>> 0x08;
+ tmppre = (0x4 - tmppriority);
+ tmpsub = tmpsub >> tmppriority;
+
+ tmppriority = (u32)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
+ tmppriority |= NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub;
+
+ tmppriority = tmppriority << 0x04;
+ tmppriority = ((u32)tmppriority) << ((NVIC_InitStruct->NVIC_IRQChannel & (u8)0x03) * 0x08);
+
+ tmpreg = NVIC->IPR[(NVIC_InitStruct->NVIC_IRQChannel >> 0x02)];
+ tmpmask = (u32)0xFF << ((NVIC_InitStruct->NVIC_IRQChannel & (u8)0x03) * 0x08);
+ tmpreg &= ~tmpmask;
+ tmppriority &= tmpmask;
+ tmpreg |= tmppriority;
+
+ NVIC->IPR[(NVIC_InitStruct->NVIC_IRQChannel >> 0x02)] = tmpreg;
+
+ /* Enable the Selected IRQ Channels --------------------------------------*/
+ NVIC->ISER[(NVIC_InitStruct->NVIC_IRQChannel >> 0x05)] =
+ (u32)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (u8)0x1F);
+ }
+ else
+ {
+ /* Disable the Selected IRQ Channels -------------------------------------*/
+ NVIC->ICER[(NVIC_InitStruct->NVIC_IRQChannel >> 0x05)] =
+ (u32)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (u8)0x1F);
+ }
+}
+
+/*******************************************************************************
+* Function Name : NVIC_StructInit
+* Description : Fills each NVIC_InitStruct member with its default value.
+* Input : - NVIC_InitStruct: pointer to a NVIC_InitTypeDef structure which
+* will be initialized.
+* Output : None
+* Return : None
+*******************************************************************************/
+void NVIC_StructInit(NVIC_InitTypeDef* NVIC_InitStruct)
+{
+ /* NVIC_InitStruct members default value */
+ NVIC_InitStruct->NVIC_IRQChannel = 0x00;
+ NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority = 0x00;
+ NVIC_InitStruct->NVIC_IRQChannelSubPriority = 0x00;
+ NVIC_InitStruct->NVIC_IRQChannelCmd = DISABLE;
+}
+
+/*******************************************************************************
+* Function Name : NVIC_SETPRIMASK
+* Description : Enables the PRIMASK priority: Raises the execution priority to 0.
+* Input : None
+* Output : None
+* Return : None
+*******************************************************************************/
+void NVIC_SETPRIMASK(void)
+{
+ __SETPRIMASK();
+}
+
+/*******************************************************************************
+* Function Name : NVIC_RESETPRIMASK
+* Description : Disables the PRIMASK priority.
+* Input : None
+* Output : None
+* Return : None
+*******************************************************************************/
+void NVIC_RESETPRIMASK(void)
+{
+ __RESETPRIMASK();
+}
+
+/*******************************************************************************
+* Function Name : NVIC_SETFAULTMASK
+* Description : Enables the FAULTMASK priority: Raises the execution priority to -1.
+* Input : None
+* Output : None
+* Return : None
+*******************************************************************************/
+void NVIC_SETFAULTMASK(void)
+{
+ __SETFAULTMASK();
+}
+
+/*******************************************************************************
+* Function Name : NVIC_RESETFAULTMASK
+* Description : Disables the FAULTMASK priority.
+* Input : None
+* Output : None
+* Return : None
+*******************************************************************************/
+void NVIC_RESETFAULTMASK(void)
+{
+ __RESETFAULTMASK();
+}
+
+/*******************************************************************************
+* Function Name : NVIC_BASEPRICONFIG
+* Description : The execution priority can be changed from 15 (lowest
+ configurable priority) to 1. Writing a zero value will disable
+* the mask of execution priority.
+* Input : None
+* Output : None
+* Return : None
+*******************************************************************************/
+void NVIC_BASEPRICONFIG(u32 NewPriority)
+{
+ /* Check the parameters */
+ assert_param(IS_NVIC_BASE_PRI(NewPriority));
+
+ __BASEPRICONFIG(NewPriority << 0x04);
+}
+
+/*******************************************************************************
+* Function Name : NVIC_GetBASEPRI
+* Description : Returns the BASEPRI mask value.
+* Input : None
+* Output : None
+* Return : BASEPRI register value
+*******************************************************************************/
+u32 NVIC_GetBASEPRI(void)
+{
+ return (__GetBASEPRI());
+}
+
+/*******************************************************************************
+* Function Name : NVIC_GetCurrentPendingIRQChannel
+* Description : Returns the current pending IRQ channel identifier.
+* Input : None
+* Output : None
+* Return : Pending IRQ Channel Identifier.
+*******************************************************************************/
+u16 NVIC_GetCurrentPendingIRQChannel(void)
+{
+ return ((u16)((SCB->ICSR & (u32)0x003FF000) >> 0x0C));
+}
+
+/*******************************************************************************
+* Function Name : NVIC_GetIRQChannelPendingBitStatus
+* Description : Checks whether the specified IRQ Channel pending bit is set
+* or not.
+* Input : - NVIC_IRQChannel: specifies the interrupt pending bit to check.
+* Output : None
+* Return : The new state of IRQ Channel pending bit(SET or RESET).
+*******************************************************************************/
+ITStatus NVIC_GetIRQChannelPendingBitStatus(u8 NVIC_IRQChannel)
+{
+ ITStatus pendingirqstatus = RESET;
+ u32 tmp = 0x00;
+
+ /* Check the parameters */
+ assert_param(IS_NVIC_IRQ_CHANNEL(NVIC_IRQChannel));
+
+ tmp = ((u32)0x01 << (NVIC_IRQChannel & (u32)0x1F));
+
+ if (((NVIC->ISPR[(NVIC_IRQChannel >> 0x05)]) & tmp) == tmp)
+ {
+ pendingirqstatus = SET;
+ }
+ else
+ {
+ pendingirqstatus = RESET;
+ }
+ return pendingirqstatus;
+}
+
+/*******************************************************************************
+* Function Name : NVIC_SetIRQChannelPendingBit
+* Description : Sets the NVIC’s interrupt pending bit.
+* Input : - NVIC_IRQChannel: specifies the interrupt pending bit to Set.
+* Output : None
+* Return : None
+*******************************************************************************/
+void NVIC_SetIRQChannelPendingBit(u8 NVIC_IRQChannel)
+{
+ /* Check the parameters */
+ assert_param(IS_NVIC_IRQ_CHANNEL(NVIC_IRQChannel));
+
+ *(vu32*) 0xE000EF00 = (u32)NVIC_IRQChannel;
+}
+
+/*******************************************************************************
+* Function Name : NVIC_ClearIRQChannelPendingBit
+* Description : Clears the NVIC’s interrupt pending bit.
+* Input : - NVIC_IRQChannel: specifies the interrupt pending bit to clear.
+* Output : None
+* Return : None
+*******************************************************************************/
+void NVIC_ClearIRQChannelPendingBit(u8 NVIC_IRQChannel)
+{
+ /* Check the parameters */
+ assert_param(IS_NVIC_IRQ_CHANNEL(NVIC_IRQChannel));
+
+ NVIC->ICPR[(NVIC_IRQChannel >> 0x05)] = (u32)0x01 << (NVIC_IRQChannel & (u32)0x1F);
+}
+
+/*******************************************************************************
+* Function Name : NVIC_GetCurrentActiveHandler
+* Description : Returns the current active Handler (IRQ Channel and
+* SystemHandler) identifier.
+* Input : None
+* Output : None
+* Return : Active Handler Identifier.
+*******************************************************************************/
+u16 NVIC_GetCurrentActiveHandler(void)
+{
+ return ((u16)(SCB->ICSR & (u32)0x3FF));
+}
+
+/*******************************************************************************
+* Function Name : NVIC_GetIRQChannelActiveBitStatus
+* Description : Checks whether the specified IRQ Channel active bit is set
+* or not.
+* Input : - NVIC_IRQChannel: specifies the interrupt active bit to check.
+* Output : None
+* Return : The new state of IRQ Channel active bit(SET or RESET).
+*******************************************************************************/
+ITStatus NVIC_GetIRQChannelActiveBitStatus(u8 NVIC_IRQChannel)
+{
+ ITStatus activeirqstatus = RESET;
+ u32 tmp = 0x00;
+
+ /* Check the parameters */
+ assert_param(IS_NVIC_IRQ_CHANNEL(NVIC_IRQChannel));
+
+ tmp = ((u32)0x01 << (NVIC_IRQChannel & (u32)0x1F));
+
+ if (((NVIC->IABR[(NVIC_IRQChannel >> 0x05)]) & tmp) == tmp )
+ {
+ activeirqstatus = SET;
+ }
+ else
+ {
+ activeirqstatus = RESET;
+ }
+ return activeirqstatus;
+}
+
+/*******************************************************************************
+* Function Name : NVIC_GetCPUID
+* Description : Returns the ID number, the version number and the implementation
+* details of the Cortex-M3 core.
+* Input : None
+* Output : None
+* Return : CPU ID.
+*******************************************************************************/
+u32 NVIC_GetCPUID(void)
+{
+ return (SCB->CPUID);
+}
+
+/*******************************************************************************
+* Function Name : NVIC_SetVectorTable
+* Description : Sets the vector table location and Offset.
+* Input : - NVIC_VectTab: specifies if the vector table is in RAM or
+* FLASH memory.
+* This parameter can be one of the following values:
+* - NVIC_VectTab_RAM
+* - NVIC_VectTab_FLASH
+* - Offset: Vector Table base offset field.
+* This value must be a multiple of 0x100.
+* Output : None
+* Return : None
+*******************************************************************************/
+void NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset)
+{
+ /* Check the parameters */
+ assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
+ assert_param(IS_NVIC_OFFSET(Offset));
+
+ SCB->VTOR = NVIC_VectTab | (Offset & (u32)0x1FFFFF80);
+}
+
+/*******************************************************************************
+* Function Name : NVIC_GenerateSystemReset
+* Description : Generates a system reset.
+* Input : None
+* Output : None
+* Return : None
+*******************************************************************************/
+void NVIC_GenerateSystemReset(void)
+{
+ SCB->AIRCR = AIRCR_VECTKEY_MASK | (u32)0x04;
+}
+
+/*******************************************************************************
+* Function Name : NVIC_GenerateCoreReset
+* Description : Generates a Core (Core + NVIC) reset.
+* Input : None
+* Output : None
+* Return : None
+*******************************************************************************/
+void NVIC_GenerateCoreReset(void)
+{
+ SCB->AIRCR = AIRCR_VECTKEY_MASK | (u32)0x01;
+}
+
+/*******************************************************************************
+* Function Name : NVIC_SystemLPConfig
+* Description : Selects the condition for the system to enter low power mode.
+* Input : - LowPowerMode: Specifies the new mode for the system to enter
+* low power mode.
+* This parameter can be one of the following values:
+* - NVIC_LP_SEVONPEND
+* - NVIC_LP_SLEEPDEEP
+* - NVIC_LP_SLEEPONEXIT
+* - NewState: new state of LP condition.
+* This parameter can be: ENABLE or DISABLE.
+* Output : None
+* Return : None
+*******************************************************************************/
+void NVIC_SystemLPConfig(u8 LowPowerMode, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_NVIC_LP(LowPowerMode));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+ if (NewState != DISABLE)
+ {
+ SCB->SCR |= LowPowerMode;
+ }
+ else
+ {
+ SCB->SCR &= (u32)(~(u32)LowPowerMode);
+ }
+}
+
+/*******************************************************************************
+* Function Name : NVIC_SystemHandlerConfig
+* Description : Enables or disables the specified System Handlers.
+* Input : - SystemHandler: specifies the system handler to be enabled
+* or disabled.
+* This parameter can be one of the following values:
+* - SystemHandler_MemoryManage
+* - SystemHandler_BusFault
+* - SystemHandler_UsageFault
+* - NewState: new state of specified System Handlers.
+* This parameter can be: ENABLE or DISABLE.
+* Output : None
+* Return : None
+*******************************************************************************/
+void NVIC_SystemHandlerConfig(u32 SystemHandler, FunctionalState NewState)
+{
+ u32 tmpreg = 0x00;
+
+ /* Check the parameters */
+ assert_param(IS_CONFIG_SYSTEM_HANDLER(SystemHandler));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+ tmpreg = (u32)0x01 << (SystemHandler & (u32)0x1F);
+
+ if (NewState != DISABLE)
+ {
+ SCB->SHCSR |= tmpreg;
+ }
+ else
+ {
+ SCB->SHCSR &= ~tmpreg;
+ }
+}
+
+/*******************************************************************************
+* Function Name : NVIC_SystemHandlerPriorityConfig
+* Description : Configures the specified System Handlers priority.
+* Input : - SystemHandler: specifies the system handler to be
+* enabled or disabled.
+* This parameter can be one of the following values:
+* - SystemHandler_MemoryManage
+* - SystemHandler_BusFault
+* - SystemHandler_UsageFault
+* - SystemHandler_SVCall
+* - SystemHandler_DebugMonitor
+* - SystemHandler_PSV
+* - SystemHandler_SysTick
+* - SystemHandlerPreemptionPriority: new priority group of the
+* specified system handlers.
+* - SystemHandlerSubPriority: new sub priority of the specified
+* system handlers.
+* Output : None
+* Return : None
+*******************************************************************************/
+void NVIC_SystemHandlerPriorityConfig(u32 SystemHandler, u8 SystemHandlerPreemptionPriority,
+ u8 SystemHandlerSubPriority)
+{
+ u32 tmp1 = 0x00, tmp2 = 0xFF, handlermask = 0x00;
+ u32 tmppriority = 0x00;
+
+ /* Check the parameters */
+ assert_param(IS_PRIORITY_SYSTEM_HANDLER(SystemHandler));
+ assert_param(IS_NVIC_PREEMPTION_PRIORITY(SystemHandlerPreemptionPriority));
+ assert_param(IS_NVIC_SUB_PRIORITY(SystemHandlerSubPriority));
+
+ tmppriority = (0x700 - (SCB->AIRCR & (u32)0x700))>> 0x08;
+ tmp1 = (0x4 - tmppriority);
+ tmp2 = tmp2 >> tmppriority;
+
+ tmppriority = (u32)SystemHandlerPreemptionPriority << tmp1;
+ tmppriority |= SystemHandlerSubPriority & tmp2;
+
+ tmppriority = tmppriority << 0x04;
+ tmp1 = SystemHandler & (u32)0xC0;
+ tmp1 = tmp1 >> 0x06;
+ tmp2 = (SystemHandler >> 0x08) & (u32)0x03;
+ tmppriority = tmppriority << (tmp2 * 0x08);
+ handlermask = (u32)0xFF << (tmp2 * 0x08);
+
+ SCB->SHPR[tmp1] &= ~handlermask;
+ SCB->SHPR[tmp1] |= tmppriority;
+}
+
+/*******************************************************************************
+* Function Name : NVIC_GetSystemHandlerPendingBitStatus
+* Description : Checks whether the specified System handlers pending bit is
+* set or not.
+* Input : - SystemHandler: specifies the system handler pending bit to
+* check.
+* This parameter can be one of the following values:
+* - SystemHandler_MemoryManage
+* - SystemHandler_BusFault
+* - SystemHandler_SVCall
+* Output : None
+* Return : The new state of System Handler pending bit(SET or RESET).
+*******************************************************************************/
+ITStatus NVIC_GetSystemHandlerPendingBitStatus(u32 SystemHandler)
+{
+ ITStatus bitstatus = RESET;
+ u32 tmp = 0x00, tmppos = 0x00;
+
+ /* Check the parameters */
+ assert_param(IS_GET_PENDING_SYSTEM_HANDLER(SystemHandler));
+
+ tmppos = (SystemHandler >> 0x0A);
+ tmppos &= (u32)0x0F;
+
+ tmppos = (u32)0x01 << tmppos;
+
+ tmp = SCB->SHCSR & tmppos;
+
+ if (tmp == tmppos)
+ {
+ bitstatus = SET;
+ }
+ else
+ {
+ bitstatus = RESET;
+ }
+ return bitstatus;
+}
+
+/*******************************************************************************
+* Function Name : NVIC_SetSystemHandlerPendingBit
+* Description : Sets System Handler pending bit.
+* Input : - SystemHandler: specifies the system handler pending bit
+* to be set.
+* This parameter can be one of the following values:
+* - SystemHandler_NMI
+* - SystemHandler_PSV
+* - SystemHandler_SysTick
+* Output : None
+* Return : None
+*******************************************************************************/
+void NVIC_SetSystemHandlerPendingBit(u32 SystemHandler)
+{
+ u32 tmp = 0x00;
+
+ /* Check the parameters */
+ assert_param(IS_SET_PENDING_SYSTEM_HANDLER(SystemHandler));
+
+ /* Get the System Handler pending bit position */
+ tmp = SystemHandler & (u32)0x1F;
+ /* Set the corresponding System Handler pending bit */
+ SCB->ICSR |= ((u32)0x01 << tmp);
+}
+
+/*******************************************************************************
+* Function Name : NVIC_ClearSystemHandlerPendingBit
+* Description : Clears System Handler pending bit.
+* Input : - SystemHandler: specifies the system handler pending bit to
+* be clear.
+* This parameter can be one of the following values:
+* - SystemHandler_PSV
+* - SystemHandler_SysTick
+* Output : None
+* Return : None
+*******************************************************************************/
+void NVIC_ClearSystemHandlerPendingBit(u32 SystemHandler)
+{
+ u32 tmp = 0x00;
+
+ /* Check the parameters */
+ assert_param(IS_CLEAR_SYSTEM_HANDLER(SystemHandler));
+
+ /* Get the System Handler pending bit position */
+ tmp = SystemHandler & (u32)0x1F;
+ /* Clear the corresponding System Handler pending bit */
+ SCB->ICSR |= ((u32)0x01 << (tmp - 0x01));
+}
+
+/*******************************************************************************
+* Function Name : NVIC_GetSystemHandlerActiveBitStatus
+* Description : Checks whether the specified System handlers active bit is
+* set or not.
+* Input : - SystemHandler: specifies the system handler active bit to
+* check.
+* This parameter can be one of the following values:
+* - SystemHandler_MemoryManage
+* - SystemHandler_BusFault
+* - SystemHandler_UsageFault
+* - SystemHandler_SVCall
+* - SystemHandler_DebugMonitor
+* - SystemHandler_PSV
+* - SystemHandler_SysTick
+* Output : None
+* Return : The new state of System Handler active bit(SET or RESET).
+*******************************************************************************/
+ITStatus NVIC_GetSystemHandlerActiveBitStatus(u32 SystemHandler)
+{
+ ITStatus bitstatus = RESET;
+
+ u32 tmp = 0x00, tmppos = 0x00;
+
+ /* Check the parameters */
+ assert_param(IS_GET_ACTIVE_SYSTEM_HANDLER(SystemHandler));
+
+ tmppos = (SystemHandler >> 0x0E) & (u32)0x0F;
+
+ tmppos = (u32)0x01 << tmppos;
+
+ tmp = SCB->SHCSR & tmppos;
+
+ if (tmp == tmppos)
+ {
+ bitstatus = SET;
+ }
+ else
+ {
+ bitstatus = RESET;
+ }
+ return bitstatus;
+}
+
+/*******************************************************************************
+* Function Name : NVIC_GetFaultHandlerSources
+* Description : Returns the system fault handlers sources.
+* Input : - SystemHandler: specifies the system handler to get its fault
+* sources.
+* This parameter can be one of the following values:
+* - SystemHandler_HardFault
+* - SystemHandler_MemoryManage
+* - SystemHandler_BusFault
+* - SystemHandler_UsageFault
+* - SystemHandler_DebugMonitor
+* Output : None
+* Return : Source of the fault handler.
+*******************************************************************************/
+u32 NVIC_GetFaultHandlerSources(u32 SystemHandler)
+{
+ u32 faultsources = 0x00;
+ u32 tmpreg = 0x00, tmppos = 0x00;
+
+ /* Check the parameters */
+ assert_param(IS_FAULT_SOURCE_SYSTEM_HANDLER(SystemHandler));
+
+ tmpreg = (SystemHandler >> 0x12) & (u32)0x03;
+ tmppos = (SystemHandler >> 0x14) & (u32)0x03;
+
+ if (tmpreg == 0x00)
+ {
+ faultsources = SCB->HFSR;
+ }
+ else if (tmpreg == 0x01)
+ {
+ faultsources = SCB->CFSR >> (tmppos * 0x08);
+ if (tmppos != 0x02)
+ {
+ faultsources &= (u32)0x0F;
+ }
+ else
+ {
+ faultsources &= (u32)0xFF;
+ }
+ }
+ else
+ {
+ faultsources = SCB->DFSR;
+ }
+ return faultsources;
+}
+
+/*******************************************************************************
+* Function Name : NVIC_GetFaultAddress
+* Description : Returns the address of the location that generated a fault
+* handler.
+* Input : - SystemHandler: specifies the system handler to get its
+* fault address.
+* This parameter can be one of the following values:
+* - SystemHandler_MemoryManage
+* - SystemHandler_BusFault
+* Output : None
+* Return : Fault address.
+*******************************************************************************/
+u32 NVIC_GetFaultAddress(u32 SystemHandler)
+{
+ u32 faultaddress = 0x00;
+ u32 tmp = 0x00;
+
+ /* Check the parameters */
+ assert_param(IS_FAULT_ADDRESS_SYSTEM_HANDLER(SystemHandler));
+
+ tmp = (SystemHandler >> 0x16) & (u32)0x01;
+
+ if (tmp == 0x00)
+ {
+ faultaddress = SCB->MMFAR;
+ }
+ else
+ {
+ faultaddress = SCB->BFAR;
+ }
+ return faultaddress;
+}
+
+/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/