Initial commit
This commit is contained in:
		
							
								
								
									
										619
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										619
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,619 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32f7xx_hal.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   HAL module driver. | ||||
|   *          This is the common part of the HAL initialization | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * Copyright (c) 2017 STMicroelectronics. | ||||
|   * All rights reserved. | ||||
|   * | ||||
|   * This software is licensed under terms that can be found in the LICENSE file | ||||
|   * in the root directory of this software component. | ||||
|   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   @verbatim | ||||
|   ============================================================================== | ||||
|                      ##### How to use this driver ##### | ||||
|   ============================================================================== | ||||
|     [..] | ||||
|     The common HAL driver contains a set of generic and common APIs that can be | ||||
|     used by the PPP peripheral drivers and the user to start using the HAL.  | ||||
|     [..] | ||||
|     The HAL contains two APIs' categories:  | ||||
|          (+) Common HAL APIs | ||||
|          (+) Services HAL APIs | ||||
|  | ||||
|   @endverbatim | ||||
|   ****************************************************************************** | ||||
|   */  | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32f7xx_hal.h" | ||||
|  | ||||
| /** @addtogroup STM32F7xx_HAL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup HAL HAL | ||||
|   * @brief HAL module driver. | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private define ------------------------------------------------------------*/ | ||||
| /** @addtogroup HAL_Private_Constants | ||||
|   * @{ | ||||
|   */ | ||||
| /** | ||||
|  * @brief STM32F7xx HAL Driver version number V1.2.10 | ||||
|    */ | ||||
| #define __STM32F7xx_HAL_VERSION_MAIN   (0x01) /*!< [31:24] main version */ | ||||
| #define __STM32F7xx_HAL_VERSION_SUB1   (0x02) /*!< [23:16] sub1 version */ | ||||
| #define __STM32F7xx_HAL_VERSION_SUB2   (0x0A) /*!< [15:8]  sub2 version */ | ||||
| #define __STM32F7xx_HAL_VERSION_RC     (0x00) /*!< [7:0]  release candidate */  | ||||
| #define __STM32F7xx_HAL_VERSION         ((__STM32F7xx_HAL_VERSION_MAIN << 24)\ | ||||
|                                         |(__STM32F7xx_HAL_VERSION_SUB1 << 16)\ | ||||
|                                         |(__STM32F7xx_HAL_VERSION_SUB2 << 8 )\ | ||||
|                                         |(__STM32F7xx_HAL_VERSION_RC)) | ||||
|                                          | ||||
| #define IDCODE_DEVID_MASK    ((uint32_t)0x00000FFF) | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Private macro -------------------------------------------------------------*/ | ||||
| /* Exported variables ---------------------------------------------------------*/ | ||||
| /** @addtogroup HAL_Exported_Variables | ||||
|   * @{ | ||||
|   */ | ||||
| __IO uint32_t uwTick; | ||||
| uint32_t uwTickPrio   = (1UL << __NVIC_PRIO_BITS); /* Invalid PRIO */ | ||||
| HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT;  /* 1KHz */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /* Private functions ---------------------------------------------------------*/ | ||||
|  | ||||
| /** @defgroup HAL_Exported_Functions HAL Exported Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup HAL_Exported_Functions_Group1 Initialization and de-initialization Functions  | ||||
|  *  @brief    Initialization and de-initialization functions | ||||
|  * | ||||
| @verbatim     | ||||
|  =============================================================================== | ||||
|               ##### Initialization and Configuration functions ##### | ||||
|  =============================================================================== | ||||
|     [..]  This section provides functions allowing to: | ||||
|       (+) Initializes the Flash interface the NVIC allocation and initial clock  | ||||
|           configuration. It initializes the systick also when timeout is needed  | ||||
|           and the backup domain when enabled. | ||||
|       (+) De-Initializes common part of the HAL. | ||||
|       (+) Configure the time base source to have 1ms time base with a dedicated  | ||||
|           Tick interrupt priority.  | ||||
|         (++) SysTick timer is used by default as source of time base, but user | ||||
|              can eventually implement his proper time base source (a general purpose  | ||||
|              timer for example or other time source), keeping in mind that Time base  | ||||
|              duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and  | ||||
|              handled in milliseconds basis. | ||||
|         (++) Time base configuration function (HAL_InitTick ()) is called automatically  | ||||
|              at the beginning of the program after reset by HAL_Init() or at any time  | ||||
|              when clock is configured, by HAL_RCC_ClockConfig().  | ||||
|         (++) Source of time base is configured  to generate interrupts at regular  | ||||
|              time intervals. Care must be taken if HAL_Delay() is called from a  | ||||
|              peripheral ISR process, the Tick interrupt line must have higher priority  | ||||
|             (numerically lower) than the peripheral interrupt. Otherwise the caller  | ||||
|             ISR process will be blocked.  | ||||
|        (++) functions affecting time base configurations are declared as __weak   | ||||
|              to make  override possible  in case of other  implementations in user file. | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  This function is used to initialize the HAL Library; it must be the first  | ||||
|   *         instruction to be executed in the main program (before to call any other | ||||
|   *         HAL function), it performs the following: | ||||
|   *           Configure the Flash prefetch, and instruction cache through ART accelerator. | ||||
|   *           Configures the SysTick to generate an interrupt each 1 millisecond, | ||||
|   *           which is clocked by the HSI (at this stage, the clock is not yet | ||||
|   *           configured and thus the system is running from the internal HSI at 16 MHz). | ||||
|   *           Set NVIC Group Priority to 4. | ||||
|   *           Calls the HAL_MspInit() callback function defined in user file  | ||||
|   *           "stm32f7xx_hal_msp.c" to do the global low level hardware initialization  | ||||
|   *             | ||||
|   * @note   SysTick is used as time base for the HAL_Delay() function, the application | ||||
|   *         need to ensure that the SysTick time base is always set to 1 millisecond | ||||
|   *         to have correct HAL operation. | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_Init(void) | ||||
| { | ||||
|   /* Configure Instruction cache through ART accelerator */  | ||||
| #if (ART_ACCLERATOR_ENABLE != 0) | ||||
|   __HAL_FLASH_ART_ENABLE(); | ||||
| #endif /* ART_ACCLERATOR_ENABLE */ | ||||
|  | ||||
|   /* Configure Flash prefetch */ | ||||
| #if (PREFETCH_ENABLE != 0U) | ||||
|   __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); | ||||
| #endif /* PREFETCH_ENABLE */ | ||||
|  | ||||
|   /* Set Interrupt Group Priority */ | ||||
|   HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); | ||||
|  | ||||
|   /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */ | ||||
|   HAL_InitTick(TICK_INT_PRIORITY); | ||||
|  | ||||
|   /* Init the low level hardware */ | ||||
|   HAL_MspInit(); | ||||
|  | ||||
|   /* Return function status */ | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  This function de-Initializes common part of the HAL and stops the systick. | ||||
|   *         This function is optional.    | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_DeInit(void) | ||||
| { | ||||
|   /* Reset of all peripherals */ | ||||
|   __HAL_RCC_APB1_FORCE_RESET(); | ||||
|   __HAL_RCC_APB1_RELEASE_RESET(); | ||||
|  | ||||
|   __HAL_RCC_APB2_FORCE_RESET(); | ||||
|   __HAL_RCC_APB2_RELEASE_RESET(); | ||||
|  | ||||
|   __HAL_RCC_AHB1_FORCE_RESET(); | ||||
|   __HAL_RCC_AHB1_RELEASE_RESET(); | ||||
|  | ||||
|   __HAL_RCC_AHB2_FORCE_RESET(); | ||||
|   __HAL_RCC_AHB2_RELEASE_RESET(); | ||||
|  | ||||
|   __HAL_RCC_AHB3_FORCE_RESET(); | ||||
|   __HAL_RCC_AHB3_RELEASE_RESET(); | ||||
|  | ||||
|   /* De-Init the low level hardware */ | ||||
|   HAL_MspDeInit(); | ||||
|  | ||||
|   /* Return function status */ | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Initialize the MSP. | ||||
|   * @retval None | ||||
|   */ | ||||
| __weak void HAL_MspInit(void) | ||||
| { | ||||
|   /* NOTE : This function should not be modified, when the callback is needed, | ||||
|             the HAL_MspInit could be implemented in the user file | ||||
|    */ | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  DeInitializes the MSP. | ||||
|   * @retval None | ||||
|   */ | ||||
| __weak void HAL_MspDeInit(void) | ||||
| { | ||||
|   /* NOTE : This function should not be modified, when the callback is needed, | ||||
|             the HAL_MspDeInit could be implemented in the user file | ||||
|    */  | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief This function configures the source of the time base. | ||||
|   *        The time source is configured  to have 1ms time base with a dedicated  | ||||
|   *        Tick interrupt priority. | ||||
|   * @note This function is called  automatically at the beginning of program after | ||||
|   *       reset by HAL_Init() or at any time when clock is reconfigured  by HAL_RCC_ClockConfig(). | ||||
|   * @note In the default implementation, SysTick timer is the source of time base.  | ||||
|   *       It is used to generate interrupts at regular time intervals.  | ||||
|   *       Care must be taken if HAL_Delay() is called from a peripheral ISR process,  | ||||
|   *       The SysTick interrupt must have higher priority (numerically lower) | ||||
|   *       than the peripheral interrupt. Otherwise the caller ISR process will be blocked. | ||||
|   *       The function is declared as __weak  to be overwritten  in case of other | ||||
|   *       implementation  in user file. | ||||
|   * @param TickPriority Tick interrupt priority. | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| __weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) | ||||
| { | ||||
|   /* Configure the SysTick to have interrupt in 1ms time basis*/ | ||||
|   if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U) | ||||
|   { | ||||
|     return HAL_ERROR; | ||||
|   } | ||||
|  | ||||
|   /* Configure the SysTick IRQ priority */ | ||||
|   if (TickPriority < (1UL << __NVIC_PRIO_BITS)) | ||||
|   { | ||||
|     HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U); | ||||
|     uwTickPrio = TickPriority; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return HAL_ERROR; | ||||
|   } | ||||
|  | ||||
|   /* Return function status */ | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup HAL_Exported_Functions_Group2 HAL Control functions  | ||||
|  *  @brief    HAL Control functions | ||||
|  * | ||||
| @verbatim | ||||
|  =============================================================================== | ||||
|                       ##### HAL Control functions ##### | ||||
|  =============================================================================== | ||||
|     [..]  This section provides functions allowing to: | ||||
|       (+) Provide a tick value in millisecond | ||||
|       (+) Provide a blocking delay in millisecond | ||||
|       (+) Suspend the time base source interrupt | ||||
|       (+) Resume the time base source interrupt | ||||
|       (+) Get the HAL API driver version | ||||
|       (+) Get the device identifier | ||||
|       (+) Get the device revision identifier | ||||
|       (+) Enable/Disable Debug module during SLEEP mode | ||||
|       (+) Enable/Disable Debug module during STOP mode | ||||
|       (+) Enable/Disable Debug module during STANDBY mode | ||||
|  | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief This function is called to increment  a global variable "uwTick" | ||||
|   *        used as application time base. | ||||
|   * @note In the default implementation, this variable is incremented each 1ms | ||||
|   *       in SysTick ISR. | ||||
|  * @note This function is declared as __weak to be overwritten in case of other  | ||||
|   *      implementations in user file. | ||||
|   * @retval None | ||||
|   */ | ||||
| __weak void HAL_IncTick(void) | ||||
| { | ||||
|   uwTick += uwTickFreq; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Provides a tick value in millisecond. | ||||
|   * @note This function is declared as __weak to be overwritten in case of other  | ||||
|   *       implementations in user file. | ||||
|   * @retval tick value | ||||
|   */ | ||||
| __weak uint32_t HAL_GetTick(void) | ||||
| { | ||||
|   return uwTick; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief This function returns a tick priority. | ||||
|   * @retval tick priority | ||||
|   */ | ||||
| uint32_t HAL_GetTickPrio(void) | ||||
| { | ||||
|   return uwTickPrio; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Set new tick Freq. | ||||
|   * @retval Status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq) | ||||
| { | ||||
|   HAL_StatusTypeDef status  = HAL_OK; | ||||
|   HAL_TickFreqTypeDef prevTickFreq; | ||||
|  | ||||
|   assert_param(IS_TICKFREQ(Freq)); | ||||
|  | ||||
|   if (uwTickFreq != Freq) | ||||
|   { | ||||
|     /* Back up uwTickFreq frequency */ | ||||
|     prevTickFreq = uwTickFreq; | ||||
|  | ||||
|     /* Update uwTickFreq global variable used by HAL_InitTick() */ | ||||
|     uwTickFreq = Freq; | ||||
|  | ||||
|     /* Apply the new tick Freq  */ | ||||
|     status = HAL_InitTick(uwTickPrio); | ||||
|  | ||||
|     if (status != HAL_OK) | ||||
|     { | ||||
|       /* Restore previous tick frequency */ | ||||
|       uwTickFreq = prevTickFreq; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return status; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Return tick frequency. | ||||
|   * @retval tick period in Hz | ||||
|   */ | ||||
| HAL_TickFreqTypeDef HAL_GetTickFreq(void) | ||||
| { | ||||
|   return uwTickFreq; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief This function provides minimum delay (in milliseconds) based | ||||
|   *        on variable incremented. | ||||
|   * @note In the default implementation , SysTick timer is the source of time base. | ||||
|   *       It is used to generate interrupts at regular time intervals where uwTick | ||||
|   *       is incremented. | ||||
|   * @note This function is declared as __weak to be overwritten in case of other | ||||
|   *       implementations in user file. | ||||
|   * @param Delay  specifies the delay time length, in milliseconds. | ||||
|   * @retval None | ||||
|   */ | ||||
| __weak void HAL_Delay(uint32_t Delay) | ||||
| { | ||||
|   uint32_t tickstart = HAL_GetTick(); | ||||
|   uint32_t wait = Delay; | ||||
|  | ||||
|   /* Add a freq to guarantee minimum wait */ | ||||
|   if (wait < HAL_MAX_DELAY) | ||||
|   { | ||||
|     wait += (uint32_t)(uwTickFreq); | ||||
|   } | ||||
|  | ||||
|   while ((HAL_GetTick() - tickstart) < wait) | ||||
|   { | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Suspend Tick increment. | ||||
|   * @note In the default implementation , SysTick timer is the source of time base. It is | ||||
|   *       used to generate interrupts at regular time intervals. Once HAL_SuspendTick() | ||||
|   *       is called, the SysTick interrupt will be disabled and so Tick increment  | ||||
|   *       is suspended. | ||||
|   * @note This function is declared as __weak to be overwritten in case of other | ||||
|   *       implementations in user file. | ||||
|   * @retval None | ||||
|   */ | ||||
| __weak void HAL_SuspendTick(void) | ||||
| { | ||||
|   /* Disable SysTick Interrupt */ | ||||
|   SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Resume Tick increment. | ||||
|   * @note In the default implementation , SysTick timer is the source of time base. It is | ||||
|   *       used to generate interrupts at regular time intervals. Once HAL_ResumeTick() | ||||
|   *       is called, the SysTick interrupt will be enabled and so Tick increment  | ||||
|   *       is resumed. | ||||
|   * @note This function is declared as __weak to be overwritten in case of other | ||||
|   *       implementations in user file. | ||||
|   * @retval None | ||||
|   */ | ||||
| __weak void HAL_ResumeTick(void) | ||||
| { | ||||
|   /* Enable SysTick Interrupt */ | ||||
|   SysTick->CTRL  |= SysTick_CTRL_TICKINT_Msk; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Returns the HAL revision | ||||
|   * @retval version : 0xXYZR (8bits for each decimal, R for RC) | ||||
|   */ | ||||
| uint32_t HAL_GetHalVersion(void) | ||||
| { | ||||
|   return __STM32F7xx_HAL_VERSION; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Returns the device revision identifier. | ||||
|   * @retval Device revision identifier | ||||
|   */ | ||||
| uint32_t HAL_GetREVID(void) | ||||
| { | ||||
|    return((DBGMCU->IDCODE) >> 16U); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Returns the device identifier. | ||||
|   * @retval Device identifier | ||||
|   */ | ||||
| uint32_t HAL_GetDEVID(void) | ||||
| { | ||||
|    return((DBGMCU->IDCODE) & IDCODE_DEVID_MASK); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Returns first word of the unique device identifier (UID based on 96 bits) | ||||
|   * @retval Device identifier | ||||
|   */ | ||||
| uint32_t HAL_GetUIDw0(void) | ||||
| { | ||||
|   return(READ_REG(*((uint32_t *)UID_BASE))); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Returns second word of the unique device identifier (UID based on 96 bits) | ||||
|   * @retval Device identifier | ||||
|   */ | ||||
| uint32_t HAL_GetUIDw1(void) | ||||
| { | ||||
|   return(READ_REG(*((uint32_t *)(UID_BASE + 4U)))); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Returns third word of the unique device identifier (UID based on 96 bits) | ||||
|   * @retval Device identifier | ||||
|   */ | ||||
| uint32_t HAL_GetUIDw2(void) | ||||
| { | ||||
|   return(READ_REG(*((uint32_t *)(UID_BASE + 8U)))); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enable the Debug Module during SLEEP mode | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_DBGMCU_EnableDBGSleepMode(void) | ||||
| { | ||||
|   SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disable the Debug Module during SLEEP mode | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_DBGMCU_DisableDBGSleepMode(void) | ||||
| { | ||||
|   CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enable the Debug Module during STOP mode | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_DBGMCU_EnableDBGStopMode(void) | ||||
| { | ||||
|   SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disable the Debug Module during STOP mode | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_DBGMCU_DisableDBGStopMode(void) | ||||
| { | ||||
|   CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enable the Debug Module during STANDBY mode | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_DBGMCU_EnableDBGStandbyMode(void) | ||||
| { | ||||
|   SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disable the Debug Module during STANDBY mode | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_DBGMCU_DisableDBGStandbyMode(void) | ||||
| { | ||||
|   CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enables the I/O Compensation Cell. | ||||
|   * @note   The I/O compensation cell can be used only when the device supply | ||||
|   *         voltage ranges from 2.4 to 3.6 V.   | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_EnableCompensationCell(void) | ||||
| { | ||||
|   SYSCFG->CMPCR |= SYSCFG_CMPCR_CMP_PD; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Power-down the I/O Compensation Cell. | ||||
|   * @note   The I/O compensation cell can be used only when the device supply | ||||
|   *         voltage ranges from 2.4 to 3.6 V.   | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_DisableCompensationCell(void) | ||||
| { | ||||
|   SYSCFG->CMPCR &= (uint32_t)~((uint32_t)SYSCFG_CMPCR_CMP_PD); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enables the FMC Memory Mapping Swapping. | ||||
|   *    | ||||
|   * @note   SDRAM is accessible at 0x60000000  | ||||
|   *         and NOR/RAM is accessible at 0xC0000000    | ||||
|   * | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_EnableFMCMemorySwapping(void) | ||||
| { | ||||
|   SYSCFG->MEMRMP |= SYSCFG_MEMRMP_SWP_FMC_0; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disables the FMC Memory Mapping Swapping | ||||
|   *    | ||||
|   * @note   SDRAM is accessible at 0xC0000000 (default mapping)   | ||||
|   *         and NOR/RAM is accessible at 0x60000000 (default mapping)     | ||||
|   *            | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_DisableFMCMemorySwapping(void) | ||||
| { | ||||
|   SYSCFG->MEMRMP &= (uint32_t)~((uint32_t)SYSCFG_MEMRMP_SWP_FMC); | ||||
| } | ||||
|  | ||||
| #if defined (STM32F765xx) || defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx) || defined (STM32F779xx) | ||||
| /** | ||||
| * @brief  Enable the Internal FLASH Bank Swapping. | ||||
| *    | ||||
| * @note   This function can be used only for STM32F77xx/STM32F76xx devices.  | ||||
| * | ||||
| * @note   Flash Bank2 mapped at 0x08000000 (AXI) (aliased at 0x00200000 (TCM))  | ||||
| *         and Flash Bank1 mapped at 0x08100000 (AXI) (aliased at 0x00300000 (TCM))    | ||||
| * | ||||
| * @retval None | ||||
| */ | ||||
| void HAL_EnableMemorySwappingBank(void) | ||||
| { | ||||
|   SET_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_SWP_FB); | ||||
| } | ||||
|  | ||||
| /** | ||||
| * @brief  Disable the Internal FLASH Bank Swapping. | ||||
| *    | ||||
| * @note   This function can be used only for STM32F77xx/STM32F76xx devices.  | ||||
| * | ||||
| * @note   The default state : Flash Bank1 mapped at 0x08000000 (AXI) (aliased at 0x00200000 (TCM))  | ||||
| *         and Flash Bank2 mapped at 0x08100000 (AXI)( aliased at 0x00300000 (TCM))  | ||||
| *            | ||||
| * @retval None | ||||
| */ | ||||
| void HAL_DisableMemorySwappingBank(void) | ||||
| { | ||||
|   CLEAR_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_SWP_FB); | ||||
| } | ||||
| #endif /* STM32F767xx || STM32F769xx || STM32F777xx || STM32F779xx */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
|  | ||||
							
								
								
									
										2114
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_adc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2114
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_adc.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1066
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_adc_ex.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1066
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_adc_ex.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										503
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_cortex.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										503
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_cortex.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,503 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32f7xx_hal_cortex.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   CORTEX HAL module driver. | ||||
|   *          This file provides firmware functions to manage the following  | ||||
|   *          functionalities of the CORTEX: | ||||
|   *           + Initialization and de-initialization functions | ||||
|   *           + Peripheral Control functions  | ||||
|   * | ||||
|   @verbatim   | ||||
|   ============================================================================== | ||||
|                         ##### How to use this driver ##### | ||||
|   ============================================================================== | ||||
|  | ||||
|     [..]   | ||||
|     *** How to configure Interrupts using CORTEX HAL driver *** | ||||
|     =========================================================== | ||||
|     [..]      | ||||
|     This section provides functions allowing to configure the NVIC interrupts (IRQ). | ||||
|     The Cortex-M4 exceptions are managed by CMSIS functions. | ||||
|     | ||||
|     (#) Configure the NVIC Priority Grouping using HAL_NVIC_SetPriorityGrouping() | ||||
|         function according to the following table. | ||||
|     (#) Configure the priority of the selected IRQ Channels using HAL_NVIC_SetPriority().  | ||||
|     (#) Enable the selected IRQ Channels using HAL_NVIC_EnableIRQ(). | ||||
|     (#) please refer to programming manual for details in how to configure priority.  | ||||
|        | ||||
|      -@- When the NVIC_PRIORITYGROUP_0 is selected, IRQ preemption is no more possible.  | ||||
|          The pending IRQ priority will be managed only by the sub priority. | ||||
|     | ||||
|      -@- IRQ priority order (sorted by highest to lowest priority): | ||||
|         (+@) Lowest preemption priority | ||||
|         (+@) Lowest sub priority | ||||
|         (+@) Lowest hardware priority (IRQ number) | ||||
|   | ||||
|     [..]   | ||||
|     *** How to configure Systick using CORTEX HAL driver *** | ||||
|     ======================================================== | ||||
|     [..] | ||||
|     Setup SysTick Timer for time base. | ||||
|             | ||||
|    (+) The HAL_SYSTICK_Config() function calls the SysTick_Config() function which | ||||
|        is a CMSIS function that: | ||||
|         (++) Configures the SysTick Reload register with value passed as function parameter. | ||||
|         (++) Configures the SysTick IRQ priority to the lowest value (0x0F). | ||||
|         (++) Resets the SysTick Counter register. | ||||
|         (++) Configures the SysTick Counter clock source to be Core Clock Source (HCLK). | ||||
|         (++) Enables the SysTick Interrupt. | ||||
|         (++) Starts the SysTick Counter. | ||||
|      | ||||
|    (+) You can change the SysTick Clock source to be HCLK_Div8 by calling the macro | ||||
|        __HAL_CORTEX_SYSTICKCLK_CONFIG(SYSTICK_CLKSOURCE_HCLK_DIV8) just after the | ||||
|        HAL_SYSTICK_Config() function call. The __HAL_CORTEX_SYSTICKCLK_CONFIG() macro is defined | ||||
|        inside the stm32f7xx_hal_cortex.h file. | ||||
|  | ||||
|    (+) You can change the SysTick IRQ priority by calling the | ||||
|        HAL_NVIC_SetPriority(SysTick_IRQn,...) function just after the HAL_SYSTICK_Config() function  | ||||
|        call. The HAL_NVIC_SetPriority() call the NVIC_SetPriority() function which is a CMSIS function. | ||||
|  | ||||
|    (+) To adjust the SysTick time base, use the following formula: | ||||
|                              | ||||
|        Reload Value = SysTick Counter Clock (Hz) x  Desired Time base (s) | ||||
|        (++) Reload Value is the parameter to be passed for HAL_SYSTICK_Config() function | ||||
|        (++) Reload Value should not exceed 0xFFFFFF | ||||
|     | ||||
|   @endverbatim | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * Copyright (c) 2017 STMicroelectronics. | ||||
|   * All rights reserved. | ||||
|   * | ||||
|   * This software is licensed under terms that can be found in the LICENSE file in | ||||
|   * the root directory of this software component. | ||||
|   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32f7xx_hal.h" | ||||
|  | ||||
| /** @addtogroup STM32F7xx_HAL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CORTEX CORTEX | ||||
|   * @brief CORTEX HAL module driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #ifdef HAL_CORTEX_MODULE_ENABLED | ||||
|  | ||||
| /* Private types -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private constants ---------------------------------------------------------*/ | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
| /* Private functions ---------------------------------------------------------*/ | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
|  | ||||
| /** @defgroup CORTEX_Exported_Functions CORTEX Exported Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
|  | ||||
| /** @defgroup CORTEX_Exported_Functions_Group1 Initialization and de-initialization functions | ||||
|  *  @brief    Initialization and Configuration functions  | ||||
|  * | ||||
| @verbatim     | ||||
|   ============================================================================== | ||||
|               ##### Initialization and de-initialization functions ##### | ||||
|   ============================================================================== | ||||
|     [..] | ||||
|       This section provides the CORTEX HAL driver functions allowing to configure Interrupts | ||||
|       Systick functionalities  | ||||
|  | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   * @brief  Sets the priority grouping field (preemption priority and subpriority) | ||||
|   *         using the required unlock sequence. | ||||
|   * @param  PriorityGroup The priority grouping bits length.  | ||||
|   *         This parameter can be one of the following values: | ||||
|   *         @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority | ||||
|   *                                    4 bits for subpriority | ||||
|   *         @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority | ||||
|   *                                    3 bits for subpriority | ||||
|   *         @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority | ||||
|   *                                    2 bits for subpriority | ||||
|   *         @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority | ||||
|   *                                    1 bits for subpriority | ||||
|   *         @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority | ||||
|   *                                    0 bits for subpriority | ||||
|   * @note   When the NVIC_PriorityGroup_0 is selected, IRQ preemption is no more possible.  | ||||
|   *         The pending IRQ priority will be managed only by the subpriority.  | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); | ||||
|    | ||||
|   /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */ | ||||
|   NVIC_SetPriorityGrouping(PriorityGroup); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Sets the priority of an interrupt. | ||||
|   * @param  IRQn External interrupt number. | ||||
|   *         This parameter can be an enumerator of IRQn_Type enumeration | ||||
|   *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f7xxxx.h)) | ||||
|   * @param  PreemptPriority The preemption priority for the IRQn channel. | ||||
|   *         This parameter can be a value between 0 and 15 | ||||
|   *         A lower priority value indicates a higher priority  | ||||
|   * @param  SubPriority the subpriority level for the IRQ channel. | ||||
|   *         This parameter can be a value between 0 and 15 | ||||
|   *         A lower priority value indicates a higher priority.           | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) | ||||
| {  | ||||
|   uint32_t prioritygroup = 0x00; | ||||
|    | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_NVIC_SUB_PRIORITY(SubPriority)); | ||||
|   assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority)); | ||||
|    | ||||
|   prioritygroup = NVIC_GetPriorityGrouping(); | ||||
|    | ||||
|   NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enables a device specific interrupt in the NVIC interrupt controller. | ||||
|   * @note   To configure interrupts priority correctly, the NVIC_PriorityGroupConfig() | ||||
|   *         function should be called before.  | ||||
|   * @param  IRQn External interrupt number. | ||||
|   *         This parameter can be an enumerator of IRQn_Type enumeration | ||||
|   *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f7xxxx.h)) | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_NVIC_EnableIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); | ||||
|    | ||||
|   /* Enable interrupt */ | ||||
|   NVIC_EnableIRQ(IRQn); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disables a device specific interrupt in the NVIC interrupt controller. | ||||
|   * @param  IRQn External interrupt number. | ||||
|   *         This parameter can be an enumerator of IRQn_Type enumeration | ||||
|   *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f7xxxx.h)) | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_NVIC_DisableIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); | ||||
|    | ||||
|   /* Disable interrupt */ | ||||
|   NVIC_DisableIRQ(IRQn); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Initiates a system reset request to reset the MCU. | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_NVIC_SystemReset(void) | ||||
| { | ||||
|   /* System Reset */ | ||||
|   NVIC_SystemReset(); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Initializes the System Timer and its interrupt, and starts the System Tick Timer. | ||||
|   *         Counter is in free running mode to generate periodic interrupts. | ||||
|   * @param  TicksNumb Specifies the ticks Number of ticks between two interrupts. | ||||
|   * @retval status:  - 0  Function succeeded. | ||||
|   *                  - 1  Function failed. | ||||
|   */ | ||||
| uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb) | ||||
| { | ||||
|    return SysTick_Config(TicksNumb); | ||||
| } | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CORTEX_Exported_Functions_Group2 Peripheral Control functions | ||||
|  *  @brief   Cortex control functions  | ||||
|  * | ||||
| @verbatim    | ||||
|   ============================================================================== | ||||
|                       ##### Peripheral Control functions ##### | ||||
|   ==============================================================================   | ||||
|     [..] | ||||
|       This subsection provides a set of functions allowing to control the CORTEX | ||||
|       (NVIC, SYSTICK, MPU) functionalities.  | ||||
|   | ||||
|        | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #if (__MPU_PRESENT == 1) | ||||
| /** | ||||
|   * @brief  Disables the MPU | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_MPU_Disable(void) | ||||
| { | ||||
|   /* Make sure outstanding transfers are done */ | ||||
|   __DMB(); | ||||
|  | ||||
|   /* Disable fault exceptions */ | ||||
|   SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; | ||||
|    | ||||
|   /* Disable the MPU and clear the control register*/ | ||||
|   MPU->CTRL = 0; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enables the MPU | ||||
|   * @param  MPU_Control Specifies the control mode of the MPU during hard fault,  | ||||
|   *          NMI, FAULTMASK and privileged access to the default memory  | ||||
|   *          This parameter can be one of the following values: | ||||
|   *            @arg MPU_HFNMI_PRIVDEF_NONE | ||||
|   *            @arg MPU_HARDFAULT_NMI | ||||
|   *            @arg MPU_PRIVILEGED_DEFAULT | ||||
|   *            @arg MPU_HFNMI_PRIVDEF | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_MPU_Enable(uint32_t MPU_Control) | ||||
| { | ||||
|   /* Enable the MPU */ | ||||
|   MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; | ||||
|    | ||||
|   /* Enable fault exceptions */ | ||||
|   SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; | ||||
|    | ||||
|   /* Ensure MPU setting take effects */ | ||||
|   __DSB(); | ||||
|   __ISB(); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Initializes and configures the Region and the memory to be protected. | ||||
|   * @param  MPU_Init Pointer to a MPU_Region_InitTypeDef structure that contains | ||||
|   *                the initialization and configuration information. | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_MPU_REGION_NUMBER(MPU_Init->Number)); | ||||
|   assert_param(IS_MPU_REGION_ENABLE(MPU_Init->Enable)); | ||||
|  | ||||
|   /* Set the Region number */ | ||||
|   MPU->RNR = MPU_Init->Number; | ||||
|  | ||||
|   if ((MPU_Init->Enable) != RESET) | ||||
|   { | ||||
|     /* Check the parameters */ | ||||
|     assert_param(IS_MPU_INSTRUCTION_ACCESS(MPU_Init->DisableExec)); | ||||
|     assert_param(IS_MPU_REGION_PERMISSION_ATTRIBUTE(MPU_Init->AccessPermission)); | ||||
|     assert_param(IS_MPU_TEX_LEVEL(MPU_Init->TypeExtField)); | ||||
|     assert_param(IS_MPU_ACCESS_SHAREABLE(MPU_Init->IsShareable)); | ||||
|     assert_param(IS_MPU_ACCESS_CACHEABLE(MPU_Init->IsCacheable)); | ||||
|     assert_param(IS_MPU_ACCESS_BUFFERABLE(MPU_Init->IsBufferable)); | ||||
|     assert_param(IS_MPU_SUB_REGION_DISABLE(MPU_Init->SubRegionDisable)); | ||||
|     assert_param(IS_MPU_REGION_SIZE(MPU_Init->Size)); | ||||
|      | ||||
|     MPU->RBAR = MPU_Init->BaseAddress; | ||||
|     MPU->RASR = ((uint32_t)MPU_Init->DisableExec             << MPU_RASR_XN_Pos)   | | ||||
|                 ((uint32_t)MPU_Init->AccessPermission        << MPU_RASR_AP_Pos)   | | ||||
|                 ((uint32_t)MPU_Init->TypeExtField            << MPU_RASR_TEX_Pos)  | | ||||
|                 ((uint32_t)MPU_Init->IsShareable             << MPU_RASR_S_Pos)    | | ||||
|                 ((uint32_t)MPU_Init->IsCacheable             << MPU_RASR_C_Pos)    | | ||||
|                 ((uint32_t)MPU_Init->IsBufferable            << MPU_RASR_B_Pos)    | | ||||
|                 ((uint32_t)MPU_Init->SubRegionDisable        << MPU_RASR_SRD_Pos)  | | ||||
|                 ((uint32_t)MPU_Init->Size                    << MPU_RASR_SIZE_Pos) | | ||||
|                 ((uint32_t)MPU_Init->Enable                  << MPU_RASR_ENABLE_Pos); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     MPU->RBAR = 0x00; | ||||
|     MPU->RASR = 0x00; | ||||
|   } | ||||
| } | ||||
| #endif /* __MPU_PRESENT */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Gets the priority grouping field from the NVIC Interrupt Controller. | ||||
|   * @retval Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field) | ||||
|   */ | ||||
| uint32_t HAL_NVIC_GetPriorityGrouping(void) | ||||
| { | ||||
|   /* Get the PRIGROUP[10:8] field value */ | ||||
|   return NVIC_GetPriorityGrouping(); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Gets the priority of an interrupt. | ||||
|   * @param  IRQn External interrupt number. | ||||
|   *         This parameter can be an enumerator of IRQn_Type enumeration | ||||
|   *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f7xxxx.h)) | ||||
|   * @param   PriorityGroup the priority grouping bits length. | ||||
|   *         This parameter can be one of the following values: | ||||
|   *           @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority | ||||
|   *                                      4 bits for subpriority | ||||
|   *           @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority | ||||
|   *                                      3 bits for subpriority | ||||
|   *           @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority | ||||
|   *                                      2 bits for subpriority | ||||
|   *           @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority | ||||
|   *                                      1 bits for subpriority | ||||
|   *           @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority | ||||
|   *                                      0 bits for subpriority | ||||
|   * @param  pPreemptPriority Pointer on the Preemptive priority value (starting from 0). | ||||
|   * @param  pSubPriority Pointer on the Subpriority value (starting from 0). | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t *pPreemptPriority, uint32_t *pSubPriority) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); | ||||
|  /* Get priority for Cortex-M system or device specific interrupts */ | ||||
|   NVIC_DecodePriority(NVIC_GetPriority(IRQn), PriorityGroup, pPreemptPriority, pSubPriority); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Sets Pending bit of an external interrupt. | ||||
|   * @param  IRQn External interrupt number | ||||
|   *         This parameter can be an enumerator of IRQn_Type enumeration | ||||
|   *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f7xxxx.h)) | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); | ||||
|    | ||||
|   /* Set interrupt pending */ | ||||
|   NVIC_SetPendingIRQ(IRQn); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Gets Pending Interrupt (reads the pending register in the NVIC  | ||||
|   *         and returns the pending bit for the specified interrupt). | ||||
|   * @param  IRQn External interrupt number. | ||||
|   *          This parameter can be an enumerator of IRQn_Type enumeration | ||||
|   *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f7xxxx.h)) | ||||
|   * @retval status: - 0  Interrupt status is not pending. | ||||
|   *                 - 1  Interrupt status is pending. | ||||
|   */ | ||||
| uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); | ||||
|    | ||||
|   /* Return 1 if pending else 0 */ | ||||
|   return NVIC_GetPendingIRQ(IRQn); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Clears the pending bit of an external interrupt. | ||||
|   * @param  IRQn External interrupt number. | ||||
|   *         This parameter can be an enumerator of IRQn_Type enumeration | ||||
|   *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f7xxxx.h)) | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); | ||||
|    | ||||
|   /* Clear pending interrupt */ | ||||
|   NVIC_ClearPendingIRQ(IRQn); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Gets active interrupt ( reads the active register in NVIC and returns the active bit). | ||||
|   * @param IRQn External interrupt number | ||||
|   *         This parameter can be an enumerator of IRQn_Type enumeration | ||||
|   *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f7xxxx.h)) | ||||
|   * @retval status: - 0  Interrupt status is not pending. | ||||
|   *                 - 1  Interrupt status is pending. | ||||
|   */ | ||||
| uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); | ||||
|    | ||||
|   /* Return 1 if active else 0 */ | ||||
|   return NVIC_GetActive(IRQn); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configures the SysTick clock source. | ||||
|   * @param  CLKSource specifies the SysTick clock source. | ||||
|   *          This parameter can be one of the following values: | ||||
|   *             @arg SYSTICK_CLKSOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock source. | ||||
|   *             @arg SYSTICK_CLKSOURCE_HCLK: AHB clock selected as SysTick clock source. | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_SYSTICK_CLK_SOURCE(CLKSource)); | ||||
|   if (CLKSource == SYSTICK_CLKSOURCE_HCLK) | ||||
|   { | ||||
|     SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK; | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  This function handles SYSTICK interrupt request. | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_SYSTICK_IRQHandler(void) | ||||
| { | ||||
|   HAL_SYSTICK_Callback(); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  SYSTICK callback. | ||||
|   * @retval None | ||||
|   */ | ||||
| __weak void HAL_SYSTICK_Callback(void) | ||||
| { | ||||
|   /* NOTE : This function Should not be modified, when the callback is needed, | ||||
|             the HAL_SYSTICK_Callback could be implemented in the user file | ||||
|    */ | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* HAL_CORTEX_MODULE_ENABLED */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
							
								
								
									
										516
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_crc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										516
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_crc.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,516 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32f7xx_hal_crc.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   CRC HAL module driver. | ||||
|   *          This file provides firmware functions to manage the following | ||||
|   *          functionalities of the Cyclic Redundancy Check (CRC) peripheral: | ||||
|   *           + Initialization and de-initialization functions | ||||
|   *           + Peripheral Control functions | ||||
|   *           + Peripheral State functions | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * Copyright (c) 2017 STMicroelectronics. | ||||
|   * All rights reserved. | ||||
|   * | ||||
|   * This software is licensed under terms that can be found in the LICENSE file | ||||
|   * in the root directory of this software component. | ||||
|   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   @verbatim | ||||
|  =============================================================================== | ||||
|                      ##### How to use this driver ##### | ||||
|  =============================================================================== | ||||
|     [..] | ||||
|          (+) Enable CRC AHB clock using __HAL_RCC_CRC_CLK_ENABLE(); | ||||
|          (+) Initialize CRC calculator | ||||
|              (++) specify generating polynomial (peripheral default or non-default one) | ||||
|              (++) specify initialization value (peripheral default or non-default one) | ||||
|              (++) specify input data format | ||||
|              (++) specify input or output data inversion mode if any | ||||
|          (+) Use HAL_CRC_Accumulate() function to compute the CRC value of the | ||||
|              input data buffer starting with the previously computed CRC as | ||||
|              initialization value | ||||
|          (+) Use HAL_CRC_Calculate() function to compute the CRC value of the | ||||
|              input data buffer starting with the defined initialization value | ||||
|              (default or non-default) to initiate CRC calculation | ||||
|  | ||||
|   @endverbatim | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32f7xx_hal.h" | ||||
|  | ||||
| /** @addtogroup STM32F7xx_HAL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CRC CRC | ||||
|   * @brief CRC HAL module driver. | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #ifdef HAL_CRC_MODULE_ENABLED | ||||
|  | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private define ------------------------------------------------------------*/ | ||||
| /* Private macro -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /** @defgroup CRC_Private_Functions CRC Private Functions | ||||
|   * @{ | ||||
|   */ | ||||
| static uint32_t CRC_Handle_8(CRC_HandleTypeDef *hcrc, uint8_t pBuffer[], uint32_t BufferLength); | ||||
| static uint32_t CRC_Handle_16(CRC_HandleTypeDef *hcrc, uint16_t pBuffer[], uint32_t BufferLength); | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
|  | ||||
| /** @defgroup CRC_Exported_Functions CRC Exported Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CRC_Exported_Functions_Group1 Initialization and de-initialization functions | ||||
|   *  @brief    Initialization and Configuration functions. | ||||
|   * | ||||
| @verbatim | ||||
|  =============================================================================== | ||||
|             ##### Initialization and de-initialization functions ##### | ||||
|  =============================================================================== | ||||
|     [..]  This section provides functions allowing to: | ||||
|       (+) Initialize the CRC according to the specified parameters | ||||
|           in the CRC_InitTypeDef and create the associated handle | ||||
|       (+) DeInitialize the CRC peripheral | ||||
|       (+) Initialize the CRC MSP (MCU Specific Package) | ||||
|       (+) DeInitialize the CRC MSP | ||||
|  | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Initialize the CRC according to the specified | ||||
|   *         parameters in the CRC_InitTypeDef and create the associated handle. | ||||
|   * @param  hcrc CRC handle | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_CRC_Init(CRC_HandleTypeDef *hcrc) | ||||
| { | ||||
|   /* Check the CRC handle allocation */ | ||||
|   if (hcrc == NULL) | ||||
|   { | ||||
|     return HAL_ERROR; | ||||
|   } | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_CRC_ALL_INSTANCE(hcrc->Instance)); | ||||
|  | ||||
|   if (hcrc->State == HAL_CRC_STATE_RESET) | ||||
|   { | ||||
|     /* Allocate lock resource and initialize it */ | ||||
|     hcrc->Lock = HAL_UNLOCKED; | ||||
|     /* Init the low level hardware */ | ||||
|     HAL_CRC_MspInit(hcrc); | ||||
|   } | ||||
|  | ||||
|   hcrc->State = HAL_CRC_STATE_BUSY; | ||||
|  | ||||
|   /* check whether or not non-default generating polynomial has been | ||||
|    * picked up by user */ | ||||
|   assert_param(IS_DEFAULT_POLYNOMIAL(hcrc->Init.DefaultPolynomialUse)); | ||||
|   if (hcrc->Init.DefaultPolynomialUse == DEFAULT_POLYNOMIAL_ENABLE) | ||||
|   { | ||||
|     /* initialize peripheral with default generating polynomial */ | ||||
|     WRITE_REG(hcrc->Instance->POL, DEFAULT_CRC32_POLY); | ||||
|     MODIFY_REG(hcrc->Instance->CR, CRC_CR_POLYSIZE, CRC_POLYLENGTH_32B); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     /* initialize CRC peripheral with generating polynomial defined by user */ | ||||
|     if (HAL_CRCEx_Polynomial_Set(hcrc, hcrc->Init.GeneratingPolynomial, hcrc->Init.CRCLength) != HAL_OK) | ||||
|     { | ||||
|       return HAL_ERROR; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   /* check whether or not non-default CRC initial value has been | ||||
|    * picked up by user */ | ||||
|   assert_param(IS_DEFAULT_INIT_VALUE(hcrc->Init.DefaultInitValueUse)); | ||||
|   if (hcrc->Init.DefaultInitValueUse == DEFAULT_INIT_VALUE_ENABLE) | ||||
|   { | ||||
|     WRITE_REG(hcrc->Instance->INIT, DEFAULT_CRC_INITVALUE); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     WRITE_REG(hcrc->Instance->INIT, hcrc->Init.InitValue); | ||||
|   } | ||||
|  | ||||
|  | ||||
|   /* set input data inversion mode */ | ||||
|   assert_param(IS_CRC_INPUTDATA_INVERSION_MODE(hcrc->Init.InputDataInversionMode)); | ||||
|   MODIFY_REG(hcrc->Instance->CR, CRC_CR_REV_IN, hcrc->Init.InputDataInversionMode); | ||||
|  | ||||
|   /* set output data inversion mode */ | ||||
|   assert_param(IS_CRC_OUTPUTDATA_INVERSION_MODE(hcrc->Init.OutputDataInversionMode)); | ||||
|   MODIFY_REG(hcrc->Instance->CR, CRC_CR_REV_OUT, hcrc->Init.OutputDataInversionMode); | ||||
|  | ||||
|   /* makes sure the input data format (bytes, halfwords or words stream) | ||||
|    * is properly specified by user */ | ||||
|   assert_param(IS_CRC_INPUTDATA_FORMAT(hcrc->InputDataFormat)); | ||||
|  | ||||
|   /* Change CRC peripheral state */ | ||||
|   hcrc->State = HAL_CRC_STATE_READY; | ||||
|  | ||||
|   /* Return function status */ | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  DeInitialize the CRC peripheral. | ||||
|   * @param  hcrc CRC handle | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_CRC_DeInit(CRC_HandleTypeDef *hcrc) | ||||
| { | ||||
|   /* Check the CRC handle allocation */ | ||||
|   if (hcrc == NULL) | ||||
|   { | ||||
|     return HAL_ERROR; | ||||
|   } | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_CRC_ALL_INSTANCE(hcrc->Instance)); | ||||
|  | ||||
|   /* Check the CRC peripheral state */ | ||||
|   if (hcrc->State == HAL_CRC_STATE_BUSY) | ||||
|   { | ||||
|     return HAL_BUSY; | ||||
|   } | ||||
|  | ||||
|   /* Change CRC peripheral state */ | ||||
|   hcrc->State = HAL_CRC_STATE_BUSY; | ||||
|  | ||||
|   /* Reset CRC calculation unit */ | ||||
|   __HAL_CRC_DR_RESET(hcrc); | ||||
|  | ||||
|   /* Reset IDR register content */ | ||||
|   CLEAR_BIT(hcrc->Instance->IDR, CRC_IDR_IDR); | ||||
|  | ||||
|   /* DeInit the low level hardware */ | ||||
|   HAL_CRC_MspDeInit(hcrc); | ||||
|  | ||||
|   /* Change CRC peripheral state */ | ||||
|   hcrc->State = HAL_CRC_STATE_RESET; | ||||
|  | ||||
|   /* Process unlocked */ | ||||
|   __HAL_UNLOCK(hcrc); | ||||
|  | ||||
|   /* Return function status */ | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Initializes the CRC MSP. | ||||
|   * @param  hcrc CRC handle | ||||
|   * @retval None | ||||
|   */ | ||||
| __weak void HAL_CRC_MspInit(CRC_HandleTypeDef *hcrc) | ||||
| { | ||||
|   /* Prevent unused argument(s) compilation warning */ | ||||
|   UNUSED(hcrc); | ||||
|  | ||||
|   /* NOTE : This function should not be modified, when the callback is needed, | ||||
|             the HAL_CRC_MspInit can be implemented in the user file | ||||
|    */ | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  DeInitialize the CRC MSP. | ||||
|   * @param  hcrc CRC handle | ||||
|   * @retval None | ||||
|   */ | ||||
| __weak void HAL_CRC_MspDeInit(CRC_HandleTypeDef *hcrc) | ||||
| { | ||||
|   /* Prevent unused argument(s) compilation warning */ | ||||
|   UNUSED(hcrc); | ||||
|  | ||||
|   /* NOTE : This function should not be modified, when the callback is needed, | ||||
|             the HAL_CRC_MspDeInit can be implemented in the user file | ||||
|    */ | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CRC_Exported_Functions_Group2 Peripheral Control functions | ||||
|   *  @brief    management functions. | ||||
|   * | ||||
| @verbatim | ||||
|  =============================================================================== | ||||
|                       ##### Peripheral Control functions ##### | ||||
|  =============================================================================== | ||||
|     [..]  This section provides functions allowing to: | ||||
|       (+) compute the 7, 8, 16 or 32-bit CRC value of an 8, 16 or 32-bit data buffer | ||||
|           using combination of the previous CRC value and the new one. | ||||
|  | ||||
|        [..]  or | ||||
|  | ||||
|       (+) compute the 7, 8, 16 or 32-bit CRC value of an 8, 16 or 32-bit data buffer | ||||
|           independently of the previous CRC value. | ||||
|  | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Compute the 7, 8, 16 or 32-bit CRC value of an 8, 16 or 32-bit data buffer | ||||
|   *         starting with the previously computed CRC as initialization value. | ||||
|   * @param  hcrc CRC handle | ||||
|   * @param  pBuffer pointer to the input data buffer, exact input data format is | ||||
|   *         provided by hcrc->InputDataFormat. | ||||
|   * @param  BufferLength input data buffer length (number of bytes if pBuffer | ||||
|   *         type is * uint8_t, number of half-words if pBuffer type is * uint16_t, | ||||
|   *         number of words if pBuffer type is * uint32_t). | ||||
|   * @note  By default, the API expects a uint32_t pointer as input buffer parameter. | ||||
|   *        Input buffer pointers with other types simply need to be cast in uint32_t | ||||
|   *        and the API will internally adjust its input data processing based on the | ||||
|   *        handle field hcrc->InputDataFormat. | ||||
|   * @retval uint32_t CRC (returned value LSBs for CRC shorter than 32 bits) | ||||
|   */ | ||||
| uint32_t HAL_CRC_Accumulate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength) | ||||
| { | ||||
|   uint32_t index;      /* CRC input data buffer index */ | ||||
|   uint32_t temp = 0U;  /* CRC output (read from hcrc->Instance->DR register) */ | ||||
|  | ||||
|   /* Change CRC peripheral state */ | ||||
|   hcrc->State = HAL_CRC_STATE_BUSY; | ||||
|  | ||||
|   switch (hcrc->InputDataFormat) | ||||
|   { | ||||
|     case CRC_INPUTDATA_FORMAT_WORDS: | ||||
|       /* Enter Data to the CRC calculator */ | ||||
|       for (index = 0U; index < BufferLength; index++) | ||||
|       { | ||||
|         hcrc->Instance->DR = pBuffer[index]; | ||||
|       } | ||||
|       temp = hcrc->Instance->DR; | ||||
|       break; | ||||
|  | ||||
|     case CRC_INPUTDATA_FORMAT_BYTES: | ||||
|       temp = CRC_Handle_8(hcrc, (uint8_t *)pBuffer, BufferLength); | ||||
|       break; | ||||
|  | ||||
|     case CRC_INPUTDATA_FORMAT_HALFWORDS: | ||||
|       temp = CRC_Handle_16(hcrc, (uint16_t *)(void *)pBuffer, BufferLength);    /* Derogation MisraC2012 R.11.5 */ | ||||
|       break; | ||||
|     default: | ||||
|       break; | ||||
|   } | ||||
|  | ||||
|   /* Change CRC peripheral state */ | ||||
|   hcrc->State = HAL_CRC_STATE_READY; | ||||
|  | ||||
|   /* Return the CRC computed value */ | ||||
|   return temp; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Compute the 7, 8, 16 or 32-bit CRC value of an 8, 16 or 32-bit data buffer | ||||
|   *         starting with hcrc->Instance->INIT as initialization value. | ||||
|   * @param  hcrc CRC handle | ||||
|   * @param  pBuffer pointer to the input data buffer, exact input data format is | ||||
|   *         provided by hcrc->InputDataFormat. | ||||
|   * @param  BufferLength input data buffer length (number of bytes if pBuffer | ||||
|   *         type is * uint8_t, number of half-words if pBuffer type is * uint16_t, | ||||
|   *         number of words if pBuffer type is * uint32_t). | ||||
|   * @note  By default, the API expects a uint32_t pointer as input buffer parameter. | ||||
|   *        Input buffer pointers with other types simply need to be cast in uint32_t | ||||
|   *        and the API will internally adjust its input data processing based on the | ||||
|   *        handle field hcrc->InputDataFormat. | ||||
|   * @retval uint32_t CRC (returned value LSBs for CRC shorter than 32 bits) | ||||
|   */ | ||||
| uint32_t HAL_CRC_Calculate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength) | ||||
| { | ||||
|   uint32_t index;      /* CRC input data buffer index */ | ||||
|   uint32_t temp = 0U;  /* CRC output (read from hcrc->Instance->DR register) */ | ||||
|  | ||||
|   /* Change CRC peripheral state */ | ||||
|   hcrc->State = HAL_CRC_STATE_BUSY; | ||||
|  | ||||
|   /* Reset CRC Calculation Unit (hcrc->Instance->INIT is | ||||
|   *  written in hcrc->Instance->DR) */ | ||||
|   __HAL_CRC_DR_RESET(hcrc); | ||||
|  | ||||
|   switch (hcrc->InputDataFormat) | ||||
|   { | ||||
|     case CRC_INPUTDATA_FORMAT_WORDS: | ||||
|       /* Enter 32-bit input data to the CRC calculator */ | ||||
|       for (index = 0U; index < BufferLength; index++) | ||||
|       { | ||||
|         hcrc->Instance->DR = pBuffer[index]; | ||||
|       } | ||||
|       temp = hcrc->Instance->DR; | ||||
|       break; | ||||
|  | ||||
|     case CRC_INPUTDATA_FORMAT_BYTES: | ||||
|       /* Specific 8-bit input data handling  */ | ||||
|       temp = CRC_Handle_8(hcrc, (uint8_t *)pBuffer, BufferLength); | ||||
|       break; | ||||
|  | ||||
|     case CRC_INPUTDATA_FORMAT_HALFWORDS: | ||||
|       /* Specific 16-bit input data handling  */ | ||||
|       temp = CRC_Handle_16(hcrc, (uint16_t *)(void *)pBuffer, BufferLength);    /* Derogation MisraC2012 R.11.5 */ | ||||
|       break; | ||||
|  | ||||
|     default: | ||||
|       break; | ||||
|   } | ||||
|  | ||||
|   /* Change CRC peripheral state */ | ||||
|   hcrc->State = HAL_CRC_STATE_READY; | ||||
|  | ||||
|   /* Return the CRC computed value */ | ||||
|   return temp; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CRC_Exported_Functions_Group3 Peripheral State functions | ||||
|   *  @brief    Peripheral State functions. | ||||
|   * | ||||
| @verbatim | ||||
|  =============================================================================== | ||||
|                       ##### Peripheral State functions ##### | ||||
|  =============================================================================== | ||||
|     [..] | ||||
|     This subsection permits to get in run-time the status of the peripheral. | ||||
|  | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Return the CRC handle state. | ||||
|   * @param  hcrc CRC handle | ||||
|   * @retval HAL state | ||||
|   */ | ||||
| HAL_CRC_StateTypeDef HAL_CRC_GetState(CRC_HandleTypeDef *hcrc) | ||||
| { | ||||
|   /* Return CRC handle state */ | ||||
|   return hcrc->State; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup CRC_Private_Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Enter 8-bit input data to the CRC calculator. | ||||
|   *         Specific data handling to optimize processing time. | ||||
|   * @param  hcrc CRC handle | ||||
|   * @param  pBuffer pointer to the input data buffer | ||||
|   * @param  BufferLength input data buffer length | ||||
|   * @retval uint32_t CRC (returned value LSBs for CRC shorter than 32 bits) | ||||
|   */ | ||||
| static uint32_t CRC_Handle_8(CRC_HandleTypeDef *hcrc, uint8_t pBuffer[], uint32_t BufferLength) | ||||
| { | ||||
|   uint32_t i; /* input data buffer index */ | ||||
|   uint16_t data; | ||||
|   __IO uint16_t *pReg; | ||||
|  | ||||
|   /* Processing time optimization: 4 bytes are entered in a row with a single word write, | ||||
|    * last bytes must be carefully fed to the CRC calculator to ensure a correct type | ||||
|    * handling by the peripheral */ | ||||
|   for (i = 0U; i < (BufferLength / 4U); i++) | ||||
|   { | ||||
|     hcrc->Instance->DR = ((uint32_t)pBuffer[4U * i] << 24U) | \ | ||||
|                          ((uint32_t)pBuffer[(4U * i) + 1U] << 16U) | \ | ||||
|                          ((uint32_t)pBuffer[(4U * i) + 2U] << 8U)  | \ | ||||
|                          (uint32_t)pBuffer[(4U * i) + 3U]; | ||||
|   } | ||||
|   /* last bytes specific handling */ | ||||
|   if ((BufferLength % 4U) != 0U) | ||||
|   { | ||||
|     if ((BufferLength % 4U) == 1U) | ||||
|     { | ||||
|       *(__IO uint8_t *)(__IO void *)(&hcrc->Instance->DR) = pBuffer[4U * i];         /* Derogation MisraC2012 R.11.5 */ | ||||
|     } | ||||
|     if ((BufferLength % 4U) == 2U) | ||||
|     { | ||||
|       data = ((uint16_t)(pBuffer[4U * i]) << 8U) | (uint16_t)pBuffer[(4U * i) + 1U]; | ||||
|       pReg = (__IO uint16_t *)(__IO void *)(&hcrc->Instance->DR);                    /* Derogation MisraC2012 R.11.5 */ | ||||
|       *pReg = data; | ||||
|     } | ||||
|     if ((BufferLength % 4U) == 3U) | ||||
|     { | ||||
|       data = ((uint16_t)(pBuffer[4U * i]) << 8U) | (uint16_t)pBuffer[(4U * i) + 1U]; | ||||
|       pReg = (__IO uint16_t *)(__IO void *)(&hcrc->Instance->DR);                    /* Derogation MisraC2012 R.11.5 */ | ||||
|       *pReg = data; | ||||
|  | ||||
|       *(__IO uint8_t *)(__IO void *)(&hcrc->Instance->DR) = pBuffer[(4U * i) + 2U];  /* Derogation MisraC2012 R.11.5 */ | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   /* Return the CRC computed value */ | ||||
|   return hcrc->Instance->DR; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enter 16-bit input data to the CRC calculator. | ||||
|   *         Specific data handling to optimize processing time. | ||||
|   * @param  hcrc CRC handle | ||||
|   * @param  pBuffer pointer to the input data buffer | ||||
|   * @param  BufferLength input data buffer length | ||||
|   * @retval uint32_t CRC (returned value LSBs for CRC shorter than 32 bits) | ||||
|   */ | ||||
| static uint32_t CRC_Handle_16(CRC_HandleTypeDef *hcrc, uint16_t pBuffer[], uint32_t BufferLength) | ||||
| { | ||||
|   uint32_t i;  /* input data buffer index */ | ||||
|   __IO uint16_t *pReg; | ||||
|  | ||||
|   /* Processing time optimization: 2 HalfWords are entered in a row with a single word write, | ||||
|    * in case of odd length, last HalfWord must be carefully fed to the CRC calculator to ensure | ||||
|    * a correct type handling by the peripheral */ | ||||
|   for (i = 0U; i < (BufferLength / 2U); i++) | ||||
|   { | ||||
|     hcrc->Instance->DR = ((uint32_t)pBuffer[2U * i] << 16U) | (uint32_t)pBuffer[(2U * i) + 1U]; | ||||
|   } | ||||
|   if ((BufferLength % 2U) != 0U) | ||||
|   { | ||||
|     pReg = (__IO uint16_t *)(__IO void *)(&hcrc->Instance->DR);                 /* Derogation MisraC2012 R.11.5 */ | ||||
|     *pReg = pBuffer[2U * i]; | ||||
|   } | ||||
|  | ||||
|   /* Return the CRC computed value */ | ||||
|   return hcrc->Instance->DR; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* HAL_CRC_MODULE_ENABLED */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
							
								
								
									
										223
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_crc_ex.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										223
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_crc_ex.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,223 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32f7xx_hal_crc_ex.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   Extended CRC HAL module driver. | ||||
|   *          This file provides firmware functions to manage the extended | ||||
|   *          functionalities of the CRC peripheral. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * Copyright (c) 2017 STMicroelectronics. | ||||
|   * All rights reserved. | ||||
|   * | ||||
|   * This software is licensed under terms that can be found in the LICENSE file | ||||
|   * in the root directory of this software component. | ||||
|   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   @verbatim | ||||
| ================================================================================ | ||||
|             ##### How to use this driver ##### | ||||
| ================================================================================ | ||||
|     [..] | ||||
|          (+) Set user-defined generating polynomial through HAL_CRCEx_Polynomial_Set() | ||||
|          (+) Configure Input or Output data inversion | ||||
|  | ||||
|   @endverbatim | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32f7xx_hal.h" | ||||
|  | ||||
| /** @addtogroup STM32F7xx_HAL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CRCEx CRCEx | ||||
|   * @brief CRC Extended HAL module driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #ifdef HAL_CRC_MODULE_ENABLED | ||||
|  | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private define ------------------------------------------------------------*/ | ||||
| /* Private macro -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
|  | ||||
| /** @defgroup CRCEx_Exported_Functions CRC Extended Exported Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup CRCEx_Exported_Functions_Group1 Extended Initialization/de-initialization functions | ||||
|   * @brief    Extended Initialization and Configuration functions. | ||||
|   * | ||||
| @verbatim | ||||
|  =============================================================================== | ||||
|             ##### Extended configuration functions ##### | ||||
|  =============================================================================== | ||||
|     [..]  This section provides functions allowing to: | ||||
|       (+) Configure the generating polynomial | ||||
|       (+) Configure the input data inversion | ||||
|       (+) Configure the output data inversion | ||||
|  | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   * @brief  Initialize the CRC polynomial if different from default one. | ||||
|   * @param  hcrc CRC handle | ||||
|   * @param  Pol CRC generating polynomial (7, 8, 16 or 32-bit long). | ||||
|   *         This parameter is written in normal representation, e.g. | ||||
|   *         @arg for a polynomial of degree 7, X^7 + X^6 + X^5 + X^2 + 1 is written 0x65 | ||||
|   *         @arg for a polynomial of degree 16, X^16 + X^12 + X^5 + 1 is written 0x1021 | ||||
|   * @param  PolyLength CRC polynomial length. | ||||
|   *         This parameter can be one of the following values: | ||||
|   *          @arg @ref CRC_POLYLENGTH_7B  7-bit long CRC (generating polynomial of degree 7) | ||||
|   *          @arg @ref CRC_POLYLENGTH_8B  8-bit long CRC (generating polynomial of degree 8) | ||||
|   *          @arg @ref CRC_POLYLENGTH_16B 16-bit long CRC (generating polynomial of degree 16) | ||||
|   *          @arg @ref CRC_POLYLENGTH_32B 32-bit long CRC (generating polynomial of degree 32) | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_CRCEx_Polynomial_Set(CRC_HandleTypeDef *hcrc, uint32_t Pol, uint32_t PolyLength) | ||||
| { | ||||
|   HAL_StatusTypeDef status = HAL_OK; | ||||
|   uint32_t msb = 31U; /* polynomial degree is 32 at most, so msb is initialized to max value */ | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_CRC_POL_LENGTH(PolyLength)); | ||||
|  | ||||
|   /* check polynomial definition vs polynomial size: | ||||
|    * polynomial length must be aligned with polynomial | ||||
|    * definition. HAL_ERROR is reported if Pol degree is | ||||
|    * larger than that indicated by PolyLength. | ||||
|    * Look for MSB position: msb will contain the degree of | ||||
|    *  the second to the largest polynomial member. E.g., for | ||||
|    *  X^7 + X^6 + X^5 + X^2 + 1, msb = 6. */ | ||||
|   while ((msb-- > 0U) && ((Pol & ((uint32_t)(0x1U) << (msb & 0x1FU))) == 0U)) | ||||
|   { | ||||
|   } | ||||
|  | ||||
|   switch (PolyLength) | ||||
|   { | ||||
|     case CRC_POLYLENGTH_7B: | ||||
|       if (msb >= HAL_CRC_LENGTH_7B) | ||||
|       { | ||||
|         status =   HAL_ERROR; | ||||
|       } | ||||
|       break; | ||||
|     case CRC_POLYLENGTH_8B: | ||||
|       if (msb >= HAL_CRC_LENGTH_8B) | ||||
|       { | ||||
|         status =   HAL_ERROR; | ||||
|       } | ||||
|       break; | ||||
|     case CRC_POLYLENGTH_16B: | ||||
|       if (msb >= HAL_CRC_LENGTH_16B) | ||||
|       { | ||||
|         status =   HAL_ERROR; | ||||
|       } | ||||
|       break; | ||||
|  | ||||
|     case CRC_POLYLENGTH_32B: | ||||
|       /* no polynomial definition vs. polynomial length issue possible */ | ||||
|       break; | ||||
|     default: | ||||
|       status =  HAL_ERROR; | ||||
|       break; | ||||
|   } | ||||
|   if (status == HAL_OK) | ||||
|   { | ||||
|     /* set generating polynomial */ | ||||
|     WRITE_REG(hcrc->Instance->POL, Pol); | ||||
|  | ||||
|     /* set generating polynomial size */ | ||||
|     MODIFY_REG(hcrc->Instance->CR, CRC_CR_POLYSIZE, PolyLength); | ||||
|   } | ||||
|   /* Return function status */ | ||||
|   return status; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Set the Reverse Input data mode. | ||||
|   * @param  hcrc CRC handle | ||||
|   * @param  InputReverseMode Input Data inversion mode. | ||||
|   *         This parameter can be one of the following values: | ||||
|   *          @arg @ref CRC_INPUTDATA_INVERSION_NONE     no change in bit order (default value) | ||||
|   *          @arg @ref CRC_INPUTDATA_INVERSION_BYTE     Byte-wise bit reversal | ||||
|   *          @arg @ref CRC_INPUTDATA_INVERSION_HALFWORD HalfWord-wise bit reversal | ||||
|   *          @arg @ref CRC_INPUTDATA_INVERSION_WORD     Word-wise bit reversal | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_CRCEx_Input_Data_Reverse(CRC_HandleTypeDef *hcrc, uint32_t InputReverseMode) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_CRC_INPUTDATA_INVERSION_MODE(InputReverseMode)); | ||||
|  | ||||
|   /* Change CRC peripheral state */ | ||||
|   hcrc->State = HAL_CRC_STATE_BUSY; | ||||
|  | ||||
|   /* set input data inversion mode */ | ||||
|   MODIFY_REG(hcrc->Instance->CR, CRC_CR_REV_IN, InputReverseMode); | ||||
|   /* Change CRC peripheral state */ | ||||
|   hcrc->State = HAL_CRC_STATE_READY; | ||||
|  | ||||
|   /* Return function status */ | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Set the Reverse Output data mode. | ||||
|   * @param  hcrc CRC handle | ||||
|   * @param  OutputReverseMode Output Data inversion mode. | ||||
|   *         This parameter can be one of the following values: | ||||
|   *          @arg @ref CRC_OUTPUTDATA_INVERSION_DISABLE no CRC inversion (default value) | ||||
|   *          @arg @ref CRC_OUTPUTDATA_INVERSION_ENABLE  bit-level inversion (e.g. for a 8-bit CRC: 0xB5 becomes 0xAD) | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_CRCEx_Output_Data_Reverse(CRC_HandleTypeDef *hcrc, uint32_t OutputReverseMode) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_CRC_OUTPUTDATA_INVERSION_MODE(OutputReverseMode)); | ||||
|  | ||||
|   /* Change CRC peripheral state */ | ||||
|   hcrc->State = HAL_CRC_STATE_BUSY; | ||||
|  | ||||
|   /* set output data inversion mode */ | ||||
|   MODIFY_REG(hcrc->Instance->CR, CRC_CR_REV_OUT, OutputReverseMode); | ||||
|  | ||||
|   /* Change CRC peripheral state */ | ||||
|   hcrc->State = HAL_CRC_STATE_READY; | ||||
|  | ||||
|   /* Return function status */ | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
|  | ||||
| #endif /* HAL_CRC_MODULE_ENABLED */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
							
								
								
									
										1312
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_dma.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1312
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_dma.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2146
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_dma2d.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2146
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_dma2d.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										308
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_dma_ex.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										308
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_dma_ex.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,308 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32f7xx_hal_dma_ex.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   DMA Extension HAL module driver | ||||
|   *         This file provides firmware functions to manage the following  | ||||
|   *         functionalities of the DMA Extension peripheral: | ||||
|   *           + Extended features functions | ||||
|   * | ||||
|   @verbatim | ||||
|   ============================================================================== | ||||
|                         ##### How to use this driver ##### | ||||
|   ============================================================================== | ||||
|   [..] | ||||
|   The DMA Extension HAL driver can be used as follows: | ||||
|    (+) Start a multi buffer transfer using the HAL_DMA_MultiBufferStart() function | ||||
|        for polling mode or HAL_DMA_MultiBufferStart_IT() for interrupt mode. | ||||
|  | ||||
|      -@-  In Memory-to-Memory transfer mode, Multi (Double) Buffer mode is not allowed. | ||||
|      -@-  When Multi (Double) Buffer mode is enabled, the transfer is circular by default. | ||||
|      -@-  In Multi (Double) buffer mode, it is possible to update the base address for  | ||||
|           the AHB memory port on the fly (DMA_SxM0AR or DMA_SxM1AR) when the stream is enabled. | ||||
|    | ||||
|   @endverbatim | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * Copyright (c) 2017 STMicroelectronics. | ||||
|   * All rights reserved. | ||||
|   * | ||||
|   * This software is licensed under terms that can be found in the LICENSE file in | ||||
|   * the root directory of this software component. | ||||
|   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32f7xx_hal.h" | ||||
|  | ||||
| /** @addtogroup STM32F7xx_HAL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup DMAEx DMAEx | ||||
|   * @brief DMA Extended HAL module driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #ifdef HAL_DMA_MODULE_ENABLED | ||||
|  | ||||
| /* Private types -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private Constants ---------------------------------------------------------*/ | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
| /* Private functions ---------------------------------------------------------*/ | ||||
| /** @addtogroup DMAEx_Private_Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Exported functions ---------------------------------------------------------*/ | ||||
|  | ||||
| /** @addtogroup DMAEx_Exported_Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
|  | ||||
| /** @addtogroup DMAEx_Exported_Functions_Group1 | ||||
|   * | ||||
| @verbatim | ||||
|  =============================================================================== | ||||
|                 #####  Extended features functions  ##### | ||||
|  ===============================================================================   | ||||
|     [..]  This section provides functions allowing to: | ||||
|       (+) Configure the source, destination address and data length and  | ||||
|           Start MultiBuffer DMA transfer | ||||
|       (+) Configure the source, destination address and data length and  | ||||
|           Start MultiBuffer DMA transfer with interrupt | ||||
|       (+) Change on the fly the memory0 or memory1 address. | ||||
|        | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   * @brief  Starts the multi_buffer DMA Transfer. | ||||
|   * @param  hdma       pointer to a DMA_HandleTypeDef structure that contains | ||||
|   *                     the configuration information for the specified DMA Stream.   | ||||
|   * @param  SrcAddress The source memory Buffer address | ||||
|   * @param  DstAddress The destination memory Buffer address | ||||
|   * @param  SecondMemAddress The second memory Buffer address in case of multi buffer Transfer   | ||||
|   * @param  DataLength The length of data to be transferred from source to destination | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength) | ||||
| { | ||||
|   HAL_StatusTypeDef status = HAL_OK; | ||||
|    | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_DMA_BUFFER_SIZE(DataLength)); | ||||
|    | ||||
|   /* Memory-to-memory transfer not supported in double buffering mode */ | ||||
|   if (hdma->Init.Direction == DMA_MEMORY_TO_MEMORY) | ||||
|   { | ||||
|     hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; | ||||
|     status = HAL_ERROR; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     /* Process Locked */ | ||||
|     __HAL_LOCK(hdma); | ||||
|      | ||||
|     if(HAL_DMA_STATE_READY == hdma->State) | ||||
|     { | ||||
|       /* Change DMA peripheral state */ | ||||
|       hdma->State = HAL_DMA_STATE_BUSY;  | ||||
|        | ||||
|       /* Enable the double buffer mode */ | ||||
|       hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM; | ||||
|        | ||||
|       /* Configure DMA Stream destination address */ | ||||
|       hdma->Instance->M1AR = SecondMemAddress; | ||||
|        | ||||
|       /* Configure the source, destination address and the data length */ | ||||
|       DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength); | ||||
|        | ||||
|       /* Enable the peripheral */ | ||||
|       __HAL_DMA_ENABLE(hdma); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       /* Return error status */ | ||||
|       status = HAL_BUSY; | ||||
|     } | ||||
|   } | ||||
|   return status; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Starts the multi_buffer DMA Transfer with interrupt enabled. | ||||
|   * @param  hdma       pointer to a DMA_HandleTypeDef structure that contains | ||||
|   *                     the configuration information for the specified DMA Stream.   | ||||
|   * @param  SrcAddress The source memory Buffer address | ||||
|   * @param  DstAddress The destination memory Buffer address | ||||
|   * @param  SecondMemAddress The second memory Buffer address in case of multi buffer Transfer   | ||||
|   * @param  DataLength The length of data to be transferred from source to destination | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength) | ||||
| { | ||||
|   HAL_StatusTypeDef status = HAL_OK; | ||||
|    | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_DMA_BUFFER_SIZE(DataLength)); | ||||
|    | ||||
|   /* Memory-to-memory transfer not supported in double buffering mode */ | ||||
|   if (hdma->Init.Direction == DMA_MEMORY_TO_MEMORY) | ||||
|   { | ||||
|     hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; | ||||
|     return HAL_ERROR; | ||||
|   } | ||||
|    | ||||
|   /* Process locked */ | ||||
|   __HAL_LOCK(hdma); | ||||
|    | ||||
|   if(HAL_DMA_STATE_READY == hdma->State) | ||||
|   { | ||||
|     /* Change DMA peripheral state */ | ||||
|     hdma->State = HAL_DMA_STATE_BUSY; | ||||
|      | ||||
|     /* Initialize the error code */ | ||||
|     hdma->ErrorCode = HAL_DMA_ERROR_NONE; | ||||
|      | ||||
|     /* Enable the Double buffer mode */ | ||||
|     hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM; | ||||
|      | ||||
|     /* Configure DMA Stream destination address */ | ||||
|     hdma->Instance->M1AR = SecondMemAddress; | ||||
|      | ||||
|     /* Configure the source, destination address and the data length */ | ||||
|     DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength);  | ||||
|      | ||||
|     /* Clear all flags */ | ||||
|     __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_TC_FLAG_INDEX(hdma)); | ||||
|     __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_HT_FLAG_INDEX(hdma)); | ||||
|     __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_TE_FLAG_INDEX(hdma)); | ||||
|     __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_DME_FLAG_INDEX(hdma)); | ||||
|     __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_FE_FLAG_INDEX(hdma)); | ||||
|      | ||||
|     /* Enable Common interrupts*/ | ||||
|     hdma->Instance->CR  |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME; | ||||
|     hdma->Instance->FCR |= DMA_IT_FE; | ||||
|      | ||||
|     if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) | ||||
|     { | ||||
|       hdma->Instance->CR  |= DMA_IT_HT; | ||||
|     } | ||||
|      | ||||
|     /* Enable the peripheral */ | ||||
|     __HAL_DMA_ENABLE(hdma);  | ||||
|   } | ||||
|   else | ||||
|   {      | ||||
|     /* Process unlocked */ | ||||
|     __HAL_UNLOCK(hdma);	   | ||||
|      | ||||
|     /* Return error status */ | ||||
|     status = HAL_BUSY; | ||||
|   }   | ||||
|   return status;  | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Change the memory0 or memory1 address on the fly. | ||||
|   * @param  hdma       pointer to a DMA_HandleTypeDef structure that contains | ||||
|   *                     the configuration information for the specified DMA Stream.   | ||||
|   * @param  Address    The new address | ||||
|   * @param  memory     the memory to be changed, This parameter can be one of  | ||||
|   *                     the following values: | ||||
|   *                      MEMORY0 / | ||||
|   *                      MEMORY1 | ||||
|   * @note   The MEMORY0 address can be changed only when the current transfer use | ||||
|   *         MEMORY1 and the MEMORY1 address can be changed only when the current  | ||||
|   *         transfer use MEMORY0. | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory) | ||||
| { | ||||
|   if(memory == MEMORY0) | ||||
|   { | ||||
|     /* change the memory0 address */ | ||||
|     hdma->Instance->M0AR = Address; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     /* change the memory1 address */ | ||||
|     hdma->Instance->M1AR = Address; | ||||
|   } | ||||
|    | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup DMAEx_Private_Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Set the DMA Transfer parameter. | ||||
|   * @param  hdma       pointer to a DMA_HandleTypeDef structure that contains | ||||
|   *                     the configuration information for the specified DMA Stream.   | ||||
|   * @param  SrcAddress The source memory Buffer address | ||||
|   * @param  DstAddress The destination memory Buffer address | ||||
|   * @param  DataLength The length of data to be transferred from source to destination | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) | ||||
| { | ||||
|   /* Configure DMA Stream data length */ | ||||
|   hdma->Instance->NDTR = DataLength; | ||||
|    | ||||
|   /* Peripheral to Memory */ | ||||
|   if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) | ||||
|   { | ||||
|     /* Configure DMA Stream destination address */ | ||||
|     hdma->Instance->PAR = DstAddress; | ||||
|      | ||||
|     /* Configure DMA Stream source address */ | ||||
|     hdma->Instance->M0AR = SrcAddress; | ||||
|   } | ||||
|   /* Memory to Peripheral */ | ||||
|   else | ||||
|   { | ||||
|     /* Configure DMA Stream source address */ | ||||
|     hdma->Instance->PAR = SrcAddress; | ||||
|      | ||||
|     /* Configure DMA Stream destination address */ | ||||
|     hdma->Instance->M0AR = DstAddress; | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* HAL_DMA_MODULE_ENABLED */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
							
								
								
									
										2745
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_dsi.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2745
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_dsi.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										547
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										547
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,547 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32F7xx_hal_exti.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   EXTI HAL module driver. | ||||
|   *          This file provides firmware functions to manage the following | ||||
|   *          functionalities of the Extended Interrupts and events controller (EXTI) peripheral: | ||||
|   *           + Initialization and de-initialization functions | ||||
|   *           + IO operation functions | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * Copyright (c) 2018 STMicroelectronics. | ||||
|   * All rights reserved. | ||||
|   * | ||||
|   * This software is licensed under terms that can be found in the LICENSE file | ||||
|   * in the root directory of this software component. | ||||
|   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   @verbatim | ||||
|   ============================================================================== | ||||
|                     ##### EXTI Peripheral features ##### | ||||
|   ============================================================================== | ||||
|   [..] | ||||
|     (+) Each Exti line can be configured within this driver. | ||||
|  | ||||
|     (+) Exti line can be configured in 3 different modes | ||||
|         (++) Interrupt | ||||
|         (++) Event | ||||
|         (++) Both of them | ||||
|  | ||||
|     (+) Configurable Exti lines can be configured with 3 different triggers | ||||
|         (++) Rising | ||||
|         (++) Falling | ||||
|         (++) Both of them | ||||
|  | ||||
|     (+) When set in interrupt mode, configurable Exti lines have two different | ||||
|         interrupts pending registers which allow to distinguish which transition | ||||
|         occurs: | ||||
|         (++) Rising edge pending interrupt | ||||
|         (++) Falling | ||||
|  | ||||
|     (+) Exti lines 0 to 15 are linked to gpio pin number 0 to 15. Gpio port can | ||||
|         be selected through multiplexer. | ||||
|  | ||||
|                      ##### How to use this driver ##### | ||||
|   ============================================================================== | ||||
|   [..] | ||||
|  | ||||
|     (#) Configure the EXTI line using HAL_EXTI_SetConfigLine(). | ||||
|         (++) Choose the interrupt line number by setting "Line" member from | ||||
|              EXTI_ConfigTypeDef structure. | ||||
|         (++) Configure the interrupt and/or event mode using "Mode" member from | ||||
|              EXTI_ConfigTypeDef structure. | ||||
|         (++) For configurable lines, configure rising and/or falling trigger | ||||
|              "Trigger" member from EXTI_ConfigTypeDef structure. | ||||
|         (++) For Exti lines linked to gpio, choose gpio port using "GPIOSel" | ||||
|              member from GPIO_InitTypeDef structure. | ||||
|  | ||||
|     (#) Get current Exti configuration of a dedicated line using | ||||
|         HAL_EXTI_GetConfigLine(). | ||||
|         (++) Provide exiting handle as parameter. | ||||
|         (++) Provide pointer on EXTI_ConfigTypeDef structure as second parameter. | ||||
|  | ||||
|     (#) Clear Exti configuration of a dedicated line using HAL_EXTI_GetConfigLine(). | ||||
|         (++) Provide exiting handle as parameter. | ||||
|  | ||||
|     (#) Register callback to treat Exti interrupts using HAL_EXTI_RegisterCallback(). | ||||
|         (++) Provide exiting handle as first parameter. | ||||
|         (++) Provide which callback will be registered using one value from | ||||
|              EXTI_CallbackIDTypeDef. | ||||
|         (++) Provide callback function pointer. | ||||
|  | ||||
|     (#) Get interrupt pending bit using HAL_EXTI_GetPending(). | ||||
|  | ||||
|     (#) Clear interrupt pending bit using HAL_EXTI_GetPending(). | ||||
|  | ||||
|     (#) Generate software interrupt using HAL_EXTI_GenerateSWI(). | ||||
|  | ||||
|   @endverbatim | ||||
|   */ | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32f7xx_hal.h" | ||||
|  | ||||
| /** @addtogroup STM32F7xx_HAL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup EXTI | ||||
|   * @{ | ||||
|   */ | ||||
| /** MISRA C:2012 deviation rule has been granted for following rule: | ||||
|   * Rule-18.1_b - Medium: Array `EXTICR' 1st subscript interval [0,7] may be out | ||||
|   * of bounds [0,3] in following API : | ||||
|   * HAL_EXTI_SetConfigLine | ||||
|   * HAL_EXTI_GetConfigLine | ||||
|   * HAL_EXTI_ClearConfigLine | ||||
|   */ | ||||
|  | ||||
| #ifdef HAL_EXTI_MODULE_ENABLED | ||||
|  | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private defines -----------------------------------------------------------*/ | ||||
| /** @defgroup EXTI_Private_Constants EXTI Private Constants | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
|  | ||||
| /** @addtogroup EXTI_Exported_Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup EXTI_Exported_Functions_Group1 | ||||
|   *  @brief    Configuration functions | ||||
|   * | ||||
| @verbatim | ||||
|  =============================================================================== | ||||
|               ##### Configuration functions ##### | ||||
|  =============================================================================== | ||||
|  | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Set configuration of a dedicated Exti line. | ||||
|   * @param  hexti Exti handle. | ||||
|   * @param  pExtiConfig Pointer on EXTI configuration to be set. | ||||
|   * @retval HAL Status. | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) | ||||
| { | ||||
|   uint32_t regval; | ||||
|   uint32_t linepos; | ||||
|   uint32_t maskline; | ||||
|  | ||||
|   /* Check null pointer */ | ||||
|   if ((hexti == NULL) || (pExtiConfig == NULL)) | ||||
|   { | ||||
|     return HAL_ERROR; | ||||
|   } | ||||
|  | ||||
|   /* Check parameters */ | ||||
|   assert_param(IS_EXTI_LINE(pExtiConfig->Line)); | ||||
|   assert_param(IS_EXTI_MODE(pExtiConfig->Mode)); | ||||
|  | ||||
|   /* Assign line number to handle */ | ||||
|   hexti->Line = pExtiConfig->Line; | ||||
|  | ||||
|   /* Compute line mask */ | ||||
|   linepos = (pExtiConfig->Line & EXTI_PIN_MASK); | ||||
|   maskline = (1uL << linepos); | ||||
|  | ||||
|   /* Configure triggers for configurable lines */ | ||||
|   if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) | ||||
|   { | ||||
|     assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); | ||||
|  | ||||
|     /* Configure rising trigger */ | ||||
|     /* Mask or set line */ | ||||
|     if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) | ||||
|     { | ||||
|       EXTI->RTSR |= maskline; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       EXTI->RTSR &= ~maskline; | ||||
|     } | ||||
|  | ||||
|     /* Configure falling trigger */ | ||||
|     /* Mask or set line */ | ||||
|     if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) | ||||
|     { | ||||
|       EXTI->FTSR |= maskline; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       EXTI->FTSR &= ~maskline; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /* Configure gpio port selection in case of gpio exti line */ | ||||
|     if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) | ||||
|     { | ||||
|       assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel)); | ||||
|       assert_param(IS_EXTI_GPIO_PIN(linepos)); | ||||
|  | ||||
|       regval = SYSCFG->EXTICR[linepos >> 2u]; | ||||
|       regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); | ||||
|       regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); | ||||
|       SYSCFG->EXTICR[linepos >> 2u] = regval; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   /* Configure interrupt mode : read current mode */ | ||||
|   /* Mask or set line */ | ||||
|   if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) | ||||
|   { | ||||
|     EXTI->IMR |= maskline; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     EXTI->IMR &= ~maskline; | ||||
|   } | ||||
|  | ||||
|   /* Configure event mode : read current mode */ | ||||
|   /* Mask or set line */ | ||||
|   if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) | ||||
|   { | ||||
|     EXTI->EMR |= maskline; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     EXTI->EMR &= ~maskline; | ||||
|   } | ||||
|  | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get configuration of a dedicated Exti line. | ||||
|   * @param  hexti Exti handle. | ||||
|   * @param  pExtiConfig Pointer on structure to store Exti configuration. | ||||
|   * @retval HAL Status. | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) | ||||
| { | ||||
|   uint32_t regval; | ||||
|   uint32_t linepos; | ||||
|   uint32_t maskline; | ||||
|  | ||||
|   /* Check null pointer */ | ||||
|   if ((hexti == NULL) || (pExtiConfig == NULL)) | ||||
|   { | ||||
|     return HAL_ERROR; | ||||
|   } | ||||
|  | ||||
|   /* Check the parameter */ | ||||
|   assert_param(IS_EXTI_LINE(hexti->Line)); | ||||
|  | ||||
|   /* Store handle line number to configuration structure */ | ||||
|   pExtiConfig->Line = hexti->Line; | ||||
|  | ||||
|   /* Compute line mask */ | ||||
|   linepos = (pExtiConfig->Line & EXTI_PIN_MASK); | ||||
|   maskline = (1uL << linepos); | ||||
|  | ||||
|   /* 1] Get core mode : interrupt */ | ||||
|  | ||||
|   /* Check if selected line is enable */ | ||||
|   if ((EXTI->IMR & maskline) != 0x00u) | ||||
|   { | ||||
|     pExtiConfig->Mode = EXTI_MODE_INTERRUPT; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     pExtiConfig->Mode = EXTI_MODE_NONE; | ||||
|   } | ||||
|  | ||||
|   /* Get event mode */ | ||||
|   /* Check if selected line is enable */ | ||||
|   if ((EXTI->EMR & maskline) != 0x00u) | ||||
|   { | ||||
|     pExtiConfig->Mode |= EXTI_MODE_EVENT; | ||||
|   } | ||||
|  | ||||
|   /* Get default Trigger and GPIOSel configuration */ | ||||
|   pExtiConfig->Trigger = EXTI_TRIGGER_NONE; | ||||
|   pExtiConfig->GPIOSel = 0x00u; | ||||
|  | ||||
|   /* 2] Get trigger for configurable lines : rising */ | ||||
|   if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) | ||||
|   { | ||||
|     /* Check if configuration of selected line is enable */ | ||||
|     if ((EXTI->RTSR & maskline) != 0x00u) | ||||
|     { | ||||
|       pExtiConfig->Trigger = EXTI_TRIGGER_RISING; | ||||
|     } | ||||
|  | ||||
|     /* Get falling configuration */ | ||||
|     /* Check if configuration of selected line is enable */ | ||||
|     if ((EXTI->FTSR & maskline) != 0x00u) | ||||
|     { | ||||
|       pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; | ||||
|     } | ||||
|  | ||||
|     /* Get Gpio port selection for gpio lines */ | ||||
|     if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) | ||||
|     { | ||||
|       assert_param(IS_EXTI_GPIO_PIN(linepos)); | ||||
|  | ||||
|       regval = SYSCFG->EXTICR[linepos >> 2u]; | ||||
|       pExtiConfig->GPIOSel = ((regval << (SYSCFG_EXTICR1_EXTI1_Pos * (3uL - (linepos & 0x03u)))) >> 24); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Clear whole configuration of a dedicated Exti line. | ||||
|   * @param  hexti Exti handle. | ||||
|   * @retval HAL Status. | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) | ||||
| { | ||||
|   uint32_t regval; | ||||
|   uint32_t linepos; | ||||
|   uint32_t maskline; | ||||
|  | ||||
|   /* Check null pointer */ | ||||
|   if (hexti == NULL) | ||||
|   { | ||||
|     return HAL_ERROR; | ||||
|   } | ||||
|  | ||||
|   /* Check the parameter */ | ||||
|   assert_param(IS_EXTI_LINE(hexti->Line)); | ||||
|  | ||||
|   /* compute line mask */ | ||||
|   linepos = (hexti->Line & EXTI_PIN_MASK); | ||||
|   maskline = (1uL << linepos); | ||||
|  | ||||
|   /* 1] Clear interrupt mode */ | ||||
|   EXTI->IMR = (EXTI->IMR & ~maskline); | ||||
|  | ||||
|   /* 2] Clear event mode */ | ||||
|   EXTI->EMR = (EXTI->EMR & ~maskline); | ||||
|  | ||||
|   /* 3] Clear triggers in case of configurable lines */ | ||||
|   if ((hexti->Line & EXTI_CONFIG) != 0x00u) | ||||
|   { | ||||
|     EXTI->RTSR = (EXTI->RTSR & ~maskline); | ||||
|     EXTI->FTSR = (EXTI->FTSR & ~maskline); | ||||
|  | ||||
|     /* Get Gpio port selection for gpio lines */ | ||||
|     if ((hexti->Line & EXTI_GPIO) == EXTI_GPIO) | ||||
|     { | ||||
|       assert_param(IS_EXTI_GPIO_PIN(linepos)); | ||||
|  | ||||
|       regval = SYSCFG->EXTICR[linepos >> 2u]; | ||||
|       regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); | ||||
|       SYSCFG->EXTICR[linepos >> 2u] = regval; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Register callback for a dedicated Exti line. | ||||
|   * @param  hexti Exti handle. | ||||
|   * @param  CallbackID User callback identifier. | ||||
|   *         This parameter can be one of @arg @ref EXTI_CallbackIDTypeDef values. | ||||
|   * @param  pPendingCbfn function pointer to be stored as callback. | ||||
|   * @retval HAL Status. | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void)) | ||||
| { | ||||
|   HAL_StatusTypeDef status = HAL_OK; | ||||
|  | ||||
|   switch (CallbackID) | ||||
|   { | ||||
|     case  HAL_EXTI_COMMON_CB_ID: | ||||
|       hexti->PendingCallback = pPendingCbfn; | ||||
|       break; | ||||
|  | ||||
|     default: | ||||
|       status = HAL_ERROR; | ||||
|       break; | ||||
|   } | ||||
|  | ||||
|   return status; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Store line number as handle private field. | ||||
|   * @param  hexti Exti handle. | ||||
|   * @param  ExtiLine Exti line number. | ||||
|   *         This parameter can be from 0 to @ref EXTI_LINE_NB. | ||||
|   * @retval HAL Status. | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_EXTI_LINE(ExtiLine)); | ||||
|  | ||||
|   /* Check null pointer */ | ||||
|   if (hexti == NULL) | ||||
|   { | ||||
|     return HAL_ERROR; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     /* Store line number as handle private field */ | ||||
|     hexti->Line = ExtiLine; | ||||
|  | ||||
|     return HAL_OK; | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup EXTI_Exported_Functions_Group2 | ||||
|   *  @brief EXTI IO functions. | ||||
|   * | ||||
| @verbatim | ||||
|  =============================================================================== | ||||
|                        ##### IO operation functions ##### | ||||
|  =============================================================================== | ||||
|  | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Handle EXTI interrupt request. | ||||
|   * @param  hexti Exti handle. | ||||
|   * @retval none. | ||||
|   */ | ||||
| void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) | ||||
| { | ||||
|   uint32_t regval; | ||||
|   uint32_t maskline; | ||||
|  | ||||
|   /* Compute line mask */ | ||||
|   maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); | ||||
|  | ||||
|   /* Get pending bit  */ | ||||
|   regval = (EXTI->PR & maskline); | ||||
|   if (regval != 0x00u) | ||||
|   { | ||||
|     /* Clear pending bit */ | ||||
|     EXTI->PR = maskline; | ||||
|  | ||||
|     /* Call callback */ | ||||
|     if (hexti->PendingCallback != NULL) | ||||
|     { | ||||
|       hexti->PendingCallback(); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Get interrupt pending bit of a dedicated line. | ||||
|   * @param  hexti Exti handle. | ||||
|   * @param  Edge Specify which pending edge as to be checked. | ||||
|   *         This parameter can be one of the following values: | ||||
|   *           @arg @ref EXTI_TRIGGER_RISING_FALLING | ||||
|   *         This parameter is kept for compatibility with other series. | ||||
|   * @retval 1 if interrupt is pending else 0. | ||||
|   */ | ||||
| uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) | ||||
| { | ||||
|   uint32_t regval; | ||||
|   uint32_t linepos; | ||||
|   uint32_t maskline; | ||||
|  | ||||
|   /* Check parameters */ | ||||
|   assert_param(IS_EXTI_LINE(hexti->Line)); | ||||
|   assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); | ||||
|   assert_param(IS_EXTI_PENDING_EDGE(Edge)); | ||||
|  | ||||
|   /* Compute line mask */ | ||||
|   linepos = (hexti->Line & EXTI_PIN_MASK); | ||||
|   maskline = (1uL << linepos); | ||||
|  | ||||
|   /* return 1 if bit is set else 0 */ | ||||
|   regval = ((EXTI->PR & maskline) >> linepos); | ||||
|   return regval; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Clear interrupt pending bit of a dedicated line. | ||||
|   * @param  hexti Exti handle. | ||||
|   * @param  Edge Specify which pending edge as to be clear. | ||||
|   *         This parameter can be one of the following values: | ||||
|   *           @arg @ref EXTI_TRIGGER_RISING_FALLING | ||||
|   *         This parameter is kept for compatibility with other series. | ||||
|   * @retval None. | ||||
|   */ | ||||
| void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) | ||||
| { | ||||
|   uint32_t maskline; | ||||
|  | ||||
|   /* Check parameters */ | ||||
|   assert_param(IS_EXTI_LINE(hexti->Line)); | ||||
|   assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); | ||||
|   assert_param(IS_EXTI_PENDING_EDGE(Edge)); | ||||
|  | ||||
|   /* Compute line mask */ | ||||
|   maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); | ||||
|  | ||||
|   /* Clear Pending bit */ | ||||
|   EXTI->PR =  maskline; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Generate a software interrupt for a dedicated line. | ||||
|   * @param  hexti Exti handle. | ||||
|   * @retval None. | ||||
|   */ | ||||
| void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti) | ||||
| { | ||||
|   uint32_t maskline; | ||||
|  | ||||
|   /* Check parameters */ | ||||
|   assert_param(IS_EXTI_LINE(hexti->Line)); | ||||
|   assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); | ||||
|  | ||||
|   /* Compute line mask */ | ||||
|   maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); | ||||
|  | ||||
|   /* Generate Software interrupt */ | ||||
|   EXTI->SWIER = maskline; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* HAL_EXTI_MODULE_ENABLED */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
							
								
								
									
										819
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_flash.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										819
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_flash.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,819 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32f7xx_hal_flash.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   FLASH HAL module driver. | ||||
|   *          This file provides firmware functions to manage the following  | ||||
|   *          functionalities of the internal FLASH memory: | ||||
|   *           + Program operations functions | ||||
|   *           + Memory Control functions  | ||||
|   *           + Peripheral Errors functions | ||||
|   *          | ||||
|   @verbatim | ||||
|   ============================================================================== | ||||
|                         ##### FLASH peripheral features ##### | ||||
|   ============================================================================== | ||||
|             | ||||
|   [..] The Flash memory interface manages CPU AHB I-Code and D-Code accesses  | ||||
|        to the Flash memory. It implements the erase and program Flash memory operations  | ||||
|        and the read and write protection mechanisms. | ||||
|        | ||||
|   [..] The Flash memory interface accelerates code execution with a system of instruction | ||||
|        prefetch and cache lines.  | ||||
|  | ||||
|   [..] The FLASH main features are: | ||||
|       (+) Flash memory read operations | ||||
|       (+) Flash memory program/erase operations | ||||
|       (+) Read / write protections | ||||
|       (+) Prefetch on I-Code | ||||
|       (+) 64 cache lines of 128 bits on I-Code | ||||
|       (+) 8 cache lines of 128 bits on D-Code | ||||
|        | ||||
|                      ##### How to use this driver ##### | ||||
|   ============================================================================== | ||||
|     [..]                              | ||||
|       This driver provides functions and macros to configure and program the FLASH  | ||||
|       memory of all STM32F7xx devices. | ||||
|      | ||||
|       (#) FLASH Memory IO Programming functions:  | ||||
|            (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and  | ||||
|                 HAL_FLASH_Lock() functions | ||||
|            (++) Program functions: byte, half word, word and double word | ||||
|            (++) There Two modes of programming : | ||||
|             (+++) Polling mode using HAL_FLASH_Program() function | ||||
|             (+++) Interrupt mode using HAL_FLASH_Program_IT() function | ||||
|      | ||||
|       (#) Interrupts and flags management functions :  | ||||
|            (++) Handle FLASH interrupts by calling HAL_FLASH_IRQHandler() | ||||
|            (++) Wait for last FLASH operation according to its status | ||||
|            (++) Get error flag status by calling HAL_SetErrorCode()           | ||||
|     [..]  | ||||
|       In addition to these functions, this driver includes a set of macros allowing | ||||
|       to handle the following operations: | ||||
|        (+) Set the latency | ||||
|        (+) Enable/Disable the prefetch buffer | ||||
|        (+) Enable/Disable the Instruction cache and the Data cache | ||||
|        (+) Reset the Instruction cache and the Data cache | ||||
|        (+) Enable/Disable the FLASH interrupts | ||||
|        (+) Monitor the FLASH flags status | ||||
|     [..]	    | ||||
| 	(@) For any Flash memory program operation (erase or program), the CPU clock frequency | ||||
|         (HCLK) must be at least 1MHz.  | ||||
| 	(@) The contents of the Flash memory are not guaranteed if a device reset occurs during  | ||||
| 	    a Flash memory operation. | ||||
|     (@) Any attempt to read the Flash memory while it is being written or erased, causes the  | ||||
| 	    bus to stall. Read operations are processed correctly once the program operation has  | ||||
| 		completed. This means that code or data fetches cannot be performed while a write/erase  | ||||
| 		operation is ongoing. | ||||
|            | ||||
|   @endverbatim | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * Copyright (c) 2017 STMicroelectronics. | ||||
|   * All rights reserved. | ||||
|   * | ||||
|   * This software is licensed under terms that can be found in the LICENSE file in | ||||
|   * the root directory of this software component. | ||||
|   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||
|   ****************************************************************************** | ||||
|   */  | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32f7xx_hal.h" | ||||
|  | ||||
| /** @addtogroup STM32F7xx_HAL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup FLASH FLASH | ||||
|   * @brief FLASH HAL module driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #ifdef HAL_FLASH_MODULE_ENABLED | ||||
|  | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private define ------------------------------------------------------------*/ | ||||
| /** @addtogroup FLASH_Private_Constants | ||||
|   * @{ | ||||
|   */ | ||||
| #define SECTOR_MASK               ((uint32_t)0xFFFFFF07U) | ||||
| #define FLASH_TIMEOUT_VALUE       ((uint32_t)50000U)/* 50 s */ | ||||
| /** | ||||
|   * @} | ||||
|   */          | ||||
| /* Private macro -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /** @addtogroup FLASH_Private_Variables | ||||
|   * @{ | ||||
|   */ | ||||
| /* Variable used for Erase sectors under interruption */ | ||||
| FLASH_ProcessTypeDef pFlash; | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /** @addtogroup FLASH_Private_Functions | ||||
|   * @{ | ||||
|   */ | ||||
| /* Program operations */ | ||||
| static void   FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data); | ||||
| static void   FLASH_Program_Word(uint32_t Address, uint32_t Data); | ||||
| static void   FLASH_Program_HalfWord(uint32_t Address, uint16_t Data); | ||||
| static void   FLASH_Program_Byte(uint32_t Address, uint8_t Data); | ||||
| static void   FLASH_SetErrorCode(void); | ||||
|  | ||||
| HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
| /** @defgroup FLASH_Exported_Functions FLASH Exported Functions | ||||
|   * @{ | ||||
|   */ | ||||
|    | ||||
| /** @defgroup FLASH_Exported_Functions_Group1 Programming operation functions  | ||||
|  *  @brief   Programming operation functions  | ||||
|  * | ||||
| @verbatim    | ||||
|  =============================================================================== | ||||
|                   ##### Programming operation functions ##### | ||||
|  ===============================================================================   | ||||
|     [..] | ||||
|     This subsection provides a set of functions allowing to manage the FLASH  | ||||
|     program operations. | ||||
|  | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Program byte, halfword, word or double word at a specified address | ||||
|   * @param  TypeProgram  Indicate the way to program at a specified address. | ||||
|   *                           This parameter can be a value of @ref FLASH_Type_Program | ||||
|   * @param  Address  specifies the address to be programmed. | ||||
|   * @param  Data specifies the data to be programmed | ||||
|   *  | ||||
|   * @retval HAL_StatusTypeDef HAL Status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data) | ||||
| { | ||||
|   HAL_StatusTypeDef status = HAL_ERROR; | ||||
|    | ||||
|   /* Process Locked */ | ||||
|   __HAL_LOCK(&pFlash); | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); | ||||
|  | ||||
|   /* Wait for last operation to be completed */ | ||||
|   status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); | ||||
|    | ||||
|   if(status == HAL_OK) | ||||
|   { | ||||
|     switch(TypeProgram) | ||||
|     { | ||||
|       case FLASH_TYPEPROGRAM_BYTE : | ||||
|       { | ||||
|         /*Program byte (8-bit) at a specified address.*/ | ||||
|         FLASH_Program_Byte(Address, (uint8_t) Data); | ||||
|         break; | ||||
|       } | ||||
|        | ||||
|       case FLASH_TYPEPROGRAM_HALFWORD : | ||||
|       { | ||||
|         /*Program halfword (16-bit) at a specified address.*/ | ||||
|         FLASH_Program_HalfWord(Address, (uint16_t) Data); | ||||
|         break; | ||||
|       } | ||||
|        | ||||
|       case FLASH_TYPEPROGRAM_WORD : | ||||
|       { | ||||
|         /*Program word (32-bit) at a specified address.*/ | ||||
|         FLASH_Program_Word(Address, (uint32_t) Data); | ||||
|         break; | ||||
|       } | ||||
|        | ||||
|       case FLASH_TYPEPROGRAM_DOUBLEWORD : | ||||
|       { | ||||
|         /*Program double word (64-bit) at a specified address.*/ | ||||
|         FLASH_Program_DoubleWord(Address, Data); | ||||
|         break; | ||||
|       } | ||||
|       default : | ||||
|         break; | ||||
|     } | ||||
|     /* Wait for last operation to be completed */ | ||||
|     status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); | ||||
|      | ||||
|     /* If the program operation is completed, disable the PG Bit */ | ||||
|     FLASH->CR &= (~FLASH_CR_PG); | ||||
|   } | ||||
|  | ||||
|   /* Process Unlocked */ | ||||
|   __HAL_UNLOCK(&pFlash); | ||||
|  | ||||
|   return status; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief   Program byte, halfword, word or double word at a specified address  with interrupt enabled. | ||||
|   * @param  TypeProgram  Indicate the way to program at a specified address. | ||||
|   *                           This parameter can be a value of @ref FLASH_Type_Program | ||||
|   * @param  Address  specifies the address to be programmed. | ||||
|   * @param  Data specifies the data to be programmed | ||||
|   *  | ||||
|   * @retval HAL Status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data) | ||||
| { | ||||
|   HAL_StatusTypeDef status = HAL_OK; | ||||
|    | ||||
|   /* Process Locked */ | ||||
|   __HAL_LOCK(&pFlash); | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); | ||||
|  | ||||
|   /* Enable End of FLASH Operation interrupt */ | ||||
|   __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP); | ||||
|    | ||||
|   /* Enable Error source interrupt */ | ||||
|   __HAL_FLASH_ENABLE_IT(FLASH_IT_ERR); | ||||
|    | ||||
|   /* Clear pending flags (if any) */   | ||||
|   __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP    | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |\ | ||||
|                          FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR| FLASH_FLAG_ERSERR);   | ||||
|  | ||||
|   pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAM; | ||||
|   pFlash.Address = Address; | ||||
|    | ||||
|   switch(TypeProgram) | ||||
|   { | ||||
|     case FLASH_TYPEPROGRAM_BYTE : | ||||
|     { | ||||
|       /*Program byte (8-bit) at a specified address.*/ | ||||
|       FLASH_Program_Byte(Address, (uint8_t) Data); | ||||
|       break; | ||||
|     } | ||||
|      | ||||
|     case FLASH_TYPEPROGRAM_HALFWORD : | ||||
|     { | ||||
|       /*Program halfword (16-bit) at a specified address.*/ | ||||
|       FLASH_Program_HalfWord(Address, (uint16_t) Data); | ||||
|       break; | ||||
|     } | ||||
|      | ||||
|     case FLASH_TYPEPROGRAM_WORD : | ||||
|     { | ||||
|       /*Program word (32-bit) at a specified address.*/ | ||||
|       FLASH_Program_Word(Address, (uint32_t) Data); | ||||
|       break; | ||||
|     } | ||||
|      | ||||
|     case FLASH_TYPEPROGRAM_DOUBLEWORD : | ||||
|     { | ||||
|       /*Program double word (64-bit) at a specified address.*/ | ||||
|       FLASH_Program_DoubleWord(Address, Data); | ||||
|       break; | ||||
|     } | ||||
|     default : | ||||
|       break; | ||||
|   } | ||||
|   return status; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief This function handles FLASH interrupt request. | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_FLASH_IRQHandler(void) | ||||
| { | ||||
|   uint32_t temp = 0; | ||||
|    | ||||
|   /* If the program operation is completed, disable the PG Bit */ | ||||
|   FLASH->CR &= (~FLASH_CR_PG); | ||||
|  | ||||
|   /* If the erase operation is completed, disable the SER Bit */ | ||||
|   FLASH->CR &= (~FLASH_CR_SER); | ||||
|   FLASH->CR &= SECTOR_MASK;  | ||||
|  | ||||
|   /* if the erase operation is completed, disable the MER Bit */ | ||||
|   FLASH->CR &= (~FLASH_MER_BIT); | ||||
|  | ||||
|   /* Check FLASH End of Operation flag  */ | ||||
|   if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET) | ||||
|   { | ||||
|     /* Clear FLASH End of Operation pending bit */ | ||||
|     __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); | ||||
|      | ||||
|     switch (pFlash.ProcedureOnGoing) | ||||
|     { | ||||
|       case FLASH_PROC_SECTERASE : | ||||
|       { | ||||
|         /* Nb of sector to erased can be decreased */ | ||||
|         pFlash.NbSectorsToErase--; | ||||
|  | ||||
|         /* Check if there are still sectors to erase */ | ||||
|         if(pFlash.NbSectorsToErase != 0) | ||||
|         { | ||||
|           temp = pFlash.Sector; | ||||
|           /* Indicate user which sector has been erased */ | ||||
|           HAL_FLASH_EndOfOperationCallback(temp); | ||||
|  | ||||
|           /* Increment sector number */ | ||||
|           temp = ++pFlash.Sector; | ||||
|           FLASH_Erase_Sector(temp, pFlash.VoltageForErase); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|           /* No more sectors to Erase, user callback can be called.*/ | ||||
|           /* Reset Sector and stop Erase sectors procedure */ | ||||
|           pFlash.Sector = temp = 0xFFFFFFFFU; | ||||
|           /* FLASH EOP interrupt user callback */ | ||||
|           HAL_FLASH_EndOfOperationCallback(temp); | ||||
|           /* Sector Erase procedure is completed */ | ||||
|           pFlash.ProcedureOnGoing = FLASH_PROC_NONE; | ||||
|         } | ||||
|         break; | ||||
|       } | ||||
|      | ||||
|       case FLASH_PROC_MASSERASE : | ||||
|       { | ||||
|         /* MassErase ended. Return the selected bank : in this product we don't have Banks */ | ||||
|         /* FLASH EOP interrupt user callback */ | ||||
|         HAL_FLASH_EndOfOperationCallback(0); | ||||
|         /* MAss Erase procedure is completed */ | ||||
|         pFlash.ProcedureOnGoing = FLASH_PROC_NONE; | ||||
|         break; | ||||
|       } | ||||
|  | ||||
|       case FLASH_PROC_PROGRAM : | ||||
|       { | ||||
|         /*Program ended. Return the selected address*/ | ||||
|         /* FLASH EOP interrupt user callback */ | ||||
|         HAL_FLASH_EndOfOperationCallback(pFlash.Address); | ||||
|         /* Programming procedure is completed */ | ||||
|         pFlash.ProcedureOnGoing = FLASH_PROC_NONE; | ||||
|         break; | ||||
|       } | ||||
|       default : | ||||
|         break; | ||||
|     } | ||||
|   } | ||||
|    | ||||
|   /* Check FLASH operation error flags */ | ||||
|   if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_ALL_ERRORS) != RESET) | ||||
|   { | ||||
|     switch (pFlash.ProcedureOnGoing) | ||||
|     { | ||||
|       case FLASH_PROC_SECTERASE : | ||||
|       { | ||||
|         /* return the faulty sector */ | ||||
|         temp = pFlash.Sector; | ||||
|         pFlash.Sector = 0xFFFFFFFFU; | ||||
|         break; | ||||
|       } | ||||
|       case FLASH_PROC_MASSERASE : | ||||
|       { | ||||
|         /* No return in case of Mass Erase */ | ||||
|         temp = 0; | ||||
|         break; | ||||
|       } | ||||
|       case FLASH_PROC_PROGRAM : | ||||
|       { | ||||
|         /*return the faulty address*/ | ||||
|         temp = pFlash.Address; | ||||
|         break; | ||||
|       } | ||||
|     default : | ||||
|       break; | ||||
|     } | ||||
|     /*Save the Error code*/ | ||||
|     FLASH_SetErrorCode(); | ||||
|  | ||||
|     /* FLASH error interrupt user callback */ | ||||
|     HAL_FLASH_OperationErrorCallback(temp); | ||||
|  | ||||
|     /*Stop the procedure ongoing */ | ||||
|     pFlash.ProcedureOnGoing = FLASH_PROC_NONE; | ||||
|   } | ||||
|    | ||||
|   if(pFlash.ProcedureOnGoing == FLASH_PROC_NONE) | ||||
|   { | ||||
|     /* Disable End of FLASH Operation interrupt */ | ||||
|     __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP); | ||||
|  | ||||
|     /* Disable Error source interrupt */ | ||||
|     __HAL_FLASH_DISABLE_IT(FLASH_IT_ERR); | ||||
|  | ||||
|     /* Process Unlocked */ | ||||
|     __HAL_UNLOCK(&pFlash); | ||||
|   } | ||||
|    | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  FLASH end of operation interrupt callback | ||||
|   * @param  ReturnValue The value saved in this parameter depends on the ongoing procedure | ||||
|   *                 - Sectors Erase: Sector which has been erased (if 0xFFFFFFFF, it means that  | ||||
|   *                                  all the selected sectors have been erased) | ||||
|   *                 - Program      : Address which was selected for data program | ||||
|   *                 - Mass Erase   : No return value expected | ||||
|   * @retval None | ||||
|   */ | ||||
| __weak void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue) | ||||
| { | ||||
|   /* Prevent unused argument(s) compilation warning */ | ||||
|   UNUSED(ReturnValue); | ||||
|   /* NOTE : This function Should not be modified, when the callback is needed, | ||||
|   the HAL_FLASH_EndOfOperationCallback could be implemented in the user file | ||||
|   */  | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  FLASH operation error interrupt callback | ||||
|   * @param  ReturnValue The value saved in this parameter depends on the ongoing procedure | ||||
|   *                 - Sectors Erase: Sector which has been erased (if 0xFFFFFFFF, it means that  | ||||
|   *                                  all the selected sectors have been erased) | ||||
|   *                 - Program      : Address which was selected for data program | ||||
|   *                 - Mass Erase   : No return value expected | ||||
|   * @retval None | ||||
|   */ | ||||
| __weak void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue) | ||||
| { | ||||
|   /* Prevent unused argument(s) compilation warning */ | ||||
|   UNUSED(ReturnValue); | ||||
|   /* NOTE : This function Should not be modified, when the callback is needed, | ||||
|   the HAL_FLASH_OperationErrorCallback could be implemented in the user file | ||||
|    */  | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup FLASH_Exported_Functions_Group2 Peripheral Control functions  | ||||
|  *  @brief   management functions  | ||||
|  * | ||||
| @verbatim    | ||||
|  =============================================================================== | ||||
|                       ##### Peripheral Control functions ##### | ||||
|  ===============================================================================   | ||||
|     [..] | ||||
|     This subsection provides a set of functions allowing to control the FLASH  | ||||
|     memory operations. | ||||
|  | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Unlock the FLASH control register access | ||||
|   * @retval HAL Status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_FLASH_Unlock(void) | ||||
| { | ||||
|   HAL_StatusTypeDef status = HAL_OK; | ||||
|  | ||||
|   if(READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) | ||||
|   { | ||||
|     /* Authorize the FLASH Registers access */ | ||||
|     WRITE_REG(FLASH->KEYR, FLASH_KEY1); | ||||
|     WRITE_REG(FLASH->KEYR, FLASH_KEY2); | ||||
|  | ||||
|     /* Verify Flash is unlocked */ | ||||
|     if(READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) | ||||
|     { | ||||
|       status = HAL_ERROR; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return status; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Locks the FLASH control register access | ||||
|   * @retval HAL Status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_FLASH_Lock(void) | ||||
| { | ||||
|   /* Set the LOCK Bit to lock the FLASH Registers access */ | ||||
|   FLASH->CR |= FLASH_CR_LOCK; | ||||
|    | ||||
|   return HAL_OK;   | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Unlock the FLASH Option Control Registers access. | ||||
|   * @retval HAL Status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void) | ||||
| { | ||||
|   if((FLASH->OPTCR & FLASH_OPTCR_OPTLOCK) != RESET) | ||||
|   { | ||||
|     /* Authorizes the Option Byte register programming */ | ||||
|     FLASH->OPTKEYR = FLASH_OPT_KEY1; | ||||
|     FLASH->OPTKEYR = FLASH_OPT_KEY2; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return HAL_ERROR; | ||||
|   }   | ||||
|    | ||||
|   return HAL_OK;   | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Lock the FLASH Option Control Registers access. | ||||
|   * @retval HAL Status  | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_FLASH_OB_Lock(void) | ||||
| { | ||||
|   /* Set the OPTLOCK Bit to lock the FLASH Option Byte Registers access */ | ||||
|   FLASH->OPTCR |= FLASH_OPTCR_OPTLOCK; | ||||
|    | ||||
|   return HAL_OK;   | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Launch the option byte loading. | ||||
|   * @retval HAL Status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_FLASH_OB_Launch(void) | ||||
| { | ||||
|   /* Set the OPTSTRT bit in OPTCR register */ | ||||
|   FLASH->OPTCR |= FLASH_OPTCR_OPTSTRT; | ||||
|  | ||||
|   /* Wait for last operation to be completed */ | ||||
|   return(FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE));  | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup FLASH_Exported_Functions_Group3 Peripheral State and Errors functions  | ||||
|  *  @brief   Peripheral Errors functions  | ||||
|  * | ||||
| @verbatim    | ||||
|  =============================================================================== | ||||
|                 ##### Peripheral Errors functions ##### | ||||
|  ===============================================================================   | ||||
|     [..] | ||||
|     This subsection permits to get in run-time Errors of the FLASH peripheral. | ||||
|  | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Get the specific FLASH error flag. | ||||
|   * @retval FLASH_ErrorCode: The returned value can be: | ||||
|   *            @arg FLASH_ERROR_ERS: FLASH Erasing Sequence error flag  | ||||
|   *            @arg FLASH_ERROR_PGP: FLASH Programming Parallelism error flag   | ||||
|   *            @arg FLASH_ERROR_PGA: FLASH Programming Alignment error flag | ||||
|   *            @arg FLASH_ERROR_WRP: FLASH Write protected error flag | ||||
|   *            @arg FLASH_ERROR_OPERATION: FLASH operation Error flag  | ||||
|   */ | ||||
| uint32_t HAL_FLASH_GetError(void) | ||||
| {  | ||||
|    return pFlash.ErrorCode; | ||||
| }   | ||||
|    | ||||
| /** | ||||
|   * @} | ||||
|   */     | ||||
|  | ||||
| /** | ||||
|   * @brief  Wait for a FLASH operation to complete. | ||||
|   * @param  Timeout maximum flash operationtimeout | ||||
|   * @retval HAL Status | ||||
|   */ | ||||
| HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout) | ||||
| {  | ||||
|   uint32_t tickstart = 0; | ||||
|    | ||||
|   /* Clear Error Code */ | ||||
|   pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; | ||||
|    | ||||
|   /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset. | ||||
|      Even if the FLASH operation fails, the BUSY flag will be reset and an error | ||||
|      flag will be set */ | ||||
|   /* Get tick */ | ||||
|   tickstart = HAL_GetTick(); | ||||
|  | ||||
|   while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) != RESET)  | ||||
|   {  | ||||
|     if(Timeout != HAL_MAX_DELAY) | ||||
|     { | ||||
|       if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) | ||||
|       { | ||||
|         return HAL_TIMEOUT; | ||||
|       } | ||||
|     }  | ||||
|   } | ||||
|    | ||||
|   if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_ALL_ERRORS) != RESET) | ||||
|   { | ||||
|     /*Save the error code*/ | ||||
|     FLASH_SetErrorCode(); | ||||
|     return HAL_ERROR; | ||||
|   } | ||||
|    | ||||
|   /* Check FLASH End of Operation flag  */ | ||||
|   if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != RESET) | ||||
|   { | ||||
|     /* Clear FLASH End of Operation pending bit */ | ||||
|     __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); | ||||
|   } | ||||
|  | ||||
|   /* If there is an error flag set */ | ||||
|   return HAL_OK; | ||||
|    | ||||
| }   | ||||
|  | ||||
| /** | ||||
|   * @brief  Program a double word (64-bit) at a specified address. | ||||
|   * @note   This function must be used when the device voltage range is from | ||||
|   *         2.7V to 3.6V and an External Vpp is present. | ||||
|   * | ||||
|   * @note   If an erase and a program operations are requested simultaneously,     | ||||
|   *         the erase operation is performed before the program one. | ||||
|   *   | ||||
|   * @param  Address specifies the address to be programmed. | ||||
|   * @param  Data specifies the data to be programmed. | ||||
|   * @retval None | ||||
|   */ | ||||
| static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_FLASH_ADDRESS(Address)); | ||||
|    | ||||
|   /* If the previous operation is completed, proceed to program the new data */ | ||||
|   FLASH->CR &= CR_PSIZE_MASK; | ||||
|   FLASH->CR |= FLASH_PSIZE_DOUBLE_WORD; | ||||
|   FLASH->CR |= FLASH_CR_PG; | ||||
|  | ||||
|   /* Program first word */ | ||||
|   *(__IO uint32_t*)Address = (uint32_t)Data; | ||||
|   /* Barrier to ensure programming is performed in 2 steps, in right order | ||||
|     (independently of compiler optimization behavior) */ | ||||
|   __ISB(); | ||||
|  | ||||
|   /* Program second word */ | ||||
|   *(__IO uint32_t*)(Address+4) = (uint32_t)(Data >> 32); | ||||
|  | ||||
|   /* Data synchronous Barrier (DSB) Just after the write operation | ||||
|      This will force the CPU to respect the sequence of instruction (no optimization).*/ | ||||
|   __DSB(); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|   * @brief  Program word (32-bit) at a specified address. | ||||
|   * @note   This function must be used when the device voltage range is from | ||||
|   *         2.7V to 3.3V. | ||||
|   * | ||||
|   * @note   If an erase and a program operations are requested simultaneously,     | ||||
|   *         the erase operation is performed before the program one. | ||||
|   *   | ||||
|   * @param  Address specifies the address to be programmed. | ||||
|   * @param  Data specifies the data to be programmed. | ||||
|   * @retval None | ||||
|   */ | ||||
| static void FLASH_Program_Word(uint32_t Address, uint32_t Data) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_FLASH_ADDRESS(Address)); | ||||
|    | ||||
|   /* If the previous operation is completed, proceed to program the new data */ | ||||
|   FLASH->CR &= CR_PSIZE_MASK; | ||||
|   FLASH->CR |= FLASH_PSIZE_WORD; | ||||
|   FLASH->CR |= FLASH_CR_PG; | ||||
|  | ||||
|   *(__IO uint32_t*)Address = Data; | ||||
|    | ||||
|   /* Data synchronous Barrier (DSB) Just after the write operation | ||||
|      This will force the CPU to respect the sequence of instruction (no optimization).*/ | ||||
|   __DSB(); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Program a half-word (16-bit) at a specified address. | ||||
|   * @note   This function must be used when the device voltage range is from | ||||
|   *         2.1V to 3.6V. | ||||
|   * | ||||
|   * @note   If an erase and a program operations are requested simultaneously,     | ||||
|   *         the erase operation is performed before the program one. | ||||
|   *   | ||||
|   * @param  Address specifies the address to be programmed. | ||||
|   * @param  Data specifies the data to be programmed. | ||||
|   * @retval None | ||||
|   */ | ||||
| static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_FLASH_ADDRESS(Address)); | ||||
|    | ||||
|   /* If the previous operation is completed, proceed to program the new data */ | ||||
|   FLASH->CR &= CR_PSIZE_MASK; | ||||
|   FLASH->CR |= FLASH_PSIZE_HALF_WORD; | ||||
|   FLASH->CR |= FLASH_CR_PG; | ||||
|  | ||||
|   *(__IO uint16_t*)Address = Data; | ||||
|  | ||||
|   /* Data synchronous Barrier (DSB) Just after the write operation | ||||
|      This will force the CPU to respect the sequence of instruction (no optimization).*/ | ||||
|   __DSB(); | ||||
|    | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Program byte (8-bit) at a specified address. | ||||
|   * @note   This function must be used when the device voltage range is from | ||||
|   *         1.7V to 3.6V. | ||||
|   * | ||||
|   * @note   If an erase and a program operations are requested simultaneously,     | ||||
|   *         the erase operation is performed before the program one. | ||||
|   *   | ||||
|   * @param  Address specifies the address to be programmed. | ||||
|   * @param  Data specifies the data to be programmed. | ||||
|   * @retval None | ||||
|   */ | ||||
| static void FLASH_Program_Byte(uint32_t Address, uint8_t Data) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_FLASH_ADDRESS(Address)); | ||||
|    | ||||
|   /* If the previous operation is completed, proceed to program the new data */ | ||||
|   FLASH->CR &= CR_PSIZE_MASK; | ||||
|   FLASH->CR |= FLASH_PSIZE_BYTE; | ||||
|   FLASH->CR |= FLASH_CR_PG; | ||||
|  | ||||
|   *(__IO uint8_t*)Address = Data; | ||||
|  | ||||
|   /* Data synchronous Barrier (DSB) Just after the write operation | ||||
|      This will force the CPU to respect the sequence of instruction (no optimization).*/ | ||||
|   __DSB(); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Set the specific FLASH error flag. | ||||
|   * @retval None | ||||
|   */ | ||||
| static void FLASH_SetErrorCode(void) | ||||
| { | ||||
|   if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPERR) != RESET) | ||||
|   { | ||||
|     pFlash.ErrorCode |= HAL_FLASH_ERROR_OPERATION; | ||||
|   } | ||||
|    | ||||
|   if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) != RESET) | ||||
|   { | ||||
|    pFlash.ErrorCode |= HAL_FLASH_ERROR_WRP; | ||||
|   } | ||||
|    | ||||
|   if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGAERR) != RESET) | ||||
|   { | ||||
|    pFlash.ErrorCode |= HAL_FLASH_ERROR_PGA; | ||||
|   } | ||||
|    | ||||
|   if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGPERR) != RESET) | ||||
|   { | ||||
|     pFlash.ErrorCode |= HAL_FLASH_ERROR_PGP; | ||||
|   } | ||||
|    | ||||
|   if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_ERSERR) != RESET) | ||||
|   { | ||||
|     pFlash.ErrorCode |= HAL_FLASH_ERROR_ERS; | ||||
|   } | ||||
|    | ||||
| #if defined (FLASH_OPTCR2_PCROP) | ||||
|   if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_RDERR) != RESET) | ||||
|   {  | ||||
|    pFlash.ErrorCode |= HAL_FLASH_ERROR_RD; | ||||
|   }   | ||||
| #endif /* FLASH_OPTCR2_PCROP */ | ||||
|    | ||||
|   /* Clear error programming flags */ | ||||
|   __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* HAL_FLASH_MODULE_ENABLED */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
							
								
								
									
										1119
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_flash_ex.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1119
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_flash_ex.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										527
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										527
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,527 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32f7xx_hal_gpio.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   GPIO HAL module driver. | ||||
|   *          This file provides firmware functions to manage the following  | ||||
|   *          functionalities of the General Purpose Input/Output (GPIO) peripheral: | ||||
|   *           + Initialization and de-initialization functions | ||||
|   *           + IO operation functions | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * Copyright (c) 2017 STMicroelectronics. | ||||
|   * All rights reserved. | ||||
|   * | ||||
|   * This software is licensed under terms that can be found in the LICENSE file | ||||
|   * in the root directory of this software component. | ||||
|   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   @verbatim | ||||
|   ============================================================================== | ||||
|                     ##### GPIO Peripheral features ##### | ||||
|   ============================================================================== | ||||
|   [..]  | ||||
|   Subject to the specific hardware characteristics of each I/O port listed in the datasheet, each | ||||
|   port bit of the General Purpose IO (GPIO) Ports, can be individually configured by software | ||||
|   in several modes: | ||||
|   (+) Input mode  | ||||
|   (+) Analog mode | ||||
|   (+) Output mode | ||||
|   (+) Alternate function mode | ||||
|   (+) External interrupt/event lines | ||||
|  | ||||
|   [..]   | ||||
|   During and just after reset, the alternate functions and external interrupt   | ||||
|   lines are not active and the I/O ports are configured in input floating mode. | ||||
|    | ||||
|   [..]    | ||||
|   All GPIO pins have weak internal pull-up and pull-down resistors, which can be  | ||||
|   activated or not. | ||||
|  | ||||
|   [..] | ||||
|   In Output or Alternate mode, each IO can be configured on open-drain or push-pull | ||||
|   type and the IO speed can be selected depending on the VDD value. | ||||
|  | ||||
|   [..]   | ||||
|   All ports have external interrupt/event capability. To use external interrupt  | ||||
|   lines, the port must be configured in input mode. All available GPIO pins are  | ||||
|   connected to the 16 external interrupt/event lines from EXTI0 to EXTI15. | ||||
|    | ||||
|   [..] | ||||
|   The external interrupt/event controller consists of up to 23 edge detectors  | ||||
|   (16 lines are connected to GPIO) for generating event/interrupt requests (each  | ||||
|   input line can be independently configured to select the type (interrupt or event)  | ||||
|   and the corresponding trigger event (rising or falling or both). Each line can  | ||||
|   also be masked independently.  | ||||
|  | ||||
|                      ##### How to use this driver ##### | ||||
|   ==============================================================================   | ||||
|   [..] | ||||
|     (#) Enable the GPIO AHB clock using the following function: __HAL_RCC_GPIOx_CLK_ENABLE().  | ||||
|  | ||||
|     (#) Configure the GPIO pin(s) using HAL_GPIO_Init(). | ||||
|         (++) Configure the IO mode using "Mode" member from GPIO_InitTypeDef structure | ||||
|         (++) Activate Pull-up, Pull-down resistor using "Pull" member from GPIO_InitTypeDef  | ||||
|              structure. | ||||
|         (++) In case of Output or alternate function mode selection: the speed is  | ||||
|              configured through "Speed" member from GPIO_InitTypeDef structure. | ||||
|         (++) In alternate mode is selection, the alternate function connected to the IO | ||||
|              is configured through "Alternate" member from GPIO_InitTypeDef structure. | ||||
|         (++) Analog mode is required when a pin is to be used as ADC channel  | ||||
|              or DAC output. | ||||
|         (++) In case of external interrupt/event selection the "Mode" member from  | ||||
|              GPIO_InitTypeDef structure select the type (interrupt or event) and  | ||||
|              the corresponding trigger event (rising or falling or both). | ||||
|  | ||||
|     (#) In case of external interrupt/event mode selection, configure NVIC IRQ priority  | ||||
|         mapped to the EXTI line using HAL_NVIC_SetPriority() and enable it using | ||||
|         HAL_NVIC_EnableIRQ(). | ||||
|           | ||||
|     (#) To get the level of a pin configured in input mode use HAL_GPIO_ReadPin(). | ||||
|              | ||||
|     (#) To set/reset the level of a pin configured in output mode use  | ||||
|         HAL_GPIO_WritePin()/HAL_GPIO_TogglePin(). | ||||
|      | ||||
|     (#) To lock pin configuration until next reset use HAL_GPIO_LockPin(). | ||||
|  | ||||
|                   | ||||
|     (#) During and just after reset, the alternate functions are not  | ||||
|         active and the GPIO pins are configured in input floating mode (except JTAG | ||||
|         pins). | ||||
|    | ||||
|     (#) The LSE oscillator pins OSC32_IN and OSC32_OUT can be used as general purpose  | ||||
|         (PC14 and PC15, respectively) when the LSE oscillator is off. The LSE has  | ||||
|         priority over the GPIO function. | ||||
|    | ||||
|     (#) The HSE oscillator pins OSC_IN/OSC_OUT can be used as  | ||||
|         general purpose PH0 and PH1, respectively, when the HSE oscillator is off.  | ||||
|         The HSE has priority over the GPIO function. | ||||
|    | ||||
|   @endverbatim | ||||
|   ****************************************************************************** | ||||
|   */  | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32f7xx_hal.h" | ||||
|  | ||||
| /** @addtogroup STM32F7xx_HAL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup GPIO GPIO | ||||
|   * @brief GPIO HAL module driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #ifdef HAL_GPIO_MODULE_ENABLED | ||||
|  | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private define ------------------------------------------------------------*/ | ||||
| /** @addtogroup GPIO_Private_Constants GPIO Private Constants | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #define GPIO_NUMBER           ((uint32_t)16U) | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
| /* Private macro -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /* Private functions ---------------------------------------------------------*/ | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
| /** @defgroup GPIO_Exported_Functions GPIO Exported Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup GPIO_Exported_Functions_Group1 Initialization and de-initialization functions | ||||
|  *  @brief    Initialization and Configuration functions | ||||
|  * | ||||
| @verbatim | ||||
|  =============================================================================== | ||||
|               ##### Initialization and de-initialization functions ##### | ||||
|  =============================================================================== | ||||
|   [..] | ||||
|     This section provides functions allowing to initialize and de-initialize the GPIOs | ||||
|     to be ready for use. | ||||
|   | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Initializes the GPIOx peripheral according to the specified parameters in the GPIO_Init. | ||||
|   * @param  GPIOx where x can be (A..K) to select the GPIO peripheral. | ||||
|   * @param  GPIO_Init pointer to a GPIO_InitTypeDef structure that contains | ||||
|   *         the configuration information for the specified GPIO peripheral. | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init) | ||||
| { | ||||
|   uint32_t position = 0x00; | ||||
|   uint32_t ioposition = 0x00; | ||||
|   uint32_t iocurrent = 0x00; | ||||
|   uint32_t temp = 0x00; | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); | ||||
|   assert_param(IS_GPIO_PIN(GPIO_Init->Pin)); | ||||
|   assert_param(IS_GPIO_MODE(GPIO_Init->Mode)); | ||||
|  | ||||
|   /* Configure the port pins */ | ||||
|   for(position = 0; position < GPIO_NUMBER; position++) | ||||
|   { | ||||
|     /* Get the IO position */ | ||||
|     ioposition = ((uint32_t)0x01) << position; | ||||
|     /* Get the current IO position */ | ||||
|     iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition; | ||||
|  | ||||
|     if(iocurrent == ioposition) | ||||
|     { | ||||
|       /*--------------------- GPIO Mode Configuration ------------------------*/ | ||||
|       /* In case of Output or Alternate function mode selection */ | ||||
|       if(((GPIO_Init->Mode & GPIO_MODE) == MODE_OUTPUT) || ((GPIO_Init->Mode & GPIO_MODE) == MODE_AF)) | ||||
|       { | ||||
|         /* Check the Speed parameter */ | ||||
|         assert_param(IS_GPIO_SPEED(GPIO_Init->Speed)); | ||||
|         /* Configure the IO Speed */ | ||||
|         temp = GPIOx->OSPEEDR;  | ||||
|         temp &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2)); | ||||
|         temp |= (GPIO_Init->Speed << (position * 2)); | ||||
|         GPIOx->OSPEEDR = temp; | ||||
|  | ||||
|         /* Configure the IO Output Type */ | ||||
|         temp = GPIOx->OTYPER; | ||||
|         temp &= ~(GPIO_OTYPER_OT_0 << position) ; | ||||
|         temp |= (((GPIO_Init->Mode & OUTPUT_TYPE) >> OUTPUT_TYPE_Pos) << position); | ||||
|         GPIOx->OTYPER = temp; | ||||
|       } | ||||
|        | ||||
|       if((GPIO_Init->Mode & GPIO_MODE) != MODE_ANALOG) | ||||
|       { | ||||
|         /* Check the Pull parameter */ | ||||
|         assert_param(IS_GPIO_PULL(GPIO_Init->Pull)); | ||||
|  | ||||
|         /* Activate the Pull-up or Pull down resistor for the current IO */ | ||||
|         temp = GPIOx->PUPDR; | ||||
|         temp &= ~(GPIO_PUPDR_PUPDR0 << (position * 2)); | ||||
|         temp |= ((GPIO_Init->Pull) << (position * 2)); | ||||
|         GPIOx->PUPDR = temp; | ||||
|       } | ||||
|  | ||||
|       /* In case of Alternate function mode selection */ | ||||
|       if((GPIO_Init->Mode & GPIO_MODE) == MODE_AF) | ||||
|       { | ||||
|         /* Check the Alternate function parameter */ | ||||
|         assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); | ||||
|  | ||||
|         /* Configure Alternate function mapped with the current IO */ | ||||
|         temp = GPIOx->AFR[position >> 3]; | ||||
|         temp &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; | ||||
|         temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4)); | ||||
|         GPIOx->AFR[position >> 3] = temp; | ||||
|       } | ||||
|        | ||||
|       /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ | ||||
|       temp = GPIOx->MODER; | ||||
|       temp &= ~(GPIO_MODER_MODER0 << (position * 2)); | ||||
|       temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2)); | ||||
|       GPIOx->MODER = temp; | ||||
|  | ||||
|       /*--------------------- EXTI Mode Configuration ------------------------*/ | ||||
|       /* Configure the External Interrupt or event for the current IO */ | ||||
|       if((GPIO_Init->Mode & EXTI_MODE) != 0x00u) | ||||
|       { | ||||
|         /* Enable SYSCFG Clock */ | ||||
|         __HAL_RCC_SYSCFG_CLK_ENABLE(); | ||||
|  | ||||
|         temp = SYSCFG->EXTICR[position >> 2]; | ||||
|         temp &= ~(((uint32_t)0x0F) << (4 * (position & 0x03))); | ||||
|         temp |= ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4 * (position & 0x03))); | ||||
|         SYSCFG->EXTICR[position >> 2] = temp; | ||||
|  | ||||
|         /* Clear Rising Falling edge configuration */ | ||||
|         temp = EXTI->RTSR; | ||||
|         temp &= ~((uint32_t)iocurrent); | ||||
|         if((GPIO_Init->Mode & TRIGGER_RISING) != 0x00u) | ||||
|         { | ||||
|           temp |= iocurrent; | ||||
|         } | ||||
|         EXTI->RTSR = temp; | ||||
|  | ||||
|         temp = EXTI->FTSR; | ||||
|         temp &= ~((uint32_t)iocurrent); | ||||
|         if((GPIO_Init->Mode & TRIGGER_FALLING) != 0x00u) | ||||
|         { | ||||
|           temp |= iocurrent; | ||||
|         } | ||||
|         EXTI->FTSR = temp; | ||||
|  | ||||
|         temp = EXTI->EMR; | ||||
|         temp &= ~((uint32_t)iocurrent); | ||||
|         if((GPIO_Init->Mode & EXTI_EVT) != 0x00u) | ||||
|         { | ||||
|           temp |= iocurrent; | ||||
|         } | ||||
|         EXTI->EMR = temp; | ||||
|  | ||||
|         /* Clear EXTI line configuration */ | ||||
|         temp = EXTI->IMR; | ||||
|         temp &= ~((uint32_t)iocurrent); | ||||
|         if((GPIO_Init->Mode & EXTI_IT) != 0x00u) | ||||
|         { | ||||
|           temp |= iocurrent; | ||||
|         } | ||||
|         EXTI->IMR = temp; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  De-initializes the GPIOx peripheral registers to their default reset values. | ||||
|   * @param  GPIOx where x can be (A..K) to select the GPIO peripheral. | ||||
|   * @param  GPIO_Pin specifies the port bit to be written. | ||||
|   *          This parameter can be one of GPIO_PIN_x where x can be (0..15). | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin) | ||||
| { | ||||
|   uint32_t position; | ||||
|   uint32_t ioposition = 0x00; | ||||
|   uint32_t iocurrent = 0x00; | ||||
|   uint32_t tmp = 0x00; | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); | ||||
|  | ||||
|   /* Configure the port pins */ | ||||
|   for(position = 0; position < GPIO_NUMBER; position++) | ||||
|   { | ||||
|     /* Get the IO position */ | ||||
|     ioposition = ((uint32_t)0x01) << position; | ||||
|     /* Get the current IO position */ | ||||
|     iocurrent = (GPIO_Pin) & ioposition; | ||||
|  | ||||
|     if(iocurrent == ioposition) | ||||
|     { | ||||
|       /*------------------------- EXTI Mode Configuration --------------------*/ | ||||
|       tmp = SYSCFG->EXTICR[position >> 2]; | ||||
|       tmp &= (((uint32_t)0x0F) << (4 * (position & 0x03))); | ||||
|       if(tmp == ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4 * (position & 0x03)))) | ||||
|       { | ||||
|         /* Clear EXTI line configuration */ | ||||
|         EXTI->IMR &= ~((uint32_t)iocurrent); | ||||
|         EXTI->EMR &= ~((uint32_t)iocurrent); | ||||
|  | ||||
|         /* Clear Rising Falling edge configuration */ | ||||
|         EXTI->FTSR &= ~((uint32_t)iocurrent); | ||||
|         EXTI->RTSR &= ~((uint32_t)iocurrent); | ||||
|  | ||||
|         /* Configure the External Interrupt or event for the current IO */ | ||||
|         tmp = ((uint32_t)0x0F) << (4 * (position & 0x03)); | ||||
|         SYSCFG->EXTICR[position >> 2] &= ~tmp; | ||||
|       } | ||||
|       /*------------------------- GPIO Mode Configuration --------------------*/ | ||||
|       /* Configure IO Direction in Input Floating Mode */ | ||||
|       GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (position * 2)); | ||||
|  | ||||
|       /* Configure the default Alternate Function in current IO */ | ||||
|       GPIOx->AFR[position >> 3] &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; | ||||
|  | ||||
|       /* Deactivate the Pull-up and Pull-down resistor for the current IO */ | ||||
|       GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2)); | ||||
|  | ||||
|       /* Configure the default value IO Output Type */ | ||||
|       GPIOx->OTYPER  &= ~(GPIO_OTYPER_OT_0 << position) ; | ||||
|  | ||||
|       /* Configure the default value for IO Speed */ | ||||
|       GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2)); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup GPIO_Exported_Functions_Group2 IO operation functions  | ||||
|  *  @brief   GPIO Read and Write | ||||
|  * | ||||
| @verbatim | ||||
|  =============================================================================== | ||||
|                        ##### IO operation functions ##### | ||||
|  =============================================================================== | ||||
|  | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Reads the specified input port pin. | ||||
|   * @param  GPIOx where x can be (A..K) to select the GPIO peripheral. | ||||
|   * @param  GPIO_Pin specifies the port bit to read. | ||||
|   *         This parameter can be GPIO_PIN_x where x can be (0..15). | ||||
|   * @retval The input port pin value. | ||||
|   */ | ||||
| GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) | ||||
| { | ||||
|   GPIO_PinState bitstatus; | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_GPIO_PIN(GPIO_Pin)); | ||||
|  | ||||
|   if((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET) | ||||
|   { | ||||
|     bitstatus = GPIO_PIN_SET; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     bitstatus = GPIO_PIN_RESET; | ||||
|   } | ||||
|   return bitstatus; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Sets or clears the selected data port bit. | ||||
|   * | ||||
|   * @note   This function uses GPIOx_BSRR register to allow atomic read/modify | ||||
|   *         accesses. In this way, there is no risk of an IRQ occurring between | ||||
|   *         the read and the modify access. | ||||
|   * | ||||
|   * @param  GPIOx where x can be (A..K) to select the GPIO peripheral. | ||||
|   * @param  GPIO_Pin specifies the port bit to be written. | ||||
|   *          This parameter can be one of GPIO_PIN_x where x can be (0..15). | ||||
|   * @param  PinState specifies the value to be written to the selected bit. | ||||
|   *          This parameter can be one of the GPIO_PinState enum values: | ||||
|   *            @arg GPIO_PIN_RESET: to clear the port pin | ||||
|   *            @arg GPIO_PIN_SET: to set the port pin | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_GPIO_PIN(GPIO_Pin)); | ||||
|   assert_param(IS_GPIO_PIN_ACTION(PinState)); | ||||
|  | ||||
|   if(PinState != GPIO_PIN_RESET) | ||||
|   { | ||||
|     GPIOx->BSRR = GPIO_Pin; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     GPIOx->BSRR = (uint32_t)GPIO_Pin << 16; | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Toggles the specified GPIO pins. | ||||
|   * @param  GPIOx Where x can be (A..I) to select the GPIO peripheral. | ||||
|   * @param  GPIO_Pin Specifies the pins to be toggled. | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) | ||||
| { | ||||
|   uint32_t odr; | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_GPIO_PIN(GPIO_Pin)); | ||||
|  | ||||
|   /* get current Output Data Register value */ | ||||
|   odr = GPIOx->ODR; | ||||
|  | ||||
|   /* Set selected pins that were at low level, and reset ones that were high */ | ||||
|   GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Locks GPIO Pins configuration registers. | ||||
|   * @note   The locked registers are GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, | ||||
|   *         GPIOx_PUPDR, GPIOx_AFRL and GPIOx_AFRH. | ||||
|   * @note   The configuration of the locked GPIO pins can no longer be modified | ||||
|   *         until the next reset. | ||||
|   * @param  GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F7 family | ||||
|   * @param  GPIO_Pin specifies the port bit to be locked. | ||||
|   *         This parameter can be any combination of GPIO_PIN_x where x can be (0..15). | ||||
|   * @retval None | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) | ||||
| { | ||||
|   __IO uint32_t tmp = GPIO_LCKR_LCKK; | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_GPIO_PIN(GPIO_Pin)); | ||||
|  | ||||
|   /* Apply lock key write sequence */ | ||||
|   tmp |= GPIO_Pin; | ||||
|   /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ | ||||
|   GPIOx->LCKR = tmp; | ||||
|   /* Reset LCKx bit(s): LCKK='0' + LCK[15-0] */ | ||||
|   GPIOx->LCKR = GPIO_Pin; | ||||
|   /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ | ||||
|   GPIOx->LCKR = tmp; | ||||
|   /* Read LCKR register. This read is mandatory to complete key lock sequence */ | ||||
|   tmp = GPIOx->LCKR; | ||||
|  | ||||
|   /* Read again in order to confirm lock is active */ | ||||
|   if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) | ||||
|   { | ||||
|     return HAL_OK; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return HAL_ERROR; | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  This function handles EXTI interrupt request. | ||||
|   * @param  GPIO_Pin Specifies the pins connected EXTI line | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) | ||||
| { | ||||
|   /* EXTI line interrupt detected */ | ||||
|   if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET) | ||||
|   { | ||||
|     __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); | ||||
|     HAL_GPIO_EXTI_Callback(GPIO_Pin); | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  EXTI line detection callbacks. | ||||
|   * @param  GPIO_Pin Specifies the pins connected EXTI line | ||||
|   * @retval None | ||||
|   */ | ||||
| __weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) | ||||
| { | ||||
|   /* Prevent unused argument(s) compilation warning */ | ||||
|   UNUSED(GPIO_Pin); | ||||
|    | ||||
|   /* NOTE: This function Should not be modified, when the callback is needed, | ||||
|            the HAL_GPIO_EXTI_Callback could be implemented in the user file | ||||
|    */ | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* HAL_GPIO_MODULE_ENABLED */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
							
								
								
									
										6905
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6905
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										270
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c_ex.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										270
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c_ex.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,270 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32f7xx_hal_i2c_ex.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   I2C Extended HAL module driver. | ||||
|   *          This file provides firmware functions to manage the following | ||||
|   *          functionalities of I2C Extended peripheral: | ||||
|   *           + Filter Mode Functions | ||||
|   *           + FastModePlus Functions | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * Copyright (c) 2017 STMicroelectronics. | ||||
|   * All rights reserved. | ||||
|   * | ||||
|   * This software is licensed under terms that can be found in the LICENSE file | ||||
|   * in the root directory of this software component. | ||||
|   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   @verbatim | ||||
|   ============================================================================== | ||||
|                ##### I2C peripheral Extended features  ##### | ||||
|   ============================================================================== | ||||
|  | ||||
|   [..] Comparing to other previous devices, the I2C interface for STM32F7xx | ||||
|        devices contains the following additional features | ||||
|  | ||||
|        (+) Possibility to disable or enable Analog Noise Filter | ||||
|        (+) Use of a configured Digital Noise Filter | ||||
|        (+) Disable or enable Fast Mode Plus | ||||
|  | ||||
|                      ##### How to use this driver ##### | ||||
|   ============================================================================== | ||||
|   [..] This driver provides functions to: | ||||
|     (#) Configure I2C Analog noise filter using the function HAL_I2CEx_ConfigAnalogFilter() | ||||
|     (#) Configure I2C Digital noise filter using the function HAL_I2CEx_ConfigDigitalFilter() | ||||
|     (#) Configure the enable or disable of fast mode plus driving capability using the functions : | ||||
|           (++) HAL_I2CEx_EnableFastModePlus() | ||||
|           (++) HAL_I2CEx_DisableFastModePlus() | ||||
|   @endverbatim | ||||
|   */ | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32f7xx_hal.h" | ||||
|  | ||||
| /** @addtogroup STM32F7xx_HAL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup I2CEx I2CEx | ||||
|   * @brief I2C Extended HAL module driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #ifdef HAL_I2C_MODULE_ENABLED | ||||
|  | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private define ------------------------------------------------------------*/ | ||||
| /* Private macro -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /* Private functions ---------------------------------------------------------*/ | ||||
|  | ||||
| /** @defgroup I2CEx_Exported_Functions I2C Extended Exported Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup I2CEx_Exported_Functions_Group1 Filter Mode Functions | ||||
|   * @brief    Filter Mode Functions | ||||
|   * | ||||
| @verbatim | ||||
|  =============================================================================== | ||||
|                       ##### Filter Mode Functions ##### | ||||
|  =============================================================================== | ||||
|     [..] This section provides functions allowing to: | ||||
|       (+) Configure Noise Filters | ||||
|  | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure I2C Analog noise filter. | ||||
|   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains | ||||
|   *                the configuration information for the specified I2Cx peripheral. | ||||
|   * @param  AnalogFilter New state of the Analog filter. | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_I2CEx_ConfigAnalogFilter(I2C_HandleTypeDef *hi2c, uint32_t AnalogFilter) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); | ||||
|   assert_param(IS_I2C_ANALOG_FILTER(AnalogFilter)); | ||||
|  | ||||
|   if (hi2c->State == HAL_I2C_STATE_READY) | ||||
|   { | ||||
|     /* Process Locked */ | ||||
|     __HAL_LOCK(hi2c); | ||||
|  | ||||
|     hi2c->State = HAL_I2C_STATE_BUSY; | ||||
|  | ||||
|     /* Disable the selected I2C peripheral */ | ||||
|     __HAL_I2C_DISABLE(hi2c); | ||||
|  | ||||
|     /* Reset I2Cx ANOFF bit */ | ||||
|     hi2c->Instance->CR1 &= ~(I2C_CR1_ANFOFF); | ||||
|  | ||||
|     /* Set analog filter bit*/ | ||||
|     hi2c->Instance->CR1 |= AnalogFilter; | ||||
|  | ||||
|     __HAL_I2C_ENABLE(hi2c); | ||||
|  | ||||
|     hi2c->State = HAL_I2C_STATE_READY; | ||||
|  | ||||
|     /* Process Unlocked */ | ||||
|     __HAL_UNLOCK(hi2c); | ||||
|  | ||||
|     return HAL_OK; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return HAL_BUSY; | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Configure I2C Digital noise filter. | ||||
|   * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains | ||||
|   *                the configuration information for the specified I2Cx peripheral. | ||||
|   * @param  DigitalFilter Coefficient of digital noise filter between Min_Data=0x00 and Max_Data=0x0F. | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_I2CEx_ConfigDigitalFilter(I2C_HandleTypeDef *hi2c, uint32_t DigitalFilter) | ||||
| { | ||||
|   uint32_t tmpreg; | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); | ||||
|   assert_param(IS_I2C_DIGITAL_FILTER(DigitalFilter)); | ||||
|  | ||||
|   if (hi2c->State == HAL_I2C_STATE_READY) | ||||
|   { | ||||
|     /* Process Locked */ | ||||
|     __HAL_LOCK(hi2c); | ||||
|  | ||||
|     hi2c->State = HAL_I2C_STATE_BUSY; | ||||
|  | ||||
|     /* Disable the selected I2C peripheral */ | ||||
|     __HAL_I2C_DISABLE(hi2c); | ||||
|  | ||||
|     /* Get the old register value */ | ||||
|     tmpreg = hi2c->Instance->CR1; | ||||
|  | ||||
|     /* Reset I2Cx DNF bits [11:8] */ | ||||
|     tmpreg &= ~(I2C_CR1_DNF); | ||||
|  | ||||
|     /* Set I2Cx DNF coefficient */ | ||||
|     tmpreg |= DigitalFilter << 8U; | ||||
|  | ||||
|     /* Store the new register value */ | ||||
|     hi2c->Instance->CR1 = tmpreg; | ||||
|  | ||||
|     __HAL_I2C_ENABLE(hi2c); | ||||
|  | ||||
|     hi2c->State = HAL_I2C_STATE_READY; | ||||
|  | ||||
|     /* Process Unlocked */ | ||||
|     __HAL_UNLOCK(hi2c); | ||||
|  | ||||
|     return HAL_OK; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return HAL_BUSY; | ||||
|   } | ||||
| } | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
| #if  (defined(SYSCFG_PMC_I2C_PB6_FMP) || defined(SYSCFG_PMC_I2C_PB7_FMP)) || (defined(SYSCFG_PMC_I2C_PB8_FMP) || defined(SYSCFG_PMC_I2C_PB9_FMP)) || (defined(SYSCFG_PMC_I2C1_FMP)) || (defined(SYSCFG_PMC_I2C2_FMP)) || defined(SYSCFG_PMC_I2C3_FMP) || defined(SYSCFG_PMC_I2C4_FMP) | ||||
|  | ||||
| /** @defgroup I2CEx_Exported_Functions_Group3 Fast Mode Plus Functions | ||||
|   * @brief    Fast Mode Plus Functions | ||||
|   * | ||||
| @verbatim | ||||
|  =============================================================================== | ||||
|                       ##### Fast Mode Plus Functions ##### | ||||
|  =============================================================================== | ||||
|     [..] This section provides functions allowing to: | ||||
|       (+) Configure Fast Mode Plus | ||||
|  | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief Enable the I2C fast mode plus driving capability. | ||||
|   * @param ConfigFastModePlus Selects the pin. | ||||
|   *   This parameter can be one of the @ref I2CEx_FastModePlus values | ||||
|   * @note  For I2C1, fast mode plus driving capability can be enabled on all selected | ||||
|   *        I2C1 pins using I2C_FASTMODEPLUS_I2C1 parameter or independently | ||||
|   *        on each one of the following pins PB6, PB7, PB8 and PB9. | ||||
|   * @note  For remaining I2C1 pins (PA14, PA15...) fast mode plus driving capability | ||||
|   *        can be enabled only by using I2C_FASTMODEPLUS_I2C1 parameter. | ||||
|   * @note  For all I2C2 pins fast mode plus driving capability can be enabled | ||||
|   *        only by using I2C_FASTMODEPLUS_I2C2 parameter. | ||||
|   * @note  For all I2C3 pins fast mode plus driving capability can be enabled | ||||
|   *        only by using I2C_FASTMODEPLUS_I2C3 parameter. | ||||
|   * @note  For all I2C4 pins fast mode plus driving capability can be enabled | ||||
|   *        only by using I2C_FASTMODEPLUS_I2C4 parameter. | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_I2CEx_EnableFastModePlus(uint32_t ConfigFastModePlus) | ||||
| { | ||||
|   /* Check the parameter */ | ||||
|   assert_param(IS_I2C_FASTMODEPLUS(ConfigFastModePlus)); | ||||
|  | ||||
|   /* Enable SYSCFG clock */ | ||||
|   __HAL_RCC_SYSCFG_CLK_ENABLE(); | ||||
|  | ||||
|   /* Enable fast mode plus driving capability for selected pin */ | ||||
|   SET_BIT(SYSCFG->PMC, (uint32_t)ConfigFastModePlus); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Disable the I2C fast mode plus driving capability. | ||||
|   * @param ConfigFastModePlus Selects the pin. | ||||
|   *   This parameter can be one of the @ref I2CEx_FastModePlus values | ||||
|   * @note  For I2C1, fast mode plus driving capability can be disabled on all selected | ||||
|   *        I2C1 pins using I2C_FASTMODEPLUS_I2C1 parameter or independently | ||||
|   *        on each one of the following pins PB6, PB7, PB8 and PB9. | ||||
|   * @note  For remaining I2C1 pins (PA14, PA15...) fast mode plus driving capability | ||||
|   *        can be disabled only by using I2C_FASTMODEPLUS_I2C1 parameter. | ||||
|   * @note  For all I2C2 pins fast mode plus driving capability can be disabled | ||||
|   *        only by using I2C_FASTMODEPLUS_I2C2 parameter. | ||||
|   * @note  For all I2C3 pins fast mode plus driving capability can be disabled | ||||
|   *        only by using I2C_FASTMODEPLUS_I2C3 parameter. | ||||
|   * @note  For all I2C4 pins fast mode plus driving capability can be disabled | ||||
|   *        only by using I2C_FASTMODEPLUS_I2C4 parameter. | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_I2CEx_DisableFastModePlus(uint32_t ConfigFastModePlus) | ||||
| { | ||||
|   /* Check the parameter */ | ||||
|   assert_param(IS_I2C_FASTMODEPLUS(ConfigFastModePlus)); | ||||
|  | ||||
|   /* Enable SYSCFG clock */ | ||||
|   __HAL_RCC_SYSCFG_CLK_ENABLE(); | ||||
|  | ||||
|   /* Disable fast mode plus driving capability for selected pin */ | ||||
|   CLEAR_BIT(SYSCFG->PMC, (uint32_t)ConfigFastModePlus); | ||||
| } | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
| #endif /* Fast Mode Plus Availability */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* HAL_I2C_MODULE_ENABLED */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
							
								
								
									
										2161
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_ltdc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2161
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_ltdc.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										146
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_ltdc_ex.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_ltdc_ex.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32f7xx_hal_ltdc_ex.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   LTDC Extension HAL module driver. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * Copyright (c) 2017 STMicroelectronics. | ||||
|   * All rights reserved. | ||||
|   * | ||||
|   * This software is licensed under terms that can be found in the LICENSE file | ||||
|   * in the root directory of this software component. | ||||
|   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32f7xx_hal.h" | ||||
|  | ||||
| /** @addtogroup STM32F7xx_HAL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #if defined(HAL_LTDC_MODULE_ENABLED) && defined(HAL_DSI_MODULE_ENABLED) | ||||
|  | ||||
| #if defined (LTDC) && defined (DSI) | ||||
|  | ||||
| /** @defgroup LTDCEx LTDCEx | ||||
|   * @brief LTDC HAL module driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private define ------------------------------------------------------------*/ | ||||
| /* Private macro -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
|  | ||||
| /** @defgroup LTDCEx_Exported_Functions LTDC Extended Exported Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup LTDCEx_Exported_Functions_Group1 Initialization and Configuration functions | ||||
|   *  @brief   Initialization and Configuration functions | ||||
|   * | ||||
| @verbatim | ||||
|  =============================================================================== | ||||
|                 ##### Initialization and Configuration functions ##### | ||||
|  =============================================================================== | ||||
|     [..]  This section provides functions allowing to: | ||||
|       (+) Initialize and configure the LTDC | ||||
|  | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Retrieve common parameters from DSI Video mode configuration structure | ||||
|   * @param  hltdc   pointer to a LTDC_HandleTypeDef structure that contains | ||||
|   *                 the configuration information for the LTDC. | ||||
|   * @param  VidCfg  pointer to a DSI_VidCfgTypeDef structure that contains | ||||
|   *                 the DSI video mode configuration parameters | ||||
|   * @note   The implementation of this function is taking into account the LTDC | ||||
|   *         polarities inversion as described in the current LTDC specification | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_LTDCEx_StructInitFromVideoConfig(LTDC_HandleTypeDef *hltdc, DSI_VidCfgTypeDef *VidCfg) | ||||
| { | ||||
|   /* Retrieve signal polarities from DSI */ | ||||
|  | ||||
|   /* The following polarity is inverted: | ||||
|                      LTDC_DEPOLARITY_AL <-> LTDC_DEPOLARITY_AH */ | ||||
|  | ||||
|   /* Note 1 : Code in line w/ Current LTDC specification */ | ||||
|   hltdc->Init.DEPolarity = (VidCfg->DEPolarity == DSI_DATA_ENABLE_ACTIVE_HIGH) ? LTDC_DEPOLARITY_AL : LTDC_DEPOLARITY_AH; | ||||
|   hltdc->Init.VSPolarity = (VidCfg->VSPolarity == DSI_VSYNC_ACTIVE_HIGH) ? LTDC_VSPOLARITY_AH : LTDC_VSPOLARITY_AL; | ||||
|   hltdc->Init.HSPolarity = (VidCfg->HSPolarity == DSI_HSYNC_ACTIVE_HIGH) ? LTDC_HSPOLARITY_AH : LTDC_HSPOLARITY_AL; | ||||
|  | ||||
|   /* Note 2: Code to be used in case LTDC polarities inversion updated in the specification */ | ||||
|   /* hltdc->Init.DEPolarity = VidCfg->DEPolarity << 29; | ||||
|      hltdc->Init.VSPolarity = VidCfg->VSPolarity << 29; | ||||
|      hltdc->Init.HSPolarity = VidCfg->HSPolarity << 29; */ | ||||
|  | ||||
|   /* Retrieve vertical timing parameters from DSI */ | ||||
|   hltdc->Init.VerticalSync       = VidCfg->VerticalSyncActive - 1U; | ||||
|   hltdc->Init.AccumulatedVBP     = VidCfg->VerticalSyncActive + VidCfg->VerticalBackPorch - 1U; | ||||
|   hltdc->Init.AccumulatedActiveH = VidCfg->VerticalSyncActive + VidCfg->VerticalBackPorch + VidCfg->VerticalActive - 1U; | ||||
|   hltdc->Init.TotalHeigh         = VidCfg->VerticalSyncActive + VidCfg->VerticalBackPorch + VidCfg->VerticalActive + VidCfg->VerticalFrontPorch - 1U; | ||||
|  | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Retrieve common parameters from DSI Adapted command mode configuration structure | ||||
|   * @param  hltdc   pointer to a LTDC_HandleTypeDef structure that contains | ||||
|   *                 the configuration information for the LTDC. | ||||
|   * @param  CmdCfg  pointer to a DSI_CmdCfgTypeDef structure that contains | ||||
|   *                 the DSI command mode configuration parameters | ||||
|   * @note   The implementation of this function is taking into account the LTDC | ||||
|   *         polarities inversion as described in the current LTDC specification | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_LTDCEx_StructInitFromAdaptedCommandConfig(LTDC_HandleTypeDef *hltdc, DSI_CmdCfgTypeDef *CmdCfg) | ||||
| { | ||||
|   /* Retrieve signal polarities from DSI */ | ||||
|  | ||||
|   /* The following polarities are inverted: | ||||
|                      LTDC_DEPOLARITY_AL <-> LTDC_DEPOLARITY_AH | ||||
|                      LTDC_VSPOLARITY_AL <-> LTDC_VSPOLARITY_AH | ||||
|                      LTDC_HSPOLARITY_AL <-> LTDC_HSPOLARITY_AH)*/ | ||||
|  | ||||
|   /* Note 1 : Code in line w/ Current LTDC specification */ | ||||
|   hltdc->Init.DEPolarity = (CmdCfg->DEPolarity == DSI_DATA_ENABLE_ACTIVE_HIGH) ? LTDC_DEPOLARITY_AL : LTDC_DEPOLARITY_AH; | ||||
|   hltdc->Init.VSPolarity = (CmdCfg->VSPolarity == DSI_VSYNC_ACTIVE_HIGH) ? LTDC_VSPOLARITY_AL : LTDC_VSPOLARITY_AH; | ||||
|   hltdc->Init.HSPolarity = (CmdCfg->HSPolarity == DSI_HSYNC_ACTIVE_HIGH) ? LTDC_HSPOLARITY_AL : LTDC_HSPOLARITY_AH; | ||||
|  | ||||
|   /* Note 2: Code to be used in case LTDC polarities inversion updated in the specification */ | ||||
|   /* hltdc->Init.DEPolarity = CmdCfg->DEPolarity << 29; | ||||
|      hltdc->Init.VSPolarity = CmdCfg->VSPolarity << 29; | ||||
|      hltdc->Init.HSPolarity = CmdCfg->HSPolarity << 29; */ | ||||
|  | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* LTDC && DSI */ | ||||
|  | ||||
| #endif /* HAL_LTCD_MODULE_ENABLED && HAL_DSI_MODULE_ENABLED */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
							
								
								
									
										597
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pwr.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										597
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pwr.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,597 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32f7xx_hal_pwr.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   PWR HAL module driver. | ||||
|   *          This file provides firmware functions to manage the following  | ||||
|   *          functionalities of the Power Controller (PWR) peripheral: | ||||
|   *           + Initialization and de-initialization functions | ||||
|   *           + Peripheral Control functions  | ||||
|   *          | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * Copyright (c) 2017 STMicroelectronics. | ||||
|   * All rights reserved. | ||||
|   * | ||||
|   * This software is licensed under terms that can be found in the LICENSE file | ||||
|   * in the root directory of this software component. | ||||
|   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32f7xx_hal.h" | ||||
|  | ||||
| /** @addtogroup STM32F7xx_HAL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup PWR PWR | ||||
|   * @brief PWR HAL module driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #ifdef HAL_PWR_MODULE_ENABLED | ||||
|  | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private define ------------------------------------------------------------*/ | ||||
| /** @addtogroup PWR_Private_Constants | ||||
|   * @{ | ||||
|   */ | ||||
| 	 | ||||
| /** @defgroup PWR_PVD_Mode_Mask PWR PVD Mode Mask | ||||
|   * @{ | ||||
|   */      | ||||
| #define PVD_MODE_IT               ((uint32_t)0x00010000U) | ||||
| #define PVD_MODE_EVT              ((uint32_t)0x00020000U) | ||||
| #define PVD_RISING_EDGE           ((uint32_t)0x00000001U) | ||||
| #define PVD_FALLING_EDGE          ((uint32_t)0x00000002U) | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup PWR_ENABLE_WUP_Mask PWR Enable WUP Mask | ||||
|   * @{ | ||||
|   */   | ||||
| #define  PWR_EWUP_MASK                          ((uint32_t)0x00003F00) | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
| /* Private macro -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /* Private functions ---------------------------------------------------------*/ | ||||
|  | ||||
| /** @defgroup PWR_Exported_Functions PWR Exported Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions  | ||||
|   *  @brief    Initialization and de-initialization functions | ||||
|   * | ||||
| @verbatim | ||||
|  =============================================================================== | ||||
|               ##### Initialization and de-initialization functions ##### | ||||
|  =============================================================================== | ||||
|     [..] | ||||
|       After reset, the backup domain (RTC registers, RTC backup data  | ||||
|       registers and backup SRAM) is protected against possible unwanted  | ||||
|       write accesses.  | ||||
|       To enable access to the RTC Domain and RTC registers, proceed as follows: | ||||
|         (+) Enable the Power Controller (PWR) APB1 interface clock using the | ||||
|             __HAL_RCC_PWR_CLK_ENABLE() macro. | ||||
|         (+) Enable access to RTC domain using the HAL_PWR_EnableBkUpAccess() function. | ||||
|   | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief Deinitializes the HAL PWR peripheral registers to their default reset values. | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWR_DeInit(void) | ||||
| { | ||||
|   __HAL_RCC_PWR_FORCE_RESET(); | ||||
|   __HAL_RCC_PWR_RELEASE_RESET(); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Enables access to the backup domain (RTC registers, RTC  | ||||
|   *         backup data registers and backup SRAM). | ||||
|   * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the  | ||||
|   *         Backup Domain Access should be kept enabled. | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWR_EnableBkUpAccess(void) | ||||
| { | ||||
|   /* Enable access to RTC and backup registers */ | ||||
|   SET_BIT(PWR->CR1, PWR_CR1_DBP); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Disables access to the backup domain (RTC registers, RTC  | ||||
|   *         backup data registers and backup SRAM). | ||||
|   * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the  | ||||
|   *         Backup Domain Access should be kept enabled. | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWR_DisableBkUpAccess(void) | ||||
| { | ||||
|   /* Disable access to RTC and backup registers */ | ||||
| 	CLEAR_BIT(PWR->CR1, PWR_CR1_DBP); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @defgroup PWR_Exported_Functions_Group2 Peripheral Control functions  | ||||
|   *  @brief Low Power modes configuration functions  | ||||
|   * | ||||
| @verbatim | ||||
|  | ||||
|  =============================================================================== | ||||
|                  ##### Peripheral Control functions ##### | ||||
|  =============================================================================== | ||||
|       | ||||
|     *** PVD configuration *** | ||||
|     ========================= | ||||
|     [..] | ||||
|       (+) The PVD is used to monitor the VDD power supply by comparing it to a  | ||||
|           threshold selected by the PVD Level (PLS[2:0] bits in the PWR_CR). | ||||
|       (+) A PVDO flag is available to indicate if VDD/VDDA is higher or lower  | ||||
|           than the PVD threshold. This event is internally connected to the EXTI  | ||||
|           line16 and can generate an interrupt if enabled. This is done through | ||||
|           __HAL_PWR_PVD_EXTI_ENABLE_IT() macro. | ||||
|       (+) The PVD is stopped in Standby mode. | ||||
|  | ||||
|     *** Wake-up pin configuration *** | ||||
|     ================================ | ||||
|     [..] | ||||
|       (+) Wake-up pin is used to wake up the system from Standby mode. This pin is  | ||||
|           forced in input pull-down configuration and is active on rising edges. | ||||
|       (+) There are up to 6 Wake-up pin in the STM32F7 devices family | ||||
|  | ||||
|     *** Low Power modes configuration *** | ||||
|     ===================================== | ||||
|     [..] | ||||
|       The devices feature 3 low-power modes: | ||||
|       (+) Sleep mode: Cortex-M7 core stopped, peripherals kept running. | ||||
|       (+) Stop mode: all clocks are stopped, regulator running, regulator  | ||||
|           in low power mode | ||||
|       (+) Standby mode: 1.2V domain powered off. | ||||
|     | ||||
|    *** Sleep mode *** | ||||
|    ================== | ||||
|     [..] | ||||
|       (+) Entry: | ||||
|         The Sleep mode is entered by using the HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI) | ||||
|               functions with | ||||
|           (++) PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction | ||||
|           (++) PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction | ||||
|        | ||||
|       -@@- The Regulator parameter is not used for the STM32F7 family  | ||||
|               and is kept as parameter just to maintain compatibility with the  | ||||
|               lower power families (STM32L). | ||||
|       (+) Exit: | ||||
|         Any peripheral interrupt acknowledged by the nested vectored interrupt  | ||||
|               controller (NVIC) can wake up the device from Sleep mode. | ||||
|  | ||||
|    *** Stop mode *** | ||||
|    ================= | ||||
|     [..] | ||||
|       In Stop mode, all clocks in the 1.2V domain are stopped, the PLL, the HSI, | ||||
|       and the HSE RC oscillators are disabled. Internal SRAM and register contents  | ||||
|       are preserved. | ||||
|       The voltage regulator can be configured either in normal or low-power mode. | ||||
|       To minimize the consumption In Stop mode, FLASH can be powered off before  | ||||
|       entering the Stop mode using the HAL_PWREx_EnableFlashPowerDown() function. | ||||
|       It can be switched on again by software after exiting the Stop mode using | ||||
|       the HAL_PWREx_DisableFlashPowerDown() function.  | ||||
|  | ||||
|       (+) Entry: | ||||
|          The Stop mode is entered using the HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON)  | ||||
|              function with: | ||||
|           (++) Main regulator ON. | ||||
|           (++) Low Power regulator ON. | ||||
|       (+) Exit: | ||||
|         Any EXTI Line (Internal or External) configured in Interrupt/Event mode. | ||||
|  | ||||
|    *** Standby mode *** | ||||
|    ==================== | ||||
|     [..] | ||||
|     (+) | ||||
|       The Standby mode allows to achieve the lowest power consumption. It is based  | ||||
|       on the Cortex-M7 deep sleep mode, with the voltage regulator disabled.  | ||||
|       The 1.2V domain is consequently powered off. The PLL, the HSI oscillator and  | ||||
|       the HSE oscillator are also switched off. SRAM and register contents are lost  | ||||
|       except for the RTC registers, RTC backup registers, backup SRAM and Standby  | ||||
|       circuitry. | ||||
|     | ||||
|       The voltage regulator is OFF. | ||||
|        | ||||
|       (++) Entry: | ||||
|         (+++) The Standby mode is entered using the HAL_PWR_EnterSTANDBYMode() function. | ||||
|       (++) Exit: | ||||
|         (+++) WKUP pin rising or falling edge, RTC alarm (Alarm A and Alarm B), RTC | ||||
|              wakeup, tamper event, time stamp event, external reset in NRST pin, IWDG reset. | ||||
|  | ||||
|    *** Auto-wakeup (AWU) from low-power mode *** | ||||
|    ============================================= | ||||
|     [..] | ||||
|      | ||||
|      (+) The MCU can be woken up from low-power mode by an RTC Alarm event, an RTC  | ||||
|       Wakeup event, a tamper event or a time-stamp event, without depending on  | ||||
|       an external interrupt (Auto-wakeup mode). | ||||
|  | ||||
|       (+) RTC auto-wakeup (AWU) from the Stop and Standby modes | ||||
|         | ||||
|         (++) To wake up from the Stop mode with an RTC alarm event, it is necessary to  | ||||
|               configure the RTC to generate the RTC alarm using the HAL_RTC_SetAlarm_IT() function. | ||||
|  | ||||
|         (++) To wake up from the Stop mode with an RTC Tamper or time stamp event, it  | ||||
|              is necessary to configure the RTC to detect the tamper or time stamp event using the | ||||
|                 HAL_RTCEx_SetTimeStamp_IT() or HAL_RTCEx_SetTamper_IT() functions. | ||||
|                    | ||||
|         (++) To wake up from the Stop mode with an RTC WakeUp event, it is necessary to | ||||
|               configure the RTC to generate the RTC WakeUp event using the HAL_RTCEx_SetWakeUpTimer_IT() function. | ||||
|  | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief Configures the voltage threshold detected by the Power Voltage Detector(PVD). | ||||
|   * @param sConfigPVD pointer to an PWR_PVDTypeDef structure that contains the configuration | ||||
|   *        information for the PVD. | ||||
|   * @note Refer to the electrical characteristics of your device datasheet for | ||||
|   *         more details about the voltage threshold corresponding to each  | ||||
|   *         detection level. | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_PWR_PVD_LEVEL(sConfigPVD->PVDLevel)); | ||||
|   assert_param(IS_PWR_PVD_MODE(sConfigPVD->Mode)); | ||||
|    | ||||
|   /* Set PLS[7:5] bits according to PVDLevel value */ | ||||
|   MODIFY_REG(PWR->CR1, PWR_CR1_PLS, sConfigPVD->PVDLevel); | ||||
|    | ||||
|   /* Clear any previous config. Keep it clear if no event or IT mode is selected */ | ||||
|   __HAL_PWR_PVD_EXTI_DISABLE_EVENT(); | ||||
|   __HAL_PWR_PVD_EXTI_DISABLE_IT(); | ||||
|   __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE(); | ||||
|   __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE();  | ||||
|  | ||||
|   /* Configure interrupt mode */ | ||||
|   if((sConfigPVD->Mode & PVD_MODE_IT) == PVD_MODE_IT) | ||||
|   { | ||||
|     __HAL_PWR_PVD_EXTI_ENABLE_IT(); | ||||
|   } | ||||
|    | ||||
|   /* Configure event mode */ | ||||
|   if((sConfigPVD->Mode & PVD_MODE_EVT) == PVD_MODE_EVT) | ||||
|   { | ||||
|     __HAL_PWR_PVD_EXTI_ENABLE_EVENT(); | ||||
|   } | ||||
|    | ||||
|   /* Configure the edge */ | ||||
|   if((sConfigPVD->Mode & PVD_RISING_EDGE) == PVD_RISING_EDGE) | ||||
|   { | ||||
|     __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE(); | ||||
|   } | ||||
|    | ||||
|   if((sConfigPVD->Mode & PVD_FALLING_EDGE) == PVD_FALLING_EDGE) | ||||
|   { | ||||
|     __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Enables the Power Voltage Detector(PVD). | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWR_EnablePVD(void) | ||||
| { | ||||
|   /* Enable the power voltage detector */ | ||||
| 	SET_BIT(PWR->CR1, PWR_CR1_PVDE); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Disables the Power Voltage Detector(PVD). | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWR_DisablePVD(void) | ||||
| { | ||||
|   /* Disable the power voltage detector */ | ||||
| 	CLEAR_BIT(PWR->CR1, PWR_CR1_PVDE); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Enable the WakeUp PINx functionality. | ||||
|   * @param WakeUpPinPolarity Specifies which Wake-Up pin to enable. | ||||
|   *         This parameter can be one of the following legacy values, which sets the default polarity:  | ||||
|   *         detection on high level (rising edge): | ||||
|   *           @arg PWR_WAKEUP_PIN1, PWR_WAKEUP_PIN2, PWR_WAKEUP_PIN3, PWR_WAKEUP_PIN4, PWR_WAKEUP_PIN5, PWR_WAKEUP_PIN6  | ||||
|   *         or one of the following value where the user can explicitly states the enabled pin and | ||||
|   *         the chosen polarity   | ||||
|   *           @arg PWR_WAKEUP_PIN1_HIGH or PWR_WAKEUP_PIN1_LOW  | ||||
|   *           @arg PWR_WAKEUP_PIN2_HIGH or PWR_WAKEUP_PIN2_LOW  | ||||
|   *           @arg PWR_WAKEUP_PIN3_HIGH or PWR_WAKEUP_PIN3_LOW  | ||||
|   *           @arg PWR_WAKEUP_PIN4_HIGH or PWR_WAKEUP_PIN4_LOW | ||||
|   *           @arg PWR_WAKEUP_PIN5_HIGH or PWR_WAKEUP_PIN5_LOW  | ||||
|   *           @arg PWR_WAKEUP_PIN6_HIGH or PWR_WAKEUP_PIN6_LOW  | ||||
|   * @note  PWR_WAKEUP_PINx and PWR_WAKEUP_PINx_HIGH are equivalent.                | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinPolarity) | ||||
| { | ||||
|   assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinPolarity)); | ||||
|    | ||||
|   /* Enable wake-up pin */ | ||||
|   SET_BIT(PWR->CSR2, (PWR_EWUP_MASK & WakeUpPinPolarity)); | ||||
| 	 | ||||
|   /* Specifies the Wake-Up pin polarity for the event detection | ||||
|     (rising or falling edge) */ | ||||
|   MODIFY_REG(PWR->CR2, (PWR_EWUP_MASK & WakeUpPinPolarity), (WakeUpPinPolarity >> 0x06)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Disables the WakeUp PINx functionality. | ||||
|   * @param WakeUpPinx Specifies the Power Wake-Up pin to disable. | ||||
|   *         This parameter can be one of the following values: | ||||
|   *           @arg PWR_WAKEUP_PIN1 | ||||
|   *           @arg PWR_WAKEUP_PIN2 | ||||
|   *           @arg PWR_WAKEUP_PIN3 | ||||
|   *           @arg PWR_WAKEUP_PIN4 | ||||
|   *           @arg PWR_WAKEUP_PIN5 | ||||
|   *           @arg PWR_WAKEUP_PIN6  | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx) | ||||
| { | ||||
|   assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); | ||||
|  | ||||
|   CLEAR_BIT(PWR->CSR2, WakeUpPinx); | ||||
| } | ||||
|    | ||||
| /** | ||||
|   * @brief Enters Sleep mode. | ||||
|   *    | ||||
|   * @note In Sleep mode, all I/O pins keep the same state as in Run mode. | ||||
|   *  | ||||
|   * @note In Sleep mode, the systick is stopped to avoid exit from this mode with | ||||
|   *       systick interrupt when used as time base for Timeout  | ||||
|   *                 | ||||
|   * @param Regulator Specifies the regulator state in SLEEP mode. | ||||
|   *            This parameter can be one of the following values: | ||||
|   *            @arg PWR_MAINREGULATOR_ON: SLEEP mode with regulator ON | ||||
|   *            @arg PWR_LOWPOWERREGULATOR_ON: SLEEP mode with low power regulator ON | ||||
|   * @note This parameter is not used for the STM32F7 family and is kept as parameter | ||||
|   *       just to maintain compatibility with the lower power families. | ||||
|   * @param SLEEPEntry Specifies if SLEEP mode in entered with WFI or WFE instruction. | ||||
|   *          This parameter can be one of the following values: | ||||
|   *            @arg PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction | ||||
|   *            @arg PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry) | ||||
| { | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_PWR_REGULATOR(Regulator)); | ||||
|   assert_param(IS_PWR_SLEEP_ENTRY(SLEEPEntry)); | ||||
|  | ||||
|   /* Clear SLEEPDEEP bit of Cortex System Control Register */ | ||||
|   CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); | ||||
|  | ||||
|   /* Ensure that all instructions done before entering SLEEP mode */ | ||||
|   __DSB(); | ||||
|   __ISB(); | ||||
|  | ||||
|   /* Select SLEEP mode entry -------------------------------------------------*/ | ||||
|   if(SLEEPEntry == PWR_SLEEPENTRY_WFI) | ||||
|   {    | ||||
|     /* Request Wait For Interrupt */ | ||||
|     __WFI(); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     /* Request Wait For Event */ | ||||
|     __SEV(); | ||||
|     __WFE(); | ||||
|     __WFE(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Enters Stop mode.  | ||||
|   * @note In Stop mode, all I/O pins keep the same state as in Run mode. | ||||
|   * @note When exiting Stop mode by issuing an interrupt or a wakeup event,  | ||||
|   *         the HSI RC oscillator is selected as system clock. | ||||
|   * @note When the voltage regulator operates in low power mode, an additional  | ||||
|   *         startup delay is incurred when waking up from Stop mode.  | ||||
|   *         By keeping the internal regulator ON during Stop mode, the consumption  | ||||
|   *         is higher although the startup time is reduced.     | ||||
|   * @param Regulator Specifies the regulator state in Stop mode. | ||||
|   *          This parameter can be one of the following values: | ||||
|   *            @arg PWR_MAINREGULATOR_ON: Stop mode with regulator ON | ||||
|   *            @arg PWR_LOWPOWERREGULATOR_ON: Stop mode with low power regulator ON | ||||
|   * @param STOPEntry Specifies if Stop mode in entered with WFI or WFE instruction. | ||||
|   *          This parameter can be one of the following values: | ||||
|   *            @arg PWR_STOPENTRY_WFI: Enter Stop mode with WFI instruction | ||||
|   *            @arg PWR_STOPENTRY_WFE: Enter Stop mode with WFE instruction | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry) | ||||
| { | ||||
|   uint32_t tmpreg = 0; | ||||
|  | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_PWR_REGULATOR(Regulator)); | ||||
|   assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); | ||||
|  | ||||
|   /* Select the regulator state in Stop mode ---------------------------------*/ | ||||
|   tmpreg = PWR->CR1; | ||||
|   /* Clear PDDS and LPDS bits */ | ||||
|   tmpreg &= (uint32_t)~(PWR_CR1_PDDS | PWR_CR1_LPDS); | ||||
|  | ||||
|   /* Set LPDS, MRLVDS and LPLVDS bits according to Regulator value */ | ||||
|   tmpreg |= Regulator; | ||||
|  | ||||
|   /* Store the new value */ | ||||
|   PWR->CR1 = tmpreg; | ||||
|  | ||||
|   /* Set SLEEPDEEP bit of Cortex System Control Register */ | ||||
|   SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; | ||||
|  | ||||
|   /* Ensure that all instructions done before entering STOP mode */ | ||||
|   __DSB(); | ||||
|   __ISB(); | ||||
|  | ||||
|   /* Select Stop mode entry --------------------------------------------------*/ | ||||
|   if(STOPEntry == PWR_STOPENTRY_WFI) | ||||
|   {    | ||||
|     /* Request Wait For Interrupt */ | ||||
|     __WFI(); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     /* Request Wait For Event */ | ||||
|     __SEV(); | ||||
|     __WFE(); | ||||
|     __WFE(); | ||||
|   } | ||||
|   /* Reset SLEEPDEEP bit of Cortex System Control Register */ | ||||
|   SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);   | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Enters Standby mode. | ||||
|   * @note In Standby mode, all I/O pins are high impedance except for: | ||||
|   *          - Reset pad (still available)  | ||||
|   *          - RTC_AF1 pin (PC13) if configured for tamper, time-stamp, RTC  | ||||
|   *            Alarm out, or RTC clock calibration out. | ||||
|   *          - RTC_AF2 pin (PI8) if configured for tamper or time-stamp.   | ||||
|   *          - WKUP pins if enabled.        | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWR_EnterSTANDBYMode(void) | ||||
| { | ||||
|   /* Select Standby mode */ | ||||
|   PWR->CR1 |= PWR_CR1_PDDS; | ||||
|    | ||||
|   /* Set SLEEPDEEP bit of Cortex System Control Register */ | ||||
|   SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; | ||||
|    | ||||
|   /* This option is used to ensure that store operations are completed */ | ||||
| #if defined ( __CC_ARM) | ||||
|   __force_stores(); | ||||
| #endif | ||||
|   /* Request Wait For Interrupt */ | ||||
|   __WFI(); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief This function handles the PWR PVD interrupt request. | ||||
|   * @note This API should be called under the PVD_IRQHandler(). | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWR_PVD_IRQHandler(void) | ||||
| { | ||||
|   /* Check PWR Exti flag */ | ||||
|   if(__HAL_PWR_PVD_EXTI_GET_FLAG() != RESET) | ||||
|   { | ||||
|     /* PWR PVD interrupt user callback */ | ||||
|     HAL_PWR_PVDCallback(); | ||||
|      | ||||
|     /* Clear PWR Exti pending bit */ | ||||
|     __HAL_PWR_PVD_EXTI_CLEAR_FLAG(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  PWR PVD interrupt callback | ||||
|   * @retval None | ||||
|   */ | ||||
| __weak void HAL_PWR_PVDCallback(void) | ||||
| { | ||||
|   /* NOTE : This function Should not be modified, when the callback is needed, | ||||
|             the HAL_PWR_PVDCallback could be implemented in the user file | ||||
|    */  | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Indicates Sleep-On-Exit when returning from Handler mode to Thread mode.  | ||||
|   * @note Set SLEEPONEXIT bit of SCR register. When this bit is set, the processor  | ||||
|   *       re-enters SLEEP mode when an interruption handling is over. | ||||
|   *       Setting this bit is useful when the processor is expected to run only on | ||||
|   *       interruptions handling.          | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWR_EnableSleepOnExit(void) | ||||
| { | ||||
|   /* Set SLEEPONEXIT bit of Cortex System Control Register */ | ||||
|   SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Disables Sleep-On-Exit feature when returning from Handler mode to Thread mode.  | ||||
|   * @note Clears SLEEPONEXIT bit of SCR register. When this bit is set, the processor  | ||||
|   *       re-enters SLEEP mode when an interruption handling is over.           | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWR_DisableSleepOnExit(void) | ||||
| { | ||||
|   /* Clear SLEEPONEXIT bit of Cortex System Control Register */ | ||||
|   CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Enables CORTEX M4 SEVONPEND bit.  | ||||
|   * @note Sets SEVONPEND bit of SCR register. When this bit is set, this causes  | ||||
|   *       WFE to wake up when an interrupt moves from inactive to pended. | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWR_EnableSEVOnPend(void) | ||||
| { | ||||
|   /* Set SEVONPEND bit of Cortex System Control Register */ | ||||
|   SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Disables CORTEX M4 SEVONPEND bit.  | ||||
|   * @note Clears SEVONPEND bit of SCR register. When this bit is set, this causes  | ||||
|   *       WFE to wake up when an interrupt moves from inactive to pended.          | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWR_DisableSEVOnPend(void) | ||||
| { | ||||
|   /* Clear SEVONPEND bit of Cortex System Control Register */ | ||||
|   CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|    | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* HAL_PWR_MODULE_ENABLED */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
							
								
								
									
										552
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pwr_ex.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										552
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pwr_ex.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,552 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32f7xx_hal_pwr_ex.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   Extended PWR HAL module driver. | ||||
|   *          This file provides firmware functions to manage the following  | ||||
|   *          functionalities of PWR extension peripheral:            | ||||
|   *           + Peripheral Extended features functions | ||||
|   *          | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * Copyright (c) 2017 STMicroelectronics. | ||||
|   * All rights reserved. | ||||
|   * | ||||
|   * This software is licensed under terms that can be found in the LICENSE file | ||||
|   * in the root directory of this software component. | ||||
|   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32f7xx_hal.h" | ||||
|  | ||||
| /** @addtogroup STM32F7xx_HAL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup PWREx PWREx | ||||
|   * @brief PWR HAL module driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #ifdef HAL_PWR_MODULE_ENABLED | ||||
|  | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private define ------------------------------------------------------------*/ | ||||
| /** @addtogroup PWREx_Private_Constants | ||||
|   * @{ | ||||
|   */     | ||||
| #define PWR_OVERDRIVE_TIMEOUT_VALUE  1000 | ||||
| #define PWR_UDERDRIVE_TIMEOUT_VALUE  1000 | ||||
| #define PWR_BKPREG_TIMEOUT_VALUE     1000 | ||||
| #define PWR_VOSRDY_TIMEOUT_VALUE     1000 | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|      | ||||
| /* Private macro -------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /* Private functions ---------------------------------------------------------*/ | ||||
| /** @defgroup PWREx_Exported_Functions PWREx Exported Functions | ||||
|   *  @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup PWREx_Exported_Functions_Group1 Peripheral Extended features functions  | ||||
|   *  @brief Peripheral Extended features functions  | ||||
|   * | ||||
| @verbatim    | ||||
|  | ||||
|  =============================================================================== | ||||
|                  ##### Peripheral extended features functions ##### | ||||
|  =============================================================================== | ||||
|  | ||||
|     *** Main and Backup Regulators configuration *** | ||||
|     ================================================ | ||||
|     [..]  | ||||
|       (+) The backup domain includes 4 Kbytes of backup SRAM accessible only from  | ||||
|           the CPU, and address in 32-bit, 16-bit or 8-bit mode. Its content is  | ||||
|           retained even in Standby or VBAT mode when the low power backup regulator | ||||
|           is enabled. It can be considered as an internal EEPROM when VBAT is  | ||||
|           always present. You can use the HAL_PWREx_EnableBkUpReg() function to  | ||||
|           enable the low power backup regulator.  | ||||
|  | ||||
|       (+) When the backup domain is supplied by VDD (analog switch connected to VDD)  | ||||
|           the backup SRAM is powered from VDD which replaces the VBAT power supply to  | ||||
|           save battery life. | ||||
|  | ||||
|       (+) The backup SRAM is not mass erased by a tamper event. It is read  | ||||
|           protected to prevent confidential data, such as cryptographic private  | ||||
|           key, from being accessed. The backup SRAM can be erased only through  | ||||
|           the Flash interface when a protection level change from level 1 to  | ||||
|           level 0 is requested.  | ||||
|       -@- Refer to the description of Read protection (RDP) in the Flash  | ||||
|           programming manual. | ||||
|  | ||||
|       (+) The main internal regulator can be configured to have a tradeoff between  | ||||
|           performance and power consumption when the device does not operate at  | ||||
|           the maximum frequency. This is done through __HAL_PWR_MAINREGULATORMODE_CONFIG()  | ||||
|           macro which configure VOS bit in PWR_CR register | ||||
|            | ||||
|         Refer to the product datasheets for more details. | ||||
|  | ||||
|     *** FLASH Power Down configuration **** | ||||
|     ======================================= | ||||
|     [..]  | ||||
|       (+) By setting the FPDS bit in the PWR_CR register by using the  | ||||
|           HAL_PWREx_EnableFlashPowerDown() function, the Flash memory also enters power  | ||||
|           down mode when the device enters Stop mode. When the Flash memory  | ||||
|           is in power down mode, an additional startup delay is incurred when  | ||||
|           waking up from Stop mode. | ||||
|  | ||||
|     *** Over-Drive and Under-Drive configuration **** | ||||
|     ================================================= | ||||
|     [..]          | ||||
|        (+) In Run mode: the main regulator has 2 operating modes available: | ||||
|         (++) Normal mode: The CPU and core logic operate at maximum frequency at a given  | ||||
|              voltage scaling (scale 1, scale 2 or scale 3) | ||||
|         (++) Over-drive mode: This mode allows the CPU and the core logic to operate at a  | ||||
|             higher frequency than the normal mode for a given voltage scaling (scale 1,   | ||||
|             scale 2 or scale 3). This mode is enabled through HAL_PWREx_EnableOverDrive() function and | ||||
|             disabled by HAL_PWREx_DisableOverDrive() function, to enter or exit from Over-drive mode please follow  | ||||
|             the sequence described in Reference manual. | ||||
|               | ||||
|        (+) In Stop mode: the main regulator or low power regulator supplies a low power  | ||||
|            voltage to the 1.2V domain, thus preserving the content of registers  | ||||
|            and internal SRAM. 2 operating modes are available: | ||||
|          (++) Normal mode: the 1.2V domain is preserved in nominal leakage mode. This mode is only  | ||||
|               available when the main regulator or the low power regulator is used in Scale 3 or  | ||||
|               low voltage mode. | ||||
|          (++) Under-drive mode: the 1.2V domain is preserved in reduced leakage mode. This mode is only | ||||
|               available when the main regulator or the low power regulator is in low voltage mode. | ||||
|  | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief Enables the Backup Regulator. | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_PWREx_EnableBkUpReg(void) | ||||
| { | ||||
|   uint32_t tickstart = 0; | ||||
|  | ||||
|   /* Enable Backup regulator */ | ||||
|   PWR->CSR1 |= PWR_CSR1_BRE; | ||||
|      | ||||
|   /* Workaround for the following hardware bug: */ | ||||
|   /* Id 19: PWR : No STANDBY wake-up when Back-up RAM enabled (ref. Errata Sheet p23) */ | ||||
|   PWR->CSR1 |= PWR_CSR1_EIWUP; | ||||
|  | ||||
|   /* Get tick */ | ||||
|   tickstart = HAL_GetTick(); | ||||
|  | ||||
|   /* Wait till Backup regulator ready flag is set */   | ||||
|   while(__HAL_PWR_GET_FLAG(PWR_FLAG_BRR) == RESET) | ||||
|   { | ||||
|     if((HAL_GetTick() - tickstart ) > PWR_BKPREG_TIMEOUT_VALUE) | ||||
|     { | ||||
|       return HAL_TIMEOUT; | ||||
|     }  | ||||
|   } | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Disables the Backup Regulator. | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_PWREx_DisableBkUpReg(void) | ||||
| { | ||||
|   uint32_t tickstart = 0; | ||||
|    | ||||
|   /* Disable Backup regulator */ | ||||
|   PWR->CSR1 &= (uint32_t)~((uint32_t)PWR_CSR1_BRE); | ||||
|    | ||||
|   /* Workaround for the following hardware bug: */ | ||||
|   /* Id 19: PWR : No STANDBY wake-up when Back-up RAM enabled (ref. Errata Sheet p23) */ | ||||
|   PWR->CSR1 |= PWR_CSR1_EIWUP; | ||||
|  | ||||
|   /* Get tick */ | ||||
|   tickstart = HAL_GetTick(); | ||||
|  | ||||
|   /* Wait till Backup regulator ready flag is set */   | ||||
|   while(__HAL_PWR_GET_FLAG(PWR_FLAG_BRR) != RESET) | ||||
|   { | ||||
|     if((HAL_GetTick() - tickstart ) > PWR_BKPREG_TIMEOUT_VALUE) | ||||
|     { | ||||
|       return HAL_TIMEOUT; | ||||
|     }  | ||||
|   } | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Enables the Flash Power Down in Stop mode. | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWREx_EnableFlashPowerDown(void) | ||||
| { | ||||
|   /* Enable the Flash Power Down */ | ||||
|   PWR->CR1 |= PWR_CR1_FPDS; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Disables the Flash Power Down in Stop mode. | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWREx_DisableFlashPowerDown(void) | ||||
| { | ||||
|   /* Disable the Flash Power Down */ | ||||
|   PWR->CR1 &= (uint32_t)~((uint32_t)PWR_CR1_FPDS); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Enables Main Regulator low voltage mode. | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWREx_EnableMainRegulatorLowVoltage(void) | ||||
| { | ||||
|   /* Enable Main regulator low voltage */ | ||||
|   PWR->CR1 |= PWR_CR1_MRUDS; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Disables Main Regulator low voltage mode. | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWREx_DisableMainRegulatorLowVoltage(void) | ||||
| {   | ||||
|   /* Disable Main regulator low voltage */ | ||||
|   PWR->CR1 &= (uint32_t)~((uint32_t)PWR_CR1_MRUDS); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Enables Low Power Regulator low voltage mode. | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWREx_EnableLowRegulatorLowVoltage(void) | ||||
| { | ||||
|   /* Enable low power regulator */ | ||||
|   PWR->CR1 |= PWR_CR1_LPUDS; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Disables Low Power Regulator low voltage mode. | ||||
|   * @retval None | ||||
|   */ | ||||
| void HAL_PWREx_DisableLowRegulatorLowVoltage(void) | ||||
| { | ||||
|   /* Disable low power regulator */ | ||||
|   PWR->CR1 &= (uint32_t)~((uint32_t)PWR_CR1_LPUDS); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Activates the Over-Drive mode. | ||||
|   * @note   This mode allows the CPU and the core logic to operate at a higher frequency | ||||
|   *         than the normal mode for a given voltage scaling (scale 1, scale 2 or scale 3).    | ||||
|   * @note   It is recommended to enter or exit Over-drive mode when the application is not running  | ||||
|   *         critical tasks and when the system clock source is either HSI or HSE.  | ||||
|   *         During the Over-drive switch activation, no peripheral clocks should be enabled.    | ||||
|   *         The peripheral clocks must be enabled once the Over-drive mode is activated.    | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_PWREx_EnableOverDrive(void) | ||||
| { | ||||
|   uint32_t tickstart = 0; | ||||
|  | ||||
|   __HAL_RCC_PWR_CLK_ENABLE(); | ||||
|    | ||||
|   /* Enable the Over-drive to extend the clock frequency to 216 MHz */ | ||||
|   __HAL_PWR_OVERDRIVE_ENABLE(); | ||||
|  | ||||
|   /* Get tick */ | ||||
|   tickstart = HAL_GetTick(); | ||||
|  | ||||
|   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_ODRDY)) | ||||
|   { | ||||
|     if((HAL_GetTick() - tickstart ) > PWR_OVERDRIVE_TIMEOUT_VALUE) | ||||
|     { | ||||
|       return HAL_TIMEOUT; | ||||
|     } | ||||
|   } | ||||
|    | ||||
|   /* Enable the Over-drive switch */ | ||||
|   __HAL_PWR_OVERDRIVESWITCHING_ENABLE(); | ||||
|  | ||||
|   /* Get tick */ | ||||
|   tickstart = HAL_GetTick(); | ||||
|  | ||||
|   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_ODSWRDY)) | ||||
|   { | ||||
|     if((HAL_GetTick() - tickstart ) > PWR_OVERDRIVE_TIMEOUT_VALUE) | ||||
|     { | ||||
|       return HAL_TIMEOUT; | ||||
|     } | ||||
|   }  | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Deactivates the Over-Drive mode. | ||||
|   * @note   This mode allows the CPU and the core logic to operate at a higher frequency | ||||
|   *         than the normal mode for a given voltage scaling (scale 1, scale 2 or scale 3).     | ||||
|   * @note   It is recommended to enter or exit Over-drive mode when the application is not running  | ||||
|   *         critical tasks and when the system clock source is either HSI or HSE.  | ||||
|   *         During the Over-drive switch activation, no peripheral clocks should be enabled.    | ||||
|   *         The peripheral clocks must be enabled once the Over-drive mode is activated. | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void) | ||||
| { | ||||
|   uint32_t tickstart = 0; | ||||
|    | ||||
|   __HAL_RCC_PWR_CLK_ENABLE(); | ||||
|      | ||||
|   /* Disable the Over-drive switch */ | ||||
|   __HAL_PWR_OVERDRIVESWITCHING_DISABLE(); | ||||
|    | ||||
|   /* Get tick */ | ||||
|   tickstart = HAL_GetTick(); | ||||
|   | ||||
|   while(__HAL_PWR_GET_FLAG(PWR_FLAG_ODSWRDY)) | ||||
|   { | ||||
|     if((HAL_GetTick() - tickstart ) > PWR_OVERDRIVE_TIMEOUT_VALUE) | ||||
|     { | ||||
|       return HAL_TIMEOUT; | ||||
|     } | ||||
|   }  | ||||
|    | ||||
|   /* Disable the Over-drive */ | ||||
|   __HAL_PWR_OVERDRIVE_DISABLE(); | ||||
|  | ||||
|   /* Get tick */ | ||||
|   tickstart = HAL_GetTick(); | ||||
|  | ||||
|   while(__HAL_PWR_GET_FLAG(PWR_FLAG_ODRDY)) | ||||
|   { | ||||
|     if((HAL_GetTick() - tickstart ) > PWR_OVERDRIVE_TIMEOUT_VALUE) | ||||
|     { | ||||
|       return HAL_TIMEOUT; | ||||
|     } | ||||
|   } | ||||
|    | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Enters in Under-Drive STOP mode. | ||||
|   *  | ||||
|   * @note    This mode can be selected only when the Under-Drive is already active  | ||||
|   *    | ||||
|   * @note    This mode is enabled only with STOP low power mode. | ||||
|   *          In this mode, the 1.2V domain is preserved in reduced leakage mode. This  | ||||
|   *          mode is only available when the main regulator or the low power regulator  | ||||
|   *          is in low voltage mode | ||||
|   *         | ||||
|   * @note   If the Under-drive mode was enabled, it is automatically disabled after  | ||||
|   *         exiting Stop mode.  | ||||
|   *         When the voltage regulator operates in Under-drive mode, an additional   | ||||
|   *         startup delay is induced when waking up from Stop mode. | ||||
|   *                     | ||||
|   * @note   In Stop mode, all I/O pins keep the same state as in Run mode. | ||||
|   *    | ||||
|   * @note   When exiting Stop mode by issuing an interrupt or a wakeup event,  | ||||
|   *         the HSI RC oscillator is selected as system clock. | ||||
|   *            | ||||
|   * @note   When the voltage regulator operates in low power mode, an additional  | ||||
|   *         startup delay is incurred when waking up from Stop mode.  | ||||
|   *         By keeping the internal regulator ON during Stop mode, the consumption  | ||||
|   *         is higher although the startup time is reduced. | ||||
|   *      | ||||
|   * @param  Regulator specifies the regulator state in STOP mode. | ||||
|   *          This parameter can be one of the following values: | ||||
|   *            @arg PWR_MAINREGULATOR_UNDERDRIVE_ON:  Main Regulator in under-drive mode  | ||||
|   *                 and Flash memory in power-down when the device is in Stop under-drive mode | ||||
|   *            @arg PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON:  Low Power Regulator in under-drive mode  | ||||
|   *                and Flash memory in power-down when the device is in Stop under-drive mode | ||||
|   * @param  STOPEntry specifies if STOP mode in entered with WFI or WFE instruction. | ||||
|   *          This parameter can be one of the following values: | ||||
|   *            @arg PWR_SLEEPENTRY_WFI: enter STOP mode with WFI instruction | ||||
|   *            @arg PWR_SLEEPENTRY_WFE: enter STOP mode with WFE instruction | ||||
|   * @retval None | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t STOPEntry) | ||||
| { | ||||
|   uint32_t tempreg = 0; | ||||
|   uint32_t tickstart = 0; | ||||
|    | ||||
|   /* Check the parameters */ | ||||
|   assert_param(IS_PWR_REGULATOR_UNDERDRIVE(Regulator)); | ||||
|   assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); | ||||
|    | ||||
|   /* Enable Power ctrl clock */ | ||||
|   __HAL_RCC_PWR_CLK_ENABLE(); | ||||
|   /* Enable the Under-drive Mode ---------------------------------------------*/ | ||||
|   /* Clear Under-drive flag */ | ||||
|   __HAL_PWR_CLEAR_ODRUDR_FLAG(); | ||||
|    | ||||
|   /* Enable the Under-drive */  | ||||
|   __HAL_PWR_UNDERDRIVE_ENABLE(); | ||||
|  | ||||
|   /* Get tick */ | ||||
|   tickstart = HAL_GetTick(); | ||||
|  | ||||
|   /* Wait for UnderDrive mode is ready */ | ||||
|   while(__HAL_PWR_GET_FLAG(PWR_FLAG_UDRDY)) | ||||
|   { | ||||
|     if((HAL_GetTick() - tickstart ) > PWR_UDERDRIVE_TIMEOUT_VALUE) | ||||
|     { | ||||
|       return HAL_TIMEOUT; | ||||
|     } | ||||
|   } | ||||
|    | ||||
|   /* Select the regulator state in STOP mode ---------------------------------*/ | ||||
|   tempreg = PWR->CR1; | ||||
|   /* Clear PDDS, LPDS, MRLUDS and LPLUDS bits */ | ||||
|   tempreg &= (uint32_t)~(PWR_CR1_PDDS | PWR_CR1_LPDS | PWR_CR1_LPUDS | PWR_CR1_MRUDS); | ||||
|    | ||||
|   /* Set LPDS, MRLUDS and LPLUDS bits according to PWR_Regulator value */ | ||||
|   tempreg |= Regulator; | ||||
|    | ||||
|   /* Store the new value */ | ||||
|   PWR->CR1 = tempreg; | ||||
|    | ||||
|   /* Set SLEEPDEEP bit of Cortex System Control Register */ | ||||
|   SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; | ||||
|    | ||||
|   /* Select STOP mode entry --------------------------------------------------*/ | ||||
|   if(STOPEntry == PWR_SLEEPENTRY_WFI) | ||||
|   {    | ||||
|     /* Request Wait For Interrupt */ | ||||
|     __WFI(); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     /* Request Wait For Event */ | ||||
|     __WFE(); | ||||
|   } | ||||
|   /* Reset SLEEPDEEP bit of Cortex System Control Register */ | ||||
|   SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); | ||||
|  | ||||
|   return HAL_OK;   | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Returns Voltage Scaling Range. | ||||
|   * @retval VOS bit field (PWR_REGULATOR_VOLTAGE_SCALE1, PWR_REGULATOR_VOLTAGE_SCALE2 or  | ||||
|   *            PWR_REGULATOR_VOLTAGE_SCALE3)PWR_REGULATOR_VOLTAGE_SCALE1 | ||||
|   */   | ||||
| uint32_t HAL_PWREx_GetVoltageRange(void) | ||||
| { | ||||
|   return  (PWR->CR1 & PWR_CR1_VOS); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Configures the main internal regulator output voltage. | ||||
|   * @param  VoltageScaling specifies the regulator output voltage to achieve | ||||
|   *         a tradeoff between performance and power consumption. | ||||
|   *          This parameter can be one of the following values: | ||||
|   *            @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output range 1 mode, | ||||
|   *                                                typical output voltage at 1.4 V,   | ||||
|   *                                                system frequency up to 216 MHz. | ||||
|   *            @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output range 2 mode, | ||||
|   *                                                typical output voltage at 1.2 V,                 | ||||
|   *                                                system frequency up to 180 MHz. | ||||
|   *            @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output range 2 mode, | ||||
|   *                                                typical output voltage at 1.00 V,                 | ||||
|   *                                                system frequency up to 151 MHz. | ||||
|   * @note To update the system clock frequency(SYSCLK): | ||||
|   *        - Set the HSI or HSE as system clock frequency using the HAL_RCC_ClockConfig(). | ||||
|   *        - Call the HAL_RCC_OscConfig() to configure the PLL. | ||||
|   *        - Call HAL_PWREx_ConfigVoltageScaling() API to adjust the voltage scale. | ||||
|   *        - Set the new system clock frequency using the HAL_RCC_ClockConfig(). | ||||
|   * @note The scale can be modified only when the HSI or HSE clock source is selected  | ||||
|   *        as system clock source, otherwise the API returns HAL_ERROR.   | ||||
|   * @note When the PLL is OFF, the voltage scale 3 is automatically selected and the VOS bits | ||||
|   *       value in the PWR_CR1 register are not taken in account. | ||||
|   * @note This API forces the PLL state ON to allow the possibility to configure the voltage scale 1 or 2. | ||||
|   * @note The new voltage scale is active only when the PLL is ON.   | ||||
|   * @retval HAL Status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) | ||||
| { | ||||
|   uint32_t tickstart = 0; | ||||
|  | ||||
|   assert_param(IS_PWR_REGULATOR_VOLTAGE(VoltageScaling)); | ||||
|  | ||||
|   /* Enable Power ctrl clock */ | ||||
|   __HAL_RCC_PWR_CLK_ENABLE(); | ||||
|  | ||||
|   /* Check if the PLL is used as system clock or not */ | ||||
|   if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) | ||||
|   { | ||||
|     /* Disable the main PLL */ | ||||
|     __HAL_RCC_PLL_DISABLE(); | ||||
|      | ||||
|     /* Get Start Tick */ | ||||
|     tickstart = HAL_GetTick();     | ||||
|     /* Wait till PLL is disabled */   | ||||
|     while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) | ||||
|     { | ||||
|       if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) | ||||
|       { | ||||
|         return HAL_TIMEOUT; | ||||
|       } | ||||
|     } | ||||
|      | ||||
|     /* Set Range */ | ||||
|     __HAL_PWR_VOLTAGESCALING_CONFIG(VoltageScaling); | ||||
|      | ||||
|     /* Enable the main PLL */ | ||||
|     __HAL_RCC_PLL_ENABLE(); | ||||
|      | ||||
|     /* Get Start Tick */ | ||||
|     tickstart = HAL_GetTick(); | ||||
|     /* Wait till PLL is ready */   | ||||
|     while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) | ||||
|     { | ||||
|       if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) | ||||
|       { | ||||
|         return HAL_TIMEOUT; | ||||
|       }  | ||||
|     } | ||||
|      | ||||
|     /* Get Start Tick */ | ||||
|     tickstart = HAL_GetTick(); | ||||
|     while((__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY) == RESET)) | ||||
|     { | ||||
|       if((HAL_GetTick() - tickstart ) > PWR_VOSRDY_TIMEOUT_VALUE) | ||||
|       { | ||||
|         return HAL_TIMEOUT; | ||||
|       }  | ||||
|     } | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return HAL_ERROR; | ||||
|   } | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* HAL_PWR_MODULE_ENABLED */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
							
								
								
									
										1239
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1239
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1773
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc_ex.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1773
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc_ex.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1921
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rtc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1921
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rtc.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1874
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rtc_ex.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1874
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rtc_ex.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1306
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_sdram.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1306
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_sdram.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										4483
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_spi.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4483
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_spi.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										112
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_spi_ex.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_spi_ex.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,112 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32f7xx_hal_spi_ex.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   Extended SPI HAL module driver. | ||||
|   *          This file provides firmware functions to manage the following | ||||
|   *          SPI peripheral extended functionalities : | ||||
|   *           + IO operation functions | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * Copyright (c) 2017 STMicroelectronics. | ||||
|   * All rights reserved. | ||||
|   * | ||||
|   * This software is licensed under terms that can be found in the LICENSE file | ||||
|   * in the root directory of this software component. | ||||
|   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32f7xx_hal.h" | ||||
|  | ||||
| /** @addtogroup STM32F7xx_HAL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup SPIEx SPIEx | ||||
|   * @brief SPI Extended HAL module driver | ||||
|   * @{ | ||||
|   */ | ||||
| #ifdef HAL_SPI_MODULE_ENABLED | ||||
|  | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private defines -----------------------------------------------------------*/ | ||||
| /** @defgroup SPIEx_Private_Constants SPIEx Private Constants | ||||
|   * @{ | ||||
|   */ | ||||
| #define SPI_FIFO_SIZE       4UL | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
|  | ||||
| /** @defgroup SPIEx_Exported_Functions SPIEx Exported Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup SPIEx_Exported_Functions_Group1 IO operation functions | ||||
|   *  @brief   Data transfers functions | ||||
|   * | ||||
| @verbatim | ||||
|   ============================================================================== | ||||
|                       ##### IO operation functions ##### | ||||
|  =============================================================================== | ||||
|  [..] | ||||
|     This subsection provides a set of extended functions to manage the SPI | ||||
|     data transfers. | ||||
|  | ||||
|     (#) Rx data flush function: | ||||
|         (++) HAL_SPIEx_FlushRxFifo() | ||||
|  | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief  Flush the RX fifo. | ||||
|   * @param  hspi pointer to a SPI_HandleTypeDef structure that contains | ||||
|   *               the configuration information for the specified SPI module. | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_SPIEx_FlushRxFifo(SPI_HandleTypeDef *hspi) | ||||
| { | ||||
|   __IO uint32_t tmpreg; | ||||
|   uint8_t  count = 0U; | ||||
|   while ((hspi->Instance->SR & SPI_FLAG_FRLVL) !=  SPI_FRLVL_EMPTY) | ||||
|   { | ||||
|     count++; | ||||
|     tmpreg = hspi->Instance->DR; | ||||
|     UNUSED(tmpreg); /* To avoid GCC warning */ | ||||
|     if (count == SPI_FIFO_SIZE) | ||||
|     { | ||||
|       return HAL_TIMEOUT; | ||||
|     } | ||||
|   } | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* HAL_SPI_MODULE_ENABLED */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
							
								
								
									
										7883
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7883
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2607
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2607
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										4021
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4021
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										770
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart_ex.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										770
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart_ex.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,770 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    stm32f7xx_hal_uart_ex.c | ||||
|   * @author  MCD Application Team | ||||
|   * @brief   Extended UART HAL module driver. | ||||
|   *          This file provides firmware functions to manage the following extended | ||||
|   *          functionalities of the Universal Asynchronous Receiver Transmitter Peripheral (UART). | ||||
|   *           + Initialization and de-initialization functions | ||||
|   *           + Peripheral Control functions | ||||
|   * | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * Copyright (c) 2017 STMicroelectronics. | ||||
|   * All rights reserved. | ||||
|   * | ||||
|   * This software is licensed under terms that can be found in the LICENSE file | ||||
|   * in the root directory of this software component. | ||||
|   * If no LICENSE file comes with this software, it is provided AS-IS. | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   @verbatim | ||||
|   ============================================================================== | ||||
|                ##### UART peripheral extended features  ##### | ||||
|   ============================================================================== | ||||
|  | ||||
|     (#) Declare a UART_HandleTypeDef handle structure. | ||||
|  | ||||
|     (#) For the UART RS485 Driver Enable mode, initialize the UART registers | ||||
|         by calling the HAL_RS485Ex_Init() API. | ||||
|  | ||||
|   @endverbatim | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "stm32f7xx_hal.h" | ||||
|  | ||||
| /** @addtogroup STM32F7xx_HAL_Driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup UARTEx UARTEx | ||||
|   * @brief UART Extended HAL module driver | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #ifdef HAL_UART_MODULE_ENABLED | ||||
|  | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private define ------------------------------------------------------------*/ | ||||
|  | ||||
| /* Private macros ------------------------------------------------------------*/ | ||||
| /* Private variables ---------------------------------------------------------*/ | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| /** @defgroup UARTEx_Private_Functions UARTEx Private Functions | ||||
|   * @{ | ||||
|   */ | ||||
| #if defined(USART_CR1_UESM) | ||||
| static void UARTEx_Wakeup_AddressConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection); | ||||
| #endif /* USART_CR1_UESM */ | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /* Exported functions --------------------------------------------------------*/ | ||||
|  | ||||
| /** @defgroup UARTEx_Exported_Functions  UARTEx Exported Functions | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** @defgroup UARTEx_Exported_Functions_Group1 Initialization and de-initialization functions | ||||
|   * @brief    Extended Initialization and Configuration Functions | ||||
|   * | ||||
| @verbatim | ||||
| =============================================================================== | ||||
|             ##### Initialization and Configuration functions ##### | ||||
|  =============================================================================== | ||||
|     [..] | ||||
|     This subsection provides a set of functions allowing to initialize the USARTx or the UARTy | ||||
|     in asynchronous mode. | ||||
|       (+) For the asynchronous mode the parameters below can be configured: | ||||
|         (++) Baud Rate | ||||
|         (++) Word Length | ||||
|         (++) Stop Bit | ||||
|         (++) Parity: If the parity is enabled, then the MSB bit of the data written | ||||
|              in the data register is transmitted but is changed by the parity bit. | ||||
|         (++) Hardware flow control | ||||
|         (++) Receiver/transmitter modes | ||||
|         (++) Over Sampling Method | ||||
|         (++) One-Bit Sampling Method | ||||
|       (+) For the asynchronous mode, the following advanced features can be configured as well: | ||||
|         (++) TX and/or RX pin level inversion | ||||
|         (++) data logical level inversion | ||||
|         (++) RX and TX pins swap | ||||
|         (++) RX overrun detection disabling | ||||
|         (++) DMA disabling on RX error | ||||
|         (++) MSB first on communication line | ||||
|         (++) auto Baud rate detection | ||||
|     [..] | ||||
|     The HAL_RS485Ex_Init() API follows the UART RS485 mode configuration | ||||
|      procedures (details for the procedures are available in reference manual). | ||||
|  | ||||
| @endverbatim | ||||
|  | ||||
|   Depending on the frame length defined by the M1 and M0 bits (7-bit, | ||||
|   8-bit or 9-bit), the possible UART formats are listed in the | ||||
|   following table. | ||||
|  | ||||
|     Table 1. UART frame format. | ||||
|     +-----------------------------------------------------------------------+ | ||||
|     |  M1 bit |  M0 bit |  PCE bit  |             UART frame                | | ||||
|     |---------|---------|-----------|---------------------------------------| | ||||
|     |    0    |    0    |    0      |    | SB |    8 bit data   | STB |     | | ||||
|     |---------|---------|-----------|---------------------------------------| | ||||
|     |    0    |    0    |    1      |    | SB | 7 bit data | PB | STB |     | | ||||
|     |---------|---------|-----------|---------------------------------------| | ||||
|     |    0    |    1    |    0      |    | SB |    9 bit data   | STB |     | | ||||
|     |---------|---------|-----------|---------------------------------------| | ||||
|     |    0    |    1    |    1      |    | SB | 8 bit data | PB | STB |     | | ||||
|     |---------|---------|-----------|---------------------------------------| | ||||
|     |    1    |    0    |    0      |    | SB |    7 bit data   | STB |     | | ||||
|     |---------|---------|-----------|---------------------------------------| | ||||
|     |    1    |    0    |    1      |    | SB | 6 bit data | PB | STB |     | | ||||
|     +-----------------------------------------------------------------------+ | ||||
|  | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @brief Initialize the RS485 Driver enable feature according to the specified | ||||
|   *         parameters in the UART_InitTypeDef and creates the associated handle. | ||||
|   * @param huart            UART handle. | ||||
|   * @param Polarity         Select the driver enable polarity. | ||||
|   *          This parameter can be one of the following values: | ||||
|   *          @arg @ref UART_DE_POLARITY_HIGH DE signal is active high | ||||
|   *          @arg @ref UART_DE_POLARITY_LOW  DE signal is active low | ||||
|   * @param AssertionTime    Driver Enable assertion time: | ||||
|   *       5-bit value defining the time between the activation of the DE (Driver Enable) | ||||
|   *       signal and the beginning of the start bit. It is expressed in sample time | ||||
|   *       units (1/8 or 1/16 bit time, depending on the oversampling rate) | ||||
|   * @param DeassertionTime  Driver Enable deassertion time: | ||||
|   *       5-bit value defining the time between the end of the last stop bit, in a | ||||
|   *       transmitted message, and the de-activation of the DE (Driver Enable) signal. | ||||
|   *       It is expressed in sample time units (1/8 or 1/16 bit time, depending on the | ||||
|   *       oversampling rate). | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, | ||||
|                                    uint32_t DeassertionTime) | ||||
| { | ||||
|   uint32_t temp; | ||||
|  | ||||
|   /* Check the UART handle allocation */ | ||||
|   if (huart == NULL) | ||||
|   { | ||||
|     return HAL_ERROR; | ||||
|   } | ||||
|   /* Check the Driver Enable UART instance */ | ||||
|   assert_param(IS_UART_DRIVER_ENABLE_INSTANCE(huart->Instance)); | ||||
|  | ||||
|   /* Check the Driver Enable polarity */ | ||||
|   assert_param(IS_UART_DE_POLARITY(Polarity)); | ||||
|  | ||||
|   /* Check the Driver Enable assertion time */ | ||||
|   assert_param(IS_UART_ASSERTIONTIME(AssertionTime)); | ||||
|  | ||||
|   /* Check the Driver Enable deassertion time */ | ||||
|   assert_param(IS_UART_DEASSERTIONTIME(DeassertionTime)); | ||||
|  | ||||
|   if (huart->gState == HAL_UART_STATE_RESET) | ||||
|   { | ||||
|     /* Allocate lock resource and initialize it */ | ||||
|     huart->Lock = HAL_UNLOCKED; | ||||
|  | ||||
| #if (USE_HAL_UART_REGISTER_CALLBACKS == 1) | ||||
|     UART_InitCallbacksToDefault(huart); | ||||
|  | ||||
|     if (huart->MspInitCallback == NULL) | ||||
|     { | ||||
|       huart->MspInitCallback = HAL_UART_MspInit; | ||||
|     } | ||||
|  | ||||
|     /* Init the low level hardware */ | ||||
|     huart->MspInitCallback(huart); | ||||
| #else | ||||
|     /* Init the low level hardware : GPIO, CLOCK, CORTEX */ | ||||
|     HAL_UART_MspInit(huart); | ||||
| #endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ | ||||
|   } | ||||
|  | ||||
|   huart->gState = HAL_UART_STATE_BUSY; | ||||
|  | ||||
|   /* Disable the Peripheral */ | ||||
|   __HAL_UART_DISABLE(huart); | ||||
|  | ||||
|   /* Set the UART Communication parameters */ | ||||
|   if (UART_SetConfig(huart) == HAL_ERROR) | ||||
|   { | ||||
|     return HAL_ERROR; | ||||
|   } | ||||
|  | ||||
|   if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT) | ||||
|   { | ||||
|     UART_AdvFeatureConfig(huart); | ||||
|   } | ||||
|  | ||||
|   /* Enable the Driver Enable mode by setting the DEM bit in the CR3 register */ | ||||
|   SET_BIT(huart->Instance->CR3, USART_CR3_DEM); | ||||
|  | ||||
|   /* Set the Driver Enable polarity */ | ||||
|   MODIFY_REG(huart->Instance->CR3, USART_CR3_DEP, Polarity); | ||||
|  | ||||
|   /* Set the Driver Enable assertion and deassertion times */ | ||||
|   temp = (AssertionTime << UART_CR1_DEAT_ADDRESS_LSB_POS); | ||||
|   temp |= (DeassertionTime << UART_CR1_DEDT_ADDRESS_LSB_POS); | ||||
|   MODIFY_REG(huart->Instance->CR1, (USART_CR1_DEDT | USART_CR1_DEAT), temp); | ||||
|  | ||||
|   /* Enable the Peripheral */ | ||||
|   __HAL_UART_ENABLE(huart); | ||||
|  | ||||
|   /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ | ||||
|   return (UART_CheckIdleState(huart)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
|  | ||||
| /** @defgroup UARTEx_Exported_Functions_Group3 Peripheral Control functions | ||||
|   * @brief    Extended Peripheral Control functions | ||||
|   * | ||||
| @verbatim | ||||
|  =============================================================================== | ||||
|                       ##### Peripheral Control functions ##### | ||||
|  =============================================================================== | ||||
|     [..] This section provides the following functions: | ||||
|      (+) HAL_UARTEx_EnableClockStopMode() API enables the UART clock (HSI or LSE only) during stop mode | ||||
|      (+) HAL_UARTEx_DisableClockStopMode() API disables the above functionality | ||||
|      (+) HAL_MultiProcessorEx_AddressLength_Set() API optionally sets the UART node address | ||||
|          detection length to more than 4 bits for multiprocessor address mark wake up. | ||||
| #if defined(USART_CR1_UESM) | ||||
|      (+) HAL_UARTEx_StopModeWakeUpSourceConfig() API defines the wake-up from stop mode | ||||
|          trigger: address match, Start Bit detection or RXNE bit status. | ||||
|      (+) HAL_UARTEx_EnableStopMode() API enables the UART to wake up the MCU from stop mode | ||||
|      (+) HAL_UARTEx_DisableStopMode() API disables the above functionality | ||||
| #endif | ||||
|  | ||||
|     [..] This subsection also provides a set of additional functions providing enhanced reception | ||||
|     services to user. (For example, these functions allow application to handle use cases | ||||
|     where number of data to be received is unknown). | ||||
|  | ||||
|     (#) Compared to standard reception services which only consider number of received | ||||
|         data elements as reception completion criteria, these functions also consider additional events | ||||
|         as triggers for updating reception status to caller : | ||||
|        (+) Detection of inactivity period (RX line has not been active for a given period). | ||||
|           (++) RX inactivity detected by IDLE event, i.e. RX line has been in idle state (normally high state) | ||||
|                for 1 frame time, after last received byte. | ||||
|           (++) RX inactivity detected by RTO, i.e. line has been in idle state | ||||
|                for a programmable time, after last received byte. | ||||
|        (+) Detection that a specific character has been received. | ||||
|  | ||||
|     (#) There are two mode of transfer: | ||||
|        (+) Blocking mode: The reception is performed in polling mode, until either expected number of data is received, | ||||
|            or till IDLE event occurs. Reception is handled only during function execution. | ||||
|            When function exits, no data reception could occur. HAL status and number of actually received data elements, | ||||
|            are returned by function after finishing transfer. | ||||
|        (+) Non-Blocking mode: The reception is performed using Interrupts or DMA. | ||||
|            These API's return the HAL status. | ||||
|            The end of the data processing will be indicated through the | ||||
|            dedicated UART IRQ when using Interrupt mode or the DMA IRQ when using DMA mode. | ||||
|            The HAL_UARTEx_RxEventCallback() user callback will be executed during Receive process | ||||
|            The HAL_UART_ErrorCallback()user callback will be executed when a reception error is detected. | ||||
|  | ||||
|     (#) Blocking mode API: | ||||
|         (+) HAL_UARTEx_ReceiveToIdle() | ||||
|  | ||||
|     (#) Non-Blocking mode API with Interrupt: | ||||
|         (+) HAL_UARTEx_ReceiveToIdle_IT() | ||||
|  | ||||
|     (#) Non-Blocking mode API with DMA: | ||||
|         (+) HAL_UARTEx_ReceiveToIdle_DMA() | ||||
|  | ||||
| @endverbatim | ||||
|   * @{ | ||||
|   */ | ||||
|  | ||||
| #if defined(USART_CR3_UCESM) | ||||
| /** | ||||
|   * @brief  Keep UART Clock enabled when in Stop Mode. | ||||
|   * @note   When the USART clock source is configured to be LSE or HSI, it is possible to keep enabled | ||||
|   *         this clock during STOP mode by setting the UCESM bit in USART_CR3 control register. | ||||
|   * @note   When LPUART is used to wakeup from stop with LSE is selected as LPUART clock source, | ||||
|   *         and desired baud rate is 9600 baud, the bit UCESM bit in LPUART_CR3 control register must be set. | ||||
|   * @param  huart UART handle. | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_UARTEx_EnableClockStopMode(UART_HandleTypeDef *huart) | ||||
| { | ||||
|   /* Process Locked */ | ||||
|   __HAL_LOCK(huart); | ||||
|  | ||||
|   /* Set UCESM bit */ | ||||
|   ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_UCESM); | ||||
|  | ||||
|   /* Process Unlocked */ | ||||
|   __HAL_UNLOCK(huart); | ||||
|  | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief  Disable UART Clock when in Stop Mode. | ||||
|   * @param  huart UART handle. | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_UARTEx_DisableClockStopMode(UART_HandleTypeDef *huart) | ||||
| { | ||||
|   /* Process Locked */ | ||||
|   __HAL_LOCK(huart); | ||||
|  | ||||
|   /* Clear UCESM bit */ | ||||
|   ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_UCESM); | ||||
|  | ||||
|   /* Process Unlocked */ | ||||
|   __HAL_UNLOCK(huart); | ||||
|  | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| #endif /* USART_CR3_UCESM */ | ||||
| /** | ||||
|   * @brief By default in multiprocessor mode, when the wake up method is set | ||||
|   *        to address mark, the UART handles only 4-bit long addresses detection; | ||||
|   *        this API allows to enable longer addresses detection (6-, 7- or 8-bit | ||||
|   *        long). | ||||
|   * @note  Addresses detection lengths are: 6-bit address detection in 7-bit data mode, | ||||
|   *        7-bit address detection in 8-bit data mode, 8-bit address detection in 9-bit data mode. | ||||
|   * @param huart         UART handle. | ||||
|   * @param AddressLength This parameter can be one of the following values: | ||||
|   *          @arg @ref UART_ADDRESS_DETECT_4B 4-bit long address | ||||
|   *          @arg @ref UART_ADDRESS_DETECT_7B 6-, 7- or 8-bit long address | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *huart, uint32_t AddressLength) | ||||
| { | ||||
|   /* Check the UART handle allocation */ | ||||
|   if (huart == NULL) | ||||
|   { | ||||
|     return HAL_ERROR; | ||||
|   } | ||||
|  | ||||
|   /* Check the address length parameter */ | ||||
|   assert_param(IS_UART_ADDRESSLENGTH_DETECT(AddressLength)); | ||||
|  | ||||
|   huart->gState = HAL_UART_STATE_BUSY; | ||||
|  | ||||
|   /* Disable the Peripheral */ | ||||
|   __HAL_UART_DISABLE(huart); | ||||
|  | ||||
|   /* Set the address length */ | ||||
|   MODIFY_REG(huart->Instance->CR2, USART_CR2_ADDM7, AddressLength); | ||||
|  | ||||
|   /* Enable the Peripheral */ | ||||
|   __HAL_UART_ENABLE(huart); | ||||
|  | ||||
|   /* TEACK and/or REACK to check before moving huart->gState to Ready */ | ||||
|   return (UART_CheckIdleState(huart)); | ||||
| } | ||||
|  | ||||
| #if defined(USART_CR1_UESM) | ||||
| /** | ||||
|   * @brief Set Wakeup from Stop mode interrupt flag selection. | ||||
|   * @note It is the application responsibility to enable the interrupt used as | ||||
|   *       usart_wkup interrupt source before entering low-power mode. | ||||
|   * @param huart           UART handle. | ||||
|   * @param WakeUpSelection Address match, Start Bit detection or RXNE/RXFNE bit status. | ||||
|   *          This parameter can be one of the following values: | ||||
|   *          @arg @ref UART_WAKEUP_ON_ADDRESS | ||||
|   *          @arg @ref UART_WAKEUP_ON_STARTBIT | ||||
|   *          @arg @ref UART_WAKEUP_ON_READDATA_NONEMPTY | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_UARTEx_StopModeWakeUpSourceConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection) | ||||
| { | ||||
|   HAL_StatusTypeDef status = HAL_OK; | ||||
|   uint32_t tickstart; | ||||
|  | ||||
|   /* check the wake-up from stop mode UART instance */ | ||||
|   assert_param(IS_UART_WAKEUP_FROMSTOP_INSTANCE(huart->Instance)); | ||||
|   /* check the wake-up selection parameter */ | ||||
|   assert_param(IS_UART_WAKEUP_SELECTION(WakeUpSelection.WakeUpEvent)); | ||||
|  | ||||
|   /* Process Locked */ | ||||
|   __HAL_LOCK(huart); | ||||
|  | ||||
|   huart->gState = HAL_UART_STATE_BUSY; | ||||
|  | ||||
|   /* Disable the Peripheral */ | ||||
|   __HAL_UART_DISABLE(huart); | ||||
|  | ||||
| #if defined(USART_CR3_WUS) | ||||
|   /* Set the wake-up selection scheme */ | ||||
|   MODIFY_REG(huart->Instance->CR3, USART_CR3_WUS, WakeUpSelection.WakeUpEvent); | ||||
| #endif /* USART_CR3_WUS */ | ||||
|  | ||||
|   if (WakeUpSelection.WakeUpEvent == UART_WAKEUP_ON_ADDRESS) | ||||
|   { | ||||
|     UARTEx_Wakeup_AddressConfig(huart, WakeUpSelection); | ||||
|   } | ||||
|  | ||||
|   /* Enable the Peripheral */ | ||||
|   __HAL_UART_ENABLE(huart); | ||||
|  | ||||
|   /* Init tickstart for timeout management */ | ||||
|   tickstart = HAL_GetTick(); | ||||
|  | ||||
|   /* Wait until REACK flag is set */ | ||||
|   if (UART_WaitOnFlagUntilTimeout(huart, USART_ISR_REACK, RESET, tickstart, HAL_UART_TIMEOUT_VALUE) != HAL_OK) | ||||
|   { | ||||
|     status = HAL_TIMEOUT; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     /* Initialize the UART State */ | ||||
|     huart->gState = HAL_UART_STATE_READY; | ||||
|   } | ||||
|  | ||||
|   /* Process Unlocked */ | ||||
|   __HAL_UNLOCK(huart); | ||||
|  | ||||
|   return status; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Enable UART Stop Mode. | ||||
|   * @note The UART is able to wake up the MCU from Stop 1 mode as long as UART clock is HSI or LSE. | ||||
|   * @param huart UART handle. | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_UARTEx_EnableStopMode(UART_HandleTypeDef *huart) | ||||
| { | ||||
|   /* Process Locked */ | ||||
|   __HAL_LOCK(huart); | ||||
|  | ||||
|   /* Set UESM bit */ | ||||
|   ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_UESM); | ||||
|  | ||||
|   /* Process Unlocked */ | ||||
|   __HAL_UNLOCK(huart); | ||||
|  | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Disable UART Stop Mode. | ||||
|   * @param huart UART handle. | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_UARTEx_DisableStopMode(UART_HandleTypeDef *huart) | ||||
| { | ||||
|   /* Process Locked */ | ||||
|   __HAL_LOCK(huart); | ||||
|  | ||||
|   /* Clear UESM bit */ | ||||
|   ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_UESM); | ||||
|  | ||||
|   /* Process Unlocked */ | ||||
|   __HAL_UNLOCK(huart); | ||||
|  | ||||
|   return HAL_OK; | ||||
| } | ||||
|  | ||||
| #endif /* USART_CR1_UESM */ | ||||
| /** | ||||
|   * @brief Receive an amount of data in blocking mode till either the expected number of data | ||||
|   *        is received or an IDLE event occurs. | ||||
|   * @note  HAL_OK is returned if reception is completed (expected number of data has been received) | ||||
|   *        or if reception is stopped after IDLE event (less than the expected number of data has been received) | ||||
|   *        In this case, RxLen output parameter indicates number of data available in reception buffer. | ||||
|   * @note  When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), | ||||
|   *        the received data is handled as a set of uint16_t. In this case, Size must indicate the number | ||||
|   *        of uint16_t available through pData. | ||||
|   * @param huart   UART handle. | ||||
|   * @param pData   Pointer to data buffer (uint8_t or uint16_t data elements). | ||||
|   * @param Size    Amount of data elements (uint8_t or uint16_t) to be received. | ||||
|   * @param RxLen   Number of data elements finally received | ||||
|   *                (could be lower than Size, in case reception ends on IDLE event) | ||||
|   * @param Timeout Timeout duration expressed in ms (covers the whole reception sequence). | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint16_t *RxLen, | ||||
|                                            uint32_t Timeout) | ||||
| { | ||||
|   uint8_t  *pdata8bits; | ||||
|   uint16_t *pdata16bits; | ||||
|   uint16_t uhMask; | ||||
|   uint32_t tickstart; | ||||
|  | ||||
|   /* Check that a Rx process is not already ongoing */ | ||||
|   if (huart->RxState == HAL_UART_STATE_READY) | ||||
|   { | ||||
|     if ((pData == NULL) || (Size == 0U)) | ||||
|     { | ||||
|       return  HAL_ERROR; | ||||
|     } | ||||
|  | ||||
|     __HAL_LOCK(huart); | ||||
|  | ||||
|     huart->ErrorCode = HAL_UART_ERROR_NONE; | ||||
|     huart->RxState = HAL_UART_STATE_BUSY_RX; | ||||
|     huart->ReceptionType = HAL_UART_RECEPTION_TOIDLE; | ||||
|  | ||||
|     /* Init tickstart for timeout management */ | ||||
|     tickstart = HAL_GetTick(); | ||||
|  | ||||
|     huart->RxXferSize  = Size; | ||||
|     huart->RxXferCount = Size; | ||||
|  | ||||
|     /* Computation of UART mask to apply to RDR register */ | ||||
|     UART_MASK_COMPUTATION(huart); | ||||
|     uhMask = huart->Mask; | ||||
|  | ||||
|     /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */ | ||||
|     if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) | ||||
|     { | ||||
|       pdata8bits  = NULL; | ||||
|       pdata16bits = (uint16_t *) pData; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       pdata8bits  = pData; | ||||
|       pdata16bits = NULL; | ||||
|     } | ||||
|  | ||||
|     __HAL_UNLOCK(huart); | ||||
|  | ||||
|     /* Initialize output number of received elements */ | ||||
|     *RxLen = 0U; | ||||
|  | ||||
|     /* as long as data have to be received */ | ||||
|     while (huart->RxXferCount > 0U) | ||||
|     { | ||||
|       /* Check if IDLE flag is set */ | ||||
|       if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE)) | ||||
|       { | ||||
|         /* Clear IDLE flag in ISR */ | ||||
|         __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_IDLEF); | ||||
|  | ||||
|         /* If Set, but no data ever received, clear flag without exiting loop */ | ||||
|         /* If Set, and data has already been received, this means Idle Event is valid : End reception */ | ||||
|         if (*RxLen > 0U) | ||||
|         { | ||||
|           huart->RxState = HAL_UART_STATE_READY; | ||||
|  | ||||
|           return HAL_OK; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       /* Check if RXNE flag is set */ | ||||
|       if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE)) | ||||
|       { | ||||
|         if (pdata8bits == NULL) | ||||
|         { | ||||
|           *pdata16bits = (uint16_t)(huart->Instance->RDR & uhMask); | ||||
|           pdata16bits++; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|           *pdata8bits = (uint8_t)(huart->Instance->RDR & (uint8_t)uhMask); | ||||
|           pdata8bits++; | ||||
|         } | ||||
|         /* Increment number of received elements */ | ||||
|         *RxLen += 1U; | ||||
|         huart->RxXferCount--; | ||||
|       } | ||||
|  | ||||
|       /* Check for the Timeout */ | ||||
|       if (Timeout != HAL_MAX_DELAY) | ||||
|       { | ||||
|         if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) | ||||
|         { | ||||
|           huart->RxState = HAL_UART_STATE_READY; | ||||
|  | ||||
|           return HAL_TIMEOUT; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     /* Set number of received elements in output parameter : RxLen */ | ||||
|     *RxLen = huart->RxXferSize - huart->RxXferCount; | ||||
|     /* At end of Rx process, restore huart->RxState to Ready */ | ||||
|     huart->RxState = HAL_UART_STATE_READY; | ||||
|  | ||||
|     return HAL_OK; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return HAL_BUSY; | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Receive an amount of data in interrupt mode till either the expected number of data | ||||
|   *        is received or an IDLE event occurs. | ||||
|   * @note  Reception is initiated by this function call. Further progress of reception is achieved thanks | ||||
|   *        to UART interrupts raised by RXNE and IDLE events. Callback is called at end of reception indicating | ||||
|   *        number of received data elements. | ||||
|   * @note  When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), | ||||
|   *        the received data is handled as a set of uint16_t. In this case, Size must indicate the number | ||||
|   *        of uint16_t available through pData. | ||||
|   * @param huart UART handle. | ||||
|   * @param pData Pointer to data buffer (uint8_t or uint16_t data elements). | ||||
|   * @param Size  Amount of data elements (uint8_t or uint16_t) to be received. | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) | ||||
| { | ||||
|   HAL_StatusTypeDef status; | ||||
|  | ||||
|   /* Check that a Rx process is not already ongoing */ | ||||
|   if (huart->RxState == HAL_UART_STATE_READY) | ||||
|   { | ||||
|     if ((pData == NULL) || (Size == 0U)) | ||||
|     { | ||||
|       return HAL_ERROR; | ||||
|     } | ||||
|  | ||||
|     __HAL_LOCK(huart); | ||||
|  | ||||
|     /* Set Reception type to reception till IDLE Event*/ | ||||
|     huart->ReceptionType = HAL_UART_RECEPTION_TOIDLE; | ||||
|  | ||||
|     status =  UART_Start_Receive_IT(huart, pData, Size); | ||||
|  | ||||
|     /* Check Rx process has been successfully started */ | ||||
|     if (status == HAL_OK) | ||||
|     { | ||||
|       if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) | ||||
|       { | ||||
|         __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_IDLEF); | ||||
|         ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         /* In case of errors already pending when reception is started, | ||||
|            Interrupts may have already been raised and lead to reception abortion. | ||||
|            (Overrun error for instance). | ||||
|            In such case Reception Type has been reset to HAL_UART_RECEPTION_STANDARD. */ | ||||
|         status = HAL_ERROR; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     return status; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return HAL_BUSY; | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @brief Receive an amount of data in DMA mode till either the expected number | ||||
|   *        of data is received or an IDLE event occurs. | ||||
|   * @note  Reception is initiated by this function call. Further progress of reception is achieved thanks | ||||
|   *        to DMA services, transferring automatically received data elements in user reception buffer and | ||||
|   *        calling registered callbacks at half/end of reception. UART IDLE events are also used to consider | ||||
|   *        reception phase as ended. In all cases, callback execution will indicate number of received data elements. | ||||
|   * @note  When the UART parity is enabled (PCE = 1), the received data contain | ||||
|   *        the parity bit (MSB position). | ||||
|   * @note  When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), | ||||
|   *        the received data is handled as a set of uint16_t. In this case, Size must indicate the number | ||||
|   *        of uint16_t available through pData. | ||||
|   * @param huart UART handle. | ||||
|   * @param pData Pointer to data buffer (uint8_t or uint16_t data elements). | ||||
|   * @param Size  Amount of data elements (uint8_t or uint16_t) to be received. | ||||
|   * @retval HAL status | ||||
|   */ | ||||
| HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) | ||||
| { | ||||
|   HAL_StatusTypeDef status; | ||||
|  | ||||
|   /* Check that a Rx process is not already ongoing */ | ||||
|   if (huart->RxState == HAL_UART_STATE_READY) | ||||
|   { | ||||
|     if ((pData == NULL) || (Size == 0U)) | ||||
|     { | ||||
|       return HAL_ERROR; | ||||
|     } | ||||
|  | ||||
|     __HAL_LOCK(huart); | ||||
|  | ||||
|     /* Set Reception type to reception till IDLE Event*/ | ||||
|     huart->ReceptionType = HAL_UART_RECEPTION_TOIDLE; | ||||
|  | ||||
|     status =  UART_Start_Receive_DMA(huart, pData, Size); | ||||
|  | ||||
|     /* Check Rx process has been successfully started */ | ||||
|     if (status == HAL_OK) | ||||
|     { | ||||
|       if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) | ||||
|       { | ||||
|         __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_IDLEF); | ||||
|         ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         /* In case of errors already pending when reception is started, | ||||
|            Interrupts may have already been raised and lead to reception abortion. | ||||
|            (Overrun error for instance). | ||||
|            In such case Reception Type has been reset to HAL_UART_RECEPTION_STANDARD. */ | ||||
|         status = HAL_ERROR; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     return status; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return HAL_BUSY; | ||||
|   } | ||||
| } | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** @addtogroup UARTEx_Private_Functions | ||||
|   * @{ | ||||
|   */ | ||||
| #if defined(USART_CR1_UESM) | ||||
|  | ||||
| /** | ||||
|   * @brief Initialize the UART wake-up from stop mode parameters when triggered by address detection. | ||||
|   * @param huart           UART handle. | ||||
|   * @param WakeUpSelection UART wake up from stop mode parameters. | ||||
|   * @retval None | ||||
|   */ | ||||
| static void UARTEx_Wakeup_AddressConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection) | ||||
| { | ||||
|   assert_param(IS_UART_ADDRESSLENGTH_DETECT(WakeUpSelection.AddressLength)); | ||||
|  | ||||
|   /* Set the USART address length */ | ||||
|   MODIFY_REG(huart->Instance->CR2, USART_CR2_ADDM7, WakeUpSelection.AddressLength); | ||||
|  | ||||
|   /* Set the USART address node */ | ||||
|   MODIFY_REG(huart->Instance->CR2, USART_CR2_ADD, ((uint32_t)WakeUpSelection.Address << UART_CR2_ADDRESS_LSB_POS)); | ||||
| } | ||||
| #endif /* USART_CR1_UESM */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| #endif /* HAL_UART_MODULE_ENABLED */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
| /** | ||||
|   * @} | ||||
|   */ | ||||
|  | ||||
							
								
								
									
										1091
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_fmc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1091
									
								
								Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_fmc.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user