stm32f10x_nvic.c
上传用户:yj_qqy
上传日期:2017-01-28
资源大小:2911k
文件大小:28k
源码类别:

uCOS

开发平台:

C/C++

  1. /******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
  2. * File Name          : stm32f10x_nvic.c
  3. * Author             : MCD Application Team
  4. * Version            : V2.0.2
  5. * Date               : 07/11/2008
  6. * Description        : This file provides all the NVIC firmware functions.
  7. ********************************************************************************
  8. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  9. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
  10. * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
  11. * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
  12. * CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
  13. * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  14. *******************************************************************************/
  15. /* Includes ------------------------------------------------------------------*/
  16. #include "stm32f10x_nvic.h"
  17. /* Private typedef -----------------------------------------------------------*/
  18. /* Private define ------------------------------------------------------------*/
  19. #define AIRCR_VECTKEY_MASK    ((u32)0x05FA0000)
  20. /* Private macro -------------------------------------------------------------*/
  21. /* Private variables ---------------------------------------------------------*/
  22. /* Private function prototypes -----------------------------------------------*/
  23. /* Private functions ---------------------------------------------------------*/
  24. /*******************************************************************************
  25. * Function Name  : NVIC_DeInit
  26. * Description    : Deinitializes the NVIC peripheral registers to their default
  27. *                  reset values.
  28. * Input          : None
  29. * Output         : None
  30. * Return         : None
  31. *******************************************************************************/
  32. void NVIC_DeInit(void)
  33. {
  34.   u32 index = 0;
  35.   
  36.   NVIC->ICER[0] = 0xFFFFFFFF;
  37.   NVIC->ICER[1] = 0x0FFFFFFF;
  38.   NVIC->ICPR[0] = 0xFFFFFFFF;
  39.   NVIC->ICPR[1] = 0x0FFFFFFF;
  40.   
  41.   for(index = 0; index < 0x0F; index++)
  42.   {
  43.      NVIC->IPR[index] = 0x00000000;
  44.   } 
  45. }
  46. /*******************************************************************************
  47. * Function Name  : NVIC_SCBDeInit
  48. * Description    : Deinitializes the SCB peripheral registers to their default 
  49. *                  reset values.
  50. * Input          : None
  51. * Output         : None
  52. * Return         : None
  53. *******************************************************************************/
  54. void NVIC_SCBDeInit(void)
  55. {
  56.   u32 index = 0x00;
  57.   
  58.   SCB->ICSR = 0x0A000000;
  59.   SCB->VTOR = 0x00000000;
  60.   SCB->AIRCR = AIRCR_VECTKEY_MASK;
  61.   SCB->SCR = 0x00000000;
  62.   SCB->CCR = 0x00000000;
  63.   for(index = 0; index < 0x03; index++)
  64.   {
  65.      SCB->SHPR[index] = 0;
  66.   }
  67.   SCB->SHCSR = 0x00000000;
  68.   SCB->CFSR = 0xFFFFFFFF;
  69.   SCB->HFSR = 0xFFFFFFFF;
  70.   SCB->DFSR = 0xFFFFFFFF;
  71. }
  72. /*******************************************************************************
  73. * Function Name  : NVIC_PriorityGroupConfig
  74. * Description    : Configures the priority grouping: pre-emption priority
  75. *                  and subpriority.
  76. * Input          : - NVIC_PriorityGroup: specifies the priority grouping bits
  77. *                    length. This parameter can be one of the following values:
  78. *                       - NVIC_PriorityGroup_0: 0 bits for pre-emption priority
  79. *                         4 bits for subpriority
  80. *                       - NVIC_PriorityGroup_1: 1 bits for pre-emption priority
  81. *                         3 bits for subpriority
  82. *                       - NVIC_PriorityGroup_2: 2 bits for pre-emption priority
  83. *                         2 bits for subpriority
  84. *                       - NVIC_PriorityGroup_3: 3 bits for pre-emption priority
  85. *                         1 bits for subpriority
  86. *                       - NVIC_PriorityGroup_4: 4 bits for pre-emption priority
  87. *                         0 bits for subpriority
  88. * Output         : None
  89. * Return         : None
  90. *******************************************************************************/
  91. void NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup)
  92. {
  93.   /* Check the parameters */
  94.   assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
  95.   
  96.   /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
  97.   SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
  98. }
  99. /*******************************************************************************
  100. * Function Name  : NVIC_Init
  101. * Description    : Initializes the NVIC peripheral according to the specified
  102. *                  parameters in the NVIC_InitStruct.
  103. * Input          : - NVIC_InitStruct: pointer to a NVIC_InitTypeDef structure
  104. *                    that contains the configuration information for the
  105. *                    specified NVIC peripheral.
  106. * Output         : None
  107. * Return         : None
  108. *******************************************************************************/
  109. void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
  110. {
  111.   u32 tmppriority = 0x00, tmpreg = 0x00, tmpmask = 0x00;
  112.   u32 tmppre = 0, tmpsub = 0x0F;
  113.   /* Check the parameters */
  114.   assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd));
  115.   assert_param(IS_NVIC_IRQ_CHANNEL(NVIC_InitStruct->NVIC_IRQChannel));
  116.   assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority));  
  117.   assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));
  118.     
  119.   if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
  120.   {
  121.     /* Compute the Corresponding IRQ Priority --------------------------------*/    
  122.     tmppriority = (0x700 - (SCB->AIRCR & (u32)0x700))>> 0x08;
  123.     tmppre = (0x4 - tmppriority);
  124.     tmpsub = tmpsub >> tmppriority;
  125.     
  126.     tmppriority = (u32)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
  127.     tmppriority |=  NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub;
  128.     tmppriority = tmppriority << 0x04;
  129.     tmppriority = ((u32)tmppriority) << ((NVIC_InitStruct->NVIC_IRQChannel & (u8)0x03) * 0x08);
  130.     
  131.     tmpreg = NVIC->IPR[(NVIC_InitStruct->NVIC_IRQChannel >> 0x02)];
  132.     tmpmask = (u32)0xFF << ((NVIC_InitStruct->NVIC_IRQChannel & (u8)0x03) * 0x08);
  133.     tmpreg &= ~tmpmask;
  134.     tmppriority &= tmpmask;  
  135.     tmpreg |= tmppriority;
  136.     NVIC->IPR[(NVIC_InitStruct->NVIC_IRQChannel >> 0x02)] = tmpreg;
  137.     
  138.     /* Enable the Selected IRQ Channels --------------------------------------*/
  139.     NVIC->ISER[(NVIC_InitStruct->NVIC_IRQChannel >> 0x05)] =
  140.       (u32)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (u8)0x1F);
  141.   }
  142.   else
  143.   {
  144.     /* Disable the Selected IRQ Channels -------------------------------------*/
  145.     NVIC->ICER[(NVIC_InitStruct->NVIC_IRQChannel >> 0x05)] =
  146.       (u32)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (u8)0x1F);
  147.   }
  148. }
  149. /*******************************************************************************
  150. * Function Name  : NVIC_StructInit
  151. * Description    : Fills each NVIC_InitStruct member with its default value.
  152. * Input          : - NVIC_InitStruct: pointer to a NVIC_InitTypeDef structure which
  153. *                    will be initialized.
  154. * Output         : None
  155. * Return         : None
  156. *******************************************************************************/
  157. void NVIC_StructInit(NVIC_InitTypeDef* NVIC_InitStruct)
  158. {
  159.   /* NVIC_InitStruct members default value */
  160.   NVIC_InitStruct->NVIC_IRQChannel = 0x00;
  161.   NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority = 0x00;
  162.   NVIC_InitStruct->NVIC_IRQChannelSubPriority = 0x00;
  163.   NVIC_InitStruct->NVIC_IRQChannelCmd = DISABLE;
  164. }
  165. /*******************************************************************************
  166. * Function Name  : NVIC_SETPRIMASK
  167. * Description    : Enables the PRIMASK priority: Raises the execution priority to 0.
  168. * Input          : None
  169. * Output         : None
  170. * Return         : None
  171. *******************************************************************************/
  172. void NVIC_SETPRIMASK(void)
  173. {
  174.   __SETPRIMASK();
  175. }
  176. /*******************************************************************************
  177. * Function Name  : NVIC_RESETPRIMASK
  178. * Description    : Disables the PRIMASK priority.
  179. * Input          : None
  180. * Output         : None
  181. * Return         : None
  182. *******************************************************************************/
  183. void NVIC_RESETPRIMASK(void)
  184. {
  185.   __RESETPRIMASK();
  186. }
  187. /*******************************************************************************
  188. * Function Name  : NVIC_SETFAULTMASK
  189. * Description    : Enables the FAULTMASK priority: Raises the execution priority to -1.
  190. * Input          : None
  191. * Output         : None
  192. * Return         : None
  193. *******************************************************************************/
  194. void NVIC_SETFAULTMASK(void)
  195. {
  196.   __SETFAULTMASK();
  197. }
  198. /*******************************************************************************
  199. * Function Name  : NVIC_RESETFAULTMASK
  200. * Description    : Disables the FAULTMASK priority.
  201. * Input          : None
  202. * Output         : None
  203. * Return         : None
  204. *******************************************************************************/
  205. void NVIC_RESETFAULTMASK(void)
  206. {
  207.   __RESETFAULTMASK();
  208. }
  209. /*******************************************************************************
  210. * Function Name  : NVIC_BASEPRICONFIG
  211. * Description    : The execution priority can be changed from 15 (lowest 
  212.                    configurable priority) to 1. Writing a zero  value will disable 
  213. *                  the mask of execution priority.
  214. * Input          : None
  215. * Output         : None
  216. * Return         : None
  217. *******************************************************************************/
  218. void NVIC_BASEPRICONFIG(u32 NewPriority)
  219. {
  220.   /* Check the parameters */
  221.   assert_param(IS_NVIC_BASE_PRI(NewPriority));
  222.   
  223.   __BASEPRICONFIG(NewPriority << 0x04);
  224. }
  225. /*******************************************************************************
  226. * Function Name  : NVIC_GetBASEPRI
  227. * Description    : Returns the BASEPRI mask value.
  228. * Input          : None
  229. * Output         : None
  230. * Return         : BASEPRI register value
  231. *******************************************************************************/
  232. u32 NVIC_GetBASEPRI(void)
  233. {
  234.   return (__GetBASEPRI());
  235. }
  236. /*******************************************************************************
  237. * Function Name  : NVIC_GetCurrentPendingIRQChannel
  238. * Description    : Returns the current pending IRQ channel identifier.
  239. * Input          : None
  240. * Output         : None
  241. * Return         : Pending IRQ Channel Identifier.
  242. *******************************************************************************/
  243. u16 NVIC_GetCurrentPendingIRQChannel(void)
  244. {
  245.   return ((u16)((SCB->ICSR & (u32)0x003FF000) >> 0x0C));
  246. }
  247. /*******************************************************************************
  248. * Function Name  : NVIC_GetIRQChannelPendingBitStatus
  249. * Description    : Checks whether the specified IRQ Channel pending bit is set
  250. *                  or not.
  251. * Input          : - NVIC_IRQChannel: specifies the interrupt pending bit to check.
  252. * Output         : None
  253. * Return         : The new state of IRQ Channel pending bit(SET or RESET).
  254. *******************************************************************************/
  255. ITStatus NVIC_GetIRQChannelPendingBitStatus(u8 NVIC_IRQChannel)
  256. {
  257.   ITStatus pendingirqstatus = RESET;
  258.   u32 tmp = 0x00;
  259.   
  260.   /* Check the parameters */
  261.   assert_param(IS_NVIC_IRQ_CHANNEL(NVIC_IRQChannel));
  262.   
  263.   tmp = ((u32)0x01 << (NVIC_IRQChannel & (u32)0x1F));
  264.   if (((NVIC->ISPR[(NVIC_IRQChannel >> 0x05)]) & tmp) == tmp)
  265.   {
  266.     pendingirqstatus = SET;
  267.   }
  268.   else
  269.   {
  270.     pendingirqstatus = RESET;
  271.   }
  272.   return pendingirqstatus;
  273. }
  274. /*******************************************************************************
  275. * Function Name  : NVIC_SetIRQChannelPendingBit
  276. * Description    : Sets the NVIC抯 interrupt pending bit.
  277. * Input          : - NVIC_IRQChannel: specifies the interrupt pending bit to Set.
  278. * Output         : None
  279. * Return         : None
  280. *******************************************************************************/
  281. void NVIC_SetIRQChannelPendingBit(u8 NVIC_IRQChannel)
  282. {
  283.   /* Check the parameters */
  284.   assert_param(IS_NVIC_IRQ_CHANNEL(NVIC_IRQChannel));
  285.   
  286.   *(vu32*) 0xE000EF00 = (u32)NVIC_IRQChannel;
  287. }
  288. /*******************************************************************************
  289. * Function Name  : NVIC_ClearIRQChannelPendingBit
  290. * Description    : Clears the NVIC抯 interrupt pending bit.
  291. * Input          : - NVIC_IRQChannel: specifies the interrupt pending bit to clear.
  292. * Output         : None
  293. * Return         : None
  294. *******************************************************************************/
  295. void NVIC_ClearIRQChannelPendingBit(u8 NVIC_IRQChannel)
  296. {
  297.   /* Check the parameters */
  298.   assert_param(IS_NVIC_IRQ_CHANNEL(NVIC_IRQChannel));
  299.   
  300.   NVIC->ICPR[(NVIC_IRQChannel >> 0x05)] = (u32)0x01 << (NVIC_IRQChannel & (u32)0x1F);
  301. }
  302. /*******************************************************************************
  303. * Function Name  : NVIC_GetCurrentActiveHandler
  304. * Description    : Returns the current active Handler (IRQ Channel and
  305. *                  SystemHandler) identifier.
  306. * Input          : None
  307. * Output         : None
  308. * Return         : Active Handler Identifier.
  309. *******************************************************************************/
  310. u16 NVIC_GetCurrentActiveHandler(void)
  311. {
  312.   return ((u16)(SCB->ICSR & (u32)0x3FF));
  313. }
  314. /*******************************************************************************
  315. * Function Name  : NVIC_GetIRQChannelActiveBitStatus
  316. * Description    : Checks whether the specified IRQ Channel active bit is set
  317. *                  or not.
  318. * Input          : - NVIC_IRQChannel: specifies the interrupt active bit to check.
  319. * Output         : None
  320. * Return         : The new state of IRQ Channel active bit(SET or RESET).
  321. *******************************************************************************/
  322. ITStatus NVIC_GetIRQChannelActiveBitStatus(u8 NVIC_IRQChannel)
  323. {
  324.   ITStatus activeirqstatus = RESET;
  325.   u32 tmp = 0x00;
  326.   /* Check the parameters */
  327.   assert_param(IS_NVIC_IRQ_CHANNEL(NVIC_IRQChannel));
  328.   
  329.   tmp = ((u32)0x01 << (NVIC_IRQChannel & (u32)0x1F));
  330.   if (((NVIC->IABR[(NVIC_IRQChannel >> 0x05)]) & tmp) == tmp )
  331.   {
  332.     activeirqstatus = SET;
  333.   }
  334.   else
  335.   {
  336.     activeirqstatus = RESET;
  337.   }
  338.   return activeirqstatus;
  339. }
  340. /*******************************************************************************
  341. * Function Name  : NVIC_GetCPUID
  342. * Description    : Returns the ID number, the version number and the implementation
  343. *                  details of the Cortex-M3 core.
  344. * Input          : None
  345. * Output         : None
  346. * Return         : CPU ID.
  347. *******************************************************************************/
  348. u32 NVIC_GetCPUID(void)
  349. {
  350.   return (SCB->CPUID);
  351. }
  352. /*******************************************************************************
  353. * Function Name  : NVIC_SetVectorTable
  354. * Description    : Sets the vector table location and Offset.
  355. * Input          : - NVIC_VectTab: specifies if the vector table is in RAM or
  356. *                    FLASH memory.
  357. *                    This parameter can be one of the following values:
  358. *                       - NVIC_VectTab_RAM
  359. *                       - NVIC_VectTab_FLASH
  360. *                  - Offset: Vector Table base offset field. 
  361. *                            This value must be a multiple of 0x100.
  362. * Output         : None
  363. * Return         : None
  364. *******************************************************************************/
  365. void NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset)
  366.   /* Check the parameters */
  367.   assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
  368.   assert_param(IS_NVIC_OFFSET(Offset));  
  369.    
  370.   SCB->VTOR = NVIC_VectTab | (Offset & (u32)0x1FFFFF80);
  371. }
  372. /*******************************************************************************
  373. * Function Name  : NVIC_GenerateSystemReset
  374. * Description    : Generates a system reset.
  375. * Input          : None
  376. * Output         : None
  377. * Return         : None
  378. *******************************************************************************/
  379. void NVIC_GenerateSystemReset(void)
  380. {
  381.   SCB->AIRCR = AIRCR_VECTKEY_MASK | (u32)0x04;
  382. }
  383. /*******************************************************************************
  384. * Function Name  : NVIC_GenerateCoreReset
  385. * Description    : Generates a Core (Core + NVIC) reset.
  386. * Input          : None
  387. * Output         : None
  388. * Return         : None
  389. *******************************************************************************/
  390. void NVIC_GenerateCoreReset(void)
  391. {
  392.   SCB->AIRCR = AIRCR_VECTKEY_MASK | (u32)0x01;
  393. }
  394. /*******************************************************************************
  395. * Function Name  : NVIC_SystemLPConfig
  396. * Description    : Selects the condition for the system to enter low power mode.
  397. * Input          : - LowPowerMode: Specifies the new mode for the system to enter
  398. *                    low power mode.
  399. *                    This parameter can be one of the following values:
  400. *                       - NVIC_LP_SEVONPEND
  401. *                       - NVIC_LP_SLEEPDEEP
  402. *                       - NVIC_LP_SLEEPONEXIT
  403. *                  - NewState: new state of LP condition.
  404. *                    This parameter can be: ENABLE or DISABLE.
  405. * Output         : None
  406. * Return         : None
  407. *******************************************************************************/
  408. void NVIC_SystemLPConfig(u8 LowPowerMode, FunctionalState NewState)
  409. {
  410.   /* Check the parameters */
  411.   assert_param(IS_NVIC_LP(LowPowerMode));
  412.   assert_param(IS_FUNCTIONAL_STATE(NewState));  
  413.   
  414.   if (NewState != DISABLE)
  415.   {
  416.     SCB->SCR |= LowPowerMode;
  417.   }
  418.   else
  419.   {
  420.     SCB->SCR &= (u32)(~(u32)LowPowerMode);
  421.   }
  422. }
  423. /*******************************************************************************
  424. * Function Name  : NVIC_SystemHandlerConfig
  425. * Description    : Enables or disables the specified System Handlers.
  426. * Input          : - SystemHandler: specifies the system handler to be enabled
  427. *                    or disabled.
  428. *                    This parameter can be one of the following values:
  429. *                       - SystemHandler_MemoryManage
  430. *                       - SystemHandler_BusFault
  431. *                       - SystemHandler_UsageFault
  432. *                  - NewState: new state of  specified System Handlers.
  433. *                    This parameter can be: ENABLE or DISABLE.
  434. * Output         : None
  435. * Return         : None
  436. *******************************************************************************/
  437. void NVIC_SystemHandlerConfig(u32 SystemHandler, FunctionalState NewState)
  438. {
  439.   u32 tmpreg = 0x00;
  440.   /* Check the parameters */
  441.   assert_param(IS_CONFIG_SYSTEM_HANDLER(SystemHandler));
  442.   assert_param(IS_FUNCTIONAL_STATE(NewState)); 
  443.   
  444.   tmpreg =  (u32)0x01 << (SystemHandler & (u32)0x1F);
  445.   if (NewState != DISABLE)
  446.   {
  447.     SCB->SHCSR |= tmpreg;
  448.   }
  449.   else
  450.   {
  451.     SCB->SHCSR &= ~tmpreg;
  452.   }
  453. }
  454. /*******************************************************************************
  455. * Function Name  : NVIC_SystemHandlerPriorityConfig
  456. * Description    : Configures the specified System Handlers priority.
  457. * Input          : - SystemHandler: specifies the system handler to be
  458. *                    enabled or disabled.
  459. *                    This parameter can be one of the following values:
  460. *                       - SystemHandler_MemoryManage
  461. *                       - SystemHandler_BusFault
  462. *                       - SystemHandler_UsageFault
  463. *                       - SystemHandler_SVCall
  464. *                       - SystemHandler_DebugMonitor
  465. *                       - SystemHandler_PSV
  466. *                       - SystemHandler_SysTick
  467. *                  - SystemHandlerPreemptionPriority: new priority group of the
  468. *                    specified system handlers.
  469. *                  - SystemHandlerSubPriority: new sub priority of the specified
  470. *                    system handlers.
  471. * Output         : None
  472. * Return         : None
  473. *******************************************************************************/
  474. void NVIC_SystemHandlerPriorityConfig(u32 SystemHandler, u8 SystemHandlerPreemptionPriority,
  475.                                       u8 SystemHandlerSubPriority)
  476. {
  477.   u32 tmp1 = 0x00, tmp2 = 0xFF, handlermask = 0x00;
  478.   u32 tmppriority = 0x00;
  479.   /* Check the parameters */
  480.   assert_param(IS_PRIORITY_SYSTEM_HANDLER(SystemHandler));
  481.   assert_param(IS_NVIC_PREEMPTION_PRIORITY(SystemHandlerPreemptionPriority));  
  482.   assert_param(IS_NVIC_SUB_PRIORITY(SystemHandlerSubPriority));
  483.     
  484.   tmppriority = (0x700 - (SCB->AIRCR & (u32)0x700))>> 0x08;
  485.   tmp1 = (0x4 - tmppriority);
  486.   tmp2 = tmp2 >> tmppriority;
  487.     
  488.   tmppriority = (u32)SystemHandlerPreemptionPriority << tmp1;
  489.   tmppriority |=  SystemHandlerSubPriority & tmp2;
  490.   tmppriority = tmppriority << 0x04;
  491.   tmp1 = SystemHandler & (u32)0xC0;
  492.   tmp1 = tmp1 >> 0x06; 
  493.   tmp2 = (SystemHandler >> 0x08) & (u32)0x03;
  494.   tmppriority = tmppriority << (tmp2 * 0x08);
  495.   handlermask = (u32)0xFF << (tmp2 * 0x08);
  496.   
  497.   SCB->SHPR[tmp1] &= ~handlermask;
  498.   SCB->SHPR[tmp1] |= tmppriority;
  499. }
  500. /*******************************************************************************
  501. * Function Name  : NVIC_GetSystemHandlerPendingBitStatus
  502. * Description    : Checks whether the specified System handlers pending bit is
  503. *                  set or not.
  504. * Input          : - SystemHandler: specifies the system handler pending bit to
  505. *                    check.
  506. *                    This parameter can be one of the following values:
  507. *                       - SystemHandler_MemoryManage
  508. *                       - SystemHandler_BusFault
  509. *                       - SystemHandler_SVCall
  510. * Output         : None
  511. * Return         : The new state of System Handler pending bit(SET or RESET).
  512. *******************************************************************************/
  513. ITStatus NVIC_GetSystemHandlerPendingBitStatus(u32 SystemHandler)
  514. {
  515.   ITStatus bitstatus  = RESET;
  516.   u32 tmp = 0x00, tmppos = 0x00;
  517.   /* Check the parameters */
  518.   assert_param(IS_GET_PENDING_SYSTEM_HANDLER(SystemHandler));
  519.   
  520.   tmppos = (SystemHandler >> 0x0A);
  521.   tmppos &= (u32)0x0F;
  522.   tmppos = (u32)0x01 << tmppos;
  523.   tmp = SCB->SHCSR & tmppos;
  524.   if (tmp == tmppos)
  525.   {
  526.     bitstatus = SET;
  527.   }
  528.   else
  529.   {
  530.     bitstatus = RESET;
  531.   }
  532.   return bitstatus;
  533. }
  534. /*******************************************************************************
  535. * Function Name  : NVIC_SetSystemHandlerPendingBit
  536. * Description    : Sets System Handler pending bit.
  537. * Input          : - SystemHandler: specifies the system handler pending bit
  538. *                    to be set.
  539. *                    This parameter can be one of the following values:
  540. *                       - SystemHandler_NMI
  541. *                       - SystemHandler_PSV
  542. *                       - SystemHandler_SysTick
  543. * Output         : None
  544. * Return         : None
  545. *******************************************************************************/
  546. void NVIC_SetSystemHandlerPendingBit(u32 SystemHandler)
  547. {
  548.   u32 tmp = 0x00;
  549.   /* Check the parameters */
  550.   assert_param(IS_SET_PENDING_SYSTEM_HANDLER(SystemHandler));
  551.   
  552.   /* Get the System Handler pending bit position */
  553.   tmp = SystemHandler & (u32)0x1F;
  554.   /* Set the corresponding System Handler pending bit */
  555.   SCB->ICSR |= ((u32)0x01 << tmp);
  556. }
  557. /*******************************************************************************
  558. * Function Name  : NVIC_ClearSystemHandlerPendingBit
  559. * Description    : Clears System Handler pending bit.
  560. * Input          : - SystemHandler: specifies the system handler pending bit to
  561. *                    be clear.
  562. *                    This parameter can be one of the following values:
  563. *                       - SystemHandler_PSV
  564. *                       - SystemHandler_SysTick
  565. * Output         : None
  566. * Return         : None
  567. *******************************************************************************/
  568. void NVIC_ClearSystemHandlerPendingBit(u32 SystemHandler)
  569. {
  570.   u32 tmp = 0x00;
  571.   /* Check the parameters */
  572.   assert_param(IS_CLEAR_SYSTEM_HANDLER(SystemHandler));
  573.   
  574.   /* Get the System Handler pending bit position */
  575.   tmp = SystemHandler & (u32)0x1F;
  576.   /* Clear the corresponding System Handler pending bit */
  577.   SCB->ICSR |= ((u32)0x01 << (tmp - 0x01));
  578. }
  579. /*******************************************************************************
  580. * Function Name  : NVIC_GetSystemHandlerActiveBitStatus
  581. * Description    : Checks whether the specified System handlers active bit is
  582. *                  set or not.
  583. * Input          : - SystemHandler: specifies the system handler active bit to
  584. *                    check.
  585. *                    This parameter can be one of the following values:
  586. *                       - SystemHandler_MemoryManage
  587. *                       - SystemHandler_BusFault
  588. *                       - SystemHandler_UsageFault
  589. *                       - SystemHandler_SVCall
  590. *                       - SystemHandler_DebugMonitor
  591. *                       - SystemHandler_PSV
  592. *                       - SystemHandler_SysTick
  593. * Output         : None
  594. * Return         : The new state of System Handler active bit(SET or RESET).
  595. *******************************************************************************/
  596. ITStatus NVIC_GetSystemHandlerActiveBitStatus(u32 SystemHandler)
  597. {
  598.   ITStatus bitstatus  = RESET;
  599.   u32 tmp = 0x00, tmppos = 0x00;
  600.   /* Check the parameters */
  601.   assert_param(IS_GET_ACTIVE_SYSTEM_HANDLER(SystemHandler));
  602.   
  603.   tmppos = (SystemHandler >> 0x0E) & (u32)0x0F;
  604.   tmppos = (u32)0x01 << tmppos;
  605.   tmp = SCB->SHCSR & tmppos;
  606.   if (tmp == tmppos)
  607.   {
  608.     bitstatus = SET;
  609.   }
  610.   else
  611.   {
  612.     bitstatus = RESET;
  613.   }
  614.   return bitstatus;
  615. }
  616. /*******************************************************************************
  617. * Function Name  : NVIC_GetFaultHandlerSources
  618. * Description    : Returns the system fault handlers sources.
  619. * Input          : - SystemHandler: specifies the system handler to get its fault
  620. *                    sources.
  621. *                    This parameter can be one of the following values:
  622. *                       - SystemHandler_HardFault
  623. *                       - SystemHandler_MemoryManage
  624. *                       - SystemHandler_BusFault
  625. *                       - SystemHandler_UsageFault
  626. *                       - SystemHandler_DebugMonitor
  627. * Output         : None
  628. * Return         : Source of the fault handler.
  629. *******************************************************************************/
  630. u32 NVIC_GetFaultHandlerSources(u32 SystemHandler)
  631. {
  632.   u32 faultsources = 0x00;
  633.   u32 tmpreg = 0x00, tmppos = 0x00;
  634.   /* Check the parameters */
  635.   assert_param(IS_FAULT_SOURCE_SYSTEM_HANDLER(SystemHandler));
  636.   
  637.   tmpreg = (SystemHandler >> 0x12) & (u32)0x03;
  638.   tmppos = (SystemHandler >> 0x14) & (u32)0x03;
  639.   if (tmpreg == 0x00)
  640.   {
  641.     faultsources = SCB->HFSR;
  642.   }
  643.   else if (tmpreg == 0x01)
  644.   {
  645.     faultsources = SCB->CFSR >> (tmppos * 0x08);
  646.     if (tmppos != 0x02)
  647.     {
  648.       faultsources &= (u32)0x0F;
  649.     }
  650.     else
  651.     {
  652.       faultsources &= (u32)0xFF;
  653.     }
  654.   }
  655.   else
  656.   {
  657.     faultsources = SCB->DFSR;
  658.   }
  659.   return faultsources;
  660. }
  661. /*******************************************************************************
  662. * Function Name  : NVIC_GetFaultAddress
  663. * Description    : Returns the address of the location that generated a fault
  664. *                  handler.
  665. * Input          : - SystemHandler: specifies the system handler to get its
  666. *                    fault address.
  667. *                    This parameter can be one of the following values:
  668. *                       - SystemHandler_MemoryManage
  669. *                       - SystemHandler_BusFault
  670. * Output         : None
  671. * Return         : Fault address.
  672. *******************************************************************************/
  673. u32 NVIC_GetFaultAddress(u32 SystemHandler)
  674. {
  675.   u32 faultaddress = 0x00;
  676.   u32 tmp = 0x00;
  677.   /* Check the parameters */
  678.   assert_param(IS_FAULT_ADDRESS_SYSTEM_HANDLER(SystemHandler));
  679.   
  680.   tmp = (SystemHandler >> 0x16) & (u32)0x01;
  681.   if (tmp == 0x00)
  682.   {
  683.     faultaddress = SCB->MMFAR;
  684.   }
  685.   else
  686.   {
  687.     faultaddress = SCB->BFAR;
  688.   }
  689.   return faultaddress;
  690. }
  691. /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/