1 /******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
\r
2 * File Name : stm32f10x_nvic.c
\r
3 * Author : MCD Application Team
\r
4 * Date First Issued : 09/29/2006
\r
5 * Description : This file provides all the NVIC firmware functions.
\r
6 ********************************************************************************
\r
11 ********************************************************************************
\r
12 * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
\r
13 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
\r
14 * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
\r
15 * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
\r
16 * CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
\r
17 * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
\r
18 *******************************************************************************/
\r
20 /* Includes ------------------------------------------------------------------*/
\r
21 #include "stm32f10x_nvic.h"
\r
23 /* Private typedef -----------------------------------------------------------*/
\r
24 /* Private define ------------------------------------------------------------*/
\r
25 #define AIRC_VECTKEY_MASK ((u32)0x05FA0000)
\r
27 /* Private macro -------------------------------------------------------------*/
\r
28 /* Private variables ---------------------------------------------------------*/
\r
29 /* Private function prototypes -----------------------------------------------*/
\r
30 /* Private functions ---------------------------------------------------------*/
\r
32 /*******************************************************************************
\r
33 * Function Name : NVIC_DeInit
\r
34 * Description : Deinitializes the NVIC peripheral registers to their default
\r
39 *******************************************************************************/
\r
40 void NVIC_DeInit(void)
\r
44 NVIC->Disable[0] = 0xFFFFFFFF;
\r
45 NVIC->Disable[1] = 0x000007FF;
\r
46 NVIC->Clear[0] = 0xFFFFFFFF;
\r
47 NVIC->Clear[1] = 0x000007FF;
\r
49 for(index = 0; index < 0x0B; index++)
\r
51 NVIC->Priority[index] = 0x00000000;
\r
55 /*******************************************************************************
\r
56 * Function Name : NVIC_SCBDeInit
\r
57 * Description : Deinitializes the SCB peripheral registers to their default
\r
62 *******************************************************************************/
\r
63 void NVIC_SCBDeInit(void)
\r
67 SCB->IRQControlState = 0x0A000000;
\r
68 SCB->ExceptionTableOffset = 0x00000000;
\r
69 SCB->AIRC = AIRC_VECTKEY_MASK;
\r
70 SCB->SysCtrl = 0x00000000;
\r
71 SCB->ConfigCtrl = 0x00000000;
\r
72 for(index = 0; index < 0x03; index++)
\r
74 SCB->SystemPriority[index] = 0;
\r
76 SCB->SysHandlerCtrl = 0x00000000;
\r
77 SCB->ConfigFaultStatus = 0xFFFFFFFF;
\r
78 SCB->HardFaultStatus = 0xFFFFFFFF;
\r
79 SCB->DebugFaultStatus = 0xFFFFFFFF;
\r
82 /*******************************************************************************
\r
83 * Function Name : NVIC_PriorityGroupConfig
\r
84 * Description : Configures the priority grouping: pre-emption priority
\r
86 * Input : - NVIC_PriorityGroup: specifies the priority grouping bits
\r
87 * length. This parameter can be one of the following values:
\r
88 * - NVIC_PriorityGroup_0: 0 bits for pre-emption priority
\r
89 * 4 bits for subpriority
\r
90 * - NVIC_PriorityGroup_1: 1 bits for pre-emption priority
\r
91 * 3 bits for subpriority
\r
92 * - NVIC_PriorityGroup_2: 2 bits for pre-emption priority
\r
93 * 2 bits for subpriority
\r
94 * - NVIC_PriorityGroup_3: 3 bits for pre-emption priority
\r
95 * 1 bits for subpriority
\r
96 * - NVIC_PriorityGroup_4: 4 bits for pre-emption priority
\r
97 * 0 bits for subpriority
\r
100 *******************************************************************************/
\r
101 void NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup)
\r
103 /* Check the parameters */
\r
104 assert(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
\r
106 /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
\r
107 SCB->AIRC = AIRC_VECTKEY_MASK | NVIC_PriorityGroup;
\r
110 /*******************************************************************************
\r
111 * Function Name : NVIC_Init
\r
112 * Description : Initializes the NVIC peripheral according to the specified
\r
113 * parameters in the NVIC_InitStruct.
\r
114 * Input : - NVIC_InitStruct: pointer to a NVIC_InitTypeDef structure
\r
115 * that contains the configuration information for the
\r
116 * specified NVIC peripheral.
\r
119 *******************************************************************************/
\r
120 void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
\r
122 u32 tmppriority = 0x00, tmpreg = 0x00, tmpmask = 0x00;
\r
123 u32 tmppre = 0, tmpsub = 0x0F;
\r
125 /* Check the parameters */
\r
126 assert(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd));
\r
127 assert(IS_NVIC_IRQ_CHANNEL(NVIC_InitStruct->NVIC_IRQChannel));
\r
128 assert(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority));
\r
129 assert(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));
\r
131 if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
\r
133 /* Compute the Corresponding IRQ Priority --------------------------------*/
\r
134 tmppriority = (0x700 - (SCB->AIRC & (u32)0x700))>> 0x08;
\r
135 tmppre = (0x4 - tmppriority);
\r
136 tmpsub = tmpsub >> tmppriority;
\r
138 tmppriority = (u32)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
\r
139 tmppriority |= NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub;
\r
141 tmppriority = tmppriority << 0x04;
\r
142 tmppriority = ((u32)tmppriority) << ((NVIC_InitStruct->NVIC_IRQChannel & (u8)0x03) * 0x08);
\r
144 tmpreg = NVIC->Priority[(NVIC_InitStruct->NVIC_IRQChannel >> 0x02)];
\r
145 tmpmask = (u32)0xFF << ((NVIC_InitStruct->NVIC_IRQChannel & (u8)0x03) * 0x08);
\r
146 tmpreg &= ~tmpmask;
\r
147 tmppriority &= tmpmask;
\r
148 tmpreg |= tmppriority;
\r
150 NVIC->Priority[(NVIC_InitStruct->NVIC_IRQChannel >> 0x02)] = tmpreg;
\r
152 /* Enable the Selected IRQ Channels --------------------------------------*/
\r
153 NVIC->Enable[(NVIC_InitStruct->NVIC_IRQChannel >> 0x05)] =
\r
154 (u32)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (u8)0x1F);
\r
158 /* Disable the Selected IRQ Channels -------------------------------------*/
\r
159 NVIC->Disable[(NVIC_InitStruct->NVIC_IRQChannel >> 0x05)] =
\r
160 (u32)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (u8)0x1F);
\r
164 /*******************************************************************************
\r
165 * Function Name : NVIC_StructInit
\r
166 * Description : Fills each NVIC_InitStruct member with its default value.
\r
167 * Input : - NVIC_InitStruct: pointer to a NVIC_InitTypeDef structure which
\r
168 * will be initialized.
\r
171 *******************************************************************************/
\r
172 void NVIC_StructInit(NVIC_InitTypeDef* NVIC_InitStruct)
\r
174 /* NVIC_InitStruct members default value */
\r
175 NVIC_InitStruct->NVIC_IRQChannel = 0x00;
\r
176 NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority = 0x00;
\r
177 NVIC_InitStruct->NVIC_IRQChannelSubPriority = 0x00;
\r
178 NVIC_InitStruct->NVIC_IRQChannelCmd = DISABLE;
\r
181 /*******************************************************************************
\r
182 * Function Name : NVIC_SETPRIMASK
\r
183 * Description : Enables the PRIMASK priority: Raises the execution priority to 0.
\r
187 *******************************************************************************/
\r
188 void NVIC_SETPRIMASK(void)
\r
193 /*******************************************************************************
\r
194 * Function Name : NVIC_RESETPRIMASK
\r
195 * Description : Disables the PRIMASK priority.
\r
199 *******************************************************************************/
\r
200 void NVIC_RESETPRIMASK(void)
\r
205 /*******************************************************************************
\r
206 * Function Name : NVIC_SETFAULTMASK
\r
207 * Description : Enables the FAULTMASK priority: Raises the execution priority to -1.
\r
211 *******************************************************************************/
\r
212 void NVIC_SETFAULTMASK(void)
\r
217 /*******************************************************************************
\r
218 * Function Name : NVIC_RESETFAULTMASK
\r
219 * Description : Disables the FAULTMASK priority.
\r
223 *******************************************************************************/
\r
224 void NVIC_RESETFAULTMASK(void)
\r
226 __RESETFAULTMASK();
\r
229 /*******************************************************************************
\r
230 * Function Name : NVIC_BASEPRICONFIG
\r
231 * Description : The execution priority can be changed from 15 (lowest
\r
232 configurable priority) to 1.
\r
236 *******************************************************************************/
\r
237 void NVIC_BASEPRICONFIG(u32 NewPriority)
\r
239 /* Check the parameters */
\r
240 assert(IS_NVIC_BASE_PRI(NewPriority));
\r
242 __BASEPRICONFIG(NewPriority << 0x04);
\r
245 /*******************************************************************************
\r
246 * Function Name : NVIC_GetBASEPRI
\r
247 * Description : Returns the BASEPRI mask value.
\r
250 * Return : BASEPRI register value
\r
251 *******************************************************************************/
\r
252 u32 NVIC_GetBASEPRI(void)
\r
254 return (__GetBASEPRI());
\r
257 /*******************************************************************************
\r
258 * Function Name : NVIC_GetCurrentPendingIRQChannel
\r
259 * Description : Returns the current pending IRQ channel identifier.
\r
262 * Return : Pending IRQ Channel Identifier.
\r
263 *******************************************************************************/
\r
264 u16 NVIC_GetCurrentPendingIRQChannel(void)
\r
266 return ((u16)((SCB->IRQControlState & (u32)0x003FF000) >> 0x0C));
\r
269 /*******************************************************************************
\r
270 * Function Name : NVIC_GetIRQChannelPendingBitStatus
\r
271 * Description : Checks whether the specified IRQ Channel pending bit is set
\r
273 * Input : - NVIC_IRQChannel: specifies the interrupt pending bit to check.
\r
275 * Return : The new state of IRQ Channel pending bit(SET or RESET).
\r
276 *******************************************************************************/
\r
277 ITStatus NVIC_GetIRQChannelPendingBitStatus(u8 NVIC_IRQChannel)
\r
279 ITStatus pendingirqstatus = RESET;
\r
282 /* Check the parameters */
\r
283 assert(IS_NVIC_IRQ_CHANNEL(NVIC_IRQChannel));
\r
285 tmp = ((u32)0x01 << (NVIC_IRQChannel & (u32)0x1F));
\r
287 if (((NVIC->Set[(NVIC_IRQChannel >> 0x05)]) & tmp) == tmp)
\r
289 pendingirqstatus = SET;
\r
293 pendingirqstatus = RESET;
\r
295 return pendingirqstatus;
\r
298 /*******************************************************************************
\r
299 * Function Name : NVIC_SetIRQChannelPendingBit
\r
300 * Description : Sets the NVIC
\92s interrupt pending bit.
\r
301 * Input : - NVIC_IRQChannel: specifies the interrupt pending bit to Set.
\r
304 *******************************************************************************/
\r
305 void NVIC_SetIRQChannelPendingBit(u8 NVIC_IRQChannel)
\r
307 /* Check the parameters */
\r
308 assert(IS_NVIC_IRQ_CHANNEL(NVIC_IRQChannel));
\r
310 *(u32*)0xE000EF00 = (u32)NVIC_IRQChannel;
\r
313 /*******************************************************************************
\r
314 * Function Name : NVIC_ClearIRQChannelPendingBit
\r
315 * Description : Clears the NVIC
\92s interrupt pending bit.
\r
316 * Input : - NVIC_IRQChannel: specifies the interrupt pending bit to clear.
\r
319 *******************************************************************************/
\r
320 void NVIC_ClearIRQChannelPendingBit(u8 NVIC_IRQChannel)
\r
322 /* Check the parameters */
\r
323 assert(IS_NVIC_IRQ_CHANNEL(NVIC_IRQChannel));
\r
325 NVIC->Clear[(NVIC_IRQChannel >> 0x05)] = (u32)0x01 << (NVIC_IRQChannel & (u32)0x1F);
\r
328 /*******************************************************************************
\r
329 * Function Name : NVIC_GetCurrentActiveHandler
\r
330 * Description : Returns the current active Handler (IRQ Channel and
\r
331 * SystemHandler) identifier.
\r
334 * Return : Active Handler Identifier.
\r
335 *******************************************************************************/
\r
336 u16 NVIC_GetCurrentActiveHandler(void)
\r
338 return ((u16)(SCB->IRQControlState & (u32)0x3FF));
\r
341 /*******************************************************************************
\r
342 * Function Name : NVIC_GetIRQChannelActiveBitStatus
\r
343 * Description : Checks whether the specified IRQ Channel active bit is set
\r
345 * Input : - NVIC_IRQChannel: specifies the interrupt active bit to check.
\r
347 * Return : The new state of IRQ Channel active bit(SET or RESET).
\r
348 *******************************************************************************/
\r
349 ITStatus NVIC_GetIRQChannelActiveBitStatus(u8 NVIC_IRQChannel)
\r
351 ITStatus activeirqstatus = RESET;
\r
354 /* Check the parameters */
\r
355 assert(IS_NVIC_IRQ_CHANNEL(NVIC_IRQChannel));
\r
357 tmp = ((u32)0x01 << (NVIC_IRQChannel & (u32)0x1F));
\r
359 if (((NVIC->Active[(NVIC_IRQChannel >> 0x05)]) & tmp) == tmp )
\r
361 activeirqstatus = SET;
\r
365 activeirqstatus = RESET;
\r
367 return activeirqstatus;
\r
370 /*******************************************************************************
\r
371 * Function Name : NVIC_GetCPUID
\r
372 * Description : Returns the ID number, the version number and the implementation
\r
373 * details of the Cortex-M3 core.
\r
377 *******************************************************************************/
\r
378 u32 NVIC_GetCPUID(void)
\r
380 return (SCB->CPUID);
\r
383 /*******************************************************************************
\r
384 * Function Name : NVIC_SetVectorTable
\r
385 * Description : Sets the vector table location and Offset.
\r
386 * Input : - NVIC_VectTab: specifies if the vector table is in RAM or
\r
388 * This parameter can be one of the following values:
\r
389 * - NVIC_VectTab_RAM
\r
390 * - NVIC_VectTab_FLASH
\r
391 * - Offset: Vector Table base offset field.
\r
394 *******************************************************************************/
\r
395 void NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset)
\r
397 /* Check the parameters */
\r
398 assert(IS_NVIC_VECTTAB(NVIC_VectTab));
\r
399 assert(IS_NVIC_OFFSET(Offset));
\r
401 SCB->ExceptionTableOffset = (((u32)Offset << 0x07) & (u32)0x1FFFFF80);
\r
403 SCB->ExceptionTableOffset |= NVIC_VectTab;
\r
406 /*******************************************************************************
\r
407 * Function Name : NVIC_GenerateSystemReset
\r
408 * Description : Generates a system reset.
\r
412 *******************************************************************************/
\r
413 void NVIC_GenerateSystemReset(void)
\r
415 SCB->AIRC = AIRC_VECTKEY_MASK | (u32)0x04;
\r
418 /*******************************************************************************
\r
419 * Function Name : NVIC_GenerateCoreReset
\r
420 * Description : Generates a Core (Core + NVIC) reset.
\r
424 *******************************************************************************/
\r
425 void NVIC_GenerateCoreReset(void)
\r
427 SCB->AIRC = AIRC_VECTKEY_MASK | (u32)0x01;
\r
430 /*******************************************************************************
\r
431 * Function Name : NVIC_SystemLPConfig
\r
432 * Description : Selects the condition for the system to enter low power mode.
\r
433 * Input : - LowPowerMode: Specifies the new mode for the system to enter
\r
435 * This parameter can be one of the following values:
\r
436 * - NVIC_LP_SEVONPEND
\r
437 * - NVIC_LP_SLEEPDEEP
\r
438 * - NVIC_LP_SLEEPONEXIT
\r
439 * - NewState: new state of LP condition.
\r
440 * This parameter can be: ENABLE or DISABLE.
\r
443 *******************************************************************************/
\r
444 void NVIC_SystemLPConfig(u8 LowPowerMode, FunctionalState NewState)
\r
446 /* Check the parameters */
\r
447 assert(IS_NVIC_LP(LowPowerMode));
\r
448 assert(IS_FUNCTIONAL_STATE(NewState));
\r
450 if (NewState != DISABLE)
\r
452 SCB->SysCtrl |= LowPowerMode;
\r
456 SCB->SysCtrl &= (u32)(~(u32)LowPowerMode);
\r
460 /*******************************************************************************
\r
461 * Function Name : NVIC_SystemHandlerConfig
\r
462 * Description : Enables or disables the specified System Handlers.
\r
463 * Input : - SystemHandler: specifies the system handler to be enabled
\r
465 * This parameter can be one of the following values:
\r
466 * - SystemHandler_MemoryManage
\r
467 * - SystemHandler_BusFault
\r
468 * - SystemHandler_UsageFault
\r
469 * - NewState: new state of specified System Handlers.
\r
470 * This parameter can be: ENABLE or DISABLE.
\r
473 *******************************************************************************/
\r
474 void NVIC_SystemHandlerConfig(u32 SystemHandler, FunctionalState NewState)
\r
478 /* Check the parameters */
\r
479 assert(IS_CONFIG_SYSTEM_HANDLER(SystemHandler));
\r
480 assert(IS_FUNCTIONAL_STATE(NewState));
\r
482 tmpreg = (u32)0x01 << (SystemHandler & (u32)0x1F);
\r
484 if (NewState != DISABLE)
\r
486 SCB->SysHandlerCtrl |= tmpreg;
\r
490 SCB->SysHandlerCtrl &= ~tmpreg;
\r
494 /*******************************************************************************
\r
495 * Function Name : NVIC_SystemHandlerPriorityConfig
\r
496 * Description : Configures the specified System Handlers priority.
\r
497 * Input : - SystemHandler: specifies the system handler to be
\r
498 * enabled or disabled.
\r
499 * This parameter can be one of the following values:
\r
500 * - SystemHandler_MemoryManage
\r
501 * - SystemHandler_BusFault
\r
502 * - SystemHandler_UsageFault
\r
503 * - SystemHandler_SVCall
\r
504 * - SystemHandler_DebugMonitor
\r
505 * - SystemHandler_PSV
\r
506 * - SystemHandler_SysTick
\r
507 * - SystemHandlerPreemptionPriority: new priority group of the
\r
508 * specified system handlers.
\r
509 * - SystemHandlerSubPriority: new sub priority of the specified
\r
513 *******************************************************************************/
\r
514 void NVIC_SystemHandlerPriorityConfig(u32 SystemHandler, u8 SystemHandlerPreemptionPriority,
\r
515 u8 SystemHandlerSubPriority)
\r
517 u32 tmp1 = 0x00, tmp2 = 0xFF, handlermask = 0x00;
\r
518 u32 tmppriority = 0x00;
\r
520 /* Check the parameters */
\r
521 assert(IS_PRIORITY_SYSTEM_HANDLER(SystemHandler));
\r
522 assert(IS_NVIC_PREEMPTION_PRIORITY(SystemHandlerPreemptionPriority));
\r
523 assert(IS_NVIC_SUB_PRIORITY(SystemHandlerSubPriority));
\r
525 tmppriority = (0x700 - (SCB->AIRC & (u32)0x700))>> 0x08;
\r
526 tmp1 = (0x4 - tmppriority);
\r
527 tmp2 = tmp2 >> tmppriority;
\r
529 tmppriority = (u32)SystemHandlerPreemptionPriority << tmp1;
\r
530 tmppriority |= SystemHandlerSubPriority & tmp2;
\r
532 tmppriority = tmppriority << 0x04;
\r
533 tmp1 = SystemHandler & (u32)0xC0;
\r
534 tmp1 = tmp1 >> 0x06;
\r
535 tmp2 = (SystemHandler >> 0x08) & (u32)0x03;
\r
536 tmppriority = tmppriority << (tmp2 * 0x08);
\r
537 handlermask = (u32)0xFF << (tmp2 * 0x08);
\r
539 SCB->SystemPriority[tmp1] &= ~handlermask;
\r
540 SCB->SystemPriority[tmp1] |= tmppriority;
\r
543 /*******************************************************************************
\r
544 * Function Name : NVIC_GetSystemHandlerPendingBitStatus
\r
545 * Description : Checks whether the specified System handlers pending bit is
\r
547 * Input : - SystemHandler: specifies the system handler pending bit to
\r
549 * This parameter can be one of the following values:
\r
550 * - SystemHandler_MemoryManage
\r
551 * - SystemHandler_BusFault
\r
552 * - SystemHandler_SVCall
\r
554 * Return : The new state of System Handler pending bit(SET or RESET).
\r
555 *******************************************************************************/
\r
556 ITStatus NVIC_GetSystemHandlerPendingBitStatus(u32 SystemHandler)
\r
558 ITStatus bitstatus = RESET;
\r
559 u32 tmp = 0x00, tmppos = 0x00;
\r
561 /* Check the parameters */
\r
562 assert(IS_GET_PENDING_SYSTEM_HANDLER(SystemHandler));
\r
564 tmppos = (SystemHandler >> 0x0A);
\r
565 tmppos &= (u32)0x0F;
\r
567 tmppos = (u32)0x01 << tmppos;
\r
569 tmp = SCB->SysHandlerCtrl & tmppos;
\r
582 /*******************************************************************************
\r
583 * Function Name : NVIC_SetSystemHandlerPendingBit
\r
584 * Description : Sets System Handler pending bit.
\r
585 * Input : - SystemHandler: specifies the system handler pending bit
\r
587 * This parameter can be one of the following values:
\r
588 * - SystemHandler_NMI
\r
589 * - SystemHandler_PSV
\r
590 * - SystemHandler_SysTick
\r
593 *******************************************************************************/
\r
594 void NVIC_SetSystemHandlerPendingBit(u32 SystemHandler)
\r
598 /* Check the parameters */
\r
599 assert(IS_SET_PENDING_SYSTEM_HANDLER(SystemHandler));
\r
601 /* Get the System Handler pending bit position */
\r
602 tmp = SystemHandler & (u32)0x1F;
\r
603 /* Set the corresponding System Handler pending bit */
\r
604 SCB->IRQControlState |= ((u32)0x01 << tmp);
\r
607 /*******************************************************************************
\r
608 * Function Name : NVIC_ClearSystemHandlerPendingBit
\r
609 * Description : Clears System Handler pending bit.
\r
610 * Input : - SystemHandler: specifies the system handler pending bit to
\r
612 * This parameter can be one of the following values:
\r
613 * - SystemHandler_PSV
\r
614 * - SystemHandler_SysTick
\r
617 *******************************************************************************/
\r
618 void NVIC_ClearSystemHandlerPendingBit(u32 SystemHandler)
\r
622 /* Check the parameters */
\r
623 assert(IS_CLEAR_SYSTEM_HANDLER(SystemHandler));
\r
625 /* Get the System Handler pending bit position */
\r
626 tmp = SystemHandler & (u32)0x1F;
\r
627 /* Clear the corresponding System Handler pending bit */
\r
628 SCB->IRQControlState |= ((u32)0x01 << (tmp - 0x01));
\r
631 /*******************************************************************************
\r
632 * Function Name : NVIC_GetSystemHandlerActiveBitStatus
\r
633 * Description : Checks whether the specified System handlers active bit is
\r
635 * Input : - SystemHandler: specifies the system handler active bit to
\r
637 * This parameter can be one of the following values:
\r
638 * - SystemHandler_MemoryManage
\r
639 * - SystemHandler_BusFault
\r
640 * - SystemHandler_UsageFault
\r
641 * - SystemHandler_SVCall
\r
642 * - SystemHandler_DebugMonitor
\r
643 * - SystemHandler_PSV
\r
644 * - SystemHandler_SysTick
\r
646 * Return : The new state of System Handler active bit(SET or RESET).
\r
647 *******************************************************************************/
\r
648 ITStatus NVIC_GetSystemHandlerActiveBitStatus(u32 SystemHandler)
\r
650 ITStatus bitstatus = RESET;
\r
652 u32 tmp = 0x00, tmppos = 0x00;
\r
654 /* Check the parameters */
\r
655 assert(IS_GET_ACTIVE_SYSTEM_HANDLER(SystemHandler));
\r
657 tmppos = (SystemHandler >> 0x0E) & (u32)0x0F;
\r
659 tmppos = (u32)0x01 << tmppos;
\r
661 tmp = SCB->SysHandlerCtrl & tmppos;
\r
674 /*******************************************************************************
\r
675 * Function Name : NVIC_GetFaultHandlerSources
\r
676 * Description : Returns the system fault handlers sources.
\r
677 * Input : - SystemHandler: specifies the system handler to get its fault
\r
679 * This parameter can be one of the following values:
\r
680 * - SystemHandler_HardFault
\r
681 * - SystemHandler_MemoryManage
\r
682 * - SystemHandler_BusFault
\r
683 * - SystemHandler_UsageFault
\r
684 * - SystemHandler_DebugMonitor
\r
686 * Return : Source of the fault handler.
\r
687 *******************************************************************************/
\r
688 u32 NVIC_GetFaultHandlerSources(u32 SystemHandler)
\r
690 u32 faultsources = 0x00;
\r
691 u32 tmpreg = 0x00, tmppos = 0x00;
\r
693 /* Check the parameters */
\r
694 assert(IS_FAULT_SOURCE_SYSTEM_HANDLER(SystemHandler));
\r
696 tmpreg = (SystemHandler >> 0x12) & (u32)0x03;
\r
697 tmppos = (SystemHandler >> 0x14) & (u32)0x03;
\r
699 if (tmpreg == 0x00)
\r
701 faultsources = SCB->HardFaultStatus;
\r
703 else if (tmpreg == 0x01)
\r
705 faultsources = SCB->ConfigFaultStatus >> (tmppos * 0x08);
\r
706 if (tmppos != 0x02)
\r
708 faultsources &= (u32)0x0F;
\r
712 faultsources &= (u32)0xFF;
\r
717 faultsources = SCB->DebugFaultStatus;
\r
719 return faultsources;
\r
722 /*******************************************************************************
\r
723 * Function Name : NVIC_GetFaultAddress
\r
724 * Description : Returns the address of the location that generated a fault
\r
726 * Input : - SystemHandler: specifies the system handler to get its
\r
728 * This parameter can be one of the following values:
\r
729 * - SystemHandler_MemoryManage
\r
730 * - SystemHandler_BusFault
\r
732 * Return : Fault address.
\r
733 *******************************************************************************/
\r
734 u32 NVIC_GetFaultAddress(u32 SystemHandler)
\r
736 u32 faultaddress = 0x00;
\r
739 /* Check the parameters */
\r
740 assert(IS_FAULT_ADDRESS_SYSTEM_HANDLER(SystemHandler));
\r
742 tmp = (SystemHandler >> 0x16) & (u32)0x01;
\r
746 faultaddress = SCB->MemoryManageFaultAddr;
\r
750 faultaddress = SCB->BusFaultAddr;
\r
752 return faultaddress;
\r
755 /******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/
\r