[FL-2392] FuriHal: refactor interrupts subsystem (#1066)
* FuriHal: refactor interrupts subsystem * Furi,FuriHal: gather all ISRs under interrupt API, improve crtitical section and cleanup garbage * FuriHal: mirgate ipcc and hsem to LL * Format Sources * FuriHal,BleGlue: move to new critical section * Format Sources * FuriHal: correct flash locking * FuriHal: replace critical section with interrupt disable in OS routine, minor fixex
This commit is contained in:
		| @@ -1,11 +0,0 @@ | ||||
| #include "main.h" | ||||
|  | ||||
| void HAL_MspInit(void) { | ||||
|     HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0); | ||||
|  | ||||
|     HAL_NVIC_SetPriority(RCC_IRQn, 5, 0); | ||||
|     HAL_NVIC_EnableIRQ(RCC_IRQn); | ||||
|  | ||||
|     HAL_NVIC_SetPriority(HSEM_IRQn, 5, 0); | ||||
|     HAL_NVIC_EnableIRQ(HSEM_IRQn); | ||||
| } | ||||
| @@ -1,31 +0,0 @@ | ||||
| #include "main.h" | ||||
| #include "stm32wbxx_it.h" | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
| #include "usbd_core.h" | ||||
|  | ||||
| extern usbd_device udev; | ||||
|  | ||||
| extern void HW_TS_RTC_Wakeup_Handler(); | ||||
| extern void HW_IPCC_Tx_Handler(); | ||||
| extern void HW_IPCC_Rx_Handler(); | ||||
|  | ||||
| void SysTick_Handler(void) { | ||||
|     HAL_IncTick(); | ||||
| } | ||||
|  | ||||
| void USB_LP_IRQHandler(void) { | ||||
|     usbd_poll(&udev); | ||||
| } | ||||
|  | ||||
| void HSEM_IRQHandler(void) { | ||||
|     HAL_HSEM_IRQHandler(); | ||||
| } | ||||
|  | ||||
| void IPCC_C1_TX_IRQHandler(void) { | ||||
|     HW_IPCC_Tx_Handler(); | ||||
| } | ||||
|  | ||||
| void IPCC_C1_RX_IRQHandler(void) { | ||||
|     HW_IPCC_Rx_Handler(); | ||||
| } | ||||
| @@ -1,126 +1,5 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    system_stm32wbxx.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   CMSIS Cortex Device Peripheral Access Layer System Source File | ||||
|   * | ||||
|   *   This file provides two functions and one global variable to be called from | ||||
|   *   user application: | ||||
|   *      - SystemInit(): This function is called at startup just after reset and | ||||
|   *                      before branch to main program. This call is made inside | ||||
|   *                      the "startup_stm32wbxx.s" file. | ||||
|   * | ||||
|   *      - SystemCoreClock variable: Contains the core clock (HCLK), it can be used | ||||
|   *                                  by the user application to setup the SysTick | ||||
|   *                                  timer or configure other parameters. | ||||
|   * | ||||
|   *      - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must | ||||
|   *                                 be called whenever the core clock is changed | ||||
|   *                                 during program execution. | ||||
|   * | ||||
|   *   After each device reset the MSI (4 MHz) is used as system clock source. | ||||
|   *   Then SystemInit() function is called, in "startup_stm32wbxx.s" file, to | ||||
|   *   configure the system clock before to branch to main program. | ||||
|   * | ||||
|   *   This file configures the system clock as follows: | ||||
|   *============================================================================= | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        System Clock source                    | MSI | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        SYSCLK(Hz)                             | 4000000 | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        HCLK(Hz)                               | 4000000 | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        AHB Prescaler                          | 1 | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        APB1 Prescaler                         | 1 | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        APB2 Prescaler                         | 1 | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        PLL_M                                  | 1 | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        PLL_N                                  | 8 | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        PLL_P                                  | 7 | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        PLL_Q                                  | 2 | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        PLL_R                                  | 2 | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        PLLSAI1_P                              | NA | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        PLLSAI1_Q                              | NA | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        PLLSAI1_R                              | NA | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *        Require 48MHz for USB OTG FS,          | Disabled | ||||
|   *        SDIO and RNG clock                     | | ||||
|   *----------------------------------------------------------------------------- | ||||
|   *============================================================================= | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2019 STMicroelectronics.  | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under BSD 3-Clause license, | ||||
|   * the "License"; You may not use this file except in compliance with the  | ||||
|   * License. You may obtain a copy of the License at: | ||||
|   *                        opensource.org/licenses/BSD-3-Clause | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup CMSIS | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup stm32WBxx_system | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup stm32WBxx_System_Private_Includes | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #include "stm32wbxx.h" | ||||
|  | ||||
| #if !defined(HSE_VALUE) | ||||
| #define HSE_VALUE (32000000UL) /*!< Value of the External oscillator in Hz */ | ||||
| #endif /* HSE_VALUE */ | ||||
|  | ||||
| #if !defined(MSI_VALUE) | ||||
| #define MSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/ | ||||
| #endif /* MSI_VALUE */ | ||||
|  | ||||
| #if !defined(HSI_VALUE) | ||||
| #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/ | ||||
| #endif /* HSI_VALUE */ | ||||
|  | ||||
| #if !defined(LSI_VALUE) | ||||
| #define LSI_VALUE (32000UL) /*!< Value of LSI in Hz*/ | ||||
| #endif /* LSI_VALUE */ | ||||
|  | ||||
| #if !defined(LSE_VALUE) | ||||
| #define LSE_VALUE (32768UL) /*!< Value of LSE in Hz*/ | ||||
| #endif /* LSE_VALUE */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup STM32WBxx_System_Private_TypesDefinitions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup STM32WBxx_System_Private_Defines | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /*!< Uncomment the following line if you need to relocate your vector Table in | ||||
|      Internal SRAM. */ | ||||
| /* #define VECT_TAB_SRAM */ | ||||
| @@ -131,21 +10,7 @@ | ||||
| #define VECT_TAB_BASE_ADDRESS \ | ||||
|     SRAM1_BASE /*!< Vector Table base offset field. | ||||
|                                                      This value must be a multiple of 0x200. */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup STM32WBxx_System_Private_Macros | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup STM32WBxx_System_Private_Variables | ||||
|   * @{ | ||||
|   */ | ||||
| /* The SystemCoreClock variable is updated in three ways: | ||||
|       1) by calling CMSIS function SystemCoreClockUpdate() | ||||
|       2) by calling HAL API function HAL_RCC_GetHCLKFreq() | ||||
| @@ -179,30 +44,6 @@ const uint32_t MSIRangeTable[16UL] = { | ||||
|     0UL, | ||||
|     0UL}; /* 0UL values are incorrect cases */ | ||||
|  | ||||
| #if defined(STM32WB55xx) || defined(STM32WB5Mxx) || defined(STM32WB35xx) | ||||
| const uint32_t SmpsPrescalerTable[4UL][6UL] = { | ||||
|     {1UL, 3UL, 2UL, 2UL, 1UL, 2UL}, | ||||
|     {2UL, 6UL, 4UL, 3UL, 2UL, 4UL}, | ||||
|     {4UL, 12UL, 8UL, 6UL, 4UL, 8UL}, | ||||
|     {4UL, 12UL, 8UL, 6UL, 4UL, 8UL}}; | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup STM32WBxx_System_Private_FunctionPrototypes | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup STM32WBxx_System_Private_Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Setup the microcontroller system. | ||||
|   * @param  None | ||||
| @@ -254,118 +95,3 @@ void SystemInit(void) { | ||||
|     /* Disable all interrupts */ | ||||
|     RCC->CIER = 0x00000000; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Update SystemCoreClock variable according to Clock Register Values. | ||||
|   *         The SystemCoreClock variable contains the core clock (HCLK), it can | ||||
|   *         be used by the user application to setup the SysTick timer or configure | ||||
|   *         other parameters. | ||||
|   * | ||||
|   * @note   Each time the core clock (HCLK) changes, this function must be called | ||||
|   *         to update SystemCoreClock variable value. Otherwise, any configuration | ||||
|   *         based on this variable will be incorrect. | ||||
|   * | ||||
|   * @note   - The system frequency computed by this function is not the real | ||||
|   *           frequency in the chip. It is calculated based on the predefined | ||||
|   *           constant and the selected clock source: | ||||
|   * | ||||
|   *           - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*) | ||||
|   * | ||||
|   *           - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**) | ||||
|   * | ||||
|   *           - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***) | ||||
|   * | ||||
|   *           - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***) | ||||
|   *             or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors. | ||||
|   * | ||||
|   *         (*) MSI_VALUE is a constant defined in stm32wbxx_hal.h file (default value | ||||
|   *             4 MHz) but the real value may vary depending on the variations | ||||
|   *             in voltage and temperature. | ||||
|   * | ||||
|   *         (**) HSI_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value | ||||
|   *              16 MHz) but the real value may vary depending on the variations | ||||
|   *              in voltage and temperature. | ||||
|   * | ||||
|   *         (***) HSE_VALUE is a constant defined in stm32wbxx_hal_conf.h file (default value | ||||
|   *              32 MHz), user has to ensure that HSE_VALUE is same as the real | ||||
|   *              frequency of the crystal used. Otherwise, this function may | ||||
|   *              have wrong result. | ||||
|   * | ||||
|   *         - The result of this function could be not correct when using fractional | ||||
|   *           value for HSE crystal. | ||||
|   * | ||||
|   * @param  None | ||||
|   * @retval None | ||||
|   */ | ||||
| void SystemCoreClockUpdate(void) { | ||||
|     uint32_t tmp, msirange, pllvco, pllr, pllsource, pllm; | ||||
|  | ||||
|     /* Get MSI Range frequency--------------------------------------------------*/ | ||||
|  | ||||
|     /*MSI frequency range in Hz*/ | ||||
|     msirange = MSIRangeTable[(RCC->CR & RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos]; | ||||
|  | ||||
|     /* Get SYSCLK source -------------------------------------------------------*/ | ||||
|     switch(RCC->CFGR & RCC_CFGR_SWS) { | ||||
|     case 0x00: /* MSI used as system clock source */ | ||||
|         SystemCoreClock = msirange; | ||||
|         break; | ||||
|  | ||||
|     case 0x04: /* HSI used as system clock source */ | ||||
|         /* HSI used as system clock source */ | ||||
|         SystemCoreClock = HSI_VALUE; | ||||
|         break; | ||||
|  | ||||
|     case 0x08: /* HSE used as system clock source */ | ||||
|         SystemCoreClock = HSE_VALUE; | ||||
|         break; | ||||
|  | ||||
|     case 0x0C: /* PLL used as system clock  source */ | ||||
|         /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN | ||||
|          SYSCLK = PLL_VCO / PLLR | ||||
|          */ | ||||
|         pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); | ||||
|         pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1UL; | ||||
|  | ||||
|         if(pllsource == 0x02UL) /* HSI used as PLL clock source */ | ||||
|         { | ||||
|             pllvco = (HSI_VALUE / pllm); | ||||
|         } else if(pllsource == 0x03UL) /* HSE used as PLL clock source */ | ||||
|         { | ||||
|             pllvco = (HSE_VALUE / pllm); | ||||
|         } else /* MSI used as PLL clock source */ | ||||
|         { | ||||
|             pllvco = (msirange / pllm); | ||||
|         } | ||||
|  | ||||
|         pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); | ||||
|         pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1UL); | ||||
|  | ||||
|         SystemCoreClock = pllvco / pllr; | ||||
|         break; | ||||
|  | ||||
|     default: | ||||
|         SystemCoreClock = msirange; | ||||
|         break; | ||||
|     } | ||||
|  | ||||
|     /* Compute HCLK clock frequency --------------------------------------------*/ | ||||
|     /* Get HCLK1 prescaler */ | ||||
|     tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)]; | ||||
|     /* HCLK clock frequency */ | ||||
|     SystemCoreClock = SystemCoreClock / tmp; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user