Subversion Repositories dashGPS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /**
  2.   ******************************************************************************
  3.   * @file    stm32f1xx_hal_cortex.c
  4.   * @author  MCD Application Team
  5.   * @brief   CORTEX HAL module driver.
  6.   *          This file provides firmware functions to manage the following
  7.   *          functionalities of the CORTEX:
  8.   *           + Initialization and de-initialization functions
  9.   *           + Peripheral Control functions
  10.   *
  11.   @verbatim  
  12.   ==============================================================================
  13.                         ##### How to use this driver #####
  14.   ==============================================================================
  15.  
  16.     [..]  
  17.     *** How to configure Interrupts using CORTEX HAL driver ***
  18.     ===========================================================
  19.     [..]    
  20.     This section provides functions allowing to configure the NVIC interrupts (IRQ).
  21.     The Cortex-M3 exceptions are managed by CMSIS functions.
  22.    
  23.     (#) Configure the NVIC Priority Grouping using HAL_NVIC_SetPriorityGrouping()
  24.         function according to the following table.
  25.     (#) Configure the priority of the selected IRQ Channels using HAL_NVIC_SetPriority().
  26.     (#) Enable the selected IRQ Channels using HAL_NVIC_EnableIRQ().
  27.     (#) please refer to programming manual for details in how to configure priority.
  28.      
  29.      -@- When the NVIC_PRIORITYGROUP_0 is selected, IRQ preemption is no more possible.
  30.          The pending IRQ priority will be managed only by the sub priority.
  31.    
  32.      -@- IRQ priority order (sorted by highest to lowest priority):
  33.         (+@) Lowest preemption priority
  34.         (+@) Lowest sub priority
  35.         (+@) Lowest hardware priority (IRQ number)
  36.  
  37.     [..]  
  38.     *** How to configure Systick using CORTEX HAL driver ***
  39.     ========================================================
  40.     [..]
  41.     Setup SysTick Timer for time base.
  42.            
  43.    (+) The HAL_SYSTICK_Config()function calls the SysTick_Config() function which
  44.        is a CMSIS function that:
  45.         (++) Configures the SysTick Reload register with value passed as function parameter.
  46.         (++) Configures the SysTick IRQ priority to the lowest value 0x0F.
  47.         (++) Resets the SysTick Counter register.
  48.         (++) Configures the SysTick Counter clock source to be Core Clock Source (HCLK).
  49.         (++) Enables the SysTick Interrupt.
  50.         (++) Starts the SysTick Counter.
  51.    
  52.    (+) You can change the SysTick Clock source to be HCLK_Div8 by calling the macro
  53.        __HAL_CORTEX_SYSTICKCLK_CONFIG(SYSTICK_CLKSOURCE_HCLK_DIV8) just after the
  54.        HAL_SYSTICK_Config() function call. The __HAL_CORTEX_SYSTICKCLK_CONFIG() macro is defined
  55.        inside the stm32f1xx_hal_cortex.h file.
  56.  
  57.    (+) You can change the SysTick IRQ priority by calling the
  58.        HAL_NVIC_SetPriority(SysTick_IRQn,...) function just after the HAL_SYSTICK_Config() function
  59.        call. The HAL_NVIC_SetPriority() call the NVIC_SetPriority() function which is a CMSIS function.
  60.  
  61.    (+) To adjust the SysTick time base, use the following formula:
  62.                            
  63.        Reload Value = SysTick Counter Clock (Hz) x  Desired Time base (s)
  64.        (++) Reload Value is the parameter to be passed for HAL_SYSTICK_Config() function
  65.        (++) Reload Value should not exceed 0xFFFFFF
  66.    
  67.   @endverbatim
  68.   ******************************************************************************
  69.   * @attention
  70.   *
  71.   * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
  72.   * All rights reserved.</center></h2>
  73.   *
  74.   * This software component is licensed by ST under BSD 3-Clause license,
  75.   * the "License"; You may not use this file except in compliance with the
  76.   * License. You may obtain a copy of the License at:
  77.   *                        opensource.org/licenses/BSD-3-Clause
  78.   *
  79.   ******************************************************************************
  80.   */
  81.  
  82. /* Includes ------------------------------------------------------------------*/
  83. #include "stm32f1xx_hal.h"
  84.  
  85. /** @addtogroup STM32F1xx_HAL_Driver
  86.   * @{
  87.   */
  88.  
  89. /** @defgroup CORTEX CORTEX
  90.   * @brief CORTEX HAL module driver
  91.   * @{
  92.   */
  93.  
  94. #ifdef HAL_CORTEX_MODULE_ENABLED
  95.  
  96. /* Private types -------------------------------------------------------------*/
  97. /* Private variables ---------------------------------------------------------*/
  98. /* Private constants ---------------------------------------------------------*/
  99. /* Private macros ------------------------------------------------------------*/
  100. /* Private functions ---------------------------------------------------------*/
  101. /* Exported functions --------------------------------------------------------*/
  102.  
  103. /** @defgroup CORTEX_Exported_Functions CORTEX Exported Functions
  104.   * @{
  105.   */
  106.  
  107.  
  108. /** @defgroup CORTEX_Exported_Functions_Group1 Initialization and de-initialization functions
  109.   *  @brief    Initialization and Configuration functions
  110.   *
  111. @verbatim    
  112.   ==============================================================================
  113.               ##### Initialization and de-initialization functions #####
  114.   ==============================================================================
  115.     [..]
  116.       This section provides the CORTEX HAL driver functions allowing to configure Interrupts
  117.       Systick functionalities
  118.  
  119. @endverbatim
  120.   * @{
  121.   */
  122.  
  123.  
  124. /**
  125.   * @brief  Sets the priority grouping field (preemption priority and subpriority)
  126.   *         using the required unlock sequence.
  127.   * @param  PriorityGroup: The priority grouping bits length.
  128.   *         This parameter can be one of the following values:
  129.   *         @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority
  130.   *                                    4 bits for subpriority
  131.   *         @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority
  132.   *                                    3 bits for subpriority
  133.   *         @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority
  134.   *                                    2 bits for subpriority
  135.   *         @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority
  136.   *                                    1 bits for subpriority
  137.   *         @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority
  138.   *                                    0 bits for subpriority
  139.   * @note   When the NVIC_PriorityGroup_0 is selected, IRQ preemption is no more possible.
  140.   *         The pending IRQ priority will be managed only by the subpriority.
  141.   * @retval None
  142.   */
  143. void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
  144. {
  145.   /* Check the parameters */
  146.   assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup));
  147.  
  148.   /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */
  149.   NVIC_SetPriorityGrouping(PriorityGroup);
  150. }
  151.  
  152. /**
  153.   * @brief  Sets the priority of an interrupt.
  154.   * @param  IRQn: External interrupt number.
  155.   *         This parameter can be an enumerator of IRQn_Type enumeration
  156.   *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f10xx.h))
  157.   * @param  PreemptPriority: The preemption priority for the IRQn channel.
  158.   *         This parameter can be a value between 0 and 15
  159.   *         A lower priority value indicates a higher priority
  160.   * @param  SubPriority: the subpriority level for the IRQ channel.
  161.   *         This parameter can be a value between 0 and 15
  162.   *         A lower priority value indicates a higher priority.          
  163.   * @retval None
  164.   */
  165. void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
  166. {
  167.   uint32_t prioritygroup = 0x00U;
  168.  
  169.   /* Check the parameters */
  170.   assert_param(IS_NVIC_SUB_PRIORITY(SubPriority));
  171.   assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority));
  172.  
  173.   prioritygroup = NVIC_GetPriorityGrouping();
  174.  
  175.   NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority));
  176. }
  177.  
  178. /**
  179.   * @brief  Enables a device specific interrupt in the NVIC interrupt controller.
  180.   * @note   To configure interrupts priority correctly, the NVIC_PriorityGroupConfig()
  181.   *         function should be called before.
  182.   * @param  IRQn External interrupt number.
  183.   *         This parameter can be an enumerator of IRQn_Type enumeration
  184.   *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f10xxx.h))
  185.   * @retval None
  186.   */
  187. void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
  188. {
  189.   /* Check the parameters */
  190.   assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
  191.  
  192.   /* Enable interrupt */
  193.   NVIC_EnableIRQ(IRQn);
  194. }
  195.  
  196. /**
  197.   * @brief  Disables a device specific interrupt in the NVIC interrupt controller.
  198.   * @param  IRQn External interrupt number.
  199.   *         This parameter can be an enumerator of IRQn_Type enumeration
  200.   *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f10xxx.h))  
  201.   * @retval None
  202.   */
  203. void HAL_NVIC_DisableIRQ(IRQn_Type IRQn)
  204. {
  205.   /* Check the parameters */
  206.   assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
  207.  
  208.   /* Disable interrupt */
  209.   NVIC_DisableIRQ(IRQn);
  210. }
  211.  
  212. /**
  213.   * @brief  Initiates a system reset request to reset the MCU.
  214.   * @retval None
  215.   */
  216. void HAL_NVIC_SystemReset(void)
  217. {
  218.   /* System Reset */
  219.   NVIC_SystemReset();
  220. }
  221.  
  222. /**
  223.   * @brief  Initializes the System Timer and its interrupt, and starts the System Tick Timer.
  224.   *         Counter is in free running mode to generate periodic interrupts.
  225.   * @param  TicksNumb: Specifies the ticks Number of ticks between two interrupts.
  226.   * @retval status:  - 0  Function succeeded.
  227.   *                  - 1  Function failed.
  228.   */
  229. uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb)
  230. {
  231.    return SysTick_Config(TicksNumb);
  232. }
  233. /**
  234.   * @}
  235.   */
  236.  
  237. /** @defgroup CORTEX_Exported_Functions_Group2 Peripheral Control functions
  238.   *  @brief   Cortex control functions
  239.   *
  240. @verbatim  
  241.   ==============================================================================
  242.                       ##### Peripheral Control functions #####
  243.   ==============================================================================
  244.     [..]
  245.       This subsection provides a set of functions allowing to control the CORTEX
  246.       (NVIC, SYSTICK, MPU) functionalities.
  247.  
  248.      
  249. @endverbatim
  250.   * @{
  251.   */
  252.  
  253. #if (__MPU_PRESENT == 1U)
  254. /**
  255.   * @brief  Disables the MPU
  256.   * @retval None
  257.   */
  258. void HAL_MPU_Disable(void)
  259. {
  260.   /* Make sure outstanding transfers are done */
  261.   __DMB();
  262.  
  263.   /* Disable fault exceptions */
  264.   SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;
  265.  
  266.   /* Disable the MPU and clear the control register*/
  267.   MPU->CTRL = 0U;
  268. }
  269.  
  270. /**
  271.   * @brief  Enable the MPU.
  272.   * @param  MPU_Control: Specifies the control mode of the MPU during hard fault,
  273.   *          NMI, FAULTMASK and privileged access to the default memory
  274.   *          This parameter can be one of the following values:
  275.   *            @arg MPU_HFNMI_PRIVDEF_NONE
  276.   *            @arg MPU_HARDFAULT_NMI
  277.   *            @arg MPU_PRIVILEGED_DEFAULT
  278.   *            @arg MPU_HFNMI_PRIVDEF
  279.   * @retval None
  280.   */
  281. void HAL_MPU_Enable(uint32_t MPU_Control)
  282. {
  283.   /* Enable the MPU */
  284.   MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk;
  285.  
  286.   /* Enable fault exceptions */
  287.   SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
  288.  
  289.   /* Ensure MPU setting take effects */
  290.   __DSB();
  291.   __ISB();
  292. }
  293.  
  294. /**
  295.   * @brief  Initializes and configures the Region and the memory to be protected.
  296.   * @param  MPU_Init: Pointer to a MPU_Region_InitTypeDef structure that contains
  297.   *                the initialization and configuration information.
  298.   * @retval None
  299.   */
  300. void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init)
  301. {
  302.   /* Check the parameters */
  303.   assert_param(IS_MPU_REGION_NUMBER(MPU_Init->Number));
  304.   assert_param(IS_MPU_REGION_ENABLE(MPU_Init->Enable));
  305.  
  306.   /* Set the Region number */
  307.   MPU->RNR = MPU_Init->Number;
  308.  
  309.   if ((MPU_Init->Enable) != RESET)
  310.   {
  311.     /* Check the parameters */
  312.     assert_param(IS_MPU_INSTRUCTION_ACCESS(MPU_Init->DisableExec));
  313.     assert_param(IS_MPU_REGION_PERMISSION_ATTRIBUTE(MPU_Init->AccessPermission));
  314.     assert_param(IS_MPU_TEX_LEVEL(MPU_Init->TypeExtField));
  315.     assert_param(IS_MPU_ACCESS_SHAREABLE(MPU_Init->IsShareable));
  316.     assert_param(IS_MPU_ACCESS_CACHEABLE(MPU_Init->IsCacheable));
  317.     assert_param(IS_MPU_ACCESS_BUFFERABLE(MPU_Init->IsBufferable));
  318.     assert_param(IS_MPU_SUB_REGION_DISABLE(MPU_Init->SubRegionDisable));
  319.     assert_param(IS_MPU_REGION_SIZE(MPU_Init->Size));
  320.    
  321.     MPU->RBAR = MPU_Init->BaseAddress;
  322.     MPU->RASR = ((uint32_t)MPU_Init->DisableExec             << MPU_RASR_XN_Pos)   |
  323.                 ((uint32_t)MPU_Init->AccessPermission        << MPU_RASR_AP_Pos)   |
  324.                 ((uint32_t)MPU_Init->TypeExtField            << MPU_RASR_TEX_Pos)  |
  325.                 ((uint32_t)MPU_Init->IsShareable             << MPU_RASR_S_Pos)    |
  326.                 ((uint32_t)MPU_Init->IsCacheable             << MPU_RASR_C_Pos)    |
  327.                 ((uint32_t)MPU_Init->IsBufferable            << MPU_RASR_B_Pos)    |
  328.                 ((uint32_t)MPU_Init->SubRegionDisable        << MPU_RASR_SRD_Pos)  |
  329.                 ((uint32_t)MPU_Init->Size                    << MPU_RASR_SIZE_Pos) |
  330.                 ((uint32_t)MPU_Init->Enable                  << MPU_RASR_ENABLE_Pos);
  331.   }
  332.   else
  333.   {
  334.     MPU->RBAR = 0x00U;
  335.     MPU->RASR = 0x00U;
  336.   }
  337. }
  338. #endif /* __MPU_PRESENT */
  339.  
  340. /**
  341.   * @brief  Gets the priority grouping field from the NVIC Interrupt Controller.
  342.   * @retval Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field)
  343.   */
  344. uint32_t HAL_NVIC_GetPriorityGrouping(void)
  345. {
  346.   /* Get the PRIGROUP[10:8] field value */
  347.   return NVIC_GetPriorityGrouping();
  348. }
  349.  
  350. /**
  351.   * @brief  Gets the priority of an interrupt.
  352.   * @param  IRQn: External interrupt number.
  353.   *         This parameter can be an enumerator of IRQn_Type enumeration
  354.   *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f10xxx.h))
  355.   * @param   PriorityGroup: the priority grouping bits length.
  356.   *         This parameter can be one of the following values:
  357.   *           @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority
  358.   *                                      4 bits for subpriority
  359.   *           @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority
  360.   *                                      3 bits for subpriority
  361.   *           @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority
  362.   *                                      2 bits for subpriority
  363.   *           @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority
  364.   *                                      1 bits for subpriority
  365.   *           @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority
  366.   *                                      0 bits for subpriority
  367.   * @param  pPreemptPriority: Pointer on the Preemptive priority value (starting from 0).
  368.   * @param  pSubPriority: Pointer on the Subpriority value (starting from 0).
  369.   * @retval None
  370.   */
  371. void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t *pPreemptPriority, uint32_t *pSubPriority)
  372. {
  373.   /* Check the parameters */
  374.   assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup));
  375.  /* Get priority for Cortex-M system or device specific interrupts */
  376.   NVIC_DecodePriority(NVIC_GetPriority(IRQn), PriorityGroup, pPreemptPriority, pSubPriority);
  377. }
  378.  
  379. /**
  380.   * @brief  Sets Pending bit of an external interrupt.
  381.   * @param  IRQn External interrupt number
  382.   *         This parameter can be an enumerator of IRQn_Type enumeration
  383.   *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f10xxx.h))  
  384.   * @retval None
  385.   */
  386. void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn)
  387. {
  388.   /* Check the parameters */
  389.   assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
  390.  
  391.   /* Set interrupt pending */
  392.   NVIC_SetPendingIRQ(IRQn);
  393. }
  394.  
  395. /**
  396.   * @brief  Gets Pending Interrupt (reads the pending register in the NVIC
  397.   *         and returns the pending bit for the specified interrupt).
  398.   * @param  IRQn External interrupt number.
  399.   *         This parameter can be an enumerator of IRQn_Type enumeration
  400.   *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f10xxx.h))  
  401.   * @retval status: - 0  Interrupt status is not pending.
  402.   *                 - 1  Interrupt status is pending.
  403.   */
  404. uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn)
  405. {
  406.   /* Check the parameters */
  407.   assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
  408.  
  409.   /* Return 1 if pending else 0 */
  410.   return NVIC_GetPendingIRQ(IRQn);
  411. }
  412.  
  413. /**
  414.   * @brief  Clears the pending bit of an external interrupt.
  415.   * @param  IRQn External interrupt number.
  416.   *         This parameter can be an enumerator of IRQn_Type enumeration
  417.   *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f10xxx.h))  
  418.   * @retval None
  419.   */
  420. void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn)
  421. {
  422.   /* Check the parameters */
  423.   assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
  424.  
  425.   /* Clear pending interrupt */
  426.   NVIC_ClearPendingIRQ(IRQn);
  427. }
  428.  
  429. /**
  430.   * @brief Gets active interrupt ( reads the active register in NVIC and returns the active bit).
  431.   * @param IRQn External interrupt number
  432.   *         This parameter can be an enumerator of IRQn_Type enumeration
  433.   *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f10xxx.h))  
  434.   * @retval status: - 0  Interrupt status is not pending.
  435.   *                 - 1  Interrupt status is pending.
  436.   */
  437. uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn)
  438. {
  439.   /* Check the parameters */
  440.   assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
  441.  
  442.   /* Return 1 if active else 0 */
  443.   return NVIC_GetActive(IRQn);
  444. }
  445.  
  446. /**
  447.   * @brief  Configures the SysTick clock source.
  448.   * @param  CLKSource: specifies the SysTick clock source.
  449.   *         This parameter can be one of the following values:
  450.   *             @arg SYSTICK_CLKSOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock source.
  451.   *             @arg SYSTICK_CLKSOURCE_HCLK: AHB clock selected as SysTick clock source.
  452.   * @retval None
  453.   */
  454. void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource)
  455. {
  456.   /* Check the parameters */
  457.   assert_param(IS_SYSTICK_CLK_SOURCE(CLKSource));
  458.   if (CLKSource == SYSTICK_CLKSOURCE_HCLK)
  459.   {
  460.     SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK;
  461.   }
  462.   else
  463.   {
  464.     SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK;
  465.   }
  466. }
  467.  
  468. /**
  469.   * @brief  This function handles SYSTICK interrupt request.
  470.   * @retval None
  471.   */
  472. void HAL_SYSTICK_IRQHandler(void)
  473. {
  474.   HAL_SYSTICK_Callback();
  475. }
  476.  
  477. /**
  478.   * @brief  SYSTICK callback.
  479.   * @retval None
  480.   */
  481. __weak void HAL_SYSTICK_Callback(void)
  482. {
  483.   /* NOTE : This function Should not be modified, when the callback is needed,
  484.             the HAL_SYSTICK_Callback could be implemented in the user file
  485.    */
  486. }
  487.  
  488. /**
  489.   * @}
  490.   */
  491.  
  492. /**
  493.   * @}
  494.   */
  495.  
  496. #endif /* HAL_CORTEX_MODULE_ENABLED */
  497. /**
  498.   * @}
  499.   */
  500.  
  501. /**
  502.   * @}
  503.   */
  504.  
  505. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
  506.