Add MPU projects for STM32L475 Discovery Kit IoT Node
diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h
new file mode 100644
index 0000000..359e92f
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h
@@ -0,0 +1,3533 @@
+/**

+  ******************************************************************************

+  * @file    stm32_hal_legacy.h

+  * @author  MCD Application Team

+  * @brief   This file contains aliases definition for the STM32Cube HAL constants

+  *          macros and functions maintained for legacy purpose.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef STM32_HAL_LEGACY

+#define STM32_HAL_LEGACY

+

+#ifdef __cplusplus

+ extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+/* Exported types ------------------------------------------------------------*/

+/* Exported constants --------------------------------------------------------*/

+

+/** @defgroup HAL_AES_Aliased_Defines HAL CRYP Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define AES_FLAG_RDERR                  CRYP_FLAG_RDERR

+#define AES_FLAG_WRERR                  CRYP_FLAG_WRERR

+#define AES_CLEARFLAG_CCF               CRYP_CLEARFLAG_CCF

+#define AES_CLEARFLAG_RDERR             CRYP_CLEARFLAG_RDERR

+#define AES_CLEARFLAG_WRERR             CRYP_CLEARFLAG_WRERR

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_ADC_Aliased_Defines HAL ADC Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define ADC_RESOLUTION12b               ADC_RESOLUTION_12B

+#define ADC_RESOLUTION10b               ADC_RESOLUTION_10B

+#define ADC_RESOLUTION8b                ADC_RESOLUTION_8B

+#define ADC_RESOLUTION6b                ADC_RESOLUTION_6B

+#define OVR_DATA_OVERWRITTEN            ADC_OVR_DATA_OVERWRITTEN

+#define OVR_DATA_PRESERVED              ADC_OVR_DATA_PRESERVED

+#define EOC_SINGLE_CONV                 ADC_EOC_SINGLE_CONV

+#define EOC_SEQ_CONV                    ADC_EOC_SEQ_CONV

+#define EOC_SINGLE_SEQ_CONV             ADC_EOC_SINGLE_SEQ_CONV

+#define REGULAR_GROUP                   ADC_REGULAR_GROUP

+#define INJECTED_GROUP                  ADC_INJECTED_GROUP

+#define REGULAR_INJECTED_GROUP          ADC_REGULAR_INJECTED_GROUP

+#define AWD_EVENT                       ADC_AWD_EVENT

+#define AWD1_EVENT                      ADC_AWD1_EVENT

+#define AWD2_EVENT                      ADC_AWD2_EVENT

+#define AWD3_EVENT                      ADC_AWD3_EVENT

+#define OVR_EVENT                       ADC_OVR_EVENT

+#define JQOVF_EVENT                     ADC_JQOVF_EVENT

+#define ALL_CHANNELS                    ADC_ALL_CHANNELS

+#define REGULAR_CHANNELS                ADC_REGULAR_CHANNELS

+#define INJECTED_CHANNELS               ADC_INJECTED_CHANNELS

+#define SYSCFG_FLAG_SENSOR_ADC          ADC_FLAG_SENSOR

+#define SYSCFG_FLAG_VREF_ADC            ADC_FLAG_VREFINT

+#define ADC_CLOCKPRESCALER_PCLK_DIV1    ADC_CLOCK_SYNC_PCLK_DIV1

+#define ADC_CLOCKPRESCALER_PCLK_DIV2    ADC_CLOCK_SYNC_PCLK_DIV2

+#define ADC_CLOCKPRESCALER_PCLK_DIV4    ADC_CLOCK_SYNC_PCLK_DIV4

+#define ADC_CLOCKPRESCALER_PCLK_DIV6    ADC_CLOCK_SYNC_PCLK_DIV6

+#define ADC_CLOCKPRESCALER_PCLK_DIV8    ADC_CLOCK_SYNC_PCLK_DIV8

+#define ADC_EXTERNALTRIG0_T6_TRGO       ADC_EXTERNALTRIGCONV_T6_TRGO

+#define ADC_EXTERNALTRIG1_T21_CC2       ADC_EXTERNALTRIGCONV_T21_CC2

+#define ADC_EXTERNALTRIG2_T2_TRGO       ADC_EXTERNALTRIGCONV_T2_TRGO

+#define ADC_EXTERNALTRIG3_T2_CC4        ADC_EXTERNALTRIGCONV_T2_CC4

+#define ADC_EXTERNALTRIG4_T22_TRGO      ADC_EXTERNALTRIGCONV_T22_TRGO

+#define ADC_EXTERNALTRIG7_EXT_IT11      ADC_EXTERNALTRIGCONV_EXT_IT11

+#define ADC_CLOCK_ASYNC                 ADC_CLOCK_ASYNC_DIV1

+#define ADC_EXTERNALTRIG_EDGE_NONE      ADC_EXTERNALTRIGCONVEDGE_NONE

+#define ADC_EXTERNALTRIG_EDGE_RISING    ADC_EXTERNALTRIGCONVEDGE_RISING

+#define ADC_EXTERNALTRIG_EDGE_FALLING   ADC_EXTERNALTRIGCONVEDGE_FALLING

+#define ADC_EXTERNALTRIG_EDGE_RISINGFALLING ADC_EXTERNALTRIGCONVEDGE_RISINGFALLING

+#define ADC_SAMPLETIME_2CYCLE_5         ADC_SAMPLETIME_2CYCLES_5

+

+#define HAL_ADC_STATE_BUSY_REG          HAL_ADC_STATE_REG_BUSY

+#define HAL_ADC_STATE_BUSY_INJ          HAL_ADC_STATE_INJ_BUSY

+#define HAL_ADC_STATE_EOC_REG           HAL_ADC_STATE_REG_EOC

+#define HAL_ADC_STATE_EOC_INJ           HAL_ADC_STATE_INJ_EOC

+#define HAL_ADC_STATE_ERROR             HAL_ADC_STATE_ERROR_INTERNAL

+#define HAL_ADC_STATE_BUSY              HAL_ADC_STATE_BUSY_INTERNAL

+#define HAL_ADC_STATE_AWD               HAL_ADC_STATE_AWD1

+

+#if defined(STM32H7)

+#define ADC_CHANNEL_VBAT_DIV4           ADC_CHANNEL_VBAT

+#endif /* STM32H7 */

+/**

+  * @}

+  */

+

+/** @defgroup HAL_CEC_Aliased_Defines HAL CEC Aliased Defines maintained for legacy purpose

+  * @{

+  */

+

+#define __HAL_CEC_GET_IT __HAL_CEC_GET_FLAG

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_COMP_Aliased_Defines HAL COMP Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define COMP_WINDOWMODE_DISABLED       COMP_WINDOWMODE_DISABLE

+#define COMP_WINDOWMODE_ENABLED        COMP_WINDOWMODE_ENABLE

+#define COMP_EXTI_LINE_COMP1_EVENT     COMP_EXTI_LINE_COMP1

+#define COMP_EXTI_LINE_COMP2_EVENT     COMP_EXTI_LINE_COMP2

+#define COMP_EXTI_LINE_COMP3_EVENT     COMP_EXTI_LINE_COMP3

+#define COMP_EXTI_LINE_COMP4_EVENT     COMP_EXTI_LINE_COMP4

+#define COMP_EXTI_LINE_COMP5_EVENT     COMP_EXTI_LINE_COMP5

+#define COMP_EXTI_LINE_COMP6_EVENT     COMP_EXTI_LINE_COMP6

+#define COMP_EXTI_LINE_COMP7_EVENT     COMP_EXTI_LINE_COMP7

+#if defined(STM32L0)

+#define COMP_LPTIMCONNECTION_ENABLED   ((uint32_t)0x00000003U)    /*!< COMPX output generic naming: connected to LPTIM input 1 for COMP1, LPTIM input 2 for COMP2 */

+#endif

+#define COMP_OUTPUT_COMP6TIM2OCREFCLR  COMP_OUTPUT_COMP6_TIM2OCREFCLR

+#if defined(STM32F373xC) || defined(STM32F378xx)

+#define COMP_OUTPUT_TIM3IC1            COMP_OUTPUT_COMP1_TIM3IC1

+#define COMP_OUTPUT_TIM3OCREFCLR       COMP_OUTPUT_COMP1_TIM3OCREFCLR

+#endif /* STM32F373xC || STM32F378xx */

+

+#if defined(STM32L0) || defined(STM32L4)

+#define COMP_WINDOWMODE_ENABLE         COMP_WINDOWMODE_COMP1_INPUT_PLUS_COMMON

+

+#define COMP_NONINVERTINGINPUT_IO1      COMP_INPUT_PLUS_IO1

+#define COMP_NONINVERTINGINPUT_IO2      COMP_INPUT_PLUS_IO2

+#define COMP_NONINVERTINGINPUT_IO3      COMP_INPUT_PLUS_IO3

+#define COMP_NONINVERTINGINPUT_IO4      COMP_INPUT_PLUS_IO4

+#define COMP_NONINVERTINGINPUT_IO5      COMP_INPUT_PLUS_IO5

+#define COMP_NONINVERTINGINPUT_IO6      COMP_INPUT_PLUS_IO6

+

+#define COMP_INVERTINGINPUT_1_4VREFINT  COMP_INPUT_MINUS_1_4VREFINT

+#define COMP_INVERTINGINPUT_1_2VREFINT  COMP_INPUT_MINUS_1_2VREFINT

+#define COMP_INVERTINGINPUT_3_4VREFINT  COMP_INPUT_MINUS_3_4VREFINT

+#define COMP_INVERTINGINPUT_VREFINT     COMP_INPUT_MINUS_VREFINT

+#define COMP_INVERTINGINPUT_DAC1_CH1    COMP_INPUT_MINUS_DAC1_CH1

+#define COMP_INVERTINGINPUT_DAC1_CH2    COMP_INPUT_MINUS_DAC1_CH2

+#define COMP_INVERTINGINPUT_DAC1        COMP_INPUT_MINUS_DAC1_CH1

+#define COMP_INVERTINGINPUT_DAC2        COMP_INPUT_MINUS_DAC1_CH2

+#define COMP_INVERTINGINPUT_IO1         COMP_INPUT_MINUS_IO1

+#if defined(STM32L0)

+/* Issue fixed on STM32L0 COMP driver: only 2 dedicated IO (IO1 and IO2),     */

+/* IO2 was wrongly assigned to IO shared with DAC and IO3 was corresponding   */

+/* to the second dedicated IO (only for COMP2).                               */

+#define COMP_INVERTINGINPUT_IO2         COMP_INPUT_MINUS_DAC1_CH2

+#define COMP_INVERTINGINPUT_IO3         COMP_INPUT_MINUS_IO2

+#else

+#define COMP_INVERTINGINPUT_IO2         COMP_INPUT_MINUS_IO2

+#define COMP_INVERTINGINPUT_IO3         COMP_INPUT_MINUS_IO3

+#endif

+#define COMP_INVERTINGINPUT_IO4         COMP_INPUT_MINUS_IO4

+#define COMP_INVERTINGINPUT_IO5         COMP_INPUT_MINUS_IO5

+

+#define COMP_OUTPUTLEVEL_LOW            COMP_OUTPUT_LEVEL_LOW

+#define COMP_OUTPUTLEVEL_HIGH           COMP_OUTPUT_LEVEL_HIGH

+

+/* Note: Literal "COMP_FLAG_LOCK" kept for legacy purpose.                    */

+/*       To check COMP lock state, use macro "__HAL_COMP_IS_LOCKED()".        */

+#if defined(COMP_CSR_LOCK)

+#define COMP_FLAG_LOCK                 COMP_CSR_LOCK

+#elif defined(COMP_CSR_COMP1LOCK)

+#define COMP_FLAG_LOCK                 COMP_CSR_COMP1LOCK

+#elif defined(COMP_CSR_COMPxLOCK)

+#define COMP_FLAG_LOCK                 COMP_CSR_COMPxLOCK

+#endif

+

+#if defined(STM32L4)

+#define COMP_BLANKINGSRCE_TIM1OC5        COMP_BLANKINGSRC_TIM1_OC5_COMP1

+#define COMP_BLANKINGSRCE_TIM2OC3        COMP_BLANKINGSRC_TIM2_OC3_COMP1

+#define COMP_BLANKINGSRCE_TIM3OC3        COMP_BLANKINGSRC_TIM3_OC3_COMP1

+#define COMP_BLANKINGSRCE_TIM3OC4        COMP_BLANKINGSRC_TIM3_OC4_COMP2

+#define COMP_BLANKINGSRCE_TIM8OC5        COMP_BLANKINGSRC_TIM8_OC5_COMP2

+#define COMP_BLANKINGSRCE_TIM15OC1       COMP_BLANKINGSRC_TIM15_OC1_COMP2

+#define COMP_BLANKINGSRCE_NONE           COMP_BLANKINGSRC_NONE

+#endif

+

+#if defined(STM32L0)

+#define COMP_MODE_HIGHSPEED              COMP_POWERMODE_MEDIUMSPEED

+#define COMP_MODE_LOWSPEED               COMP_POWERMODE_ULTRALOWPOWER

+#else

+#define COMP_MODE_HIGHSPEED              COMP_POWERMODE_HIGHSPEED

+#define COMP_MODE_MEDIUMSPEED            COMP_POWERMODE_MEDIUMSPEED

+#define COMP_MODE_LOWPOWER               COMP_POWERMODE_LOWPOWER

+#define COMP_MODE_ULTRALOWPOWER          COMP_POWERMODE_ULTRALOWPOWER

+#endif

+

+#endif

+/**

+  * @}

+  */

+

+/** @defgroup HAL_CORTEX_Aliased_Defines HAL CORTEX Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define __HAL_CORTEX_SYSTICKCLK_CONFIG HAL_SYSTICK_CLKSourceConfig

+/**

+  * @}

+  */

+

+/** @defgroup HAL_CRC_Aliased_Defines HAL CRC Aliased Defines maintained for legacy purpose

+  * @{

+  */

+

+#define CRC_OUTPUTDATA_INVERSION_DISABLED    CRC_OUTPUTDATA_INVERSION_DISABLE

+#define CRC_OUTPUTDATA_INVERSION_ENABLED     CRC_OUTPUTDATA_INVERSION_ENABLE

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_DAC_Aliased_Defines HAL DAC Aliased Defines maintained for legacy purpose

+  * @{

+  */

+

+#define DAC1_CHANNEL_1                                  DAC_CHANNEL_1

+#define DAC1_CHANNEL_2                                  DAC_CHANNEL_2

+#define DAC2_CHANNEL_1                                  DAC_CHANNEL_1

+#define DAC_WAVE_NONE                                   0x00000000U

+#define DAC_WAVE_NOISE                                  DAC_CR_WAVE1_0

+#define DAC_WAVE_TRIANGLE                               DAC_CR_WAVE1_1

+#define DAC_WAVEGENERATION_NONE                         DAC_WAVE_NONE

+#define DAC_WAVEGENERATION_NOISE                        DAC_WAVE_NOISE

+#define DAC_WAVEGENERATION_TRIANGLE                     DAC_WAVE_TRIANGLE

+

+#if defined(STM32G4)

+#define DAC_CHIPCONNECT_DISABLE       (DAC_CHIPCONNECT_EXTERNAL | DAC_CHIPCONNECT_BOTH)

+#define DAC_CHIPCONNECT_ENABLE        (DAC_CHIPCONNECT_INTERNAL | DAC_CHIPCONNECT_BOTH)

+#endif

+

+#if defined(STM32L1) || defined(STM32L4) || defined(STM32G0) || defined(STM32L5)

+#define HAL_DAC_MSP_INIT_CB_ID       HAL_DAC_MSPINIT_CB_ID

+#define HAL_DAC_MSP_DEINIT_CB_ID     HAL_DAC_MSPDEINIT_CB_ID

+#endif

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_DMA_Aliased_Defines HAL DMA Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define HAL_REMAPDMA_ADC_DMA_CH2                DMA_REMAP_ADC_DMA_CH2

+#define HAL_REMAPDMA_USART1_TX_DMA_CH4          DMA_REMAP_USART1_TX_DMA_CH4

+#define HAL_REMAPDMA_USART1_RX_DMA_CH5          DMA_REMAP_USART1_RX_DMA_CH5

+#define HAL_REMAPDMA_TIM16_DMA_CH4              DMA_REMAP_TIM16_DMA_CH4

+#define HAL_REMAPDMA_TIM17_DMA_CH2              DMA_REMAP_TIM17_DMA_CH2

+#define HAL_REMAPDMA_USART3_DMA_CH32            DMA_REMAP_USART3_DMA_CH32

+#define HAL_REMAPDMA_TIM16_DMA_CH6              DMA_REMAP_TIM16_DMA_CH6

+#define HAL_REMAPDMA_TIM17_DMA_CH7              DMA_REMAP_TIM17_DMA_CH7

+#define HAL_REMAPDMA_SPI2_DMA_CH67              DMA_REMAP_SPI2_DMA_CH67

+#define HAL_REMAPDMA_USART2_DMA_CH67            DMA_REMAP_USART2_DMA_CH67

+#define HAL_REMAPDMA_I2C1_DMA_CH76              DMA_REMAP_I2C1_DMA_CH76

+#define HAL_REMAPDMA_TIM1_DMA_CH6               DMA_REMAP_TIM1_DMA_CH6

+#define HAL_REMAPDMA_TIM2_DMA_CH7               DMA_REMAP_TIM2_DMA_CH7

+#define HAL_REMAPDMA_TIM3_DMA_CH6               DMA_REMAP_TIM3_DMA_CH6

+

+#define IS_HAL_REMAPDMA                          IS_DMA_REMAP

+#define __HAL_REMAPDMA_CHANNEL_ENABLE            __HAL_DMA_REMAP_CHANNEL_ENABLE

+#define __HAL_REMAPDMA_CHANNEL_DISABLE           __HAL_DMA_REMAP_CHANNEL_DISABLE

+

+#if defined(STM32L4)

+

+#define HAL_DMAMUX1_REQUEST_GEN_EXTI0            HAL_DMAMUX1_REQ_GEN_EXTI0

+#define HAL_DMAMUX1_REQUEST_GEN_EXTI1            HAL_DMAMUX1_REQ_GEN_EXTI1

+#define HAL_DMAMUX1_REQUEST_GEN_EXTI2            HAL_DMAMUX1_REQ_GEN_EXTI2

+#define HAL_DMAMUX1_REQUEST_GEN_EXTI3            HAL_DMAMUX1_REQ_GEN_EXTI3

+#define HAL_DMAMUX1_REQUEST_GEN_EXTI4            HAL_DMAMUX1_REQ_GEN_EXTI4

+#define HAL_DMAMUX1_REQUEST_GEN_EXTI5            HAL_DMAMUX1_REQ_GEN_EXTI5

+#define HAL_DMAMUX1_REQUEST_GEN_EXTI6            HAL_DMAMUX1_REQ_GEN_EXTI6

+#define HAL_DMAMUX1_REQUEST_GEN_EXTI7            HAL_DMAMUX1_REQ_GEN_EXTI7

+#define HAL_DMAMUX1_REQUEST_GEN_EXTI8            HAL_DMAMUX1_REQ_GEN_EXTI8

+#define HAL_DMAMUX1_REQUEST_GEN_EXTI9            HAL_DMAMUX1_REQ_GEN_EXTI9

+#define HAL_DMAMUX1_REQUEST_GEN_EXTI10           HAL_DMAMUX1_REQ_GEN_EXTI10

+#define HAL_DMAMUX1_REQUEST_GEN_EXTI11           HAL_DMAMUX1_REQ_GEN_EXTI11

+#define HAL_DMAMUX1_REQUEST_GEN_EXTI12           HAL_DMAMUX1_REQ_GEN_EXTI12

+#define HAL_DMAMUX1_REQUEST_GEN_EXTI13           HAL_DMAMUX1_REQ_GEN_EXTI13

+#define HAL_DMAMUX1_REQUEST_GEN_EXTI14           HAL_DMAMUX1_REQ_GEN_EXTI14

+#define HAL_DMAMUX1_REQUEST_GEN_EXTI15           HAL_DMAMUX1_REQ_GEN_EXTI15

+#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH0_EVT  HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH0_EVT

+#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH1_EVT  HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH1_EVT

+#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH2_EVT  HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH2_EVT

+#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH3_EVT  HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH3_EVT

+#define HAL_DMAMUX1_REQUEST_GEN_LPTIM1_OUT       HAL_DMAMUX1_REQ_GEN_LPTIM1_OUT

+#define HAL_DMAMUX1_REQUEST_GEN_LPTIM2_OUT       HAL_DMAMUX1_REQ_GEN_LPTIM2_OUT

+#define HAL_DMAMUX1_REQUEST_GEN_DSI_TE           HAL_DMAMUX1_REQ_GEN_DSI_TE

+#define HAL_DMAMUX1_REQUEST_GEN_DSI_EOT          HAL_DMAMUX1_REQ_GEN_DSI_EOT

+#define HAL_DMAMUX1_REQUEST_GEN_DMA2D_EOT        HAL_DMAMUX1_REQ_GEN_DMA2D_EOT

+#define HAL_DMAMUX1_REQUEST_GEN_LTDC_IT          HAL_DMAMUX1_REQ_GEN_LTDC_IT

+

+#define HAL_DMAMUX_REQUEST_GEN_NO_EVENT          HAL_DMAMUX_REQ_GEN_NO_EVENT

+#define HAL_DMAMUX_REQUEST_GEN_RISING            HAL_DMAMUX_REQ_GEN_RISING

+#define HAL_DMAMUX_REQUEST_GEN_FALLING           HAL_DMAMUX_REQ_GEN_FALLING

+#define HAL_DMAMUX_REQUEST_GEN_RISING_FALLING    HAL_DMAMUX_REQ_GEN_RISING_FALLING

+

+#endif /* STM32L4 */

+

+#if defined(STM32H7)

+

+#define DMA_REQUEST_DAC1 DMA_REQUEST_DAC1_CH1

+#define DMA_REQUEST_DAC2 DMA_REQUEST_DAC1_CH2

+

+#define BDMA_REQUEST_LP_UART1_RX BDMA_REQUEST_LPUART1_RX

+#define BDMA_REQUEST_LP_UART1_TX BDMA_REQUEST_LPUART1_TX

+

+#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH0_EVT    HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH0_EVT

+#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH1_EVT    HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH1_EVT

+#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH2_EVT    HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH2_EVT

+#define HAL_DMAMUX1_REQUEST_GEN_LPTIM1_OUT         HAL_DMAMUX1_REQ_GEN_LPTIM1_OUT

+#define HAL_DMAMUX1_REQUEST_GEN_LPTIM2_OUT         HAL_DMAMUX1_REQ_GEN_LPTIM2_OUT

+#define HAL_DMAMUX1_REQUEST_GEN_LPTIM3_OUT         HAL_DMAMUX1_REQ_GEN_LPTIM3_OUT

+#define HAL_DMAMUX1_REQUEST_GEN_EXTI0              HAL_DMAMUX1_REQ_GEN_EXTI0

+#define HAL_DMAMUX1_REQUEST_GEN_TIM12_TRGO         HAL_DMAMUX1_REQ_GEN_TIM12_TRGO

+

+#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH0_EVT    HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH0_EVT

+#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH1_EVT    HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH1_EVT

+#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH2_EVT    HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH2_EVT

+#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH3_EVT    HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH3_EVT

+#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH4_EVT    HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH4_EVT

+#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH5_EVT    HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH5_EVT

+#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH6_EVT    HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH6_EVT

+#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_RX_WKUP    HAL_DMAMUX2_REQ_GEN_LPUART1_RX_WKUP

+#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_TX_WKUP    HAL_DMAMUX2_REQ_GEN_LPUART1_TX_WKUP

+#define HAL_DMAMUX2_REQUEST_GEN_LPTIM2_WKUP        HAL_DMAMUX2_REQ_GEN_LPTIM2_WKUP

+#define HAL_DMAMUX2_REQUEST_GEN_LPTIM2_OUT         HAL_DMAMUX2_REQ_GEN_LPTIM2_OUT

+#define HAL_DMAMUX2_REQUEST_GEN_LPTIM3_WKUP        HAL_DMAMUX2_REQ_GEN_LPTIM3_WKUP

+#define HAL_DMAMUX2_REQUEST_GEN_LPTIM3_OUT         HAL_DMAMUX2_REQ_GEN_LPTIM3_OUT

+#define HAL_DMAMUX2_REQUEST_GEN_LPTIM4_WKUP        HAL_DMAMUX2_REQ_GEN_LPTIM4_WKUP

+#define HAL_DMAMUX2_REQUEST_GEN_LPTIM5_WKUP        HAL_DMAMUX2_REQ_GEN_LPTIM5_WKUP

+#define HAL_DMAMUX2_REQUEST_GEN_I2C4_WKUP          HAL_DMAMUX2_REQ_GEN_I2C4_WKUP

+#define HAL_DMAMUX2_REQUEST_GEN_SPI6_WKUP          HAL_DMAMUX2_REQ_GEN_SPI6_WKUP

+#define HAL_DMAMUX2_REQUEST_GEN_COMP1_OUT          HAL_DMAMUX2_REQ_GEN_COMP1_OUT

+#define HAL_DMAMUX2_REQUEST_GEN_COMP2_OUT          HAL_DMAMUX2_REQ_GEN_COMP2_OUT

+#define HAL_DMAMUX2_REQUEST_GEN_RTC_WKUP           HAL_DMAMUX2_REQ_GEN_RTC_WKUP

+#define HAL_DMAMUX2_REQUEST_GEN_EXTI0              HAL_DMAMUX2_REQ_GEN_EXTI0

+#define HAL_DMAMUX2_REQUEST_GEN_EXTI2              HAL_DMAMUX2_REQ_GEN_EXTI2

+#define HAL_DMAMUX2_REQUEST_GEN_I2C4_IT_EVT        HAL_DMAMUX2_REQ_GEN_I2C4_IT_EVT

+#define HAL_DMAMUX2_REQUEST_GEN_SPI6_IT            HAL_DMAMUX2_REQ_GEN_SPI6_IT

+#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_TX_IT      HAL_DMAMUX2_REQ_GEN_LPUART1_TX_IT

+#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_RX_IT      HAL_DMAMUX2_REQ_GEN_LPUART1_RX_IT

+#define HAL_DMAMUX2_REQUEST_GEN_ADC3_IT            HAL_DMAMUX2_REQ_GEN_ADC3_IT

+#define HAL_DMAMUX2_REQUEST_GEN_ADC3_AWD1_OUT      HAL_DMAMUX2_REQ_GEN_ADC3_AWD1_OUT

+#define HAL_DMAMUX2_REQUEST_GEN_BDMA_CH0_IT        HAL_DMAMUX2_REQ_GEN_BDMA_CH0_IT

+#define HAL_DMAMUX2_REQUEST_GEN_BDMA_CH1_IT        HAL_DMAMUX2_REQ_GEN_BDMA_CH1_IT

+

+#define HAL_DMAMUX_REQUEST_GEN_NO_EVENT            HAL_DMAMUX_REQ_GEN_NO_EVENT

+#define HAL_DMAMUX_REQUEST_GEN_RISING              HAL_DMAMUX_REQ_GEN_RISING

+#define HAL_DMAMUX_REQUEST_GEN_FALLING             HAL_DMAMUX_REQ_GEN_FALLING

+#define HAL_DMAMUX_REQUEST_GEN_RISING_FALLING      HAL_DMAMUX_REQ_GEN_RISING_FALLING

+

+#define DFSDM_FILTER_EXT_TRIG_LPTIM1               DFSDM_FILTER_EXT_TRIG_LPTIM1_OUT

+#define DFSDM_FILTER_EXT_TRIG_LPTIM2               DFSDM_FILTER_EXT_TRIG_LPTIM2_OUT

+#define DFSDM_FILTER_EXT_TRIG_LPTIM3               DFSDM_FILTER_EXT_TRIG_LPTIM3_OUT

+

+#endif /* STM32H7 */

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_FLASH_Aliased_Defines HAL FLASH Aliased Defines maintained for legacy purpose

+  * @{

+  */

+

+#define TYPEPROGRAM_BYTE              FLASH_TYPEPROGRAM_BYTE

+#define TYPEPROGRAM_HALFWORD          FLASH_TYPEPROGRAM_HALFWORD

+#define TYPEPROGRAM_WORD              FLASH_TYPEPROGRAM_WORD

+#define TYPEPROGRAM_DOUBLEWORD        FLASH_TYPEPROGRAM_DOUBLEWORD

+#define TYPEERASE_SECTORS             FLASH_TYPEERASE_SECTORS

+#define TYPEERASE_PAGES               FLASH_TYPEERASE_PAGES

+#define TYPEERASE_PAGEERASE           FLASH_TYPEERASE_PAGES

+#define TYPEERASE_MASSERASE           FLASH_TYPEERASE_MASSERASE

+#define WRPSTATE_DISABLE              OB_WRPSTATE_DISABLE

+#define WRPSTATE_ENABLE               OB_WRPSTATE_ENABLE

+#define HAL_FLASH_TIMEOUT_VALUE       FLASH_TIMEOUT_VALUE

+#define OBEX_PCROP                    OPTIONBYTE_PCROP

+#define OBEX_BOOTCONFIG               OPTIONBYTE_BOOTCONFIG

+#define PCROPSTATE_DISABLE            OB_PCROP_STATE_DISABLE

+#define PCROPSTATE_ENABLE             OB_PCROP_STATE_ENABLE

+#define TYPEERASEDATA_BYTE            FLASH_TYPEERASEDATA_BYTE

+#define TYPEERASEDATA_HALFWORD        FLASH_TYPEERASEDATA_HALFWORD

+#define TYPEERASEDATA_WORD            FLASH_TYPEERASEDATA_WORD

+#define TYPEPROGRAMDATA_BYTE          FLASH_TYPEPROGRAMDATA_BYTE

+#define TYPEPROGRAMDATA_HALFWORD      FLASH_TYPEPROGRAMDATA_HALFWORD

+#define TYPEPROGRAMDATA_WORD          FLASH_TYPEPROGRAMDATA_WORD

+#define TYPEPROGRAMDATA_FASTBYTE      FLASH_TYPEPROGRAMDATA_FASTBYTE

+#define TYPEPROGRAMDATA_FASTHALFWORD  FLASH_TYPEPROGRAMDATA_FASTHALFWORD

+#define TYPEPROGRAMDATA_FASTWORD      FLASH_TYPEPROGRAMDATA_FASTWORD

+#define PAGESIZE                      FLASH_PAGE_SIZE

+#define TYPEPROGRAM_FASTBYTE          FLASH_TYPEPROGRAM_BYTE

+#define TYPEPROGRAM_FASTHALFWORD      FLASH_TYPEPROGRAM_HALFWORD

+#define TYPEPROGRAM_FASTWORD          FLASH_TYPEPROGRAM_WORD

+#define VOLTAGE_RANGE_1               FLASH_VOLTAGE_RANGE_1

+#define VOLTAGE_RANGE_2               FLASH_VOLTAGE_RANGE_2

+#define VOLTAGE_RANGE_3               FLASH_VOLTAGE_RANGE_3

+#define VOLTAGE_RANGE_4               FLASH_VOLTAGE_RANGE_4

+#define TYPEPROGRAM_FAST              FLASH_TYPEPROGRAM_FAST

+#define TYPEPROGRAM_FAST_AND_LAST     FLASH_TYPEPROGRAM_FAST_AND_LAST

+#define WRPAREA_BANK1_AREAA           OB_WRPAREA_BANK1_AREAA

+#define WRPAREA_BANK1_AREAB           OB_WRPAREA_BANK1_AREAB

+#define WRPAREA_BANK2_AREAA           OB_WRPAREA_BANK2_AREAA

+#define WRPAREA_BANK2_AREAB           OB_WRPAREA_BANK2_AREAB

+#define IWDG_STDBY_FREEZE             OB_IWDG_STDBY_FREEZE

+#define IWDG_STDBY_ACTIVE             OB_IWDG_STDBY_RUN

+#define IWDG_STOP_FREEZE              OB_IWDG_STOP_FREEZE

+#define IWDG_STOP_ACTIVE              OB_IWDG_STOP_RUN

+#define FLASH_ERROR_NONE              HAL_FLASH_ERROR_NONE

+#define FLASH_ERROR_RD                HAL_FLASH_ERROR_RD

+#define FLASH_ERROR_PG                HAL_FLASH_ERROR_PROG

+#define FLASH_ERROR_PGP               HAL_FLASH_ERROR_PGS

+#define FLASH_ERROR_WRP               HAL_FLASH_ERROR_WRP

+#define FLASH_ERROR_OPTV              HAL_FLASH_ERROR_OPTV

+#define FLASH_ERROR_OPTVUSR           HAL_FLASH_ERROR_OPTVUSR

+#define FLASH_ERROR_PROG              HAL_FLASH_ERROR_PROG

+#define FLASH_ERROR_OP                HAL_FLASH_ERROR_OPERATION

+#define FLASH_ERROR_PGA               HAL_FLASH_ERROR_PGA

+#define FLASH_ERROR_SIZE              HAL_FLASH_ERROR_SIZE

+#define FLASH_ERROR_SIZ               HAL_FLASH_ERROR_SIZE

+#define FLASH_ERROR_PGS               HAL_FLASH_ERROR_PGS

+#define FLASH_ERROR_MIS               HAL_FLASH_ERROR_MIS

+#define FLASH_ERROR_FAST              HAL_FLASH_ERROR_FAST

+#define FLASH_ERROR_FWWERR            HAL_FLASH_ERROR_FWWERR

+#define FLASH_ERROR_NOTZERO           HAL_FLASH_ERROR_NOTZERO

+#define FLASH_ERROR_OPERATION         HAL_FLASH_ERROR_OPERATION

+#define FLASH_ERROR_ERS               HAL_FLASH_ERROR_ERS

+#define OB_WDG_SW                     OB_IWDG_SW

+#define OB_WDG_HW                     OB_IWDG_HW

+#define OB_SDADC12_VDD_MONITOR_SET    OB_SDACD_VDD_MONITOR_SET

+#define OB_SDADC12_VDD_MONITOR_RESET  OB_SDACD_VDD_MONITOR_RESET

+#define OB_RAM_PARITY_CHECK_SET       OB_SRAM_PARITY_SET

+#define OB_RAM_PARITY_CHECK_RESET     OB_SRAM_PARITY_RESET

+#define IS_OB_SDADC12_VDD_MONITOR     IS_OB_SDACD_VDD_MONITOR

+#define OB_RDP_LEVEL0                 OB_RDP_LEVEL_0

+#define OB_RDP_LEVEL1                 OB_RDP_LEVEL_1

+#define OB_RDP_LEVEL2                 OB_RDP_LEVEL_2

+#if defined(STM32G0)

+#define OB_BOOT_LOCK_DISABLE          OB_BOOT_ENTRY_FORCED_NONE

+#define OB_BOOT_LOCK_ENABLE           OB_BOOT_ENTRY_FORCED_FLASH

+#else

+#define OB_BOOT_ENTRY_FORCED_NONE     OB_BOOT_LOCK_DISABLE

+#define OB_BOOT_ENTRY_FORCED_FLASH    OB_BOOT_LOCK_ENABLE

+#endif

+#if defined(STM32H7)

+#define FLASH_FLAG_SNECCE_BANK1RR FLASH_FLAG_SNECCERR_BANK1

+#define FLASH_FLAG_DBECCE_BANK1RR FLASH_FLAG_DBECCERR_BANK1

+#define FLASH_FLAG_STRBER_BANK1R  FLASH_FLAG_STRBERR_BANK1

+#define FLASH_FLAG_SNECCE_BANK2RR FLASH_FLAG_SNECCERR_BANK2

+#define FLASH_FLAG_DBECCE_BANK2RR FLASH_FLAG_DBECCERR_BANK2

+#define FLASH_FLAG_STRBER_BANK2R  FLASH_FLAG_STRBERR_BANK2

+#endif

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_JPEG_Aliased_Macros HAL JPEG Aliased Macros maintained for legacy purpose

+  * @{

+  */

+

+#if defined(STM32H7)

+#define __HAL_RCC_JPEG_CLK_ENABLE               __HAL_RCC_JPGDECEN_CLK_ENABLE

+#define __HAL_RCC_JPEG_CLK_DISABLE              __HAL_RCC_JPGDECEN_CLK_DISABLE

+#define __HAL_RCC_JPEG_FORCE_RESET              __HAL_RCC_JPGDECRST_FORCE_RESET

+#define __HAL_RCC_JPEG_RELEASE_RESET            __HAL_RCC_JPGDECRST_RELEASE_RESET

+#define __HAL_RCC_JPEG_CLK_SLEEP_ENABLE         __HAL_RCC_JPGDEC_CLK_SLEEP_ENABLE

+#define __HAL_RCC_JPEG_CLK_SLEEP_DISABLE        __HAL_RCC_JPGDEC_CLK_SLEEP_DISABLE

+#endif /* STM32H7 */

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_SYSCFG_Aliased_Defines HAL SYSCFG Aliased Defines maintained for legacy purpose

+  * @{

+  */

+

+#define HAL_SYSCFG_FASTMODEPLUS_I2C_PA9    I2C_FASTMODEPLUS_PA9

+#define HAL_SYSCFG_FASTMODEPLUS_I2C_PA10   I2C_FASTMODEPLUS_PA10

+#define HAL_SYSCFG_FASTMODEPLUS_I2C_PB6    I2C_FASTMODEPLUS_PB6

+#define HAL_SYSCFG_FASTMODEPLUS_I2C_PB7    I2C_FASTMODEPLUS_PB7

+#define HAL_SYSCFG_FASTMODEPLUS_I2C_PB8    I2C_FASTMODEPLUS_PB8

+#define HAL_SYSCFG_FASTMODEPLUS_I2C_PB9    I2C_FASTMODEPLUS_PB9

+#define HAL_SYSCFG_FASTMODEPLUS_I2C1       I2C_FASTMODEPLUS_I2C1

+#define HAL_SYSCFG_FASTMODEPLUS_I2C2       I2C_FASTMODEPLUS_I2C2

+#define HAL_SYSCFG_FASTMODEPLUS_I2C3       I2C_FASTMODEPLUS_I2C3

+#if defined(STM32G4)

+

+#define HAL_SYSCFG_EnableIOAnalogSwitchBooster    HAL_SYSCFG_EnableIOSwitchBooster

+#define HAL_SYSCFG_DisableIOAnalogSwitchBooster   HAL_SYSCFG_DisableIOSwitchBooster

+#define HAL_SYSCFG_EnableIOAnalogSwitchVDD        HAL_SYSCFG_EnableIOSwitchVDD

+#define HAL_SYSCFG_DisableIOAnalogSwitchVDD       HAL_SYSCFG_DisableIOSwitchVDD

+#endif /* STM32G4 */

+/**

+  * @}

+  */

+

+

+/** @defgroup LL_FMC_Aliased_Defines LL FMC Aliased Defines maintained for compatibility purpose

+  * @{

+  */

+#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) || defined(STM32G4)

+#define FMC_NAND_PCC_WAIT_FEATURE_DISABLE       FMC_NAND_WAIT_FEATURE_DISABLE

+#define FMC_NAND_PCC_WAIT_FEATURE_ENABLE        FMC_NAND_WAIT_FEATURE_ENABLE

+#define FMC_NAND_PCC_MEM_BUS_WIDTH_8            FMC_NAND_MEM_BUS_WIDTH_8

+#define FMC_NAND_PCC_MEM_BUS_WIDTH_16           FMC_NAND_MEM_BUS_WIDTH_16

+#elif defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4)

+#define FMC_NAND_WAIT_FEATURE_DISABLE           FMC_NAND_PCC_WAIT_FEATURE_DISABLE

+#define FMC_NAND_WAIT_FEATURE_ENABLE            FMC_NAND_PCC_WAIT_FEATURE_ENABLE

+#define FMC_NAND_MEM_BUS_WIDTH_8                FMC_NAND_PCC_MEM_BUS_WIDTH_8

+#define FMC_NAND_MEM_BUS_WIDTH_16               FMC_NAND_PCC_MEM_BUS_WIDTH_16

+#endif

+/**

+  * @}

+  */

+

+/** @defgroup LL_FSMC_Aliased_Defines LL FSMC Aliased Defines maintained for legacy purpose

+  * @{

+  */

+

+#define FSMC_NORSRAM_TYPEDEF                      FSMC_NORSRAM_TypeDef

+#define FSMC_NORSRAM_EXTENDED_TYPEDEF             FSMC_NORSRAM_EXTENDED_TypeDef

+/**

+  * @}

+  */

+

+/** @defgroup HAL_GPIO_Aliased_Macros HAL GPIO Aliased Macros maintained for legacy purpose

+  * @{

+  */

+#define GET_GPIO_SOURCE                           GPIO_GET_INDEX

+#define GET_GPIO_INDEX                            GPIO_GET_INDEX

+

+#if defined(STM32F4)

+#define GPIO_AF12_SDMMC                           GPIO_AF12_SDIO

+#define GPIO_AF12_SDMMC1                          GPIO_AF12_SDIO

+#endif

+

+#if defined(STM32F7)

+#define GPIO_AF12_SDIO                            GPIO_AF12_SDMMC1

+#define GPIO_AF12_SDMMC                           GPIO_AF12_SDMMC1

+#endif

+

+#if defined(STM32L4)

+#define GPIO_AF12_SDIO                            GPIO_AF12_SDMMC1

+#define GPIO_AF12_SDMMC                           GPIO_AF12_SDMMC1

+#endif

+

+#if defined(STM32H7)

+#define GPIO_AF7_SDIO1                            GPIO_AF7_SDMMC1

+#define GPIO_AF8_SDIO1                            GPIO_AF8_SDMMC1

+#define GPIO_AF12_SDIO1                           GPIO_AF12_SDMMC1

+#define GPIO_AF9_SDIO2                            GPIO_AF9_SDMMC2

+#define GPIO_AF10_SDIO2                           GPIO_AF10_SDMMC2

+#define GPIO_AF11_SDIO2                           GPIO_AF11_SDMMC2

+#endif

+

+#define GPIO_AF0_LPTIM                            GPIO_AF0_LPTIM1

+#define GPIO_AF1_LPTIM                            GPIO_AF1_LPTIM1

+#define GPIO_AF2_LPTIM                            GPIO_AF2_LPTIM1

+

+#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || defined(STM32G4) || defined(STM32H7)

+#define  GPIO_SPEED_LOW                           GPIO_SPEED_FREQ_LOW

+#define  GPIO_SPEED_MEDIUM                        GPIO_SPEED_FREQ_MEDIUM

+#define  GPIO_SPEED_FAST                          GPIO_SPEED_FREQ_HIGH

+#define  GPIO_SPEED_HIGH                          GPIO_SPEED_FREQ_VERY_HIGH

+#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32G4 || STM32H7*/

+

+#if defined(STM32L1)

+ #define  GPIO_SPEED_VERY_LOW    GPIO_SPEED_FREQ_LOW

+ #define  GPIO_SPEED_LOW         GPIO_SPEED_FREQ_MEDIUM

+ #define  GPIO_SPEED_MEDIUM      GPIO_SPEED_FREQ_HIGH

+ #define  GPIO_SPEED_HIGH        GPIO_SPEED_FREQ_VERY_HIGH

+#endif /* STM32L1 */

+

+#if defined(STM32F0) || defined(STM32F3) || defined(STM32F1)

+ #define  GPIO_SPEED_LOW    GPIO_SPEED_FREQ_LOW

+ #define  GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM

+ #define  GPIO_SPEED_HIGH   GPIO_SPEED_FREQ_HIGH

+#endif /* STM32F0 || STM32F3 || STM32F1 */

+

+#define GPIO_AF6_DFSDM                            GPIO_AF6_DFSDM1

+/**

+  * @}

+  */

+

+/** @defgroup HAL_HRTIM_Aliased_Macros HAL HRTIM Aliased Macros maintained for legacy purpose

+  * @{

+  */

+#define HRTIM_TIMDELAYEDPROTECTION_DISABLED           HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DISABLED

+#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT1_EEV68  HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT1_EEV6

+#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT2_EEV68  HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT2_EEV6

+#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDBOTH_EEV68  HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDBOTH_EEV6

+#define HRTIM_TIMDELAYEDPROTECTION_BALANCED_EEV68     HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_BALANCED_EEV6

+#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT1_DEEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT1_DEEV7

+#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT2_DEEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT2_DEEV7

+#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDBOTH_EEV79  HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDBOTH_EEV7

+#define HRTIM_TIMDELAYEDPROTECTION_BALANCED_EEV79     HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_BALANCED_EEV7

+

+#define __HAL_HRTIM_SetCounter        __HAL_HRTIM_SETCOUNTER

+#define __HAL_HRTIM_GetCounter        __HAL_HRTIM_GETCOUNTER

+#define __HAL_HRTIM_SetPeriod         __HAL_HRTIM_SETPERIOD

+#define __HAL_HRTIM_GetPeriod         __HAL_HRTIM_GETPERIOD

+#define __HAL_HRTIM_SetClockPrescaler __HAL_HRTIM_SETCLOCKPRESCALER

+#define __HAL_HRTIM_GetClockPrescaler __HAL_HRTIM_GETCLOCKPRESCALER

+#define __HAL_HRTIM_SetCompare        __HAL_HRTIM_SETCOMPARE

+#define __HAL_HRTIM_GetCompare        __HAL_HRTIM_GETCOMPARE

+

+#if defined(STM32G4)

+#define HAL_HRTIM_ExternalEventCounterConfig    HAL_HRTIM_ExtEventCounterConfig

+#define HAL_HRTIM_ExternalEventCounterEnable    HAL_HRTIM_ExtEventCounterEnable

+#define HAL_HRTIM_ExternalEventCounterDisable   HAL_HRTIM_ExtEventCounterDisable

+#define HAL_HRTIM_ExternalEventCounterReset     HAL_HRTIM_ExtEventCounterReset

+#endif /* STM32G4 */

+/**

+  * @}

+  */

+

+/** @defgroup HAL_I2C_Aliased_Defines HAL I2C Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define I2C_DUALADDRESS_DISABLED                I2C_DUALADDRESS_DISABLE

+#define I2C_DUALADDRESS_ENABLED                 I2C_DUALADDRESS_ENABLE

+#define I2C_GENERALCALL_DISABLED                I2C_GENERALCALL_DISABLE

+#define I2C_GENERALCALL_ENABLED                 I2C_GENERALCALL_ENABLE

+#define I2C_NOSTRETCH_DISABLED                  I2C_NOSTRETCH_DISABLE

+#define I2C_NOSTRETCH_ENABLED                   I2C_NOSTRETCH_ENABLE

+#define I2C_ANALOGFILTER_ENABLED                I2C_ANALOGFILTER_ENABLE

+#define I2C_ANALOGFILTER_DISABLED               I2C_ANALOGFILTER_DISABLE

+#if defined(STM32F0) || defined(STM32F1) || defined(STM32F3) || defined(STM32G0) || defined(STM32L4) || defined(STM32L1) || defined(STM32F7)

+#define HAL_I2C_STATE_MEM_BUSY_TX               HAL_I2C_STATE_BUSY_TX

+#define HAL_I2C_STATE_MEM_BUSY_RX               HAL_I2C_STATE_BUSY_RX

+#define HAL_I2C_STATE_MASTER_BUSY_TX            HAL_I2C_STATE_BUSY_TX

+#define HAL_I2C_STATE_MASTER_BUSY_RX            HAL_I2C_STATE_BUSY_RX

+#define HAL_I2C_STATE_SLAVE_BUSY_TX             HAL_I2C_STATE_BUSY_TX

+#define HAL_I2C_STATE_SLAVE_BUSY_RX             HAL_I2C_STATE_BUSY_RX

+#endif

+/**

+  * @}

+  */

+

+/** @defgroup HAL_IRDA_Aliased_Defines HAL IRDA Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define IRDA_ONE_BIT_SAMPLE_DISABLED            IRDA_ONE_BIT_SAMPLE_DISABLE

+#define IRDA_ONE_BIT_SAMPLE_ENABLED             IRDA_ONE_BIT_SAMPLE_ENABLE

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_IWDG_Aliased_Defines HAL IWDG Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define KR_KEY_RELOAD                   IWDG_KEY_RELOAD

+#define KR_KEY_ENABLE                   IWDG_KEY_ENABLE

+#define KR_KEY_EWA                      IWDG_KEY_WRITE_ACCESS_ENABLE

+#define KR_KEY_DWA                      IWDG_KEY_WRITE_ACCESS_DISABLE

+/**

+  * @}

+  */

+

+/** @defgroup HAL_LPTIM_Aliased_Defines HAL LPTIM Aliased Defines maintained for legacy purpose

+  * @{

+  */

+

+#define LPTIM_CLOCKSAMPLETIME_DIRECTTRANSISTION LPTIM_CLOCKSAMPLETIME_DIRECTTRANSITION

+#define LPTIM_CLOCKSAMPLETIME_2TRANSISTIONS     LPTIM_CLOCKSAMPLETIME_2TRANSITIONS

+#define LPTIM_CLOCKSAMPLETIME_4TRANSISTIONS     LPTIM_CLOCKSAMPLETIME_4TRANSITIONS

+#define LPTIM_CLOCKSAMPLETIME_8TRANSISTIONS     LPTIM_CLOCKSAMPLETIME_8TRANSITIONS

+

+#define LPTIM_CLOCKPOLARITY_RISINGEDGE          LPTIM_CLOCKPOLARITY_RISING

+#define LPTIM_CLOCKPOLARITY_FALLINGEDGE         LPTIM_CLOCKPOLARITY_FALLING

+#define LPTIM_CLOCKPOLARITY_BOTHEDGES           LPTIM_CLOCKPOLARITY_RISING_FALLING

+

+#define LPTIM_TRIGSAMPLETIME_DIRECTTRANSISTION  LPTIM_TRIGSAMPLETIME_DIRECTTRANSITION

+#define LPTIM_TRIGSAMPLETIME_2TRANSISTIONS      LPTIM_TRIGSAMPLETIME_2TRANSITIONS

+#define LPTIM_TRIGSAMPLETIME_4TRANSISTIONS      LPTIM_TRIGSAMPLETIME_4TRANSITIONS

+#define LPTIM_TRIGSAMPLETIME_8TRANSISTIONS      LPTIM_TRIGSAMPLETIME_8TRANSITIONS

+

+/* The following 3 definition have also been present in a temporary version of lptim.h */

+/* They need to be renamed also to the right name, just in case */

+#define LPTIM_TRIGSAMPLETIME_2TRANSITION        LPTIM_TRIGSAMPLETIME_2TRANSITIONS

+#define LPTIM_TRIGSAMPLETIME_4TRANSITION        LPTIM_TRIGSAMPLETIME_4TRANSITIONS

+#define LPTIM_TRIGSAMPLETIME_8TRANSITION        LPTIM_TRIGSAMPLETIME_8TRANSITIONS

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_NAND_Aliased_Defines HAL NAND Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define HAL_NAND_Read_Page              HAL_NAND_Read_Page_8b

+#define HAL_NAND_Write_Page             HAL_NAND_Write_Page_8b

+#define HAL_NAND_Read_SpareArea         HAL_NAND_Read_SpareArea_8b

+#define HAL_NAND_Write_SpareArea        HAL_NAND_Write_SpareArea_8b

+

+#define NAND_AddressTypedef             NAND_AddressTypeDef

+

+#define __ARRAY_ADDRESS                 ARRAY_ADDRESS

+#define __ADDR_1st_CYCLE                ADDR_1ST_CYCLE

+#define __ADDR_2nd_CYCLE                ADDR_2ND_CYCLE

+#define __ADDR_3rd_CYCLE                ADDR_3RD_CYCLE

+#define __ADDR_4th_CYCLE                ADDR_4TH_CYCLE

+/**

+  * @}

+  */

+

+/** @defgroup HAL_NOR_Aliased_Defines HAL NOR Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define NOR_StatusTypedef              HAL_NOR_StatusTypeDef

+#define NOR_SUCCESS                    HAL_NOR_STATUS_SUCCESS

+#define NOR_ONGOING                    HAL_NOR_STATUS_ONGOING

+#define NOR_ERROR                      HAL_NOR_STATUS_ERROR

+#define NOR_TIMEOUT                    HAL_NOR_STATUS_TIMEOUT

+

+#define __NOR_WRITE                    NOR_WRITE

+#define __NOR_ADDR_SHIFT               NOR_ADDR_SHIFT

+/**

+  * @}

+  */

+

+/** @defgroup HAL_OPAMP_Aliased_Defines HAL OPAMP Aliased Defines maintained for legacy purpose

+  * @{

+  */

+

+#define OPAMP_NONINVERTINGINPUT_VP0           OPAMP_NONINVERTINGINPUT_IO0

+#define OPAMP_NONINVERTINGINPUT_VP1           OPAMP_NONINVERTINGINPUT_IO1

+#define OPAMP_NONINVERTINGINPUT_VP2           OPAMP_NONINVERTINGINPUT_IO2

+#define OPAMP_NONINVERTINGINPUT_VP3           OPAMP_NONINVERTINGINPUT_IO3

+

+#define OPAMP_SEC_NONINVERTINGINPUT_VP0       OPAMP_SEC_NONINVERTINGINPUT_IO0

+#define OPAMP_SEC_NONINVERTINGINPUT_VP1       OPAMP_SEC_NONINVERTINGINPUT_IO1

+#define OPAMP_SEC_NONINVERTINGINPUT_VP2       OPAMP_SEC_NONINVERTINGINPUT_IO2

+#define OPAMP_SEC_NONINVERTINGINPUT_VP3       OPAMP_SEC_NONINVERTINGINPUT_IO3

+

+#define OPAMP_INVERTINGINPUT_VM0              OPAMP_INVERTINGINPUT_IO0

+#define OPAMP_INVERTINGINPUT_VM1              OPAMP_INVERTINGINPUT_IO1

+

+#define IOPAMP_INVERTINGINPUT_VM0             OPAMP_INVERTINGINPUT_IO0

+#define IOPAMP_INVERTINGINPUT_VM1             OPAMP_INVERTINGINPUT_IO1

+

+#define OPAMP_SEC_INVERTINGINPUT_VM0          OPAMP_SEC_INVERTINGINPUT_IO0

+#define OPAMP_SEC_INVERTINGINPUT_VM1          OPAMP_SEC_INVERTINGINPUT_IO1

+

+#define OPAMP_INVERTINGINPUT_VINM             OPAMP_SEC_INVERTINGINPUT_IO1

+

+#define OPAMP_PGACONNECT_NO                   OPAMP_PGA_CONNECT_INVERTINGINPUT_NO

+#define OPAMP_PGACONNECT_VM0                  OPAMP_PGA_CONNECT_INVERTINGINPUT_IO0

+#define OPAMP_PGACONNECT_VM1                  OPAMP_PGA_CONNECT_INVERTINGINPUT_IO1

+

+#if defined(STM32L1) || defined(STM32L4) || defined(STM32L5)

+#define HAL_OPAMP_MSP_INIT_CB_ID       HAL_OPAMP_MSPINIT_CB_ID

+#define HAL_OPAMP_MSP_DEINIT_CB_ID     HAL_OPAMP_MSPDEINIT_CB_ID

+#endif

+

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_I2S_Aliased_Defines HAL I2S Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define I2S_STANDARD_PHILLIPS      I2S_STANDARD_PHILIPS

+

+#if defined(STM32H7)

+  #define I2S_IT_TXE               I2S_IT_TXP

+  #define I2S_IT_RXNE              I2S_IT_RXP

+

+  #define I2S_FLAG_TXE             I2S_FLAG_TXP

+  #define I2S_FLAG_RXNE            I2S_FLAG_RXP

+#endif

+

+#if defined(STM32F7)

+  #define I2S_CLOCK_SYSCLK           I2S_CLOCK_PLL

+#endif

+/**

+  * @}

+  */

+

+/** @defgroup HAL_PCCARD_Aliased_Defines HAL PCCARD Aliased Defines maintained for legacy purpose

+  * @{

+  */

+

+/* Compact Flash-ATA registers description */

+#define CF_DATA                       ATA_DATA

+#define CF_SECTOR_COUNT               ATA_SECTOR_COUNT

+#define CF_SECTOR_NUMBER              ATA_SECTOR_NUMBER

+#define CF_CYLINDER_LOW               ATA_CYLINDER_LOW

+#define CF_CYLINDER_HIGH              ATA_CYLINDER_HIGH

+#define CF_CARD_HEAD                  ATA_CARD_HEAD

+#define CF_STATUS_CMD                 ATA_STATUS_CMD

+#define CF_STATUS_CMD_ALTERNATE       ATA_STATUS_CMD_ALTERNATE

+#define CF_COMMON_DATA_AREA           ATA_COMMON_DATA_AREA

+

+/* Compact Flash-ATA commands */

+#define CF_READ_SECTOR_CMD            ATA_READ_SECTOR_CMD

+#define CF_WRITE_SECTOR_CMD           ATA_WRITE_SECTOR_CMD

+#define CF_ERASE_SECTOR_CMD           ATA_ERASE_SECTOR_CMD

+#define CF_IDENTIFY_CMD               ATA_IDENTIFY_CMD

+

+#define PCCARD_StatusTypedef          HAL_PCCARD_StatusTypeDef

+#define PCCARD_SUCCESS                HAL_PCCARD_STATUS_SUCCESS

+#define PCCARD_ONGOING                HAL_PCCARD_STATUS_ONGOING

+#define PCCARD_ERROR                  HAL_PCCARD_STATUS_ERROR

+#define PCCARD_TIMEOUT                HAL_PCCARD_STATUS_TIMEOUT

+/**

+  * @}

+  */

+

+/** @defgroup HAL_RTC_Aliased_Defines HAL RTC Aliased Defines maintained for legacy purpose

+  * @{

+  */

+

+#define FORMAT_BIN                  RTC_FORMAT_BIN

+#define FORMAT_BCD                  RTC_FORMAT_BCD

+

+#define RTC_ALARMSUBSECONDMASK_None     RTC_ALARMSUBSECONDMASK_NONE

+#define RTC_TAMPERERASEBACKUP_DISABLED  RTC_TAMPER_ERASE_BACKUP_DISABLE

+#define RTC_TAMPERMASK_FLAG_DISABLED    RTC_TAMPERMASK_FLAG_DISABLE

+#define RTC_TAMPERMASK_FLAG_ENABLED     RTC_TAMPERMASK_FLAG_ENABLE

+

+#define RTC_MASKTAMPERFLAG_DISABLED     RTC_TAMPERMASK_FLAG_DISABLE

+#define RTC_MASKTAMPERFLAG_ENABLED      RTC_TAMPERMASK_FLAG_ENABLE

+#define RTC_TAMPERERASEBACKUP_ENABLED   RTC_TAMPER_ERASE_BACKUP_ENABLE

+#define RTC_TAMPER1_2_INTERRUPT         RTC_ALL_TAMPER_INTERRUPT

+#define RTC_TAMPER1_2_3_INTERRUPT       RTC_ALL_TAMPER_INTERRUPT

+

+#define RTC_TIMESTAMPPIN_PC13  RTC_TIMESTAMPPIN_DEFAULT

+#define RTC_TIMESTAMPPIN_PA0 RTC_TIMESTAMPPIN_POS1

+#define RTC_TIMESTAMPPIN_PI8 RTC_TIMESTAMPPIN_POS1

+#define RTC_TIMESTAMPPIN_PC1   RTC_TIMESTAMPPIN_POS2

+

+#define RTC_OUTPUT_REMAP_PC13  RTC_OUTPUT_REMAP_NONE

+#define RTC_OUTPUT_REMAP_PB14  RTC_OUTPUT_REMAP_POS1

+#define RTC_OUTPUT_REMAP_PB2   RTC_OUTPUT_REMAP_POS1

+

+#define RTC_TAMPERPIN_PC13 RTC_TAMPERPIN_DEFAULT

+#define RTC_TAMPERPIN_PA0  RTC_TAMPERPIN_POS1

+#define RTC_TAMPERPIN_PI8  RTC_TAMPERPIN_POS1

+

+/**

+  * @}

+  */

+

+

+/** @defgroup HAL_SMARTCARD_Aliased_Defines HAL SMARTCARD Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define SMARTCARD_NACK_ENABLED                  SMARTCARD_NACK_ENABLE

+#define SMARTCARD_NACK_DISABLED                 SMARTCARD_NACK_DISABLE

+

+#define SMARTCARD_ONEBIT_SAMPLING_DISABLED      SMARTCARD_ONE_BIT_SAMPLE_DISABLE

+#define SMARTCARD_ONEBIT_SAMPLING_ENABLED       SMARTCARD_ONE_BIT_SAMPLE_ENABLE

+#define SMARTCARD_ONEBIT_SAMPLING_DISABLE       SMARTCARD_ONE_BIT_SAMPLE_DISABLE

+#define SMARTCARD_ONEBIT_SAMPLING_ENABLE        SMARTCARD_ONE_BIT_SAMPLE_ENABLE

+

+#define SMARTCARD_TIMEOUT_DISABLED              SMARTCARD_TIMEOUT_DISABLE

+#define SMARTCARD_TIMEOUT_ENABLED               SMARTCARD_TIMEOUT_ENABLE

+

+#define SMARTCARD_LASTBIT_DISABLED              SMARTCARD_LASTBIT_DISABLE

+#define SMARTCARD_LASTBIT_ENABLED               SMARTCARD_LASTBIT_ENABLE

+/**

+  * @}

+  */

+

+

+/** @defgroup HAL_SMBUS_Aliased_Defines HAL SMBUS Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define SMBUS_DUALADDRESS_DISABLED      SMBUS_DUALADDRESS_DISABLE

+#define SMBUS_DUALADDRESS_ENABLED       SMBUS_DUALADDRESS_ENABLE

+#define SMBUS_GENERALCALL_DISABLED      SMBUS_GENERALCALL_DISABLE

+#define SMBUS_GENERALCALL_ENABLED       SMBUS_GENERALCALL_ENABLE

+#define SMBUS_NOSTRETCH_DISABLED        SMBUS_NOSTRETCH_DISABLE

+#define SMBUS_NOSTRETCH_ENABLED         SMBUS_NOSTRETCH_ENABLE

+#define SMBUS_ANALOGFILTER_ENABLED      SMBUS_ANALOGFILTER_ENABLE

+#define SMBUS_ANALOGFILTER_DISABLED     SMBUS_ANALOGFILTER_DISABLE

+#define SMBUS_PEC_DISABLED              SMBUS_PEC_DISABLE

+#define SMBUS_PEC_ENABLED               SMBUS_PEC_ENABLE

+#define HAL_SMBUS_STATE_SLAVE_LISTEN    HAL_SMBUS_STATE_LISTEN

+/**

+  * @}

+  */

+

+/** @defgroup HAL_SPI_Aliased_Defines HAL SPI Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define SPI_TIMODE_DISABLED             SPI_TIMODE_DISABLE

+#define SPI_TIMODE_ENABLED              SPI_TIMODE_ENABLE

+

+#define SPI_CRCCALCULATION_DISABLED     SPI_CRCCALCULATION_DISABLE

+#define SPI_CRCCALCULATION_ENABLED      SPI_CRCCALCULATION_ENABLE

+

+#define SPI_NSS_PULSE_DISABLED          SPI_NSS_PULSE_DISABLE

+#define SPI_NSS_PULSE_ENABLED           SPI_NSS_PULSE_ENABLE

+

+#if defined(STM32H7)

+

+ #define SPI_FLAG_TXE                    SPI_FLAG_TXP

+ #define SPI_FLAG_RXNE                   SPI_FLAG_RXP

+

+ #define SPI_IT_TXE                      SPI_IT_TXP

+ #define SPI_IT_RXNE                     SPI_IT_RXP

+

+ #define SPI_FRLVL_EMPTY                 SPI_RX_FIFO_0PACKET

+ #define SPI_FRLVL_QUARTER_FULL          SPI_RX_FIFO_1PACKET

+ #define SPI_FRLVL_HALF_FULL             SPI_RX_FIFO_2PACKET

+ #define SPI_FRLVL_FULL                  SPI_RX_FIFO_3PACKET

+

+#endif /* STM32H7 */

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_TIM_Aliased_Defines HAL TIM Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define CCER_CCxE_MASK                   TIM_CCER_CCxE_MASK

+#define CCER_CCxNE_MASK                  TIM_CCER_CCxNE_MASK

+

+#define TIM_DMABase_CR1                  TIM_DMABASE_CR1

+#define TIM_DMABase_CR2                  TIM_DMABASE_CR2

+#define TIM_DMABase_SMCR                 TIM_DMABASE_SMCR

+#define TIM_DMABase_DIER                 TIM_DMABASE_DIER

+#define TIM_DMABase_SR                   TIM_DMABASE_SR

+#define TIM_DMABase_EGR                  TIM_DMABASE_EGR

+#define TIM_DMABase_CCMR1                TIM_DMABASE_CCMR1

+#define TIM_DMABase_CCMR2                TIM_DMABASE_CCMR2

+#define TIM_DMABase_CCER                 TIM_DMABASE_CCER

+#define TIM_DMABase_CNT                  TIM_DMABASE_CNT

+#define TIM_DMABase_PSC                  TIM_DMABASE_PSC

+#define TIM_DMABase_ARR                  TIM_DMABASE_ARR

+#define TIM_DMABase_RCR                  TIM_DMABASE_RCR

+#define TIM_DMABase_CCR1                 TIM_DMABASE_CCR1

+#define TIM_DMABase_CCR2                 TIM_DMABASE_CCR2

+#define TIM_DMABase_CCR3                 TIM_DMABASE_CCR3

+#define TIM_DMABase_CCR4                 TIM_DMABASE_CCR4

+#define TIM_DMABase_BDTR                 TIM_DMABASE_BDTR

+#define TIM_DMABase_DCR                  TIM_DMABASE_DCR

+#define TIM_DMABase_DMAR                 TIM_DMABASE_DMAR

+#define TIM_DMABase_OR1                  TIM_DMABASE_OR1

+#define TIM_DMABase_CCMR3                TIM_DMABASE_CCMR3

+#define TIM_DMABase_CCR5                 TIM_DMABASE_CCR5

+#define TIM_DMABase_CCR6                 TIM_DMABASE_CCR6

+#define TIM_DMABase_OR2                  TIM_DMABASE_OR2

+#define TIM_DMABase_OR3                  TIM_DMABASE_OR3

+#define TIM_DMABase_OR                   TIM_DMABASE_OR

+

+#define TIM_EventSource_Update           TIM_EVENTSOURCE_UPDATE

+#define TIM_EventSource_CC1              TIM_EVENTSOURCE_CC1

+#define TIM_EventSource_CC2              TIM_EVENTSOURCE_CC2

+#define TIM_EventSource_CC3              TIM_EVENTSOURCE_CC3

+#define TIM_EventSource_CC4              TIM_EVENTSOURCE_CC4

+#define TIM_EventSource_COM              TIM_EVENTSOURCE_COM

+#define TIM_EventSource_Trigger          TIM_EVENTSOURCE_TRIGGER

+#define TIM_EventSource_Break            TIM_EVENTSOURCE_BREAK

+#define TIM_EventSource_Break2           TIM_EVENTSOURCE_BREAK2

+

+#define TIM_DMABurstLength_1Transfer     TIM_DMABURSTLENGTH_1TRANSFER

+#define TIM_DMABurstLength_2Transfers    TIM_DMABURSTLENGTH_2TRANSFERS

+#define TIM_DMABurstLength_3Transfers    TIM_DMABURSTLENGTH_3TRANSFERS

+#define TIM_DMABurstLength_4Transfers    TIM_DMABURSTLENGTH_4TRANSFERS

+#define TIM_DMABurstLength_5Transfers    TIM_DMABURSTLENGTH_5TRANSFERS

+#define TIM_DMABurstLength_6Transfers    TIM_DMABURSTLENGTH_6TRANSFERS

+#define TIM_DMABurstLength_7Transfers    TIM_DMABURSTLENGTH_7TRANSFERS

+#define TIM_DMABurstLength_8Transfers    TIM_DMABURSTLENGTH_8TRANSFERS

+#define TIM_DMABurstLength_9Transfers    TIM_DMABURSTLENGTH_9TRANSFERS

+#define TIM_DMABurstLength_10Transfers   TIM_DMABURSTLENGTH_10TRANSFERS

+#define TIM_DMABurstLength_11Transfers   TIM_DMABURSTLENGTH_11TRANSFERS

+#define TIM_DMABurstLength_12Transfers   TIM_DMABURSTLENGTH_12TRANSFERS

+#define TIM_DMABurstLength_13Transfers   TIM_DMABURSTLENGTH_13TRANSFERS

+#define TIM_DMABurstLength_14Transfers   TIM_DMABURSTLENGTH_14TRANSFERS

+#define TIM_DMABurstLength_15Transfers   TIM_DMABURSTLENGTH_15TRANSFERS

+#define TIM_DMABurstLength_16Transfers   TIM_DMABURSTLENGTH_16TRANSFERS

+#define TIM_DMABurstLength_17Transfers   TIM_DMABURSTLENGTH_17TRANSFERS

+#define TIM_DMABurstLength_18Transfers   TIM_DMABURSTLENGTH_18TRANSFERS

+

+#if defined(STM32L0)

+#define TIM22_TI1_GPIO1   TIM22_TI1_GPIO

+#define TIM22_TI1_GPIO2   TIM22_TI1_GPIO

+#endif

+

+#if defined(STM32F3)

+#define IS_TIM_HALL_INTERFACE_INSTANCE   IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE

+#endif

+

+#if defined(STM32H7)

+#define TIM_TIM1_ETR_COMP1_OUT        TIM_TIM1_ETR_COMP1

+#define TIM_TIM1_ETR_COMP2_OUT        TIM_TIM1_ETR_COMP2

+#define TIM_TIM8_ETR_COMP1_OUT        TIM_TIM8_ETR_COMP1

+#define TIM_TIM8_ETR_COMP2_OUT        TIM_TIM8_ETR_COMP2

+#define TIM_TIM2_ETR_COMP1_OUT        TIM_TIM2_ETR_COMP1

+#define TIM_TIM2_ETR_COMP2_OUT        TIM_TIM2_ETR_COMP2

+#define TIM_TIM3_ETR_COMP1_OUT        TIM_TIM3_ETR_COMP1

+#define TIM_TIM1_TI1_COMP1_OUT        TIM_TIM1_TI1_COMP1

+#define TIM_TIM8_TI1_COMP2_OUT        TIM_TIM8_TI1_COMP2

+#define TIM_TIM2_TI4_COMP1_OUT        TIM_TIM2_TI4_COMP1

+#define TIM_TIM2_TI4_COMP2_OUT        TIM_TIM2_TI4_COMP2

+#define TIM_TIM2_TI4_COMP1COMP2_OUT   TIM_TIM2_TI4_COMP1_COMP2

+#define TIM_TIM3_TI1_COMP1_OUT        TIM_TIM3_TI1_COMP1

+#define TIM_TIM3_TI1_COMP2_OUT        TIM_TIM3_TI1_COMP2

+#define TIM_TIM3_TI1_COMP1COMP2_OUT   TIM_TIM3_TI1_COMP1_COMP2

+#endif

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_TSC_Aliased_Defines HAL TSC Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define TSC_SYNC_POL_FALL        TSC_SYNC_POLARITY_FALLING

+#define TSC_SYNC_POL_RISE_HIGH   TSC_SYNC_POLARITY_RISING

+/**

+  * @}

+  */

+

+/** @defgroup HAL_UART_Aliased_Defines HAL UART Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define UART_ONEBIT_SAMPLING_DISABLED   UART_ONE_BIT_SAMPLE_DISABLE

+#define UART_ONEBIT_SAMPLING_ENABLED    UART_ONE_BIT_SAMPLE_ENABLE

+#define UART_ONE_BIT_SAMPLE_DISABLED    UART_ONE_BIT_SAMPLE_DISABLE

+#define UART_ONE_BIT_SAMPLE_ENABLED     UART_ONE_BIT_SAMPLE_ENABLE

+

+#define __HAL_UART_ONEBIT_ENABLE        __HAL_UART_ONE_BIT_SAMPLE_ENABLE

+#define __HAL_UART_ONEBIT_DISABLE       __HAL_UART_ONE_BIT_SAMPLE_DISABLE

+

+#define __DIV_SAMPLING16                UART_DIV_SAMPLING16

+#define __DIVMANT_SAMPLING16            UART_DIVMANT_SAMPLING16

+#define __DIVFRAQ_SAMPLING16            UART_DIVFRAQ_SAMPLING16

+#define __UART_BRR_SAMPLING16           UART_BRR_SAMPLING16

+

+#define __DIV_SAMPLING8                 UART_DIV_SAMPLING8

+#define __DIVMANT_SAMPLING8             UART_DIVMANT_SAMPLING8

+#define __DIVFRAQ_SAMPLING8             UART_DIVFRAQ_SAMPLING8

+#define __UART_BRR_SAMPLING8            UART_BRR_SAMPLING8

+

+#define __DIV_LPUART                    UART_DIV_LPUART

+

+#define UART_WAKEUPMETHODE_IDLELINE     UART_WAKEUPMETHOD_IDLELINE

+#define UART_WAKEUPMETHODE_ADDRESSMARK  UART_WAKEUPMETHOD_ADDRESSMARK

+

+/**

+  * @}

+  */

+

+

+/** @defgroup HAL_USART_Aliased_Defines HAL USART Aliased Defines maintained for legacy purpose

+  * @{

+  */

+

+#define USART_CLOCK_DISABLED            USART_CLOCK_DISABLE

+#define USART_CLOCK_ENABLED             USART_CLOCK_ENABLE

+

+#define USARTNACK_ENABLED               USART_NACK_ENABLE

+#define USARTNACK_DISABLED              USART_NACK_DISABLE

+/**

+  * @}

+  */

+

+/** @defgroup HAL_WWDG_Aliased_Defines HAL WWDG Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define CFR_BASE                    WWDG_CFR_BASE

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_CAN_Aliased_Defines HAL CAN Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define CAN_FilterFIFO0             CAN_FILTER_FIFO0

+#define CAN_FilterFIFO1             CAN_FILTER_FIFO1

+#define CAN_IT_RQCP0                CAN_IT_TME

+#define CAN_IT_RQCP1                CAN_IT_TME

+#define CAN_IT_RQCP2                CAN_IT_TME

+#define INAK_TIMEOUT                CAN_TIMEOUT_VALUE

+#define SLAK_TIMEOUT                CAN_TIMEOUT_VALUE

+#define CAN_TXSTATUS_FAILED         ((uint8_t)0x00U)

+#define CAN_TXSTATUS_OK             ((uint8_t)0x01U)

+#define CAN_TXSTATUS_PENDING        ((uint8_t)0x02U)

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_ETH_Aliased_Defines HAL ETH Aliased Defines maintained for legacy purpose

+  * @{

+  */

+

+#define VLAN_TAG                ETH_VLAN_TAG

+#define MIN_ETH_PAYLOAD         ETH_MIN_ETH_PAYLOAD

+#define MAX_ETH_PAYLOAD         ETH_MAX_ETH_PAYLOAD

+#define JUMBO_FRAME_PAYLOAD     ETH_JUMBO_FRAME_PAYLOAD

+#define MACMIIAR_CR_MASK        ETH_MACMIIAR_CR_MASK

+#define MACCR_CLEAR_MASK        ETH_MACCR_CLEAR_MASK

+#define MACFCR_CLEAR_MASK       ETH_MACFCR_CLEAR_MASK

+#define DMAOMR_CLEAR_MASK       ETH_DMAOMR_CLEAR_MASK

+

+#define ETH_MMCCR              0x00000100U

+#define ETH_MMCRIR             0x00000104U

+#define ETH_MMCTIR             0x00000108U

+#define ETH_MMCRIMR            0x0000010CU

+#define ETH_MMCTIMR            0x00000110U

+#define ETH_MMCTGFSCCR         0x0000014CU

+#define ETH_MMCTGFMSCCR        0x00000150U

+#define ETH_MMCTGFCR           0x00000168U

+#define ETH_MMCRFCECR          0x00000194U

+#define ETH_MMCRFAECR          0x00000198U

+#define ETH_MMCRGUFCR          0x000001C4U

+

+#define ETH_MAC_TXFIFO_FULL                             0x02000000U  /* Tx FIFO full */

+#define ETH_MAC_TXFIFONOT_EMPTY                         0x01000000U  /* Tx FIFO not empty */

+#define ETH_MAC_TXFIFO_WRITE_ACTIVE                     0x00400000U  /* Tx FIFO write active */

+#define ETH_MAC_TXFIFO_IDLE                             0x00000000U  /* Tx FIFO read status: Idle */

+#define ETH_MAC_TXFIFO_READ                             0x00100000U  /* Tx FIFO read status: Read (transferring data to the MAC transmitter) */

+#define ETH_MAC_TXFIFO_WAITING                          0x00200000U  /* Tx FIFO read status: Waiting for TxStatus from MAC transmitter */

+#define ETH_MAC_TXFIFO_WRITING                          0x00300000U  /* Tx FIFO read status: Writing the received TxStatus or flushing the TxFIFO */

+#define ETH_MAC_TRANSMISSION_PAUSE                      0x00080000U  /* MAC transmitter in pause */

+#define ETH_MAC_TRANSMITFRAMECONTROLLER_IDLE            0x00000000U  /* MAC transmit frame controller: Idle */

+#define ETH_MAC_TRANSMITFRAMECONTROLLER_WAITING         0x00020000U  /* MAC transmit frame controller: Waiting for Status of previous frame or IFG/backoff period to be over */

+#define ETH_MAC_TRANSMITFRAMECONTROLLER_GENRATING_PCF   0x00040000U  /* MAC transmit frame controller: Generating and transmitting a Pause control frame (in full duplex mode) */

+#define ETH_MAC_TRANSMITFRAMECONTROLLER_TRANSFERRING    0x00060000U  /* MAC transmit frame controller: Transferring input frame for transmission */

+#define ETH_MAC_MII_TRANSMIT_ACTIVE           0x00010000U  /* MAC MII transmit engine active */

+#define ETH_MAC_RXFIFO_EMPTY                  0x00000000U  /* Rx FIFO fill level: empty */

+#define ETH_MAC_RXFIFO_BELOW_THRESHOLD        0x00000100U  /* Rx FIFO fill level: fill-level below flow-control de-activate threshold */

+#define ETH_MAC_RXFIFO_ABOVE_THRESHOLD        0x00000200U  /* Rx FIFO fill level: fill-level above flow-control activate threshold */

+#define ETH_MAC_RXFIFO_FULL                   0x00000300U  /* Rx FIFO fill level: full */

+#if defined(STM32F1)

+#else

+#define ETH_MAC_READCONTROLLER_IDLE           0x00000000U  /* Rx FIFO read controller IDLE state */

+#define ETH_MAC_READCONTROLLER_READING_DATA   0x00000020U  /* Rx FIFO read controller Reading frame data */

+#define ETH_MAC_READCONTROLLER_READING_STATUS 0x00000040U  /* Rx FIFO read controller Reading frame status (or time-stamp) */

+#endif

+#define ETH_MAC_READCONTROLLER_FLUSHING       0x00000060U  /* Rx FIFO read controller Flushing the frame data and status */

+#define ETH_MAC_RXFIFO_WRITE_ACTIVE           0x00000010U  /* Rx FIFO write controller active */

+#define ETH_MAC_SMALL_FIFO_NOTACTIVE          0x00000000U  /* MAC small FIFO read / write controllers not active */

+#define ETH_MAC_SMALL_FIFO_READ_ACTIVE        0x00000002U  /* MAC small FIFO read controller active */

+#define ETH_MAC_SMALL_FIFO_WRITE_ACTIVE       0x00000004U  /* MAC small FIFO write controller active */

+#define ETH_MAC_SMALL_FIFO_RW_ACTIVE          0x00000006U  /* MAC small FIFO read / write controllers active */

+#define ETH_MAC_MII_RECEIVE_PROTOCOL_ACTIVE   0x00000001U  /* MAC MII receive protocol engine active */

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_DCMI_Aliased_Defines HAL DCMI Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define HAL_DCMI_ERROR_OVF      HAL_DCMI_ERROR_OVR

+#define DCMI_IT_OVF             DCMI_IT_OVR

+#define DCMI_FLAG_OVFRI         DCMI_FLAG_OVRRI

+#define DCMI_FLAG_OVFMI         DCMI_FLAG_OVRMI

+

+#define HAL_DCMI_ConfigCROP     HAL_DCMI_ConfigCrop

+#define HAL_DCMI_EnableCROP     HAL_DCMI_EnableCrop

+#define HAL_DCMI_DisableCROP    HAL_DCMI_DisableCrop

+

+/**

+  * @}

+  */

+

+#if defined(STM32L4) || defined(STM32F7) || defined(STM32F427xx) || defined(STM32F437xx) \

+  || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) \

+  || defined(STM32H7)

+/** @defgroup HAL_DMA2D_Aliased_Defines HAL DMA2D Aliased Defines maintained for legacy purpose

+  * @{

+  */

+#define DMA2D_ARGB8888          DMA2D_OUTPUT_ARGB8888

+#define DMA2D_RGB888            DMA2D_OUTPUT_RGB888

+#define DMA2D_RGB565            DMA2D_OUTPUT_RGB565

+#define DMA2D_ARGB1555          DMA2D_OUTPUT_ARGB1555

+#define DMA2D_ARGB4444          DMA2D_OUTPUT_ARGB4444

+

+#define CM_ARGB8888             DMA2D_INPUT_ARGB8888

+#define CM_RGB888               DMA2D_INPUT_RGB888

+#define CM_RGB565               DMA2D_INPUT_RGB565

+#define CM_ARGB1555             DMA2D_INPUT_ARGB1555

+#define CM_ARGB4444             DMA2D_INPUT_ARGB4444

+#define CM_L8                   DMA2D_INPUT_L8

+#define CM_AL44                 DMA2D_INPUT_AL44

+#define CM_AL88                 DMA2D_INPUT_AL88

+#define CM_L4                   DMA2D_INPUT_L4

+#define CM_A8                   DMA2D_INPUT_A8

+#define CM_A4                   DMA2D_INPUT_A4

+/**

+  * @}

+  */

+#endif  /* STM32L4 ||  STM32F7 ||  STM32F4 ||  STM32H7 */

+

+/** @defgroup HAL_PPP_Aliased_Defines HAL PPP Aliased Defines maintained for legacy purpose

+  * @{

+  */

+

+/**

+  * @}

+  */

+

+/* Exported functions --------------------------------------------------------*/

+

+/** @defgroup HAL_CRYP_Aliased_Functions HAL CRYP Aliased Functions maintained for legacy purpose

+  * @{

+  */

+#define HAL_CRYP_ComputationCpltCallback     HAL_CRYPEx_ComputationCpltCallback

+/**

+  * @}

+  */

+

+/** @defgroup HAL_HASH_Aliased_Functions HAL HASH Aliased Functions maintained for legacy purpose

+  * @{

+  */

+#define HAL_HASH_STATETypeDef        HAL_HASH_StateTypeDef

+#define HAL_HASHPhaseTypeDef         HAL_HASH_PhaseTypeDef

+#define HAL_HMAC_MD5_Finish          HAL_HASH_MD5_Finish

+#define HAL_HMAC_SHA1_Finish         HAL_HASH_SHA1_Finish

+#define HAL_HMAC_SHA224_Finish       HAL_HASH_SHA224_Finish

+#define HAL_HMAC_SHA256_Finish       HAL_HASH_SHA256_Finish

+

+/*HASH Algorithm Selection*/

+

+#define HASH_AlgoSelection_SHA1      HASH_ALGOSELECTION_SHA1

+#define HASH_AlgoSelection_SHA224    HASH_ALGOSELECTION_SHA224

+#define HASH_AlgoSelection_SHA256    HASH_ALGOSELECTION_SHA256

+#define HASH_AlgoSelection_MD5       HASH_ALGOSELECTION_MD5

+

+#define HASH_AlgoMode_HASH         HASH_ALGOMODE_HASH

+#define HASH_AlgoMode_HMAC         HASH_ALGOMODE_HMAC

+

+#define HASH_HMACKeyType_ShortKey  HASH_HMAC_KEYTYPE_SHORTKEY

+#define HASH_HMACKeyType_LongKey   HASH_HMAC_KEYTYPE_LONGKEY

+/**

+  * @}

+  */

+

+/** @defgroup HAL_Aliased_Functions HAL Generic Aliased Functions maintained for legacy purpose

+  * @{

+  */

+#define HAL_EnableDBGSleepMode HAL_DBGMCU_EnableDBGSleepMode

+#define HAL_DisableDBGSleepMode HAL_DBGMCU_DisableDBGSleepMode

+#define HAL_EnableDBGStopMode HAL_DBGMCU_EnableDBGStopMode

+#define HAL_DisableDBGStopMode HAL_DBGMCU_DisableDBGStopMode

+#define HAL_EnableDBGStandbyMode HAL_DBGMCU_EnableDBGStandbyMode

+#define HAL_DisableDBGStandbyMode HAL_DBGMCU_DisableDBGStandbyMode

+#define HAL_DBG_LowPowerConfig(Periph, cmd) (((cmd)==ENABLE)? HAL_DBGMCU_DBG_EnableLowPowerConfig(Periph) : HAL_DBGMCU_DBG_DisableLowPowerConfig(Periph))

+#define HAL_VREFINT_OutputSelect  HAL_SYSCFG_VREFINT_OutputSelect

+#define HAL_Lock_Cmd(cmd) (((cmd)==ENABLE) ? HAL_SYSCFG_Enable_Lock_VREFINT() : HAL_SYSCFG_Disable_Lock_VREFINT())

+#if defined(STM32L0)

+#else

+#define HAL_VREFINT_Cmd(cmd) (((cmd)==ENABLE)? HAL_SYSCFG_EnableVREFINT() : HAL_SYSCFG_DisableVREFINT())

+#endif

+#define HAL_ADC_EnableBuffer_Cmd(cmd)  (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINT() : HAL_ADCEx_DisableVREFINT())

+#define HAL_ADC_EnableBufferSensor_Cmd(cmd) (((cmd)==ENABLE) ?  HAL_ADCEx_EnableVREFINTTempSensor() : HAL_ADCEx_DisableVREFINTTempSensor())

+/**

+  * @}

+  */

+

+/** @defgroup HAL_FLASH_Aliased_Functions HAL FLASH Aliased Functions maintained for legacy purpose

+  * @{

+  */

+#define FLASH_HalfPageProgram      HAL_FLASHEx_HalfPageProgram

+#define FLASH_EnableRunPowerDown   HAL_FLASHEx_EnableRunPowerDown

+#define FLASH_DisableRunPowerDown  HAL_FLASHEx_DisableRunPowerDown

+#define HAL_DATA_EEPROMEx_Unlock   HAL_FLASHEx_DATAEEPROM_Unlock

+#define HAL_DATA_EEPROMEx_Lock     HAL_FLASHEx_DATAEEPROM_Lock

+#define HAL_DATA_EEPROMEx_Erase    HAL_FLASHEx_DATAEEPROM_Erase

+#define HAL_DATA_EEPROMEx_Program  HAL_FLASHEx_DATAEEPROM_Program

+

+ /**

+  * @}

+  */

+

+/** @defgroup HAL_I2C_Aliased_Functions HAL I2C Aliased Functions maintained for legacy purpose

+  * @{

+  */

+#define HAL_I2CEx_AnalogFilter_Config         HAL_I2CEx_ConfigAnalogFilter

+#define HAL_I2CEx_DigitalFilter_Config        HAL_I2CEx_ConfigDigitalFilter

+#define HAL_FMPI2CEx_AnalogFilter_Config      HAL_FMPI2CEx_ConfigAnalogFilter

+#define HAL_FMPI2CEx_DigitalFilter_Config     HAL_FMPI2CEx_ConfigDigitalFilter

+

+#define HAL_I2CFastModePlusConfig(SYSCFG_I2CFastModePlus, cmd) (((cmd)==ENABLE)? HAL_I2CEx_EnableFastModePlus(SYSCFG_I2CFastModePlus): HAL_I2CEx_DisableFastModePlus(SYSCFG_I2CFastModePlus))

+

+#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4)

+#define HAL_I2C_Master_Sequential_Transmit_IT  HAL_I2C_Master_Seq_Transmit_IT

+#define HAL_I2C_Master_Sequential_Receive_IT   HAL_I2C_Master_Seq_Receive_IT

+#define HAL_I2C_Slave_Sequential_Transmit_IT   HAL_I2C_Slave_Seq_Transmit_IT

+#define HAL_I2C_Slave_Sequential_Receive_IT    HAL_I2C_Slave_Seq_Receive_IT

+#define HAL_I2C_Master_Sequential_Transmit_DMA HAL_I2C_Master_Seq_Transmit_DMA

+#define HAL_I2C_Master_Sequential_Receive_DMA  HAL_I2C_Master_Seq_Receive_DMA

+#define HAL_I2C_Slave_Sequential_Transmit_DMA  HAL_I2C_Slave_Seq_Transmit_DMA

+#define HAL_I2C_Slave_Sequential_Receive_DMA   HAL_I2C_Slave_Seq_Receive_DMA

+#endif /* STM32H7 || STM32WB  || STM32G0 || STM32F4 || STM32F7 || STM32L0 || STM32L4 */

+

+#if defined(STM32F4)

+#define HAL_FMPI2C_Master_Sequential_Transmit_IT  HAL_FMPI2C_Master_Seq_Transmit_IT

+#define HAL_FMPI2C_Master_Sequential_Receive_IT   HAL_FMPI2C_Master_Seq_Receive_IT

+#define HAL_FMPI2C_Slave_Sequential_Transmit_IT   HAL_FMPI2C_Slave_Seq_Transmit_IT

+#define HAL_FMPI2C_Slave_Sequential_Receive_IT    HAL_FMPI2C_Slave_Seq_Receive_IT

+#define HAL_FMPI2C_Master_Sequential_Transmit_DMA HAL_FMPI2C_Master_Seq_Transmit_DMA

+#define HAL_FMPI2C_Master_Sequential_Receive_DMA  HAL_FMPI2C_Master_Seq_Receive_DMA

+#define HAL_FMPI2C_Slave_Sequential_Transmit_DMA  HAL_FMPI2C_Slave_Seq_Transmit_DMA

+#define HAL_FMPI2C_Slave_Sequential_Receive_DMA   HAL_FMPI2C_Slave_Seq_Receive_DMA

+#endif /* STM32F4 */

+ /**

+  * @}

+  */

+

+/** @defgroup HAL_PWR_Aliased HAL PWR Aliased maintained for legacy purpose

+  * @{

+  */

+#define HAL_PWR_PVDConfig                             HAL_PWR_ConfigPVD

+#define HAL_PWR_DisableBkUpReg                        HAL_PWREx_DisableBkUpReg

+#define HAL_PWR_DisableFlashPowerDown                 HAL_PWREx_DisableFlashPowerDown

+#define HAL_PWR_DisableVddio2Monitor                  HAL_PWREx_DisableVddio2Monitor

+#define HAL_PWR_EnableBkUpReg                         HAL_PWREx_EnableBkUpReg

+#define HAL_PWR_EnableFlashPowerDown                  HAL_PWREx_EnableFlashPowerDown

+#define HAL_PWR_EnableVddio2Monitor                   HAL_PWREx_EnableVddio2Monitor

+#define HAL_PWR_PVD_PVM_IRQHandler                    HAL_PWREx_PVD_PVM_IRQHandler

+#define HAL_PWR_PVDLevelConfig                        HAL_PWR_ConfigPVD

+#define HAL_PWR_Vddio2Monitor_IRQHandler              HAL_PWREx_Vddio2Monitor_IRQHandler

+#define HAL_PWR_Vddio2MonitorCallback                 HAL_PWREx_Vddio2MonitorCallback

+#define HAL_PWREx_ActivateOverDrive                   HAL_PWREx_EnableOverDrive

+#define HAL_PWREx_DeactivateOverDrive                 HAL_PWREx_DisableOverDrive

+#define HAL_PWREx_DisableSDADCAnalog                  HAL_PWREx_DisableSDADC

+#define HAL_PWREx_EnableSDADCAnalog                   HAL_PWREx_EnableSDADC

+#define HAL_PWREx_PVMConfig                           HAL_PWREx_ConfigPVM

+

+#define PWR_MODE_NORMAL                               PWR_PVD_MODE_NORMAL

+#define PWR_MODE_IT_RISING                            PWR_PVD_MODE_IT_RISING

+#define PWR_MODE_IT_FALLING                           PWR_PVD_MODE_IT_FALLING

+#define PWR_MODE_IT_RISING_FALLING                    PWR_PVD_MODE_IT_RISING_FALLING

+#define PWR_MODE_EVENT_RISING                         PWR_PVD_MODE_EVENT_RISING

+#define PWR_MODE_EVENT_FALLING                        PWR_PVD_MODE_EVENT_FALLING

+#define PWR_MODE_EVENT_RISING_FALLING                 PWR_PVD_MODE_EVENT_RISING_FALLING

+

+#define CR_OFFSET_BB                                  PWR_CR_OFFSET_BB

+#define CSR_OFFSET_BB                                 PWR_CSR_OFFSET_BB

+#define PMODE_BIT_NUMBER                              VOS_BIT_NUMBER

+#define CR_PMODE_BB                                   CR_VOS_BB

+

+#define DBP_BitNumber                                 DBP_BIT_NUMBER

+#define PVDE_BitNumber                                PVDE_BIT_NUMBER

+#define PMODE_BitNumber                               PMODE_BIT_NUMBER

+#define EWUP_BitNumber                                EWUP_BIT_NUMBER

+#define FPDS_BitNumber                                FPDS_BIT_NUMBER

+#define ODEN_BitNumber                                ODEN_BIT_NUMBER

+#define ODSWEN_BitNumber                              ODSWEN_BIT_NUMBER

+#define MRLVDS_BitNumber                              MRLVDS_BIT_NUMBER

+#define LPLVDS_BitNumber                              LPLVDS_BIT_NUMBER

+#define BRE_BitNumber                                 BRE_BIT_NUMBER

+

+#define PWR_MODE_EVT                                  PWR_PVD_MODE_NORMAL

+

+ /**

+  * @}

+  */

+

+/** @defgroup HAL_SMBUS_Aliased_Functions HAL SMBUS Aliased Functions maintained for legacy purpose

+  * @{

+  */

+#define HAL_SMBUS_Slave_Listen_IT          HAL_SMBUS_EnableListen_IT

+#define HAL_SMBUS_SlaveAddrCallback        HAL_SMBUS_AddrCallback

+#define HAL_SMBUS_SlaveListenCpltCallback  HAL_SMBUS_ListenCpltCallback

+/**

+  * @}

+  */

+

+/** @defgroup HAL_SPI_Aliased_Functions HAL SPI Aliased Functions maintained for legacy purpose

+  * @{

+  */

+#define HAL_SPI_FlushRxFifo                HAL_SPIEx_FlushRxFifo

+/**

+  * @}

+  */

+

+/** @defgroup HAL_TIM_Aliased_Functions HAL TIM Aliased Functions maintained for legacy purpose

+  * @{

+  */

+#define HAL_TIM_DMADelayPulseCplt                       TIM_DMADelayPulseCplt

+#define HAL_TIM_DMAError                                TIM_DMAError

+#define HAL_TIM_DMACaptureCplt                          TIM_DMACaptureCplt

+#define HAL_TIMEx_DMACommutationCplt                    TIMEx_DMACommutationCplt

+#if defined(STM32H7) || defined(STM32G0) || defined(STM32F7) || defined(STM32F4) || defined(STM32L0) || defined(STM32L4)

+#define HAL_TIM_SlaveConfigSynchronization              HAL_TIM_SlaveConfigSynchro

+#define HAL_TIM_SlaveConfigSynchronization_IT           HAL_TIM_SlaveConfigSynchro_IT

+#define HAL_TIMEx_CommutationCallback                   HAL_TIMEx_CommutCallback

+#define HAL_TIMEx_ConfigCommutationEvent                HAL_TIMEx_ConfigCommutEvent

+#define HAL_TIMEx_ConfigCommutationEvent_IT             HAL_TIMEx_ConfigCommutEvent_IT

+#define HAL_TIMEx_ConfigCommutationEvent_DMA            HAL_TIMEx_ConfigCommutEvent_DMA

+#endif /* STM32H7 || STM32G0 || STM32F7 || STM32F4  || STM32L0 */

+/**

+  * @}

+  */

+

+/** @defgroup HAL_UART_Aliased_Functions HAL UART Aliased Functions maintained for legacy purpose

+  * @{

+  */

+#define HAL_UART_WakeupCallback HAL_UARTEx_WakeupCallback

+/**

+  * @}

+  */

+

+/** @defgroup HAL_LTDC_Aliased_Functions HAL LTDC Aliased Functions maintained for legacy purpose

+  * @{

+  */

+#define HAL_LTDC_LineEvenCallback HAL_LTDC_LineEventCallback

+#define HAL_LTDC_Relaod           HAL_LTDC_Reload

+#define HAL_LTDC_StructInitFromVideoConfig  HAL_LTDCEx_StructInitFromVideoConfig

+#define HAL_LTDC_StructInitFromAdaptedCommandConfig  HAL_LTDCEx_StructInitFromAdaptedCommandConfig

+/**

+  * @}

+  */

+

+

+/** @defgroup HAL_PPP_Aliased_Functions HAL PPP Aliased Functions maintained for legacy purpose

+  * @{

+  */

+

+/**

+  * @}

+  */

+

+/* Exported macros ------------------------------------------------------------*/

+

+/** @defgroup HAL_AES_Aliased_Macros HAL CRYP Aliased Macros maintained for legacy purpose

+  * @{

+  */

+#define AES_IT_CC                      CRYP_IT_CC

+#define AES_IT_ERR                     CRYP_IT_ERR

+#define AES_FLAG_CCF                   CRYP_FLAG_CCF

+/**

+  * @}

+  */

+

+/** @defgroup HAL_Aliased_Macros HAL Generic Aliased Macros maintained for legacy purpose

+  * @{

+  */

+#define __HAL_GET_BOOT_MODE                   __HAL_SYSCFG_GET_BOOT_MODE

+#define __HAL_REMAPMEMORY_FLASH               __HAL_SYSCFG_REMAPMEMORY_FLASH

+#define __HAL_REMAPMEMORY_SYSTEMFLASH         __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH

+#define __HAL_REMAPMEMORY_SRAM                __HAL_SYSCFG_REMAPMEMORY_SRAM

+#define __HAL_REMAPMEMORY_FMC                 __HAL_SYSCFG_REMAPMEMORY_FMC

+#define __HAL_REMAPMEMORY_FMC_SDRAM           __HAL_SYSCFG_REMAPMEMORY_FMC_SDRAM

+#define __HAL_REMAPMEMORY_FSMC                __HAL_SYSCFG_REMAPMEMORY_FSMC

+#define __HAL_REMAPMEMORY_QUADSPI             __HAL_SYSCFG_REMAPMEMORY_QUADSPI

+#define __HAL_FMC_BANK                        __HAL_SYSCFG_FMC_BANK

+#define __HAL_GET_FLAG                        __HAL_SYSCFG_GET_FLAG

+#define __HAL_CLEAR_FLAG                      __HAL_SYSCFG_CLEAR_FLAG

+#define __HAL_VREFINT_OUT_ENABLE              __HAL_SYSCFG_VREFINT_OUT_ENABLE

+#define __HAL_VREFINT_OUT_DISABLE             __HAL_SYSCFG_VREFINT_OUT_DISABLE

+#define __HAL_SYSCFG_SRAM2_WRP_ENABLE         __HAL_SYSCFG_SRAM2_WRP_0_31_ENABLE

+

+#define SYSCFG_FLAG_VREF_READY                SYSCFG_FLAG_VREFINT_READY

+#define SYSCFG_FLAG_RC48                      RCC_FLAG_HSI48

+#define IS_SYSCFG_FASTMODEPLUS_CONFIG         IS_I2C_FASTMODEPLUS

+#define UFB_MODE_BitNumber                    UFB_MODE_BIT_NUMBER

+#define CMP_PD_BitNumber                      CMP_PD_BIT_NUMBER

+

+/**

+  * @}

+  */

+

+

+/** @defgroup HAL_ADC_Aliased_Macros HAL ADC Aliased Macros maintained for legacy purpose

+  * @{

+  */

+#define __ADC_ENABLE                                     __HAL_ADC_ENABLE

+#define __ADC_DISABLE                                    __HAL_ADC_DISABLE

+#define __HAL_ADC_ENABLING_CONDITIONS                    ADC_ENABLING_CONDITIONS

+#define __HAL_ADC_DISABLING_CONDITIONS                   ADC_DISABLING_CONDITIONS

+#define __HAL_ADC_IS_ENABLED                             ADC_IS_ENABLE

+#define __ADC_IS_ENABLED                                 ADC_IS_ENABLE

+#define __HAL_ADC_IS_SOFTWARE_START_REGULAR              ADC_IS_SOFTWARE_START_REGULAR

+#define __HAL_ADC_IS_SOFTWARE_START_INJECTED             ADC_IS_SOFTWARE_START_INJECTED

+#define __HAL_ADC_IS_CONVERSION_ONGOING_REGULAR_INJECTED ADC_IS_CONVERSION_ONGOING_REGULAR_INJECTED

+#define __HAL_ADC_IS_CONVERSION_ONGOING_REGULAR          ADC_IS_CONVERSION_ONGOING_REGULAR

+#define __HAL_ADC_IS_CONVERSION_ONGOING_INJECTED         ADC_IS_CONVERSION_ONGOING_INJECTED

+#define __HAL_ADC_IS_CONVERSION_ONGOING                  ADC_IS_CONVERSION_ONGOING

+#define __HAL_ADC_CLEAR_ERRORCODE                        ADC_CLEAR_ERRORCODE

+

+#define __HAL_ADC_GET_RESOLUTION                         ADC_GET_RESOLUTION

+#define __HAL_ADC_JSQR_RK                                ADC_JSQR_RK

+#define __HAL_ADC_CFGR_AWD1CH                            ADC_CFGR_AWD1CH_SHIFT

+#define __HAL_ADC_CFGR_AWD23CR                           ADC_CFGR_AWD23CR

+#define __HAL_ADC_CFGR_INJECT_AUTO_CONVERSION            ADC_CFGR_INJECT_AUTO_CONVERSION

+#define __HAL_ADC_CFGR_INJECT_CONTEXT_QUEUE              ADC_CFGR_INJECT_CONTEXT_QUEUE

+#define __HAL_ADC_CFGR_INJECT_DISCCONTINUOUS             ADC_CFGR_INJECT_DISCCONTINUOUS

+#define __HAL_ADC_CFGR_REG_DISCCONTINUOUS                ADC_CFGR_REG_DISCCONTINUOUS

+#define __HAL_ADC_CFGR_DISCONTINUOUS_NUM                 ADC_CFGR_DISCONTINUOUS_NUM

+#define __HAL_ADC_CFGR_AUTOWAIT                          ADC_CFGR_AUTOWAIT

+#define __HAL_ADC_CFGR_CONTINUOUS                        ADC_CFGR_CONTINUOUS

+#define __HAL_ADC_CFGR_OVERRUN                           ADC_CFGR_OVERRUN

+#define __HAL_ADC_CFGR_DMACONTREQ                        ADC_CFGR_DMACONTREQ

+#define __HAL_ADC_CFGR_EXTSEL                            ADC_CFGR_EXTSEL_SET

+#define __HAL_ADC_JSQR_JEXTSEL                           ADC_JSQR_JEXTSEL_SET

+#define __HAL_ADC_OFR_CHANNEL                            ADC_OFR_CHANNEL

+#define __HAL_ADC_DIFSEL_CHANNEL                         ADC_DIFSEL_CHANNEL

+#define __HAL_ADC_CALFACT_DIFF_SET                       ADC_CALFACT_DIFF_SET

+#define __HAL_ADC_CALFACT_DIFF_GET                       ADC_CALFACT_DIFF_GET

+#define __HAL_ADC_TRX_HIGHTHRESHOLD                      ADC_TRX_HIGHTHRESHOLD

+

+#define __HAL_ADC_OFFSET_SHIFT_RESOLUTION                ADC_OFFSET_SHIFT_RESOLUTION

+#define __HAL_ADC_AWD1THRESHOLD_SHIFT_RESOLUTION         ADC_AWD1THRESHOLD_SHIFT_RESOLUTION

+#define __HAL_ADC_AWD23THRESHOLD_SHIFT_RESOLUTION        ADC_AWD23THRESHOLD_SHIFT_RESOLUTION

+#define __HAL_ADC_COMMON_REGISTER                        ADC_COMMON_REGISTER

+#define __HAL_ADC_COMMON_CCR_MULTI                       ADC_COMMON_CCR_MULTI

+#define __HAL_ADC_MULTIMODE_IS_ENABLED                   ADC_MULTIMODE_IS_ENABLE

+#define __ADC_MULTIMODE_IS_ENABLED                       ADC_MULTIMODE_IS_ENABLE

+#define __HAL_ADC_NONMULTIMODE_OR_MULTIMODEMASTER        ADC_NONMULTIMODE_OR_MULTIMODEMASTER

+#define __HAL_ADC_COMMON_ADC_OTHER                       ADC_COMMON_ADC_OTHER

+#define __HAL_ADC_MULTI_SLAVE                            ADC_MULTI_SLAVE

+

+#define __HAL_ADC_SQR1_L                                 ADC_SQR1_L_SHIFT

+#define __HAL_ADC_JSQR_JL                                ADC_JSQR_JL_SHIFT

+#define __HAL_ADC_JSQR_RK_JL                             ADC_JSQR_RK_JL

+#define __HAL_ADC_CR1_DISCONTINUOUS_NUM                  ADC_CR1_DISCONTINUOUS_NUM

+#define __HAL_ADC_CR1_SCAN                               ADC_CR1_SCAN_SET

+#define __HAL_ADC_CONVCYCLES_MAX_RANGE                   ADC_CONVCYCLES_MAX_RANGE

+#define __HAL_ADC_CLOCK_PRESCALER_RANGE                  ADC_CLOCK_PRESCALER_RANGE

+#define __HAL_ADC_GET_CLOCK_PRESCALER                    ADC_GET_CLOCK_PRESCALER

+

+#define __HAL_ADC_SQR1                                   ADC_SQR1

+#define __HAL_ADC_SMPR1                                  ADC_SMPR1

+#define __HAL_ADC_SMPR2                                  ADC_SMPR2

+#define __HAL_ADC_SQR3_RK                                ADC_SQR3_RK

+#define __HAL_ADC_SQR2_RK                                ADC_SQR2_RK

+#define __HAL_ADC_SQR1_RK                                ADC_SQR1_RK

+#define __HAL_ADC_CR2_CONTINUOUS                         ADC_CR2_CONTINUOUS

+#define __HAL_ADC_CR1_DISCONTINUOUS                      ADC_CR1_DISCONTINUOUS

+#define __HAL_ADC_CR1_SCANCONV                           ADC_CR1_SCANCONV

+#define __HAL_ADC_CR2_EOCSelection                       ADC_CR2_EOCSelection

+#define __HAL_ADC_CR2_DMAContReq                         ADC_CR2_DMAContReq

+#define __HAL_ADC_JSQR                                   ADC_JSQR

+

+#define __HAL_ADC_CHSELR_CHANNEL                         ADC_CHSELR_CHANNEL

+#define __HAL_ADC_CFGR1_REG_DISCCONTINUOUS               ADC_CFGR1_REG_DISCCONTINUOUS

+#define __HAL_ADC_CFGR1_AUTOOFF                          ADC_CFGR1_AUTOOFF

+#define __HAL_ADC_CFGR1_AUTOWAIT                         ADC_CFGR1_AUTOWAIT

+#define __HAL_ADC_CFGR1_CONTINUOUS                       ADC_CFGR1_CONTINUOUS

+#define __HAL_ADC_CFGR1_OVERRUN                          ADC_CFGR1_OVERRUN

+#define __HAL_ADC_CFGR1_SCANDIR                          ADC_CFGR1_SCANDIR

+#define __HAL_ADC_CFGR1_DMACONTREQ                       ADC_CFGR1_DMACONTREQ

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_DAC_Aliased_Macros HAL DAC Aliased Macros maintained for legacy purpose

+  * @{

+  */

+#define __HAL_DHR12R1_ALIGNEMENT                        DAC_DHR12R1_ALIGNMENT

+#define __HAL_DHR12R2_ALIGNEMENT                        DAC_DHR12R2_ALIGNMENT

+#define __HAL_DHR12RD_ALIGNEMENT                        DAC_DHR12RD_ALIGNMENT

+#define IS_DAC_GENERATE_WAVE                            IS_DAC_WAVE

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_DBGMCU_Aliased_Macros HAL DBGMCU Aliased Macros maintained for legacy purpose

+  * @{

+  */

+#define __HAL_FREEZE_TIM1_DBGMCU __HAL_DBGMCU_FREEZE_TIM1

+#define __HAL_UNFREEZE_TIM1_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM1

+#define __HAL_FREEZE_TIM2_DBGMCU __HAL_DBGMCU_FREEZE_TIM2

+#define __HAL_UNFREEZE_TIM2_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM2

+#define __HAL_FREEZE_TIM3_DBGMCU __HAL_DBGMCU_FREEZE_TIM3

+#define __HAL_UNFREEZE_TIM3_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM3

+#define __HAL_FREEZE_TIM4_DBGMCU __HAL_DBGMCU_FREEZE_TIM4

+#define __HAL_UNFREEZE_TIM4_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM4

+#define __HAL_FREEZE_TIM5_DBGMCU __HAL_DBGMCU_FREEZE_TIM5

+#define __HAL_UNFREEZE_TIM5_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM5

+#define __HAL_FREEZE_TIM6_DBGMCU __HAL_DBGMCU_FREEZE_TIM6

+#define __HAL_UNFREEZE_TIM6_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM6

+#define __HAL_FREEZE_TIM7_DBGMCU __HAL_DBGMCU_FREEZE_TIM7

+#define __HAL_UNFREEZE_TIM7_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM7

+#define __HAL_FREEZE_TIM8_DBGMCU __HAL_DBGMCU_FREEZE_TIM8

+#define __HAL_UNFREEZE_TIM8_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM8

+

+#define __HAL_FREEZE_TIM9_DBGMCU __HAL_DBGMCU_FREEZE_TIM9

+#define __HAL_UNFREEZE_TIM9_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM9

+#define __HAL_FREEZE_TIM10_DBGMCU __HAL_DBGMCU_FREEZE_TIM10

+#define __HAL_UNFREEZE_TIM10_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM10

+#define __HAL_FREEZE_TIM11_DBGMCU __HAL_DBGMCU_FREEZE_TIM11

+#define __HAL_UNFREEZE_TIM11_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM11

+#define __HAL_FREEZE_TIM12_DBGMCU __HAL_DBGMCU_FREEZE_TIM12

+#define __HAL_UNFREEZE_TIM12_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM12

+#define __HAL_FREEZE_TIM13_DBGMCU __HAL_DBGMCU_FREEZE_TIM13

+#define __HAL_UNFREEZE_TIM13_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM13

+#define __HAL_FREEZE_TIM14_DBGMCU __HAL_DBGMCU_FREEZE_TIM14

+#define __HAL_UNFREEZE_TIM14_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM14

+#define __HAL_FREEZE_CAN2_DBGMCU __HAL_DBGMCU_FREEZE_CAN2

+#define __HAL_UNFREEZE_CAN2_DBGMCU __HAL_DBGMCU_UNFREEZE_CAN2

+

+

+#define __HAL_FREEZE_TIM15_DBGMCU __HAL_DBGMCU_FREEZE_TIM15

+#define __HAL_UNFREEZE_TIM15_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM15

+#define __HAL_FREEZE_TIM16_DBGMCU __HAL_DBGMCU_FREEZE_TIM16

+#define __HAL_UNFREEZE_TIM16_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM16

+#define __HAL_FREEZE_TIM17_DBGMCU __HAL_DBGMCU_FREEZE_TIM17

+#define __HAL_UNFREEZE_TIM17_DBGMCU __HAL_DBGMCU_UNFREEZE_TIM17

+#define __HAL_FREEZE_RTC_DBGMCU __HAL_DBGMCU_FREEZE_RTC

+#define __HAL_UNFREEZE_RTC_DBGMCU __HAL_DBGMCU_UNFREEZE_RTC

+#if defined(STM32H7)

+  #define __HAL_FREEZE_WWDG_DBGMCU __HAL_DBGMCU_FREEZE_WWDG1

+  #define __HAL_UNFREEZE_WWDG_DBGMCU __HAL_DBGMCU_UnFreeze_WWDG1

+  #define __HAL_FREEZE_IWDG_DBGMCU __HAL_DBGMCU_FREEZE_IWDG1

+  #define __HAL_UNFREEZE_IWDG_DBGMCU __HAL_DBGMCU_UnFreeze_IWDG1

+#else

+  #define __HAL_FREEZE_WWDG_DBGMCU __HAL_DBGMCU_FREEZE_WWDG

+  #define __HAL_UNFREEZE_WWDG_DBGMCU __HAL_DBGMCU_UNFREEZE_WWDG

+  #define __HAL_FREEZE_IWDG_DBGMCU __HAL_DBGMCU_FREEZE_IWDG

+  #define __HAL_UNFREEZE_IWDG_DBGMCU __HAL_DBGMCU_UNFREEZE_IWDG

+#endif /* STM32H7 */

+#define __HAL_FREEZE_I2C1_TIMEOUT_DBGMCU __HAL_DBGMCU_FREEZE_I2C1_TIMEOUT

+#define __HAL_UNFREEZE_I2C1_TIMEOUT_DBGMCU __HAL_DBGMCU_UNFREEZE_I2C1_TIMEOUT

+#define __HAL_FREEZE_I2C2_TIMEOUT_DBGMCU __HAL_DBGMCU_FREEZE_I2C2_TIMEOUT

+#define __HAL_UNFREEZE_I2C2_TIMEOUT_DBGMCU __HAL_DBGMCU_UNFREEZE_I2C2_TIMEOUT

+#define __HAL_FREEZE_I2C3_TIMEOUT_DBGMCU __HAL_DBGMCU_FREEZE_I2C3_TIMEOUT

+#define __HAL_UNFREEZE_I2C3_TIMEOUT_DBGMCU __HAL_DBGMCU_UNFREEZE_I2C3_TIMEOUT

+#define __HAL_FREEZE_CAN1_DBGMCU __HAL_DBGMCU_FREEZE_CAN1

+#define __HAL_UNFREEZE_CAN1_DBGMCU __HAL_DBGMCU_UNFREEZE_CAN1

+#define __HAL_FREEZE_LPTIM1_DBGMCU __HAL_DBGMCU_FREEZE_LPTIM1

+#define __HAL_UNFREEZE_LPTIM1_DBGMCU __HAL_DBGMCU_UNFREEZE_LPTIM1

+#define __HAL_FREEZE_LPTIM2_DBGMCU __HAL_DBGMCU_FREEZE_LPTIM2

+#define __HAL_UNFREEZE_LPTIM2_DBGMCU __HAL_DBGMCU_UNFREEZE_LPTIM2

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_COMP_Aliased_Macros HAL COMP Aliased Macros maintained for legacy purpose

+  * @{

+  */

+#if defined(STM32F3)

+#define COMP_START                                       __HAL_COMP_ENABLE

+#define COMP_STOP                                        __HAL_COMP_DISABLE

+#define COMP_LOCK                                        __HAL_COMP_LOCK

+

+#if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) || defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx)

+#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__)   (((__EXTILINE__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_RISING_EDGE() : \

+                                                          __HAL_COMP_COMP6_EXTI_ENABLE_RISING_EDGE())

+#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__)  (((__EXTILINE__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_RISING_EDGE() : \

+                                                          __HAL_COMP_COMP6_EXTI_DISABLE_RISING_EDGE())

+#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__)  (((__EXTILINE__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_FALLING_EDGE() : \

+                                                          __HAL_COMP_COMP6_EXTI_ENABLE_FALLING_EDGE())

+#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_FALLING_EDGE() : \

+                                                          __HAL_COMP_COMP6_EXTI_DISABLE_FALLING_EDGE())

+#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__)          (((__EXTILINE__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_IT() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_IT() : \

+                                                          __HAL_COMP_COMP6_EXTI_ENABLE_IT())

+#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__)         (((__EXTILINE__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_IT() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_IT() : \

+                                                          __HAL_COMP_COMP6_EXTI_DISABLE_IT())

+#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__)               (((__FLAG__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_GET_FLAG() : \

+                                                          ((__FLAG__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_GET_FLAG() : \

+                                                          __HAL_COMP_COMP6_EXTI_GET_FLAG())

+#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__)             (((__FLAG__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_CLEAR_FLAG() : \

+                                                          ((__FLAG__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_CLEAR_FLAG() : \

+                                                          __HAL_COMP_COMP6_EXTI_CLEAR_FLAG())

+# endif

+# if defined(STM32F302xE) || defined(STM32F302xC)

+#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__)   (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_RISING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_RISING_EDGE() : \

+                                                          __HAL_COMP_COMP6_EXTI_ENABLE_RISING_EDGE())

+#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__)  (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_RISING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_RISING_EDGE() : \

+                                                          __HAL_COMP_COMP6_EXTI_DISABLE_RISING_EDGE())

+#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__)  (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_FALLING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_FALLING_EDGE() : \

+                                                          __HAL_COMP_COMP6_EXTI_ENABLE_FALLING_EDGE())

+#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_FALLING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_FALLING_EDGE() : \

+                                                          __HAL_COMP_COMP6_EXTI_DISABLE_FALLING_EDGE())

+#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__)          (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_IT() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_IT() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_IT() : \

+                                                          __HAL_COMP_COMP6_EXTI_ENABLE_IT())

+#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__)         (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_IT() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_IT() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_IT() : \

+                                                          __HAL_COMP_COMP6_EXTI_DISABLE_IT())

+#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__)               (((__FLAG__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_GET_FLAG() : \

+                                                          ((__FLAG__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_GET_FLAG() : \

+                                                          ((__FLAG__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_GET_FLAG() : \

+                                                          __HAL_COMP_COMP6_EXTI_GET_FLAG())

+#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__)             (((__FLAG__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_CLEAR_FLAG() : \

+                                                          ((__FLAG__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_CLEAR_FLAG() : \

+                                                          ((__FLAG__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_CLEAR_FLAG() : \

+                                                          __HAL_COMP_COMP6_EXTI_CLEAR_FLAG())

+# endif

+# if defined(STM32F303xE) || defined(STM32F398xx) || defined(STM32F303xC) || defined(STM32F358xx)

+#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__)   (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_RISING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_ENABLE_RISING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_RISING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_ENABLE_RISING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_ENABLE_RISING_EDGE() : \

+                                                          __HAL_COMP_COMP7_EXTI_ENABLE_RISING_EDGE())

+#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__)  (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_RISING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_DISABLE_RISING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_RISING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_DISABLE_RISING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_DISABLE_RISING_EDGE() : \

+                                                          __HAL_COMP_COMP7_EXTI_DISABLE_RISING_EDGE())

+#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__)  (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_FALLING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_ENABLE_FALLING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_FALLING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_ENABLE_FALLING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_ENABLE_FALLING_EDGE() : \

+                                                          __HAL_COMP_COMP7_EXTI_ENABLE_FALLING_EDGE())

+#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_FALLING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_DISABLE_FALLING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_FALLING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_DISABLE_FALLING_EDGE() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_DISABLE_FALLING_EDGE() : \

+                                                          __HAL_COMP_COMP7_EXTI_DISABLE_FALLING_EDGE())

+#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__)          (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_IT() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_ENABLE_IT() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_ENABLE_IT() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_ENABLE_IT() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_ENABLE_IT() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_ENABLE_IT() : \

+                                                          __HAL_COMP_COMP7_EXTI_ENABLE_IT())

+#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__)         (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_IT() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_DISABLE_IT() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_DISABLE_IT() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_DISABLE_IT() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_DISABLE_IT() : \

+                                                          ((__EXTILINE__)  == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_DISABLE_IT() : \

+                                                          __HAL_COMP_COMP7_EXTI_DISABLE_IT())

+#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__)               (((__FLAG__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_GET_FLAG() : \

+                                                          ((__FLAG__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_GET_FLAG() : \

+                                                          ((__FLAG__)  == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_GET_FLAG() : \

+                                                          ((__FLAG__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_GET_FLAG() : \

+                                                          ((__FLAG__)  == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_GET_FLAG() : \

+                                                          ((__FLAG__)  == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_GET_FLAG() : \

+                                                          __HAL_COMP_COMP7_EXTI_GET_FLAG())

+#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__)             (((__FLAG__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_CLEAR_FLAG() : \

+                                                          ((__FLAG__)  == COMP_EXTI_LINE_COMP2) ? __HAL_COMP_COMP2_EXTI_CLEAR_FLAG() : \

+                                                          ((__FLAG__)  == COMP_EXTI_LINE_COMP3) ? __HAL_COMP_COMP3_EXTI_CLEAR_FLAG() : \

+                                                          ((__FLAG__)  == COMP_EXTI_LINE_COMP4) ? __HAL_COMP_COMP4_EXTI_CLEAR_FLAG() : \

+                                                          ((__FLAG__)  == COMP_EXTI_LINE_COMP5) ? __HAL_COMP_COMP5_EXTI_CLEAR_FLAG() : \

+                                                          ((__FLAG__)  == COMP_EXTI_LINE_COMP6) ? __HAL_COMP_COMP6_EXTI_CLEAR_FLAG() : \

+                                                          __HAL_COMP_COMP7_EXTI_CLEAR_FLAG())

+# endif

+# if defined(STM32F373xC) ||defined(STM32F378xx)

+#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__)   (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_RISING_EDGE() : \

+                                                          __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE())

+#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__)  (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_RISING_EDGE() : \

+                                                          __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE())

+#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__)  (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_FALLING_EDGE() : \

+                                                          __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE())

+#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_FALLING_EDGE() : \

+                                                          __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE())

+#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__)          (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_IT() : \

+                                                          __HAL_COMP_COMP2_EXTI_ENABLE_IT())

+#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__)         (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_IT() : \

+                                                          __HAL_COMP_COMP2_EXTI_DISABLE_IT())

+#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__)               (((__FLAG__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_GET_FLAG() : \

+                                                          __HAL_COMP_COMP2_EXTI_GET_FLAG())

+#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__)             (((__FLAG__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_CLEAR_FLAG() : \

+                                                          __HAL_COMP_COMP2_EXTI_CLEAR_FLAG())

+# endif

+#else

+#define __HAL_COMP_EXTI_RISING_IT_ENABLE(__EXTILINE__)   (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_RISING_EDGE() : \

+                                                          __HAL_COMP_COMP2_EXTI_ENABLE_RISING_EDGE())

+#define __HAL_COMP_EXTI_RISING_IT_DISABLE(__EXTILINE__)  (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_RISING_EDGE() : \

+                                                          __HAL_COMP_COMP2_EXTI_DISABLE_RISING_EDGE())

+#define __HAL_COMP_EXTI_FALLING_IT_ENABLE(__EXTILINE__)  (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_FALLING_EDGE() : \

+                                                          __HAL_COMP_COMP2_EXTI_ENABLE_FALLING_EDGE())

+#define __HAL_COMP_EXTI_FALLING_IT_DISABLE(__EXTILINE__) (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_FALLING_EDGE() : \

+                                                          __HAL_COMP_COMP2_EXTI_DISABLE_FALLING_EDGE())

+#define __HAL_COMP_EXTI_ENABLE_IT(__EXTILINE__)          (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_ENABLE_IT() : \

+                                                          __HAL_COMP_COMP2_EXTI_ENABLE_IT())

+#define __HAL_COMP_EXTI_DISABLE_IT(__EXTILINE__)         (((__EXTILINE__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_DISABLE_IT() : \

+                                                          __HAL_COMP_COMP2_EXTI_DISABLE_IT())

+#define __HAL_COMP_EXTI_GET_FLAG(__FLAG__)               (((__FLAG__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_GET_FLAG() : \

+                                                          __HAL_COMP_COMP2_EXTI_GET_FLAG())

+#define __HAL_COMP_EXTI_CLEAR_FLAG(__FLAG__)             (((__FLAG__)  == COMP_EXTI_LINE_COMP1) ? __HAL_COMP_COMP1_EXTI_CLEAR_FLAG() : \

+                                                          __HAL_COMP_COMP2_EXTI_CLEAR_FLAG())

+#endif

+

+#define __HAL_COMP_GET_EXTI_LINE  COMP_GET_EXTI_LINE

+

+#if defined(STM32L0) || defined(STM32L4)

+/* Note: On these STM32 families, the only argument of this macro             */

+/*       is COMP_FLAG_LOCK.                                                   */

+/*       This macro is replaced by __HAL_COMP_IS_LOCKED with only HAL handle  */

+/*       argument.                                                            */

+#define __HAL_COMP_GET_FLAG(__HANDLE__, __FLAG__)  (__HAL_COMP_IS_LOCKED(__HANDLE__))

+#endif

+/**

+  * @}

+  */

+

+#if defined(STM32L0) || defined(STM32L4)

+/** @defgroup HAL_COMP_Aliased_Functions HAL COMP Aliased Functions maintained for legacy purpose

+  * @{

+  */

+#define HAL_COMP_Start_IT       HAL_COMP_Start /* Function considered as legacy as EXTI event or IT configuration is done into HAL_COMP_Init() */

+#define HAL_COMP_Stop_IT        HAL_COMP_Stop  /* Function considered as legacy as EXTI event or IT configuration is done into HAL_COMP_Init() */

+/**

+  * @}

+  */

+#endif

+

+/** @defgroup HAL_DAC_Aliased_Macros HAL DAC Aliased Macros maintained for legacy purpose

+  * @{

+  */

+

+#define IS_DAC_WAVE(WAVE) (((WAVE) == DAC_WAVE_NONE) || \

+                          ((WAVE) == DAC_WAVE_NOISE)|| \

+                          ((WAVE) == DAC_WAVE_TRIANGLE))

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_FLASH_Aliased_Macros HAL FLASH Aliased Macros maintained for legacy purpose

+  * @{

+  */

+

+#define IS_WRPAREA          IS_OB_WRPAREA

+#define IS_TYPEPROGRAM      IS_FLASH_TYPEPROGRAM

+#define IS_TYPEPROGRAMFLASH IS_FLASH_TYPEPROGRAM

+#define IS_TYPEERASE        IS_FLASH_TYPEERASE

+#define IS_NBSECTORS        IS_FLASH_NBSECTORS

+#define IS_OB_WDG_SOURCE    IS_OB_IWDG_SOURCE

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_I2C_Aliased_Macros HAL I2C Aliased Macros maintained for legacy purpose

+  * @{

+  */

+

+#define __HAL_I2C_RESET_CR2             I2C_RESET_CR2

+#define __HAL_I2C_GENERATE_START        I2C_GENERATE_START

+#if defined(STM32F1)

+#define __HAL_I2C_FREQ_RANGE            I2C_FREQRANGE

+#else

+#define __HAL_I2C_FREQ_RANGE            I2C_FREQ_RANGE

+#endif /* STM32F1 */

+#define __HAL_I2C_RISE_TIME             I2C_RISE_TIME

+#define __HAL_I2C_SPEED_STANDARD        I2C_SPEED_STANDARD

+#define __HAL_I2C_SPEED_FAST            I2C_SPEED_FAST

+#define __HAL_I2C_SPEED                 I2C_SPEED

+#define __HAL_I2C_7BIT_ADD_WRITE        I2C_7BIT_ADD_WRITE

+#define __HAL_I2C_7BIT_ADD_READ         I2C_7BIT_ADD_READ

+#define __HAL_I2C_10BIT_ADDRESS         I2C_10BIT_ADDRESS

+#define __HAL_I2C_10BIT_HEADER_WRITE    I2C_10BIT_HEADER_WRITE

+#define __HAL_I2C_10BIT_HEADER_READ     I2C_10BIT_HEADER_READ

+#define __HAL_I2C_MEM_ADD_MSB           I2C_MEM_ADD_MSB

+#define __HAL_I2C_MEM_ADD_LSB           I2C_MEM_ADD_LSB

+#define __HAL_I2C_FREQRANGE             I2C_FREQRANGE

+/**

+  * @}

+  */

+

+/** @defgroup HAL_I2S_Aliased_Macros HAL I2S Aliased Macros maintained for legacy purpose

+  * @{

+  */

+

+#define IS_I2S_INSTANCE                 IS_I2S_ALL_INSTANCE

+#define IS_I2S_INSTANCE_EXT             IS_I2S_ALL_INSTANCE_EXT

+

+#if defined(STM32H7)

+  #define __HAL_I2S_CLEAR_FREFLAG       __HAL_I2S_CLEAR_TIFREFLAG

+#endif

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_IRDA_Aliased_Macros HAL IRDA Aliased Macros maintained for legacy purpose

+  * @{

+  */

+

+#define __IRDA_DISABLE                  __HAL_IRDA_DISABLE

+#define __IRDA_ENABLE                   __HAL_IRDA_ENABLE

+

+#define __HAL_IRDA_GETCLOCKSOURCE       IRDA_GETCLOCKSOURCE

+#define __HAL_IRDA_MASK_COMPUTATION     IRDA_MASK_COMPUTATION

+#define __IRDA_GETCLOCKSOURCE           IRDA_GETCLOCKSOURCE

+#define __IRDA_MASK_COMPUTATION         IRDA_MASK_COMPUTATION

+

+#define IS_IRDA_ONEBIT_SAMPLE           IS_IRDA_ONE_BIT_SAMPLE

+

+

+/**

+  * @}

+  */

+

+

+/** @defgroup HAL_IWDG_Aliased_Macros HAL IWDG Aliased Macros maintained for legacy purpose

+  * @{

+  */

+#define __HAL_IWDG_ENABLE_WRITE_ACCESS  IWDG_ENABLE_WRITE_ACCESS

+#define __HAL_IWDG_DISABLE_WRITE_ACCESS IWDG_DISABLE_WRITE_ACCESS

+/**

+  * @}

+  */

+

+

+/** @defgroup HAL_LPTIM_Aliased_Macros HAL LPTIM Aliased Macros maintained for legacy purpose

+  * @{

+  */

+

+#define __HAL_LPTIM_ENABLE_INTERRUPT    __HAL_LPTIM_ENABLE_IT

+#define __HAL_LPTIM_DISABLE_INTERRUPT   __HAL_LPTIM_DISABLE_IT

+#define __HAL_LPTIM_GET_ITSTATUS        __HAL_LPTIM_GET_IT_SOURCE

+

+/**

+  * @}

+  */

+

+

+/** @defgroup HAL_OPAMP_Aliased_Macros HAL OPAMP Aliased Macros maintained for legacy purpose

+  * @{

+  */

+#define __OPAMP_CSR_OPAXPD                OPAMP_CSR_OPAXPD

+#define __OPAMP_CSR_S3SELX                OPAMP_CSR_S3SELX

+#define __OPAMP_CSR_S4SELX                OPAMP_CSR_S4SELX

+#define __OPAMP_CSR_S5SELX                OPAMP_CSR_S5SELX

+#define __OPAMP_CSR_S6SELX                OPAMP_CSR_S6SELX

+#define __OPAMP_CSR_OPAXCAL_L             OPAMP_CSR_OPAXCAL_L

+#define __OPAMP_CSR_OPAXCAL_H             OPAMP_CSR_OPAXCAL_H

+#define __OPAMP_CSR_OPAXLPM               OPAMP_CSR_OPAXLPM

+#define __OPAMP_CSR_ALL_SWITCHES          OPAMP_CSR_ALL_SWITCHES

+#define __OPAMP_CSR_ANAWSELX              OPAMP_CSR_ANAWSELX

+#define __OPAMP_CSR_OPAXCALOUT            OPAMP_CSR_OPAXCALOUT

+#define __OPAMP_OFFSET_TRIM_BITSPOSITION  OPAMP_OFFSET_TRIM_BITSPOSITION

+#define __OPAMP_OFFSET_TRIM_SET           OPAMP_OFFSET_TRIM_SET

+

+/**

+  * @}

+  */

+

+

+/** @defgroup HAL_PWR_Aliased_Macros HAL PWR Aliased Macros maintained for legacy purpose

+  * @{

+  */

+#define __HAL_PVD_EVENT_DISABLE                                  __HAL_PWR_PVD_EXTI_DISABLE_EVENT

+#define __HAL_PVD_EVENT_ENABLE                                   __HAL_PWR_PVD_EXTI_ENABLE_EVENT

+#define __HAL_PVD_EXTI_FALLINGTRIGGER_DISABLE                    __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE

+#define __HAL_PVD_EXTI_FALLINGTRIGGER_ENABLE                     __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE

+#define __HAL_PVD_EXTI_RISINGTRIGGER_DISABLE                     __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE

+#define __HAL_PVD_EXTI_RISINGTRIGGER_ENABLE                      __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE

+#define __HAL_PVM_EVENT_DISABLE                                  __HAL_PWR_PVM_EVENT_DISABLE

+#define __HAL_PVM_EVENT_ENABLE                                   __HAL_PWR_PVM_EVENT_ENABLE

+#define __HAL_PVM_EXTI_FALLINGTRIGGER_DISABLE                    __HAL_PWR_PVM_EXTI_FALLINGTRIGGER_DISABLE

+#define __HAL_PVM_EXTI_FALLINGTRIGGER_ENABLE                     __HAL_PWR_PVM_EXTI_FALLINGTRIGGER_ENABLE

+#define __HAL_PVM_EXTI_RISINGTRIGGER_DISABLE                     __HAL_PWR_PVM_EXTI_RISINGTRIGGER_DISABLE

+#define __HAL_PVM_EXTI_RISINGTRIGGER_ENABLE                      __HAL_PWR_PVM_EXTI_RISINGTRIGGER_ENABLE

+#define __HAL_PWR_INTERNALWAKEUP_DISABLE                         HAL_PWREx_DisableInternalWakeUpLine

+#define __HAL_PWR_INTERNALWAKEUP_ENABLE                          HAL_PWREx_EnableInternalWakeUpLine

+#define __HAL_PWR_PULL_UP_DOWN_CONFIG_DISABLE                    HAL_PWREx_DisablePullUpPullDownConfig

+#define __HAL_PWR_PULL_UP_DOWN_CONFIG_ENABLE                     HAL_PWREx_EnablePullUpPullDownConfig

+#define __HAL_PWR_PVD_EXTI_CLEAR_EGDE_TRIGGER()                  do { __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE();__HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE(); } while(0)

+#define __HAL_PWR_PVD_EXTI_EVENT_DISABLE                         __HAL_PWR_PVD_EXTI_DISABLE_EVENT

+#define __HAL_PWR_PVD_EXTI_EVENT_ENABLE                          __HAL_PWR_PVD_EXTI_ENABLE_EVENT

+#define __HAL_PWR_PVD_EXTI_FALLINGTRIGGER_DISABLE                __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE

+#define __HAL_PWR_PVD_EXTI_FALLINGTRIGGER_ENABLE                 __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE

+#define __HAL_PWR_PVD_EXTI_RISINGTRIGGER_DISABLE                 __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE

+#define __HAL_PWR_PVD_EXTI_RISINGTRIGGER_ENABLE                  __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE

+#define __HAL_PWR_PVD_EXTI_SET_FALLING_EGDE_TRIGGER              __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE

+#define __HAL_PWR_PVD_EXTI_SET_RISING_EDGE_TRIGGER               __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE

+#define __HAL_PWR_PVM_DISABLE()                                  do { HAL_PWREx_DisablePVM1();HAL_PWREx_DisablePVM2();HAL_PWREx_DisablePVM3();HAL_PWREx_DisablePVM4(); } while(0)

+#define __HAL_PWR_PVM_ENABLE()                                   do { HAL_PWREx_EnablePVM1();HAL_PWREx_EnablePVM2();HAL_PWREx_EnablePVM3();HAL_PWREx_EnablePVM4(); } while(0)

+#define __HAL_PWR_SRAM2CONTENT_PRESERVE_DISABLE                  HAL_PWREx_DisableSRAM2ContentRetention

+#define __HAL_PWR_SRAM2CONTENT_PRESERVE_ENABLE                   HAL_PWREx_EnableSRAM2ContentRetention

+#define __HAL_PWR_VDDIO2_DISABLE                                 HAL_PWREx_DisableVddIO2

+#define __HAL_PWR_VDDIO2_ENABLE                                  HAL_PWREx_EnableVddIO2

+#define __HAL_PWR_VDDIO2_EXTI_CLEAR_EGDE_TRIGGER                 __HAL_PWR_VDDIO2_EXTI_DISABLE_FALLING_EDGE

+#define __HAL_PWR_VDDIO2_EXTI_SET_FALLING_EGDE_TRIGGER           __HAL_PWR_VDDIO2_EXTI_ENABLE_FALLING_EDGE

+#define __HAL_PWR_VDDUSB_DISABLE                                 HAL_PWREx_DisableVddUSB

+#define __HAL_PWR_VDDUSB_ENABLE                                  HAL_PWREx_EnableVddUSB

+

+#if defined (STM32F4)

+#define __HAL_PVD_EXTI_ENABLE_IT(PWR_EXTI_LINE_PVD)         __HAL_PWR_PVD_EXTI_ENABLE_IT()

+#define __HAL_PVD_EXTI_DISABLE_IT(PWR_EXTI_LINE_PVD)        __HAL_PWR_PVD_EXTI_DISABLE_IT()

+#define __HAL_PVD_EXTI_GET_FLAG(PWR_EXTI_LINE_PVD)          __HAL_PWR_PVD_EXTI_GET_FLAG()

+#define __HAL_PVD_EXTI_CLEAR_FLAG(PWR_EXTI_LINE_PVD)        __HAL_PWR_PVD_EXTI_CLEAR_FLAG()

+#define __HAL_PVD_EXTI_GENERATE_SWIT(PWR_EXTI_LINE_PVD)     __HAL_PWR_PVD_EXTI_GENERATE_SWIT()

+#else

+#define __HAL_PVD_EXTI_CLEAR_FLAG                                __HAL_PWR_PVD_EXTI_CLEAR_FLAG

+#define __HAL_PVD_EXTI_DISABLE_IT                                __HAL_PWR_PVD_EXTI_DISABLE_IT

+#define __HAL_PVD_EXTI_ENABLE_IT                                 __HAL_PWR_PVD_EXTI_ENABLE_IT

+#define __HAL_PVD_EXTI_GENERATE_SWIT                             __HAL_PWR_PVD_EXTI_GENERATE_SWIT

+#define __HAL_PVD_EXTI_GET_FLAG                                  __HAL_PWR_PVD_EXTI_GET_FLAG

+#endif /* STM32F4 */

+/**

+  * @}

+  */

+

+

+/** @defgroup HAL_RCC_Aliased HAL RCC Aliased maintained for legacy purpose

+  * @{

+  */

+

+#define RCC_StopWakeUpClock_MSI     RCC_STOP_WAKEUPCLOCK_MSI

+#define RCC_StopWakeUpClock_HSI     RCC_STOP_WAKEUPCLOCK_HSI

+

+#define HAL_RCC_CCSCallback HAL_RCC_CSSCallback

+#define HAL_RC48_EnableBuffer_Cmd(cmd) (((cmd)==ENABLE) ? HAL_RCCEx_EnableHSI48_VREFINT() : HAL_RCCEx_DisableHSI48_VREFINT())

+

+#define __ADC_CLK_DISABLE          __HAL_RCC_ADC_CLK_DISABLE

+#define __ADC_CLK_ENABLE           __HAL_RCC_ADC_CLK_ENABLE

+#define __ADC_CLK_SLEEP_DISABLE    __HAL_RCC_ADC_CLK_SLEEP_DISABLE

+#define __ADC_CLK_SLEEP_ENABLE     __HAL_RCC_ADC_CLK_SLEEP_ENABLE

+#define __ADC_FORCE_RESET          __HAL_RCC_ADC_FORCE_RESET

+#define __ADC_RELEASE_RESET        __HAL_RCC_ADC_RELEASE_RESET

+#define __ADC1_CLK_DISABLE         __HAL_RCC_ADC1_CLK_DISABLE

+#define __ADC1_CLK_ENABLE          __HAL_RCC_ADC1_CLK_ENABLE

+#define __ADC1_FORCE_RESET         __HAL_RCC_ADC1_FORCE_RESET

+#define __ADC1_RELEASE_RESET       __HAL_RCC_ADC1_RELEASE_RESET

+#define __ADC1_CLK_SLEEP_ENABLE    __HAL_RCC_ADC1_CLK_SLEEP_ENABLE

+#define __ADC1_CLK_SLEEP_DISABLE   __HAL_RCC_ADC1_CLK_SLEEP_DISABLE

+#define __ADC2_CLK_DISABLE         __HAL_RCC_ADC2_CLK_DISABLE

+#define __ADC2_CLK_ENABLE          __HAL_RCC_ADC2_CLK_ENABLE

+#define __ADC2_FORCE_RESET __HAL_RCC_ADC2_FORCE_RESET

+#define __ADC2_RELEASE_RESET __HAL_RCC_ADC2_RELEASE_RESET

+#define __ADC3_CLK_DISABLE __HAL_RCC_ADC3_CLK_DISABLE

+#define __ADC3_CLK_ENABLE __HAL_RCC_ADC3_CLK_ENABLE

+#define __ADC3_FORCE_RESET __HAL_RCC_ADC3_FORCE_RESET

+#define __ADC3_RELEASE_RESET __HAL_RCC_ADC3_RELEASE_RESET

+#define __AES_CLK_DISABLE __HAL_RCC_AES_CLK_DISABLE

+#define __AES_CLK_ENABLE __HAL_RCC_AES_CLK_ENABLE

+#define __AES_CLK_SLEEP_DISABLE __HAL_RCC_AES_CLK_SLEEP_DISABLE

+#define __AES_CLK_SLEEP_ENABLE __HAL_RCC_AES_CLK_SLEEP_ENABLE

+#define __AES_FORCE_RESET __HAL_RCC_AES_FORCE_RESET

+#define __AES_RELEASE_RESET __HAL_RCC_AES_RELEASE_RESET

+#define __CRYP_CLK_SLEEP_ENABLE      __HAL_RCC_CRYP_CLK_SLEEP_ENABLE

+#define __CRYP_CLK_SLEEP_DISABLE  __HAL_RCC_CRYP_CLK_SLEEP_DISABLE

+#define __CRYP_CLK_ENABLE  __HAL_RCC_CRYP_CLK_ENABLE

+#define __CRYP_CLK_DISABLE  __HAL_RCC_CRYP_CLK_DISABLE

+#define __CRYP_FORCE_RESET       __HAL_RCC_CRYP_FORCE_RESET

+#define __CRYP_RELEASE_RESET  __HAL_RCC_CRYP_RELEASE_RESET

+#define __AFIO_CLK_DISABLE __HAL_RCC_AFIO_CLK_DISABLE

+#define __AFIO_CLK_ENABLE __HAL_RCC_AFIO_CLK_ENABLE

+#define __AFIO_FORCE_RESET __HAL_RCC_AFIO_FORCE_RESET

+#define __AFIO_RELEASE_RESET __HAL_RCC_AFIO_RELEASE_RESET

+#define __AHB_FORCE_RESET __HAL_RCC_AHB_FORCE_RESET

+#define __AHB_RELEASE_RESET __HAL_RCC_AHB_RELEASE_RESET

+#define __AHB1_FORCE_RESET __HAL_RCC_AHB1_FORCE_RESET

+#define __AHB1_RELEASE_RESET __HAL_RCC_AHB1_RELEASE_RESET

+#define __AHB2_FORCE_RESET __HAL_RCC_AHB2_FORCE_RESET

+#define __AHB2_RELEASE_RESET __HAL_RCC_AHB2_RELEASE_RESET

+#define __AHB3_FORCE_RESET __HAL_RCC_AHB3_FORCE_RESET

+#define __AHB3_RELEASE_RESET __HAL_RCC_AHB3_RELEASE_RESET

+#define __APB1_FORCE_RESET __HAL_RCC_APB1_FORCE_RESET

+#define __APB1_RELEASE_RESET __HAL_RCC_APB1_RELEASE_RESET

+#define __APB2_FORCE_RESET __HAL_RCC_APB2_FORCE_RESET

+#define __APB2_RELEASE_RESET __HAL_RCC_APB2_RELEASE_RESET

+#define __BKP_CLK_DISABLE __HAL_RCC_BKP_CLK_DISABLE

+#define __BKP_CLK_ENABLE __HAL_RCC_BKP_CLK_ENABLE

+#define __BKP_FORCE_RESET __HAL_RCC_BKP_FORCE_RESET

+#define __BKP_RELEASE_RESET __HAL_RCC_BKP_RELEASE_RESET

+#define __CAN1_CLK_DISABLE __HAL_RCC_CAN1_CLK_DISABLE

+#define __CAN1_CLK_ENABLE __HAL_RCC_CAN1_CLK_ENABLE

+#define __CAN1_CLK_SLEEP_DISABLE __HAL_RCC_CAN1_CLK_SLEEP_DISABLE

+#define __CAN1_CLK_SLEEP_ENABLE __HAL_RCC_CAN1_CLK_SLEEP_ENABLE

+#define __CAN1_FORCE_RESET __HAL_RCC_CAN1_FORCE_RESET

+#define __CAN1_RELEASE_RESET __HAL_RCC_CAN1_RELEASE_RESET

+#define __CAN_CLK_DISABLE         __HAL_RCC_CAN1_CLK_DISABLE

+#define __CAN_CLK_ENABLE          __HAL_RCC_CAN1_CLK_ENABLE

+#define __CAN_FORCE_RESET         __HAL_RCC_CAN1_FORCE_RESET

+#define __CAN_RELEASE_RESET       __HAL_RCC_CAN1_RELEASE_RESET

+#define __CAN2_CLK_DISABLE __HAL_RCC_CAN2_CLK_DISABLE

+#define __CAN2_CLK_ENABLE __HAL_RCC_CAN2_CLK_ENABLE

+#define __CAN2_FORCE_RESET __HAL_RCC_CAN2_FORCE_RESET

+#define __CAN2_RELEASE_RESET __HAL_RCC_CAN2_RELEASE_RESET

+#define __CEC_CLK_DISABLE __HAL_RCC_CEC_CLK_DISABLE

+#define __CEC_CLK_ENABLE __HAL_RCC_CEC_CLK_ENABLE

+#define __COMP_CLK_DISABLE        __HAL_RCC_COMP_CLK_DISABLE

+#define __COMP_CLK_ENABLE         __HAL_RCC_COMP_CLK_ENABLE

+#define __COMP_FORCE_RESET        __HAL_RCC_COMP_FORCE_RESET

+#define __COMP_RELEASE_RESET      __HAL_RCC_COMP_RELEASE_RESET

+#define __COMP_CLK_SLEEP_ENABLE   __HAL_RCC_COMP_CLK_SLEEP_ENABLE

+#define __COMP_CLK_SLEEP_DISABLE  __HAL_RCC_COMP_CLK_SLEEP_DISABLE

+#define __CEC_FORCE_RESET __HAL_RCC_CEC_FORCE_RESET

+#define __CEC_RELEASE_RESET __HAL_RCC_CEC_RELEASE_RESET

+#define __CRC_CLK_DISABLE __HAL_RCC_CRC_CLK_DISABLE

+#define __CRC_CLK_ENABLE __HAL_RCC_CRC_CLK_ENABLE

+#define __CRC_CLK_SLEEP_DISABLE __HAL_RCC_CRC_CLK_SLEEP_DISABLE

+#define __CRC_CLK_SLEEP_ENABLE __HAL_RCC_CRC_CLK_SLEEP_ENABLE

+#define __CRC_FORCE_RESET __HAL_RCC_CRC_FORCE_RESET

+#define __CRC_RELEASE_RESET __HAL_RCC_CRC_RELEASE_RESET

+#define __DAC_CLK_DISABLE __HAL_RCC_DAC_CLK_DISABLE

+#define __DAC_CLK_ENABLE __HAL_RCC_DAC_CLK_ENABLE

+#define __DAC_FORCE_RESET __HAL_RCC_DAC_FORCE_RESET

+#define __DAC_RELEASE_RESET __HAL_RCC_DAC_RELEASE_RESET

+#define __DAC1_CLK_DISABLE __HAL_RCC_DAC1_CLK_DISABLE

+#define __DAC1_CLK_ENABLE __HAL_RCC_DAC1_CLK_ENABLE

+#define __DAC1_CLK_SLEEP_DISABLE __HAL_RCC_DAC1_CLK_SLEEP_DISABLE

+#define __DAC1_CLK_SLEEP_ENABLE __HAL_RCC_DAC1_CLK_SLEEP_ENABLE

+#define __DAC1_FORCE_RESET __HAL_RCC_DAC1_FORCE_RESET

+#define __DAC1_RELEASE_RESET __HAL_RCC_DAC1_RELEASE_RESET

+#define __DBGMCU_CLK_ENABLE     __HAL_RCC_DBGMCU_CLK_ENABLE

+#define __DBGMCU_CLK_DISABLE     __HAL_RCC_DBGMCU_CLK_DISABLE

+#define __DBGMCU_FORCE_RESET    __HAL_RCC_DBGMCU_FORCE_RESET

+#define __DBGMCU_RELEASE_RESET  __HAL_RCC_DBGMCU_RELEASE_RESET

+#define __DFSDM_CLK_DISABLE __HAL_RCC_DFSDM_CLK_DISABLE

+#define __DFSDM_CLK_ENABLE __HAL_RCC_DFSDM_CLK_ENABLE

+#define __DFSDM_CLK_SLEEP_DISABLE __HAL_RCC_DFSDM_CLK_SLEEP_DISABLE

+#define __DFSDM_CLK_SLEEP_ENABLE __HAL_RCC_DFSDM_CLK_SLEEP_ENABLE

+#define __DFSDM_FORCE_RESET __HAL_RCC_DFSDM_FORCE_RESET

+#define __DFSDM_RELEASE_RESET __HAL_RCC_DFSDM_RELEASE_RESET

+#define __DMA1_CLK_DISABLE __HAL_RCC_DMA1_CLK_DISABLE

+#define __DMA1_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE

+#define __DMA1_CLK_SLEEP_DISABLE __HAL_RCC_DMA1_CLK_SLEEP_DISABLE

+#define __DMA1_CLK_SLEEP_ENABLE __HAL_RCC_DMA1_CLK_SLEEP_ENABLE

+#define __DMA1_FORCE_RESET __HAL_RCC_DMA1_FORCE_RESET

+#define __DMA1_RELEASE_RESET __HAL_RCC_DMA1_RELEASE_RESET

+#define __DMA2_CLK_DISABLE __HAL_RCC_DMA2_CLK_DISABLE

+#define __DMA2_CLK_ENABLE __HAL_RCC_DMA2_CLK_ENABLE

+#define __DMA2_CLK_SLEEP_DISABLE __HAL_RCC_DMA2_CLK_SLEEP_DISABLE

+#define __DMA2_CLK_SLEEP_ENABLE __HAL_RCC_DMA2_CLK_SLEEP_ENABLE

+#define __DMA2_FORCE_RESET __HAL_RCC_DMA2_FORCE_RESET

+#define __DMA2_RELEASE_RESET __HAL_RCC_DMA2_RELEASE_RESET

+#define __ETHMAC_CLK_DISABLE __HAL_RCC_ETHMAC_CLK_DISABLE

+#define __ETHMAC_CLK_ENABLE __HAL_RCC_ETHMAC_CLK_ENABLE

+#define __ETHMAC_FORCE_RESET __HAL_RCC_ETHMAC_FORCE_RESET

+#define __ETHMAC_RELEASE_RESET __HAL_RCC_ETHMAC_RELEASE_RESET

+#define __ETHMACRX_CLK_DISABLE __HAL_RCC_ETHMACRX_CLK_DISABLE

+#define __ETHMACRX_CLK_ENABLE __HAL_RCC_ETHMACRX_CLK_ENABLE

+#define __ETHMACTX_CLK_DISABLE __HAL_RCC_ETHMACTX_CLK_DISABLE

+#define __ETHMACTX_CLK_ENABLE __HAL_RCC_ETHMACTX_CLK_ENABLE

+#define __FIREWALL_CLK_DISABLE __HAL_RCC_FIREWALL_CLK_DISABLE

+#define __FIREWALL_CLK_ENABLE __HAL_RCC_FIREWALL_CLK_ENABLE

+#define __FLASH_CLK_DISABLE __HAL_RCC_FLASH_CLK_DISABLE

+#define __FLASH_CLK_ENABLE __HAL_RCC_FLASH_CLK_ENABLE

+#define __FLASH_CLK_SLEEP_DISABLE __HAL_RCC_FLASH_CLK_SLEEP_DISABLE

+#define __FLASH_CLK_SLEEP_ENABLE __HAL_RCC_FLASH_CLK_SLEEP_ENABLE

+#define __FLASH_FORCE_RESET __HAL_RCC_FLASH_FORCE_RESET

+#define __FLASH_RELEASE_RESET __HAL_RCC_FLASH_RELEASE_RESET

+#define __FLITF_CLK_DISABLE       __HAL_RCC_FLITF_CLK_DISABLE

+#define __FLITF_CLK_ENABLE        __HAL_RCC_FLITF_CLK_ENABLE

+#define __FLITF_FORCE_RESET       __HAL_RCC_FLITF_FORCE_RESET

+#define __FLITF_RELEASE_RESET     __HAL_RCC_FLITF_RELEASE_RESET

+#define __FLITF_CLK_SLEEP_ENABLE  __HAL_RCC_FLITF_CLK_SLEEP_ENABLE

+#define __FLITF_CLK_SLEEP_DISABLE __HAL_RCC_FLITF_CLK_SLEEP_DISABLE

+#define __FMC_CLK_DISABLE __HAL_RCC_FMC_CLK_DISABLE

+#define __FMC_CLK_ENABLE __HAL_RCC_FMC_CLK_ENABLE

+#define __FMC_CLK_SLEEP_DISABLE __HAL_RCC_FMC_CLK_SLEEP_DISABLE

+#define __FMC_CLK_SLEEP_ENABLE __HAL_RCC_FMC_CLK_SLEEP_ENABLE

+#define __FMC_FORCE_RESET __HAL_RCC_FMC_FORCE_RESET

+#define __FMC_RELEASE_RESET __HAL_RCC_FMC_RELEASE_RESET

+#define __FSMC_CLK_DISABLE __HAL_RCC_FSMC_CLK_DISABLE

+#define __FSMC_CLK_ENABLE __HAL_RCC_FSMC_CLK_ENABLE

+#define __GPIOA_CLK_DISABLE __HAL_RCC_GPIOA_CLK_DISABLE

+#define __GPIOA_CLK_ENABLE __HAL_RCC_GPIOA_CLK_ENABLE

+#define __GPIOA_CLK_SLEEP_DISABLE __HAL_RCC_GPIOA_CLK_SLEEP_DISABLE

+#define __GPIOA_CLK_SLEEP_ENABLE __HAL_RCC_GPIOA_CLK_SLEEP_ENABLE

+#define __GPIOA_FORCE_RESET __HAL_RCC_GPIOA_FORCE_RESET

+#define __GPIOA_RELEASE_RESET __HAL_RCC_GPIOA_RELEASE_RESET

+#define __GPIOB_CLK_DISABLE __HAL_RCC_GPIOB_CLK_DISABLE

+#define __GPIOB_CLK_ENABLE __HAL_RCC_GPIOB_CLK_ENABLE

+#define __GPIOB_CLK_SLEEP_DISABLE __HAL_RCC_GPIOB_CLK_SLEEP_DISABLE

+#define __GPIOB_CLK_SLEEP_ENABLE __HAL_RCC_GPIOB_CLK_SLEEP_ENABLE

+#define __GPIOB_FORCE_RESET __HAL_RCC_GPIOB_FORCE_RESET

+#define __GPIOB_RELEASE_RESET __HAL_RCC_GPIOB_RELEASE_RESET

+#define __GPIOC_CLK_DISABLE __HAL_RCC_GPIOC_CLK_DISABLE

+#define __GPIOC_CLK_ENABLE __HAL_RCC_GPIOC_CLK_ENABLE

+#define __GPIOC_CLK_SLEEP_DISABLE __HAL_RCC_GPIOC_CLK_SLEEP_DISABLE

+#define __GPIOC_CLK_SLEEP_ENABLE __HAL_RCC_GPIOC_CLK_SLEEP_ENABLE

+#define __GPIOC_FORCE_RESET __HAL_RCC_GPIOC_FORCE_RESET

+#define __GPIOC_RELEASE_RESET __HAL_RCC_GPIOC_RELEASE_RESET

+#define __GPIOD_CLK_DISABLE __HAL_RCC_GPIOD_CLK_DISABLE

+#define __GPIOD_CLK_ENABLE __HAL_RCC_GPIOD_CLK_ENABLE

+#define __GPIOD_CLK_SLEEP_DISABLE __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE

+#define __GPIOD_CLK_SLEEP_ENABLE __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE

+#define __GPIOD_FORCE_RESET __HAL_RCC_GPIOD_FORCE_RESET

+#define __GPIOD_RELEASE_RESET __HAL_RCC_GPIOD_RELEASE_RESET

+#define __GPIOE_CLK_DISABLE __HAL_RCC_GPIOE_CLK_DISABLE

+#define __GPIOE_CLK_ENABLE __HAL_RCC_GPIOE_CLK_ENABLE

+#define __GPIOE_CLK_SLEEP_DISABLE __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE

+#define __GPIOE_CLK_SLEEP_ENABLE __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE

+#define __GPIOE_FORCE_RESET __HAL_RCC_GPIOE_FORCE_RESET

+#define __GPIOE_RELEASE_RESET __HAL_RCC_GPIOE_RELEASE_RESET

+#define __GPIOF_CLK_DISABLE __HAL_RCC_GPIOF_CLK_DISABLE

+#define __GPIOF_CLK_ENABLE __HAL_RCC_GPIOF_CLK_ENABLE

+#define __GPIOF_CLK_SLEEP_DISABLE __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE

+#define __GPIOF_CLK_SLEEP_ENABLE __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE

+#define __GPIOF_FORCE_RESET __HAL_RCC_GPIOF_FORCE_RESET

+#define __GPIOF_RELEASE_RESET __HAL_RCC_GPIOF_RELEASE_RESET

+#define __GPIOG_CLK_DISABLE __HAL_RCC_GPIOG_CLK_DISABLE

+#define __GPIOG_CLK_ENABLE __HAL_RCC_GPIOG_CLK_ENABLE

+#define __GPIOG_CLK_SLEEP_DISABLE __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE

+#define __GPIOG_CLK_SLEEP_ENABLE __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE

+#define __GPIOG_FORCE_RESET __HAL_RCC_GPIOG_FORCE_RESET

+#define __GPIOG_RELEASE_RESET __HAL_RCC_GPIOG_RELEASE_RESET

+#define __GPIOH_CLK_DISABLE __HAL_RCC_GPIOH_CLK_DISABLE

+#define __GPIOH_CLK_ENABLE __HAL_RCC_GPIOH_CLK_ENABLE

+#define __GPIOH_CLK_SLEEP_DISABLE __HAL_RCC_GPIOH_CLK_SLEEP_DISABLE

+#define __GPIOH_CLK_SLEEP_ENABLE __HAL_RCC_GPIOH_CLK_SLEEP_ENABLE

+#define __GPIOH_FORCE_RESET __HAL_RCC_GPIOH_FORCE_RESET

+#define __GPIOH_RELEASE_RESET __HAL_RCC_GPIOH_RELEASE_RESET

+#define __I2C1_CLK_DISABLE __HAL_RCC_I2C1_CLK_DISABLE

+#define __I2C1_CLK_ENABLE __HAL_RCC_I2C1_CLK_ENABLE

+#define __I2C1_CLK_SLEEP_DISABLE __HAL_RCC_I2C1_CLK_SLEEP_DISABLE

+#define __I2C1_CLK_SLEEP_ENABLE __HAL_RCC_I2C1_CLK_SLEEP_ENABLE

+#define __I2C1_FORCE_RESET __HAL_RCC_I2C1_FORCE_RESET

+#define __I2C1_RELEASE_RESET __HAL_RCC_I2C1_RELEASE_RESET

+#define __I2C2_CLK_DISABLE __HAL_RCC_I2C2_CLK_DISABLE

+#define __I2C2_CLK_ENABLE __HAL_RCC_I2C2_CLK_ENABLE

+#define __I2C2_CLK_SLEEP_DISABLE __HAL_RCC_I2C2_CLK_SLEEP_DISABLE

+#define __I2C2_CLK_SLEEP_ENABLE __HAL_RCC_I2C2_CLK_SLEEP_ENABLE

+#define __I2C2_FORCE_RESET __HAL_RCC_I2C2_FORCE_RESET

+#define __I2C2_RELEASE_RESET __HAL_RCC_I2C2_RELEASE_RESET

+#define __I2C3_CLK_DISABLE __HAL_RCC_I2C3_CLK_DISABLE

+#define __I2C3_CLK_ENABLE __HAL_RCC_I2C3_CLK_ENABLE

+#define __I2C3_CLK_SLEEP_DISABLE __HAL_RCC_I2C3_CLK_SLEEP_DISABLE

+#define __I2C3_CLK_SLEEP_ENABLE __HAL_RCC_I2C3_CLK_SLEEP_ENABLE

+#define __I2C3_FORCE_RESET __HAL_RCC_I2C3_FORCE_RESET

+#define __I2C3_RELEASE_RESET __HAL_RCC_I2C3_RELEASE_RESET

+#define __LCD_CLK_DISABLE __HAL_RCC_LCD_CLK_DISABLE

+#define __LCD_CLK_ENABLE __HAL_RCC_LCD_CLK_ENABLE

+#define __LCD_CLK_SLEEP_DISABLE __HAL_RCC_LCD_CLK_SLEEP_DISABLE

+#define __LCD_CLK_SLEEP_ENABLE __HAL_RCC_LCD_CLK_SLEEP_ENABLE

+#define __LCD_FORCE_RESET __HAL_RCC_LCD_FORCE_RESET

+#define __LCD_RELEASE_RESET __HAL_RCC_LCD_RELEASE_RESET

+#define __LPTIM1_CLK_DISABLE __HAL_RCC_LPTIM1_CLK_DISABLE

+#define __LPTIM1_CLK_ENABLE __HAL_RCC_LPTIM1_CLK_ENABLE

+#define __LPTIM1_CLK_SLEEP_DISABLE __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE

+#define __LPTIM1_CLK_SLEEP_ENABLE __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE

+#define __LPTIM1_FORCE_RESET __HAL_RCC_LPTIM1_FORCE_RESET

+#define __LPTIM1_RELEASE_RESET __HAL_RCC_LPTIM1_RELEASE_RESET

+#define __LPTIM2_CLK_DISABLE __HAL_RCC_LPTIM2_CLK_DISABLE

+#define __LPTIM2_CLK_ENABLE __HAL_RCC_LPTIM2_CLK_ENABLE

+#define __LPTIM2_CLK_SLEEP_DISABLE __HAL_RCC_LPTIM2_CLK_SLEEP_DISABLE

+#define __LPTIM2_CLK_SLEEP_ENABLE __HAL_RCC_LPTIM2_CLK_SLEEP_ENABLE

+#define __LPTIM2_FORCE_RESET __HAL_RCC_LPTIM2_FORCE_RESET

+#define __LPTIM2_RELEASE_RESET __HAL_RCC_LPTIM2_RELEASE_RESET

+#define __LPUART1_CLK_DISABLE __HAL_RCC_LPUART1_CLK_DISABLE

+#define __LPUART1_CLK_ENABLE __HAL_RCC_LPUART1_CLK_ENABLE

+#define __LPUART1_CLK_SLEEP_DISABLE __HAL_RCC_LPUART1_CLK_SLEEP_DISABLE

+#define __LPUART1_CLK_SLEEP_ENABLE __HAL_RCC_LPUART1_CLK_SLEEP_ENABLE

+#define __LPUART1_FORCE_RESET __HAL_RCC_LPUART1_FORCE_RESET

+#define __LPUART1_RELEASE_RESET __HAL_RCC_LPUART1_RELEASE_RESET

+#define __OPAMP_CLK_DISABLE __HAL_RCC_OPAMP_CLK_DISABLE

+#define __OPAMP_CLK_ENABLE __HAL_RCC_OPAMP_CLK_ENABLE

+#define __OPAMP_CLK_SLEEP_DISABLE __HAL_RCC_OPAMP_CLK_SLEEP_DISABLE

+#define __OPAMP_CLK_SLEEP_ENABLE __HAL_RCC_OPAMP_CLK_SLEEP_ENABLE

+#define __OPAMP_FORCE_RESET __HAL_RCC_OPAMP_FORCE_RESET

+#define __OPAMP_RELEASE_RESET __HAL_RCC_OPAMP_RELEASE_RESET

+#define __OTGFS_CLK_DISABLE __HAL_RCC_OTGFS_CLK_DISABLE

+#define __OTGFS_CLK_ENABLE __HAL_RCC_OTGFS_CLK_ENABLE

+#define __OTGFS_CLK_SLEEP_DISABLE __HAL_RCC_OTGFS_CLK_SLEEP_DISABLE

+#define __OTGFS_CLK_SLEEP_ENABLE __HAL_RCC_OTGFS_CLK_SLEEP_ENABLE

+#define __OTGFS_FORCE_RESET __HAL_RCC_OTGFS_FORCE_RESET

+#define __OTGFS_RELEASE_RESET __HAL_RCC_OTGFS_RELEASE_RESET

+#define __PWR_CLK_DISABLE __HAL_RCC_PWR_CLK_DISABLE

+#define __PWR_CLK_ENABLE __HAL_RCC_PWR_CLK_ENABLE

+#define __PWR_CLK_SLEEP_DISABLE __HAL_RCC_PWR_CLK_SLEEP_DISABLE

+#define __PWR_CLK_SLEEP_ENABLE __HAL_RCC_PWR_CLK_SLEEP_ENABLE

+#define __PWR_FORCE_RESET __HAL_RCC_PWR_FORCE_RESET

+#define __PWR_RELEASE_RESET __HAL_RCC_PWR_RELEASE_RESET

+#define __QSPI_CLK_DISABLE __HAL_RCC_QSPI_CLK_DISABLE

+#define __QSPI_CLK_ENABLE __HAL_RCC_QSPI_CLK_ENABLE

+#define __QSPI_CLK_SLEEP_DISABLE __HAL_RCC_QSPI_CLK_SLEEP_DISABLE

+#define __QSPI_CLK_SLEEP_ENABLE __HAL_RCC_QSPI_CLK_SLEEP_ENABLE

+#define __QSPI_FORCE_RESET __HAL_RCC_QSPI_FORCE_RESET

+#define __QSPI_RELEASE_RESET __HAL_RCC_QSPI_RELEASE_RESET

+

+#if defined(STM32WB)

+#define __HAL_RCC_QSPI_CLK_DISABLE            __HAL_RCC_QUADSPI_CLK_DISABLE

+#define __HAL_RCC_QSPI_CLK_ENABLE             __HAL_RCC_QUADSPI_CLK_ENABLE

+#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE      __HAL_RCC_QUADSPI_CLK_SLEEP_DISABLE

+#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE       __HAL_RCC_QUADSPI_CLK_SLEEP_ENABLE

+#define __HAL_RCC_QSPI_FORCE_RESET            __HAL_RCC_QUADSPI_FORCE_RESET

+#define __HAL_RCC_QSPI_RELEASE_RESET          __HAL_RCC_QUADSPI_RELEASE_RESET

+#define __HAL_RCC_QSPI_IS_CLK_ENABLED         __HAL_RCC_QUADSPI_IS_CLK_ENABLED

+#define __HAL_RCC_QSPI_IS_CLK_DISABLED        __HAL_RCC_QUADSPI_IS_CLK_DISABLED

+#define __HAL_RCC_QSPI_IS_CLK_SLEEP_ENABLED   __HAL_RCC_QUADSPI_IS_CLK_SLEEP_ENABLED

+#define __HAL_RCC_QSPI_IS_CLK_SLEEP_DISABLED  __HAL_RCC_QUADSPI_IS_CLK_SLEEP_DISABLED

+#define QSPI_IRQHandler QUADSPI_IRQHandler

+#endif /* __HAL_RCC_QUADSPI_CLK_ENABLE */

+

+#define __RNG_CLK_DISABLE __HAL_RCC_RNG_CLK_DISABLE

+#define __RNG_CLK_ENABLE __HAL_RCC_RNG_CLK_ENABLE

+#define __RNG_CLK_SLEEP_DISABLE __HAL_RCC_RNG_CLK_SLEEP_DISABLE

+#define __RNG_CLK_SLEEP_ENABLE __HAL_RCC_RNG_CLK_SLEEP_ENABLE

+#define __RNG_FORCE_RESET __HAL_RCC_RNG_FORCE_RESET

+#define __RNG_RELEASE_RESET __HAL_RCC_RNG_RELEASE_RESET

+#define __SAI1_CLK_DISABLE __HAL_RCC_SAI1_CLK_DISABLE

+#define __SAI1_CLK_ENABLE __HAL_RCC_SAI1_CLK_ENABLE

+#define __SAI1_CLK_SLEEP_DISABLE __HAL_RCC_SAI1_CLK_SLEEP_DISABLE

+#define __SAI1_CLK_SLEEP_ENABLE __HAL_RCC_SAI1_CLK_SLEEP_ENABLE

+#define __SAI1_FORCE_RESET __HAL_RCC_SAI1_FORCE_RESET

+#define __SAI1_RELEASE_RESET __HAL_RCC_SAI1_RELEASE_RESET

+#define __SAI2_CLK_DISABLE __HAL_RCC_SAI2_CLK_DISABLE

+#define __SAI2_CLK_ENABLE __HAL_RCC_SAI2_CLK_ENABLE

+#define __SAI2_CLK_SLEEP_DISABLE __HAL_RCC_SAI2_CLK_SLEEP_DISABLE

+#define __SAI2_CLK_SLEEP_ENABLE __HAL_RCC_SAI2_CLK_SLEEP_ENABLE

+#define __SAI2_FORCE_RESET __HAL_RCC_SAI2_FORCE_RESET

+#define __SAI2_RELEASE_RESET __HAL_RCC_SAI2_RELEASE_RESET

+#define __SDIO_CLK_DISABLE __HAL_RCC_SDIO_CLK_DISABLE

+#define __SDIO_CLK_ENABLE __HAL_RCC_SDIO_CLK_ENABLE

+#define __SDMMC_CLK_DISABLE __HAL_RCC_SDMMC_CLK_DISABLE

+#define __SDMMC_CLK_ENABLE __HAL_RCC_SDMMC_CLK_ENABLE

+#define __SDMMC_CLK_SLEEP_DISABLE __HAL_RCC_SDMMC_CLK_SLEEP_DISABLE

+#define __SDMMC_CLK_SLEEP_ENABLE __HAL_RCC_SDMMC_CLK_SLEEP_ENABLE

+#define __SDMMC_FORCE_RESET __HAL_RCC_SDMMC_FORCE_RESET

+#define __SDMMC_RELEASE_RESET __HAL_RCC_SDMMC_RELEASE_RESET

+#define __SPI1_CLK_DISABLE __HAL_RCC_SPI1_CLK_DISABLE

+#define __SPI1_CLK_ENABLE __HAL_RCC_SPI1_CLK_ENABLE

+#define __SPI1_CLK_SLEEP_DISABLE __HAL_RCC_SPI1_CLK_SLEEP_DISABLE

+#define __SPI1_CLK_SLEEP_ENABLE __HAL_RCC_SPI1_CLK_SLEEP_ENABLE

+#define __SPI1_FORCE_RESET __HAL_RCC_SPI1_FORCE_RESET

+#define __SPI1_RELEASE_RESET __HAL_RCC_SPI1_RELEASE_RESET

+#define __SPI2_CLK_DISABLE __HAL_RCC_SPI2_CLK_DISABLE

+#define __SPI2_CLK_ENABLE __HAL_RCC_SPI2_CLK_ENABLE

+#define __SPI2_CLK_SLEEP_DISABLE __HAL_RCC_SPI2_CLK_SLEEP_DISABLE

+#define __SPI2_CLK_SLEEP_ENABLE __HAL_RCC_SPI2_CLK_SLEEP_ENABLE

+#define __SPI2_FORCE_RESET __HAL_RCC_SPI2_FORCE_RESET

+#define __SPI2_RELEASE_RESET __HAL_RCC_SPI2_RELEASE_RESET

+#define __SPI3_CLK_DISABLE __HAL_RCC_SPI3_CLK_DISABLE

+#define __SPI3_CLK_ENABLE __HAL_RCC_SPI3_CLK_ENABLE

+#define __SPI3_CLK_SLEEP_DISABLE __HAL_RCC_SPI3_CLK_SLEEP_DISABLE

+#define __SPI3_CLK_SLEEP_ENABLE __HAL_RCC_SPI3_CLK_SLEEP_ENABLE

+#define __SPI3_FORCE_RESET __HAL_RCC_SPI3_FORCE_RESET

+#define __SPI3_RELEASE_RESET __HAL_RCC_SPI3_RELEASE_RESET

+#define __SRAM_CLK_DISABLE __HAL_RCC_SRAM_CLK_DISABLE

+#define __SRAM_CLK_ENABLE __HAL_RCC_SRAM_CLK_ENABLE

+#define __SRAM1_CLK_SLEEP_DISABLE __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE

+#define __SRAM1_CLK_SLEEP_ENABLE __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE

+#define __SRAM2_CLK_SLEEP_DISABLE __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE

+#define __SRAM2_CLK_SLEEP_ENABLE __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE

+#define __SWPMI1_CLK_DISABLE __HAL_RCC_SWPMI1_CLK_DISABLE

+#define __SWPMI1_CLK_ENABLE __HAL_RCC_SWPMI1_CLK_ENABLE

+#define __SWPMI1_CLK_SLEEP_DISABLE __HAL_RCC_SWPMI1_CLK_SLEEP_DISABLE

+#define __SWPMI1_CLK_SLEEP_ENABLE __HAL_RCC_SWPMI1_CLK_SLEEP_ENABLE

+#define __SWPMI1_FORCE_RESET __HAL_RCC_SWPMI1_FORCE_RESET

+#define __SWPMI1_RELEASE_RESET __HAL_RCC_SWPMI1_RELEASE_RESET

+#define __SYSCFG_CLK_DISABLE __HAL_RCC_SYSCFG_CLK_DISABLE

+#define __SYSCFG_CLK_ENABLE __HAL_RCC_SYSCFG_CLK_ENABLE

+#define __SYSCFG_CLK_SLEEP_DISABLE __HAL_RCC_SYSCFG_CLK_SLEEP_DISABLE

+#define __SYSCFG_CLK_SLEEP_ENABLE __HAL_RCC_SYSCFG_CLK_SLEEP_ENABLE

+#define __SYSCFG_FORCE_RESET __HAL_RCC_SYSCFG_FORCE_RESET

+#define __SYSCFG_RELEASE_RESET __HAL_RCC_SYSCFG_RELEASE_RESET

+#define __TIM1_CLK_DISABLE __HAL_RCC_TIM1_CLK_DISABLE

+#define __TIM1_CLK_ENABLE __HAL_RCC_TIM1_CLK_ENABLE

+#define __TIM1_CLK_SLEEP_DISABLE __HAL_RCC_TIM1_CLK_SLEEP_DISABLE

+#define __TIM1_CLK_SLEEP_ENABLE __HAL_RCC_TIM1_CLK_SLEEP_ENABLE

+#define __TIM1_FORCE_RESET __HAL_RCC_TIM1_FORCE_RESET

+#define __TIM1_RELEASE_RESET __HAL_RCC_TIM1_RELEASE_RESET

+#define __TIM10_CLK_DISABLE __HAL_RCC_TIM10_CLK_DISABLE

+#define __TIM10_CLK_ENABLE __HAL_RCC_TIM10_CLK_ENABLE

+#define __TIM10_FORCE_RESET __HAL_RCC_TIM10_FORCE_RESET

+#define __TIM10_RELEASE_RESET __HAL_RCC_TIM10_RELEASE_RESET

+#define __TIM11_CLK_DISABLE __HAL_RCC_TIM11_CLK_DISABLE

+#define __TIM11_CLK_ENABLE __HAL_RCC_TIM11_CLK_ENABLE

+#define __TIM11_FORCE_RESET __HAL_RCC_TIM11_FORCE_RESET

+#define __TIM11_RELEASE_RESET __HAL_RCC_TIM11_RELEASE_RESET

+#define __TIM12_CLK_DISABLE __HAL_RCC_TIM12_CLK_DISABLE

+#define __TIM12_CLK_ENABLE __HAL_RCC_TIM12_CLK_ENABLE

+#define __TIM12_FORCE_RESET __HAL_RCC_TIM12_FORCE_RESET

+#define __TIM12_RELEASE_RESET __HAL_RCC_TIM12_RELEASE_RESET

+#define __TIM13_CLK_DISABLE __HAL_RCC_TIM13_CLK_DISABLE

+#define __TIM13_CLK_ENABLE __HAL_RCC_TIM13_CLK_ENABLE

+#define __TIM13_FORCE_RESET __HAL_RCC_TIM13_FORCE_RESET

+#define __TIM13_RELEASE_RESET __HAL_RCC_TIM13_RELEASE_RESET

+#define __TIM14_CLK_DISABLE __HAL_RCC_TIM14_CLK_DISABLE

+#define __TIM14_CLK_ENABLE __HAL_RCC_TIM14_CLK_ENABLE

+#define __TIM14_FORCE_RESET __HAL_RCC_TIM14_FORCE_RESET

+#define __TIM14_RELEASE_RESET __HAL_RCC_TIM14_RELEASE_RESET

+#define __TIM15_CLK_DISABLE __HAL_RCC_TIM15_CLK_DISABLE

+#define __TIM15_CLK_ENABLE __HAL_RCC_TIM15_CLK_ENABLE

+#define __TIM15_CLK_SLEEP_DISABLE __HAL_RCC_TIM15_CLK_SLEEP_DISABLE

+#define __TIM15_CLK_SLEEP_ENABLE __HAL_RCC_TIM15_CLK_SLEEP_ENABLE

+#define __TIM15_FORCE_RESET __HAL_RCC_TIM15_FORCE_RESET

+#define __TIM15_RELEASE_RESET __HAL_RCC_TIM15_RELEASE_RESET

+#define __TIM16_CLK_DISABLE __HAL_RCC_TIM16_CLK_DISABLE

+#define __TIM16_CLK_ENABLE __HAL_RCC_TIM16_CLK_ENABLE

+#define __TIM16_CLK_SLEEP_DISABLE __HAL_RCC_TIM16_CLK_SLEEP_DISABLE

+#define __TIM16_CLK_SLEEP_ENABLE __HAL_RCC_TIM16_CLK_SLEEP_ENABLE

+#define __TIM16_FORCE_RESET __HAL_RCC_TIM16_FORCE_RESET

+#define __TIM16_RELEASE_RESET __HAL_RCC_TIM16_RELEASE_RESET

+#define __TIM17_CLK_DISABLE __HAL_RCC_TIM17_CLK_DISABLE

+#define __TIM17_CLK_ENABLE __HAL_RCC_TIM17_CLK_ENABLE

+#define __TIM17_CLK_SLEEP_DISABLE __HAL_RCC_TIM17_CLK_SLEEP_DISABLE

+#define __TIM17_CLK_SLEEP_ENABLE __HAL_RCC_TIM17_CLK_SLEEP_ENABLE

+#define __TIM17_FORCE_RESET __HAL_RCC_TIM17_FORCE_RESET

+#define __TIM17_RELEASE_RESET __HAL_RCC_TIM17_RELEASE_RESET

+#define __TIM2_CLK_DISABLE __HAL_RCC_TIM2_CLK_DISABLE

+#define __TIM2_CLK_ENABLE __HAL_RCC_TIM2_CLK_ENABLE

+#define __TIM2_CLK_SLEEP_DISABLE __HAL_RCC_TIM2_CLK_SLEEP_DISABLE

+#define __TIM2_CLK_SLEEP_ENABLE __HAL_RCC_TIM2_CLK_SLEEP_ENABLE

+#define __TIM2_FORCE_RESET __HAL_RCC_TIM2_FORCE_RESET

+#define __TIM2_RELEASE_RESET __HAL_RCC_TIM2_RELEASE_RESET

+#define __TIM3_CLK_DISABLE __HAL_RCC_TIM3_CLK_DISABLE

+#define __TIM3_CLK_ENABLE __HAL_RCC_TIM3_CLK_ENABLE

+#define __TIM3_CLK_SLEEP_DISABLE __HAL_RCC_TIM3_CLK_SLEEP_DISABLE

+#define __TIM3_CLK_SLEEP_ENABLE __HAL_RCC_TIM3_CLK_SLEEP_ENABLE

+#define __TIM3_FORCE_RESET __HAL_RCC_TIM3_FORCE_RESET

+#define __TIM3_RELEASE_RESET __HAL_RCC_TIM3_RELEASE_RESET

+#define __TIM4_CLK_DISABLE __HAL_RCC_TIM4_CLK_DISABLE

+#define __TIM4_CLK_ENABLE __HAL_RCC_TIM4_CLK_ENABLE

+#define __TIM4_CLK_SLEEP_DISABLE __HAL_RCC_TIM4_CLK_SLEEP_DISABLE

+#define __TIM4_CLK_SLEEP_ENABLE __HAL_RCC_TIM4_CLK_SLEEP_ENABLE

+#define __TIM4_FORCE_RESET __HAL_RCC_TIM4_FORCE_RESET

+#define __TIM4_RELEASE_RESET __HAL_RCC_TIM4_RELEASE_RESET

+#define __TIM5_CLK_DISABLE __HAL_RCC_TIM5_CLK_DISABLE

+#define __TIM5_CLK_ENABLE __HAL_RCC_TIM5_CLK_ENABLE

+#define __TIM5_CLK_SLEEP_DISABLE __HAL_RCC_TIM5_CLK_SLEEP_DISABLE

+#define __TIM5_CLK_SLEEP_ENABLE __HAL_RCC_TIM5_CLK_SLEEP_ENABLE

+#define __TIM5_FORCE_RESET __HAL_RCC_TIM5_FORCE_RESET

+#define __TIM5_RELEASE_RESET __HAL_RCC_TIM5_RELEASE_RESET

+#define __TIM6_CLK_DISABLE __HAL_RCC_TIM6_CLK_DISABLE

+#define __TIM6_CLK_ENABLE __HAL_RCC_TIM6_CLK_ENABLE

+#define __TIM6_CLK_SLEEP_DISABLE __HAL_RCC_TIM6_CLK_SLEEP_DISABLE

+#define __TIM6_CLK_SLEEP_ENABLE __HAL_RCC_TIM6_CLK_SLEEP_ENABLE

+#define __TIM6_FORCE_RESET __HAL_RCC_TIM6_FORCE_RESET

+#define __TIM6_RELEASE_RESET __HAL_RCC_TIM6_RELEASE_RESET

+#define __TIM7_CLK_DISABLE __HAL_RCC_TIM7_CLK_DISABLE

+#define __TIM7_CLK_ENABLE __HAL_RCC_TIM7_CLK_ENABLE

+#define __TIM7_CLK_SLEEP_DISABLE __HAL_RCC_TIM7_CLK_SLEEP_DISABLE

+#define __TIM7_CLK_SLEEP_ENABLE __HAL_RCC_TIM7_CLK_SLEEP_ENABLE

+#define __TIM7_FORCE_RESET __HAL_RCC_TIM7_FORCE_RESET

+#define __TIM7_RELEASE_RESET __HAL_RCC_TIM7_RELEASE_RESET

+#define __TIM8_CLK_DISABLE __HAL_RCC_TIM8_CLK_DISABLE

+#define __TIM8_CLK_ENABLE __HAL_RCC_TIM8_CLK_ENABLE

+#define __TIM8_CLK_SLEEP_DISABLE __HAL_RCC_TIM8_CLK_SLEEP_DISABLE

+#define __TIM8_CLK_SLEEP_ENABLE __HAL_RCC_TIM8_CLK_SLEEP_ENABLE

+#define __TIM8_FORCE_RESET __HAL_RCC_TIM8_FORCE_RESET

+#define __TIM8_RELEASE_RESET __HAL_RCC_TIM8_RELEASE_RESET

+#define __TIM9_CLK_DISABLE __HAL_RCC_TIM9_CLK_DISABLE

+#define __TIM9_CLK_ENABLE __HAL_RCC_TIM9_CLK_ENABLE

+#define __TIM9_FORCE_RESET __HAL_RCC_TIM9_FORCE_RESET

+#define __TIM9_RELEASE_RESET __HAL_RCC_TIM9_RELEASE_RESET

+#define __TSC_CLK_DISABLE __HAL_RCC_TSC_CLK_DISABLE

+#define __TSC_CLK_ENABLE __HAL_RCC_TSC_CLK_ENABLE

+#define __TSC_CLK_SLEEP_DISABLE __HAL_RCC_TSC_CLK_SLEEP_DISABLE

+#define __TSC_CLK_SLEEP_ENABLE __HAL_RCC_TSC_CLK_SLEEP_ENABLE

+#define __TSC_FORCE_RESET __HAL_RCC_TSC_FORCE_RESET

+#define __TSC_RELEASE_RESET __HAL_RCC_TSC_RELEASE_RESET

+#define __UART4_CLK_DISABLE __HAL_RCC_UART4_CLK_DISABLE

+#define __UART4_CLK_ENABLE __HAL_RCC_UART4_CLK_ENABLE

+#define __UART4_CLK_SLEEP_DISABLE __HAL_RCC_UART4_CLK_SLEEP_DISABLE

+#define __UART4_CLK_SLEEP_ENABLE __HAL_RCC_UART4_CLK_SLEEP_ENABLE

+#define __UART4_FORCE_RESET __HAL_RCC_UART4_FORCE_RESET

+#define __UART4_RELEASE_RESET __HAL_RCC_UART4_RELEASE_RESET

+#define __UART5_CLK_DISABLE __HAL_RCC_UART5_CLK_DISABLE

+#define __UART5_CLK_ENABLE __HAL_RCC_UART5_CLK_ENABLE

+#define __UART5_CLK_SLEEP_DISABLE __HAL_RCC_UART5_CLK_SLEEP_DISABLE

+#define __UART5_CLK_SLEEP_ENABLE __HAL_RCC_UART5_CLK_SLEEP_ENABLE

+#define __UART5_FORCE_RESET __HAL_RCC_UART5_FORCE_RESET

+#define __UART5_RELEASE_RESET __HAL_RCC_UART5_RELEASE_RESET

+#define __USART1_CLK_DISABLE __HAL_RCC_USART1_CLK_DISABLE

+#define __USART1_CLK_ENABLE __HAL_RCC_USART1_CLK_ENABLE

+#define __USART1_CLK_SLEEP_DISABLE __HAL_RCC_USART1_CLK_SLEEP_DISABLE

+#define __USART1_CLK_SLEEP_ENABLE __HAL_RCC_USART1_CLK_SLEEP_ENABLE

+#define __USART1_FORCE_RESET __HAL_RCC_USART1_FORCE_RESET

+#define __USART1_RELEASE_RESET __HAL_RCC_USART1_RELEASE_RESET

+#define __USART2_CLK_DISABLE __HAL_RCC_USART2_CLK_DISABLE

+#define __USART2_CLK_ENABLE __HAL_RCC_USART2_CLK_ENABLE

+#define __USART2_CLK_SLEEP_DISABLE __HAL_RCC_USART2_CLK_SLEEP_DISABLE

+#define __USART2_CLK_SLEEP_ENABLE __HAL_RCC_USART2_CLK_SLEEP_ENABLE

+#define __USART2_FORCE_RESET __HAL_RCC_USART2_FORCE_RESET

+#define __USART2_RELEASE_RESET __HAL_RCC_USART2_RELEASE_RESET

+#define __USART3_CLK_DISABLE __HAL_RCC_USART3_CLK_DISABLE

+#define __USART3_CLK_ENABLE __HAL_RCC_USART3_CLK_ENABLE

+#define __USART3_CLK_SLEEP_DISABLE __HAL_RCC_USART3_CLK_SLEEP_DISABLE

+#define __USART3_CLK_SLEEP_ENABLE __HAL_RCC_USART3_CLK_SLEEP_ENABLE

+#define __USART3_FORCE_RESET __HAL_RCC_USART3_FORCE_RESET

+#define __USART3_RELEASE_RESET __HAL_RCC_USART3_RELEASE_RESET

+#define __USART4_CLK_DISABLE        __HAL_RCC_UART4_CLK_DISABLE

+#define __USART4_CLK_ENABLE         __HAL_RCC_UART4_CLK_ENABLE

+#define __USART4_CLK_SLEEP_ENABLE   __HAL_RCC_UART4_CLK_SLEEP_ENABLE

+#define __USART4_CLK_SLEEP_DISABLE  __HAL_RCC_UART4_CLK_SLEEP_DISABLE

+#define __USART4_FORCE_RESET        __HAL_RCC_UART4_FORCE_RESET

+#define __USART4_RELEASE_RESET      __HAL_RCC_UART4_RELEASE_RESET

+#define __USART5_CLK_DISABLE        __HAL_RCC_UART5_CLK_DISABLE

+#define __USART5_CLK_ENABLE         __HAL_RCC_UART5_CLK_ENABLE

+#define __USART5_CLK_SLEEP_ENABLE   __HAL_RCC_UART5_CLK_SLEEP_ENABLE

+#define __USART5_CLK_SLEEP_DISABLE  __HAL_RCC_UART5_CLK_SLEEP_DISABLE

+#define __USART5_FORCE_RESET        __HAL_RCC_UART5_FORCE_RESET

+#define __USART5_RELEASE_RESET      __HAL_RCC_UART5_RELEASE_RESET

+#define __USART7_CLK_DISABLE        __HAL_RCC_UART7_CLK_DISABLE

+#define __USART7_CLK_ENABLE         __HAL_RCC_UART7_CLK_ENABLE

+#define __USART7_FORCE_RESET        __HAL_RCC_UART7_FORCE_RESET

+#define __USART7_RELEASE_RESET      __HAL_RCC_UART7_RELEASE_RESET

+#define __USART8_CLK_DISABLE        __HAL_RCC_UART8_CLK_DISABLE

+#define __USART8_CLK_ENABLE         __HAL_RCC_UART8_CLK_ENABLE

+#define __USART8_FORCE_RESET        __HAL_RCC_UART8_FORCE_RESET

+#define __USART8_RELEASE_RESET      __HAL_RCC_UART8_RELEASE_RESET

+#define __USB_CLK_DISABLE         __HAL_RCC_USB_CLK_DISABLE

+#define __USB_CLK_ENABLE          __HAL_RCC_USB_CLK_ENABLE

+#define __USB_FORCE_RESET         __HAL_RCC_USB_FORCE_RESET

+#define __USB_CLK_SLEEP_ENABLE    __HAL_RCC_USB_CLK_SLEEP_ENABLE

+#define __USB_CLK_SLEEP_DISABLE   __HAL_RCC_USB_CLK_SLEEP_DISABLE

+#define __USB_OTG_FS_CLK_DISABLE __HAL_RCC_USB_OTG_FS_CLK_DISABLE

+#define __USB_OTG_FS_CLK_ENABLE __HAL_RCC_USB_OTG_FS_CLK_ENABLE

+#define __USB_RELEASE_RESET __HAL_RCC_USB_RELEASE_RESET

+

+#if defined(STM32H7)

+#define __HAL_RCC_WWDG_CLK_DISABLE   __HAL_RCC_WWDG1_CLK_DISABLE

+#define __HAL_RCC_WWDG_CLK_ENABLE   __HAL_RCC_WWDG1_CLK_ENABLE

+#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE  __HAL_RCC_WWDG1_CLK_SLEEP_DISABLE

+#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE  __HAL_RCC_WWDG1_CLK_SLEEP_ENABLE

+

+#define __HAL_RCC_WWDG_FORCE_RESET    ((void)0U)  /* Not available on the STM32H7*/

+#define __HAL_RCC_WWDG_RELEASE_RESET ((void)0U) /* Not available on the STM32H7*/

+

+

+#define  __HAL_RCC_WWDG_IS_CLK_ENABLED    __HAL_RCC_WWDG1_IS_CLK_ENABLED

+#define  __HAL_RCC_WWDG_IS_CLK_DISABLED  __HAL_RCC_WWDG1_IS_CLK_DISABLED

+#endif

+

+#define __WWDG_CLK_DISABLE __HAL_RCC_WWDG_CLK_DISABLE

+#define __WWDG_CLK_ENABLE __HAL_RCC_WWDG_CLK_ENABLE

+#define __WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG_CLK_SLEEP_DISABLE

+#define __WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG_CLK_SLEEP_ENABLE

+#define __WWDG_FORCE_RESET __HAL_RCC_WWDG_FORCE_RESET

+#define __WWDG_RELEASE_RESET __HAL_RCC_WWDG_RELEASE_RESET

+

+#define __TIM21_CLK_ENABLE   __HAL_RCC_TIM21_CLK_ENABLE

+#define __TIM21_CLK_DISABLE   __HAL_RCC_TIM21_CLK_DISABLE

+#define __TIM21_FORCE_RESET   __HAL_RCC_TIM21_FORCE_RESET

+#define __TIM21_RELEASE_RESET  __HAL_RCC_TIM21_RELEASE_RESET

+#define __TIM21_CLK_SLEEP_ENABLE   __HAL_RCC_TIM21_CLK_SLEEP_ENABLE

+#define __TIM21_CLK_SLEEP_DISABLE   __HAL_RCC_TIM21_CLK_SLEEP_DISABLE

+#define __TIM22_CLK_ENABLE   __HAL_RCC_TIM22_CLK_ENABLE

+#define __TIM22_CLK_DISABLE   __HAL_RCC_TIM22_CLK_DISABLE

+#define __TIM22_FORCE_RESET   __HAL_RCC_TIM22_FORCE_RESET

+#define __TIM22_RELEASE_RESET  __HAL_RCC_TIM22_RELEASE_RESET

+#define __TIM22_CLK_SLEEP_ENABLE   __HAL_RCC_TIM22_CLK_SLEEP_ENABLE

+#define __TIM22_CLK_SLEEP_DISABLE   __HAL_RCC_TIM22_CLK_SLEEP_DISABLE

+#define __CRS_CLK_DISABLE __HAL_RCC_CRS_CLK_DISABLE

+#define __CRS_CLK_ENABLE __HAL_RCC_CRS_CLK_ENABLE

+#define __CRS_CLK_SLEEP_DISABLE __HAL_RCC_CRS_CLK_SLEEP_DISABLE

+#define __CRS_CLK_SLEEP_ENABLE __HAL_RCC_CRS_CLK_SLEEP_ENABLE

+#define __CRS_FORCE_RESET __HAL_RCC_CRS_FORCE_RESET

+#define __CRS_RELEASE_RESET __HAL_RCC_CRS_RELEASE_RESET

+#define __RCC_BACKUPRESET_FORCE __HAL_RCC_BACKUPRESET_FORCE

+#define __RCC_BACKUPRESET_RELEASE __HAL_RCC_BACKUPRESET_RELEASE

+

+#define __USB_OTG_FS_FORCE_RESET  __HAL_RCC_USB_OTG_FS_FORCE_RESET

+#define __USB_OTG_FS_RELEASE_RESET  __HAL_RCC_USB_OTG_FS_RELEASE_RESET

+#define __USB_OTG_FS_CLK_SLEEP_ENABLE  __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE

+#define __USB_OTG_FS_CLK_SLEEP_DISABLE  __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE

+#define __USB_OTG_HS_CLK_DISABLE  __HAL_RCC_USB_OTG_HS_CLK_DISABLE

+#define __USB_OTG_HS_CLK_ENABLE          __HAL_RCC_USB_OTG_HS_CLK_ENABLE

+#define __USB_OTG_HS_ULPI_CLK_ENABLE  __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE

+#define __USB_OTG_HS_ULPI_CLK_DISABLE  __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE

+#define __TIM9_CLK_SLEEP_ENABLE          __HAL_RCC_TIM9_CLK_SLEEP_ENABLE

+#define __TIM9_CLK_SLEEP_DISABLE  __HAL_RCC_TIM9_CLK_SLEEP_DISABLE

+#define __TIM10_CLK_SLEEP_ENABLE  __HAL_RCC_TIM10_CLK_SLEEP_ENABLE

+#define __TIM10_CLK_SLEEP_DISABLE  __HAL_RCC_TIM10_CLK_SLEEP_DISABLE

+#define __TIM11_CLK_SLEEP_ENABLE  __HAL_RCC_TIM11_CLK_SLEEP_ENABLE

+#define __TIM11_CLK_SLEEP_DISABLE  __HAL_RCC_TIM11_CLK_SLEEP_DISABLE

+#define __ETHMACPTP_CLK_SLEEP_ENABLE  __HAL_RCC_ETHMACPTP_CLK_SLEEP_ENABLE

+#define __ETHMACPTP_CLK_SLEEP_DISABLE  __HAL_RCC_ETHMACPTP_CLK_SLEEP_DISABLE

+#define __ETHMACPTP_CLK_ENABLE          __HAL_RCC_ETHMACPTP_CLK_ENABLE

+#define __ETHMACPTP_CLK_DISABLE          __HAL_RCC_ETHMACPTP_CLK_DISABLE

+#define __HASH_CLK_ENABLE          __HAL_RCC_HASH_CLK_ENABLE

+#define __HASH_FORCE_RESET          __HAL_RCC_HASH_FORCE_RESET

+#define __HASH_RELEASE_RESET          __HAL_RCC_HASH_RELEASE_RESET

+#define __HASH_CLK_SLEEP_ENABLE          __HAL_RCC_HASH_CLK_SLEEP_ENABLE

+#define __HASH_CLK_SLEEP_DISABLE  __HAL_RCC_HASH_CLK_SLEEP_DISABLE

+#define __HASH_CLK_DISABLE            __HAL_RCC_HASH_CLK_DISABLE

+#define __SPI5_CLK_ENABLE          __HAL_RCC_SPI5_CLK_ENABLE

+#define __SPI5_CLK_DISABLE              __HAL_RCC_SPI5_CLK_DISABLE

+#define __SPI5_FORCE_RESET          __HAL_RCC_SPI5_FORCE_RESET

+#define __SPI5_RELEASE_RESET          __HAL_RCC_SPI5_RELEASE_RESET

+#define __SPI5_CLK_SLEEP_ENABLE          __HAL_RCC_SPI5_CLK_SLEEP_ENABLE

+#define __SPI5_CLK_SLEEP_DISABLE  __HAL_RCC_SPI5_CLK_SLEEP_DISABLE

+#define __SPI6_CLK_ENABLE          __HAL_RCC_SPI6_CLK_ENABLE

+#define __SPI6_CLK_DISABLE          __HAL_RCC_SPI6_CLK_DISABLE

+#define __SPI6_FORCE_RESET          __HAL_RCC_SPI6_FORCE_RESET

+#define __SPI6_RELEASE_RESET         __HAL_RCC_SPI6_RELEASE_RESET

+#define __SPI6_CLK_SLEEP_ENABLE          __HAL_RCC_SPI6_CLK_SLEEP_ENABLE

+#define __SPI6_CLK_SLEEP_DISABLE  __HAL_RCC_SPI6_CLK_SLEEP_DISABLE

+#define __LTDC_CLK_ENABLE          __HAL_RCC_LTDC_CLK_ENABLE

+#define __LTDC_CLK_DISABLE          __HAL_RCC_LTDC_CLK_DISABLE

+#define __LTDC_FORCE_RESET          __HAL_RCC_LTDC_FORCE_RESET

+#define __LTDC_RELEASE_RESET          __HAL_RCC_LTDC_RELEASE_RESET

+#define __LTDC_CLK_SLEEP_ENABLE          __HAL_RCC_LTDC_CLK_SLEEP_ENABLE

+#define __ETHMAC_CLK_SLEEP_ENABLE  __HAL_RCC_ETHMAC_CLK_SLEEP_ENABLE

+#define __ETHMAC_CLK_SLEEP_DISABLE  __HAL_RCC_ETHMAC_CLK_SLEEP_DISABLE

+#define __ETHMACTX_CLK_SLEEP_ENABLE  __HAL_RCC_ETHMACTX_CLK_SLEEP_ENABLE

+#define __ETHMACTX_CLK_SLEEP_DISABLE  __HAL_RCC_ETHMACTX_CLK_SLEEP_DISABLE

+#define __ETHMACRX_CLK_SLEEP_ENABLE  __HAL_RCC_ETHMACRX_CLK_SLEEP_ENABLE

+#define __ETHMACRX_CLK_SLEEP_DISABLE  __HAL_RCC_ETHMACRX_CLK_SLEEP_DISABLE

+#define __TIM12_CLK_SLEEP_ENABLE  __HAL_RCC_TIM12_CLK_SLEEP_ENABLE

+#define __TIM12_CLK_SLEEP_DISABLE  __HAL_RCC_TIM12_CLK_SLEEP_DISABLE

+#define __TIM13_CLK_SLEEP_ENABLE  __HAL_RCC_TIM13_CLK_SLEEP_ENABLE

+#define __TIM13_CLK_SLEEP_DISABLE  __HAL_RCC_TIM13_CLK_SLEEP_DISABLE

+#define __TIM14_CLK_SLEEP_ENABLE  __HAL_RCC_TIM14_CLK_SLEEP_ENABLE

+#define __TIM14_CLK_SLEEP_DISABLE  __HAL_RCC_TIM14_CLK_SLEEP_DISABLE

+#define __BKPSRAM_CLK_ENABLE          __HAL_RCC_BKPSRAM_CLK_ENABLE

+#define __BKPSRAM_CLK_DISABLE          __HAL_RCC_BKPSRAM_CLK_DISABLE

+#define __BKPSRAM_CLK_SLEEP_ENABLE  __HAL_RCC_BKPSRAM_CLK_SLEEP_ENABLE

+#define __BKPSRAM_CLK_SLEEP_DISABLE  __HAL_RCC_BKPSRAM_CLK_SLEEP_DISABLE

+#define __CCMDATARAMEN_CLK_ENABLE  __HAL_RCC_CCMDATARAMEN_CLK_ENABLE

+#define __CCMDATARAMEN_CLK_DISABLE  __HAL_RCC_CCMDATARAMEN_CLK_DISABLE

+#define __USART6_CLK_ENABLE          __HAL_RCC_USART6_CLK_ENABLE

+#define __USART6_CLK_DISABLE          __HAL_RCC_USART6_CLK_DISABLE

+#define __USART6_FORCE_RESET        __HAL_RCC_USART6_FORCE_RESET

+#define __USART6_RELEASE_RESET        __HAL_RCC_USART6_RELEASE_RESET

+#define __USART6_CLK_SLEEP_ENABLE  __HAL_RCC_USART6_CLK_SLEEP_ENABLE

+#define __USART6_CLK_SLEEP_DISABLE  __HAL_RCC_USART6_CLK_SLEEP_DISABLE

+#define __SPI4_CLK_ENABLE          __HAL_RCC_SPI4_CLK_ENABLE

+#define __SPI4_CLK_DISABLE          __HAL_RCC_SPI4_CLK_DISABLE

+#define __SPI4_FORCE_RESET          __HAL_RCC_SPI4_FORCE_RESET

+#define __SPI4_RELEASE_RESET        __HAL_RCC_SPI4_RELEASE_RESET

+#define __SPI4_CLK_SLEEP_ENABLE   __HAL_RCC_SPI4_CLK_SLEEP_ENABLE

+#define __SPI4_CLK_SLEEP_DISABLE  __HAL_RCC_SPI4_CLK_SLEEP_DISABLE

+#define __GPIOI_CLK_ENABLE          __HAL_RCC_GPIOI_CLK_ENABLE

+#define __GPIOI_CLK_DISABLE          __HAL_RCC_GPIOI_CLK_DISABLE

+#define __GPIOI_FORCE_RESET          __HAL_RCC_GPIOI_FORCE_RESET

+#define __GPIOI_RELEASE_RESET          __HAL_RCC_GPIOI_RELEASE_RESET

+#define __GPIOI_CLK_SLEEP_ENABLE  __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE

+#define __GPIOI_CLK_SLEEP_DISABLE  __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE

+#define __GPIOJ_CLK_ENABLE          __HAL_RCC_GPIOJ_CLK_ENABLE

+#define __GPIOJ_CLK_DISABLE          __HAL_RCC_GPIOJ_CLK_DISABLE

+#define __GPIOJ_FORCE_RESET         __HAL_RCC_GPIOJ_FORCE_RESET

+#define __GPIOJ_RELEASE_RESET          __HAL_RCC_GPIOJ_RELEASE_RESET

+#define __GPIOJ_CLK_SLEEP_ENABLE  __HAL_RCC_GPIOJ_CLK_SLEEP_ENABLE

+#define __GPIOJ_CLK_SLEEP_DISABLE  __HAL_RCC_GPIOJ_CLK_SLEEP_DISABLE

+#define __GPIOK_CLK_ENABLE          __HAL_RCC_GPIOK_CLK_ENABLE

+#define __GPIOK_CLK_DISABLE          __HAL_RCC_GPIOK_CLK_DISABLE

+#define __GPIOK_RELEASE_RESET          __HAL_RCC_GPIOK_RELEASE_RESET

+#define __GPIOK_CLK_SLEEP_ENABLE  __HAL_RCC_GPIOK_CLK_SLEEP_ENABLE

+#define __GPIOK_CLK_SLEEP_DISABLE  __HAL_RCC_GPIOK_CLK_SLEEP_DISABLE

+#define __ETH_CLK_ENABLE          __HAL_RCC_ETH_CLK_ENABLE

+#define __ETH_CLK_DISABLE          __HAL_RCC_ETH_CLK_DISABLE

+#define __DCMI_CLK_ENABLE          __HAL_RCC_DCMI_CLK_ENABLE

+#define __DCMI_CLK_DISABLE          __HAL_RCC_DCMI_CLK_DISABLE

+#define __DCMI_FORCE_RESET          __HAL_RCC_DCMI_FORCE_RESET

+#define __DCMI_RELEASE_RESET          __HAL_RCC_DCMI_RELEASE_RESET

+#define __DCMI_CLK_SLEEP_ENABLE   __HAL_RCC_DCMI_CLK_SLEEP_ENABLE

+#define __DCMI_CLK_SLEEP_DISABLE  __HAL_RCC_DCMI_CLK_SLEEP_DISABLE

+#define __UART7_CLK_ENABLE          __HAL_RCC_UART7_CLK_ENABLE

+#define __UART7_CLK_DISABLE          __HAL_RCC_UART7_CLK_DISABLE

+#define __UART7_RELEASE_RESET       __HAL_RCC_UART7_RELEASE_RESET

+#define __UART7_FORCE_RESET       __HAL_RCC_UART7_FORCE_RESET

+#define __UART7_CLK_SLEEP_ENABLE  __HAL_RCC_UART7_CLK_SLEEP_ENABLE

+#define __UART7_CLK_SLEEP_DISABLE  __HAL_RCC_UART7_CLK_SLEEP_DISABLE

+#define __UART8_CLK_ENABLE          __HAL_RCC_UART8_CLK_ENABLE

+#define __UART8_CLK_DISABLE          __HAL_RCC_UART8_CLK_DISABLE

+#define __UART8_FORCE_RESET          __HAL_RCC_UART8_FORCE_RESET

+#define __UART8_RELEASE_RESET          __HAL_RCC_UART8_RELEASE_RESET

+#define __UART8_CLK_SLEEP_ENABLE  __HAL_RCC_UART8_CLK_SLEEP_ENABLE

+#define __UART8_CLK_SLEEP_DISABLE  __HAL_RCC_UART8_CLK_SLEEP_DISABLE

+#define __OTGHS_CLK_SLEEP_ENABLE  __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE

+#define __OTGHS_CLK_SLEEP_DISABLE  __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE

+#define __OTGHS_FORCE_RESET          __HAL_RCC_USB_OTG_HS_FORCE_RESET

+#define __OTGHS_RELEASE_RESET          __HAL_RCC_USB_OTG_HS_RELEASE_RESET

+#define __OTGHSULPI_CLK_SLEEP_ENABLE  __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE

+#define __OTGHSULPI_CLK_SLEEP_DISABLE  __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE

+#define __HAL_RCC_OTGHS_CLK_SLEEP_ENABLE  __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE

+#define __HAL_RCC_OTGHS_CLK_SLEEP_DISABLE  __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE

+#define __HAL_RCC_OTGHS_IS_CLK_SLEEP_ENABLED __HAL_RCC_USB_OTG_HS_IS_CLK_SLEEP_ENABLED

+#define __HAL_RCC_OTGHS_IS_CLK_SLEEP_DISABLED __HAL_RCC_USB_OTG_HS_IS_CLK_SLEEP_DISABLED

+#define __HAL_RCC_OTGHS_FORCE_RESET          __HAL_RCC_USB_OTG_HS_FORCE_RESET

+#define __HAL_RCC_OTGHS_RELEASE_RESET          __HAL_RCC_USB_OTG_HS_RELEASE_RESET

+#define __HAL_RCC_OTGHSULPI_CLK_SLEEP_ENABLE      __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE

+#define __HAL_RCC_OTGHSULPI_CLK_SLEEP_DISABLE     __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE

+#define __HAL_RCC_OTGHSULPI_IS_CLK_SLEEP_ENABLED  __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_SLEEP_ENABLED

+#define __HAL_RCC_OTGHSULPI_IS_CLK_SLEEP_DISABLED __HAL_RCC_USB_OTG_HS_ULPI_IS_CLK_SLEEP_DISABLED

+#define __SRAM3_CLK_SLEEP_ENABLE       __HAL_RCC_SRAM3_CLK_SLEEP_ENABLE

+#define __CAN2_CLK_SLEEP_ENABLE        __HAL_RCC_CAN2_CLK_SLEEP_ENABLE

+#define __CAN2_CLK_SLEEP_DISABLE       __HAL_RCC_CAN2_CLK_SLEEP_DISABLE

+#define __DAC_CLK_SLEEP_ENABLE         __HAL_RCC_DAC_CLK_SLEEP_ENABLE

+#define __DAC_CLK_SLEEP_DISABLE        __HAL_RCC_DAC_CLK_SLEEP_DISABLE

+#define __ADC2_CLK_SLEEP_ENABLE        __HAL_RCC_ADC2_CLK_SLEEP_ENABLE

+#define __ADC2_CLK_SLEEP_DISABLE       __HAL_RCC_ADC2_CLK_SLEEP_DISABLE

+#define __ADC3_CLK_SLEEP_ENABLE        __HAL_RCC_ADC3_CLK_SLEEP_ENABLE

+#define __ADC3_CLK_SLEEP_DISABLE       __HAL_RCC_ADC3_CLK_SLEEP_DISABLE

+#define __FSMC_FORCE_RESET             __HAL_RCC_FSMC_FORCE_RESET

+#define __FSMC_RELEASE_RESET           __HAL_RCC_FSMC_RELEASE_RESET

+#define __FSMC_CLK_SLEEP_ENABLE        __HAL_RCC_FSMC_CLK_SLEEP_ENABLE

+#define __FSMC_CLK_SLEEP_DISABLE       __HAL_RCC_FSMC_CLK_SLEEP_DISABLE

+#define __SDIO_FORCE_RESET             __HAL_RCC_SDIO_FORCE_RESET

+#define __SDIO_RELEASE_RESET           __HAL_RCC_SDIO_RELEASE_RESET

+#define __SDIO_CLK_SLEEP_DISABLE       __HAL_RCC_SDIO_CLK_SLEEP_DISABLE

+#define __SDIO_CLK_SLEEP_ENABLE        __HAL_RCC_SDIO_CLK_SLEEP_ENABLE

+#define __DMA2D_CLK_ENABLE             __HAL_RCC_DMA2D_CLK_ENABLE

+#define __DMA2D_CLK_DISABLE            __HAL_RCC_DMA2D_CLK_DISABLE

+#define __DMA2D_FORCE_RESET            __HAL_RCC_DMA2D_FORCE_RESET

+#define __DMA2D_RELEASE_RESET          __HAL_RCC_DMA2D_RELEASE_RESET

+#define __DMA2D_CLK_SLEEP_ENABLE       __HAL_RCC_DMA2D_CLK_SLEEP_ENABLE

+#define __DMA2D_CLK_SLEEP_DISABLE      __HAL_RCC_DMA2D_CLK_SLEEP_DISABLE

+

+/* alias define maintained for legacy */

+#define __HAL_RCC_OTGFS_FORCE_RESET    __HAL_RCC_USB_OTG_FS_FORCE_RESET

+#define __HAL_RCC_OTGFS_RELEASE_RESET  __HAL_RCC_USB_OTG_FS_RELEASE_RESET

+

+#define __ADC12_CLK_ENABLE          __HAL_RCC_ADC12_CLK_ENABLE

+#define __ADC12_CLK_DISABLE         __HAL_RCC_ADC12_CLK_DISABLE

+#define __ADC34_CLK_ENABLE          __HAL_RCC_ADC34_CLK_ENABLE

+#define __ADC34_CLK_DISABLE         __HAL_RCC_ADC34_CLK_DISABLE

+#define __DAC2_CLK_ENABLE           __HAL_RCC_DAC2_CLK_ENABLE

+#define __DAC2_CLK_DISABLE          __HAL_RCC_DAC2_CLK_DISABLE

+#define __TIM18_CLK_ENABLE          __HAL_RCC_TIM18_CLK_ENABLE

+#define __TIM18_CLK_DISABLE         __HAL_RCC_TIM18_CLK_DISABLE

+#define __TIM19_CLK_ENABLE          __HAL_RCC_TIM19_CLK_ENABLE

+#define __TIM19_CLK_DISABLE         __HAL_RCC_TIM19_CLK_DISABLE

+#define __TIM20_CLK_ENABLE          __HAL_RCC_TIM20_CLK_ENABLE

+#define __TIM20_CLK_DISABLE         __HAL_RCC_TIM20_CLK_DISABLE

+#define __HRTIM1_CLK_ENABLE         __HAL_RCC_HRTIM1_CLK_ENABLE

+#define __HRTIM1_CLK_DISABLE        __HAL_RCC_HRTIM1_CLK_DISABLE

+#define __SDADC1_CLK_ENABLE         __HAL_RCC_SDADC1_CLK_ENABLE

+#define __SDADC2_CLK_ENABLE         __HAL_RCC_SDADC2_CLK_ENABLE

+#define __SDADC3_CLK_ENABLE         __HAL_RCC_SDADC3_CLK_ENABLE

+#define __SDADC1_CLK_DISABLE        __HAL_RCC_SDADC1_CLK_DISABLE

+#define __SDADC2_CLK_DISABLE        __HAL_RCC_SDADC2_CLK_DISABLE

+#define __SDADC3_CLK_DISABLE        __HAL_RCC_SDADC3_CLK_DISABLE

+

+#define __ADC12_FORCE_RESET         __HAL_RCC_ADC12_FORCE_RESET

+#define __ADC12_RELEASE_RESET       __HAL_RCC_ADC12_RELEASE_RESET

+#define __ADC34_FORCE_RESET         __HAL_RCC_ADC34_FORCE_RESET

+#define __ADC34_RELEASE_RESET       __HAL_RCC_ADC34_RELEASE_RESET

+#define __DAC2_FORCE_RESET          __HAL_RCC_DAC2_FORCE_RESET

+#define __DAC2_RELEASE_RESET        __HAL_RCC_DAC2_RELEASE_RESET

+#define __TIM18_FORCE_RESET         __HAL_RCC_TIM18_FORCE_RESET

+#define __TIM18_RELEASE_RESET       __HAL_RCC_TIM18_RELEASE_RESET

+#define __TIM19_FORCE_RESET         __HAL_RCC_TIM19_FORCE_RESET

+#define __TIM19_RELEASE_RESET       __HAL_RCC_TIM19_RELEASE_RESET

+#define __TIM20_FORCE_RESET         __HAL_RCC_TIM20_FORCE_RESET

+#define __TIM20_RELEASE_RESET       __HAL_RCC_TIM20_RELEASE_RESET

+#define __HRTIM1_FORCE_RESET        __HAL_RCC_HRTIM1_FORCE_RESET

+#define __HRTIM1_RELEASE_RESET      __HAL_RCC_HRTIM1_RELEASE_RESET

+#define __SDADC1_FORCE_RESET        __HAL_RCC_SDADC1_FORCE_RESET

+#define __SDADC2_FORCE_RESET        __HAL_RCC_SDADC2_FORCE_RESET

+#define __SDADC3_FORCE_RESET        __HAL_RCC_SDADC3_FORCE_RESET

+#define __SDADC1_RELEASE_RESET      __HAL_RCC_SDADC1_RELEASE_RESET

+#define __SDADC2_RELEASE_RESET      __HAL_RCC_SDADC2_RELEASE_RESET

+#define __SDADC3_RELEASE_RESET      __HAL_RCC_SDADC3_RELEASE_RESET

+

+#define __ADC1_IS_CLK_ENABLED       __HAL_RCC_ADC1_IS_CLK_ENABLED

+#define __ADC1_IS_CLK_DISABLED      __HAL_RCC_ADC1_IS_CLK_DISABLED

+#define __ADC12_IS_CLK_ENABLED      __HAL_RCC_ADC12_IS_CLK_ENABLED

+#define __ADC12_IS_CLK_DISABLED     __HAL_RCC_ADC12_IS_CLK_DISABLED

+#define __ADC34_IS_CLK_ENABLED      __HAL_RCC_ADC34_IS_CLK_ENABLED

+#define __ADC34_IS_CLK_DISABLED     __HAL_RCC_ADC34_IS_CLK_DISABLED

+#define __CEC_IS_CLK_ENABLED        __HAL_RCC_CEC_IS_CLK_ENABLED

+#define __CEC_IS_CLK_DISABLED       __HAL_RCC_CEC_IS_CLK_DISABLED

+#define __CRC_IS_CLK_ENABLED        __HAL_RCC_CRC_IS_CLK_ENABLED

+#define __CRC_IS_CLK_DISABLED       __HAL_RCC_CRC_IS_CLK_DISABLED

+#define __DAC1_IS_CLK_ENABLED       __HAL_RCC_DAC1_IS_CLK_ENABLED

+#define __DAC1_IS_CLK_DISABLED      __HAL_RCC_DAC1_IS_CLK_DISABLED

+#define __DAC2_IS_CLK_ENABLED       __HAL_RCC_DAC2_IS_CLK_ENABLED

+#define __DAC2_IS_CLK_DISABLED      __HAL_RCC_DAC2_IS_CLK_DISABLED

+#define __DMA1_IS_CLK_ENABLED       __HAL_RCC_DMA1_IS_CLK_ENABLED

+#define __DMA1_IS_CLK_DISABLED      __HAL_RCC_DMA1_IS_CLK_DISABLED

+#define __DMA2_IS_CLK_ENABLED       __HAL_RCC_DMA2_IS_CLK_ENABLED

+#define __DMA2_IS_CLK_DISABLED      __HAL_RCC_DMA2_IS_CLK_DISABLED

+#define __FLITF_IS_CLK_ENABLED      __HAL_RCC_FLITF_IS_CLK_ENABLED

+#define __FLITF_IS_CLK_DISABLED     __HAL_RCC_FLITF_IS_CLK_DISABLED

+#define __FMC_IS_CLK_ENABLED        __HAL_RCC_FMC_IS_CLK_ENABLED

+#define __FMC_IS_CLK_DISABLED       __HAL_RCC_FMC_IS_CLK_DISABLED

+#define __GPIOA_IS_CLK_ENABLED      __HAL_RCC_GPIOA_IS_CLK_ENABLED

+#define __GPIOA_IS_CLK_DISABLED     __HAL_RCC_GPIOA_IS_CLK_DISABLED

+#define __GPIOB_IS_CLK_ENABLED      __HAL_RCC_GPIOB_IS_CLK_ENABLED

+#define __GPIOB_IS_CLK_DISABLED     __HAL_RCC_GPIOB_IS_CLK_DISABLED

+#define __GPIOC_IS_CLK_ENABLED      __HAL_RCC_GPIOC_IS_CLK_ENABLED

+#define __GPIOC_IS_CLK_DISABLED     __HAL_RCC_GPIOC_IS_CLK_DISABLED

+#define __GPIOD_IS_CLK_ENABLED      __HAL_RCC_GPIOD_IS_CLK_ENABLED

+#define __GPIOD_IS_CLK_DISABLED     __HAL_RCC_GPIOD_IS_CLK_DISABLED

+#define __GPIOE_IS_CLK_ENABLED      __HAL_RCC_GPIOE_IS_CLK_ENABLED

+#define __GPIOE_IS_CLK_DISABLED     __HAL_RCC_GPIOE_IS_CLK_DISABLED

+#define __GPIOF_IS_CLK_ENABLED      __HAL_RCC_GPIOF_IS_CLK_ENABLED

+#define __GPIOF_IS_CLK_DISABLED     __HAL_RCC_GPIOF_IS_CLK_DISABLED

+#define __GPIOG_IS_CLK_ENABLED      __HAL_RCC_GPIOG_IS_CLK_ENABLED

+#define __GPIOG_IS_CLK_DISABLED     __HAL_RCC_GPIOG_IS_CLK_DISABLED

+#define __GPIOH_IS_CLK_ENABLED      __HAL_RCC_GPIOH_IS_CLK_ENABLED

+#define __GPIOH_IS_CLK_DISABLED     __HAL_RCC_GPIOH_IS_CLK_DISABLED

+#define __HRTIM1_IS_CLK_ENABLED     __HAL_RCC_HRTIM1_IS_CLK_ENABLED

+#define __HRTIM1_IS_CLK_DISABLED    __HAL_RCC_HRTIM1_IS_CLK_DISABLED

+#define __I2C1_IS_CLK_ENABLED       __HAL_RCC_I2C1_IS_CLK_ENABLED

+#define __I2C1_IS_CLK_DISABLED      __HAL_RCC_I2C1_IS_CLK_DISABLED

+#define __I2C2_IS_CLK_ENABLED       __HAL_RCC_I2C2_IS_CLK_ENABLED

+#define __I2C2_IS_CLK_DISABLED      __HAL_RCC_I2C2_IS_CLK_DISABLED

+#define __I2C3_IS_CLK_ENABLED       __HAL_RCC_I2C3_IS_CLK_ENABLED

+#define __I2C3_IS_CLK_DISABLED      __HAL_RCC_I2C3_IS_CLK_DISABLED

+#define __PWR_IS_CLK_ENABLED        __HAL_RCC_PWR_IS_CLK_ENABLED

+#define __PWR_IS_CLK_DISABLED       __HAL_RCC_PWR_IS_CLK_DISABLED

+#define __SYSCFG_IS_CLK_ENABLED     __HAL_RCC_SYSCFG_IS_CLK_ENABLED

+#define __SYSCFG_IS_CLK_DISABLED    __HAL_RCC_SYSCFG_IS_CLK_DISABLED

+#define __SPI1_IS_CLK_ENABLED       __HAL_RCC_SPI1_IS_CLK_ENABLED

+#define __SPI1_IS_CLK_DISABLED      __HAL_RCC_SPI1_IS_CLK_DISABLED

+#define __SPI2_IS_CLK_ENABLED       __HAL_RCC_SPI2_IS_CLK_ENABLED

+#define __SPI2_IS_CLK_DISABLED      __HAL_RCC_SPI2_IS_CLK_DISABLED

+#define __SPI3_IS_CLK_ENABLED       __HAL_RCC_SPI3_IS_CLK_ENABLED

+#define __SPI3_IS_CLK_DISABLED      __HAL_RCC_SPI3_IS_CLK_DISABLED

+#define __SPI4_IS_CLK_ENABLED       __HAL_RCC_SPI4_IS_CLK_ENABLED

+#define __SPI4_IS_CLK_DISABLED      __HAL_RCC_SPI4_IS_CLK_DISABLED

+#define __SDADC1_IS_CLK_ENABLED     __HAL_RCC_SDADC1_IS_CLK_ENABLED

+#define __SDADC1_IS_CLK_DISABLED    __HAL_RCC_SDADC1_IS_CLK_DISABLED

+#define __SDADC2_IS_CLK_ENABLED     __HAL_RCC_SDADC2_IS_CLK_ENABLED

+#define __SDADC2_IS_CLK_DISABLED    __HAL_RCC_SDADC2_IS_CLK_DISABLED

+#define __SDADC3_IS_CLK_ENABLED     __HAL_RCC_SDADC3_IS_CLK_ENABLED

+#define __SDADC3_IS_CLK_DISABLED    __HAL_RCC_SDADC3_IS_CLK_DISABLED

+#define __SRAM_IS_CLK_ENABLED       __HAL_RCC_SRAM_IS_CLK_ENABLED

+#define __SRAM_IS_CLK_DISABLED      __HAL_RCC_SRAM_IS_CLK_DISABLED

+#define __TIM1_IS_CLK_ENABLED       __HAL_RCC_TIM1_IS_CLK_ENABLED

+#define __TIM1_IS_CLK_DISABLED      __HAL_RCC_TIM1_IS_CLK_DISABLED

+#define __TIM2_IS_CLK_ENABLED       __HAL_RCC_TIM2_IS_CLK_ENABLED

+#define __TIM2_IS_CLK_DISABLED      __HAL_RCC_TIM2_IS_CLK_DISABLED

+#define __TIM3_IS_CLK_ENABLED       __HAL_RCC_TIM3_IS_CLK_ENABLED

+#define __TIM3_IS_CLK_DISABLED      __HAL_RCC_TIM3_IS_CLK_DISABLED

+#define __TIM4_IS_CLK_ENABLED       __HAL_RCC_TIM4_IS_CLK_ENABLED

+#define __TIM4_IS_CLK_DISABLED      __HAL_RCC_TIM4_IS_CLK_DISABLED

+#define __TIM5_IS_CLK_ENABLED       __HAL_RCC_TIM5_IS_CLK_ENABLED

+#define __TIM5_IS_CLK_DISABLED      __HAL_RCC_TIM5_IS_CLK_DISABLED

+#define __TIM6_IS_CLK_ENABLED       __HAL_RCC_TIM6_IS_CLK_ENABLED

+#define __TIM6_IS_CLK_DISABLED      __HAL_RCC_TIM6_IS_CLK_DISABLED

+#define __TIM7_IS_CLK_ENABLED       __HAL_RCC_TIM7_IS_CLK_ENABLED

+#define __TIM7_IS_CLK_DISABLED      __HAL_RCC_TIM7_IS_CLK_DISABLED

+#define __TIM8_IS_CLK_ENABLED       __HAL_RCC_TIM8_IS_CLK_ENABLED

+#define __TIM8_IS_CLK_DISABLED      __HAL_RCC_TIM8_IS_CLK_DISABLED

+#define __TIM12_IS_CLK_ENABLED      __HAL_RCC_TIM12_IS_CLK_ENABLED

+#define __TIM12_IS_CLK_DISABLED     __HAL_RCC_TIM12_IS_CLK_DISABLED

+#define __TIM13_IS_CLK_ENABLED      __HAL_RCC_TIM13_IS_CLK_ENABLED

+#define __TIM13_IS_CLK_DISABLED     __HAL_RCC_TIM13_IS_CLK_DISABLED

+#define __TIM14_IS_CLK_ENABLED      __HAL_RCC_TIM14_IS_CLK_ENABLED

+#define __TIM14_IS_CLK_DISABLED     __HAL_RCC_TIM14_IS_CLK_DISABLED

+#define __TIM15_IS_CLK_ENABLED      __HAL_RCC_TIM15_IS_CLK_ENABLED

+#define __TIM15_IS_CLK_DISABLED     __HAL_RCC_TIM15_IS_CLK_DISABLED

+#define __TIM16_IS_CLK_ENABLED      __HAL_RCC_TIM16_IS_CLK_ENABLED

+#define __TIM16_IS_CLK_DISABLED     __HAL_RCC_TIM16_IS_CLK_DISABLED

+#define __TIM17_IS_CLK_ENABLED      __HAL_RCC_TIM17_IS_CLK_ENABLED

+#define __TIM17_IS_CLK_DISABLED     __HAL_RCC_TIM17_IS_CLK_DISABLED

+#define __TIM18_IS_CLK_ENABLED      __HAL_RCC_TIM18_IS_CLK_ENABLED

+#define __TIM18_IS_CLK_DISABLED     __HAL_RCC_TIM18_IS_CLK_DISABLED

+#define __TIM19_IS_CLK_ENABLED      __HAL_RCC_TIM19_IS_CLK_ENABLED

+#define __TIM19_IS_CLK_DISABLED     __HAL_RCC_TIM19_IS_CLK_DISABLED

+#define __TIM20_IS_CLK_ENABLED      __HAL_RCC_TIM20_IS_CLK_ENABLED

+#define __TIM20_IS_CLK_DISABLED     __HAL_RCC_TIM20_IS_CLK_DISABLED

+#define __TSC_IS_CLK_ENABLED        __HAL_RCC_TSC_IS_CLK_ENABLED

+#define __TSC_IS_CLK_DISABLED       __HAL_RCC_TSC_IS_CLK_DISABLED

+#define __UART4_IS_CLK_ENABLED      __HAL_RCC_UART4_IS_CLK_ENABLED

+#define __UART4_IS_CLK_DISABLED     __HAL_RCC_UART4_IS_CLK_DISABLED

+#define __UART5_IS_CLK_ENABLED      __HAL_RCC_UART5_IS_CLK_ENABLED

+#define __UART5_IS_CLK_DISABLED     __HAL_RCC_UART5_IS_CLK_DISABLED

+#define __USART1_IS_CLK_ENABLED     __HAL_RCC_USART1_IS_CLK_ENABLED

+#define __USART1_IS_CLK_DISABLED    __HAL_RCC_USART1_IS_CLK_DISABLED

+#define __USART2_IS_CLK_ENABLED     __HAL_RCC_USART2_IS_CLK_ENABLED

+#define __USART2_IS_CLK_DISABLED    __HAL_RCC_USART2_IS_CLK_DISABLED

+#define __USART3_IS_CLK_ENABLED     __HAL_RCC_USART3_IS_CLK_ENABLED

+#define __USART3_IS_CLK_DISABLED    __HAL_RCC_USART3_IS_CLK_DISABLED

+#define __USB_IS_CLK_ENABLED        __HAL_RCC_USB_IS_CLK_ENABLED

+#define __USB_IS_CLK_DISABLED       __HAL_RCC_USB_IS_CLK_DISABLED

+#define __WWDG_IS_CLK_ENABLED       __HAL_RCC_WWDG_IS_CLK_ENABLED

+#define __WWDG_IS_CLK_DISABLED      __HAL_RCC_WWDG_IS_CLK_DISABLED

+

+#if defined(STM32L1)

+#define __HAL_RCC_CRYP_CLK_DISABLE         __HAL_RCC_AES_CLK_DISABLE

+#define __HAL_RCC_CRYP_CLK_ENABLE          __HAL_RCC_AES_CLK_ENABLE

+#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE   __HAL_RCC_AES_CLK_SLEEP_DISABLE

+#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE    __HAL_RCC_AES_CLK_SLEEP_ENABLE

+#define __HAL_RCC_CRYP_FORCE_RESET         __HAL_RCC_AES_FORCE_RESET

+#define __HAL_RCC_CRYP_RELEASE_RESET       __HAL_RCC_AES_RELEASE_RESET

+#endif /* STM32L1 */

+

+#if defined(STM32F4)

+#define __HAL_RCC_SDMMC1_FORCE_RESET       __HAL_RCC_SDIO_FORCE_RESET

+#define __HAL_RCC_SDMMC1_RELEASE_RESET     __HAL_RCC_SDIO_RELEASE_RESET

+#define __HAL_RCC_SDMMC1_CLK_SLEEP_ENABLE  __HAL_RCC_SDIO_CLK_SLEEP_ENABLE

+#define __HAL_RCC_SDMMC1_CLK_SLEEP_DISABLE __HAL_RCC_SDIO_CLK_SLEEP_DISABLE

+#define __HAL_RCC_SDMMC1_CLK_ENABLE        __HAL_RCC_SDIO_CLK_ENABLE

+#define __HAL_RCC_SDMMC1_CLK_DISABLE       __HAL_RCC_SDIO_CLK_DISABLE

+#define __HAL_RCC_SDMMC1_IS_CLK_ENABLED    __HAL_RCC_SDIO_IS_CLK_ENABLED

+#define __HAL_RCC_SDMMC1_IS_CLK_DISABLED   __HAL_RCC_SDIO_IS_CLK_DISABLED

+#define Sdmmc1ClockSelection               SdioClockSelection

+#define RCC_PERIPHCLK_SDMMC1               RCC_PERIPHCLK_SDIO

+#define RCC_SDMMC1CLKSOURCE_CLK48          RCC_SDIOCLKSOURCE_CK48

+#define RCC_SDMMC1CLKSOURCE_SYSCLK         RCC_SDIOCLKSOURCE_SYSCLK

+#define __HAL_RCC_SDMMC1_CONFIG            __HAL_RCC_SDIO_CONFIG

+#define __HAL_RCC_GET_SDMMC1_SOURCE        __HAL_RCC_GET_SDIO_SOURCE

+#endif

+

+#if defined(STM32F7) || defined(STM32L4)

+#define __HAL_RCC_SDIO_FORCE_RESET         __HAL_RCC_SDMMC1_FORCE_RESET

+#define __HAL_RCC_SDIO_RELEASE_RESET       __HAL_RCC_SDMMC1_RELEASE_RESET

+#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE    __HAL_RCC_SDMMC1_CLK_SLEEP_ENABLE

+#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE   __HAL_RCC_SDMMC1_CLK_SLEEP_DISABLE

+#define __HAL_RCC_SDIO_CLK_ENABLE          __HAL_RCC_SDMMC1_CLK_ENABLE

+#define __HAL_RCC_SDIO_CLK_DISABLE         __HAL_RCC_SDMMC1_CLK_DISABLE

+#define __HAL_RCC_SDIO_IS_CLK_ENABLED      __HAL_RCC_SDMMC1_IS_CLK_ENABLED

+#define __HAL_RCC_SDIO_IS_CLK_DISABLED     __HAL_RCC_SDMMC1_IS_CLK_DISABLED

+#define SdioClockSelection                 Sdmmc1ClockSelection

+#define RCC_PERIPHCLK_SDIO                 RCC_PERIPHCLK_SDMMC1

+#define __HAL_RCC_SDIO_CONFIG              __HAL_RCC_SDMMC1_CONFIG

+#define __HAL_RCC_GET_SDIO_SOURCE          __HAL_RCC_GET_SDMMC1_SOURCE

+#endif

+

+#if defined(STM32F7)

+#define RCC_SDIOCLKSOURCE_CLK48             RCC_SDMMC1CLKSOURCE_CLK48

+#define RCC_SDIOCLKSOURCE_SYSCLK           RCC_SDMMC1CLKSOURCE_SYSCLK

+#endif

+

+#if defined(STM32H7)

+#define __HAL_RCC_USB_OTG_HS_CLK_ENABLE()              __HAL_RCC_USB1_OTG_HS_CLK_ENABLE()

+#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE()         __HAL_RCC_USB1_OTG_HS_ULPI_CLK_ENABLE()

+#define __HAL_RCC_USB_OTG_HS_CLK_DISABLE()             __HAL_RCC_USB1_OTG_HS_CLK_DISABLE()

+#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_DISABLE()        __HAL_RCC_USB1_OTG_HS_ULPI_CLK_DISABLE()

+#define __HAL_RCC_USB_OTG_HS_FORCE_RESET()             __HAL_RCC_USB1_OTG_HS_FORCE_RESET()

+#define __HAL_RCC_USB_OTG_HS_RELEASE_RESET()           __HAL_RCC_USB1_OTG_HS_RELEASE_RESET()

+#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_ENABLE()        __HAL_RCC_USB1_OTG_HS_CLK_SLEEP_ENABLE()

+#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_ENABLE()   __HAL_RCC_USB1_OTG_HS_ULPI_CLK_SLEEP_ENABLE()

+#define __HAL_RCC_USB_OTG_HS_CLK_SLEEP_DISABLE()       __HAL_RCC_USB1_OTG_HS_CLK_SLEEP_DISABLE()

+#define __HAL_RCC_USB_OTG_HS_ULPI_CLK_SLEEP_DISABLE()  __HAL_RCC_USB1_OTG_HS_ULPI_CLK_SLEEP_DISABLE()

+

+#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE()             __HAL_RCC_USB2_OTG_FS_CLK_ENABLE()

+#define __HAL_RCC_USB_OTG_FS_ULPI_CLK_ENABLE()        __HAL_RCC_USB2_OTG_FS_ULPI_CLK_ENABLE()

+#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE()            __HAL_RCC_USB2_OTG_FS_CLK_DISABLE()

+#define __HAL_RCC_USB_OTG_FS_ULPI_CLK_DISABLE()       __HAL_RCC_USB2_OTG_FS_ULPI_CLK_DISABLE()

+#define __HAL_RCC_USB_OTG_FS_FORCE_RESET()            __HAL_RCC_USB2_OTG_FS_FORCE_RESET()

+#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET()          __HAL_RCC_USB2_OTG_FS_RELEASE_RESET()

+#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE()       __HAL_RCC_USB2_OTG_FS_CLK_SLEEP_ENABLE()

+#define __HAL_RCC_USB_OTG_FS_ULPI_CLK_SLEEP_ENABLE()  __HAL_RCC_USB2_OTG_FS_ULPI_CLK_SLEEP_ENABLE()

+#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE()      __HAL_RCC_USB2_OTG_FS_CLK_SLEEP_DISABLE()

+#define __HAL_RCC_USB_OTG_FS_ULPI_CLK_SLEEP_DISABLE() __HAL_RCC_USB2_OTG_FS_ULPI_CLK_SLEEP_DISABLE()

+#endif

+

+#define __HAL_RCC_I2SCLK            __HAL_RCC_I2S_CONFIG

+#define __HAL_RCC_I2SCLK_CONFIG     __HAL_RCC_I2S_CONFIG

+

+#define __RCC_PLLSRC                RCC_GET_PLL_OSCSOURCE

+

+#define IS_RCC_MSIRANGE             IS_RCC_MSI_CLOCK_RANGE

+#define IS_RCC_RTCCLK_SOURCE        IS_RCC_RTCCLKSOURCE

+#define IS_RCC_SYSCLK_DIV           IS_RCC_HCLK

+#define IS_RCC_HCLK_DIV             IS_RCC_PCLK

+#define IS_RCC_PERIPHCLK            IS_RCC_PERIPHCLOCK

+

+#define RCC_IT_HSI14                RCC_IT_HSI14RDY

+

+#define RCC_IT_CSSLSE               RCC_IT_LSECSS

+#define RCC_IT_CSSHSE               RCC_IT_CSS

+

+#define RCC_PLLMUL_3                RCC_PLL_MUL3

+#define RCC_PLLMUL_4                RCC_PLL_MUL4

+#define RCC_PLLMUL_6                RCC_PLL_MUL6

+#define RCC_PLLMUL_8                RCC_PLL_MUL8

+#define RCC_PLLMUL_12               RCC_PLL_MUL12

+#define RCC_PLLMUL_16               RCC_PLL_MUL16

+#define RCC_PLLMUL_24               RCC_PLL_MUL24

+#define RCC_PLLMUL_32               RCC_PLL_MUL32

+#define RCC_PLLMUL_48               RCC_PLL_MUL48

+

+#define RCC_PLLDIV_2                RCC_PLL_DIV2

+#define RCC_PLLDIV_3                RCC_PLL_DIV3

+#define RCC_PLLDIV_4                RCC_PLL_DIV4

+

+#define IS_RCC_MCOSOURCE            IS_RCC_MCO1SOURCE

+#define __HAL_RCC_MCO_CONFIG        __HAL_RCC_MCO1_CONFIG

+#define RCC_MCO_NODIV               RCC_MCODIV_1

+#define RCC_MCO_DIV1                RCC_MCODIV_1

+#define RCC_MCO_DIV2                RCC_MCODIV_2

+#define RCC_MCO_DIV4                RCC_MCODIV_4

+#define RCC_MCO_DIV8                RCC_MCODIV_8

+#define RCC_MCO_DIV16               RCC_MCODIV_16

+#define RCC_MCO_DIV32               RCC_MCODIV_32

+#define RCC_MCO_DIV64               RCC_MCODIV_64

+#define RCC_MCO_DIV128              RCC_MCODIV_128

+#define RCC_MCOSOURCE_NONE          RCC_MCO1SOURCE_NOCLOCK

+#define RCC_MCOSOURCE_LSI           RCC_MCO1SOURCE_LSI

+#define RCC_MCOSOURCE_LSE           RCC_MCO1SOURCE_LSE

+#define RCC_MCOSOURCE_SYSCLK        RCC_MCO1SOURCE_SYSCLK

+#define RCC_MCOSOURCE_HSI           RCC_MCO1SOURCE_HSI

+#define RCC_MCOSOURCE_HSI14         RCC_MCO1SOURCE_HSI14

+#define RCC_MCOSOURCE_HSI48         RCC_MCO1SOURCE_HSI48

+#define RCC_MCOSOURCE_HSE           RCC_MCO1SOURCE_HSE

+#define RCC_MCOSOURCE_PLLCLK_DIV1   RCC_MCO1SOURCE_PLLCLK

+#define RCC_MCOSOURCE_PLLCLK_NODIV  RCC_MCO1SOURCE_PLLCLK

+#define RCC_MCOSOURCE_PLLCLK_DIV2   RCC_MCO1SOURCE_PLLCLK_DIV2

+

+#if defined(STM32L4)

+#define RCC_RTCCLKSOURCE_NO_CLK     RCC_RTCCLKSOURCE_NONE

+#elif defined(STM32WB) || defined(STM32G0) || defined(STM32G4) || defined(STM32L5)

+#else

+#define RCC_RTCCLKSOURCE_NONE       RCC_RTCCLKSOURCE_NO_CLK

+#endif

+

+#define RCC_USBCLK_PLLSAI1          RCC_USBCLKSOURCE_PLLSAI1

+#define RCC_USBCLK_PLL              RCC_USBCLKSOURCE_PLL

+#define RCC_USBCLK_MSI              RCC_USBCLKSOURCE_MSI

+#define RCC_USBCLKSOURCE_PLLCLK     RCC_USBCLKSOURCE_PLL

+#define RCC_USBPLLCLK_DIV1          RCC_USBCLKSOURCE_PLL

+#define RCC_USBPLLCLK_DIV1_5        RCC_USBCLKSOURCE_PLL_DIV1_5

+#define RCC_USBPLLCLK_DIV2          RCC_USBCLKSOURCE_PLL_DIV2

+#define RCC_USBPLLCLK_DIV3          RCC_USBCLKSOURCE_PLL_DIV3

+

+#define HSION_BitNumber        RCC_HSION_BIT_NUMBER

+#define HSION_BITNUMBER        RCC_HSION_BIT_NUMBER

+#define HSEON_BitNumber        RCC_HSEON_BIT_NUMBER

+#define HSEON_BITNUMBER        RCC_HSEON_BIT_NUMBER

+#define MSION_BITNUMBER        RCC_MSION_BIT_NUMBER

+#define CSSON_BitNumber        RCC_CSSON_BIT_NUMBER

+#define CSSON_BITNUMBER        RCC_CSSON_BIT_NUMBER

+#define PLLON_BitNumber        RCC_PLLON_BIT_NUMBER

+#define PLLON_BITNUMBER        RCC_PLLON_BIT_NUMBER

+#define PLLI2SON_BitNumber     RCC_PLLI2SON_BIT_NUMBER

+#define I2SSRC_BitNumber       RCC_I2SSRC_BIT_NUMBER

+#define RTCEN_BitNumber        RCC_RTCEN_BIT_NUMBER

+#define RTCEN_BITNUMBER        RCC_RTCEN_BIT_NUMBER

+#define BDRST_BitNumber        RCC_BDRST_BIT_NUMBER

+#define BDRST_BITNUMBER        RCC_BDRST_BIT_NUMBER

+#define RTCRST_BITNUMBER       RCC_RTCRST_BIT_NUMBER

+#define LSION_BitNumber        RCC_LSION_BIT_NUMBER

+#define LSION_BITNUMBER        RCC_LSION_BIT_NUMBER

+#define LSEON_BitNumber        RCC_LSEON_BIT_NUMBER

+#define LSEON_BITNUMBER        RCC_LSEON_BIT_NUMBER

+#define LSEBYP_BITNUMBER       RCC_LSEBYP_BIT_NUMBER

+#define PLLSAION_BitNumber     RCC_PLLSAION_BIT_NUMBER

+#define TIMPRE_BitNumber       RCC_TIMPRE_BIT_NUMBER

+#define RMVF_BitNumber         RCC_RMVF_BIT_NUMBER

+#define RMVF_BITNUMBER         RCC_RMVF_BIT_NUMBER

+#define RCC_CR2_HSI14TRIM_BitNumber RCC_HSI14TRIM_BIT_NUMBER

+#define CR_BYTE2_ADDRESS       RCC_CR_BYTE2_ADDRESS

+#define CIR_BYTE1_ADDRESS      RCC_CIR_BYTE1_ADDRESS

+#define CIR_BYTE2_ADDRESS      RCC_CIR_BYTE2_ADDRESS

+#define BDCR_BYTE0_ADDRESS     RCC_BDCR_BYTE0_ADDRESS

+#define DBP_TIMEOUT_VALUE      RCC_DBP_TIMEOUT_VALUE

+#define LSE_TIMEOUT_VALUE      RCC_LSE_TIMEOUT_VALUE

+

+#define CR_HSION_BB            RCC_CR_HSION_BB

+#define CR_CSSON_BB            RCC_CR_CSSON_BB

+#define CR_PLLON_BB            RCC_CR_PLLON_BB

+#define CR_PLLI2SON_BB         RCC_CR_PLLI2SON_BB

+#define CR_MSION_BB            RCC_CR_MSION_BB

+#define CSR_LSION_BB           RCC_CSR_LSION_BB

+#define CSR_LSEON_BB           RCC_CSR_LSEON_BB

+#define CSR_LSEBYP_BB          RCC_CSR_LSEBYP_BB

+#define CSR_RTCEN_BB           RCC_CSR_RTCEN_BB

+#define CSR_RTCRST_BB          RCC_CSR_RTCRST_BB

+#define CFGR_I2SSRC_BB         RCC_CFGR_I2SSRC_BB

+#define BDCR_RTCEN_BB          RCC_BDCR_RTCEN_BB

+#define BDCR_BDRST_BB          RCC_BDCR_BDRST_BB

+#define CR_HSEON_BB            RCC_CR_HSEON_BB

+#define CSR_RMVF_BB            RCC_CSR_RMVF_BB

+#define CR_PLLSAION_BB         RCC_CR_PLLSAION_BB

+#define DCKCFGR_TIMPRE_BB      RCC_DCKCFGR_TIMPRE_BB

+

+#define __HAL_RCC_CRS_ENABLE_FREQ_ERROR_COUNTER     __HAL_RCC_CRS_FREQ_ERROR_COUNTER_ENABLE

+#define __HAL_RCC_CRS_DISABLE_FREQ_ERROR_COUNTER    __HAL_RCC_CRS_FREQ_ERROR_COUNTER_DISABLE

+#define __HAL_RCC_CRS_ENABLE_AUTOMATIC_CALIB        __HAL_RCC_CRS_AUTOMATIC_CALIB_ENABLE

+#define __HAL_RCC_CRS_DISABLE_AUTOMATIC_CALIB       __HAL_RCC_CRS_AUTOMATIC_CALIB_DISABLE

+#define __HAL_RCC_CRS_CALCULATE_RELOADVALUE         __HAL_RCC_CRS_RELOADVALUE_CALCULATE

+

+#define __HAL_RCC_GET_IT_SOURCE                     __HAL_RCC_GET_IT

+

+#define RCC_CRS_SYNCWARM       RCC_CRS_SYNCWARN

+#define RCC_CRS_TRIMOV         RCC_CRS_TRIMOVF

+

+#define RCC_PERIPHCLK_CK48               RCC_PERIPHCLK_CLK48

+#define RCC_CK48CLKSOURCE_PLLQ           RCC_CLK48CLKSOURCE_PLLQ

+#define RCC_CK48CLKSOURCE_PLLSAIP        RCC_CLK48CLKSOURCE_PLLSAIP

+#define RCC_CK48CLKSOURCE_PLLI2SQ        RCC_CLK48CLKSOURCE_PLLI2SQ

+#define IS_RCC_CK48CLKSOURCE             IS_RCC_CLK48CLKSOURCE

+#define RCC_SDIOCLKSOURCE_CK48           RCC_SDIOCLKSOURCE_CLK48

+

+#define __HAL_RCC_DFSDM_CLK_ENABLE             __HAL_RCC_DFSDM1_CLK_ENABLE

+#define __HAL_RCC_DFSDM_CLK_DISABLE            __HAL_RCC_DFSDM1_CLK_DISABLE

+#define __HAL_RCC_DFSDM_IS_CLK_ENABLED         __HAL_RCC_DFSDM1_IS_CLK_ENABLED

+#define __HAL_RCC_DFSDM_IS_CLK_DISABLED        __HAL_RCC_DFSDM1_IS_CLK_DISABLED

+#define __HAL_RCC_DFSDM_FORCE_RESET            __HAL_RCC_DFSDM1_FORCE_RESET

+#define __HAL_RCC_DFSDM_RELEASE_RESET          __HAL_RCC_DFSDM1_RELEASE_RESET

+#define __HAL_RCC_DFSDM_CLK_SLEEP_ENABLE       __HAL_RCC_DFSDM1_CLK_SLEEP_ENABLE

+#define __HAL_RCC_DFSDM_CLK_SLEEP_DISABLE      __HAL_RCC_DFSDM1_CLK_SLEEP_DISABLE

+#define __HAL_RCC_DFSDM_IS_CLK_SLEEP_ENABLED   __HAL_RCC_DFSDM1_IS_CLK_SLEEP_ENABLED

+#define __HAL_RCC_DFSDM_IS_CLK_SLEEP_DISABLED  __HAL_RCC_DFSDM1_IS_CLK_SLEEP_DISABLED

+#define DfsdmClockSelection         Dfsdm1ClockSelection

+#define RCC_PERIPHCLK_DFSDM         RCC_PERIPHCLK_DFSDM1

+#define RCC_DFSDMCLKSOURCE_PCLK     RCC_DFSDM1CLKSOURCE_PCLK2

+#define RCC_DFSDMCLKSOURCE_SYSCLK   RCC_DFSDM1CLKSOURCE_SYSCLK

+#define __HAL_RCC_DFSDM_CONFIG      __HAL_RCC_DFSDM1_CONFIG

+#define __HAL_RCC_GET_DFSDM_SOURCE  __HAL_RCC_GET_DFSDM1_SOURCE

+#define RCC_DFSDM1CLKSOURCE_PCLK    RCC_DFSDM1CLKSOURCE_PCLK2

+#define RCC_SWPMI1CLKSOURCE_PCLK    RCC_SWPMI1CLKSOURCE_PCLK1

+#define RCC_LPTIM1CLKSOURCE_PCLK    RCC_LPTIM1CLKSOURCE_PCLK1

+#define RCC_LPTIM2CLKSOURCE_PCLK    RCC_LPTIM2CLKSOURCE_PCLK1

+

+#define RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB1    RCC_DFSDM1AUDIOCLKSOURCE_I2S1

+#define RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB2    RCC_DFSDM1AUDIOCLKSOURCE_I2S2

+#define RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB1    RCC_DFSDM2AUDIOCLKSOURCE_I2S1

+#define RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB2    RCC_DFSDM2AUDIOCLKSOURCE_I2S2

+#define RCC_DFSDM1CLKSOURCE_APB2            RCC_DFSDM1CLKSOURCE_PCLK2

+#define RCC_DFSDM2CLKSOURCE_APB2            RCC_DFSDM2CLKSOURCE_PCLK2

+#define RCC_FMPI2C1CLKSOURCE_APB            RCC_FMPI2C1CLKSOURCE_PCLK1

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_RNG_Aliased_Macros HAL RNG Aliased Macros maintained for legacy purpose

+  * @{

+  */

+#define  HAL_RNG_ReadyCallback(__HANDLE__)  HAL_RNG_ReadyDataCallback((__HANDLE__), uint32_t random32bit)

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_RTC_Aliased_Macros HAL RTC Aliased Macros maintained for legacy purpose

+  * @{

+  */

+#if defined (STM32G0) || defined (STM32L5) || defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32G4)

+#else

+#define __HAL_RTC_CLEAR_FLAG                      __HAL_RTC_EXTI_CLEAR_FLAG

+#endif

+#define __HAL_RTC_DISABLE_IT                      __HAL_RTC_EXTI_DISABLE_IT

+#define __HAL_RTC_ENABLE_IT                       __HAL_RTC_EXTI_ENABLE_IT

+

+#if defined (STM32F1)

+#define __HAL_RTC_EXTI_CLEAR_FLAG(RTC_EXTI_LINE_ALARM_EVENT)  __HAL_RTC_ALARM_EXTI_CLEAR_FLAG()

+

+#define __HAL_RTC_EXTI_ENABLE_IT(RTC_EXTI_LINE_ALARM_EVENT)   __HAL_RTC_ALARM_EXTI_ENABLE_IT()

+

+#define __HAL_RTC_EXTI_DISABLE_IT(RTC_EXTI_LINE_ALARM_EVENT)  __HAL_RTC_ALARM_EXTI_DISABLE_IT()

+

+#define __HAL_RTC_EXTI_GET_FLAG(RTC_EXTI_LINE_ALARM_EVENT)    __HAL_RTC_ALARM_EXTI_GET_FLAG()

+

+#define __HAL_RTC_EXTI_GENERATE_SWIT(RTC_EXTI_LINE_ALARM_EVENT)   __HAL_RTC_ALARM_EXTI_GENERATE_SWIT()

+#else

+#define __HAL_RTC_EXTI_CLEAR_FLAG(__EXTI_LINE__)  (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_CLEAR_FLAG() : \

+                                                   (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG() : \

+                                                      __HAL_RTC_TAMPER_TIMESTAMP_EXTI_CLEAR_FLAG()))

+#define __HAL_RTC_EXTI_ENABLE_IT(__EXTI_LINE__)   (((__EXTI_LINE__)  == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_ENABLE_IT() : \

+                                                  (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_ENABLE_IT() : \

+                                                      __HAL_RTC_TAMPER_TIMESTAMP_EXTI_ENABLE_IT()))

+#define __HAL_RTC_EXTI_DISABLE_IT(__EXTI_LINE__)  (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_DISABLE_IT() : \

+                                                  (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_DISABLE_IT() : \

+                                                      __HAL_RTC_TAMPER_TIMESTAMP_EXTI_DISABLE_IT()))

+#define __HAL_RTC_EXTI_GET_FLAG(__EXTI_LINE__)    (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_GET_FLAG() : \

+                                                  (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_GET_FLAG() : \

+                                                      __HAL_RTC_TAMPER_TIMESTAMP_EXTI_GET_FLAG()))

+#define __HAL_RTC_EXTI_GENERATE_SWIT(__EXTI_LINE__)   (((__EXTI_LINE__) == RTC_EXTI_LINE_ALARM_EVENT) ? __HAL_RTC_ALARM_EXTI_GENERATE_SWIT() : \

+                                                      (((__EXTI_LINE__) == RTC_EXTI_LINE_WAKEUPTIMER_EVENT) ? __HAL_RTC_WAKEUPTIMER_EXTI_GENERATE_SWIT() :  \

+                                                          __HAL_RTC_TAMPER_TIMESTAMP_EXTI_GENERATE_SWIT()))

+#endif   /* STM32F1 */

+

+#define IS_ALARM                                  IS_RTC_ALARM

+#define IS_ALARM_MASK                             IS_RTC_ALARM_MASK

+#define IS_TAMPER                                 IS_RTC_TAMPER

+#define IS_TAMPER_ERASE_MODE                      IS_RTC_TAMPER_ERASE_MODE

+#define IS_TAMPER_FILTER                          IS_RTC_TAMPER_FILTER

+#define IS_TAMPER_INTERRUPT                       IS_RTC_TAMPER_INTERRUPT

+#define IS_TAMPER_MASKFLAG_STATE                  IS_RTC_TAMPER_MASKFLAG_STATE

+#define IS_TAMPER_PRECHARGE_DURATION              IS_RTC_TAMPER_PRECHARGE_DURATION

+#define IS_TAMPER_PULLUP_STATE                    IS_RTC_TAMPER_PULLUP_STATE

+#define IS_TAMPER_SAMPLING_FREQ                   IS_RTC_TAMPER_SAMPLING_FREQ

+#define IS_TAMPER_TIMESTAMPONTAMPER_DETECTION     IS_RTC_TAMPER_TIMESTAMPONTAMPER_DETECTION

+#define IS_TAMPER_TRIGGER                         IS_RTC_TAMPER_TRIGGER

+#define IS_WAKEUP_CLOCK                           IS_RTC_WAKEUP_CLOCK

+#define IS_WAKEUP_COUNTER                         IS_RTC_WAKEUP_COUNTER

+

+#define __RTC_WRITEPROTECTION_ENABLE  __HAL_RTC_WRITEPROTECTION_ENABLE

+#define __RTC_WRITEPROTECTION_DISABLE  __HAL_RTC_WRITEPROTECTION_DISABLE

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_SD_Aliased_Macros HAL SD Aliased Macros maintained for legacy purpose

+  * @{

+  */

+

+#define SD_OCR_CID_CSD_OVERWRIETE   SD_OCR_CID_CSD_OVERWRITE

+#define SD_CMD_SD_APP_STAUS         SD_CMD_SD_APP_STATUS

+

+#if defined(STM32F4) || defined(STM32F2)

+#define  SD_SDMMC_DISABLED          SD_SDIO_DISABLED

+#define  SD_SDMMC_FUNCTION_BUSY     SD_SDIO_FUNCTION_BUSY

+#define  SD_SDMMC_FUNCTION_FAILED   SD_SDIO_FUNCTION_FAILED

+#define  SD_SDMMC_UNKNOWN_FUNCTION  SD_SDIO_UNKNOWN_FUNCTION

+#define  SD_CMD_SDMMC_SEN_OP_COND   SD_CMD_SDIO_SEN_OP_COND

+#define  SD_CMD_SDMMC_RW_DIRECT     SD_CMD_SDIO_RW_DIRECT

+#define  SD_CMD_SDMMC_RW_EXTENDED   SD_CMD_SDIO_RW_EXTENDED

+#define  __HAL_SD_SDMMC_ENABLE      __HAL_SD_SDIO_ENABLE

+#define  __HAL_SD_SDMMC_DISABLE     __HAL_SD_SDIO_DISABLE

+#define  __HAL_SD_SDMMC_DMA_ENABLE  __HAL_SD_SDIO_DMA_ENABLE

+#define  __HAL_SD_SDMMC_DMA_DISABLE __HAL_SD_SDIO_DMA_DISABL

+#define  __HAL_SD_SDMMC_ENABLE_IT   __HAL_SD_SDIO_ENABLE_IT

+#define  __HAL_SD_SDMMC_DISABLE_IT  __HAL_SD_SDIO_DISABLE_IT

+#define  __HAL_SD_SDMMC_GET_FLAG    __HAL_SD_SDIO_GET_FLAG

+#define  __HAL_SD_SDMMC_CLEAR_FLAG  __HAL_SD_SDIO_CLEAR_FLAG

+#define  __HAL_SD_SDMMC_GET_IT      __HAL_SD_SDIO_GET_IT

+#define  __HAL_SD_SDMMC_CLEAR_IT    __HAL_SD_SDIO_CLEAR_IT

+#define  SDMMC_STATIC_FLAGS         SDIO_STATIC_FLAGS

+#define  SDMMC_CMD0TIMEOUT          SDIO_CMD0TIMEOUT

+#define  SD_SDMMC_SEND_IF_COND      SD_SDIO_SEND_IF_COND

+/* alias CMSIS */

+#define  SDMMC1_IRQn                SDIO_IRQn

+#define  SDMMC1_IRQHandler          SDIO_IRQHandler

+#endif

+

+#if defined(STM32F7) || defined(STM32L4)

+#define  SD_SDIO_DISABLED           SD_SDMMC_DISABLED

+#define  SD_SDIO_FUNCTION_BUSY      SD_SDMMC_FUNCTION_BUSY

+#define  SD_SDIO_FUNCTION_FAILED    SD_SDMMC_FUNCTION_FAILED

+#define  SD_SDIO_UNKNOWN_FUNCTION   SD_SDMMC_UNKNOWN_FUNCTION

+#define  SD_CMD_SDIO_SEN_OP_COND    SD_CMD_SDMMC_SEN_OP_COND

+#define  SD_CMD_SDIO_RW_DIRECT      SD_CMD_SDMMC_RW_DIRECT

+#define  SD_CMD_SDIO_RW_EXTENDED    SD_CMD_SDMMC_RW_EXTENDED

+#define  __HAL_SD_SDIO_ENABLE       __HAL_SD_SDMMC_ENABLE

+#define  __HAL_SD_SDIO_DISABLE      __HAL_SD_SDMMC_DISABLE

+#define  __HAL_SD_SDIO_DMA_ENABLE   __HAL_SD_SDMMC_DMA_ENABLE

+#define  __HAL_SD_SDIO_DMA_DISABL   __HAL_SD_SDMMC_DMA_DISABLE

+#define  __HAL_SD_SDIO_ENABLE_IT    __HAL_SD_SDMMC_ENABLE_IT

+#define  __HAL_SD_SDIO_DISABLE_IT   __HAL_SD_SDMMC_DISABLE_IT

+#define  __HAL_SD_SDIO_GET_FLAG     __HAL_SD_SDMMC_GET_FLAG

+#define  __HAL_SD_SDIO_CLEAR_FLAG   __HAL_SD_SDMMC_CLEAR_FLAG

+#define  __HAL_SD_SDIO_GET_IT       __HAL_SD_SDMMC_GET_IT

+#define  __HAL_SD_SDIO_CLEAR_IT     __HAL_SD_SDMMC_CLEAR_IT

+#define  SDIO_STATIC_FLAGS	        SDMMC_STATIC_FLAGS

+#define  SDIO_CMD0TIMEOUT	          SDMMC_CMD0TIMEOUT

+#define  SD_SDIO_SEND_IF_COND	      SD_SDMMC_SEND_IF_COND

+/* alias CMSIS for compatibilities */

+#define  SDIO_IRQn                  SDMMC1_IRQn

+#define  SDIO_IRQHandler            SDMMC1_IRQHandler

+#endif

+

+#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) || defined(STM32L4)

+#define  HAL_SD_CardCIDTypedef       HAL_SD_CardCIDTypeDef

+#define  HAL_SD_CardCSDTypedef       HAL_SD_CardCSDTypeDef

+#define  HAL_SD_CardStatusTypedef    HAL_SD_CardStatusTypeDef

+#define  HAL_SD_CardStateTypedef     HAL_SD_CardStateTypeDef

+#endif

+

+#if defined(STM32H7)

+#define HAL_MMCEx_Read_DMADoubleBuffer0CpltCallback   HAL_MMCEx_Read_DMADoubleBuf0CpltCallback

+#define HAL_MMCEx_Read_DMADoubleBuffer1CpltCallback   HAL_MMCEx_Read_DMADoubleBuf1CpltCallback

+#define HAL_MMCEx_Write_DMADoubleBuffer0CpltCallback  HAL_MMCEx_Write_DMADoubleBuf0CpltCallback

+#define HAL_MMCEx_Write_DMADoubleBuffer1CpltCallback  HAL_MMCEx_Write_DMADoubleBuf1CpltCallback

+#define HAL_SDEx_Read_DMADoubleBuffer0CpltCallback    HAL_SDEx_Read_DMADoubleBuf0CpltCallback

+#define HAL_SDEx_Read_DMADoubleBuffer1CpltCallback    HAL_SDEx_Read_DMADoubleBuf1CpltCallback

+#define HAL_SDEx_Write_DMADoubleBuffer0CpltCallback   HAL_SDEx_Write_DMADoubleBuf0CpltCallback

+#define HAL_SDEx_Write_DMADoubleBuffer1CpltCallback   HAL_SDEx_Write_DMADoubleBuf1CpltCallback

+#define HAL_SD_DriveTransciver_1_8V_Callback          HAL_SD_DriveTransceiver_1_8V_Callback

+#endif

+/**

+  * @}

+  */

+

+/** @defgroup HAL_SMARTCARD_Aliased_Macros HAL SMARTCARD Aliased Macros maintained for legacy purpose

+  * @{

+  */

+

+#define __SMARTCARD_ENABLE_IT           __HAL_SMARTCARD_ENABLE_IT

+#define __SMARTCARD_DISABLE_IT          __HAL_SMARTCARD_DISABLE_IT

+#define __SMARTCARD_ENABLE              __HAL_SMARTCARD_ENABLE

+#define __SMARTCARD_DISABLE             __HAL_SMARTCARD_DISABLE

+#define __SMARTCARD_DMA_REQUEST_ENABLE  __HAL_SMARTCARD_DMA_REQUEST_ENABLE

+#define __SMARTCARD_DMA_REQUEST_DISABLE __HAL_SMARTCARD_DMA_REQUEST_DISABLE

+

+#define __HAL_SMARTCARD_GETCLOCKSOURCE  SMARTCARD_GETCLOCKSOURCE

+#define __SMARTCARD_GETCLOCKSOURCE      SMARTCARD_GETCLOCKSOURCE

+

+#define IS_SMARTCARD_ONEBIT_SAMPLING    IS_SMARTCARD_ONE_BIT_SAMPLE

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_SMBUS_Aliased_Macros HAL SMBUS Aliased Macros maintained for legacy purpose

+  * @{

+  */

+#define __HAL_SMBUS_RESET_CR1           SMBUS_RESET_CR1

+#define __HAL_SMBUS_RESET_CR2           SMBUS_RESET_CR2

+#define __HAL_SMBUS_GENERATE_START      SMBUS_GENERATE_START

+#define __HAL_SMBUS_GET_ADDR_MATCH      SMBUS_GET_ADDR_MATCH

+#define __HAL_SMBUS_GET_DIR             SMBUS_GET_DIR

+#define __HAL_SMBUS_GET_STOP_MODE       SMBUS_GET_STOP_MODE

+#define __HAL_SMBUS_GET_PEC_MODE        SMBUS_GET_PEC_MODE

+#define __HAL_SMBUS_GET_ALERT_ENABLED   SMBUS_GET_ALERT_ENABLED

+/**

+  * @}

+  */

+

+/** @defgroup HAL_SPI_Aliased_Macros HAL SPI Aliased Macros maintained for legacy purpose

+  * @{

+  */

+

+#define __HAL_SPI_1LINE_TX              SPI_1LINE_TX

+#define __HAL_SPI_1LINE_RX              SPI_1LINE_RX

+#define __HAL_SPI_RESET_CRC             SPI_RESET_CRC

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_UART_Aliased_Macros HAL UART Aliased Macros maintained for legacy purpose

+  * @{

+  */

+

+#define __HAL_UART_GETCLOCKSOURCE       UART_GETCLOCKSOURCE

+#define __HAL_UART_MASK_COMPUTATION     UART_MASK_COMPUTATION

+#define __UART_GETCLOCKSOURCE           UART_GETCLOCKSOURCE

+#define __UART_MASK_COMPUTATION         UART_MASK_COMPUTATION

+

+#define IS_UART_WAKEUPMETHODE           IS_UART_WAKEUPMETHOD

+

+#define IS_UART_ONEBIT_SAMPLE           IS_UART_ONE_BIT_SAMPLE

+#define IS_UART_ONEBIT_SAMPLING         IS_UART_ONE_BIT_SAMPLE

+

+/**

+  * @}

+  */

+

+

+/** @defgroup HAL_USART_Aliased_Macros HAL USART Aliased Macros maintained for legacy purpose

+  * @{

+  */

+

+#define __USART_ENABLE_IT               __HAL_USART_ENABLE_IT

+#define __USART_DISABLE_IT              __HAL_USART_DISABLE_IT

+#define __USART_ENABLE                  __HAL_USART_ENABLE

+#define __USART_DISABLE                 __HAL_USART_DISABLE

+

+#define __HAL_USART_GETCLOCKSOURCE      USART_GETCLOCKSOURCE

+#define __USART_GETCLOCKSOURCE          USART_GETCLOCKSOURCE

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_USB_Aliased_Macros HAL USB Aliased Macros maintained for legacy purpose

+  * @{

+  */

+#define USB_EXTI_LINE_WAKEUP                               USB_WAKEUP_EXTI_LINE

+

+#define USB_FS_EXTI_TRIGGER_RISING_EDGE                    USB_OTG_FS_WAKEUP_EXTI_RISING_EDGE

+#define USB_FS_EXTI_TRIGGER_FALLING_EDGE                   USB_OTG_FS_WAKEUP_EXTI_FALLING_EDGE

+#define USB_FS_EXTI_TRIGGER_BOTH_EDGE                      USB_OTG_FS_WAKEUP_EXTI_RISING_FALLING_EDGE

+#define USB_FS_EXTI_LINE_WAKEUP                            USB_OTG_FS_WAKEUP_EXTI_LINE

+

+#define USB_HS_EXTI_TRIGGER_RISING_EDGE                    USB_OTG_HS_WAKEUP_EXTI_RISING_EDGE

+#define USB_HS_EXTI_TRIGGER_FALLING_EDGE                   USB_OTG_HS_WAKEUP_EXTI_FALLING_EDGE

+#define USB_HS_EXTI_TRIGGER_BOTH_EDGE                      USB_OTG_HS_WAKEUP_EXTI_RISING_FALLING_EDGE

+#define USB_HS_EXTI_LINE_WAKEUP                            USB_OTG_HS_WAKEUP_EXTI_LINE

+

+#define __HAL_USB_EXTI_ENABLE_IT                           __HAL_USB_WAKEUP_EXTI_ENABLE_IT

+#define __HAL_USB_EXTI_DISABLE_IT                          __HAL_USB_WAKEUP_EXTI_DISABLE_IT

+#define __HAL_USB_EXTI_GET_FLAG                            __HAL_USB_WAKEUP_EXTI_GET_FLAG

+#define __HAL_USB_EXTI_CLEAR_FLAG                          __HAL_USB_WAKEUP_EXTI_CLEAR_FLAG

+#define __HAL_USB_EXTI_SET_RISING_EDGE_TRIGGER             __HAL_USB_WAKEUP_EXTI_ENABLE_RISING_EDGE

+#define __HAL_USB_EXTI_SET_FALLING_EDGE_TRIGGER            __HAL_USB_WAKEUP_EXTI_ENABLE_FALLING_EDGE

+#define __HAL_USB_EXTI_SET_FALLINGRISING_TRIGGER           __HAL_USB_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE

+

+#define __HAL_USB_FS_EXTI_ENABLE_IT                        __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT

+#define __HAL_USB_FS_EXTI_DISABLE_IT                       __HAL_USB_OTG_FS_WAKEUP_EXTI_DISABLE_IT

+#define __HAL_USB_FS_EXTI_GET_FLAG                         __HAL_USB_OTG_FS_WAKEUP_EXTI_GET_FLAG

+#define __HAL_USB_FS_EXTI_CLEAR_FLAG                       __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG

+#define __HAL_USB_FS_EXTI_SET_RISING_EGDE_TRIGGER          __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE

+#define __HAL_USB_FS_EXTI_SET_FALLING_EGDE_TRIGGER         __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_FALLING_EDGE

+#define __HAL_USB_FS_EXTI_SET_FALLINGRISING_TRIGGER        __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE

+#define __HAL_USB_FS_EXTI_GENERATE_SWIT                    __HAL_USB_OTG_FS_WAKEUP_EXTI_GENERATE_SWIT

+

+#define __HAL_USB_HS_EXTI_ENABLE_IT                        __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_IT

+#define __HAL_USB_HS_EXTI_DISABLE_IT                       __HAL_USB_OTG_HS_WAKEUP_EXTI_DISABLE_IT

+#define __HAL_USB_HS_EXTI_GET_FLAG                         __HAL_USB_OTG_HS_WAKEUP_EXTI_GET_FLAG

+#define __HAL_USB_HS_EXTI_CLEAR_FLAG                       __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG

+#define __HAL_USB_HS_EXTI_SET_RISING_EGDE_TRIGGER          __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE

+#define __HAL_USB_HS_EXTI_SET_FALLING_EGDE_TRIGGER         __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_FALLING_EDGE

+#define __HAL_USB_HS_EXTI_SET_FALLINGRISING_TRIGGER        __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE

+#define __HAL_USB_HS_EXTI_GENERATE_SWIT                    __HAL_USB_OTG_HS_WAKEUP_EXTI_GENERATE_SWIT

+

+#define HAL_PCD_ActiveRemoteWakeup                         HAL_PCD_ActivateRemoteWakeup

+#define HAL_PCD_DeActiveRemoteWakeup                       HAL_PCD_DeActivateRemoteWakeup

+

+#define HAL_PCD_SetTxFiFo                                  HAL_PCDEx_SetTxFiFo

+#define HAL_PCD_SetRxFiFo                                  HAL_PCDEx_SetRxFiFo

+/**

+  * @}

+  */

+

+/** @defgroup HAL_TIM_Aliased_Macros HAL TIM Aliased Macros maintained for legacy purpose

+  * @{

+  */

+#define __HAL_TIM_SetICPrescalerValue   TIM_SET_ICPRESCALERVALUE

+#define __HAL_TIM_ResetICPrescalerValue TIM_RESET_ICPRESCALERVALUE

+

+#define TIM_GET_ITSTATUS                __HAL_TIM_GET_IT_SOURCE

+#define TIM_GET_CLEAR_IT                __HAL_TIM_CLEAR_IT

+

+#define __HAL_TIM_GET_ITSTATUS          __HAL_TIM_GET_IT_SOURCE

+

+#define __HAL_TIM_DIRECTION_STATUS      __HAL_TIM_IS_TIM_COUNTING_DOWN

+#define __HAL_TIM_PRESCALER             __HAL_TIM_SET_PRESCALER

+#define __HAL_TIM_SetCounter            __HAL_TIM_SET_COUNTER

+#define __HAL_TIM_GetCounter            __HAL_TIM_GET_COUNTER

+#define __HAL_TIM_SetAutoreload         __HAL_TIM_SET_AUTORELOAD

+#define __HAL_TIM_GetAutoreload         __HAL_TIM_GET_AUTORELOAD

+#define __HAL_TIM_SetClockDivision      __HAL_TIM_SET_CLOCKDIVISION

+#define __HAL_TIM_GetClockDivision      __HAL_TIM_GET_CLOCKDIVISION

+#define __HAL_TIM_SetICPrescaler        __HAL_TIM_SET_ICPRESCALER

+#define __HAL_TIM_GetICPrescaler        __HAL_TIM_GET_ICPRESCALER

+#define __HAL_TIM_SetCompare            __HAL_TIM_SET_COMPARE

+#define __HAL_TIM_GetCompare            __HAL_TIM_GET_COMPARE

+

+#define TIM_BREAKINPUTSOURCE_DFSDM  TIM_BREAKINPUTSOURCE_DFSDM1

+/**

+  * @}

+  */

+

+/** @defgroup HAL_ETH_Aliased_Macros HAL ETH Aliased Macros maintained for legacy purpose

+  * @{

+  */

+

+#define __HAL_ETH_EXTI_ENABLE_IT                   __HAL_ETH_WAKEUP_EXTI_ENABLE_IT

+#define __HAL_ETH_EXTI_DISABLE_IT                  __HAL_ETH_WAKEUP_EXTI_DISABLE_IT

+#define __HAL_ETH_EXTI_GET_FLAG                    __HAL_ETH_WAKEUP_EXTI_GET_FLAG

+#define __HAL_ETH_EXTI_CLEAR_FLAG                  __HAL_ETH_WAKEUP_EXTI_CLEAR_FLAG

+#define __HAL_ETH_EXTI_SET_RISING_EGDE_TRIGGER     __HAL_ETH_WAKEUP_EXTI_ENABLE_RISING_EDGE_TRIGGER

+#define __HAL_ETH_EXTI_SET_FALLING_EGDE_TRIGGER    __HAL_ETH_WAKEUP_EXTI_ENABLE_FALLING_EDGE_TRIGGER

+#define __HAL_ETH_EXTI_SET_FALLINGRISING_TRIGGER   __HAL_ETH_WAKEUP_EXTI_ENABLE_FALLINGRISING_TRIGGER

+

+#define ETH_PROMISCIOUSMODE_ENABLE   ETH_PROMISCUOUS_MODE_ENABLE

+#define ETH_PROMISCIOUSMODE_DISABLE  ETH_PROMISCUOUS_MODE_DISABLE

+#define IS_ETH_PROMISCIOUS_MODE      IS_ETH_PROMISCUOUS_MODE

+/**

+  * @}

+  */

+

+/** @defgroup HAL_LTDC_Aliased_Macros HAL LTDC Aliased Macros maintained for legacy purpose

+  * @{

+  */

+#define __HAL_LTDC_LAYER LTDC_LAYER

+#define __HAL_LTDC_RELOAD_CONFIG  __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG

+/**

+  * @}

+  */

+

+/** @defgroup HAL_SAI_Aliased_Macros HAL SAI Aliased Macros maintained for legacy purpose

+  * @{

+  */

+#define SAI_OUTPUTDRIVE_DISABLED          SAI_OUTPUTDRIVE_DISABLE

+#define SAI_OUTPUTDRIVE_ENABLED           SAI_OUTPUTDRIVE_ENABLE

+#define SAI_MASTERDIVIDER_ENABLED         SAI_MASTERDIVIDER_ENABLE

+#define SAI_MASTERDIVIDER_DISABLED        SAI_MASTERDIVIDER_DISABLE

+#define SAI_STREOMODE                     SAI_STEREOMODE

+#define SAI_FIFOStatus_Empty              SAI_FIFOSTATUS_EMPTY

+#define SAI_FIFOStatus_Less1QuarterFull   SAI_FIFOSTATUS_LESS1QUARTERFULL

+#define SAI_FIFOStatus_1QuarterFull       SAI_FIFOSTATUS_1QUARTERFULL

+#define SAI_FIFOStatus_HalfFull           SAI_FIFOSTATUS_HALFFULL

+#define SAI_FIFOStatus_3QuartersFull      SAI_FIFOSTATUS_3QUARTERFULL

+#define SAI_FIFOStatus_Full               SAI_FIFOSTATUS_FULL

+#define IS_SAI_BLOCK_MONO_STREO_MODE      IS_SAI_BLOCK_MONO_STEREO_MODE

+#define SAI_SYNCHRONOUS_EXT               SAI_SYNCHRONOUS_EXT_SAI1

+#define SAI_SYNCEXT_IN_ENABLE             SAI_SYNCEXT_OUTBLOCKA_ENABLE

+/**

+  * @}

+  */

+

+/** @defgroup HAL_SPDIFRX_Aliased_Macros HAL SPDIFRX Aliased Macros maintained for legacy purpose

+  * @{

+  */

+#if defined(STM32H7)

+#define HAL_SPDIFRX_ReceiveControlFlow      HAL_SPDIFRX_ReceiveCtrlFlow

+#define HAL_SPDIFRX_ReceiveControlFlow_IT   HAL_SPDIFRX_ReceiveCtrlFlow_IT

+#define HAL_SPDIFRX_ReceiveControlFlow_DMA  HAL_SPDIFRX_ReceiveCtrlFlow_DMA

+#endif

+/**

+  * @}

+  */

+

+/** @defgroup HAL_HRTIM_Aliased_Functions HAL HRTIM Aliased Functions maintained for legacy purpose

+  * @{

+  */

+#if defined (STM32H7) || defined (STM32G4) || defined (STM32F3)

+#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT

+#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA

+#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart

+#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT

+#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA

+#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop

+#endif

+/**

+  * @}

+  */

+

+/** @defgroup HAL_QSPI_Aliased_Macros HAL QSPI Aliased Macros maintained for legacy purpose

+  * @{

+  */

+#if defined (STM32L4)

+#define HAL_QPSI_TIMEOUT_DEFAULT_VALUE HAL_QSPI_TIMEOUT_DEFAULT_VALUE

+#endif

+/**

+  * @}

+  */

+

+/** @defgroup HAL_PPP_Aliased_Macros HAL PPP Aliased Macros maintained for legacy purpose

+  * @{

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* STM32_HAL_LEGACY */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h
new file mode 100644
index 0000000..b0eca91
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h
@@ -0,0 +1,701 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal.h

+  * @author  MCD Application Team

+  * @brief   This file contains all the functions prototypes for the HAL

+  *          module driver.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef STM32L4xx_HAL_H

+#define STM32L4xx_HAL_H

+

+#ifdef __cplusplus

+ extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_conf.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup HAL

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+/* Exported constants --------------------------------------------------------*/

+

+/** @defgroup HAL_Exported_Constants HAL Exported Constants

+  * @{

+  */

+

+/** @defgroup HAL_TICK_FREQ Tick Frequency

+  * @{

+  */

+#define  HAL_TICK_FREQ_10HZ         100U

+#define  HAL_TICK_FREQ_100HZ        10U

+#define  HAL_TICK_FREQ_1KHZ         1U

+#define  HAL_TICK_FREQ_DEFAULT      HAL_TICK_FREQ_1KHZ

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/** @defgroup SYSCFG_Exported_Constants SYSCFG Exported Constants

+  * @{

+  */

+

+/** @defgroup SYSCFG_BootMode Boot Mode

+  * @{

+  */

+#define SYSCFG_BOOT_MAINFLASH          0U

+#define SYSCFG_BOOT_SYSTEMFLASH        SYSCFG_MEMRMP_MEM_MODE_0

+

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define SYSCFG_BOOT_FMC                SYSCFG_MEMRMP_MEM_MODE_1

+#endif /* STM32L471xx || STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx || */

+       /* STM32L496xx || STM32L4A6xx || */

+       /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+#define SYSCFG_BOOT_SRAM               (SYSCFG_MEMRMP_MEM_MODE_1 | SYSCFG_MEMRMP_MEM_MODE_0)

+

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define SYSCFG_BOOT_OCTOPSPI1          (SYSCFG_MEMRMP_MEM_MODE_2)

+#define SYSCFG_BOOT_OCTOPSPI2          (SYSCFG_MEMRMP_MEM_MODE_2 | SYSCFG_MEMRMP_MEM_MODE_0)

+#else

+#define SYSCFG_BOOT_QUADSPI            (SYSCFG_MEMRMP_MEM_MODE_2 | SYSCFG_MEMRMP_MEM_MODE_1)

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+/**

+  * @}

+  */

+

+/** @defgroup SYSCFG_FPU_Interrupts FPU Interrupts

+  * @{

+  */

+#define SYSCFG_IT_FPU_IOC              SYSCFG_CFGR1_FPU_IE_0  /*!< Floating Point Unit Invalid operation Interrupt */

+#define SYSCFG_IT_FPU_DZC              SYSCFG_CFGR1_FPU_IE_1  /*!< Floating Point Unit Divide-by-zero Interrupt */

+#define SYSCFG_IT_FPU_UFC              SYSCFG_CFGR1_FPU_IE_2  /*!< Floating Point Unit Underflow Interrupt */

+#define SYSCFG_IT_FPU_OFC              SYSCFG_CFGR1_FPU_IE_3  /*!< Floating Point Unit Overflow Interrupt */

+#define SYSCFG_IT_FPU_IDC              SYSCFG_CFGR1_FPU_IE_4  /*!< Floating Point Unit Input denormal Interrupt */

+#define SYSCFG_IT_FPU_IXC              SYSCFG_CFGR1_FPU_IE_5  /*!< Floating Point Unit Inexact Interrupt */

+

+/**

+  * @}

+  */

+

+/** @defgroup SYSCFG_SRAM2WRP SRAM2 Page Write protection (0 to 31)

+  * @{

+  */

+#define SYSCFG_SRAM2WRP_PAGE0          SYSCFG_SWPR_PAGE0 /*!< SRAM2 Write protection page 0 */

+#define SYSCFG_SRAM2WRP_PAGE1          SYSCFG_SWPR_PAGE1 /*!< SRAM2 Write protection page 1 */

+#define SYSCFG_SRAM2WRP_PAGE2          SYSCFG_SWPR_PAGE2 /*!< SRAM2 Write protection page 2 */

+#define SYSCFG_SRAM2WRP_PAGE3          SYSCFG_SWPR_PAGE3 /*!< SRAM2 Write protection page 3 */

+#define SYSCFG_SRAM2WRP_PAGE4          SYSCFG_SWPR_PAGE4 /*!< SRAM2 Write protection page 4 */

+#define SYSCFG_SRAM2WRP_PAGE5          SYSCFG_SWPR_PAGE5 /*!< SRAM2 Write protection page 5 */

+#define SYSCFG_SRAM2WRP_PAGE6          SYSCFG_SWPR_PAGE6 /*!< SRAM2 Write protection page 6 */

+#define SYSCFG_SRAM2WRP_PAGE7          SYSCFG_SWPR_PAGE7 /*!< SRAM2 Write protection page 7 */

+#define SYSCFG_SRAM2WRP_PAGE8          SYSCFG_SWPR_PAGE8 /*!< SRAM2 Write protection page 8 */

+#define SYSCFG_SRAM2WRP_PAGE9          SYSCFG_SWPR_PAGE9 /*!< SRAM2 Write protection page 9 */

+#define SYSCFG_SRAM2WRP_PAGE10         SYSCFG_SWPR_PAGE10 /*!< SRAM2 Write protection page 10 */

+#define SYSCFG_SRAM2WRP_PAGE11         SYSCFG_SWPR_PAGE11 /*!< SRAM2 Write protection page 11 */

+#define SYSCFG_SRAM2WRP_PAGE12         SYSCFG_SWPR_PAGE12 /*!< SRAM2 Write protection page 12 */

+#define SYSCFG_SRAM2WRP_PAGE13         SYSCFG_SWPR_PAGE13 /*!< SRAM2 Write protection page 13 */

+#define SYSCFG_SRAM2WRP_PAGE14         SYSCFG_SWPR_PAGE14 /*!< SRAM2 Write protection page 14 */

+#define SYSCFG_SRAM2WRP_PAGE15         SYSCFG_SWPR_PAGE15 /*!< SRAM2 Write protection page 15 */

+#if defined(SYSCFG_SWPR_PAGE31)

+#define SYSCFG_SRAM2WRP_PAGE16         SYSCFG_SWPR_PAGE16 /*!< SRAM2 Write protection page 16 */

+#define SYSCFG_SRAM2WRP_PAGE17         SYSCFG_SWPR_PAGE17 /*!< SRAM2 Write protection page 17 */

+#define SYSCFG_SRAM2WRP_PAGE18         SYSCFG_SWPR_PAGE18 /*!< SRAM2 Write protection page 18 */

+#define SYSCFG_SRAM2WRP_PAGE19         SYSCFG_SWPR_PAGE19 /*!< SRAM2 Write protection page 19 */

+#define SYSCFG_SRAM2WRP_PAGE20         SYSCFG_SWPR_PAGE20 /*!< SRAM2 Write protection page 20 */

+#define SYSCFG_SRAM2WRP_PAGE21         SYSCFG_SWPR_PAGE21 /*!< SRAM2 Write protection page 21 */

+#define SYSCFG_SRAM2WRP_PAGE22         SYSCFG_SWPR_PAGE22 /*!< SRAM2 Write protection page 22 */

+#define SYSCFG_SRAM2WRP_PAGE23         SYSCFG_SWPR_PAGE23 /*!< SRAM2 Write protection page 23 */

+#define SYSCFG_SRAM2WRP_PAGE24         SYSCFG_SWPR_PAGE24 /*!< SRAM2 Write protection page 24 */

+#define SYSCFG_SRAM2WRP_PAGE25         SYSCFG_SWPR_PAGE25 /*!< SRAM2 Write protection page 25 */

+#define SYSCFG_SRAM2WRP_PAGE26         SYSCFG_SWPR_PAGE26 /*!< SRAM2 Write protection page 26 */

+#define SYSCFG_SRAM2WRP_PAGE27         SYSCFG_SWPR_PAGE27 /*!< SRAM2 Write protection page 27 */

+#define SYSCFG_SRAM2WRP_PAGE28         SYSCFG_SWPR_PAGE28 /*!< SRAM2 Write protection page 28 */

+#define SYSCFG_SRAM2WRP_PAGE29         SYSCFG_SWPR_PAGE29 /*!< SRAM2 Write protection page 29 */

+#define SYSCFG_SRAM2WRP_PAGE30         SYSCFG_SWPR_PAGE30 /*!< SRAM2 Write protection page 30 */

+#define SYSCFG_SRAM2WRP_PAGE31         SYSCFG_SWPR_PAGE31 /*!< SRAM2 Write protection page 31 */

+#endif /* SYSCFG_SWPR_PAGE31 */

+

+/**

+  * @}

+  */

+

+#if defined(SYSCFG_SWPR2_PAGE63)

+/** @defgroup SYSCFG_SRAM2WRP_32_63 SRAM2 Page Write protection (32 to 63)

+  * @{

+  */

+#define SYSCFG_SRAM2WRP_PAGE32         SYSCFG_SWPR2_PAGE32 /*!< SRAM2 Write protection page 32 */

+#define SYSCFG_SRAM2WRP_PAGE33         SYSCFG_SWPR2_PAGE33 /*!< SRAM2 Write protection page 33 */

+#define SYSCFG_SRAM2WRP_PAGE34         SYSCFG_SWPR2_PAGE34 /*!< SRAM2 Write protection page 34 */

+#define SYSCFG_SRAM2WRP_PAGE35         SYSCFG_SWPR2_PAGE35 /*!< SRAM2 Write protection page 35 */

+#define SYSCFG_SRAM2WRP_PAGE36         SYSCFG_SWPR2_PAGE36 /*!< SRAM2 Write protection page 36 */

+#define SYSCFG_SRAM2WRP_PAGE37         SYSCFG_SWPR2_PAGE37 /*!< SRAM2 Write protection page 37 */

+#define SYSCFG_SRAM2WRP_PAGE38         SYSCFG_SWPR2_PAGE38 /*!< SRAM2 Write protection page 38 */

+#define SYSCFG_SRAM2WRP_PAGE39         SYSCFG_SWPR2_PAGE39 /*!< SRAM2 Write protection page 39 */

+#define SYSCFG_SRAM2WRP_PAGE40         SYSCFG_SWPR2_PAGE40 /*!< SRAM2 Write protection page 40 */

+#define SYSCFG_SRAM2WRP_PAGE41         SYSCFG_SWPR2_PAGE41 /*!< SRAM2 Write protection page 41 */

+#define SYSCFG_SRAM2WRP_PAGE42         SYSCFG_SWPR2_PAGE42 /*!< SRAM2 Write protection page 42 */

+#define SYSCFG_SRAM2WRP_PAGE43         SYSCFG_SWPR2_PAGE43 /*!< SRAM2 Write protection page 43 */

+#define SYSCFG_SRAM2WRP_PAGE44         SYSCFG_SWPR2_PAGE44 /*!< SRAM2 Write protection page 44 */

+#define SYSCFG_SRAM2WRP_PAGE45         SYSCFG_SWPR2_PAGE45 /*!< SRAM2 Write protection page 45 */

+#define SYSCFG_SRAM2WRP_PAGE46         SYSCFG_SWPR2_PAGE46 /*!< SRAM2 Write protection page 46 */

+#define SYSCFG_SRAM2WRP_PAGE47         SYSCFG_SWPR2_PAGE47 /*!< SRAM2 Write protection page 47 */

+#define SYSCFG_SRAM2WRP_PAGE48         SYSCFG_SWPR2_PAGE48 /*!< SRAM2 Write protection page 48 */

+#define SYSCFG_SRAM2WRP_PAGE49         SYSCFG_SWPR2_PAGE49 /*!< SRAM2 Write protection page 49 */

+#define SYSCFG_SRAM2WRP_PAGE50         SYSCFG_SWPR2_PAGE50 /*!< SRAM2 Write protection page 50 */

+#define SYSCFG_SRAM2WRP_PAGE51         SYSCFG_SWPR2_PAGE51 /*!< SRAM2 Write protection page 51 */

+#define SYSCFG_SRAM2WRP_PAGE52         SYSCFG_SWPR2_PAGE52 /*!< SRAM2 Write protection page 52 */

+#define SYSCFG_SRAM2WRP_PAGE53         SYSCFG_SWPR2_PAGE53 /*!< SRAM2 Write protection page 53 */

+#define SYSCFG_SRAM2WRP_PAGE54         SYSCFG_SWPR2_PAGE54 /*!< SRAM2 Write protection page 54 */

+#define SYSCFG_SRAM2WRP_PAGE55         SYSCFG_SWPR2_PAGE55 /*!< SRAM2 Write protection page 55 */

+#define SYSCFG_SRAM2WRP_PAGE56         SYSCFG_SWPR2_PAGE56 /*!< SRAM2 Write protection page 56 */

+#define SYSCFG_SRAM2WRP_PAGE57         SYSCFG_SWPR2_PAGE57 /*!< SRAM2 Write protection page 57 */

+#define SYSCFG_SRAM2WRP_PAGE58         SYSCFG_SWPR2_PAGE58 /*!< SRAM2 Write protection page 58 */

+#define SYSCFG_SRAM2WRP_PAGE59         SYSCFG_SWPR2_PAGE59 /*!< SRAM2 Write protection page 59 */

+#define SYSCFG_SRAM2WRP_PAGE60         SYSCFG_SWPR2_PAGE60 /*!< SRAM2 Write protection page 60 */

+#define SYSCFG_SRAM2WRP_PAGE61         SYSCFG_SWPR2_PAGE61 /*!< SRAM2 Write protection page 61 */

+#define SYSCFG_SRAM2WRP_PAGE62         SYSCFG_SWPR2_PAGE62 /*!< SRAM2 Write protection page 62 */

+#define SYSCFG_SRAM2WRP_PAGE63         SYSCFG_SWPR2_PAGE63 /*!< SRAM2 Write protection page 63 */

+

+/**

+  * @}

+  */

+#endif /* SYSCFG_SWPR2_PAGE63 */

+

+#if defined(VREFBUF)

+/** @defgroup SYSCFG_VREFBUF_VoltageScale VREFBUF Voltage Scale

+  * @{

+  */

+#define SYSCFG_VREFBUF_VOLTAGE_SCALE0  0U               /*!< Voltage reference scale 0 (VREF_OUT1) */

+#define SYSCFG_VREFBUF_VOLTAGE_SCALE1  VREFBUF_CSR_VRS  /*!< Voltage reference scale 1 (VREF_OUT2) */

+

+/**

+  * @}

+  */

+

+/** @defgroup SYSCFG_VREFBUF_HighImpedance VREFBUF High Impedance

+  * @{

+  */

+#define SYSCFG_VREFBUF_HIGH_IMPEDANCE_DISABLE  0U               /*!< VREF_plus pin is internally connected to Voltage reference buffer output */

+#define SYSCFG_VREFBUF_HIGH_IMPEDANCE_ENABLE   VREFBUF_CSR_HIZ  /*!< VREF_plus pin is high impedance */

+

+/**

+  * @}

+  */

+#endif /* VREFBUF */

+

+/** @defgroup SYSCFG_flags_definition Flags

+  * @{

+  */

+

+#define SYSCFG_FLAG_SRAM2_PE            SYSCFG_CFGR2_SPF       /*!< SRAM2 parity error */

+#define SYSCFG_FLAG_SRAM2_BUSY          SYSCFG_SCSR_SRAM2BSY   /*!< SRAM2 busy by erase operation */

+

+/**

+  * @}

+  */

+

+/** @defgroup SYSCFG_FastModePlus_GPIO Fast-mode Plus on GPIO

+  * @{

+  */

+

+/** @brief  Fast-mode Plus driving capability on a specific GPIO

+  */

+#define SYSCFG_FASTMODEPLUS_PB6        SYSCFG_CFGR1_I2C_PB6_FMP  /*!< Enable Fast-mode Plus on PB6 */

+#define SYSCFG_FASTMODEPLUS_PB7        SYSCFG_CFGR1_I2C_PB7_FMP  /*!< Enable Fast-mode Plus on PB7 */

+#if defined(SYSCFG_CFGR1_I2C_PB8_FMP)

+#define SYSCFG_FASTMODEPLUS_PB8        SYSCFG_CFGR1_I2C_PB8_FMP  /*!< Enable Fast-mode Plus on PB8 */

+#endif /* SYSCFG_CFGR1_I2C_PB8_FMP */

+#if defined(SYSCFG_CFGR1_I2C_PB9_FMP)

+#define SYSCFG_FASTMODEPLUS_PB9        SYSCFG_CFGR1_I2C_PB9_FMP  /*!< Enable Fast-mode Plus on PB9 */

+#endif /* SYSCFG_CFGR1_I2C_PB9_FMP */

+

+/**

+ * @}

+ */

+

+/**

+  * @}

+  */

+

+/* Exported macros -----------------------------------------------------------*/

+

+/** @defgroup DBGMCU_Exported_Macros DBGMCU Exported Macros

+  * @{

+  */

+

+/** @brief  Freeze/Unfreeze Peripherals in Debug mode

+  */

+#if defined(DBGMCU_APB1FZR1_DBG_TIM2_STOP)

+#define __HAL_DBGMCU_FREEZE_TIM2()           SET_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_TIM2_STOP)

+#define __HAL_DBGMCU_UNFREEZE_TIM2()         CLEAR_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_TIM2_STOP)

+#endif

+

+#if defined(DBGMCU_APB1FZR1_DBG_TIM3_STOP)

+#define __HAL_DBGMCU_FREEZE_TIM3()           SET_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_TIM3_STOP)

+#define __HAL_DBGMCU_UNFREEZE_TIM3()         CLEAR_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_TIM3_STOP)

+#endif

+

+#if defined(DBGMCU_APB1FZR1_DBG_TIM4_STOP)

+#define __HAL_DBGMCU_FREEZE_TIM4()           SET_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_TIM4_STOP)

+#define __HAL_DBGMCU_UNFREEZE_TIM4()         CLEAR_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_TIM4_STOP)

+#endif

+

+#if defined(DBGMCU_APB1FZR1_DBG_TIM5_STOP)

+#define __HAL_DBGMCU_FREEZE_TIM5()           SET_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_TIM5_STOP)

+#define __HAL_DBGMCU_UNFREEZE_TIM5()         CLEAR_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_TIM5_STOP)

+#endif

+

+#if defined(DBGMCU_APB1FZR1_DBG_TIM6_STOP)

+#define __HAL_DBGMCU_FREEZE_TIM6()           SET_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_TIM6_STOP)

+#define __HAL_DBGMCU_UNFREEZE_TIM6()         CLEAR_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_TIM6_STOP)

+#endif

+

+#if defined(DBGMCU_APB1FZR1_DBG_TIM7_STOP)

+#define __HAL_DBGMCU_FREEZE_TIM7()           SET_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_TIM7_STOP)

+#define __HAL_DBGMCU_UNFREEZE_TIM7()         CLEAR_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_TIM7_STOP)

+#endif

+

+#if defined(DBGMCU_APB1FZR1_DBG_RTC_STOP)

+#define __HAL_DBGMCU_FREEZE_RTC()            SET_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_RTC_STOP)

+#define __HAL_DBGMCU_UNFREEZE_RTC()          CLEAR_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_RTC_STOP)

+#endif

+

+#if defined(DBGMCU_APB1FZR1_DBG_WWDG_STOP)

+#define __HAL_DBGMCU_FREEZE_WWDG()           SET_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_WWDG_STOP)

+#define __HAL_DBGMCU_UNFREEZE_WWDG()         CLEAR_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_WWDG_STOP)

+#endif

+

+#if defined(DBGMCU_APB1FZR1_DBG_IWDG_STOP)

+#define __HAL_DBGMCU_FREEZE_IWDG()           SET_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_IWDG_STOP)

+#define __HAL_DBGMCU_UNFREEZE_IWDG()         CLEAR_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_IWDG_STOP)

+#endif

+

+#if defined(DBGMCU_APB1FZR1_DBG_I2C1_STOP)

+#define __HAL_DBGMCU_FREEZE_I2C1_TIMEOUT()   SET_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_I2C1_STOP)

+#define __HAL_DBGMCU_UNFREEZE_I2C1_TIMEOUT() CLEAR_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_I2C1_STOP)

+#endif

+

+#if defined(DBGMCU_APB1FZR1_DBG_I2C2_STOP)

+#define __HAL_DBGMCU_FREEZE_I2C2_TIMEOUT()   SET_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_I2C2_STOP)

+#define __HAL_DBGMCU_UNFREEZE_I2C2_TIMEOUT() CLEAR_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_I2C2_STOP)

+#endif

+

+#if defined(DBGMCU_APB1FZR1_DBG_I2C3_STOP)

+#define __HAL_DBGMCU_FREEZE_I2C3_TIMEOUT()   SET_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_I2C3_STOP)

+#define __HAL_DBGMCU_UNFREEZE_I2C3_TIMEOUT() CLEAR_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_I2C3_STOP)

+#endif

+

+#if defined(DBGMCU_APB1FZR2_DBG_I2C4_STOP)

+#define __HAL_DBGMCU_FREEZE_I2C4_TIMEOUT()   SET_BIT(DBGMCU->APB1FZR2, DBGMCU_APB1FZR2_DBG_I2C4_STOP)

+#define __HAL_DBGMCU_UNFREEZE_I2C4_TIMEOUT() CLEAR_BIT(DBGMCU->APB1FZR2, DBGMCU_APB1FZR2_DBG_I2C4_STOP)

+#endif

+

+#if defined(DBGMCU_APB1FZR1_DBG_CAN_STOP)

+#define __HAL_DBGMCU_FREEZE_CAN1()           SET_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_CAN_STOP)

+#define __HAL_DBGMCU_UNFREEZE_CAN1()         CLEAR_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_CAN_STOP)

+#endif

+

+#if defined(DBGMCU_APB1FZR1_DBG_CAN2_STOP)

+#define __HAL_DBGMCU_FREEZE_CAN2()           SET_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_CAN2_STOP)

+#define __HAL_DBGMCU_UNFREEZE_CAN2()         CLEAR_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_CAN2_STOP)

+#endif

+

+#if defined(DBGMCU_APB1FZR1_DBG_LPTIM1_STOP)

+#define __HAL_DBGMCU_FREEZE_LPTIM1()         SET_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_LPTIM1_STOP)

+#define __HAL_DBGMCU_UNFREEZE_LPTIM1()       CLEAR_BIT(DBGMCU->APB1FZR1, DBGMCU_APB1FZR1_DBG_LPTIM1_STOP)

+#endif

+

+#if defined(DBGMCU_APB1FZR2_DBG_LPTIM2_STOP)

+#define __HAL_DBGMCU_FREEZE_LPTIM2()         SET_BIT(DBGMCU->APB1FZR2, DBGMCU_APB1FZR2_DBG_LPTIM2_STOP)

+#define __HAL_DBGMCU_UNFREEZE_LPTIM2()       CLEAR_BIT(DBGMCU->APB1FZR2, DBGMCU_APB1FZR2_DBG_LPTIM2_STOP)

+#endif

+

+#if defined(DBGMCU_APB2FZ_DBG_TIM1_STOP)

+#define __HAL_DBGMCU_FREEZE_TIM1()           SET_BIT(DBGMCU->APB2FZ, DBGMCU_APB2FZ_DBG_TIM1_STOP)

+#define __HAL_DBGMCU_UNFREEZE_TIM1()         CLEAR_BIT(DBGMCU->APB2FZ, DBGMCU_APB2FZ_DBG_TIM1_STOP)

+#endif

+

+#if defined(DBGMCU_APB2FZ_DBG_TIM8_STOP)

+#define __HAL_DBGMCU_FREEZE_TIM8()           SET_BIT(DBGMCU->APB2FZ, DBGMCU_APB2FZ_DBG_TIM8_STOP)

+#define __HAL_DBGMCU_UNFREEZE_TIM8()         CLEAR_BIT(DBGMCU->APB2FZ, DBGMCU_APB2FZ_DBG_TIM8_STOP)

+#endif

+

+#if defined(DBGMCU_APB2FZ_DBG_TIM15_STOP)

+#define __HAL_DBGMCU_FREEZE_TIM15()          SET_BIT(DBGMCU->APB2FZ, DBGMCU_APB2FZ_DBG_TIM15_STOP)

+#define __HAL_DBGMCU_UNFREEZE_TIM15()        CLEAR_BIT(DBGMCU->APB2FZ, DBGMCU_APB2FZ_DBG_TIM15_STOP)

+#endif

+

+#if defined(DBGMCU_APB2FZ_DBG_TIM16_STOP)

+#define __HAL_DBGMCU_FREEZE_TIM16()          SET_BIT(DBGMCU->APB2FZ, DBGMCU_APB2FZ_DBG_TIM16_STOP)

+#define __HAL_DBGMCU_UNFREEZE_TIM16()        CLEAR_BIT(DBGMCU->APB2FZ, DBGMCU_APB2FZ_DBG_TIM16_STOP)

+#endif

+

+#if defined(DBGMCU_APB2FZ_DBG_TIM17_STOP)

+#define __HAL_DBGMCU_FREEZE_TIM17()          SET_BIT(DBGMCU->APB2FZ, DBGMCU_APB2FZ_DBG_TIM17_STOP)

+#define __HAL_DBGMCU_UNFREEZE_TIM17()        CLEAR_BIT(DBGMCU->APB2FZ, DBGMCU_APB2FZ_DBG_TIM17_STOP)

+#endif

+

+/**

+  * @}

+  */

+

+/** @defgroup SYSCFG_Exported_Macros SYSCFG Exported Macros

+  * @{

+  */

+

+/** @brief  Main Flash memory mapped at 0x00000000.

+  */

+#define __HAL_SYSCFG_REMAPMEMORY_FLASH()       CLEAR_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_MEM_MODE)

+

+/** @brief  System Flash memory mapped at 0x00000000.

+  */

+#define __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH() MODIFY_REG(SYSCFG->MEMRMP, SYSCFG_MEMRMP_MEM_MODE, SYSCFG_MEMRMP_MEM_MODE_0)

+

+/** @brief  Embedded SRAM mapped at 0x00000000.

+  */

+#define __HAL_SYSCFG_REMAPMEMORY_SRAM()        MODIFY_REG(SYSCFG->MEMRMP, SYSCFG_MEMRMP_MEM_MODE, (SYSCFG_MEMRMP_MEM_MODE_1|SYSCFG_MEMRMP_MEM_MODE_0))

+

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+

+/** @brief  FMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000.

+  */

+#define __HAL_SYSCFG_REMAPMEMORY_FMC()         MODIFY_REG(SYSCFG->MEMRMP, SYSCFG_MEMRMP_MEM_MODE, SYSCFG_MEMRMP_MEM_MODE_1)

+

+#endif /* STM32L471xx || STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx || */

+       /* STM32L496xx || STM32L4A6xx || */

+       /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+

+/** @brief  OCTOSPI mapped at 0x00000000.

+  */

+#define __HAL_SYSCFG_REMAPMEMORY_OCTOSPI1()    MODIFY_REG(SYSCFG->MEMRMP, SYSCFG_MEMRMP_MEM_MODE, (SYSCFG_MEMRMP_MEM_MODE_2))

+#define __HAL_SYSCFG_REMAPMEMORY_OCTOSPI2()    MODIFY_REG(SYSCFG->MEMRMP, SYSCFG_MEMRMP_MEM_MODE, (SYSCFG_MEMRMP_MEM_MODE_2|SYSCFG_MEMRMP_MEM_MODE_0))

+

+#else

+

+/** @brief  QUADSPI mapped at 0x00000000.

+  */

+#define __HAL_SYSCFG_REMAPMEMORY_QUADSPI()     MODIFY_REG(SYSCFG->MEMRMP, SYSCFG_MEMRMP_MEM_MODE, (SYSCFG_MEMRMP_MEM_MODE_2|SYSCFG_MEMRMP_MEM_MODE_1))

+

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+/**

+  * @brief  Return the boot mode as configured by user.

+  * @retval The boot mode as configured by user. The returned value can be one

+  *         of the following values:

+  *           @arg @ref SYSCFG_BOOT_MAINFLASH

+  *           @arg @ref SYSCFG_BOOT_SYSTEMFLASH

+  @if STM32L486xx

+  *           @arg @ref SYSCFG_BOOT_FMC

+  @endif

+  *           @arg @ref SYSCFG_BOOT_SRAM

+  *           @arg @ref SYSCFG_BOOT_QUADSPI

+  */

+#define __HAL_SYSCFG_GET_BOOT_MODE()           READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_MEM_MODE)

+

+/** @brief  SRAM2 page 0 to 31 write protection enable macro

+  * @param  __SRAM2WRP__  This parameter can be a combination of values of @ref SYSCFG_SRAM2WRP

+  * @note   Write protection can only be disabled by a system reset

+  */

+#define __HAL_SYSCFG_SRAM2_WRP_1_31_ENABLE(__SRAM2WRP__)    do {assert_param(IS_SYSCFG_SRAM2WRP_PAGE((__SRAM2WRP__)));\

+                                                                SET_BIT(SYSCFG->SWPR, (__SRAM2WRP__));\

+                                                            }while(0)

+

+#if defined(SYSCFG_SWPR2_PAGE63)

+/** @brief  SRAM2 page 32 to 63 write protection enable macro

+  * @param  __SRAM2WRP__  This parameter can be a combination of values of @ref SYSCFG_SRAM2WRP_32_63

+  * @note   Write protection can only be disabled by a system reset

+  */

+#define __HAL_SYSCFG_SRAM2_WRP_32_63_ENABLE(__SRAM2WRP__)   do {assert_param(IS_SYSCFG_SRAM2WRP_PAGE((__SRAM2WRP__)));\

+                                                                SET_BIT(SYSCFG->SWPR2, (__SRAM2WRP__));\

+                                                            }while(0)

+#endif /* SYSCFG_SWPR2_PAGE63 */

+

+/** @brief  SRAM2 page write protection unlock prior to erase

+  * @note   Writing a wrong key reactivates the write protection

+  */

+#define __HAL_SYSCFG_SRAM2_WRP_UNLOCK()      do {SYSCFG->SKR = 0xCA;\

+                                                 SYSCFG->SKR = 0x53;\

+                                                }while(0)

+

+/** @brief  SRAM2 erase

+  * @note   __SYSCFG_GET_FLAG(SYSCFG_FLAG_SRAM2_BUSY) may be used to check end of erase

+  */

+#define __HAL_SYSCFG_SRAM2_ERASE()           SET_BIT(SYSCFG->SCSR, SYSCFG_SCSR_SRAM2ER)

+

+/** @brief  Floating Point Unit interrupt enable/disable macros

+  * @param __INTERRUPT__  This parameter can be a value of @ref SYSCFG_FPU_Interrupts

+  */

+#define __HAL_SYSCFG_FPU_INTERRUPT_ENABLE(__INTERRUPT__)    do {assert_param(IS_SYSCFG_FPU_INTERRUPT((__INTERRUPT__)));\

+                                                                SET_BIT(SYSCFG->CFGR1, (__INTERRUPT__));\

+                                                            }while(0)

+

+#define __HAL_SYSCFG_FPU_INTERRUPT_DISABLE(__INTERRUPT__)   do {assert_param(IS_SYSCFG_FPU_INTERRUPT((__INTERRUPT__)));\

+                                                                CLEAR_BIT(SYSCFG->CFGR1, (__INTERRUPT__));\

+                                                            }while(0)

+

+/** @brief  SYSCFG Break ECC lock.

+  *         Enable and lock the connection of Flash ECC error connection to TIM1/8/15/16/17 Break input.

+  * @note   The selected configuration is locked and can be unlocked only by system reset.

+  */

+#define __HAL_SYSCFG_BREAK_ECC_LOCK()        SET_BIT(SYSCFG->CFGR2, SYSCFG_CFGR2_ECCL)

+

+/** @brief  SYSCFG Break Cortex-M4 Lockup lock.

+  *         Enable and lock the connection of Cortex-M4 LOCKUP (Hardfault) output to TIM1/8/15/16/17 Break input.

+  * @note   The selected configuration is locked and can be unlocked only by system reset.

+  */

+#define __HAL_SYSCFG_BREAK_LOCKUP_LOCK()     SET_BIT(SYSCFG->CFGR2, SYSCFG_CFGR2_CLL)

+

+/** @brief  SYSCFG Break PVD lock.

+  *         Enable and lock the PVD connection to Timer1/8/15/16/17 Break input, as well as the PVDE and PLS[2:0] in the PWR_CR2 register.

+  * @note   The selected configuration is locked and can be unlocked only by system reset.

+  */

+#define __HAL_SYSCFG_BREAK_PVD_LOCK()        SET_BIT(SYSCFG->CFGR2, SYSCFG_CFGR2_PVDL)

+

+/** @brief  SYSCFG Break SRAM2 parity lock.

+  *         Enable and lock the SRAM2 parity error signal connection to TIM1/8/15/16/17 Break input.

+  * @note   The selected configuration is locked and can be unlocked by system reset.

+  */

+#define __HAL_SYSCFG_BREAK_SRAM2PARITY_LOCK()  SET_BIT(SYSCFG->CFGR2, SYSCFG_CFGR2_SPL)

+

+/** @brief  Check SYSCFG flag is set or not.

+  * @param  __FLAG__  specifies the flag to check.

+  *         This parameter can be one of the following values:

+  *            @arg @ref SYSCFG_FLAG_SRAM2_PE   SRAM2 Parity Error Flag

+  *            @arg @ref SYSCFG_FLAG_SRAM2_BUSY SRAM2 Erase Ongoing

+  * @retval The new state of __FLAG__ (TRUE or FALSE).

+  */

+#define __HAL_SYSCFG_GET_FLAG(__FLAG__)      ((((((__FLAG__) == SYSCFG_SCSR_SRAM2BSY)? SYSCFG->SCSR : SYSCFG->CFGR2) & (__FLAG__))!= 0U) ? 1U : 0U)

+

+/** @brief  Set the SPF bit to clear the SRAM Parity Error Flag.

+  */

+#define __HAL_SYSCFG_CLEAR_FLAG()            SET_BIT(SYSCFG->CFGR2, SYSCFG_CFGR2_SPF)

+

+/** @brief  Fast-mode Plus driving capability enable/disable macros

+  * @param __FASTMODEPLUS__  This parameter can be a value of :

+  *     @arg @ref SYSCFG_FASTMODEPLUS_PB6 Fast-mode Plus driving capability activation on PB6

+  *     @arg @ref SYSCFG_FASTMODEPLUS_PB7 Fast-mode Plus driving capability activation on PB7

+  *     @arg @ref SYSCFG_FASTMODEPLUS_PB8 Fast-mode Plus driving capability activation on PB8

+  *     @arg @ref SYSCFG_FASTMODEPLUS_PB9 Fast-mode Plus driving capability activation on PB9

+  */

+#define __HAL_SYSCFG_FASTMODEPLUS_ENABLE(__FASTMODEPLUS__)  do {assert_param(IS_SYSCFG_FASTMODEPLUS((__FASTMODEPLUS__)));\

+                                                                SET_BIT(SYSCFG->CFGR1, (__FASTMODEPLUS__));\

+                                                               }while(0)

+

+#define __HAL_SYSCFG_FASTMODEPLUS_DISABLE(__FASTMODEPLUS__) do {assert_param(IS_SYSCFG_FASTMODEPLUS((__FASTMODEPLUS__)));\

+                                                                CLEAR_BIT(SYSCFG->CFGR1, (__FASTMODEPLUS__));\

+                                                               }while(0)

+

+/**

+  * @}

+  */

+

+/* Private macros ------------------------------------------------------------*/

+/** @defgroup HAL_Private_Macros HAL Private Macros

+  * @{

+  */

+

+#define IS_TICKFREQ(__FREQ__) (((__FREQ__) == HAL_TICK_FREQ_10HZ)  || \

+                               ((__FREQ__) == HAL_TICK_FREQ_100HZ) || \

+                               ((__FREQ__) == HAL_TICK_FREQ_1KHZ))

+

+/**

+  * @}

+  */

+

+/** @defgroup SYSCFG_Private_Macros SYSCFG Private Macros

+  * @{

+  */

+

+#define IS_SYSCFG_FPU_INTERRUPT(__INTERRUPT__) ((((__INTERRUPT__) & SYSCFG_IT_FPU_IOC) == SYSCFG_IT_FPU_IOC) || \

+                                                (((__INTERRUPT__) & SYSCFG_IT_FPU_DZC) == SYSCFG_IT_FPU_DZC) || \

+                                                (((__INTERRUPT__) & SYSCFG_IT_FPU_UFC) == SYSCFG_IT_FPU_UFC) || \

+                                                (((__INTERRUPT__) & SYSCFG_IT_FPU_OFC) == SYSCFG_IT_FPU_OFC) || \

+                                                (((__INTERRUPT__) & SYSCFG_IT_FPU_IDC) == SYSCFG_IT_FPU_IDC) || \

+                                                (((__INTERRUPT__) & SYSCFG_IT_FPU_IXC) == SYSCFG_IT_FPU_IXC))

+

+#define IS_SYSCFG_BREAK_CONFIG(__CONFIG__) (((__CONFIG__) == SYSCFG_BREAK_ECC)           || \

+                                            ((__CONFIG__) == SYSCFG_BREAK_PVD)           || \

+                                            ((__CONFIG__) == SYSCFG_BREAK_SRAM2_PARITY)  || \

+                                            ((__CONFIG__) == SYSCFG_BREAK_LOCKUP))

+

+#define IS_SYSCFG_SRAM2WRP_PAGE(__PAGE__)   (((__PAGE__) > 0U) && ((__PAGE__) <= 0xFFFFFFFFUL))

+

+#if defined(VREFBUF)

+#define IS_SYSCFG_VREFBUF_VOLTAGE_SCALE(__SCALE__)  (((__SCALE__) == SYSCFG_VREFBUF_VOLTAGE_SCALE0) || \

+                                                     ((__SCALE__) == SYSCFG_VREFBUF_VOLTAGE_SCALE1))

+

+#define IS_SYSCFG_VREFBUF_HIGH_IMPEDANCE(__VALUE__)  (((__VALUE__) == SYSCFG_VREFBUF_HIGH_IMPEDANCE_DISABLE) || \

+                                                      ((__VALUE__) == SYSCFG_VREFBUF_HIGH_IMPEDANCE_ENABLE))

+

+#define IS_SYSCFG_VREFBUF_TRIMMING(__VALUE__)  (((__VALUE__) > 0U) && ((__VALUE__) <= VREFBUF_CCR_TRIM))

+#endif /* VREFBUF */

+

+#if defined(SYSCFG_FASTMODEPLUS_PB8) && defined(SYSCFG_FASTMODEPLUS_PB9)

+#define IS_SYSCFG_FASTMODEPLUS(__PIN__) ((((__PIN__) & SYSCFG_FASTMODEPLUS_PB6) == SYSCFG_FASTMODEPLUS_PB6) || \

+                                         (((__PIN__) & SYSCFG_FASTMODEPLUS_PB7) == SYSCFG_FASTMODEPLUS_PB7) || \

+                                         (((__PIN__) & SYSCFG_FASTMODEPLUS_PB8) == SYSCFG_FASTMODEPLUS_PB8) || \

+                                         (((__PIN__) & SYSCFG_FASTMODEPLUS_PB9) == SYSCFG_FASTMODEPLUS_PB9))

+#elif defined(SYSCFG_FASTMODEPLUS_PB8)

+#define IS_SYSCFG_FASTMODEPLUS(__PIN__) ((((__PIN__) & SYSCFG_FASTMODEPLUS_PB6) == SYSCFG_FASTMODEPLUS_PB6) || \

+                                         (((__PIN__) & SYSCFG_FASTMODEPLUS_PB7) == SYSCFG_FASTMODEPLUS_PB7) || \

+                                         (((__PIN__) & SYSCFG_FASTMODEPLUS_PB8) == SYSCFG_FASTMODEPLUS_PB8))

+#elif defined(SYSCFG_FASTMODEPLUS_PB9)

+#define IS_SYSCFG_FASTMODEPLUS(__PIN__) ((((__PIN__) & SYSCFG_FASTMODEPLUS_PB6) == SYSCFG_FASTMODEPLUS_PB6) || \

+                                         (((__PIN__) & SYSCFG_FASTMODEPLUS_PB7) == SYSCFG_FASTMODEPLUS_PB7) || \

+                                         (((__PIN__) & SYSCFG_FASTMODEPLUS_PB9) == SYSCFG_FASTMODEPLUS_PB9))

+#else

+#define IS_SYSCFG_FASTMODEPLUS(__PIN__) ((((__PIN__) & SYSCFG_FASTMODEPLUS_PB6) == SYSCFG_FASTMODEPLUS_PB6) || \

+                                         (((__PIN__) & SYSCFG_FASTMODEPLUS_PB7) == SYSCFG_FASTMODEPLUS_PB7))

+#endif

+/**

+  * @}

+  */

+

+/* Exported variables --------------------------------------------------------*/

+

+/** @addtogroup HAL_Exported_Variables

+  * @{

+  */

+extern __IO uint32_t uwTick;

+extern uint32_t uwTickPrio;

+extern uint32_t uwTickFreq;

+/**

+  * @}

+  */

+

+/* Exported functions --------------------------------------------------------*/

+

+/** @addtogroup HAL_Exported_Functions

+  * @{

+  */

+

+/** @addtogroup HAL_Exported_Functions_Group1

+  * @{

+  */

+

+/* Initialization and de-initialization functions  ******************************/

+HAL_StatusTypeDef HAL_Init(void);

+HAL_StatusTypeDef HAL_DeInit(void);

+void              HAL_MspInit(void);

+void              HAL_MspDeInit(void);

+HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority);

+

+/**

+  * @}

+  */

+

+/** @addtogroup HAL_Exported_Functions_Group2

+  * @{

+  */

+

+/* Peripheral Control functions  ************************************************/

+void               HAL_IncTick(void);

+void               HAL_Delay(uint32_t Delay);

+uint32_t           HAL_GetTick(void);

+uint32_t           HAL_GetTickPrio(void);

+HAL_StatusTypeDef  HAL_SetTickFreq(uint32_t Freq);

+uint32_t           HAL_GetTickFreq(void);

+void               HAL_SuspendTick(void);

+void               HAL_ResumeTick(void);

+uint32_t           HAL_GetHalVersion(void);

+uint32_t           HAL_GetREVID(void);

+uint32_t           HAL_GetDEVID(void);

+uint32_t           HAL_GetUIDw0(void);

+uint32_t           HAL_GetUIDw1(void);

+uint32_t           HAL_GetUIDw2(void);

+

+/**

+  * @}

+  */

+

+/** @addtogroup HAL_Exported_Functions_Group3

+  * @{

+  */

+

+/* DBGMCU Peripheral Control functions  *****************************************/

+void              HAL_DBGMCU_EnableDBGSleepMode(void);

+void              HAL_DBGMCU_DisableDBGSleepMode(void);

+void              HAL_DBGMCU_EnableDBGStopMode(void);

+void              HAL_DBGMCU_DisableDBGStopMode(void);

+void              HAL_DBGMCU_EnableDBGStandbyMode(void);

+void              HAL_DBGMCU_DisableDBGStandbyMode(void);

+

+/**

+  * @}

+  */

+

+/** @addtogroup HAL_Exported_Functions_Group4

+  * @{

+  */

+

+/* SYSCFG Control functions  ****************************************************/

+void              HAL_SYSCFG_SRAM2Erase(void);

+void              HAL_SYSCFG_EnableMemorySwappingBank(void);

+void              HAL_SYSCFG_DisableMemorySwappingBank(void);

+

+#if defined(VREFBUF)

+void              HAL_SYSCFG_VREFBUF_VoltageScalingConfig(uint32_t VoltageScaling);

+void              HAL_SYSCFG_VREFBUF_HighImpedanceConfig(uint32_t Mode);

+void              HAL_SYSCFG_VREFBUF_TrimmingConfig(uint32_t TrimmingValue);

+HAL_StatusTypeDef HAL_SYSCFG_EnableVREFBUF(void);

+void              HAL_SYSCFG_DisableVREFBUF(void);

+#endif /* VREFBUF */

+

+void              HAL_SYSCFG_EnableIOAnalogSwitchBooster(void);

+void              HAL_SYSCFG_DisableIOAnalogSwitchBooster(void);

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* STM32L4xx_HAL_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h
new file mode 100644
index 0000000..af333b8
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h
@@ -0,0 +1,417 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_cortex.h

+  * @author  MCD Application Team

+  * @brief   Header file of CORTEX HAL module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef __STM32L4xx_HAL_CORTEX_H

+#define __STM32L4xx_HAL_CORTEX_H

+

+#ifdef __cplusplus

+ extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup CORTEX CORTEX

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+/** @defgroup CORTEX_Exported_Types CORTEX Exported Types

+  * @{

+  */

+

+#if (__MPU_PRESENT == 1)

+/** @defgroup CORTEX_MPU_Region_Initialization_Structure_definition MPU Region Initialization Structure Definition

+  * @{

+  */

+typedef struct

+{

+  uint8_t                Enable;                /*!< Specifies the status of the region.

+                                                     This parameter can be a value of @ref CORTEX_MPU_Region_Enable                 */

+  uint8_t                Number;                /*!< Specifies the number of the region to protect.

+                                                     This parameter can be a value of @ref CORTEX_MPU_Region_Number                 */

+  uint32_t               BaseAddress;           /*!< Specifies the base address of the region to protect.                           */

+  uint8_t                Size;                  /*!< Specifies the size of the region to protect.

+                                                     This parameter can be a value of @ref CORTEX_MPU_Region_Size                   */

+  uint8_t                SubRegionDisable;      /*!< Specifies the number of the subregion protection to disable.

+                                                     This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF    */

+  uint8_t                TypeExtField;          /*!< Specifies the TEX field level.

+                                                     This parameter can be a value of @ref CORTEX_MPU_TEX_Levels                    */

+  uint8_t                AccessPermission;      /*!< Specifies the region access permission type.

+                                                     This parameter can be a value of @ref CORTEX_MPU_Region_Permission_Attributes  */

+  uint8_t                DisableExec;           /*!< Specifies the instruction access status.

+                                                     This parameter can be a value of @ref CORTEX_MPU_Instruction_Access            */

+  uint8_t                IsShareable;           /*!< Specifies the shareability status of the protected region.

+                                                     This parameter can be a value of @ref CORTEX_MPU_Access_Shareable              */

+  uint8_t                IsCacheable;           /*!< Specifies the cacheable status of the region protected.

+                                                     This parameter can be a value of @ref CORTEX_MPU_Access_Cacheable              */

+  uint8_t                IsBufferable;          /*!< Specifies the bufferable status of the protected region.

+                                                     This parameter can be a value of @ref CORTEX_MPU_Access_Bufferable             */

+}MPU_Region_InitTypeDef;

+/**

+  * @}

+  */

+#endif /* __MPU_PRESENT */

+

+/**

+  * @}

+  */

+

+/* Exported constants --------------------------------------------------------*/

+

+/** @defgroup CORTEX_Exported_Constants CORTEX Exported Constants

+  * @{

+  */

+

+/** @defgroup CORTEX_Preemption_Priority_Group CORTEX Preemption Priority Group

+  * @{

+  */

+#define NVIC_PRIORITYGROUP_0         ((uint32_t)0x00000007) /*!< 0 bit  for pre-emption priority,

+                                                                 4 bits for subpriority */

+#define NVIC_PRIORITYGROUP_1         ((uint32_t)0x00000006) /*!< 1 bit  for pre-emption priority,

+                                                                 3 bits for subpriority */

+#define NVIC_PRIORITYGROUP_2         ((uint32_t)0x00000005) /*!< 2 bits for pre-emption priority,

+                                                                 2 bits for subpriority */

+#define NVIC_PRIORITYGROUP_3         ((uint32_t)0x00000004) /*!< 3 bits for pre-emption priority,

+                                                                 1 bit  for subpriority */

+#define NVIC_PRIORITYGROUP_4         ((uint32_t)0x00000003) /*!< 4 bits for pre-emption priority,

+                                                                 0 bit  for subpriority */

+/**

+  * @}

+  */

+

+/** @defgroup CORTEX_SysTick_clock_source CORTEX SysTick clock source

+  * @{

+  */

+#define SYSTICK_CLKSOURCE_HCLK_DIV8    ((uint32_t)0x00000000)

+#define SYSTICK_CLKSOURCE_HCLK         ((uint32_t)0x00000004)

+/**

+  * @}

+  */

+

+#if (__MPU_PRESENT == 1)

+/** @defgroup CORTEX_MPU_HFNMI_PRIVDEF_Control CORTEX MPU HFNMI and PRIVILEGED Access control

+  * @{

+  */

+#define  MPU_HFNMI_PRIVDEF_NONE      ((uint32_t)0x00000000)

+#define  MPU_HARDFAULT_NMI           ((uint32_t)0x00000002)

+#define  MPU_PRIVILEGED_DEFAULT      ((uint32_t)0x00000004)

+#define  MPU_HFNMI_PRIVDEF           ((uint32_t)0x00000006)

+/**

+  * @}

+  */

+

+/** @defgroup CORTEX_MPU_Region_Enable CORTEX MPU Region Enable

+  * @{

+  */

+#define  MPU_REGION_ENABLE           ((uint8_t)0x01)

+#define  MPU_REGION_DISABLE          ((uint8_t)0x00)

+/**

+  * @}

+  */

+

+/** @defgroup CORTEX_MPU_Instruction_Access CORTEX MPU Instruction Access

+  * @{

+  */

+#define  MPU_INSTRUCTION_ACCESS_ENABLE      ((uint8_t)0x00)

+#define  MPU_INSTRUCTION_ACCESS_DISABLE     ((uint8_t)0x01)

+/**

+  * @}

+  */

+

+/** @defgroup CORTEX_MPU_Access_Shareable CORTEX MPU Instruction Access Shareable

+  * @{

+  */

+#define  MPU_ACCESS_SHAREABLE        ((uint8_t)0x01)

+#define  MPU_ACCESS_NOT_SHAREABLE    ((uint8_t)0x00)

+/**

+  * @}

+  */

+

+/** @defgroup CORTEX_MPU_Access_Cacheable CORTEX MPU Instruction Access Cacheable

+  * @{

+  */

+#define  MPU_ACCESS_CACHEABLE        ((uint8_t)0x01)

+#define  MPU_ACCESS_NOT_CACHEABLE    ((uint8_t)0x00)

+/**

+  * @}

+  */

+

+/** @defgroup CORTEX_MPU_Access_Bufferable CORTEX MPU Instruction Access Bufferable

+  * @{

+  */

+#define  MPU_ACCESS_BUFFERABLE       ((uint8_t)0x01)

+#define  MPU_ACCESS_NOT_BUFFERABLE   ((uint8_t)0x00)

+/**

+  * @}

+  */

+

+/** @defgroup CORTEX_MPU_TEX_Levels CORTEX MPU TEX Levels

+  * @{

+  */

+#define  MPU_TEX_LEVEL0              ((uint8_t)0x00)

+#define  MPU_TEX_LEVEL1              ((uint8_t)0x01)

+#define  MPU_TEX_LEVEL2              ((uint8_t)0x02)

+/**

+  * @}

+  */

+

+/** @defgroup CORTEX_MPU_Region_Size CORTEX MPU Region Size

+  * @{

+  */

+#define   MPU_REGION_SIZE_32B        ((uint8_t)0x04)

+#define   MPU_REGION_SIZE_64B        ((uint8_t)0x05)

+#define   MPU_REGION_SIZE_128B       ((uint8_t)0x06)

+#define   MPU_REGION_SIZE_256B       ((uint8_t)0x07)

+#define   MPU_REGION_SIZE_512B       ((uint8_t)0x08)

+#define   MPU_REGION_SIZE_1KB        ((uint8_t)0x09)

+#define   MPU_REGION_SIZE_2KB        ((uint8_t)0x0A)

+#define   MPU_REGION_SIZE_4KB        ((uint8_t)0x0B)

+#define   MPU_REGION_SIZE_8KB        ((uint8_t)0x0C)

+#define   MPU_REGION_SIZE_16KB       ((uint8_t)0x0D)

+#define   MPU_REGION_SIZE_32KB       ((uint8_t)0x0E)

+#define   MPU_REGION_SIZE_64KB       ((uint8_t)0x0F)

+#define   MPU_REGION_SIZE_128KB      ((uint8_t)0x10)

+#define   MPU_REGION_SIZE_256KB      ((uint8_t)0x11)

+#define   MPU_REGION_SIZE_512KB      ((uint8_t)0x12)

+#define   MPU_REGION_SIZE_1MB        ((uint8_t)0x13)

+#define   MPU_REGION_SIZE_2MB        ((uint8_t)0x14)

+#define   MPU_REGION_SIZE_4MB        ((uint8_t)0x15)

+#define   MPU_REGION_SIZE_8MB        ((uint8_t)0x16)

+#define   MPU_REGION_SIZE_16MB       ((uint8_t)0x17)

+#define   MPU_REGION_SIZE_32MB       ((uint8_t)0x18)

+#define   MPU_REGION_SIZE_64MB       ((uint8_t)0x19)

+#define   MPU_REGION_SIZE_128MB      ((uint8_t)0x1A)

+#define   MPU_REGION_SIZE_256MB      ((uint8_t)0x1B)

+#define   MPU_REGION_SIZE_512MB      ((uint8_t)0x1C)

+#define   MPU_REGION_SIZE_1GB        ((uint8_t)0x1D)

+#define   MPU_REGION_SIZE_2GB        ((uint8_t)0x1E)

+#define   MPU_REGION_SIZE_4GB        ((uint8_t)0x1F)

+/**

+  * @}

+  */

+

+/** @defgroup CORTEX_MPU_Region_Permission_Attributes CORTEX MPU Region Permission Attributes

+  * @{

+  */

+#define  MPU_REGION_NO_ACCESS        ((uint8_t)0x00)

+#define  MPU_REGION_PRIV_RW          ((uint8_t)0x01)

+#define  MPU_REGION_PRIV_RW_URO      ((uint8_t)0x02)

+#define  MPU_REGION_FULL_ACCESS      ((uint8_t)0x03)

+#define  MPU_REGION_PRIV_RO          ((uint8_t)0x05)

+#define  MPU_REGION_PRIV_RO_URO      ((uint8_t)0x06)

+/**

+  * @}

+  */

+

+/** @defgroup CORTEX_MPU_Region_Number CORTEX MPU Region Number

+  * @{

+  */

+#define  MPU_REGION_NUMBER0          ((uint8_t)0x00)

+#define  MPU_REGION_NUMBER1          ((uint8_t)0x01)

+#define  MPU_REGION_NUMBER2          ((uint8_t)0x02)

+#define  MPU_REGION_NUMBER3          ((uint8_t)0x03)

+#define  MPU_REGION_NUMBER4          ((uint8_t)0x04)

+#define  MPU_REGION_NUMBER5          ((uint8_t)0x05)

+#define  MPU_REGION_NUMBER6          ((uint8_t)0x06)

+#define  MPU_REGION_NUMBER7          ((uint8_t)0x07)

+/**

+  * @}

+  */

+#endif /* __MPU_PRESENT */

+

+/**

+  * @}

+  */

+

+/* Exported macros -----------------------------------------------------------*/

+/** @defgroup CORTEX_Exported_Macros CORTEX Exported Macros

+  * @{

+  */

+

+/**

+  * @}

+  */

+

+/* Exported functions --------------------------------------------------------*/

+/** @defgroup CORTEX_Exported_Functions CORTEX Exported Functions

+  * @{

+  */

+

+/** @defgroup CORTEX_Exported_Functions_Group1 Initialization and Configuration functions

+  * @brief    Initialization and Configuration functions

+  * @{

+  */

+/* Initialization and Configuration functions *****************************/

+void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);

+void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority);

+void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);

+void HAL_NVIC_DisableIRQ(IRQn_Type IRQn);

+void HAL_NVIC_SystemReset(void);

+uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb);

+

+/**

+  * @}

+  */

+

+/** @defgroup CORTEX_Exported_Functions_Group2 Peripheral Control functions

+  * @brief   Cortex control functions

+  * @{

+  */

+/* Peripheral Control functions ***********************************************/

+uint32_t HAL_NVIC_GetPriorityGrouping(void);

+void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority);

+uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn);

+void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn);

+void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn);

+uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn);

+void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource);

+void HAL_SYSTICK_IRQHandler(void);

+void HAL_SYSTICK_Callback(void);

+

+#if (__MPU_PRESENT == 1)

+void HAL_MPU_Enable(uint32_t MPU_Control);

+void HAL_MPU_Disable(void);

+void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init);

+#endif /* __MPU_PRESENT */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Private types -------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/* Private constants ---------------------------------------------------------*/

+/* Private macros ------------------------------------------------------------*/

+/** @defgroup CORTEX_Private_Macros CORTEX Private Macros

+  * @{

+  */

+#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PRIORITYGROUP_0) || \

+                                       ((GROUP) == NVIC_PRIORITYGROUP_1) || \

+                                       ((GROUP) == NVIC_PRIORITYGROUP_2) || \

+                                       ((GROUP) == NVIC_PRIORITYGROUP_3) || \

+                                       ((GROUP) == NVIC_PRIORITYGROUP_4))

+

+#define IS_NVIC_PREEMPTION_PRIORITY(PRIORITY)  ((PRIORITY) < 0x10)

+

+#define IS_NVIC_SUB_PRIORITY(PRIORITY)         ((PRIORITY) < 0x10)

+

+#define IS_NVIC_DEVICE_IRQ(IRQ)                ((IRQ) >= 0x00)

+

+#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SYSTICK_CLKSOURCE_HCLK) || \

+                                       ((SOURCE) == SYSTICK_CLKSOURCE_HCLK_DIV8))

+

+#if (__MPU_PRESENT == 1)

+#define IS_MPU_REGION_ENABLE(STATE) (((STATE) == MPU_REGION_ENABLE) || \

+                                     ((STATE) == MPU_REGION_DISABLE))

+

+#define IS_MPU_INSTRUCTION_ACCESS(STATE) (((STATE) == MPU_INSTRUCTION_ACCESS_ENABLE) || \

+                                          ((STATE) == MPU_INSTRUCTION_ACCESS_DISABLE))

+

+#define IS_MPU_ACCESS_SHAREABLE(STATE)   (((STATE) == MPU_ACCESS_SHAREABLE) || \

+                                          ((STATE) == MPU_ACCESS_NOT_SHAREABLE))

+

+#define IS_MPU_ACCESS_CACHEABLE(STATE)   (((STATE) == MPU_ACCESS_CACHEABLE) || \

+                                          ((STATE) == MPU_ACCESS_NOT_CACHEABLE))

+

+#define IS_MPU_ACCESS_BUFFERABLE(STATE)   (((STATE) == MPU_ACCESS_BUFFERABLE) || \

+                                          ((STATE) == MPU_ACCESS_NOT_BUFFERABLE))

+

+#define IS_MPU_TEX_LEVEL(TYPE) (((TYPE) == MPU_TEX_LEVEL0)  || \

+                                ((TYPE) == MPU_TEX_LEVEL1)  || \

+                                ((TYPE) == MPU_TEX_LEVEL2))

+

+#define IS_MPU_REGION_PERMISSION_ATTRIBUTE(TYPE) (((TYPE) == MPU_REGION_NO_ACCESS)   || \

+                                                  ((TYPE) == MPU_REGION_PRIV_RW)     || \

+                                                  ((TYPE) == MPU_REGION_PRIV_RW_URO) || \

+                                                  ((TYPE) == MPU_REGION_FULL_ACCESS) || \

+                                                  ((TYPE) == MPU_REGION_PRIV_RO)     || \

+                                                  ((TYPE) == MPU_REGION_PRIV_RO_URO))

+

+#define IS_MPU_REGION_NUMBER(NUMBER)    (((NUMBER) == MPU_REGION_NUMBER0) || \

+                                         ((NUMBER) == MPU_REGION_NUMBER1) || \

+                                         ((NUMBER) == MPU_REGION_NUMBER2) || \

+                                         ((NUMBER) == MPU_REGION_NUMBER3) || \

+                                         ((NUMBER) == MPU_REGION_NUMBER4) || \

+                                         ((NUMBER) == MPU_REGION_NUMBER5) || \

+                                         ((NUMBER) == MPU_REGION_NUMBER6) || \

+                                         ((NUMBER) == MPU_REGION_NUMBER7))

+

+#define IS_MPU_REGION_SIZE(SIZE)    (((SIZE) == MPU_REGION_SIZE_32B)   || \

+                                     ((SIZE) == MPU_REGION_SIZE_64B)   || \

+                                     ((SIZE) == MPU_REGION_SIZE_128B)  || \

+                                     ((SIZE) == MPU_REGION_SIZE_256B)  || \

+                                     ((SIZE) == MPU_REGION_SIZE_512B)  || \

+                                     ((SIZE) == MPU_REGION_SIZE_1KB)   || \

+                                     ((SIZE) == MPU_REGION_SIZE_2KB)   || \

+                                     ((SIZE) == MPU_REGION_SIZE_4KB)   || \

+                                     ((SIZE) == MPU_REGION_SIZE_8KB)   || \

+                                     ((SIZE) == MPU_REGION_SIZE_16KB)  || \

+                                     ((SIZE) == MPU_REGION_SIZE_32KB)  || \

+                                     ((SIZE) == MPU_REGION_SIZE_64KB)  || \

+                                     ((SIZE) == MPU_REGION_SIZE_128KB) || \

+                                     ((SIZE) == MPU_REGION_SIZE_256KB) || \

+                                     ((SIZE) == MPU_REGION_SIZE_512KB) || \

+                                     ((SIZE) == MPU_REGION_SIZE_1MB)   || \

+                                     ((SIZE) == MPU_REGION_SIZE_2MB)   || \

+                                     ((SIZE) == MPU_REGION_SIZE_4MB)   || \

+                                     ((SIZE) == MPU_REGION_SIZE_8MB)   || \

+                                     ((SIZE) == MPU_REGION_SIZE_16MB)  || \

+                                     ((SIZE) == MPU_REGION_SIZE_32MB)  || \

+                                     ((SIZE) == MPU_REGION_SIZE_64MB)  || \

+                                     ((SIZE) == MPU_REGION_SIZE_128MB) || \

+                                     ((SIZE) == MPU_REGION_SIZE_256MB) || \

+                                     ((SIZE) == MPU_REGION_SIZE_512MB) || \

+                                     ((SIZE) == MPU_REGION_SIZE_1GB)   || \

+                                     ((SIZE) == MPU_REGION_SIZE_2GB)   || \

+                                     ((SIZE) == MPU_REGION_SIZE_4GB))

+

+#define IS_MPU_SUB_REGION_DISABLE(SUBREGION)  ((SUBREGION) < (uint16_t)0x00FF)

+#endif /* __MPU_PRESENT */

+

+/**

+  * @}

+  */

+

+/* Private functions ---------------------------------------------------------*/

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* __STM32L4xx_HAL_CORTEX_H */

+

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h
new file mode 100644
index 0000000..e96526d
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h
@@ -0,0 +1,197 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_def.h

+  * @author  MCD Application Team

+  * @brief   This file contains HAL common defines, enumeration, macros and

+  *          structures definitions.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef STM32L4xx_HAL_DEF_H

+#define STM32L4xx_HAL_DEF_H

+

+#ifdef __cplusplus

+ extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx.h"

+#include "Legacy/stm32_hal_legacy.h"  /* Aliases file for old names compatibility */

+#include <stddef.h>

+

+/* Exported types ------------------------------------------------------------*/

+

+/**

+  * @brief  HAL Status structures definition

+  */

+typedef enum

+{

+  HAL_OK       = 0x00,

+  HAL_ERROR    = 0x01,

+  HAL_BUSY     = 0x02,

+  HAL_TIMEOUT  = 0x03

+} HAL_StatusTypeDef;

+

+/**

+  * @brief  HAL Lock structures definition

+  */

+typedef enum

+{

+  HAL_UNLOCKED = 0x00,

+  HAL_LOCKED   = 0x01

+} HAL_LockTypeDef;

+

+/* Exported macros -----------------------------------------------------------*/

+

+#define UNUSED(X) (void)X      /* To avoid gcc/g++ warnings */

+

+#define HAL_MAX_DELAY      0xFFFFFFFFU

+

+#define HAL_IS_BIT_SET(REG, BIT)         (((REG) & (BIT)) == (BIT))

+#define HAL_IS_BIT_CLR(REG, BIT)         (((REG) & (BIT)) == 0U)

+

+#define __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__)             \

+                        do{                                                      \

+                            (__HANDLE__)->__PPP_DMA_FIELD__ = &(__DMA_HANDLE__); \

+                            (__DMA_HANDLE__).Parent = (__HANDLE__);              \

+                        } while(0)

+

+/** @brief Reset the Handle's State field.

+  * @param __HANDLE__: specifies the Peripheral Handle.

+  * @note  This macro can be used for the following purpose:

+  *          - When the Handle is declared as local variable; before passing it as parameter

+  *            to HAL_PPP_Init() for the first time, it is mandatory to use this macro

+  *            to set to 0 the Handle's "State" field.

+  *            Otherwise, "State" field may have any random value and the first time the function

+  *            HAL_PPP_Init() is called, the low level hardware initialization will be missed

+  *            (i.e. HAL_PPP_MspInit() will not be executed).

+  *          - When there is a need to reconfigure the low level hardware: instead of calling

+  *            HAL_PPP_DeInit() then HAL_PPP_Init(), user can make a call to this macro then HAL_PPP_Init().

+  *            In this later function, when the Handle's "State" field is set to 0, it will execute the function

+  *            HAL_PPP_MspInit() which will reconfigure the low level hardware.

+  * @retval None

+  */

+#define __HAL_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = 0)

+

+#if (USE_RTOS == 1)

+  /* Reserved for future use */

+  #error " USE_RTOS should be 0 in the current HAL release "

+#else

+  #define __HAL_LOCK(__HANDLE__)                                           \

+                                do{                                        \

+                                    if((__HANDLE__)->Lock == HAL_LOCKED)   \

+                                    {                                      \

+                                       return HAL_BUSY;                    \

+                                    }                                      \

+                                    else                                   \

+                                    {                                      \

+                                       (__HANDLE__)->Lock = HAL_LOCKED;    \

+                                    }                                      \

+                                  }while (0)

+

+  #define __HAL_UNLOCK(__HANDLE__)                                          \

+                                  do{                                       \

+                                      (__HANDLE__)->Lock = HAL_UNLOCKED;    \

+                                    }while (0)

+#endif /* USE_RTOS */

+

+#if defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */

+  #ifndef __weak

+    #define __weak   __attribute__((weak))

+  #endif /* __weak */

+  #ifndef __packed

+    #define __packed __attribute__((__packed__))

+  #endif /* __packed */

+#endif /* __GNUC__ */

+

+

+/* Macro to get variable aligned on 4-bytes, for __ICCARM__ the directive "#pragma data_alignment=4" must be used instead */

+#if defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */

+  #ifndef __ALIGN_END

+    #define __ALIGN_END    __attribute__ ((aligned (4)))

+  #endif /* __ALIGN_END */

+  #ifndef __ALIGN_BEGIN

+    #define __ALIGN_BEGIN

+  #endif /* __ALIGN_BEGIN */

+#else

+  #ifndef __ALIGN_END

+    #define __ALIGN_END

+  #endif /* __ALIGN_END */

+  #ifndef __ALIGN_BEGIN

+    #if defined   (__CC_ARM)      /* ARM Compiler */

+      #define __ALIGN_BEGIN    __align(4)

+    #elif defined (__ICCARM__)    /* IAR Compiler */

+      #define __ALIGN_BEGIN

+    #endif /* __CC_ARM */

+  #endif /* __ALIGN_BEGIN */

+#endif /* __GNUC__ */

+

+/**

+  * @brief  __RAM_FUNC definition

+  */

+#if defined ( __CC_ARM   )

+/* ARM Compiler

+   ------------

+   RAM functions are defined using the toolchain options.

+   Functions that are executed in RAM should reside in a separate source module.

+   Using the 'Options for File' dialog you can simply change the 'Code / Const'

+   area of a module to a memory space in physical RAM.

+   Available memory areas are declared in the 'Target' tab of the 'Options for Target'

+   dialog.

+*/

+#define __RAM_FUNC HAL_StatusTypeDef

+

+#elif defined ( __ICCARM__ )

+/* ICCARM Compiler

+   ---------------

+   RAM functions are defined using a specific toolchain keyword "__ramfunc".

+*/

+#define __RAM_FUNC __ramfunc HAL_StatusTypeDef

+

+#elif defined   (  __GNUC__  )

+/* GNU Compiler

+   ------------

+  RAM functions are defined using a specific toolchain attribute

+   "__attribute__((section(".RamFunc")))".

+*/

+#define __RAM_FUNC HAL_StatusTypeDef  __attribute__((section(".RamFunc")))

+

+#endif

+

+/**

+  * @brief  __NOINLINE definition

+  */

+#if defined ( __CC_ARM   ) || defined   (  __GNUC__  )

+/* ARM & GNUCompiler

+   ----------------

+*/

+#define __NOINLINE __attribute__ ( (noinline) )

+

+#elif defined ( __ICCARM__ )

+/* ICCARM Compiler

+   ---------------

+*/

+#define __NOINLINE _Pragma("optimize = no_inline")

+

+#endif

+

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* STM32L4xx_HAL_DEF_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dfsdm.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dfsdm.h
new file mode 100644
index 0000000..50ce0b2
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dfsdm.h
@@ -0,0 +1,887 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_dfsdm.h

+  * @author  MCD Application Team

+  * @brief   Header file of DFSDM HAL module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef STM32L4xx_HAL_DFSDM_H

+#define STM32L4xx_HAL_DFSDM_H

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#if defined(STM32L451xx) || defined(STM32L452xx) || defined(STM32L462xx) || \

+    defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx) || \

+    defined(STM32L496xx) || defined(STM32L4A6xx) || \

+    defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup DFSDM

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+/** @defgroup DFSDM_Exported_Types DFSDM Exported Types

+  * @{

+  */

+

+/**

+  * @brief  HAL DFSDM Channel states definition

+  */

+typedef enum

+{

+  HAL_DFSDM_CHANNEL_STATE_RESET = 0x00U, /*!< DFSDM channel not initialized */

+  HAL_DFSDM_CHANNEL_STATE_READY = 0x01U, /*!< DFSDM channel initialized and ready for use */

+  HAL_DFSDM_CHANNEL_STATE_ERROR = 0xFFU  /*!< DFSDM channel state error */

+} HAL_DFSDM_Channel_StateTypeDef;

+

+/**

+  * @brief  DFSDM channel output clock structure definition

+  */

+typedef struct

+{

+  FunctionalState Activation; /*!< Output clock enable/disable */

+  uint32_t        Selection;  /*!< Output clock is system clock or audio clock.

+                                   This parameter can be a value of @ref DFSDM_Channel_OuputClock */

+  uint32_t        Divider;    /*!< Output clock divider.

+                                   This parameter must be a number between Min_Data = 2 and Max_Data = 256 */

+} DFSDM_Channel_OutputClockTypeDef;

+

+/**

+  * @brief  DFSDM channel input structure definition

+  */

+typedef struct

+{

+  uint32_t Multiplexer; /*!< Input is external serial inputs, internal register or ADC output.

+                             ADC output is available only on STM32L451xx, STM32L452xx, STM32L462xx,

+                             STM32L496xx, STM32L4A6xx, STM32L4R5xx, STM32L4R7xx, STM32L4R9xx,

+                             STM32L4S5xx, STM32L4S7xx and STM32L4S9xx products.

+                             This parameter can be a value of @ref DFSDM_Channel_InputMultiplexer */

+  uint32_t DataPacking; /*!< Standard, interleaved or dual mode for internal register.

+                             This parameter can be a value of @ref DFSDM_Channel_DataPacking */

+  uint32_t Pins;        /*!< Input pins are taken from same or following channel.

+                             This parameter can be a value of @ref DFSDM_Channel_InputPins */

+} DFSDM_Channel_InputTypeDef;

+

+/**

+  * @brief  DFSDM channel serial interface structure definition

+  */

+typedef struct

+{

+  uint32_t Type;     /*!< SPI or Manchester modes.

+                          This parameter can be a value of @ref DFSDM_Channel_SerialInterfaceType */

+  uint32_t SpiClock; /*!< SPI clock select (external or internal with different sampling point).

+                          This parameter can be a value of @ref DFSDM_Channel_SpiClock */

+} DFSDM_Channel_SerialInterfaceTypeDef;

+

+/**

+  * @brief  DFSDM channel analog watchdog structure definition

+  */

+typedef struct

+{

+  uint32_t FilterOrder;  /*!< Analog watchdog Sinc filter order.

+                              This parameter can be a value of @ref DFSDM_Channel_AwdFilterOrder */

+  uint32_t Oversampling; /*!< Analog watchdog filter oversampling ratio.

+                              This parameter must be a number between Min_Data = 1 and Max_Data = 32 */

+} DFSDM_Channel_AwdTypeDef;

+

+/**

+  * @brief  DFSDM channel init structure definition

+  */

+typedef struct

+{

+  DFSDM_Channel_OutputClockTypeDef     OutputClock;     /*!< DFSDM channel output clock parameters */

+  DFSDM_Channel_InputTypeDef           Input;           /*!< DFSDM channel input parameters */

+  DFSDM_Channel_SerialInterfaceTypeDef SerialInterface; /*!< DFSDM channel serial interface parameters */

+  DFSDM_Channel_AwdTypeDef             Awd;             /*!< DFSDM channel analog watchdog parameters */

+  int32_t                              Offset;          /*!< DFSDM channel offset.

+                                                             This parameter must be a number between Min_Data = -8388608 and Max_Data = 8388607 */

+  uint32_t                             RightBitShift;   /*!< DFSDM channel right bit shift.

+                                                             This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F */

+} DFSDM_Channel_InitTypeDef;

+

+/**

+  * @brief  DFSDM channel handle structure definition

+  */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+typedef struct __DFSDM_Channel_HandleTypeDef

+#else

+typedef struct

+#endif /* USE_HAL_DFSDM_REGISTER_CALLBACKS */

+{

+  DFSDM_Channel_TypeDef          *Instance; /*!< DFSDM channel instance */

+  DFSDM_Channel_InitTypeDef      Init;      /*!< DFSDM channel init parameters */

+  HAL_DFSDM_Channel_StateTypeDef State;     /*!< DFSDM channel state */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+  void (*CkabCallback)(struct __DFSDM_Channel_HandleTypeDef *hdfsdm_channel);       /*!< DFSDM channel clock absence detection callback */

+  void (*ScdCallback)(struct __DFSDM_Channel_HandleTypeDef *hdfsdm_channel);        /*!< DFSDM channel short circuit detection callback */

+  void (*MspInitCallback)(struct __DFSDM_Channel_HandleTypeDef *hdfsdm_channel);    /*!< DFSDM channel MSP init callback */

+  void (*MspDeInitCallback)(struct __DFSDM_Channel_HandleTypeDef *hdfsdm_channel);  /*!< DFSDM channel MSP de-init callback */

+#endif

+} DFSDM_Channel_HandleTypeDef;

+

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+/**

+  * @brief  DFSDM channel callback ID enumeration definition

+  */

+typedef enum

+{

+  HAL_DFSDM_CHANNEL_CKAB_CB_ID      = 0x00U, /*!< DFSDM channel clock absence detection callback ID */

+  HAL_DFSDM_CHANNEL_SCD_CB_ID       = 0x01U, /*!< DFSDM channel short circuit detection callback ID */

+  HAL_DFSDM_CHANNEL_MSPINIT_CB_ID   = 0x02U, /*!< DFSDM channel MSP init callback ID */

+  HAL_DFSDM_CHANNEL_MSPDEINIT_CB_ID = 0x03U  /*!< DFSDM channel MSP de-init callback ID */

+} HAL_DFSDM_Channel_CallbackIDTypeDef;

+

+/**

+  * @brief  DFSDM channel callback pointer definition

+  */

+typedef void (*pDFSDM_Channel_CallbackTypeDef)(DFSDM_Channel_HandleTypeDef *hdfsdm_channel);

+#endif

+

+/**

+  * @brief  HAL DFSDM Filter states definition

+  */

+typedef enum

+{

+  HAL_DFSDM_FILTER_STATE_RESET   = 0x00U, /*!< DFSDM filter not initialized */

+  HAL_DFSDM_FILTER_STATE_READY   = 0x01U, /*!< DFSDM filter initialized and ready for use */

+  HAL_DFSDM_FILTER_STATE_REG     = 0x02U, /*!< DFSDM filter regular conversion in progress */

+  HAL_DFSDM_FILTER_STATE_INJ     = 0x03U, /*!< DFSDM filter injected conversion in progress */

+  HAL_DFSDM_FILTER_STATE_REG_INJ = 0x04U, /*!< DFSDM filter regular and injected conversions in progress */

+  HAL_DFSDM_FILTER_STATE_ERROR   = 0xFFU  /*!< DFSDM filter state error */

+} HAL_DFSDM_Filter_StateTypeDef;

+

+/**

+  * @brief  DFSDM filter regular conversion parameters structure definition

+  */

+typedef struct

+{

+  uint32_t        Trigger;  /*!< Trigger used to start regular conversion: software or synchronous.

+                                 This parameter can be a value of @ref DFSDM_Filter_Trigger */

+  FunctionalState FastMode; /*!< Enable/disable fast mode for regular conversion */

+  FunctionalState DmaMode;  /*!< Enable/disable DMA for regular conversion */

+} DFSDM_Filter_RegularParamTypeDef;

+

+/**

+  * @brief  DFSDM filter injected conversion parameters structure definition

+  */

+typedef struct

+{

+  uint32_t        Trigger;        /*!< Trigger used to start injected conversion: software, external or synchronous.

+                                       This parameter can be a value of @ref DFSDM_Filter_Trigger */

+  FunctionalState ScanMode;       /*!< Enable/disable scanning mode for injected conversion */

+  FunctionalState DmaMode;        /*!< Enable/disable DMA for injected conversion */

+  uint32_t        ExtTrigger;     /*!< External trigger.

+                                       This parameter can be a value of @ref DFSDM_Filter_ExtTrigger */

+  uint32_t        ExtTriggerEdge; /*!< External trigger edge: rising, falling or both.

+                                       This parameter can be a value of @ref DFSDM_Filter_ExtTriggerEdge */

+} DFSDM_Filter_InjectedParamTypeDef;

+

+/**

+  * @brief  DFSDM filter parameters structure definition

+  */

+typedef struct

+{

+  uint32_t SincOrder;       /*!< Sinc filter order.

+                                 This parameter can be a value of @ref DFSDM_Filter_SincOrder */

+  uint32_t Oversampling;    /*!< Filter oversampling ratio.

+                                 This parameter must be a number between Min_Data = 1 and Max_Data = 1024 */

+  uint32_t IntOversampling; /*!< Integrator oversampling ratio.

+                                 This parameter must be a number between Min_Data = 1 and Max_Data = 256 */

+} DFSDM_Filter_FilterParamTypeDef;

+

+/**

+  * @brief  DFSDM filter init structure definition

+  */

+typedef struct

+{

+  DFSDM_Filter_RegularParamTypeDef  RegularParam;  /*!< DFSDM regular conversion parameters */

+  DFSDM_Filter_InjectedParamTypeDef InjectedParam; /*!< DFSDM injected conversion parameters */

+  DFSDM_Filter_FilterParamTypeDef   FilterParam;   /*!< DFSDM filter parameters */

+} DFSDM_Filter_InitTypeDef;

+

+/**

+  * @brief  DFSDM filter handle structure definition

+  */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+typedef struct __DFSDM_Filter_HandleTypeDef

+#else

+typedef struct

+#endif /* USE_HAL_DFSDM_REGISTER_CALLBACKS */

+{

+  DFSDM_Filter_TypeDef          *Instance;           /*!< DFSDM filter instance */

+  DFSDM_Filter_InitTypeDef      Init;                /*!< DFSDM filter init parameters */

+  DMA_HandleTypeDef             *hdmaReg;            /*!< Pointer on DMA handler for regular conversions */

+  DMA_HandleTypeDef             *hdmaInj;            /*!< Pointer on DMA handler for injected conversions */

+  uint32_t                      RegularContMode;     /*!< Regular conversion continuous mode */

+  uint32_t                      RegularTrigger;      /*!< Trigger used for regular conversion */

+  uint32_t                      InjectedTrigger;     /*!< Trigger used for injected conversion */

+  uint32_t                      ExtTriggerEdge;      /*!< Rising, falling or both edges selected */

+  FunctionalState               InjectedScanMode;    /*!< Injected scanning mode */

+  uint32_t                      InjectedChannelsNbr; /*!< Number of channels in injected sequence */

+  uint32_t                      InjConvRemaining;    /*!< Injected conversions remaining */

+  HAL_DFSDM_Filter_StateTypeDef State;               /*!< DFSDM filter state */

+  uint32_t                      ErrorCode;           /*!< DFSDM filter error code */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+  void (*AwdCallback)(struct __DFSDM_Filter_HandleTypeDef *hdfsdm_filter,

+                      uint32_t Channel, uint32_t Threshold);                            /*!< DFSDM filter analog watchdog callback */

+  void (*RegConvCpltCallback)(struct __DFSDM_Filter_HandleTypeDef *hdfsdm_filter);      /*!< DFSDM filter regular conversion complete callback */

+  void (*RegConvHalfCpltCallback)(struct __DFSDM_Filter_HandleTypeDef *hdfsdm_filter);  /*!< DFSDM filter half regular conversion complete callback */

+  void (*InjConvCpltCallback)(struct __DFSDM_Filter_HandleTypeDef *hdfsdm_filter);      /*!< DFSDM filter injected conversion complete callback */

+  void (*InjConvHalfCpltCallback)(struct __DFSDM_Filter_HandleTypeDef *hdfsdm_filter);  /*!< DFSDM filter half injected conversion complete callback */

+  void (*ErrorCallback)(struct __DFSDM_Filter_HandleTypeDef *hdfsdm_filter);            /*!< DFSDM filter error callback */

+  void (*MspInitCallback)(struct __DFSDM_Filter_HandleTypeDef *hdfsdm_filter);          /*!< DFSDM filter MSP init callback */

+  void (*MspDeInitCallback)(struct __DFSDM_Filter_HandleTypeDef *hdfsdm_filter);        /*!< DFSDM filter MSP de-init callback */

+#endif

+} DFSDM_Filter_HandleTypeDef;

+

+/**

+  * @brief  DFSDM filter analog watchdog parameters structure definition

+  */

+typedef struct

+{

+  uint32_t DataSource;      /*!< Values from digital filter or from channel watchdog filter.

+                                 This parameter can be a value of @ref DFSDM_Filter_AwdDataSource */

+  uint32_t Channel;         /*!< Analog watchdog channel selection.

+                                 This parameter can be a values combination of @ref DFSDM_Channel_Selection */

+  int32_t  HighThreshold;   /*!< High threshold for the analog watchdog.

+                                 This parameter must be a number between Min_Data = -8388608 and Max_Data = 8388607 */

+  int32_t  LowThreshold;    /*!< Low threshold for the analog watchdog.

+                                 This parameter must be a number between Min_Data = -8388608 and Max_Data = 8388607 */

+  uint32_t HighBreakSignal; /*!< Break signal assigned to analog watchdog high threshold event.

+                                 This parameter can be a values combination of @ref DFSDM_BreakSignals */

+  uint32_t LowBreakSignal;  /*!< Break signal assigned to analog watchdog low threshold event.

+                                 This parameter can be a values combination of @ref DFSDM_BreakSignals */

+} DFSDM_Filter_AwdParamTypeDef;

+

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+/**

+  * @brief  DFSDM filter callback ID enumeration definition

+  */

+typedef enum

+{

+  HAL_DFSDM_FILTER_REGCONV_COMPLETE_CB_ID     = 0x00U, /*!< DFSDM filter regular conversion complete callback ID */

+  HAL_DFSDM_FILTER_REGCONV_HALFCOMPLETE_CB_ID = 0x01U, /*!< DFSDM filter half regular conversion complete callback ID */

+  HAL_DFSDM_FILTER_INJCONV_COMPLETE_CB_ID     = 0x02U, /*!< DFSDM filter injected conversion complete callback ID */

+  HAL_DFSDM_FILTER_INJCONV_HALFCOMPLETE_CB_ID = 0x03U, /*!< DFSDM filter half injected conversion complete callback ID */

+  HAL_DFSDM_FILTER_ERROR_CB_ID                = 0x04U, /*!< DFSDM filter error callback ID */

+  HAL_DFSDM_FILTER_MSPINIT_CB_ID              = 0x05U, /*!< DFSDM filter MSP init callback ID */

+  HAL_DFSDM_FILTER_MSPDEINIT_CB_ID            = 0x06U  /*!< DFSDM filter MSP de-init callback ID */

+} HAL_DFSDM_Filter_CallbackIDTypeDef;

+

+/**

+  * @brief  DFSDM filter callback pointer definition

+  */

+typedef void (*pDFSDM_Filter_CallbackTypeDef)(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+typedef void (*pDFSDM_Filter_AwdCallbackTypeDef)(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, uint32_t Channel, uint32_t Threshold);

+#endif

+

+/**

+  * @}

+  */

+/* End of exported types -----------------------------------------------------*/

+

+/* Exported constants --------------------------------------------------------*/

+/** @defgroup DFSDM_Exported_Constants DFSDM Exported Constants

+  * @{

+  */

+

+/** @defgroup DFSDM_Channel_OuputClock DFSDM channel output clock selection

+  * @{

+  */

+#define DFSDM_CHANNEL_OUTPUT_CLOCK_SYSTEM    0x00000000U             /*!< Source for ouput clock is system clock */

+#define DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO     DFSDM_CHCFGR1_CKOUTSRC  /*!< Source for ouput clock is audio clock */

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Channel_InputMultiplexer DFSDM channel input multiplexer

+  * @{

+  */

+#define DFSDM_CHANNEL_EXTERNAL_INPUTS    0x00000000U             /*!< Data are taken from external inputs */

+#if defined(STM32L451xx) || defined(STM32L452xx) || defined(STM32L462xx) || \

+    defined(STM32L496xx) || defined(STM32L4A6xx) || \

+    defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+#define DFSDM_CHANNEL_ADC_OUTPUT         DFSDM_CHCFGR1_DATMPX_0  /*!< Data are taken from ADC output */

+#endif /* STM32L451xx || STM32L452xx || STM32L462xx || STM32L496xx || STM32L4A6xx || STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+#define DFSDM_CHANNEL_INTERNAL_REGISTER  DFSDM_CHCFGR1_DATMPX_1  /*!< Data are taken from internal register */

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Channel_DataPacking DFSDM channel input data packing

+  * @{

+  */

+#define DFSDM_CHANNEL_STANDARD_MODE         0x00000000U             /*!< Standard data packing mode */

+#define DFSDM_CHANNEL_INTERLEAVED_MODE      DFSDM_CHCFGR1_DATPACK_0 /*!< Interleaved data packing mode */

+#define DFSDM_CHANNEL_DUAL_MODE             DFSDM_CHCFGR1_DATPACK_1 /*!< Dual data packing mode */

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Channel_InputPins DFSDM channel input pins

+  * @{

+  */

+#define DFSDM_CHANNEL_SAME_CHANNEL_PINS      0x00000000U             /*!< Input from pins on same channel */

+#define DFSDM_CHANNEL_FOLLOWING_CHANNEL_PINS DFSDM_CHCFGR1_CHINSEL   /*!< Input from pins on following channel */

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Channel_SerialInterfaceType DFSDM channel serial interface type

+  * @{

+  */

+#define DFSDM_CHANNEL_SPI_RISING         0x00000000U             /*!< SPI with rising edge */

+#define DFSDM_CHANNEL_SPI_FALLING        DFSDM_CHCFGR1_SITP_0    /*!< SPI with falling edge */

+#define DFSDM_CHANNEL_MANCHESTER_RISING  DFSDM_CHCFGR1_SITP_1    /*!< Manchester with rising edge */

+#define DFSDM_CHANNEL_MANCHESTER_FALLING DFSDM_CHCFGR1_SITP      /*!< Manchester with falling edge */

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Channel_SpiClock DFSDM channel SPI clock selection

+  * @{

+  */

+#define DFSDM_CHANNEL_SPI_CLOCK_EXTERNAL              0x00000000U              /*!< External SPI clock */

+#define DFSDM_CHANNEL_SPI_CLOCK_INTERNAL              DFSDM_CHCFGR1_SPICKSEL_0 /*!< Internal SPI clock */

+#define DFSDM_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_FALLING DFSDM_CHCFGR1_SPICKSEL_1 /*!< Internal SPI clock divided by 2, falling edge */

+#define DFSDM_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_RISING  DFSDM_CHCFGR1_SPICKSEL   /*!< Internal SPI clock divided by 2, rising edge */

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Channel_AwdFilterOrder DFSDM channel analog watchdog filter order

+  * @{

+  */

+#define DFSDM_CHANNEL_FASTSINC_ORDER 0x00000000U             /*!< FastSinc filter type */

+#define DFSDM_CHANNEL_SINC1_ORDER    DFSDM_CHAWSCDR_AWFORD_0 /*!< Sinc 1 filter type */

+#define DFSDM_CHANNEL_SINC2_ORDER    DFSDM_CHAWSCDR_AWFORD_1 /*!< Sinc 2 filter type */

+#define DFSDM_CHANNEL_SINC3_ORDER    DFSDM_CHAWSCDR_AWFORD   /*!< Sinc 3 filter type */

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Filter_Trigger DFSDM filter conversion trigger

+  * @{

+  */

+#define DFSDM_FILTER_SW_TRIGGER   0x00000000U /*!< Software trigger */

+#define DFSDM_FILTER_SYNC_TRIGGER 0x00000001U /*!< Synchronous with DFSDM_FLT0 */

+#define DFSDM_FILTER_EXT_TRIGGER  0x00000002U /*!< External trigger (only for injected conversion) */

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Filter_ExtTrigger DFSDM filter external trigger

+  * @{

+  */

+#if defined(STM32L451xx) || defined(STM32L452xx) || defined(STM32L462xx)

+#define DFSDM_FILTER_EXT_TRIG_TIM1_TRGO  0x00000000U                                       /*!< For DFSDM filter 0, 1, 2 and 3 */

+#define DFSDM_FILTER_EXT_TRIG_TIM1_TRGO2 DFSDM_FLTCR1_JEXTSEL_0                            /*!< For DFSDM filter 0, 1, 2 and 3 */

+#define DFSDM_FILTER_EXT_TRIG_TIM3_TRGO  DFSDM_FLTCR1_JEXTSEL_1                            /*!< For DFSDM filter 0, 1, 2 and 3 */

+#define DFSDM_FILTER_EXT_TRIG_TIM16_OC1  (DFSDM_FLTCR1_JEXTSEL_0 | DFSDM_FLTCR1_JEXTSEL_1) /*!< For DFSDM filter 0, 1 and 2 */

+#define DFSDM_FILTER_EXT_TRIG_TIM6_TRGO  (DFSDM_FLTCR1_JEXTSEL_0 | DFSDM_FLTCR1_JEXTSEL_2) /*!< For DFSDM filter 0 and 1 */

+#define DFSDM_FILTER_EXT_TRIG_EXTI11     (DFSDM_FLTCR1_JEXTSEL_1 | DFSDM_FLTCR1_JEXTSEL_2) /*!< For DFSDM filter 0, 1, 2 and 3 */

+#define DFSDM_FILTER_EXT_TRIG_EXTI15     DFSDM_FLTCR1_JEXTSEL                              /*!< For DFSDM filter 0, 1, 2 and 3 */

+#elif defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+#define DFSDM_FILTER_EXT_TRIG_TIM1_TRGO  0x00000000U                                       /*!< For all DFSDM filters */

+#define DFSDM_FILTER_EXT_TRIG_TIM1_TRGO2 DFSDM_FLTCR1_JEXTSEL_0                            /*!< For all DFSDM filters */

+#define DFSDM_FILTER_EXT_TRIG_TIM8_TRGO  DFSDM_FLTCR1_JEXTSEL_1                            /*!< For all DFSDM filters */

+#define DFSDM_FILTER_EXT_TRIG_TIM8_TRGO2 (DFSDM_FLTCR1_JEXTSEL_0 | DFSDM_FLTCR1_JEXTSEL_1) /*!< For all DFSDM filters */

+#define DFSDM_FILTER_EXT_TRIG_TIM3_TRGO  DFSDM_FLTCR1_JEXTSEL_2                            /*!< For all DFSDM filters */

+#define DFSDM_FILTER_EXT_TRIG_TIM4_TRGO  (DFSDM_FLTCR1_JEXTSEL_0 | DFSDM_FLTCR1_JEXTSEL_2) /*!< For all DFSDM filters */

+#define DFSDM_FILTER_EXT_TRIG_TIM16_OC1  (DFSDM_FLTCR1_JEXTSEL_1 | DFSDM_FLTCR1_JEXTSEL_2) /*!< For all DFSDM filters */

+#define DFSDM_FILTER_EXT_TRIG_TIM6_TRGO  (DFSDM_FLTCR1_JEXTSEL_0 | DFSDM_FLTCR1_JEXTSEL_1 | \

+                                          DFSDM_FLTCR1_JEXTSEL_2)                          /*!< For all DFSDM filters */

+#define DFSDM_FILTER_EXT_TRIG_TIM7_TRGO  DFSDM_FLTCR1_JEXTSEL_3                            /*!< For all DFSDM filters */

+#define DFSDM_FILTER_EXT_TRIG_EXTI11     (DFSDM_FLTCR1_JEXTSEL_3 | DFSDM_FLTCR1_JEXTSEL_4) /*!< For all DFSDM filters */

+#define DFSDM_FILTER_EXT_TRIG_EXTI15     (DFSDM_FLTCR1_JEXTSEL_0 | DFSDM_FLTCR1_JEXTSEL_3 | \

+                                          DFSDM_FLTCR1_JEXTSEL_4)                          /*!< For all DFSDM filters */

+#define DFSDM_FILTER_EXT_TRIG_LPTIM1_OUT (DFSDM_FLTCR1_JEXTSEL_1 | DFSDM_FLTCR1_JEXTSEL_3 | \

+                                          DFSDM_FLTCR1_JEXTSEL_4)                          /*!< For all DFSDM filters */

+#else

+#define DFSDM_FILTER_EXT_TRIG_TIM1_TRGO  0x00000000U                                       /*!< For DFSDM filter 0, 1, 2 and 3 */

+#define DFSDM_FILTER_EXT_TRIG_TIM1_TRGO2 DFSDM_FLTCR1_JEXTSEL_0                            /*!< For DFSDM filter 0, 1, 2 and 3 */

+#define DFSDM_FILTER_EXT_TRIG_TIM8_TRGO  DFSDM_FLTCR1_JEXTSEL_1                            /*!< For DFSDM filter 0, 1, 2 and 3 */

+#define DFSDM_FILTER_EXT_TRIG_TIM8_TRGO2 (DFSDM_FLTCR1_JEXTSEL_0 | DFSDM_FLTCR1_JEXTSEL_1) /*!< For DFSDM filter 0, 1 and 2 */

+#define DFSDM_FILTER_EXT_TRIG_TIM3_TRGO  (DFSDM_FLTCR1_JEXTSEL_0 | DFSDM_FLTCR1_JEXTSEL_1) /*!< For DFSDM filter 3 */

+#define DFSDM_FILTER_EXT_TRIG_TIM4_TRGO  DFSDM_FLTCR1_JEXTSEL_2                            /*!< For DFSDM filter 0, 1 and 2 */

+#define DFSDM_FILTER_EXT_TRIG_TIM16_OC1  DFSDM_FLTCR1_JEXTSEL_2                            /*!< For DFSDM filter 3 */

+#define DFSDM_FILTER_EXT_TRIG_TIM6_TRGO  (DFSDM_FLTCR1_JEXTSEL_0 | DFSDM_FLTCR1_JEXTSEL_2) /*!< For DFSDM filter 0 and 1 */

+#define DFSDM_FILTER_EXT_TRIG_TIM7_TRGO  (DFSDM_FLTCR1_JEXTSEL_0 | DFSDM_FLTCR1_JEXTSEL_2) /*!< For DFSDM filter 2 and 3 */

+#define DFSDM_FILTER_EXT_TRIG_EXTI11     (DFSDM_FLTCR1_JEXTSEL_1 | DFSDM_FLTCR1_JEXTSEL_2) /*!< For DFSDM filter 0, 1, 2 and 3 */

+#define DFSDM_FILTER_EXT_TRIG_EXTI15     DFSDM_FLTCR1_JEXTSEL                              /*!< For DFSDM filter 0, 1, 2 and 3 */

+#endif /* STM32L451xx || STM32L452xx || STM32L462xx */

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Filter_ExtTriggerEdge DFSDM filter external trigger edge

+  * @{

+  */

+#define DFSDM_FILTER_EXT_TRIG_RISING_EDGE  DFSDM_FLTCR1_JEXTEN_0 /*!< External rising edge */

+#define DFSDM_FILTER_EXT_TRIG_FALLING_EDGE DFSDM_FLTCR1_JEXTEN_1 /*!< External falling edge */

+#define DFSDM_FILTER_EXT_TRIG_BOTH_EDGES   DFSDM_FLTCR1_JEXTEN   /*!< External rising and falling edges */

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Filter_SincOrder DFSDM filter sinc order

+  * @{

+  */

+#define DFSDM_FILTER_FASTSINC_ORDER 0x00000000U                                 /*!< FastSinc filter type */

+#define DFSDM_FILTER_SINC1_ORDER    DFSDM_FLTFCR_FORD_0                         /*!< Sinc 1 filter type */

+#define DFSDM_FILTER_SINC2_ORDER    DFSDM_FLTFCR_FORD_1                         /*!< Sinc 2 filter type */

+#define DFSDM_FILTER_SINC3_ORDER    (DFSDM_FLTFCR_FORD_0 | DFSDM_FLTFCR_FORD_1) /*!< Sinc 3 filter type */

+#define DFSDM_FILTER_SINC4_ORDER    DFSDM_FLTFCR_FORD_2                         /*!< Sinc 4 filter type */

+#define DFSDM_FILTER_SINC5_ORDER    (DFSDM_FLTFCR_FORD_0 | DFSDM_FLTFCR_FORD_2) /*!< Sinc 5 filter type */

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Filter_AwdDataSource DFSDM filter analog watchdog data source

+  * @{

+  */

+#define DFSDM_FILTER_AWD_FILTER_DATA  0x00000000U             /*!< From digital filter */

+#define DFSDM_FILTER_AWD_CHANNEL_DATA DFSDM_FLTCR1_AWFSEL     /*!< From analog watchdog channel */

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Filter_ErrorCode DFSDM filter error code

+  * @{

+  */

+#define DFSDM_FILTER_ERROR_NONE             0x00000000U /*!< No error */

+#define DFSDM_FILTER_ERROR_REGULAR_OVERRUN  0x00000001U /*!< Overrun occurs during regular conversion */

+#define DFSDM_FILTER_ERROR_INJECTED_OVERRUN 0x00000002U /*!< Overrun occurs during injected conversion */

+#define DFSDM_FILTER_ERROR_DMA              0x00000003U /*!< DMA error occurs */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+#define DFSDM_FILTER_ERROR_INVALID_CALLBACK 0x00000004U /*!< Invalid callback error occurs */

+#endif

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_BreakSignals DFSDM break signals

+  * @{

+  */

+#define DFSDM_NO_BREAK_SIGNAL 0x00000000U /*!< No break signal */

+#define DFSDM_BREAK_SIGNAL_0  0x00000001U /*!< Break signal 0 */

+#define DFSDM_BREAK_SIGNAL_1  0x00000002U /*!< Break signal 1 */

+#define DFSDM_BREAK_SIGNAL_2  0x00000004U /*!< Break signal 2 */

+#define DFSDM_BREAK_SIGNAL_3  0x00000008U /*!< Break signal 3 */

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Channel_Selection DFSDM Channel Selection

+  * @{

+  */

+/* DFSDM Channels ------------------------------------------------------------*/

+/* The DFSDM channels are defined as follows:

+   - in 16-bit LSB the channel mask is set

+   - in 16-bit MSB the channel number is set

+   e.g. for channel 5 definition:

+        - the channel mask is 0x00000020 (bit 5 is set)

+        - the channel number 5 is 0x00050000

+        --> Consequently, channel 5 definition is 0x00000020 | 0x00050000 = 0x00050020 */

+#if defined(STM32L451xx) || defined(STM32L452xx) || defined(STM32L462xx)

+#define DFSDM_CHANNEL_0                              0x00000001U

+#define DFSDM_CHANNEL_1                              0x00010002U

+#define DFSDM_CHANNEL_2                              0x00020004U

+#define DFSDM_CHANNEL_3                              0x00030008U

+#else

+#define DFSDM_CHANNEL_0                              0x00000001U

+#define DFSDM_CHANNEL_1                              0x00010002U

+#define DFSDM_CHANNEL_2                              0x00020004U

+#define DFSDM_CHANNEL_3                              0x00030008U

+#define DFSDM_CHANNEL_4                              0x00040010U

+#define DFSDM_CHANNEL_5                              0x00050020U

+#define DFSDM_CHANNEL_6                              0x00060040U

+#define DFSDM_CHANNEL_7                              0x00070080U

+#endif /* STM32L451xx || STM32L452xx || STM32L462xx */

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_ContinuousMode DFSDM Continuous Mode

+  * @{

+  */

+#define DFSDM_CONTINUOUS_CONV_OFF            0x00000000U /*!< Conversion are not continuous */

+#define DFSDM_CONTINUOUS_CONV_ON             0x00000001U /*!< Conversion are continuous */

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_AwdThreshold DFSDM analog watchdog threshold

+  * @{

+  */

+#define DFSDM_AWD_HIGH_THRESHOLD            0x00000000U /*!< Analog watchdog high threshold */

+#define DFSDM_AWD_LOW_THRESHOLD             0x00000001U /*!< Analog watchdog low threshold */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+/* End of exported constants -------------------------------------------------*/

+

+/* Exported macros -----------------------------------------------------------*/

+/** @defgroup DFSDM_Exported_Macros DFSDM Exported Macros

+ * @{

+ */

+

+/** @brief  Reset DFSDM channel handle state.

+  * @param  __HANDLE__ DFSDM channel handle.

+  * @retval None

+  */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+#define __HAL_DFSDM_CHANNEL_RESET_HANDLE_STATE(__HANDLE__) do{                                                      \

+                                                               (__HANDLE__)->State = HAL_DFSDM_CHANNEL_STATE_RESET; \

+                                                               (__HANDLE__)->MspInitCallback = NULL;                \

+                                                               (__HANDLE__)->MspDeInitCallback = NULL;              \

+                                                             } while(0)

+#else

+#define __HAL_DFSDM_CHANNEL_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_DFSDM_CHANNEL_STATE_RESET)

+#endif

+

+/** @brief  Reset DFSDM filter handle state.

+  * @param  __HANDLE__ DFSDM filter handle.

+  * @retval None

+  */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+#define __HAL_DFSDM_FILTER_RESET_HANDLE_STATE(__HANDLE__) do{                                                     \

+                                                              (__HANDLE__)->State = HAL_DFSDM_FILTER_STATE_RESET; \

+                                                              (__HANDLE__)->MspInitCallback = NULL;               \

+                                                              (__HANDLE__)->MspDeInitCallback = NULL;             \

+                                                            } while(0)

+#else

+#define __HAL_DFSDM_FILTER_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_DFSDM_FILTER_STATE_RESET)

+#endif

+

+/**

+  * @}

+  */

+/* End of exported macros ----------------------------------------------------*/

+

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+/* Include DFSDM HAL Extension module */

+#include "stm32l4xx_hal_dfsdm_ex.h"

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+/* Exported functions --------------------------------------------------------*/

+/** @addtogroup DFSDM_Exported_Functions DFSDM Exported Functions

+  * @{

+  */

+

+/** @addtogroup DFSDM_Exported_Functions_Group1_Channel Channel initialization and de-initialization functions

+  * @{

+  */

+/* Channel initialization and de-initialization functions *********************/

+HAL_StatusTypeDef HAL_DFSDM_ChannelInit(DFSDM_Channel_HandleTypeDef *hdfsdm_channel);

+HAL_StatusTypeDef HAL_DFSDM_ChannelDeInit(DFSDM_Channel_HandleTypeDef *hdfsdm_channel);

+void HAL_DFSDM_ChannelMspInit(DFSDM_Channel_HandleTypeDef *hdfsdm_channel);

+void HAL_DFSDM_ChannelMspDeInit(DFSDM_Channel_HandleTypeDef *hdfsdm_channel);

+

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+/* Channel callbacks register/unregister functions ****************************/

+HAL_StatusTypeDef HAL_DFSDM_Channel_RegisterCallback(DFSDM_Channel_HandleTypeDef        *hdfsdm_channel,

+                                                     HAL_DFSDM_Channel_CallbackIDTypeDef CallbackID,

+                                                     pDFSDM_Channel_CallbackTypeDef      pCallback);

+HAL_StatusTypeDef HAL_DFSDM_Channel_UnRegisterCallback(DFSDM_Channel_HandleTypeDef        *hdfsdm_channel,

+                                                       HAL_DFSDM_Channel_CallbackIDTypeDef CallbackID);

+#endif

+/**

+  * @}

+  */

+

+/** @addtogroup DFSDM_Exported_Functions_Group2_Channel Channel operation functions

+  * @{

+  */

+/* Channel operation functions ************************************************/

+HAL_StatusTypeDef HAL_DFSDM_ChannelCkabStart(DFSDM_Channel_HandleTypeDef *hdfsdm_channel);

+HAL_StatusTypeDef HAL_DFSDM_ChannelCkabStart_IT(DFSDM_Channel_HandleTypeDef *hdfsdm_channel);

+HAL_StatusTypeDef HAL_DFSDM_ChannelCkabStop(DFSDM_Channel_HandleTypeDef *hdfsdm_channel);

+HAL_StatusTypeDef HAL_DFSDM_ChannelCkabStop_IT(DFSDM_Channel_HandleTypeDef *hdfsdm_channel);

+

+HAL_StatusTypeDef HAL_DFSDM_ChannelScdStart(DFSDM_Channel_HandleTypeDef *hdfsdm_channel, uint32_t Threshold, uint32_t BreakSignal);

+HAL_StatusTypeDef HAL_DFSDM_ChannelScdStart_IT(DFSDM_Channel_HandleTypeDef *hdfsdm_channel, uint32_t Threshold, uint32_t BreakSignal);

+HAL_StatusTypeDef HAL_DFSDM_ChannelScdStop(DFSDM_Channel_HandleTypeDef *hdfsdm_channel);

+HAL_StatusTypeDef HAL_DFSDM_ChannelScdStop_IT(DFSDM_Channel_HandleTypeDef *hdfsdm_channel);

+

+int16_t           HAL_DFSDM_ChannelGetAwdValue(DFSDM_Channel_HandleTypeDef *hdfsdm_channel);

+HAL_StatusTypeDef HAL_DFSDM_ChannelModifyOffset(DFSDM_Channel_HandleTypeDef *hdfsdm_channel, int32_t Offset);

+

+HAL_StatusTypeDef HAL_DFSDM_ChannelPollForCkab(DFSDM_Channel_HandleTypeDef *hdfsdm_channel, uint32_t Timeout);

+HAL_StatusTypeDef HAL_DFSDM_ChannelPollForScd(DFSDM_Channel_HandleTypeDef *hdfsdm_channel, uint32_t Timeout);

+

+void HAL_DFSDM_ChannelCkabCallback(DFSDM_Channel_HandleTypeDef *hdfsdm_channel);

+void HAL_DFSDM_ChannelScdCallback(DFSDM_Channel_HandleTypeDef *hdfsdm_channel);

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Exported_Functions_Group3_Channel Channel state function

+  * @{

+  */

+/* Channel state function *****************************************************/

+HAL_DFSDM_Channel_StateTypeDef HAL_DFSDM_ChannelGetState(DFSDM_Channel_HandleTypeDef *hdfsdm_channel);

+/**

+  * @}

+  */

+

+/** @addtogroup DFSDM_Exported_Functions_Group1_Filter Filter initialization and de-initialization functions

+  * @{

+  */

+/* Filter initialization and de-initialization functions *********************/

+HAL_StatusTypeDef HAL_DFSDM_FilterInit(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+HAL_StatusTypeDef HAL_DFSDM_FilterDeInit(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+void HAL_DFSDM_FilterMspInit(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+void HAL_DFSDM_FilterMspDeInit(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+/* Filter callbacks register/unregister functions ****************************/

+HAL_StatusTypeDef HAL_DFSDM_Filter_RegisterCallback(DFSDM_Filter_HandleTypeDef        *hdfsdm_filter,

+                                                    HAL_DFSDM_Filter_CallbackIDTypeDef CallbackID,

+                                                    pDFSDM_Filter_CallbackTypeDef      pCallback);

+HAL_StatusTypeDef HAL_DFSDM_Filter_UnRegisterCallback(DFSDM_Filter_HandleTypeDef        *hdfsdm_filter,

+                                                      HAL_DFSDM_Filter_CallbackIDTypeDef CallbackID);

+HAL_StatusTypeDef HAL_DFSDM_Filter_RegisterAwdCallback(DFSDM_Filter_HandleTypeDef      *hdfsdm_filter,

+                                                       pDFSDM_Filter_AwdCallbackTypeDef pCallback);

+HAL_StatusTypeDef HAL_DFSDM_Filter_UnRegisterAwdCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+#endif

+/**

+  * @}

+  */

+

+/** @addtogroup DFSDM_Exported_Functions_Group2_Filter Filter control functions

+  * @{

+  */

+/* Filter control functions *********************/

+HAL_StatusTypeDef HAL_DFSDM_FilterConfigRegChannel(DFSDM_Filter_HandleTypeDef *hdfsdm_filter,

+                                                   uint32_t                    Channel,

+                                                   uint32_t                    ContinuousMode);

+HAL_StatusTypeDef HAL_DFSDM_FilterConfigInjChannel(DFSDM_Filter_HandleTypeDef *hdfsdm_filter,

+                                                   uint32_t                    Channel);

+/**

+  * @}

+  */

+

+/** @addtogroup DFSDM_Exported_Functions_Group3_Filter Filter operation functions

+  * @{

+  */

+/* Filter operation functions *********************/

+HAL_StatusTypeDef HAL_DFSDM_FilterRegularStart(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+HAL_StatusTypeDef HAL_DFSDM_FilterRegularStart_IT(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+HAL_StatusTypeDef HAL_DFSDM_FilterRegularStart_DMA(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, int32_t *pData, uint32_t Length);

+HAL_StatusTypeDef HAL_DFSDM_FilterRegularMsbStart_DMA(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, int16_t *pData, uint32_t Length);

+HAL_StatusTypeDef HAL_DFSDM_FilterRegularStop(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+HAL_StatusTypeDef HAL_DFSDM_FilterRegularStop_IT(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+HAL_StatusTypeDef HAL_DFSDM_FilterRegularStop_DMA(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+HAL_StatusTypeDef HAL_DFSDM_FilterInjectedStart(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+HAL_StatusTypeDef HAL_DFSDM_FilterInjectedStart_IT(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+HAL_StatusTypeDef HAL_DFSDM_FilterInjectedStart_DMA(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, int32_t *pData, uint32_t Length);

+HAL_StatusTypeDef HAL_DFSDM_FilterInjectedMsbStart_DMA(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, int16_t *pData, uint32_t Length);

+HAL_StatusTypeDef HAL_DFSDM_FilterInjectedStop(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+HAL_StatusTypeDef HAL_DFSDM_FilterInjectedStop_IT(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+HAL_StatusTypeDef HAL_DFSDM_FilterInjectedStop_DMA(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+HAL_StatusTypeDef HAL_DFSDM_FilterAwdStart_IT(DFSDM_Filter_HandleTypeDef *hdfsdm_filter,

+                                              DFSDM_Filter_AwdParamTypeDef *awdParam);

+HAL_StatusTypeDef HAL_DFSDM_FilterAwdStop_IT(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+HAL_StatusTypeDef HAL_DFSDM_FilterExdStart(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, uint32_t Channel);

+HAL_StatusTypeDef HAL_DFSDM_FilterExdStop(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+

+int32_t  HAL_DFSDM_FilterGetRegularValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, uint32_t *Channel);

+int32_t  HAL_DFSDM_FilterGetInjectedValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, uint32_t *Channel);

+int32_t  HAL_DFSDM_FilterGetExdMaxValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, uint32_t *Channel);

+int32_t  HAL_DFSDM_FilterGetExdMinValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, uint32_t *Channel);

+uint32_t HAL_DFSDM_FilterGetConvTimeValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+

+void HAL_DFSDM_IRQHandler(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+

+HAL_StatusTypeDef HAL_DFSDM_FilterPollForRegConversion(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, uint32_t Timeout);

+HAL_StatusTypeDef HAL_DFSDM_FilterPollForInjConversion(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, uint32_t Timeout);

+

+void HAL_DFSDM_FilterRegConvCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+void HAL_DFSDM_FilterRegConvHalfCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+void HAL_DFSDM_FilterInjConvCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+void HAL_DFSDM_FilterInjConvHalfCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+void HAL_DFSDM_FilterAwdCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter, uint32_t Channel, uint32_t Threshold);

+void HAL_DFSDM_FilterErrorCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Exported_Functions_Group4_Filter Filter state functions

+  * @{

+  */

+/* Filter state functions *****************************************************/

+HAL_DFSDM_Filter_StateTypeDef HAL_DFSDM_FilterGetState(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+uint32_t                      HAL_DFSDM_FilterGetError(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+/* End of exported functions -------------------------------------------------*/

+

+/* Private macros ------------------------------------------------------------*/

+/** @defgroup DFSDM_Private_Macros DFSDM Private Macros

+* @{

+*/

+#define IS_DFSDM_CHANNEL_OUTPUT_CLOCK(CLOCK)          (((CLOCK) == DFSDM_CHANNEL_OUTPUT_CLOCK_SYSTEM) || \

+                                                       ((CLOCK) == DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO))

+#define IS_DFSDM_CHANNEL_OUTPUT_CLOCK_DIVIDER(DIVIDER) ((2U <= (DIVIDER)) && ((DIVIDER) <= 256U))

+#if defined(STM32L451xx) || defined(STM32L452xx) || defined(STM32L462xx) || \

+    defined(STM32L496xx) || defined(STM32L4A6xx) || \

+    defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+#define IS_DFSDM_CHANNEL_INPUT(INPUT)                 (((INPUT) == DFSDM_CHANNEL_EXTERNAL_INPUTS) || \

+                                                       ((INPUT) == DFSDM_CHANNEL_ADC_OUTPUT) || \

+                                                       ((INPUT) == DFSDM_CHANNEL_INTERNAL_REGISTER))

+#else

+#define IS_DFSDM_CHANNEL_INPUT(INPUT)                 (((INPUT) == DFSDM_CHANNEL_EXTERNAL_INPUTS) || \

+                                                       ((INPUT) == DFSDM_CHANNEL_INTERNAL_REGISTER))

+#endif /* STM32L451xx || STM32L452xx || STM32L462xx || */

+/* STM32L496xx || STM32L4A6xx ||                */

+/* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+#define IS_DFSDM_CHANNEL_DATA_PACKING(MODE)           (((MODE) == DFSDM_CHANNEL_STANDARD_MODE) || \

+                                                       ((MODE) == DFSDM_CHANNEL_INTERLEAVED_MODE) || \

+                                                       ((MODE) == DFSDM_CHANNEL_DUAL_MODE))

+#define IS_DFSDM_CHANNEL_INPUT_PINS(PINS)             (((PINS) == DFSDM_CHANNEL_SAME_CHANNEL_PINS) || \

+                                                       ((PINS) == DFSDM_CHANNEL_FOLLOWING_CHANNEL_PINS))

+#define IS_DFSDM_CHANNEL_SERIAL_INTERFACE_TYPE(MODE)  (((MODE) == DFSDM_CHANNEL_SPI_RISING) || \

+                                                       ((MODE) == DFSDM_CHANNEL_SPI_FALLING) || \

+                                                       ((MODE) == DFSDM_CHANNEL_MANCHESTER_RISING) || \

+                                                       ((MODE) == DFSDM_CHANNEL_MANCHESTER_FALLING))

+#define IS_DFSDM_CHANNEL_SPI_CLOCK(TYPE)              (((TYPE) == DFSDM_CHANNEL_SPI_CLOCK_EXTERNAL) || \

+                                                       ((TYPE) == DFSDM_CHANNEL_SPI_CLOCK_INTERNAL) || \

+                                                       ((TYPE) == DFSDM_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_FALLING) || \

+                                                       ((TYPE) == DFSDM_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_RISING))

+#define IS_DFSDM_CHANNEL_FILTER_ORDER(ORDER)          (((ORDER) == DFSDM_CHANNEL_FASTSINC_ORDER) || \

+                                                       ((ORDER) == DFSDM_CHANNEL_SINC1_ORDER) || \

+                                                       ((ORDER) == DFSDM_CHANNEL_SINC2_ORDER) || \

+                                                       ((ORDER) == DFSDM_CHANNEL_SINC3_ORDER))

+#define IS_DFSDM_CHANNEL_FILTER_OVS_RATIO(RATIO)       ((1U <= (RATIO)) && ((RATIO) <= 32U))

+#define IS_DFSDM_CHANNEL_OFFSET(VALUE)                 ((-8388608 <= (VALUE)) && ((VALUE) <= 8388607))

+#define IS_DFSDM_CHANNEL_RIGHT_BIT_SHIFT(VALUE)        ((VALUE) <= 0x1FU)

+#define IS_DFSDM_CHANNEL_SCD_THRESHOLD(VALUE)          ((VALUE) <= 0xFFU)

+#define IS_DFSDM_FILTER_REG_TRIGGER(TRIG)             (((TRIG) == DFSDM_FILTER_SW_TRIGGER) || \

+                                                       ((TRIG) == DFSDM_FILTER_SYNC_TRIGGER))

+#define IS_DFSDM_FILTER_INJ_TRIGGER(TRIG)             (((TRIG) == DFSDM_FILTER_SW_TRIGGER) || \

+                                                       ((TRIG) == DFSDM_FILTER_SYNC_TRIGGER) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIGGER))

+#if defined(STM32L451xx) || defined(STM32L452xx) || defined(STM32L462xx)

+#define IS_DFSDM_FILTER_EXT_TRIG(TRIG)                (((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM1_TRGO) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM1_TRGO2) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM3_TRGO) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM16_OC1) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM6_TRGO) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_EXTI11) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_EXTI15))

+#elif defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+#define IS_DFSDM_FILTER_EXT_TRIG(TRIG)                (((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM1_TRGO) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM1_TRGO2) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM8_TRGO) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM8_TRGO2) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM3_TRGO) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM4_TRGO) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM16_OC1) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM6_TRGO) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM7_TRGO) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_EXTI11) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_EXTI15) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_LPTIM1_OUT))

+#else

+#define IS_DFSDM_FILTER_EXT_TRIG(TRIG)                (((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM1_TRGO) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM1_TRGO2) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM8_TRGO) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM8_TRGO2) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM3_TRGO) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM4_TRGO) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM16_OC1) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM6_TRGO) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_TIM7_TRGO) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_EXTI11) || \

+                                                       ((TRIG) == DFSDM_FILTER_EXT_TRIG_EXTI15))

+#endif /* STM32L451xx || STM32L452xx || STM32L462xx */

+#define IS_DFSDM_FILTER_EXT_TRIG_EDGE(EDGE)           (((EDGE) == DFSDM_FILTER_EXT_TRIG_RISING_EDGE)  || \

+                                                       ((EDGE) == DFSDM_FILTER_EXT_TRIG_FALLING_EDGE)  || \

+                                                       ((EDGE) == DFSDM_FILTER_EXT_TRIG_BOTH_EDGES))

+#define IS_DFSDM_FILTER_SINC_ORDER(ORDER)             (((ORDER) == DFSDM_FILTER_FASTSINC_ORDER) || \

+                                                       ((ORDER) == DFSDM_FILTER_SINC1_ORDER) || \

+                                                       ((ORDER) == DFSDM_FILTER_SINC2_ORDER) || \

+                                                       ((ORDER) == DFSDM_FILTER_SINC3_ORDER) || \

+                                                       ((ORDER) == DFSDM_FILTER_SINC4_ORDER) || \

+                                                       ((ORDER) == DFSDM_FILTER_SINC5_ORDER))

+#define IS_DFSDM_FILTER_OVS_RATIO(RATIO)               ((1U <= (RATIO)) && ((RATIO) <= 1024U))

+#define IS_DFSDM_FILTER_INTEGRATOR_OVS_RATIO(RATIO)    ((1U <= (RATIO)) && ((RATIO) <= 256U))

+#define IS_DFSDM_FILTER_AWD_DATA_SOURCE(DATA)         (((DATA) == DFSDM_FILTER_AWD_FILTER_DATA)  || \

+                                                       ((DATA) == DFSDM_FILTER_AWD_CHANNEL_DATA))

+#define IS_DFSDM_FILTER_AWD_THRESHOLD(VALUE)           ((-8388608 <= (VALUE)) && ((VALUE) <= 8388607))

+#define IS_DFSDM_BREAK_SIGNALS(VALUE)                  ((VALUE) <= 0xFU)

+#if defined(STM32L451xx) || defined(STM32L452xx) || defined(STM32L462xx)

+#define IS_DFSDM_REGULAR_CHANNEL(CHANNEL)             (((CHANNEL) == DFSDM_CHANNEL_0)  || \

+                                                       ((CHANNEL) == DFSDM_CHANNEL_1)  || \

+                                                       ((CHANNEL) == DFSDM_CHANNEL_2)  || \

+                                                       ((CHANNEL) == DFSDM_CHANNEL_3))

+#define IS_DFSDM_INJECTED_CHANNEL(CHANNEL)            (((CHANNEL) != 0U) && ((CHANNEL) <= 0x0003000FU))

+#else

+#define IS_DFSDM_REGULAR_CHANNEL(CHANNEL)             (((CHANNEL) == DFSDM_CHANNEL_0)  || \

+                                                       ((CHANNEL) == DFSDM_CHANNEL_1)  || \

+                                                       ((CHANNEL) == DFSDM_CHANNEL_2)  || \

+                                                       ((CHANNEL) == DFSDM_CHANNEL_3)  || \

+                                                       ((CHANNEL) == DFSDM_CHANNEL_4)  || \

+                                                       ((CHANNEL) == DFSDM_CHANNEL_5)  || \

+                                                       ((CHANNEL) == DFSDM_CHANNEL_6)  || \

+                                                       ((CHANNEL) == DFSDM_CHANNEL_7))

+#define IS_DFSDM_INJECTED_CHANNEL(CHANNEL)            (((CHANNEL) != 0U) && ((CHANNEL) <= 0x000F00FFU))

+#endif /* STM32L451xx || STM32L452xx || STM32L462xx */

+#define IS_DFSDM_CONTINUOUS_MODE(MODE)                (((MODE) == DFSDM_CONTINUOUS_CONV_OFF)  || \

+                                                       ((MODE) == DFSDM_CONTINUOUS_CONV_ON))

+/**

+  * @}

+  */

+/* End of private macros -----------------------------------------------------*/

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+#endif /* STM32L451xx || STM32L452xx || STM32L462xx || */

+/* STM32L471xx || STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx || */

+/* STM32L496xx || STM32L4A6xx || */

+/* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* STM32L4xx_HAL_DFSDM_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h
new file mode 100644
index 0000000..f165a5d
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h
@@ -0,0 +1,749 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_dma.h

+  * @author  MCD Application Team

+  * @brief   Header file of DMA HAL module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef STM32L4xx_HAL_DMA_H

+#define STM32L4xx_HAL_DMA_H

+

+#ifdef __cplusplus

+ extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup DMA

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+/** @defgroup DMA_Exported_Types DMA Exported Types

+  * @{

+  */

+

+/**

+  * @brief  DMA Configuration Structure definition

+  */

+typedef struct

+{

+  uint32_t Request;                   /*!< Specifies the request selected for the specified channel.

+                                           This parameter can be a value of @ref DMA_request */

+

+  uint32_t Direction;                 /*!< Specifies if the data will be transferred from memory to peripheral,

+                                           from memory to memory or from peripheral to memory.

+                                           This parameter can be a value of @ref DMA_Data_transfer_direction */

+

+  uint32_t PeriphInc;                 /*!< Specifies whether the Peripheral address register should be incremented or not.

+                                           This parameter can be a value of @ref DMA_Peripheral_incremented_mode */

+

+  uint32_t MemInc;                    /*!< Specifies whether the memory address register should be incremented or not.

+                                           This parameter can be a value of @ref DMA_Memory_incremented_mode */

+

+  uint32_t PeriphDataAlignment;       /*!< Specifies the Peripheral data width.

+                                           This parameter can be a value of @ref DMA_Peripheral_data_size */

+

+  uint32_t MemDataAlignment;          /*!< Specifies the Memory data width.

+                                           This parameter can be a value of @ref DMA_Memory_data_size */

+

+  uint32_t Mode;                      /*!< Specifies the operation mode of the DMAy Channelx.

+                                           This parameter can be a value of @ref DMA_mode

+                                           @note The circular buffer mode cannot be used if the memory-to-memory

+                                                 data transfer is configured on the selected Channel */

+

+  uint32_t Priority;                  /*!< Specifies the software priority for the DMAy Channelx.

+                                           This parameter can be a value of @ref DMA_Priority_level */

+} DMA_InitTypeDef;

+

+/**

+  * @brief  HAL DMA State structures definition

+  */

+typedef enum

+{

+  HAL_DMA_STATE_RESET             = 0x00U,  /*!< DMA not yet initialized or disabled    */

+  HAL_DMA_STATE_READY             = 0x01U,  /*!< DMA initialized and ready for use      */

+  HAL_DMA_STATE_BUSY              = 0x02U,  /*!< DMA process is ongoing                 */

+  HAL_DMA_STATE_TIMEOUT           = 0x03U,  /*!< DMA timeout state                      */

+}HAL_DMA_StateTypeDef;

+

+/**

+  * @brief  HAL DMA Error Code structure definition

+  */

+typedef enum

+{

+  HAL_DMA_FULL_TRANSFER      = 0x00U,    /*!< Full transfer     */

+  HAL_DMA_HALF_TRANSFER      = 0x01U     /*!< Half Transfer     */

+}HAL_DMA_LevelCompleteTypeDef;

+

+

+/**

+  * @brief  HAL DMA Callback ID structure definition

+  */

+typedef enum

+{

+  HAL_DMA_XFER_CPLT_CB_ID          = 0x00U,    /*!< Full transfer     */

+  HAL_DMA_XFER_HALFCPLT_CB_ID      = 0x01U,    /*!< Half transfer     */

+  HAL_DMA_XFER_ERROR_CB_ID         = 0x02U,    /*!< Error             */

+  HAL_DMA_XFER_ABORT_CB_ID         = 0x03U,    /*!< Abort             */

+  HAL_DMA_XFER_ALL_CB_ID           = 0x04U     /*!< All               */

+}HAL_DMA_CallbackIDTypeDef;

+

+/**

+  * @brief  DMA handle Structure definition

+  */

+typedef struct __DMA_HandleTypeDef

+{

+  DMA_Channel_TypeDef    *Instance;                                                     /*!< Register base address                */

+

+  DMA_InitTypeDef       Init;                                                           /*!< DMA communication parameters         */

+

+  HAL_LockTypeDef       Lock;                                                           /*!< DMA locking object                   */

+

+  __IO HAL_DMA_StateTypeDef  State;                                                     /*!< DMA transfer state                   */

+

+  void                  *Parent;                                                        /*!< Parent object state                  */

+

+  void                  (* XferCpltCallback)(struct __DMA_HandleTypeDef * hdma);        /*!< DMA transfer complete callback       */

+

+  void                  (* XferHalfCpltCallback)(struct __DMA_HandleTypeDef * hdma);    /*!< DMA Half transfer complete callback  */

+

+  void                  (* XferErrorCallback)(struct __DMA_HandleTypeDef * hdma);       /*!< DMA transfer error callback          */

+

+  void                  (* XferAbortCallback)(struct __DMA_HandleTypeDef * hdma);       /*!< DMA transfer abort callback          */

+

+  __IO uint32_t         ErrorCode;                                                      /*!< DMA Error code                       */

+

+  DMA_TypeDef           *DmaBaseAddress;                                                /*!< DMA Channel Base Address             */

+

+  uint32_t              ChannelIndex;                                                   /*!< DMA Channel Index                    */

+

+#if defined(DMAMUX1)

+  DMAMUX_Channel_TypeDef           *DMAmuxChannel;                                      /*!< Register base address                */

+

+  DMAMUX_ChannelStatus_TypeDef     *DMAmuxChannelStatus;                                /*!< DMAMUX Channels Status Base Address  */

+

+  uint32_t                         DMAmuxChannelStatusMask;                             /*!< DMAMUX Channel Status Mask           */

+

+  DMAMUX_RequestGen_TypeDef        *DMAmuxRequestGen;                                   /*!< DMAMUX request generator Base Address */

+

+  DMAMUX_RequestGenStatus_TypeDef  *DMAmuxRequestGenStatus;                             /*!< DMAMUX request generator Address     */

+

+  uint32_t                         DMAmuxRequestGenStatusMask;                          /*!< DMAMUX request generator Status mask */

+

+#endif /* DMAMUX1 */

+

+}DMA_HandleTypeDef;

+/**

+  * @}

+  */

+

+/* Exported constants --------------------------------------------------------*/

+

+/** @defgroup DMA_Exported_Constants DMA Exported Constants

+  * @{

+  */

+

+/** @defgroup DMA_Error_Code DMA Error Code

+  * @{

+  */

+#define HAL_DMA_ERROR_NONE                 0x00000000U    /*!< No error                                */

+#define HAL_DMA_ERROR_TE                   0x00000001U    /*!< Transfer error                          */

+#define HAL_DMA_ERROR_NO_XFER              0x00000004U    /*!< Abort requested with no Xfer ongoing    */

+#define HAL_DMA_ERROR_TIMEOUT              0x00000020U    /*!< Timeout error                           */

+#define HAL_DMA_ERROR_NOT_SUPPORTED        0x00000100U    /*!< Not supported mode                      */

+#define HAL_DMA_ERROR_SYNC                 0x00000200U    /*!< DMAMUX sync overrun  error              */

+#define HAL_DMA_ERROR_REQGEN               0x00000400U    /*!< DMAMUX request generator overrun  error */

+

+/**

+  * @}

+  */

+

+/** @defgroup DMA_request DMA request

+  * @{

+  */

+#if !defined (DMAMUX1)

+

+#define DMA_REQUEST_0                     0U

+#define DMA_REQUEST_1                     1U

+#define DMA_REQUEST_2                     2U

+#define DMA_REQUEST_3                     3U

+#define DMA_REQUEST_4                     4U

+#define DMA_REQUEST_5                     5U

+#define DMA_REQUEST_6                     6U

+#define DMA_REQUEST_7                     7U

+

+#endif

+

+#if defined(DMAMUX1)

+

+#define DMA_REQUEST_MEM2MEM                 0U  /*!< memory to memory transfer   */

+

+#define DMA_REQUEST_GENERATOR0              1U  /*!< DMAMUX1 request generator 0 */

+#define DMA_REQUEST_GENERATOR1              2U  /*!< DMAMUX1 request generator 1 */

+#define DMA_REQUEST_GENERATOR2              3U  /*!< DMAMUX1 request generator 2 */

+#define DMA_REQUEST_GENERATOR3              4U  /*!< DMAMUX1 request generator 3 */

+

+#define DMA_REQUEST_ADC1                    5U  /*!< DMAMUX1 ADC1 request      */

+

+#define DMA_REQUEST_DAC1_CH1                6U  /*!< DMAMUX1 DAC1 CH1 request  */

+#define DMA_REQUEST_DAC1_CH2                7U  /*!< DMAMUX1 DAC1 CH2 request  */

+

+#define DMA_REQUEST_TIM6_UP                 8U  /*!< DMAMUX1 TIM6 UP request   */

+#define DMA_REQUEST_TIM7_UP                 9U  /*!< DMAMUX1 TIM7 UP request   */

+

+#define DMA_REQUEST_SPI1_RX                10U  /*!< DMAMUX1 SPI1 RX request   */

+#define DMA_REQUEST_SPI1_TX                11U  /*!< DMAMUX1 SPI1 TX request   */

+#define DMA_REQUEST_SPI2_RX                12U  /*!< DMAMUX1 SPI2 RX request   */

+#define DMA_REQUEST_SPI2_TX                13U  /*!< DMAMUX1 SPI2 TX request   */

+#define DMA_REQUEST_SPI3_RX                14U  /*!< DMAMUX1 SPI3 RX request   */

+#define DMA_REQUEST_SPI3_TX                15U  /*!< DMAMUX1 SPI3 TX request   */

+

+#define DMA_REQUEST_I2C1_RX                16U  /*!< DMAMUX1 I2C1 RX request   */

+#define DMA_REQUEST_I2C1_TX                17U  /*!< DMAMUX1 I2C1 TX request   */

+#define DMA_REQUEST_I2C2_RX                18U  /*!< DMAMUX1 I2C2 RX request   */

+#define DMA_REQUEST_I2C2_TX                19U  /*!< DMAMUX1 I2C2 TX request   */

+#define DMA_REQUEST_I2C3_RX                20U  /*!< DMAMUX1 I2C3 RX request   */

+#define DMA_REQUEST_I2C3_TX                21U  /*!< DMAMUX1 I2C3 TX request   */

+#define DMA_REQUEST_I2C4_RX                22U  /*!< DMAMUX1 I2C4 RX request   */

+#define DMA_REQUEST_I2C4_TX                23U  /*!< DMAMUX1 I2C4 TX request   */

+

+#define DMA_REQUEST_USART1_RX              24U  /*!< DMAMUX1 USART1 RX request */

+#define DMA_REQUEST_USART1_TX              25U  /*!< DMAMUX1 USART1 TX request */

+#define DMA_REQUEST_USART2_RX              26U  /*!< DMAMUX1 USART2 RX request */

+#define DMA_REQUEST_USART2_TX              27U  /*!< DMAMUX1 USART2 TX request */

+#define DMA_REQUEST_USART3_RX              28U  /*!< DMAMUX1 USART3 RX request */

+#define DMA_REQUEST_USART3_TX              29U  /*!< DMAMUX1 USART3 TX request */

+

+#define DMA_REQUEST_UART4_RX               30U  /*!< DMAMUX1 UART4 RX request  */

+#define DMA_REQUEST_UART4_TX               31U  /*!< DMAMUX1 UART4 TX request  */

+#define DMA_REQUEST_UART5_RX               32U  /*!< DMAMUX1 UART5 RX request  */

+#define DMA_REQUEST_UART5_TX               33U  /*!< DMAMUX1 UART5 TX request  */

+

+#define DMA_REQUEST_LPUART1_RX             34U  /*!< DMAMUX1 LP_UART1_RX request */

+#define DMA_REQUEST_LPUART1_TX             35U  /*!< DMAMUX1 LP_UART1_RX request */

+

+#define DMA_REQUEST_SAI1_A                 36U  /*!< DMAMUX1 SAI1 A request    */

+#define DMA_REQUEST_SAI1_B                 37U  /*!< DMAMUX1 SAI1 B request    */

+#define DMA_REQUEST_SAI2_A                 38U  /*!< DMAMUX1 SAI2 A request    */

+#define DMA_REQUEST_SAI2_B                 39U  /*!< DMAMUX1 SAI2 B request    */

+

+#define DMA_REQUEST_OCTOSPI1               40U  /*!< DMAMUX1 OCTOSPI1 request  */

+#define DMA_REQUEST_OCTOSPI2               41U  /*!< DMAMUX1 OCTOSPI2 request  */

+

+#define DMA_REQUEST_TIM1_CH1               42U  /*!< DMAMUX1 TIM1 CH1 request  */

+#define DMA_REQUEST_TIM1_CH2               43U  /*!< DMAMUX1 TIM1 CH2 request  */

+#define DMA_REQUEST_TIM1_CH3               44U  /*!< DMAMUX1 TIM1 CH3 request  */

+#define DMA_REQUEST_TIM1_CH4               45U  /*!< DMAMUX1 TIM1 CH4 request  */

+#define DMA_REQUEST_TIM1_UP                46U  /*!< DMAMUX1 TIM1 UP  request  */

+#define DMA_REQUEST_TIM1_TRIG              47U  /*!< DMAMUX1 TIM1 TRIG request */

+#define DMA_REQUEST_TIM1_COM               48U  /*!< DMAMUX1 TIM1 COM request  */

+

+#define DMA_REQUEST_TIM8_CH1               49U  /*!< DMAMUX1 TIM8 CH1 request  */

+#define DMA_REQUEST_TIM8_CH2               50U  /*!< DMAMUX1 TIM8 CH2 request  */

+#define DMA_REQUEST_TIM8_CH3               51U  /*!< DMAMUX1 TIM8 CH3 request  */

+#define DMA_REQUEST_TIM8_CH4               52U  /*!< DMAMUX1 TIM8 CH4 request  */

+#define DMA_REQUEST_TIM8_UP                53U  /*!< DMAMUX1 TIM8 UP  request  */

+#define DMA_REQUEST_TIM8_TRIG              54U  /*!< DMAMUX1 TIM8 TRIG request */

+#define DMA_REQUEST_TIM8_COM               55U  /*!< DMAMUX1 TIM8 COM request  */

+

+#define DMA_REQUEST_TIM2_CH1               56U  /*!< DMAMUX1 TIM2 CH1 request  */

+#define DMA_REQUEST_TIM2_CH2               57U  /*!< DMAMUX1 TIM2 CH2 request  */

+#define DMA_REQUEST_TIM2_CH3               58U  /*!< DMAMUX1 TIM2 CH3 request  */

+#define DMA_REQUEST_TIM2_CH4               59U  /*!< DMAMUX1 TIM2 CH4 request  */

+#define DMA_REQUEST_TIM2_UP                60U  /*!< DMAMUX1 TIM2 UP  request  */

+

+#define DMA_REQUEST_TIM3_CH1               61U  /*!< DMAMUX1 TIM3 CH1 request  */

+#define DMA_REQUEST_TIM3_CH2               62U  /*!< DMAMUX1 TIM3 CH2 request  */

+#define DMA_REQUEST_TIM3_CH3               63U  /*!< DMAMUX1 TIM3 CH3 request  */

+#define DMA_REQUEST_TIM3_CH4               64U  /*!< DMAMUX1 TIM3 CH4 request  */

+#define DMA_REQUEST_TIM3_UP                65U  /*!< DMAMUX1 TIM3 UP  request  */

+#define DMA_REQUEST_TIM3_TRIG              66U  /*!< DMAMUX1 TIM3 TRIG request */

+

+#define DMA_REQUEST_TIM4_CH1               67U  /*!< DMAMUX1 TIM4 CH1 request  */

+#define DMA_REQUEST_TIM4_CH2               68U  /*!< DMAMUX1 TIM4 CH2 request  */

+#define DMA_REQUEST_TIM4_CH3               69U  /*!< DMAMUX1 TIM4 CH3 request  */

+#define DMA_REQUEST_TIM4_CH4               70U  /*!< DMAMUX1 TIM4 CH4 request  */

+#define DMA_REQUEST_TIM4_UP                71U  /*!< DMAMUX1 TIM4 UP  request  */

+

+#define DMA_REQUEST_TIM5_CH1               72U  /*!< DMAMUX1 TIM5 CH1 request  */

+#define DMA_REQUEST_TIM5_CH2               73U  /*!< DMAMUX1 TIM5 CH2 request  */

+#define DMA_REQUEST_TIM5_CH3               74U  /*!< DMAMUX1 TIM5 CH3 request  */

+#define DMA_REQUEST_TIM5_CH4               75U  /*!< DMAMUX1 TIM5 CH4 request  */

+#define DMA_REQUEST_TIM5_UP                76U  /*!< DMAMUX1 TIM5 UP  request  */

+#define DMA_REQUEST_TIM5_TRIG              77U  /*!< DMAMUX1 TIM5 TRIG request */

+

+#define DMA_REQUEST_TIM15_CH1              78U  /*!< DMAMUX1 TIM15 CH1 request */

+#define DMA_REQUEST_TIM15_UP               79U  /*!< DMAMUX1 TIM15 UP  request */

+#define DMA_REQUEST_TIM15_TRIG             80U  /*!< DMAMUX1 TIM15 TRIG request */

+#define DMA_REQUEST_TIM15_COM              81U  /*!< DMAMUX1 TIM15 COM request */

+

+#define DMA_REQUEST_TIM16_CH1              82U  /*!< DMAMUX1 TIM16 CH1 request */

+#define DMA_REQUEST_TIM16_UP               83U  /*!< DMAMUX1 TIM16 UP  request */

+#define DMA_REQUEST_TIM17_CH1              84U  /*!< DMAMUX1 TIM17 CH1 request */

+#define DMA_REQUEST_TIM17_UP               85U  /*!< DMAMUX1 TIM17 UP  request */

+

+#define DMA_REQUEST_DFSDM1_FLT0            86U  /*!< DMAMUX1 DFSDM1 Filter0 request */

+#define DMA_REQUEST_DFSDM1_FLT1            87U  /*!< DMAMUX1 DFSDM1 Filter1 request */

+#define DMA_REQUEST_DFSDM1_FLT2            88U  /*!< DMAMUX1 DFSDM1 Filter2 request */

+#define DMA_REQUEST_DFSDM1_FLT3            89U  /*!< DMAMUX1 DFSDM1 Filter3 request */

+

+#define DMA_REQUEST_DCMI                   90U  /*!< DMAMUX1 DCMI request      */

+

+#define DMA_REQUEST_AES_IN                 91U  /*!< DMAMUX1 AES IN request    */

+#define DMA_REQUEST_AES_OUT                92U  /*!< DMAMUX1 AES OUT request   */

+

+#define DMA_REQUEST_HASH_IN                93U  /*!< DMAMUX1 HASH IN request   */

+

+#endif /* DMAMUX1 */

+

+/**

+  * @}

+  */

+

+/** @defgroup DMA_Data_transfer_direction DMA Data transfer direction

+  * @{

+  */

+#define DMA_PERIPH_TO_MEMORY         0x00000000U        /*!< Peripheral to memory direction */

+#define DMA_MEMORY_TO_PERIPH         DMA_CCR_DIR        /*!< Memory to peripheral direction */

+#define DMA_MEMORY_TO_MEMORY         DMA_CCR_MEM2MEM    /*!< Memory to memory direction     */

+/**

+  * @}

+  */

+

+/** @defgroup DMA_Peripheral_incremented_mode DMA Peripheral incremented mode

+  * @{

+  */

+#define DMA_PINC_ENABLE              DMA_CCR_PINC  /*!< Peripheral increment mode Enable */

+#define DMA_PINC_DISABLE             0x00000000U   /*!< Peripheral increment mode Disable */

+/**

+  * @}

+  */

+

+/** @defgroup DMA_Memory_incremented_mode DMA Memory incremented mode

+  * @{

+  */

+#define DMA_MINC_ENABLE              DMA_CCR_MINC   /*!< Memory increment mode Enable  */

+#define DMA_MINC_DISABLE             0x00000000U    /*!< Memory increment mode Disable */

+/**

+  * @}

+  */

+

+/** @defgroup DMA_Peripheral_data_size DMA Peripheral data size

+  * @{

+  */

+#define DMA_PDATAALIGN_BYTE          0x00000000U       /*!< Peripheral data alignment : Byte     */

+#define DMA_PDATAALIGN_HALFWORD      DMA_CCR_PSIZE_0   /*!< Peripheral data alignment : HalfWord */

+#define DMA_PDATAALIGN_WORD          DMA_CCR_PSIZE_1   /*!< Peripheral data alignment : Word     */

+/**

+  * @}

+  */

+

+/** @defgroup DMA_Memory_data_size DMA Memory data size

+  * @{

+  */

+#define DMA_MDATAALIGN_BYTE          0x00000000U       /*!< Memory data alignment : Byte     */

+#define DMA_MDATAALIGN_HALFWORD      DMA_CCR_MSIZE_0   /*!< Memory data alignment : HalfWord */

+#define DMA_MDATAALIGN_WORD          DMA_CCR_MSIZE_1   /*!< Memory data alignment : Word     */

+/**

+  * @}

+  */

+

+/** @defgroup DMA_mode DMA mode

+  * @{

+  */

+#define DMA_NORMAL                   0x00000000U     /*!< Normal mode                  */

+#define DMA_CIRCULAR                 DMA_CCR_CIRC    /*!< Circular mode                */

+/**

+  * @}

+  */

+

+/** @defgroup DMA_Priority_level DMA Priority level

+  * @{

+  */

+#define DMA_PRIORITY_LOW             0x00000000U     /*!< Priority level : Low       */

+#define DMA_PRIORITY_MEDIUM          DMA_CCR_PL_0    /*!< Priority level : Medium    */

+#define DMA_PRIORITY_HIGH            DMA_CCR_PL_1    /*!< Priority level : High      */

+#define DMA_PRIORITY_VERY_HIGH       DMA_CCR_PL      /*!< Priority level : Very_High */

+/**

+  * @}

+  */

+

+

+/** @defgroup DMA_interrupt_enable_definitions DMA interrupt enable definitions

+  * @{

+  */

+#define DMA_IT_TC                         DMA_CCR_TCIE

+#define DMA_IT_HT                         DMA_CCR_HTIE

+#define DMA_IT_TE                         DMA_CCR_TEIE

+/**

+  * @}

+  */

+

+/** @defgroup DMA_flag_definitions DMA flag definitions

+  * @{

+  */

+#define DMA_FLAG_GL1                      DMA_ISR_GIF1

+#define DMA_FLAG_TC1                      DMA_ISR_TCIF1

+#define DMA_FLAG_HT1                      DMA_ISR_HTIF1

+#define DMA_FLAG_TE1                      DMA_ISR_TEIF1

+#define DMA_FLAG_GL2                      DMA_ISR_GIF2

+#define DMA_FLAG_TC2                      DMA_ISR_TCIF2

+#define DMA_FLAG_HT2                      DMA_ISR_HTIF2

+#define DMA_FLAG_TE2                      DMA_ISR_TEIF2

+#define DMA_FLAG_GL3                      DMA_ISR_GIF3

+#define DMA_FLAG_TC3                      DMA_ISR_TCIF3

+#define DMA_FLAG_HT3                      DMA_ISR_HTIF3

+#define DMA_FLAG_TE3                      DMA_ISR_TEIF3

+#define DMA_FLAG_GL4                      DMA_ISR_GIF4

+#define DMA_FLAG_TC4                      DMA_ISR_TCIF4

+#define DMA_FLAG_HT4                      DMA_ISR_HTIF4

+#define DMA_FLAG_TE4                      DMA_ISR_TEIF4

+#define DMA_FLAG_GL5                      DMA_ISR_GIF5

+#define DMA_FLAG_TC5                      DMA_ISR_TCIF5

+#define DMA_FLAG_HT5                      DMA_ISR_HTIF5

+#define DMA_FLAG_TE5                      DMA_ISR_TEIF5

+#define DMA_FLAG_GL6                      DMA_ISR_GIF6

+#define DMA_FLAG_TC6                      DMA_ISR_TCIF6

+#define DMA_FLAG_HT6                      DMA_ISR_HTIF6

+#define DMA_FLAG_TE6                      DMA_ISR_TEIF6

+#define DMA_FLAG_GL7                      DMA_ISR_GIF7

+#define DMA_FLAG_TC7                      DMA_ISR_TCIF7

+#define DMA_FLAG_HT7                      DMA_ISR_HTIF7

+#define DMA_FLAG_TE7                      DMA_ISR_TEIF7

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Exported macros -----------------------------------------------------------*/

+/** @defgroup DMA_Exported_Macros DMA Exported Macros

+  * @{

+  */

+

+/** @brief  Reset DMA handle state.

+  * @param  __HANDLE__ DMA handle

+  * @retval None

+  */

+#define __HAL_DMA_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_DMA_STATE_RESET)

+

+/**

+  * @brief  Enable the specified DMA Channel.

+  * @param  __HANDLE__ DMA handle

+  * @retval None

+  */

+#define __HAL_DMA_ENABLE(__HANDLE__)        ((__HANDLE__)->Instance->CCR |=  DMA_CCR_EN)

+

+/**

+  * @brief  Disable the specified DMA Channel.

+  * @param  __HANDLE__ DMA handle

+  * @retval None

+  */

+#define __HAL_DMA_DISABLE(__HANDLE__)       ((__HANDLE__)->Instance->CCR &=  ~DMA_CCR_EN)

+

+

+/* Interrupt & Flag management */

+

+/**

+  * @brief  Return the current DMA Channel transfer complete flag.

+  * @param  __HANDLE__ DMA handle

+  * @retval The specified transfer complete flag index.

+  */

+

+#define __HAL_DMA_GET_TC_FLAG_INDEX(__HANDLE__) \

+(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel1))? DMA_FLAG_TC1 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel1))? DMA_FLAG_TC1 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel2))? DMA_FLAG_TC2 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel2))? DMA_FLAG_TC2 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel3))? DMA_FLAG_TC3 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel3))? DMA_FLAG_TC3 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel4))? DMA_FLAG_TC4 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel4))? DMA_FLAG_TC4 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel5))? DMA_FLAG_TC5 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel5))? DMA_FLAG_TC5 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel6))? DMA_FLAG_TC6 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel6))? DMA_FLAG_TC6 :\

+   DMA_FLAG_TC7)

+

+/**

+  * @brief  Return the current DMA Channel half transfer complete flag.

+  * @param  __HANDLE__ DMA handle

+  * @retval The specified half transfer complete flag index.

+  */

+#define __HAL_DMA_GET_HT_FLAG_INDEX(__HANDLE__)\

+(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel1))? DMA_FLAG_HT1 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel1))? DMA_FLAG_HT1 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel2))? DMA_FLAG_HT2 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel2))? DMA_FLAG_HT2 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel3))? DMA_FLAG_HT3 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel3))? DMA_FLAG_HT3 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel4))? DMA_FLAG_HT4 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel4))? DMA_FLAG_HT4 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel5))? DMA_FLAG_HT5 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel5))? DMA_FLAG_HT5 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel6))? DMA_FLAG_HT6 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel6))? DMA_FLAG_HT6 :\

+   DMA_FLAG_HT7)

+

+/**

+  * @brief  Return the current DMA Channel transfer error flag.

+  * @param  __HANDLE__ DMA handle

+  * @retval The specified transfer error flag index.

+  */

+#define __HAL_DMA_GET_TE_FLAG_INDEX(__HANDLE__)\

+(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel1))? DMA_FLAG_TE1 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel1))? DMA_FLAG_TE1 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel2))? DMA_FLAG_TE2 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel2))? DMA_FLAG_TE2 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel3))? DMA_FLAG_TE3 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel3))? DMA_FLAG_TE3 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel4))? DMA_FLAG_TE4 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel4))? DMA_FLAG_TE4 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel5))? DMA_FLAG_TE5 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel5))? DMA_FLAG_TE5 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel6))? DMA_FLAG_TE6 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel6))? DMA_FLAG_TE6 :\

+   DMA_FLAG_TE7)

+

+/**

+  * @brief  Return the current DMA Channel Global interrupt flag.

+  * @param  __HANDLE__ DMA handle

+  * @retval The specified transfer error flag index.

+  */

+#define __HAL_DMA_GET_GI_FLAG_INDEX(__HANDLE__)\

+(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel1))? DMA_ISR_GIF1 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel1))? DMA_ISR_GIF1 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel2))? DMA_ISR_GIF2 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel2))? DMA_ISR_GIF2 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel3))? DMA_ISR_GIF3 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel3))? DMA_ISR_GIF3 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel4))? DMA_ISR_GIF4 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel4))? DMA_ISR_GIF4 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel5))? DMA_ISR_GIF5 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel5))? DMA_ISR_GIF5 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel6))? DMA_ISR_GIF6 :\

+ ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel6))? DMA_ISR_GIF6 :\

+   DMA_ISR_GIF7)

+

+/**

+  * @brief  Get the DMA Channel pending flags.

+  * @param  __HANDLE__ DMA handle

+  * @param  __FLAG__ Get the specified flag.

+  *          This parameter can be any combination of the following values:

+  *            @arg DMA_FLAG_TCx:  Transfer complete flag

+  *            @arg DMA_FLAG_HTx:  Half transfer complete flag

+  *            @arg DMA_FLAG_TEx:  Transfer error flag

+  *            @arg DMA_FLAG_GLx:  Global interrupt flag

+  *         Where x can be from 1 to 7 to select the DMA Channel x flag.

+  * @retval The state of FLAG (SET or RESET).

+  */

+#define __HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__) (((uint32_t)((__HANDLE__)->Instance) > ((uint32_t)DMA1_Channel7))? \

+ (DMA2->ISR & (__FLAG__)) : (DMA1->ISR & (__FLAG__)))

+

+/**

+  * @brief  Clear the DMA Channel pending flags.

+  * @param  __HANDLE__ DMA handle

+  * @param  __FLAG__ specifies the flag to clear.

+  *          This parameter can be any combination of the following values:

+  *            @arg DMA_FLAG_TCx:  Transfer complete flag

+  *            @arg DMA_FLAG_HTx:  Half transfer complete flag

+  *            @arg DMA_FLAG_TEx:  Transfer error flag

+  *            @arg DMA_FLAG_GLx:  Global interrupt flag

+  *         Where x can be from 1 to 7 to select the DMA Channel x flag.

+  * @retval None

+  */

+#define __HAL_DMA_CLEAR_FLAG(__HANDLE__, __FLAG__) (((uint32_t)((__HANDLE__)->Instance) > ((uint32_t)DMA1_Channel7))? \

+ (DMA2->IFCR = (__FLAG__)) : (DMA1->IFCR = (__FLAG__)))

+

+/**

+  * @brief  Enable the specified DMA Channel interrupts.

+  * @param  __HANDLE__ DMA handle

+  * @param __INTERRUPT__ specifies the DMA interrupt sources to be enabled or disabled.

+  *          This parameter can be any combination of the following values:

+  *            @arg DMA_IT_TC:  Transfer complete interrupt mask

+  *            @arg DMA_IT_HT:  Half transfer complete interrupt mask

+  *            @arg DMA_IT_TE:  Transfer error interrupt mask

+  * @retval None

+  */

+#define __HAL_DMA_ENABLE_IT(__HANDLE__, __INTERRUPT__)   ((__HANDLE__)->Instance->CCR |= (__INTERRUPT__))

+

+/**

+  * @brief  Disable the specified DMA Channel interrupts.

+  * @param  __HANDLE__ DMA handle

+  * @param  __INTERRUPT__ specifies the DMA interrupt sources to be enabled or disabled.

+  *          This parameter can be any combination of the following values:

+  *            @arg DMA_IT_TC:  Transfer complete interrupt mask

+  *            @arg DMA_IT_HT:  Half transfer complete interrupt mask

+  *            @arg DMA_IT_TE:  Transfer error interrupt mask

+  * @retval None

+  */

+#define __HAL_DMA_DISABLE_IT(__HANDLE__, __INTERRUPT__)  ((__HANDLE__)->Instance->CCR &= ~(__INTERRUPT__))

+

+/**

+  * @brief  Check whether the specified DMA Channel interrupt is enabled or not.

+  * @param  __HANDLE__ DMA handle

+  * @param  __INTERRUPT__ specifies the DMA interrupt source to check.

+  *          This parameter can be one of the following values:

+  *            @arg DMA_IT_TC:  Transfer complete interrupt mask

+  *            @arg DMA_IT_HT:  Half transfer complete interrupt mask

+  *            @arg DMA_IT_TE:  Transfer error interrupt mask

+  * @retval The state of DMA_IT (SET or RESET).

+  */

+#define __HAL_DMA_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__)  (((__HANDLE__)->Instance->CCR & (__INTERRUPT__)))

+

+/**

+  * @brief  Return the number of remaining data units in the current DMA Channel transfer.

+  * @param  __HANDLE__ DMA handle

+  * @retval The number of remaining data units in the current DMA Channel transfer.

+  */

+#define __HAL_DMA_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNDTR)

+

+/**

+  * @}

+  */

+

+#if defined(DMAMUX1)

+/* Include DMA HAL Extension module */

+#include "stm32l4xx_hal_dma_ex.h"

+#endif /* DMAMUX1 */

+

+/* Exported functions --------------------------------------------------------*/

+

+/** @addtogroup DMA_Exported_Functions

+  * @{

+  */

+

+/** @addtogroup DMA_Exported_Functions_Group1

+  * @{

+  */

+/* Initialization and de-initialization functions *****************************/

+HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma);

+HAL_StatusTypeDef HAL_DMA_DeInit (DMA_HandleTypeDef *hdma);

+/**

+  * @}

+  */

+

+/** @addtogroup DMA_Exported_Functions_Group2

+  * @{

+  */

+/* IO operation functions *****************************************************/

+HAL_StatusTypeDef HAL_DMA_Start (DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength);

+HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength);

+HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma);

+HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma);

+HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout);

+void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma);

+HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)( DMA_HandleTypeDef * _hdma));

+HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID);

+

+/**

+  * @}

+  */

+

+/** @addtogroup DMA_Exported_Functions_Group3

+  * @{

+  */

+/* Peripheral State and Error functions ***************************************/

+HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma);

+uint32_t             HAL_DMA_GetError(DMA_HandleTypeDef *hdma);

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Private macros ------------------------------------------------------------*/

+/** @defgroup DMA_Private_Macros DMA Private Macros

+  * @{

+  */

+

+#define IS_DMA_DIRECTION(DIRECTION) (((DIRECTION) == DMA_PERIPH_TO_MEMORY ) || \

+                                     ((DIRECTION) == DMA_MEMORY_TO_PERIPH)  || \

+                                     ((DIRECTION) == DMA_MEMORY_TO_MEMORY))

+

+#define IS_DMA_BUFFER_SIZE(SIZE) (((SIZE) >= 0x1U) && ((SIZE) < 0x10000U))

+

+#define IS_DMA_PERIPHERAL_INC_STATE(STATE) (((STATE) == DMA_PINC_ENABLE) || \

+                                            ((STATE) == DMA_PINC_DISABLE))

+

+#define IS_DMA_MEMORY_INC_STATE(STATE) (((STATE) == DMA_MINC_ENABLE)  || \

+                                        ((STATE) == DMA_MINC_DISABLE))

+

+#if !defined (DMAMUX1)

+

+#define IS_DMA_ALL_REQUEST(REQUEST) (((REQUEST) == DMA_REQUEST_0) || \

+                                     ((REQUEST) == DMA_REQUEST_1) || \

+                                     ((REQUEST) == DMA_REQUEST_2) || \

+                                     ((REQUEST) == DMA_REQUEST_3) || \

+                                     ((REQUEST) == DMA_REQUEST_4) || \

+                                     ((REQUEST) == DMA_REQUEST_5) || \

+                                     ((REQUEST) == DMA_REQUEST_6) || \

+                                     ((REQUEST) == DMA_REQUEST_7))

+#endif

+

+#if defined(DMAMUX1)

+

+#define IS_DMA_ALL_REQUEST(REQUEST)((REQUEST) <= DMA_REQUEST_HASH_IN)

+

+#endif /* DMAMUX1 */

+

+#define IS_DMA_PERIPHERAL_DATA_SIZE(SIZE) (((SIZE) == DMA_PDATAALIGN_BYTE)     || \

+                                           ((SIZE) == DMA_PDATAALIGN_HALFWORD) || \

+                                           ((SIZE) == DMA_PDATAALIGN_WORD))

+

+#define IS_DMA_MEMORY_DATA_SIZE(SIZE) (((SIZE) == DMA_MDATAALIGN_BYTE)     || \

+                                       ((SIZE) == DMA_MDATAALIGN_HALFWORD) || \

+                                       ((SIZE) == DMA_MDATAALIGN_WORD ))

+

+#define IS_DMA_MODE(MODE) (((MODE) == DMA_NORMAL )  || \

+                           ((MODE) == DMA_CIRCULAR))

+

+#define IS_DMA_PRIORITY(PRIORITY) (((PRIORITY) == DMA_PRIORITY_LOW )   || \

+                                   ((PRIORITY) == DMA_PRIORITY_MEDIUM) || \

+                                   ((PRIORITY) == DMA_PRIORITY_HIGH)   || \

+                                   ((PRIORITY) == DMA_PRIORITY_VERY_HIGH))

+

+/**

+  * @}

+  */

+

+/* Private functions ---------------------------------------------------------*/

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* STM32L4xx_HAL_DMA_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h
new file mode 100644
index 0000000..81da436
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h
@@ -0,0 +1,282 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_dma_ex.h

+  * @author  MCD Application Team

+  * @brief   Header file of DMA HAL extension module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef STM32L4xx_HAL_DMA_EX_H

+#define STM32L4xx_HAL_DMA_EX_H

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#if defined(DMAMUX1)

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup DMAEx

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+/** @defgroup DMAEx_Exported_Types DMAEx Exported Types

+  * @{

+  */

+

+/**

+  * @brief  HAL DMA Synchro definition

+  */

+

+

+/**

+  * @brief  HAL DMAMUX Synchronization configuration structure definition

+  */

+typedef struct

+{

+  uint32_t SyncSignalID;  /*!< Specifies the synchronization signal gating the DMA request in periodic mode.

+                              This parameter can be a value of @ref DMAEx_DMAMUX_SyncSignalID_selection */

+

+  uint32_t SyncPolarity;  /*!< Specifies the polarity of the signal on which the DMA request is synchronized.

+                              This parameter can be a value of @ref DMAEx_DMAMUX_SyncPolarity_selection */

+

+  FunctionalState SyncEnable;  /*!< Specifies if the synchronization shall be enabled or disabled

+                                    This parameter can take the value ENABLE or DISABLE*/

+

+

+  FunctionalState EventEnable;    /*!< Specifies if an event shall be generated once the RequestNumber is reached.

+                                       This parameter can take the value ENABLE or DISABLE */

+

+  uint32_t RequestNumber; /*!< Specifies the number of DMA request that will be authorized after a sync event

+                               This parameter must be a number between Min_Data = 1 and Max_Data = 32 */

+

+

+}HAL_DMA_MuxSyncConfigTypeDef;

+

+

+/**

+  * @brief  HAL DMAMUX request generator parameters structure definition

+  */

+typedef struct

+{

+ uint32_t SignalID;      /*!< Specifies the ID of the signal used for DMAMUX request generator

+                              This parameter can be a value of @ref DMAEx_DMAMUX_SignalGeneratorID_selection */

+

+  uint32_t Polarity;       /*!< Specifies the polarity of the signal on which the request is generated.

+                             This parameter can be a value of @ref DMAEx_DMAMUX_RequestGeneneratorPolarity_selection */

+

+  uint32_t RequestNumber;  /*!< Specifies the number of DMA request that will be generated after a signal event

+                                This parameter must be a number between Min_Data = 1 and Max_Data = 32 */

+

+}HAL_DMA_MuxRequestGeneratorConfigTypeDef;

+

+/**

+  * @}

+  */

+

+/* Exported constants --------------------------------------------------------*/

+/** @defgroup DMAEx_Exported_Constants DMAEx Exported Constants

+  * @{

+  */

+

+/** @defgroup DMAEx_DMAMUX_SyncSignalID_selection DMAMUX SyncSignalID selection

+  * @{

+  */

+#define HAL_DMAMUX1_SYNC_EXTI0                0U           /*!<  Synchronization Signal is EXTI0  IT   */

+#define HAL_DMAMUX1_SYNC_EXTI1                1U           /*!<  Synchronization Signal is EXTI1  IT   */

+#define HAL_DMAMUX1_SYNC_EXTI2                2U           /*!<  Synchronization Signal is EXTI2  IT   */

+#define HAL_DMAMUX1_SYNC_EXTI3                3U           /*!<  Synchronization Signal is EXTI3  IT   */

+#define HAL_DMAMUX1_SYNC_EXTI4                4U           /*!<  Synchronization Signal is EXTI4  IT   */

+#define HAL_DMAMUX1_SYNC_EXTI5                5U           /*!<  Synchronization Signal is EXTI5  IT   */

+#define HAL_DMAMUX1_SYNC_EXTI6                6U           /*!<  Synchronization Signal is EXTI6  IT   */

+#define HAL_DMAMUX1_SYNC_EXTI7                7U           /*!<  Synchronization Signal is EXTI7  IT   */

+#define HAL_DMAMUX1_SYNC_EXTI8                8U           /*!<  Synchronization Signal is EXTI8  IT   */

+#define HAL_DMAMUX1_SYNC_EXTI9                9U           /*!<  Synchronization Signal is EXTI9  IT   */

+#define HAL_DMAMUX1_SYNC_EXTI10              10U           /*!<  Synchronization Signal is EXTI10 IT   */

+#define HAL_DMAMUX1_SYNC_EXTI11              11U           /*!<  Synchronization Signal is EXTI11 IT   */

+#define HAL_DMAMUX1_SYNC_EXTI12              12U           /*!<  Synchronization Signal is EXTI12 IT   */

+#define HAL_DMAMUX1_SYNC_EXTI13              13U           /*!<  Synchronization Signal is EXTI13 IT   */

+#define HAL_DMAMUX1_SYNC_EXTI14              14U           /*!<  Synchronization Signal is EXTI14 IT   */

+#define HAL_DMAMUX1_SYNC_EXTI15              15U           /*!<  Synchronization Signal is EXTI15 IT   */

+#define HAL_DMAMUX1_SYNC_DMAMUX1_CH0_EVT     16U           /*!<  Synchronization Signal is DMAMUX1 Channel0 Event  */

+#define HAL_DMAMUX1_SYNC_DMAMUX1_CH1_EVT     17U           /*!<  Synchronization Signal is DMAMUX1 Channel1 Event  */

+#define HAL_DMAMUX1_SYNC_DMAMUX1_CH2_EVT     18U           /*!<  Synchronization Signal is DMAMUX1 Channel2 Event  */

+#define HAL_DMAMUX1_SYNC_DMAMUX1_CH3_EVT     19U           /*!<  Synchronization Signal is DMAMUX1 Channel3 Event  */

+#define HAL_DMAMUX1_SYNC_LPTIM1_OUT          20U           /*!<  Synchronization Signal is LPTIM1 OUT */

+#define HAL_DMAMUX1_SYNC_LPTIM2_OUT          21U           /*!<  Synchronization Signal is LPTIM2 OUT */

+#define HAL_DMAMUX1_SYNC_DSI_TE              22U           /*!<  Synchronization Signal is DSI Tearing Effect      */

+#define HAL_DMAMUX1_SYNC_DSI_EOT             23U           /*!<  Synchronization Signal is DSI End of refresh      */

+#define HAL_DMAMUX1_SYNC_DMA2D_EOT           24U           /*!<  Synchronization Signal is DMA2D End of Transfer   */

+#define HAL_DMAMUX1_SYNC_LDTC_IT             25U           /*!<  Synchronization Signal is LDTC IT    */

+

+/**

+  * @}

+  */

+

+/** @defgroup DMAEx_DMAMUX_SyncPolarity_selection DMAMUX SyncPolarity selection

+  * @{

+  */

+#define HAL_DMAMUX_SYNC_NO_EVENT                               0U    /*!< block synchronization events        */

+#define HAL_DMAMUX_SYNC_RISING                 DMAMUX_CxCR_SPOL_0    /*!< synchronize with rising edge events */

+#define HAL_DMAMUX_SYNC_FALLING                DMAMUX_CxCR_SPOL_1    /*!< synchronize with falling edge events */

+#define HAL_DMAMUX_SYNC_RISING_FALLING         DMAMUX_CxCR_SPOL      /*!< synchronize with rising and falling edge events */

+

+/**

+  * @}

+  */

+

+/** @defgroup DMAEx_DMAMUX_SignalGeneratorID_selection DMAMUX SignalGeneratorID selection

+  * @{

+  */

+

+#define HAL_DMAMUX1_REQ_GEN_EXTI0                0U        /*!< Request generator Signal is EXTI0 IT    */

+#define HAL_DMAMUX1_REQ_GEN_EXTI1                1U        /*!< Request generator Signal is EXTI1 IT    */

+#define HAL_DMAMUX1_REQ_GEN_EXTI2                2U        /*!< Request generator Signal is EXTI2 IT    */

+#define HAL_DMAMUX1_REQ_GEN_EXTI3                3U        /*!< Request generator Signal is EXTI3 IT    */

+#define HAL_DMAMUX1_REQ_GEN_EXTI4                4U        /*!< Request generator Signal is EXTI4 IT    */

+#define HAL_DMAMUX1_REQ_GEN_EXTI5                5U        /*!< Request generator Signal is EXTI5 IT    */

+#define HAL_DMAMUX1_REQ_GEN_EXTI6                6U        /*!< Request generator Signal is EXTI6 IT    */

+#define HAL_DMAMUX1_REQ_GEN_EXTI7                7U        /*!< Request generator Signal is EXTI7 IT    */

+#define HAL_DMAMUX1_REQ_GEN_EXTI8                8U        /*!< Request generator Signal is EXTI8 IT    */

+#define HAL_DMAMUX1_REQ_GEN_EXTI9                9U        /*!< Request generator Signal is EXTI9 IT    */

+#define HAL_DMAMUX1_REQ_GEN_EXTI10              10U        /*!< Request generator Signal is EXTI10 IT   */

+#define HAL_DMAMUX1_REQ_GEN_EXTI11              11U        /*!< Request generator Signal is EXTI11 IT   */

+#define HAL_DMAMUX1_REQ_GEN_EXTI12              12U        /*!< Request generator Signal is EXTI12 IT   */

+#define HAL_DMAMUX1_REQ_GEN_EXTI13              13U        /*!< Request generator Signal is EXTI13 IT   */

+#define HAL_DMAMUX1_REQ_GEN_EXTI14              14U        /*!< Request generator Signal is EXTI14 IT   */

+#define HAL_DMAMUX1_REQ_GEN_EXTI15              15U        /*!< Request generator Signal is EXTI15 IT   */

+#define HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH0_EVT     16U        /*!< Request generator Signal is DMAMUX1 Channel0 Event */

+#define HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH1_EVT     17U        /*!< Request generator Signal is DMAMUX1 Channel1 Event */

+#define HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH2_EVT     18U        /*!< Request generator Signal is DMAMUX1 Channel2 Event */

+#define HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH3_EVT     19U        /*!< Request generator Signal is DMAMUX1 Channel3 Event */

+#define HAL_DMAMUX1_REQ_GEN_LPTIM1_OUT          20U        /*!< Request generator Signal is LPTIM1 OUT  */

+#define HAL_DMAMUX1_REQ_GEN_LPTIM2_OUT          21U        /*!< Request generator Signal is LPTIM2 OUT  */

+#define HAL_DMAMUX1_REQ_GEN_DSI_TE              22U        /*!< Request generator Signal is DSI Tearing Effect      */

+#define HAL_DMAMUX1_REQ_GEN_DSI_EOT             23U        /*!< Request generator Signal is DSI End of refresh      */

+#define HAL_DMAMUX1_REQ_GEN_DMA2D_EOT           24U        /*!< Request generator Signal is DMA2D End of Transfer   */

+#define HAL_DMAMUX1_REQ_GEN_LTDC_IT             25U        /*!< Request generator Signal is LTDC IT     */

+

+/**

+  * @}

+  */

+

+/** @defgroup DMAEx_DMAMUX_RequestGeneneratorPolarity_selection DMAMUX RequestGeneneratorPolarity selection

+  * @{

+  */

+#define HAL_DMAMUX_REQ_GEN_NO_EVENT       0U                     /*!< block request generator events        */

+#define HAL_DMAMUX_REQ_GEN_RISING         DMAMUX_RGxCR_GPOL_0    /*!< generate request on rising edge events */

+#define HAL_DMAMUX_REQ_GEN_FALLING        DMAMUX_RGxCR_GPOL_1    /*!< generate request on falling edge events */

+#define HAL_DMAMUX_REQ_GEN_RISING_FALLING DMAMUX_RGxCR_GPOL      /*!< generate request on rising and falling edge events */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Exported macro ------------------------------------------------------------*/

+

+/* Exported functions --------------------------------------------------------*/

+/** @addtogroup DMAEx_Exported_Functions

+  * @{

+  */

+

+/* IO operation functions *****************************************************/

+/** @addtogroup DMAEx_Exported_Functions_Group1

+  * @{

+  */

+

+/* ------------------------- REQUEST -----------------------------------------*/

+HAL_StatusTypeDef HAL_DMAEx_ConfigMuxRequestGenerator (DMA_HandleTypeDef *hdma,

+             HAL_DMA_MuxRequestGeneratorConfigTypeDef *pRequestGeneratorConfig);

+HAL_StatusTypeDef HAL_DMAEx_EnableMuxRequestGenerator (DMA_HandleTypeDef *hdma);

+HAL_StatusTypeDef HAL_DMAEx_DisableMuxRequestGenerator (DMA_HandleTypeDef *hdma);

+/* -------------------------------------------------------------------------- */

+

+/* ------------------------- SYNCHRO -----------------------------------------*/

+HAL_StatusTypeDef HAL_DMAEx_ConfigMuxSync(DMA_HandleTypeDef *hdma, HAL_DMA_MuxSyncConfigTypeDef *pSyncConfig);

+/* -------------------------------------------------------------------------- */

+

+void HAL_DMAEx_MUX_IRQHandler(DMA_HandleTypeDef *hdma);

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+

+/* Private macros ------------------------------------------------------------*/

+/** @defgroup DMAEx_Private_Macros DMAEx Private Macros

+  * @brief    DMAEx private macros

+  * @{

+  */

+

+#define IS_DMAMUX_SYNC_SIGNAL_ID(SIGNAL_ID) ((SIGNAL_ID) <= HAL_DMAMUX1_SYNC_LDTC_IT)

+

+#define IS_DMAMUX_SYNC_REQUEST_NUMBER(REQUEST_NUMBER) (((REQUEST_NUMBER) > 0U) && ((REQUEST_NUMBER) <= 32U))

+

+#define IS_DMAMUX_SYNC_POLARITY(POLARITY) (((POLARITY) == HAL_DMAMUX_SYNC_NO_EVENT) || \

+                                           ((POLARITY) == HAL_DMAMUX_SYNC_RISING)   || \

+                                           ((POLARITY) == HAL_DMAMUX_SYNC_FALLING)  || \

+                                           ((POLARITY) == HAL_DMAMUX_SYNC_RISING_FALLING))

+

+#define IS_DMAMUX_SYNC_STATE(SYNC) (((SYNC) == DISABLE)   || ((SYNC) == ENABLE))

+

+#define IS_DMAMUX_SYNC_EVENT(EVENT) (((EVENT) == DISABLE)   || \

+                                     ((EVENT) == ENABLE))

+

+#define IS_DMAMUX_REQUEST_GEN_SIGNAL_ID(SIGNAL_ID) ((SIGNAL_ID) <= HAL_DMAMUX1_REQ_GEN_LTDC_IT)

+

+#define IS_DMAMUX_REQUEST_GEN_REQUEST_NUMBER(REQUEST_NUMBER) (((REQUEST_NUMBER) > 0U) && ((REQUEST_NUMBER) <= 32U))

+

+#define IS_DMAMUX_REQUEST_GEN_POLARITY(POLARITY) (((POLARITY) == HAL_DMAMUX_REQ_GEN_NO_EVENT)   || \

+                                               ((POLARITY) == HAL_DMAMUX_REQ_GEN_RISING)  || \

+                                               ((POLARITY) == HAL_DMAMUX_REQ_GEN_FALLING) || \

+                                               ((POLARITY) == HAL_DMAMUX_REQ_GEN_RISING_FALLING))

+

+/**

+  * @}

+  */

+

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#endif /* DMAMUX1 */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* STM32L4xx_HAL_DMA_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h
new file mode 100644
index 0000000..c90e9d0
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h
@@ -0,0 +1,860 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_exti.h

+  * @author  MCD Application Team

+  * @brief   Header file of EXTI HAL module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef STM32L4xx_HAL_EXTI_H

+#define STM32L4xx_HAL_EXTI_H

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup EXTI EXTI

+  * @brief EXTI HAL module driver

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+

+/** @defgroup EXTI_Exported_Types EXTI Exported Types

+  * @{

+  */

+typedef enum

+{

+  HAL_EXTI_COMMON_CB_ID          = 0x00U,

+  HAL_EXTI_RISING_CB_ID          = 0x01U,

+  HAL_EXTI_FALLING_CB_ID         = 0x02U,

+} EXTI_CallbackIDTypeDef;

+

+

+/**

+  * @brief  EXTI Handle structure definition

+  */

+typedef struct

+{

+  uint32_t Line;                    /*!<  Exti line number */

+  void (* PendingCallback)(void);   /*!<  Exti pending callback */

+} EXTI_HandleTypeDef;

+

+/**

+  * @brief  EXTI Configuration structure definition

+  */

+typedef struct

+{

+  uint32_t Line;      /*!< The Exti line to be configured. This parameter

+                           can be a value of @ref EXTI_Line */

+  uint32_t Mode;      /*!< The Exit Mode to be configured for a core.

+                           This parameter can be a combination of @ref EXTI_Mode */

+  uint32_t Trigger;   /*!< The Exti Trigger to be configured. This parameter

+                           can be a value of @ref EXTI_Trigger */

+  uint32_t GPIOSel;   /*!< The Exti GPIO multiplexer selection to be configured.

+                           This parameter is only possible for line 0 to 15. It

+                           can be a value of @ref EXTI_GPIOSel */

+} EXTI_ConfigTypeDef;

+

+/**

+  * @}

+  */

+

+/* Exported constants --------------------------------------------------------*/

+/** @defgroup EXTI_Exported_Constants EXTI Exported Constants

+  * @{

+  */

+

+/** @defgroup EXTI_Line  EXTI Line

+  * @{

+  */

+#if defined(STM32L412xx) || defined(STM32L422xx)

+

+#define EXTI_LINE_0                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_1                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_2                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x02u)

+#define EXTI_LINE_3                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x03u)

+#define EXTI_LINE_4                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x04u)

+#define EXTI_LINE_5                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_6                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_7                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x07u)

+#define EXTI_LINE_8                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x08u)

+#define EXTI_LINE_9                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x09u)

+#define EXTI_LINE_10                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Au)

+#define EXTI_LINE_11                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Bu)

+#define EXTI_LINE_12                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Cu)

+#define EXTI_LINE_13                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Du)

+#define EXTI_LINE_14                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Eu)

+#define EXTI_LINE_15                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Fu)

+#define EXTI_LINE_16                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x10u)

+#define EXTI_LINE_17                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x11u)

+#define EXTI_LINE_18                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x12u)

+#define EXTI_LINE_19                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x13u)

+#define EXTI_LINE_20                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x14u)

+#define EXTI_LINE_21                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x15u)

+#define EXTI_LINE_22                        (EXTI_RESERVED | EXTI_REG1              | 0x16u)

+#define EXTI_LINE_23                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x17u)

+#define EXTI_LINE_24                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x18u)

+#define EXTI_LINE_25                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x19u)

+#define EXTI_LINE_26                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Au)

+#define EXTI_LINE_27                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Bu)

+#define EXTI_LINE_28                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Cu)

+#define EXTI_LINE_29                        (EXTI_RESERVED | EXTI_REG1              | 0x1Du)

+#define EXTI_LINE_30                        (EXTI_RESERVED | EXTI_REG1              | 0x1Eu)

+#define EXTI_LINE_31                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Fu)

+#define EXTI_LINE_32                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_33                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_34                        (EXTI_RESERVED | EXTI_REG2              | 0x02u)

+#define EXTI_LINE_35                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x03u)

+#define EXTI_LINE_36                        (EXTI_RESERVED | EXTI_REG2              | 0x04u)

+#define EXTI_LINE_37                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_38                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_39                        (EXTI_RESERVED | EXTI_REG2              | 0x07u)

+#define EXTI_LINE_40                        (EXTI_RESERVED | EXTI_REG2              | 0x08u)

+

+#endif /* STM32L412xx || STM32L422xx */

+

+#if defined(STM32L431xx)

+

+#define EXTI_LINE_0                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_1                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_2                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x02u)

+#define EXTI_LINE_3                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x03u)

+#define EXTI_LINE_4                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x04u)

+#define EXTI_LINE_5                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_6                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_7                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x07u)

+#define EXTI_LINE_8                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x08u)

+#define EXTI_LINE_9                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x09u)

+#define EXTI_LINE_10                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Au)

+#define EXTI_LINE_11                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Bu)

+#define EXTI_LINE_12                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Cu)

+#define EXTI_LINE_13                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Du)

+#define EXTI_LINE_14                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Eu)

+#define EXTI_LINE_15                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Fu)

+#define EXTI_LINE_16                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x10u)

+#define EXTI_LINE_17                        (EXTI_RESERVED | EXTI_REG1              | 0x11u)

+#define EXTI_LINE_18                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x12u)

+#define EXTI_LINE_19                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x13u)

+#define EXTI_LINE_20                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x14u)

+#define EXTI_LINE_21                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x15u)

+#define EXTI_LINE_22                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x16u)

+#define EXTI_LINE_23                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x17u)

+#define EXTI_LINE_24                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x18u)

+#define EXTI_LINE_25                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x19u)

+#define EXTI_LINE_26                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Au)

+#define EXTI_LINE_27                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Bu)

+#define EXTI_LINE_28                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Cu)

+#define EXTI_LINE_29                        (EXTI_RESERVED | EXTI_REG1              | 0x1Du)

+#define EXTI_LINE_30                        (EXTI_RESERVED | EXTI_REG1              | 0x1Eu)

+#define EXTI_LINE_31                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Fu)

+#define EXTI_LINE_32                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_33                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_34                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x02u)

+#define EXTI_LINE_35                        (EXTI_RESERVED | EXTI_REG2              | 0x03u)

+#define EXTI_LINE_36                        (EXTI_RESERVED | EXTI_REG2              | 0x04u)

+#define EXTI_LINE_37                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_38                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_39                        (EXTI_RESERVED | EXTI_REG2              | 0x07u)

+#define EXTI_LINE_40                        (EXTI_RESERVED | EXTI_REG2              | 0x08u)

+

+#endif /* STM32L431xx */

+

+#if defined(STM32L432xx) || defined(STM32L442xx)

+

+#define EXTI_LINE_0                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_1                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_2                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x02u)

+#define EXTI_LINE_3                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x03u)

+#define EXTI_LINE_4                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x04u)

+#define EXTI_LINE_5                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_6                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_7                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x07u)

+#define EXTI_LINE_8                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x08u)

+#define EXTI_LINE_9                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x09u)

+#define EXTI_LINE_10                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Au)

+#define EXTI_LINE_11                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Bu)

+#define EXTI_LINE_12                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Cu)

+#define EXTI_LINE_13                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Du)

+#define EXTI_LINE_14                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Eu)

+#define EXTI_LINE_15                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Fu)

+#define EXTI_LINE_16                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x10u)

+#define EXTI_LINE_17                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x11u)

+#define EXTI_LINE_18                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x12u)

+#define EXTI_LINE_19                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x13u)

+#define EXTI_LINE_20                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x14u)

+#define EXTI_LINE_21                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x15u)

+#define EXTI_LINE_22                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x16u)

+#define EXTI_LINE_23                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x17u)

+#define EXTI_LINE_24                        (EXTI_RESERVED | EXTI_REG1              | 0x18u)

+#define EXTI_LINE_25                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x19u)

+#define EXTI_LINE_26                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Au)

+#define EXTI_LINE_27                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Bu)

+#define EXTI_LINE_28                        (EXTI_RESERVED | EXTI_REG1              | 0x1Cu)

+#define EXTI_LINE_29                        (EXTI_RESERVED | EXTI_REG1              | 0x1Du)

+#define EXTI_LINE_30                        (EXTI_RESERVED | EXTI_REG1              | 0x1Eu)

+#define EXTI_LINE_31                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Fu)

+#define EXTI_LINE_32                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_33                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_34                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x02u)

+#define EXTI_LINE_35                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x03u)

+#define EXTI_LINE_36                        (EXTI_RESERVED | EXTI_REG2              | 0x04u)

+#define EXTI_LINE_37                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_38                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_39                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x07u)

+#define EXTI_LINE_40                        (EXTI_RESERVED | EXTI_REG2              | 0x08u)

+

+#endif /* STM32L432xx || STM32L442xx */

+

+#if defined(STM32L433xx) || defined(STM32L443xx)

+

+#define EXTI_LINE_0                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_1                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_2                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x02u)

+#define EXTI_LINE_3                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x03u)

+#define EXTI_LINE_4                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x04u)

+#define EXTI_LINE_5                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_6                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_7                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x07u)

+#define EXTI_LINE_8                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x08u)

+#define EXTI_LINE_9                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x09u)

+#define EXTI_LINE_10                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Au)

+#define EXTI_LINE_11                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Bu)

+#define EXTI_LINE_12                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Cu)

+#define EXTI_LINE_13                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Du)

+#define EXTI_LINE_14                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Eu)

+#define EXTI_LINE_15                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Fu)

+#define EXTI_LINE_16                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x10u)

+#define EXTI_LINE_17                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x11u)

+#define EXTI_LINE_18                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x12u)

+#define EXTI_LINE_19                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x13u)

+#define EXTI_LINE_20                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x14u)

+#define EXTI_LINE_21                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x15u)

+#define EXTI_LINE_22                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x16u)

+#define EXTI_LINE_23                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x17u)

+#define EXTI_LINE_24                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x18u)

+#define EXTI_LINE_25                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x19u)

+#define EXTI_LINE_26                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Au)

+#define EXTI_LINE_27                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Bu)

+#define EXTI_LINE_28                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Cu)

+#define EXTI_LINE_29                        (EXTI_RESERVED | EXTI_REG1              | 0x1Du)

+#define EXTI_LINE_30                        (EXTI_RESERVED | EXTI_REG1              | 0x1Eu)

+#define EXTI_LINE_31                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Fu)

+#define EXTI_LINE_32                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_33                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_34                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x02u)

+#define EXTI_LINE_35                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x03u)

+#define EXTI_LINE_36                        (EXTI_RESERVED | EXTI_REG2              | 0x04u)

+#define EXTI_LINE_37                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_38                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_39                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x07u)

+#define EXTI_LINE_40                        (EXTI_RESERVED | EXTI_REG2              | 0x08u)

+

+#endif /* STM32L433xx || STM32L443xx */

+

+#if defined(STM32L451xx)

+

+#define EXTI_LINE_0                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_1                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_2                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x02u)

+#define EXTI_LINE_3                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x03u)

+#define EXTI_LINE_4                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x04u)

+#define EXTI_LINE_5                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_6                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_7                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x07u)

+#define EXTI_LINE_8                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x08u)

+#define EXTI_LINE_9                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x09u)

+#define EXTI_LINE_10                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Au)

+#define EXTI_LINE_11                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Bu)

+#define EXTI_LINE_12                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Cu)

+#define EXTI_LINE_13                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Du)

+#define EXTI_LINE_14                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Eu)

+#define EXTI_LINE_15                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Fu)

+#define EXTI_LINE_16                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x10u)

+#define EXTI_LINE_17                        (EXTI_RESERVED | EXTI_REG1              | 0x11u)

+#define EXTI_LINE_18                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x12u)

+#define EXTI_LINE_19                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x13u)

+#define EXTI_LINE_20                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x14u)

+#define EXTI_LINE_21                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x15u)

+#define EXTI_LINE_22                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x16u)

+#define EXTI_LINE_23                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x17u)

+#define EXTI_LINE_24                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x18u)

+#define EXTI_LINE_25                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x19u)

+#define EXTI_LINE_26                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Au)

+#define EXTI_LINE_27                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Bu)

+#define EXTI_LINE_28                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Cu)

+#define EXTI_LINE_29                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Du)

+#define EXTI_LINE_30                        (EXTI_RESERVED | EXTI_REG1              | 0x1Eu)

+#define EXTI_LINE_31                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Fu)

+#define EXTI_LINE_32                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_33                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_34                        (EXTI_RESERVED | EXTI_REG2              | 0x02u)

+#define EXTI_LINE_35                        (EXTI_RESERVED | EXTI_REG2              | 0x03u)

+#define EXTI_LINE_36                        (EXTI_RESERVED | EXTI_REG2              | 0x04u)

+#define EXTI_LINE_37                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_38                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_39                        (EXTI_RESERVED | EXTI_REG2              | 0x07u)

+#define EXTI_LINE_40                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x08u)

+

+#endif /* STM32L451xx */

+

+#if defined(STM32L452xx) || defined(STM32L462xx)

+

+#define EXTI_LINE_0                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_1                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_2                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x02u)

+#define EXTI_LINE_3                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x03u)

+#define EXTI_LINE_4                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x04u)

+#define EXTI_LINE_5                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_6                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_7                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x07u)

+#define EXTI_LINE_8                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x08u)

+#define EXTI_LINE_9                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x09u)

+#define EXTI_LINE_10                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Au)

+#define EXTI_LINE_11                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Bu)

+#define EXTI_LINE_12                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Cu)

+#define EXTI_LINE_13                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Du)

+#define EXTI_LINE_14                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Eu)

+#define EXTI_LINE_15                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Fu)

+#define EXTI_LINE_16                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x10u)

+#define EXTI_LINE_17                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x11u)

+#define EXTI_LINE_18                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x12u)

+#define EXTI_LINE_19                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x13u)

+#define EXTI_LINE_20                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x14u)

+#define EXTI_LINE_21                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x15u)

+#define EXTI_LINE_22                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x16u)

+#define EXTI_LINE_23                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x17u)

+#define EXTI_LINE_24                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x18u)

+#define EXTI_LINE_25                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x19u)

+#define EXTI_LINE_26                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Au)

+#define EXTI_LINE_27                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Bu)

+#define EXTI_LINE_28                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Cu)

+#define EXTI_LINE_29                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Du)

+#define EXTI_LINE_30                        (EXTI_RESERVED | EXTI_REG1              | 0x1Eu)

+#define EXTI_LINE_31                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Fu)

+#define EXTI_LINE_32                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_33                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_34                        (EXTI_RESERVED | EXTI_REG2              | 0x02u)

+#define EXTI_LINE_35                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x03u)

+#define EXTI_LINE_36                        (EXTI_RESERVED | EXTI_REG2              | 0x04u)

+#define EXTI_LINE_37                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_38                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_39                        (EXTI_RESERVED | EXTI_REG2              | 0x07u)

+#define EXTI_LINE_40                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x08u)

+

+#endif /* STM32L452xx || STM32L462xx */

+

+#if defined(STM32L471xx)

+

+#define EXTI_LINE_0                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_1                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_2                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x02u)

+#define EXTI_LINE_3                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x03u)

+#define EXTI_LINE_4                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x04u)

+#define EXTI_LINE_5                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_6                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_7                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x07u)

+#define EXTI_LINE_8                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x08u)

+#define EXTI_LINE_9                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x09u)

+#define EXTI_LINE_10                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Au)

+#define EXTI_LINE_11                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Bu)

+#define EXTI_LINE_12                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Cu)

+#define EXTI_LINE_13                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Du)

+#define EXTI_LINE_14                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Eu)

+#define EXTI_LINE_15                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Fu)

+#define EXTI_LINE_16                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x10u)

+#define EXTI_LINE_17                        (EXTI_RESERVED | EXTI_REG1              | 0x11u)

+#define EXTI_LINE_18                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x12u)

+#define EXTI_LINE_19                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x13u)

+#define EXTI_LINE_20                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x14u)

+#define EXTI_LINE_21                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x15u)

+#define EXTI_LINE_22                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x16u)

+#define EXTI_LINE_23                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x17u)

+#define EXTI_LINE_24                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x18u)

+#define EXTI_LINE_25                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x19u)

+#define EXTI_LINE_26                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Au)

+#define EXTI_LINE_27                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Bu)

+#define EXTI_LINE_28                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Cu)

+#define EXTI_LINE_29                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Du)

+#define EXTI_LINE_30                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Eu)

+#define EXTI_LINE_31                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Fu)

+#define EXTI_LINE_32                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_33                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_34                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x02u)

+#define EXTI_LINE_35                        (EXTI_RESERVED | EXTI_REG2              | 0x03u)

+#define EXTI_LINE_36                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x04u)

+#define EXTI_LINE_37                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_38                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_39                        (EXTI_RESERVED | EXTI_REG2              | 0x07u)

+#define EXTI_LINE_40                        (EXTI_RESERVED | EXTI_REG2              | 0x08u)

+

+#endif /* STM32L471xx */

+

+#if defined(STM32L475xx) || defined(STM32L485xx)

+

+#define EXTI_LINE_0                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_1                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_2                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x02u)

+#define EXTI_LINE_3                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x03u)

+#define EXTI_LINE_4                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x04u)

+#define EXTI_LINE_5                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_6                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_7                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x07u)

+#define EXTI_LINE_8                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x08u)

+#define EXTI_LINE_9                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x09u)

+#define EXTI_LINE_10                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Au)

+#define EXTI_LINE_11                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Bu)

+#define EXTI_LINE_12                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Cu)

+#define EXTI_LINE_13                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Du)

+#define EXTI_LINE_14                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Eu)

+#define EXTI_LINE_15                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Fu)

+#define EXTI_LINE_16                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x10u)

+#define EXTI_LINE_17                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x11u)

+#define EXTI_LINE_18                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x12u)

+#define EXTI_LINE_19                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x13u)

+#define EXTI_LINE_20                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x14u)

+#define EXTI_LINE_21                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x15u)

+#define EXTI_LINE_22                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x16u)

+#define EXTI_LINE_23                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x17u)

+#define EXTI_LINE_24                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x18u)

+#define EXTI_LINE_25                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x19u)

+#define EXTI_LINE_26                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Au)

+#define EXTI_LINE_27                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Bu)

+#define EXTI_LINE_28                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Cu)

+#define EXTI_LINE_29                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Du)

+#define EXTI_LINE_30                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Eu)

+#define EXTI_LINE_31                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Fu)

+#define EXTI_LINE_32                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_33                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_34                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x02u)

+#define EXTI_LINE_35                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x03u)

+#define EXTI_LINE_36                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x04u)

+#define EXTI_LINE_37                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_38                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_39                        (EXTI_RESERVED | EXTI_REG2              | 0x07u)

+#define EXTI_LINE_40                        (EXTI_RESERVED | EXTI_REG2              | 0x08u)

+

+#endif /* STM32L475xx || STM32L485xx  */

+

+#if defined(STM32L476xx) || defined(STM32L486xx)

+

+#define EXTI_LINE_0                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_1                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_2                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x02u)

+#define EXTI_LINE_3                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x03u)

+#define EXTI_LINE_4                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x04u)

+#define EXTI_LINE_5                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_6                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_7                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x07u)

+#define EXTI_LINE_8                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x08u)

+#define EXTI_LINE_9                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x09u)

+#define EXTI_LINE_10                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Au)

+#define EXTI_LINE_11                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Bu)

+#define EXTI_LINE_12                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Cu)

+#define EXTI_LINE_13                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Du)

+#define EXTI_LINE_14                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Eu)

+#define EXTI_LINE_15                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Fu)

+#define EXTI_LINE_16                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x10u)

+#define EXTI_LINE_17                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x11u)

+#define EXTI_LINE_18                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x12u)

+#define EXTI_LINE_19                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x13u)

+#define EXTI_LINE_20                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x14u)

+#define EXTI_LINE_21                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x15u)

+#define EXTI_LINE_22                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x16u)

+#define EXTI_LINE_23                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x17u)

+#define EXTI_LINE_24                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x18u)

+#define EXTI_LINE_25                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x19u)

+#define EXTI_LINE_26                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Au)

+#define EXTI_LINE_27                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Bu)

+#define EXTI_LINE_28                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Cu)

+#define EXTI_LINE_29                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Du)

+#define EXTI_LINE_30                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Eu)

+#define EXTI_LINE_31                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Fu)

+#define EXTI_LINE_32                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_33                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_34                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x02u)

+#define EXTI_LINE_35                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x03u)

+#define EXTI_LINE_36                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x04u)

+#define EXTI_LINE_37                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_38                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_39                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x07u)

+#define EXTI_LINE_40                        (EXTI_RESERVED | EXTI_REG2              | 0x08u)

+

+#endif /*  STM32L476xx || STM32L486xx */

+

+#if defined(STM32L496xx) || defined(STM32L4A6xx)

+

+#define EXTI_LINE_0                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_1                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_2                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x02u)

+#define EXTI_LINE_3                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x03u)

+#define EXTI_LINE_4                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x04u)

+#define EXTI_LINE_5                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_6                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_7                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x07u)

+#define EXTI_LINE_8                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x08u)

+#define EXTI_LINE_9                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x09u)

+#define EXTI_LINE_10                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Au)

+#define EXTI_LINE_11                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Bu)

+#define EXTI_LINE_12                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Cu)

+#define EXTI_LINE_13                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Du)

+#define EXTI_LINE_14                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Eu)

+#define EXTI_LINE_15                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Fu)

+#define EXTI_LINE_16                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x10u)

+#define EXTI_LINE_17                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x11u)

+#define EXTI_LINE_18                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x12u)

+#define EXTI_LINE_19                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x13u)

+#define EXTI_LINE_20                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x14u)

+#define EXTI_LINE_21                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x15u)

+#define EXTI_LINE_22                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x16u)

+#define EXTI_LINE_23                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x17u)

+#define EXTI_LINE_24                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x18u)

+#define EXTI_LINE_25                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x19u)

+#define EXTI_LINE_26                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Au)

+#define EXTI_LINE_27                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Bu)

+#define EXTI_LINE_28                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Cu)

+#define EXTI_LINE_29                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Du)

+#define EXTI_LINE_30                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Eu)

+#define EXTI_LINE_31                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Fu)

+#define EXTI_LINE_32                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_33                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_34                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x02u)

+#define EXTI_LINE_35                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x03u)

+#define EXTI_LINE_36                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x04u)

+#define EXTI_LINE_37                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_38                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_39                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x07u)

+#define EXTI_LINE_40                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x08u)

+

+#endif /*  STM32L496xx || STM32L4A6xx */

+

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+

+#define EXTI_LINE_0                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_1                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_2                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x02u)

+#define EXTI_LINE_3                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x03u)

+#define EXTI_LINE_4                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x04u)

+#define EXTI_LINE_5                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_6                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_7                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x07u)

+#define EXTI_LINE_8                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x08u)

+#define EXTI_LINE_9                         (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x09u)

+#define EXTI_LINE_10                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Au)

+#define EXTI_LINE_11                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Bu)

+#define EXTI_LINE_12                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Cu)

+#define EXTI_LINE_13                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Du)

+#define EXTI_LINE_14                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Eu)

+#define EXTI_LINE_15                        (EXTI_GPIO     | EXTI_REG1 | EXTI_EVENT | 0x0Fu)

+#define EXTI_LINE_16                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x10u)

+#define EXTI_LINE_17                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x11u)

+#define EXTI_LINE_18                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x12u)

+#define EXTI_LINE_19                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x13u)

+#define EXTI_LINE_20                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x14u)

+#define EXTI_LINE_21                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x15u)

+#define EXTI_LINE_22                        (EXTI_CONFIG   | EXTI_REG1 | EXTI_EVENT | 0x16u)

+#define EXTI_LINE_23                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x17u)

+#define EXTI_LINE_24                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x18u)

+#define EXTI_LINE_25                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x19u)

+#define EXTI_LINE_26                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Au)

+#define EXTI_LINE_27                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Bu)

+#define EXTI_LINE_28                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Cu)

+#define EXTI_LINE_29                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Du)

+#define EXTI_LINE_30                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Eu)

+#define EXTI_LINE_31                        (EXTI_DIRECT   | EXTI_REG1 | EXTI_EVENT | 0x1Fu)

+#define EXTI_LINE_32                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x00u)

+#define EXTI_LINE_33                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x01u)

+#define EXTI_LINE_34                        (EXTI_RESERVED | EXTI_REG2              | 0x02u)

+#define EXTI_LINE_35                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x03u)

+#define EXTI_LINE_36                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x04u)

+#define EXTI_LINE_37                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x05u)

+#define EXTI_LINE_38                        (EXTI_CONFIG   | EXTI_REG2 | EXTI_EVENT | 0x06u)

+#define EXTI_LINE_39                        (EXTI_RESERVED | EXTI_REG2              | 0x07u)

+#define EXTI_LINE_40                        (EXTI_DIRECT   | EXTI_REG2 | EXTI_EVENT | 0x08u)

+

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+/**

+  * @}

+  */

+

+/** @defgroup EXTI_Mode  EXTI Mode

+  * @{

+  */

+#define EXTI_MODE_NONE                      0x00000000u

+#define EXTI_MODE_INTERRUPT                 0x00000001u

+#define EXTI_MODE_EVENT                     0x00000002u

+/**

+  * @}

+  */

+

+/** @defgroup EXTI_Trigger  EXTI Trigger

+  * @{

+  */

+#define EXTI_TRIGGER_NONE                   0x00000000u

+#define EXTI_TRIGGER_RISING                 0x00000001u

+#define EXTI_TRIGGER_FALLING                0x00000002u

+#define EXTI_TRIGGER_RISING_FALLING         (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING)

+/**

+  * @}

+  */

+

+/** @defgroup EXTI_GPIOSel  EXTI GPIOSel

+  * @brief

+  * @{

+  */

+#define EXTI_GPIOA                          0x00000000u

+#define EXTI_GPIOB                          0x00000001u

+#define EXTI_GPIOC                          0x00000002u

+#define EXTI_GPIOD                          0x00000003u

+#define EXTI_GPIOE                          0x00000004u

+#define EXTI_GPIOF                          0x00000005u

+#define EXTI_GPIOG                          0x00000005u

+#define EXTI_GPIOH                          0x00000007u

+#define EXTI_GPIOI                          0x00000008u

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Exported macro ------------------------------------------------------------*/

+/** @defgroup EXTI_Exported_Macros EXTI Exported Macros

+  * @{

+  */

+

+/**

+  * @}

+  */

+

+/* Private constants --------------------------------------------------------*/

+/** @defgroup EXTI_Private_Constants EXTI Private Constants

+  * @{

+  */

+/**

+  * @brief  EXTI Line property definition

+  */

+#define EXTI_PROPERTY_SHIFT                  24u

+#define EXTI_DIRECT                         (0x01uL << EXTI_PROPERTY_SHIFT)

+#define EXTI_CONFIG                         (0x02uL << EXTI_PROPERTY_SHIFT)

+#define EXTI_GPIO                           ((0x04uL << EXTI_PROPERTY_SHIFT) | EXTI_CONFIG)

+#define EXTI_RESERVED                       (0x08uL << EXTI_PROPERTY_SHIFT)

+#define EXTI_PROPERTY_MASK                  (EXTI_DIRECT | EXTI_CONFIG | EXTI_GPIO)

+

+/**

+  * @brief  EXTI Event presence definition

+  */

+#define EXTI_EVENT_PRESENCE_SHIFT           28u

+#define EXTI_EVENT                          (0x01uL << EXTI_EVENT_PRESENCE_SHIFT)

+#define EXTI_EVENT_PRESENCE_MASK            (EXTI_EVENT)

+

+/**

+  * @brief  EXTI Register and bit usage

+  */

+#define EXTI_REG_SHIFT                      16u

+#define EXTI_REG1                           (0x00uL << EXTI_REG_SHIFT)

+#define EXTI_REG2                           (0x01uL << EXTI_REG_SHIFT)

+#define EXTI_REG_MASK                       (EXTI_REG1 | EXTI_REG2)

+#define EXTI_PIN_MASK                       0x0000001Fu

+

+/**

+  * @brief  EXTI Mask for interrupt & event mode

+  */

+#define EXTI_MODE_MASK                      (EXTI_MODE_EVENT | EXTI_MODE_INTERRUPT)

+

+/**

+  * @brief  EXTI Mask for trigger possibilities

+  */

+#define EXTI_TRIGGER_MASK                   (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING)

+

+/**

+  * @brief  EXTI Line number

+  */

+#define EXTI_LINE_NB                        41u

+

+/**

+  * @}

+  */

+

+/* Private macros ------------------------------------------------------------*/

+/** @defgroup EXTI_Private_Macros EXTI Private Macros

+  * @{

+  */

+#define IS_EXTI_LINE(__LINE__)          ((((__LINE__) & ~(EXTI_PROPERTY_MASK | EXTI_EVENT_PRESENCE_MASK | EXTI_REG_MASK | EXTI_PIN_MASK)) == 0x00u) && \

+                                        ((((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_DIRECT)   || \

+                                         (((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_CONFIG)   || \

+                                         (((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_GPIO))    && \

+                                         (((__LINE__) & (EXTI_REG_MASK | EXTI_PIN_MASK))      < \

+                                         (((EXTI_LINE_NB / 32u) << EXTI_REG_SHIFT) | (EXTI_LINE_NB % 32u))))

+

+#define IS_EXTI_MODE(__LINE__)          ((((__LINE__) & EXTI_MODE_MASK) != 0x00u) && \

+                                         (((__LINE__) & ~EXTI_MODE_MASK) == 0x00u))

+

+#define IS_EXTI_TRIGGER(__LINE__)       (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00u)

+

+#define IS_EXTI_PENDING_EDGE(__LINE__)  ((__LINE__) == EXTI_TRIGGER_RISING_FALLING)

+

+#define IS_EXTI_CONFIG_LINE(__LINE__)   (((__LINE__) & EXTI_CONFIG) != 0x00u)

+

+#if defined(STM32L412xx) || defined(STM32L422xx)

+

+#define IS_EXTI_GPIO_PORT(__PORT__)     (((__PORT__) == EXTI_GPIOA) || \

+                                         ((__PORT__) == EXTI_GPIOB) || \

+                                         ((__PORT__) == EXTI_GPIOC) || \

+                                         ((__PORT__) == EXTI_GPIOD) || \

+                                         ((__PORT__) == EXTI_GPIOH))

+

+#endif /* STM32L412xx || STM32L422xx */

+

+#if defined(STM32L431xx) || defined(STM32L433xx) || defined(STM32L443xx)

+

+#define IS_EXTI_GPIO_PORT(__PORT__)     (((__PORT__) == EXTI_GPIOA) || \

+                                         ((__PORT__) == EXTI_GPIOB) || \

+                                         ((__PORT__) == EXTI_GPIOC) || \

+                                         ((__PORT__) == EXTI_GPIOD) || \

+                                         ((__PORT__) == EXTI_GPIOE) || \

+                                         ((__PORT__) == EXTI_GPIOH))

+

+#endif /* STM32L431xx || STM32L433xx || STM32L443xx */

+

+#if defined(STM32L432xx) || defined(STM32L442xx)

+

+#define IS_EXTI_GPIO_PORT(__PORT__)     (((__PORT__) == EXTI_GPIOA) || \

+                                         ((__PORT__) == EXTI_GPIOB) || \

+                                         ((__PORT__) == EXTI_GPIOC) || \

+                                         ((__PORT__) == EXTI_GPIOH))

+

+#endif /* STM32L432xx || STM32L442xx */

+

+#if defined(STM32L451xx) || defined(STM32L452xx) || defined(STM32L462xx)

+

+#define IS_EXTI_GPIO_PORT(__PORT__)     (((__PORT__) == EXTI_GPIOA) || \

+                                         ((__PORT__) == EXTI_GPIOB) || \

+                                         ((__PORT__) == EXTI_GPIOC) || \

+                                         ((__PORT__) == EXTI_GPIOD) || \

+                                         ((__PORT__) == EXTI_GPIOE) || \

+                                         ((__PORT__) == EXTI_GPIOH))

+

+#endif /* STM32L451xx || STM32L452xx || STM32L462xx */

+

+#if defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx)

+

+#define IS_EXTI_GPIO_PORT(__PORT__)     (((__PORT__) == EXTI_GPIOA) || \

+                                         ((__PORT__) == EXTI_GPIOB) || \

+                                         ((__PORT__) == EXTI_GPIOC) || \

+                                         ((__PORT__) == EXTI_GPIOD) || \

+                                         ((__PORT__) == EXTI_GPIOE) || \

+                                         ((__PORT__) == EXTI_GPIOF) || \

+                                         ((__PORT__) == EXTI_GPIOG) || \

+                                         ((__PORT__) == EXTI_GPIOH))

+

+#endif /* STM32L471xx || STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx */

+

+#if defined(STM32L496xx) || defined(STM32L4A6xx)

+

+#define IS_EXTI_GPIO_PORT(__PORT__)     (((__PORT__) == EXTI_GPIOA) || \

+                                         ((__PORT__) == EXTI_GPIOB) || \

+                                         ((__PORT__) == EXTI_GPIOC) || \

+                                         ((__PORT__) == EXTI_GPIOD) || \

+                                         ((__PORT__) == EXTI_GPIOE) || \

+                                         ((__PORT__) == EXTI_GPIOF) || \

+                                         ((__PORT__) == EXTI_GPIOG) || \

+                                         ((__PORT__) == EXTI_GPIOH) || \

+                                         ((__PORT__) == EXTI_GPIOI))

+

+#endif /* STM32L496xx || STM32L4A6xx */

+

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+

+#define IS_EXTI_GPIO_PORT(__PORT__)     (((__PORT__) == EXTI_GPIOA) || \

+                                         ((__PORT__) == EXTI_GPIOB) || \

+                                         ((__PORT__) == EXTI_GPIOC) || \

+                                         ((__PORT__) == EXTI_GPIOD) || \

+                                         ((__PORT__) == EXTI_GPIOE) || \

+                                         ((__PORT__) == EXTI_GPIOF) || \

+                                         ((__PORT__) == EXTI_GPIOG) || \

+                                         ((__PORT__) == EXTI_GPIOH) || \

+                                         ((__PORT__) == EXTI_GPIOI))

+

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+#define IS_EXTI_GPIO_PIN(__PIN__)       ((__PIN__) < 16u)

+/**

+  * @}

+  */

+

+

+/* Exported functions --------------------------------------------------------*/

+/** @defgroup EXTI_Exported_Functions EXTI Exported Functions

+  * @brief    EXTI Exported Functions

+  * @{

+  */

+

+/** @defgroup EXTI_Exported_Functions_Group1 Configuration functions

+  * @brief    Configuration functions

+  * @{

+  */

+/* Configuration functions ****************************************************/

+HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig);

+HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig);

+HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti);

+HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void));

+HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine);

+/**

+  * @}

+  */

+

+/** @defgroup EXTI_Exported_Functions_Group2 IO operation functions

+  * @brief    IO operation functions

+  * @{

+  */

+/* IO operation functions *****************************************************/

+void              HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti);

+uint32_t          HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge);

+void              HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge);

+void              HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti);

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* STM32L4xx_HAL_EXTI_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h
new file mode 100644
index 0000000..afe5626
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h
@@ -0,0 +1,1041 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_flash.h

+  * @author  MCD Application Team

+  * @brief   Header file of FLASH HAL module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                       opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef __STM32L4xx_HAL_FLASH_H

+#define __STM32L4xx_HAL_FLASH_H

+

+#ifdef __cplusplus

+ extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup FLASH

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+/** @defgroup FLASH_Exported_Types FLASH Exported Types

+  * @{

+  */

+

+/**

+  * @brief  FLASH Erase structure definition

+  */

+typedef struct

+{

+  uint32_t TypeErase;   /*!< Mass erase or page erase.

+                             This parameter can be a value of @ref FLASH_Type_Erase */

+  uint32_t Banks;       /*!< Select bank to erase.

+                             This parameter must be a value of @ref FLASH_Banks

+                             (FLASH_BANK_BOTH should be used only for mass erase) */

+  uint32_t Page;        /*!< Initial Flash page to erase when page erase is disabled

+                             This parameter must be a value between 0 and (max number of pages in the bank - 1)

+                             (eg : 255 for 1MB dual bank) */

+  uint32_t NbPages;     /*!< Number of pages to be erased.

+                             This parameter must be a value between 1 and (max number of pages in the bank - value of initial page)*/

+} FLASH_EraseInitTypeDef;

+

+/**

+  * @brief  FLASH Option Bytes Program structure definition

+  */

+typedef struct

+{

+  uint32_t OptionType;     /*!< Option byte to be configured.

+                                This parameter can be a combination of the values of @ref FLASH_OB_Type */

+  uint32_t WRPArea;        /*!< Write protection area to be programmed (used for OPTIONBYTE_WRP).

+                                Only one WRP area could be programmed at the same time.

+                                This parameter can be value of @ref FLASH_OB_WRP_Area */

+  uint32_t WRPStartOffset; /*!< Write protection start offset (used for OPTIONBYTE_WRP).

+                                This parameter must be a value between 0 and (max number of pages in the bank - 1)

+                                (eg : 25 for 1MB dual bank) */

+  uint32_t WRPEndOffset;   /*!< Write protection end offset (used for OPTIONBYTE_WRP).

+                                This parameter must be a value between WRPStartOffset and (max number of pages in the bank - 1) */

+  uint32_t RDPLevel;       /*!< Set the read protection level.. (used for OPTIONBYTE_RDP).

+                                This parameter can be a value of @ref FLASH_OB_Read_Protection */

+  uint32_t USERType;       /*!< User option byte(s) to be configured (used for OPTIONBYTE_USER).

+                                This parameter can be a combination of @ref FLASH_OB_USER_Type */

+  uint32_t USERConfig;     /*!< Value of the user option byte (used for OPTIONBYTE_USER).

+                                This parameter can be a combination of @ref FLASH_OB_USER_BOR_LEVEL,

+                                @ref FLASH_OB_USER_nRST_STOP, @ref FLASH_OB_USER_nRST_STANDBY,

+                                @ref FLASH_OB_USER_nRST_SHUTDOWN, @ref FLASH_OB_USER_IWDG_SW,

+                                @ref FLASH_OB_USER_IWDG_STOP, @ref FLASH_OB_USER_IWDG_STANDBY,

+                                @ref FLASH_OB_USER_WWDG_SW, @ref FLASH_OB_USER_BFB2,

+                                @ref FLASH_OB_USER_DUALBANK, @ref FLASH_OB_USER_nBOOT1,

+                                @ref FLASH_OB_USER_SRAM2_PE and @ref FLASH_OB_USER_SRAM2_RST */

+  uint32_t PCROPConfig;    /*!< Configuration of the PCROP (used for OPTIONBYTE_PCROP).

+                                This parameter must be a combination of @ref FLASH_Banks (except FLASH_BANK_BOTH)

+                                and @ref FLASH_OB_PCROP_RDP */

+  uint32_t PCROPStartAddr; /*!< PCROP Start address (used for OPTIONBYTE_PCROP).

+                                This parameter must be a value between begin and end of bank

+                                => Be careful of the bank swapping for the address */

+  uint32_t PCROPEndAddr;   /*!< PCROP End address (used for OPTIONBYTE_PCROP).

+                                This parameter must be a value between PCROP Start address and end of bank */

+} FLASH_OBProgramInitTypeDef;

+

+/**

+  * @brief  FLASH Procedure structure definition

+  */

+typedef enum

+{

+  FLASH_PROC_NONE = 0,

+  FLASH_PROC_PAGE_ERASE,

+  FLASH_PROC_MASS_ERASE,

+  FLASH_PROC_PROGRAM,

+  FLASH_PROC_PROGRAM_LAST

+} FLASH_ProcedureTypeDef;

+

+/**

+  * @brief  FLASH Cache structure definition

+  */

+typedef enum

+{

+  FLASH_CACHE_DISABLED = 0,

+  FLASH_CACHE_ICACHE_ENABLED,

+  FLASH_CACHE_DCACHE_ENABLED,

+  FLASH_CACHE_ICACHE_DCACHE_ENABLED

+} FLASH_CacheTypeDef;

+

+/**

+  * @brief  FLASH handle Structure definition

+  */

+typedef struct

+{

+  HAL_LockTypeDef             Lock;              /* FLASH locking object */

+  __IO uint32_t               ErrorCode;         /* FLASH error code */

+  __IO FLASH_ProcedureTypeDef ProcedureOnGoing;  /* Internal variable to indicate which procedure is ongoing or not in IT context */

+  __IO uint32_t               Address;           /* Internal variable to save address selected for program in IT context */

+  __IO uint32_t               Bank;              /* Internal variable to save current bank selected during erase in IT context */

+  __IO uint32_t               Page;              /* Internal variable to define the current page which is erasing in IT context */

+  __IO uint32_t               NbPagesToErase;    /* Internal variable to save the remaining pages to erase in IT context */

+  __IO FLASH_CacheTypeDef     CacheToReactivate; /* Internal variable to indicate which caches should be reactivated */

+}FLASH_ProcessTypeDef;

+

+/**

+  * @}

+  */

+

+/* Exported constants --------------------------------------------------------*/

+/** @defgroup FLASH_Exported_Constants FLASH Exported Constants

+  * @{

+  */

+

+/** @defgroup FLASH_Error FLASH Error

+  * @{

+  */

+#define HAL_FLASH_ERROR_NONE      0x00000000U

+#define HAL_FLASH_ERROR_OP        FLASH_FLAG_OPERR

+#define HAL_FLASH_ERROR_PROG      FLASH_FLAG_PROGERR

+#define HAL_FLASH_ERROR_WRP       FLASH_FLAG_WRPERR

+#define HAL_FLASH_ERROR_PGA       FLASH_FLAG_PGAERR

+#define HAL_FLASH_ERROR_SIZ       FLASH_FLAG_SIZERR

+#define HAL_FLASH_ERROR_PGS       FLASH_FLAG_PGSERR

+#define HAL_FLASH_ERROR_MIS       FLASH_FLAG_MISERR

+#define HAL_FLASH_ERROR_FAST      FLASH_FLAG_FASTERR

+#define HAL_FLASH_ERROR_RD        FLASH_FLAG_RDERR

+#define HAL_FLASH_ERROR_OPTV      FLASH_FLAG_OPTVERR

+#define HAL_FLASH_ERROR_ECCD      FLASH_FLAG_ECCD

+#if defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L431xx) || defined (STM32L432xx) || defined (STM32L433xx) || defined (STM32L442xx) || \

+    defined (STM32L443xx) || defined (STM32L451xx) || defined (STM32L452xx) || defined (STM32L462xx) || defined (STM32L496xx) || defined (STM32L4A6xx) || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || \

+    defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define HAL_FLASH_ERROR_PEMPTY    FLASH_FLAG_PEMPTY

+#endif

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_Type_Erase FLASH Erase Type

+  * @{

+  */

+#define FLASH_TYPEERASE_PAGES     ((uint32_t)0x00)  /*!<Pages erase only*/

+#define FLASH_TYPEERASE_MASSERASE ((uint32_t)0x01)  /*!<Flash mass erase activation*/

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_Banks FLASH Banks

+  * @{

+  */

+#define FLASH_BANK_1              ((uint32_t)0x01)                          /*!< Bank 1   */

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || defined (STM32L4R5xx) || \

+    defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define FLASH_BANK_2              ((uint32_t)0x02)                          /*!< Bank 2   */

+#define FLASH_BANK_BOTH           ((uint32_t)(FLASH_BANK_1 | FLASH_BANK_2)) /*!< Bank1 and Bank2  */

+#else

+#define FLASH_BANK_BOTH           ((uint32_t)(FLASH_BANK_1))                /*!< Bank 1   */

+#endif

+/**

+  * @}

+  */

+

+

+/** @defgroup FLASH_Type_Program FLASH Program Type

+  * @{

+  */

+#define FLASH_TYPEPROGRAM_DOUBLEWORD    ((uint32_t)0x00)  /*!<Program a double-word (64-bit) at a specified address.*/

+#define FLASH_TYPEPROGRAM_FAST          ((uint32_t)0x01)  /*!<Fast program a 32 row double-word (64-bit) at a specified address.

+                                                                 And another 32 row double-word (64-bit) will be programmed */

+#define FLASH_TYPEPROGRAM_FAST_AND_LAST ((uint32_t)0x02)  /*!<Fast program a 32 row double-word (64-bit) at a specified address.

+                                                                 And this is the last 32 row double-word (64-bit) programmed */

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_OB_Type FLASH Option Bytes Type

+  * @{

+  */

+#define OPTIONBYTE_WRP            ((uint32_t)0x01)  /*!< WRP option byte configuration */

+#define OPTIONBYTE_RDP            ((uint32_t)0x02)  /*!< RDP option byte configuration */

+#define OPTIONBYTE_USER           ((uint32_t)0x04)  /*!< USER option byte configuration */

+#define OPTIONBYTE_PCROP          ((uint32_t)0x08)  /*!< PCROP option byte configuration */

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_OB_WRP_Area FLASH WRP Area

+  * @{

+  */

+#define OB_WRPAREA_BANK1_AREAA    ((uint32_t)0x00)  /*!< Flash Bank 1 Area A */

+#define OB_WRPAREA_BANK1_AREAB    ((uint32_t)0x01)  /*!< Flash Bank 1 Area B */

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || defined (STM32L4R5xx) || \

+    defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define OB_WRPAREA_BANK2_AREAA    ((uint32_t)0x02)  /*!< Flash Bank 2 Area A */

+#define OB_WRPAREA_BANK2_AREAB    ((uint32_t)0x04)  /*!< Flash Bank 2 Area B */

+#endif

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_OB_Read_Protection FLASH Option Bytes Read Protection

+  * @{

+  */

+#define OB_RDP_LEVEL_0            ((uint32_t)0xAA)

+#define OB_RDP_LEVEL_1            ((uint32_t)0xBB)

+#define OB_RDP_LEVEL_2            ((uint32_t)0xCC) /*!< Warning: When enabling read protection level 2

+                                                        it's no more possible to go back to level 1 or 0 */

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_OB_USER_Type FLASH Option Bytes User Type

+  * @{

+  */

+#define OB_USER_BOR_LEV           ((uint32_t)0x0001)                   /*!< BOR reset Level */

+#define OB_USER_nRST_STOP         ((uint32_t)0x0002)                   /*!< Reset generated when entering the stop mode */

+#define OB_USER_nRST_STDBY        ((uint32_t)0x0004)                   /*!< Reset generated when entering the standby mode */

+#define OB_USER_IWDG_SW           ((uint32_t)0x0008)                   /*!< Independent watchdog selection */

+#define OB_USER_IWDG_STOP         ((uint32_t)0x0010)                   /*!< Independent watchdog counter freeze in stop mode */

+#define OB_USER_IWDG_STDBY        ((uint32_t)0x0020)                   /*!< Independent watchdog counter freeze in standby mode */

+#define OB_USER_WWDG_SW           ((uint32_t)0x0040)                   /*!< Window watchdog selection */

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || defined (STM32L4R5xx) || \

+    defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define OB_USER_BFB2              ((uint32_t)0x0080)                   /*!< Dual-bank boot */

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define OB_USER_DUALBANK          ((uint32_t)0x0100)                   /*!< Dual-Bank on 1MB or 512kB Flash memory devices */

+#else

+#define OB_USER_DUALBANK          ((uint32_t)0x0100)                   /*!< Dual-Bank on 512KB or 256KB Flash memory devices */

+#endif

+#endif

+#define OB_USER_nBOOT1            ((uint32_t)0x0200)                   /*!< Boot configuration */

+#define OB_USER_SRAM2_PE          ((uint32_t)0x0400)                   /*!< SRAM2 parity check enable */

+#define OB_USER_SRAM2_RST         ((uint32_t)0x0800)                   /*!< SRAM2 Erase when system reset */

+#define OB_USER_nRST_SHDW         ((uint32_t)0x1000)                   /*!< Reset generated when entering the shutdown mode */

+#if defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L431xx) || defined (STM32L432xx) || defined (STM32L433xx) || \

+    defined (STM32L442xx) || defined (STM32L443xx) || defined (STM32L451xx) || defined (STM32L452xx) || defined (STM32L462xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || defined (STM32L4R5xx) || \

+    defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define OB_USER_nSWBOOT0          ((uint32_t)0x2000)                   /*!< Software BOOT0 */

+#define OB_USER_nBOOT0            ((uint32_t)0x4000)                   /*!< nBOOT0 option bit */

+#endif

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define OB_USER_DBANK             ((uint32_t)0x8000)                   /*!< Single bank with 128-bits data or two banks with 64-bits data */

+#endif

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_OB_USER_BOR_LEVEL FLASH Option Bytes User BOR Level

+  * @{

+  */

+#define OB_BOR_LEVEL_0            ((uint32_t)FLASH_OPTR_BOR_LEV_0)     /*!< Reset level threshold is around 1.7V */

+#define OB_BOR_LEVEL_1            ((uint32_t)FLASH_OPTR_BOR_LEV_1)     /*!< Reset level threshold is around 2.0V */

+#define OB_BOR_LEVEL_2            ((uint32_t)FLASH_OPTR_BOR_LEV_2)     /*!< Reset level threshold is around 2.2V */

+#define OB_BOR_LEVEL_3            ((uint32_t)FLASH_OPTR_BOR_LEV_3)     /*!< Reset level threshold is around 2.5V */

+#define OB_BOR_LEVEL_4            ((uint32_t)FLASH_OPTR_BOR_LEV_4)     /*!< Reset level threshold is around 2.8V */

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_OB_USER_nRST_STOP FLASH Option Bytes User Reset On Stop

+  * @{

+  */

+#define OB_STOP_RST               ((uint32_t)0x0000)                   /*!< Reset generated when entering the stop mode */

+#define OB_STOP_NORST             ((uint32_t)FLASH_OPTR_nRST_STOP)     /*!< No reset generated when entering the stop mode */

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_OB_USER_nRST_STANDBY FLASH Option Bytes User Reset On Standby

+  * @{

+  */

+#define OB_STANDBY_RST            ((uint32_t)0x0000)                   /*!< Reset generated when entering the standby mode */

+#define OB_STANDBY_NORST          ((uint32_t)FLASH_OPTR_nRST_STDBY)    /*!< No reset generated when entering the standby mode */

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_OB_USER_nRST_SHUTDOWN FLASH Option Bytes User Reset On Shutdown

+  * @{

+  */

+#define OB_SHUTDOWN_RST           ((uint32_t)0x0000)                   /*!< Reset generated when entering the shutdown mode */

+#define OB_SHUTDOWN_NORST         ((uint32_t)FLASH_OPTR_nRST_SHDW)     /*!< No reset generated when entering the shutdown mode */

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_OB_USER_IWDG_SW FLASH Option Bytes User IWDG Type

+  * @{

+  */

+#define OB_IWDG_HW                ((uint32_t)0x00000)                  /*!< Hardware independent watchdog */

+#define OB_IWDG_SW                ((uint32_t)FLASH_OPTR_IWDG_SW)       /*!< Software independent watchdog */

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_OB_USER_IWDG_STOP FLASH Option Bytes User IWDG Mode On Stop

+  * @{

+  */

+#define OB_IWDG_STOP_FREEZE       ((uint32_t)0x00000)                  /*!< Independent watchdog counter is frozen in Stop mode */

+#define OB_IWDG_STOP_RUN          ((uint32_t)FLASH_OPTR_IWDG_STOP)     /*!< Independent watchdog counter is running in Stop mode */

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_OB_USER_IWDG_STANDBY FLASH Option Bytes User IWDG Mode On Standby

+  * @{

+  */

+#define OB_IWDG_STDBY_FREEZE      ((uint32_t)0x00000)                  /*!< Independent watchdog counter is frozen in Standby mode */

+#define OB_IWDG_STDBY_RUN         ((uint32_t)FLASH_OPTR_IWDG_STDBY)    /*!< Independent watchdog counter is running in Standby mode */

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_OB_USER_WWDG_SW FLASH Option Bytes User WWDG Type

+  * @{

+  */

+#define OB_WWDG_HW                ((uint32_t)0x00000)                  /*!< Hardware window watchdog */

+#define OB_WWDG_SW                ((uint32_t)FLASH_OPTR_WWDG_SW)       /*!< Software window watchdog */

+/**

+  * @}

+  */

+

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || defined (STM32L4R5xx) || \

+    defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+/** @defgroup FLASH_OB_USER_BFB2 FLASH Option Bytes User BFB2 Mode

+  * @{

+  */

+#define OB_BFB2_DISABLE           ((uint32_t)0x000000)                 /*!< Dual-bank boot disable */

+#define OB_BFB2_ENABLE            ((uint32_t)FLASH_OPTR_BFB2)          /*!< Dual-bank boot enable */

+/**

+  * @}

+  */

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+/** @defgroup FLASH_OB_USER_DUALBANK FLASH Option Bytes User Dual-bank Type

+  * @{

+  */

+#define OB_DUALBANK_SINGLE        ((uint32_t)0x000000)                 /*!< 1 MB/512 kB Single-bank Flash */

+#define OB_DUALBANK_DUAL          ((uint32_t)FLASH_OPTR_DB1M)          /*!< 1 MB/512 kB Dual-bank Flash */

+/**

+  * @}

+  */

+#else

+/** @defgroup FLASH_OB_USER_DUALBANK FLASH Option Bytes User Dual-bank Type

+  * @{

+  */

+#define OB_DUALBANK_SINGLE        ((uint32_t)0x000000)                 /*!< 256 KB/512 KB Single-bank Flash */

+#define OB_DUALBANK_DUAL          ((uint32_t)FLASH_OPTR_DUALBANK)      /*!< 256 KB/512 KB Dual-bank Flash */

+/**

+  * @}

+  */

+#endif

+#endif

+

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+/** @defgroup FLASH_OB_USER_DBANK FLASH Option Bytes User DBANK Type

+  * @{

+  */

+#define OB_DBANK_128_BITS         ((uint32_t)0x000000)                 /*!< Single-bank with 128-bits data */

+#define OB_DBANK_64_BITS          ((uint32_t)FLASH_OPTR_DBANK)         /*!< Dual-bank with 64-bits data */

+#endif

+/**

+  * @}

+  */

+/** @defgroup FLASH_OB_USER_nBOOT1 FLASH Option Bytes User BOOT1 Type

+  * @{

+  */

+#define OB_BOOT1_SRAM             ((uint32_t)0x000000)                 /*!< Embedded SRAM1 is selected as boot space (if BOOT0=1) */

+#define OB_BOOT1_SYSTEM           ((uint32_t)FLASH_OPTR_nBOOT1)        /*!< System memory is selected as boot space (if BOOT0=1) */

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_OB_USER_SRAM2_PE FLASH Option Bytes User SRAM2 Parity Check Type

+  * @{

+  */

+#define OB_SRAM2_PARITY_ENABLE    ((uint32_t)0x0000000)                /*!< SRAM2 parity check enable */

+#define OB_SRAM2_PARITY_DISABLE   ((uint32_t)FLASH_OPTR_SRAM2_PE)      /*!< SRAM2 parity check disable */

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_OB_USER_SRAM2_RST FLASH Option Bytes User SRAM2 Erase On Reset Type

+  * @{

+  */

+#define OB_SRAM2_RST_ERASE        ((uint32_t)0x0000000)                /*!< SRAM2 erased when a system reset occurs */

+#define OB_SRAM2_RST_NOT_ERASE    ((uint32_t)FLASH_OPTR_SRAM2_RST)     /*!< SRAM2 is not erased when a system reset occurs */

+/**

+  * @}

+  */

+

+#if defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L431xx) || defined (STM32L432xx) || defined (STM32L433xx) || \

+    defined (STM32L442xx) || defined (STM32L443xx) || defined (STM32L451xx) || defined (STM32L452xx) || defined (STM32L462xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || defined (STM32L4R5xx) || \

+    defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+/** @defgroup OB_USER_nSWBOOT0 FLASH Option Bytes User Software BOOT0

+  * @{

+  */

+#define OB_BOOT0_FROM_OB          ((uint32_t)0x0000000)                /*!< BOOT0 taken from the option bit nBOOT0 */

+#define OB_BOOT0_FROM_PIN         ((uint32_t)FLASH_OPTR_nSWBOOT0)      /*!< BOOT0 taken from PH3/BOOT0 pin */

+/**

+  * @}

+  */

+

+/** @defgroup OB_USER_nBOOT0 FLASH Option Bytes User nBOOT0 option bit

+  * @{

+  */

+#define OB_BOOT0_RESET            ((uint32_t)0x0000000)                /*!< nBOOT0 = 0 */

+#define OB_BOOT0_SET              ((uint32_t)FLASH_OPTR_nBOOT0)        /*!< nBOOT0 = 1 */

+/**

+  * @}

+  */

+#endif

+

+/** @defgroup FLASH_OB_PCROP_RDP FLASH Option Bytes PCROP On RDP Level Type

+  * @{

+  */

+#define OB_PCROP_RDP_NOT_ERASE    ((uint32_t)0x00000000)               /*!< PCROP area is not erased when the RDP level

+                                                                            is decreased from Level 1 to Level 0 */

+#define OB_PCROP_RDP_ERASE        ((uint32_t)FLASH_PCROP1ER_PCROP_RDP) /*!< PCROP area is erased when the RDP level is

+                                                                            decreased from Level 1 to Level 0 (full mass erase) */

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_Latency FLASH Latency

+  * @{

+  */

+#define FLASH_LATENCY_0           FLASH_ACR_LATENCY_0WS                /*!< FLASH Zero wait state */

+#define FLASH_LATENCY_1           FLASH_ACR_LATENCY_1WS                /*!< FLASH One wait state */

+#define FLASH_LATENCY_2           FLASH_ACR_LATENCY_2WS                /*!< FLASH Two wait states */

+#define FLASH_LATENCY_3           FLASH_ACR_LATENCY_3WS                /*!< FLASH Three wait states */

+#define FLASH_LATENCY_4           FLASH_ACR_LATENCY_4WS                /*!< FLASH Four wait states */

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define FLASH_LATENCY_5           FLASH_ACR_LATENCY_5WS                /*!< FLASH Five wait state */

+#define FLASH_LATENCY_6           FLASH_ACR_LATENCY_6WS                /*!< FLASH Six wait state */

+#define FLASH_LATENCY_7           FLASH_ACR_LATENCY_7WS                /*!< FLASH Seven wait states */

+#define FLASH_LATENCY_8           FLASH_ACR_LATENCY_8WS                /*!< FLASH Eight wait states */

+#define FLASH_LATENCY_9           FLASH_ACR_LATENCY_9WS                /*!< FLASH Nine wait states */

+#define FLASH_LATENCY_10          FLASH_ACR_LATENCY_10WS               /*!< FLASH Ten wait state */

+#define FLASH_LATENCY_11          FLASH_ACR_LATENCY_11WS               /*!< FLASH Eleven wait state */

+#define FLASH_LATENCY_12          FLASH_ACR_LATENCY_12WS               /*!< FLASH Twelve wait states */

+#define FLASH_LATENCY_13          FLASH_ACR_LATENCY_13WS               /*!< FLASH Thirteen wait states */

+#define FLASH_LATENCY_14          FLASH_ACR_LATENCY_14WS               /*!< FLASH Fourteen wait states */

+#define FLASH_LATENCY_15          FLASH_ACR_LATENCY_15WS               /*!< FLASH Fifteen wait states */

+#endif

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_Keys FLASH Keys

+  * @{

+  */

+#define FLASH_KEY1                0x45670123U                          /*!< Flash key1 */

+#define FLASH_KEY2                0xCDEF89ABU                          /*!< Flash key2: used with FLASH_KEY1

+                                                                            to unlock the FLASH registers access */

+

+#define FLASH_PDKEY1              0x04152637U                          /*!< Flash power down key1 */

+#define FLASH_PDKEY2              0xFAFBFCFDU                          /*!< Flash power down key2: used with FLASH_PDKEY1

+                                                                            to unlock the RUN_PD bit in FLASH_ACR */

+

+#define FLASH_OPTKEY1             0x08192A3BU                          /*!< Flash option byte key1 */

+#define FLASH_OPTKEY2             0x4C5D6E7FU                          /*!< Flash option byte key2: used with FLASH_OPTKEY1

+                                                                            to allow option bytes operations */

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_Flags FLASH Flags Definition

+  * @{

+  */

+#define FLASH_FLAG_EOP            FLASH_SR_EOP                         /*!< FLASH End of operation flag */

+#define FLASH_FLAG_OPERR          FLASH_SR_OPERR                       /*!< FLASH Operation error flag */

+#define FLASH_FLAG_PROGERR        FLASH_SR_PROGERR                     /*!< FLASH Programming error flag */

+#define FLASH_FLAG_WRPERR         FLASH_SR_WRPERR                      /*!< FLASH Write protection error flag */

+#define FLASH_FLAG_PGAERR         FLASH_SR_PGAERR                      /*!< FLASH Programming alignment error flag */

+#define FLASH_FLAG_SIZERR         FLASH_SR_SIZERR                      /*!< FLASH Size error flag  */

+#define FLASH_FLAG_PGSERR         FLASH_SR_PGSERR                      /*!< FLASH Programming sequence error flag */

+#define FLASH_FLAG_MISERR         FLASH_SR_MISERR                      /*!< FLASH Fast programming data miss error flag */

+#define FLASH_FLAG_FASTERR        FLASH_SR_FASTERR                     /*!< FLASH Fast programming error flag */

+#define FLASH_FLAG_RDERR          FLASH_SR_RDERR                       /*!< FLASH PCROP read error flag */

+#define FLASH_FLAG_OPTVERR        FLASH_SR_OPTVERR                     /*!< FLASH Option validity error flag  */

+#define FLASH_FLAG_BSY            FLASH_SR_BSY                         /*!< FLASH Busy flag */

+#if defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L431xx) || defined (STM32L432xx) || defined (STM32L433xx) || defined (STM32L442xx) || \

+    defined (STM32L443xx) || defined (STM32L451xx) || defined (STM32L452xx) || defined (STM32L462xx) || defined (STM32L496xx) || defined (STM32L4A6xx) || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || \

+    defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define FLASH_FLAG_PEMPTY         FLASH_SR_PEMPTY                      /*!< FLASH Program empty */

+#define FLASH_FLAG_SR_ERRORS      (FLASH_FLAG_OPERR   | FLASH_FLAG_PROGERR | FLASH_FLAG_WRPERR | \

+                                   FLASH_FLAG_PGAERR  | FLASH_FLAG_SIZERR  | FLASH_FLAG_PGSERR | \

+                                   FLASH_FLAG_MISERR  | FLASH_FLAG_FASTERR | FLASH_FLAG_RDERR  | \

+                                   FLASH_FLAG_OPTVERR | FLASH_FLAG_PEMPTY)

+#else

+#define FLASH_FLAG_SR_ERRORS      (FLASH_FLAG_OPERR   | FLASH_FLAG_PROGERR | FLASH_FLAG_WRPERR | \

+                                   FLASH_FLAG_PGAERR  | FLASH_FLAG_SIZERR  | FLASH_FLAG_PGSERR | \

+                                   FLASH_FLAG_MISERR  | FLASH_FLAG_FASTERR | FLASH_FLAG_RDERR  | \

+                                   FLASH_FLAG_OPTVERR)

+#endif

+#define FLASH_FLAG_ECCC           FLASH_ECCR_ECCC                      /*!< FLASH ECC correction */

+#define FLASH_FLAG_ECCD           FLASH_ECCR_ECCD                      /*!< FLASH ECC detection */

+

+#define FLASH_FLAG_ALL_ERRORS     (FLASH_FLAG_OPERR   | FLASH_FLAG_PROGERR | FLASH_FLAG_WRPERR | \

+                                   FLASH_FLAG_PGAERR  | FLASH_FLAG_SIZERR  | FLASH_FLAG_PGSERR | \

+                                   FLASH_FLAG_MISERR  | FLASH_FLAG_FASTERR | FLASH_FLAG_RDERR  | \

+                                   FLASH_FLAG_OPTVERR | FLASH_FLAG_ECCD)

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_Interrupt_definition FLASH Interrupts Definition

+  * @brief FLASH Interrupt definition

+  * @{

+  */

+#define FLASH_IT_EOP              FLASH_CR_EOPIE                       /*!< End of FLASH Operation Interrupt source */

+#define FLASH_IT_OPERR            FLASH_CR_ERRIE                       /*!< Error Interrupt source */

+#define FLASH_IT_RDERR            FLASH_CR_RDERRIE                     /*!< PCROP Read Error Interrupt source*/

+#define FLASH_IT_ECCC             (FLASH_ECCR_ECCIE >> 24)             /*!< ECC Correction Interrupt source */

+/**

+  * @}

+  */

+

+/* Exported macros -----------------------------------------------------------*/

+/** @defgroup FLASH_Exported_Macros FLASH Exported Macros

+ *  @brief macros to control FLASH features

+ *  @{

+ */

+

+/**

+  * @brief  Set the FLASH Latency.

+  * @param  __LATENCY__: FLASH Latency

+  *         This parameter can be one of the following values :

+  *     @arg FLASH_LATENCY_0: FLASH Zero wait state

+  *     @arg FLASH_LATENCY_1: FLASH One wait state

+  *     @arg FLASH_LATENCY_2: FLASH Two wait states

+  *     @arg FLASH_LATENCY_3: FLASH Three wait states

+  *     @arg FLASH_LATENCY_4: FLASH Four wait states

+  * @retval None

+  */

+#define __HAL_FLASH_SET_LATENCY(__LATENCY__)    (MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, (__LATENCY__)))

+

+/**

+  * @brief  Get the FLASH Latency.

+  * @retval FLASH Latency

+  *         This parameter can be one of the following values :

+  *     @arg FLASH_LATENCY_0: FLASH Zero wait state

+  *     @arg FLASH_LATENCY_1: FLASH One wait state

+  *     @arg FLASH_LATENCY_2: FLASH Two wait states

+  *     @arg FLASH_LATENCY_3: FLASH Three wait states

+  *     @arg FLASH_LATENCY_4: FLASH Four wait states

+  */

+#define __HAL_FLASH_GET_LATENCY()               READ_BIT(FLASH->ACR, FLASH_ACR_LATENCY)

+

+/**

+  * @brief  Enable the FLASH prefetch buffer.

+  * @retval None

+  */

+#define __HAL_FLASH_PREFETCH_BUFFER_ENABLE()    SET_BIT(FLASH->ACR, FLASH_ACR_PRFTEN)

+

+/**

+  * @brief  Disable the FLASH prefetch buffer.

+  * @retval None

+  */

+#define __HAL_FLASH_PREFETCH_BUFFER_DISABLE()   CLEAR_BIT(FLASH->ACR, FLASH_ACR_PRFTEN)

+

+/**

+  * @brief  Enable the FLASH instruction cache.

+  * @retval none

+  */

+#define __HAL_FLASH_INSTRUCTION_CACHE_ENABLE()  SET_BIT(FLASH->ACR, FLASH_ACR_ICEN)

+

+/**

+  * @brief  Disable the FLASH instruction cache.

+  * @retval none

+  */

+#define __HAL_FLASH_INSTRUCTION_CACHE_DISABLE() CLEAR_BIT(FLASH->ACR, FLASH_ACR_ICEN)

+

+/**

+  * @brief  Enable the FLASH data cache.

+  * @retval none

+  */

+#define __HAL_FLASH_DATA_CACHE_ENABLE()         SET_BIT(FLASH->ACR, FLASH_ACR_DCEN)

+

+/**

+  * @brief  Disable the FLASH data cache.

+  * @retval none

+  */

+#define __HAL_FLASH_DATA_CACHE_DISABLE()        CLEAR_BIT(FLASH->ACR, FLASH_ACR_DCEN)

+

+/**

+  * @brief  Reset the FLASH instruction Cache.

+  * @note   This function must be used only when the Instruction Cache is disabled.

+  * @retval None

+  */

+#define __HAL_FLASH_INSTRUCTION_CACHE_RESET()   do { SET_BIT(FLASH->ACR, FLASH_ACR_ICRST);   \

+                                                     CLEAR_BIT(FLASH->ACR, FLASH_ACR_ICRST); \

+                                                   } while (0)

+

+/**

+  * @brief  Reset the FLASH data Cache.

+  * @note   This function must be used only when the data Cache is disabled.

+  * @retval None

+  */

+#define __HAL_FLASH_DATA_CACHE_RESET()          do { SET_BIT(FLASH->ACR, FLASH_ACR_DCRST);   \

+                                                     CLEAR_BIT(FLASH->ACR, FLASH_ACR_DCRST); \

+                                                   } while (0)

+

+/**

+  * @brief  Enable the FLASH power down during Low-power run mode.

+  * @note   Writing this bit  to 0 this bit, automatically the keys are

+  *         loss and a new unlock sequence is necessary to re-write it to 1.

+  */

+#define __HAL_FLASH_POWER_DOWN_ENABLE()         do { WRITE_REG(FLASH->PDKEYR, FLASH_PDKEY1); \

+                                                     WRITE_REG(FLASH->PDKEYR, FLASH_PDKEY2); \

+                                                     SET_BIT(FLASH->ACR, FLASH_ACR_RUN_PD);   \

+                                                   } while (0)

+

+/**

+  * @brief  Disable the FLASH power down during Low-power run mode.

+  * @note   Writing this bit  to 0 this bit, automatically the keys are

+  *         loss and a new unlock sequence is necessary to re-write it to 1.

+  */

+#define __HAL_FLASH_POWER_DOWN_DISABLE()        do { WRITE_REG(FLASH->PDKEYR, FLASH_PDKEY1); \

+                                                     WRITE_REG(FLASH->PDKEYR, FLASH_PDKEY2); \

+                                                     CLEAR_BIT(FLASH->ACR, FLASH_ACR_RUN_PD); \

+                                                   } while (0)

+

+/**

+  * @brief  Enable the FLASH power down during Low-Power sleep mode

+  * @retval none

+  */

+#define __HAL_FLASH_SLEEP_POWERDOWN_ENABLE()    SET_BIT(FLASH->ACR, FLASH_ACR_SLEEP_PD)

+

+/**

+  * @brief  Disable the FLASH power down during Low-Power sleep mode

+  * @retval none

+  */

+#define __HAL_FLASH_SLEEP_POWERDOWN_DISABLE()   CLEAR_BIT(FLASH->ACR, FLASH_ACR_SLEEP_PD)

+

+/**

+  * @}

+  */

+

+/** @defgroup FLASH_Interrupt FLASH Interrupts Macros

+ *  @brief macros to handle FLASH interrupts

+ * @{

+ */

+

+/**

+  * @brief  Enable the specified FLASH interrupt.

+  * @param  __INTERRUPT__: FLASH interrupt

+  *         This parameter can be any combination of the following values:

+  *     @arg FLASH_IT_EOP: End of FLASH Operation Interrupt

+  *     @arg FLASH_IT_OPERR: Error Interrupt

+  *     @arg FLASH_IT_RDERR: PCROP Read Error Interrupt

+  *     @arg FLASH_IT_ECCC: ECC Correction Interrupt

+  * @retval none

+  */

+#define __HAL_FLASH_ENABLE_IT(__INTERRUPT__)    do { if(((__INTERRUPT__) & FLASH_IT_ECCC) != 0U) { SET_BIT(FLASH->ECCR, FLASH_ECCR_ECCIE); }\

+                                                     if(((__INTERRUPT__) & (~FLASH_IT_ECCC)) != 0U) { SET_BIT(FLASH->CR, ((__INTERRUPT__) & (~FLASH_IT_ECCC))); }\

+                                                   } while(0)

+

+/**

+  * @brief  Disable the specified FLASH interrupt.

+  * @param  __INTERRUPT__: FLASH interrupt

+  *         This parameter can be any combination of the following values:

+  *     @arg FLASH_IT_EOP: End of FLASH Operation Interrupt

+  *     @arg FLASH_IT_OPERR: Error Interrupt

+  *     @arg FLASH_IT_RDERR: PCROP Read Error Interrupt

+  *     @arg FLASH_IT_ECCC: ECC Correction Interrupt

+  * @retval none

+  */

+#define __HAL_FLASH_DISABLE_IT(__INTERRUPT__)   do { if(((__INTERRUPT__) & FLASH_IT_ECCC) != 0U) { CLEAR_BIT(FLASH->ECCR, FLASH_ECCR_ECCIE); }\

+                                                     if(((__INTERRUPT__) & (~FLASH_IT_ECCC)) != 0U) { CLEAR_BIT(FLASH->CR, ((__INTERRUPT__) & (~FLASH_IT_ECCC))); }\

+                                                   } while(0)

+

+/**

+  * @brief  Check whether the specified FLASH flag is set or not.

+  * @param  __FLAG__: specifies the FLASH flag to check.

+  *   This parameter can be one of the following values:

+  *     @arg FLASH_FLAG_EOP: FLASH End of Operation flag

+  *     @arg FLASH_FLAG_OPERR: FLASH Operation error flag

+  *     @arg FLASH_FLAG_PROGERR: FLASH Programming error flag

+  *     @arg FLASH_FLAG_WRPERR: FLASH Write protection error flag

+  *     @arg FLASH_FLAG_PGAERR: FLASH Programming alignment error flag

+  *     @arg FLASH_FLAG_SIZERR: FLASH Size error flag

+  *     @arg FLASH_FLAG_PGSERR: FLASH Programming sequence error flag

+  *     @arg FLASH_FLAG_MISERR: FLASH Fast programming data miss error flag

+  *     @arg FLASH_FLAG_FASTERR: FLASH Fast programming error flag

+  *     @arg FLASH_FLAG_RDERR: FLASH PCROP read  error flag

+  *     @arg FLASH_FLAG_OPTVERR: FLASH Option validity error flag

+  *     @arg FLASH_FLAG_BSY: FLASH write/erase operations in progress flag

+  *     @arg FLASH_FLAG_PEMPTY : FLASH Boot from not programmed flash (apply only for STM32L43x/STM32L44x devices)

+  *     @arg FLASH_FLAG_ECCC: FLASH one ECC error has been detected and corrected

+  *     @arg FLASH_FLAG_ECCD: FLASH two ECC errors have been detected

+  * @retval The new state of FLASH_FLAG (SET or RESET).

+  */

+#define __HAL_FLASH_GET_FLAG(__FLAG__)          ((((__FLAG__) & (FLASH_FLAG_ECCC | FLASH_FLAG_ECCD)) != 0U) ? \

+                                                 (READ_BIT(FLASH->ECCR, (__FLAG__)) == (__FLAG__))          : \

+                                                 (READ_BIT(FLASH->SR,   (__FLAG__)) == (__FLAG__)))

+

+/**

+  * @brief  Clear the FLASH's pending flags.

+  * @param  __FLAG__: specifies the FLASH flags to clear.

+  *   This parameter can be any combination of the following values:

+  *     @arg FLASH_FLAG_EOP: FLASH End of Operation flag

+  *     @arg FLASH_FLAG_OPERR: FLASH Operation error flag

+  *     @arg FLASH_FLAG_PROGERR: FLASH Programming error flag

+  *     @arg FLASH_FLAG_WRPERR: FLASH Write protection error flag

+  *     @arg FLASH_FLAG_PGAERR: FLASH Programming alignment error flag

+  *     @arg FLASH_FLAG_SIZERR: FLASH Size error flag

+  *     @arg FLASH_FLAG_PGSERR: FLASH Programming sequence error flag

+  *     @arg FLASH_FLAG_MISERR: FLASH Fast programming data miss error flag

+  *     @arg FLASH_FLAG_FASTERR: FLASH Fast programming error flag

+  *     @arg FLASH_FLAG_RDERR: FLASH PCROP read  error flag

+  *     @arg FLASH_FLAG_OPTVERR: FLASH Option validity error flag

+  *     @arg FLASH_FLAG_ECCC: FLASH one ECC error has been detected and corrected

+  *     @arg FLASH_FLAG_ECCD: FLASH two ECC errors have been detected

+  *     @arg FLASH_FLAG_ALL_ERRORS: FLASH All errors flags

+  * @retval None

+  */

+#define __HAL_FLASH_CLEAR_FLAG(__FLAG__)        do { if(((__FLAG__) & (FLASH_FLAG_ECCC | FLASH_FLAG_ECCD)) != 0U) { SET_BIT(FLASH->ECCR, ((__FLAG__) & (FLASH_FLAG_ECCC | FLASH_FLAG_ECCD))); }\

+                                                     if(((__FLAG__) & ~(FLASH_FLAG_ECCC | FLASH_FLAG_ECCD)) != 0U) { WRITE_REG(FLASH->SR, ((__FLAG__) & ~(FLASH_FLAG_ECCC | FLASH_FLAG_ECCD))); }\

+                                                   } while(0)

+/**

+  * @}

+  */

+

+/* Include FLASH HAL Extended module */

+#include "stm32l4xx_hal_flash_ex.h"

+#include "stm32l4xx_hal_flash_ramfunc.h"

+

+/* Exported functions --------------------------------------------------------*/

+/** @addtogroup FLASH_Exported_Functions

+  * @{

+  */

+

+/* Program operation functions  ***********************************************/

+/** @addtogroup FLASH_Exported_Functions_Group1

+  * @{

+  */

+HAL_StatusTypeDef  HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);

+HAL_StatusTypeDef  HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data);

+/* FLASH IRQ handler method */

+void               HAL_FLASH_IRQHandler(void);

+/* Callbacks in non blocking modes */

+void               HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue);

+void               HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue);

+/**

+  * @}

+  */

+

+/* Peripheral Control functions  **********************************************/

+/** @addtogroup FLASH_Exported_Functions_Group2

+  * @{

+  */

+HAL_StatusTypeDef  HAL_FLASH_Unlock(void);

+HAL_StatusTypeDef  HAL_FLASH_Lock(void);

+/* Option bytes control */

+HAL_StatusTypeDef  HAL_FLASH_OB_Unlock(void);

+HAL_StatusTypeDef  HAL_FLASH_OB_Lock(void);

+HAL_StatusTypeDef  HAL_FLASH_OB_Launch(void);

+/**

+  * @}

+  */

+

+/* Peripheral State functions  ************************************************/

+/** @addtogroup FLASH_Exported_Functions_Group3

+  * @{

+  */

+uint32_t HAL_FLASH_GetError(void);

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Private variables ---------------------------------------------------------*/

+/** @addtogroup FLASH_Private_Variables FLASH Private Variables

+ * @{

+ */

+extern FLASH_ProcessTypeDef pFlash;

+/**

+  * @}

+  */

+

+/* Private function ----------------------------------------------------------*/

+/** @addtogroup FLASH_Private_Functions FLASH Private Functions

+ * @{

+ */

+HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout);

+/**

+  * @}

+  */

+

+/* Private constants --------------------------------------------------------*/

+/** @defgroup FLASH_Private_Constants FLASH Private Constants

+  * @{

+  */

+#define FLASH_SIZE_DATA_REGISTER           ((uint32_t)0x1FFF75E0)

+

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define FLASH_SIZE                         (((((*((uint32_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0000FFFFU)) == 0x0000FFFFU)) ? (0x800U << 10U) : \

+                                            (((*((uint32_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0000FFFFU)) << 10U))

+#elif defined (STM32L451xx) || defined (STM32L452xx) || defined (STM32L462xx)

+#define FLASH_SIZE                         (((((*((uint32_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0000FFFFU)) == 0x0000FFFFU)) ? (0x200U << 10U) : \

+                                            (((*((uint32_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0000FFFFU)) << 10U))

+#elif defined (STM32L431xx) || defined (STM32L432xx) || defined (STM32L433xx) || defined (STM32L442xx) || defined (STM32L443xx)

+#define FLASH_SIZE                         (((((*((uint32_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0000FFFFU)) == 0x0000FFFFU)) ? (0x100U << 10U) : \

+                                            (((*((uint32_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0000FFFFU)) << 10U))

+#elif defined (STM32L412xx) || defined (STM32L422xx)

+#define FLASH_SIZE                         (((((*((uint32_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0000FFFFU)) == 0x0000FFFFU)) ? (0x80U << 10U) :  \

+                                            (((*((uint32_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0000FFFFU)) << 10U))

+#else

+#define FLASH_SIZE                         (((((*((uint32_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0000FFFFU))== 0x0000FFFFU)) ? (0x400U << 10U) : \

+                                            (((*((uint32_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0000FFFFU)) << 10U))

+#endif

+

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || defined (STM32L4R5xx) || \

+    defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define FLASH_BANK_SIZE                    (FLASH_SIZE >> 1U)

+#else

+#define FLASH_BANK_SIZE                    (FLASH_SIZE)

+#endif

+

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define FLASH_PAGE_SIZE                    ((uint32_t)0x1000)

+#define FLASH_PAGE_SIZE_128_BITS           ((uint32_t)0x2000)

+#else

+#define FLASH_PAGE_SIZE                    ((uint32_t)0x800)

+#endif

+

+#define FLASH_TIMEOUT_VALUE                ((uint32_t)50000)/* 50 s */

+/**

+  * @}

+  */

+

+/* Private macros ------------------------------------------------------------*/

+/** @defgroup FLASH_Private_Macros FLASH Private Macros

+ *  @{

+ */

+

+#define IS_FLASH_TYPEERASE(VALUE)          (((VALUE) == FLASH_TYPEERASE_PAGES) || \

+                                            ((VALUE) == FLASH_TYPEERASE_MASSERASE))

+

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || defined (STM32L4R5xx) || \

+    defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define IS_FLASH_BANK(BANK)                (((BANK) == FLASH_BANK_1)  || \

+                                            ((BANK) == FLASH_BANK_2)  || \

+                                            ((BANK) == FLASH_BANK_BOTH))

+

+#define IS_FLASH_BANK_EXCLUSIVE(BANK)      (((BANK) == FLASH_BANK_1)  || \

+                                            ((BANK) == FLASH_BANK_2))

+#else

+#define IS_FLASH_BANK(BANK)                ((BANK) == FLASH_BANK_1)

+

+#define IS_FLASH_BANK_EXCLUSIVE(BANK)      ((BANK) == FLASH_BANK_1)

+#endif

+

+#define IS_FLASH_TYPEPROGRAM(VALUE)        (((VALUE) == FLASH_TYPEPROGRAM_DOUBLEWORD) || \

+                                            ((VALUE) == FLASH_TYPEPROGRAM_FAST) || \

+                                            ((VALUE) == FLASH_TYPEPROGRAM_FAST_AND_LAST))

+

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define IS_FLASH_MAIN_MEM_ADDRESS(ADDRESS) (((ADDRESS) >= (FLASH_BASE)) && ((ADDRESS) <= (FLASH_BASE+0x1FFFFFU)))

+#else

+#define IS_FLASH_MAIN_MEM_ADDRESS(ADDRESS) (((ADDRESS) >= (FLASH_BASE))         && ((((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0FFFU)) == 0x400U) ? \

+                                            ((ADDRESS) <= (FLASH_BASE+0xFFFFFU)) : ((((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0FFFU)) == 0x200U) ? \

+                                            ((ADDRESS) <= (FLASH_BASE+0x7FFFFU)) : ((((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0FFFU)) == 0x100U) ? \

+                                            ((ADDRESS) <= (FLASH_BASE+0x3FFFFU)) : ((((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0FFFU)) == 0x80U) ? \

+                                            ((ADDRESS) <= (FLASH_BASE+0x1FFFFU)) : ((ADDRESS) <= (FLASH_BASE+0xFFFFFU)))))))

+#endif

+

+#define IS_FLASH_OTP_ADDRESS(ADDRESS)      (((ADDRESS) >= 0x1FFF7000U) && ((ADDRESS) <= 0x1FFF73FFU))

+

+#define IS_FLASH_PROGRAM_ADDRESS(ADDRESS)  ((IS_FLASH_MAIN_MEM_ADDRESS(ADDRESS)) || (IS_FLASH_OTP_ADDRESS(ADDRESS)))

+

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define IS_FLASH_PAGE(PAGE)                ((PAGE) < 256U)

+#elif defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx) || defined(STM32L496xx) || defined(STM32L4A6xx)

+#define IS_FLASH_PAGE(PAGE)                (((((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0FFFU)) == 0x400U) ? ((PAGE) < 256U) : \

+                                            ((((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0FFFU)) == 0x200U) ? ((PAGE) < 128U) : \

+                                            ((((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0FFFU)) == 0x100U) ? ((PAGE) < 64U)  : \

+                                            ((PAGE) < 256U)))))

+#elif defined (STM32L451xx) || defined (STM32L452xx) || defined (STM32L462xx)

+#define IS_FLASH_PAGE(PAGE)                (((((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0FFFU)) == 0x200U) ? ((PAGE) < 256U) : \

+                                            ((((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0FFFU)) == 0x100U) ? ((PAGE) < 128U) : \

+                                            ((PAGE) < 256U))))

+#else

+#define IS_FLASH_PAGE(PAGE)                (((((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0FFFU)) == 0x100U) ? ((PAGE) < 128U) : \

+                                            ((((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) & (0x0FFFU)) == 0x80U)  ? ((PAGE) < 64U)  : \

+                                            ((PAGE) < 128U))))

+#endif

+

+#define IS_OPTIONBYTE(VALUE)               (((VALUE) <= (OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER | OPTIONBYTE_PCROP)))

+

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || defined (STM32L4R5xx) || \

+    defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define IS_OB_WRPAREA(VALUE)               (((VALUE) == OB_WRPAREA_BANK1_AREAA) || ((VALUE) == OB_WRPAREA_BANK1_AREAB) || \

+                                            ((VALUE) == OB_WRPAREA_BANK2_AREAA) || ((VALUE) == OB_WRPAREA_BANK2_AREAB))

+#else

+#define IS_OB_WRPAREA(VALUE)               (((VALUE) == OB_WRPAREA_BANK1_AREAA) || ((VALUE) == OB_WRPAREA_BANK1_AREAB))

+#endif

+

+#define IS_OB_RDP_LEVEL(LEVEL)             (((LEVEL) == OB_RDP_LEVEL_0)   ||\

+                                            ((LEVEL) == OB_RDP_LEVEL_1)/* ||\

+                                            ((LEVEL) == OB_RDP_LEVEL_2)*/)

+

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define IS_OB_USER_TYPE(TYPE)              (((TYPE) <= (uint32_t)0xFFFFU) && ((TYPE) != 0U))

+#elif defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx) || defined(STM32L496xx) || defined(STM32L4A6xx)

+#define IS_OB_USER_TYPE(TYPE)              (((TYPE) <= (uint32_t)0x1FFFU) && ((TYPE) != 0U))

+#else

+#define IS_OB_USER_TYPE(TYPE)              (((TYPE) <= (uint32_t)0x7E7FU) && ((TYPE) != 0U) && (((TYPE)&0x0180U) == 0U))

+#endif

+

+#define IS_OB_USER_BOR_LEVEL(LEVEL)        (((LEVEL) == OB_BOR_LEVEL_0) || ((LEVEL) == OB_BOR_LEVEL_1) || \

+                                            ((LEVEL) == OB_BOR_LEVEL_2) || ((LEVEL) == OB_BOR_LEVEL_3) || \

+                                            ((LEVEL) == OB_BOR_LEVEL_4))

+

+#define IS_OB_USER_STOP(VALUE)             (((VALUE) == OB_STOP_RST) || ((VALUE) == OB_STOP_NORST))

+

+#define IS_OB_USER_STANDBY(VALUE)          (((VALUE) == OB_STANDBY_RST) || ((VALUE) == OB_STANDBY_NORST))

+

+#define IS_OB_USER_SHUTDOWN(VALUE)         (((VALUE) == OB_SHUTDOWN_RST) || ((VALUE) == OB_SHUTDOWN_NORST))

+

+#define IS_OB_USER_IWDG(VALUE)             (((VALUE) == OB_IWDG_HW) || ((VALUE) == OB_IWDG_SW))

+

+#define IS_OB_USER_IWDG_STOP(VALUE)        (((VALUE) == OB_IWDG_STOP_FREEZE) || ((VALUE) == OB_IWDG_STOP_RUN))

+

+#define IS_OB_USER_IWDG_STDBY(VALUE)       (((VALUE) == OB_IWDG_STDBY_FREEZE) || ((VALUE) == OB_IWDG_STDBY_RUN))

+

+#define IS_OB_USER_WWDG(VALUE)             (((VALUE) == OB_WWDG_HW) || ((VALUE) == OB_WWDG_SW))

+

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || defined (STM32L4R5xx) || \

+    defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define IS_OB_USER_BFB2(VALUE)             (((VALUE) == OB_BFB2_DISABLE) || ((VALUE) == OB_BFB2_ENABLE))

+

+#define IS_OB_USER_DUALBANK(VALUE)         (((VALUE) == OB_DUALBANK_SINGLE) || ((VALUE) == OB_DUALBANK_DUAL))

+#endif

+

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define IS_OB_USER_DBANK(VALUE)            (((VALUE) == OB_DBANK_128_BITS) || ((VALUE) == OB_DBANK_64_BITS))

+#endif

+

+#define IS_OB_USER_BOOT1(VALUE)            (((VALUE) == OB_BOOT1_SRAM) || ((VALUE) == OB_BOOT1_SYSTEM))

+

+#define IS_OB_USER_SRAM2_PARITY(VALUE)     (((VALUE) == OB_SRAM2_PARITY_ENABLE) || ((VALUE) == OB_SRAM2_PARITY_DISABLE))

+

+#define IS_OB_USER_SRAM2_RST(VALUE)        (((VALUE) == OB_SRAM2_RST_ERASE) || ((VALUE) == OB_SRAM2_RST_NOT_ERASE))

+

+#if defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L431xx) || defined (STM32L432xx) || defined (STM32L433xx) || \

+    defined (STM32L442xx) || defined (STM32L443xx) || defined (STM32L451xx) || defined (STM32L452xx) || defined (STM32L462xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || defined (STM32L4R5xx) || \

+    defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define IS_OB_USER_SWBOOT0(VALUE)          (((VALUE) == OB_BOOT0_FROM_OB) || ((VALUE) == OB_BOOT0_FROM_PIN))

+

+#define IS_OB_USER_BOOT0(VALUE)            (((VALUE) == OB_BOOT0_RESET) || ((VALUE) == OB_BOOT0_SET))

+#endif

+

+#define IS_OB_PCROP_RDP(VALUE)             (((VALUE) == OB_PCROP_RDP_NOT_ERASE) || ((VALUE) == OB_PCROP_RDP_ERASE))

+

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define IS_FLASH_LATENCY(LATENCY)          (((LATENCY) == FLASH_LATENCY_0) || ((LATENCY) == FLASH_LATENCY_1) || \

+                                            ((LATENCY) == FLASH_LATENCY_2) || ((LATENCY) == FLASH_LATENCY_3) || \

+                                            ((LATENCY) == FLASH_LATENCY_4) || ((LATENCY) == FLASH_LATENCY_5) || \

+                                            ((LATENCY) == FLASH_LATENCY_6) || ((LATENCY) == FLASH_LATENCY_7) || \

+                                            ((LATENCY) == FLASH_LATENCY_8) || ((LATENCY) == FLASH_LATENCY_9) || \

+                                            ((LATENCY) == FLASH_LATENCY_10) || ((LATENCY) == FLASH_LATENCY_11) || \

+                                            ((LATENCY) == FLASH_LATENCY_12) || ((LATENCY) == FLASH_LATENCY_13) || \

+                                            ((LATENCY) == FLASH_LATENCY_14) || ((LATENCY) == FLASH_LATENCY_15))

+#else

+#define IS_FLASH_LATENCY(LATENCY)          (((LATENCY) == FLASH_LATENCY_0) || \

+                                            ((LATENCY) == FLASH_LATENCY_1) || \

+                                            ((LATENCY) == FLASH_LATENCY_2) || \

+                                            ((LATENCY) == FLASH_LATENCY_3) || \

+                                            ((LATENCY) == FLASH_LATENCY_4))

+#endif

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* __STM32L4xx_HAL_FLASH_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h
new file mode 100644
index 0000000..5c4f6c8
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h
@@ -0,0 +1,128 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_flash_ex.h

+  * @author  MCD Application Team

+  * @brief   Header file of FLASH HAL Extended module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                       opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef __STM32L4xx_HAL_FLASH_EX_H

+#define __STM32L4xx_HAL_FLASH_EX_H

+

+#ifdef __cplusplus

+ extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup FLASHEx

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+

+/* Exported constants --------------------------------------------------------*/

+#if defined (FLASH_CFGR_LVEN)

+/** @addtogroup FLASHEx_Exported_Constants

+  * @{

+  */

+/** @defgroup FLASHEx_LVE_PIN_CFG FLASHEx LVE pin configuration

+  * @{

+  */

+#define FLASH_LVE_PIN_CTRL     0x00000000U       /*!< LVE FLASH pin controlled by power controller       */

+#define FLASH_LVE_PIN_FORCED   FLASH_CFGR_LVEN   /*!< LVE FLASH pin enforced to low (external SMPS used) */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+#endif /* FLASH_CFGR_LVEN */

+

+/* Exported macro ------------------------------------------------------------*/

+

+/* Exported functions --------------------------------------------------------*/

+/** @addtogroup FLASHEx_Exported_Functions

+  * @{

+  */

+

+/* Extended Program operation functions  *************************************/

+/** @addtogroup FLASHEx_Exported_Functions_Group1

+  * @{

+  */

+HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError);

+HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit);

+HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit);

+void              HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit);

+/**

+  * @}

+  */

+

+#if defined (FLASH_CFGR_LVEN)

+/** @addtogroup FLASHEx_Exported_Functions_Group2

+  * @{

+  */

+HAL_StatusTypeDef HAL_FLASHEx_ConfigLVEPin(uint32_t ConfigLVE);

+/**

+  * @}

+  */

+#endif /* FLASH_CFGR_LVEN */

+

+/**

+  * @}

+  */

+

+/* Private function ----------------------------------------------------------*/

+/** @addtogroup FLASHEx_Private_Functions FLASHEx Private Functions

+ * @{

+ */

+void FLASH_PageErase(uint32_t Page, uint32_t Banks);

+void FLASH_FlushCaches(void);

+/**

+  * @}

+  */

+

+/* Private macros ------------------------------------------------------------*/

+/**

+  @cond 0

+  */

+#if defined (FLASH_CFGR_LVEN)

+#define IS_FLASH_LVE_PIN(CFG)  (((CFG) == FLASH_LVE_PIN_CTRL) || ((CFG) == FLASH_LVE_PIN_FORCED))

+#endif /* FLASH_CFGR_LVEN */

+/**

+  @endcond

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* __STM32L4xx_HAL_FLASH_EX_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h
new file mode 100644
index 0000000..0c719e2
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h
@@ -0,0 +1,77 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_flash_ramfunc.h

+  * @author  MCD Application Team

+  * @brief   Header file of FLASH RAMFUNC driver.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                       opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef __STM32L4xx_FLASH_RAMFUNC_H

+#define __STM32L4xx_FLASH_RAMFUNC_H

+

+#ifdef __cplusplus

+ extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup FLASH_RAMFUNC

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+/* Exported macro ------------------------------------------------------------*/

+/* Exported functions --------------------------------------------------------*/

+/** @addtogroup FLASH_RAMFUNC_Exported_Functions

+  * @{

+  */

+

+/** @addtogroup FLASH_RAMFUNC_Exported_Functions_Group1

+  * @{

+  */

+/* Peripheral Control functions  ************************************************/

+__RAM_FUNC  HAL_FLASHEx_EnableRunPowerDown(void);

+__RAM_FUNC  HAL_FLASHEx_DisableRunPowerDown(void);

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+__RAM_FUNC  HAL_FLASHEx_OB_DBankConfig(uint32_t DBankConfig);

+#endif

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* __STM32L4xx_FLASH_RAMFUNC_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h
new file mode 100644
index 0000000..7d50932
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h
@@ -0,0 +1,300 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_gpio.h

+  * @author  MCD Application Team

+  * @brief   Header file of GPIO HAL module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef __STM32L4xx_HAL_GPIO_H

+#define __STM32L4xx_HAL_GPIO_H

+

+#ifdef __cplusplus

+ extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup GPIO

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+

+/** @defgroup GPIO_Exported_Types GPIO Exported Types

+  * @{

+  */

+/**

+  * @brief   GPIO Init structure definition

+  */

+typedef struct

+{

+  uint32_t Pin;        /*!< Specifies the GPIO pins to be configured.

+                           This parameter can be any value of @ref GPIO_pins */

+

+  uint32_t Mode;       /*!< Specifies the operating mode for the selected pins.

+                           This parameter can be a value of @ref GPIO_mode */

+

+  uint32_t Pull;       /*!< Specifies the Pull-up or Pull-Down activation for the selected pins.

+                           This parameter can be a value of @ref GPIO_pull */

+

+  uint32_t Speed;      /*!< Specifies the speed for the selected pins.

+                           This parameter can be a value of @ref GPIO_speed */

+

+  uint32_t Alternate;  /*!< Peripheral to be connected to the selected pins

+                            This parameter can be a value of @ref GPIOEx_Alternate_function_selection */

+}GPIO_InitTypeDef;

+

+/**

+  * @brief  GPIO Bit SET and Bit RESET enumeration

+  */

+typedef enum

+{

+  GPIO_PIN_RESET = 0U,

+  GPIO_PIN_SET

+}GPIO_PinState;

+/**

+  * @}

+  */

+

+/* Exported constants --------------------------------------------------------*/

+/** @defgroup GPIO_Exported_Constants GPIO Exported Constants

+  * @{

+  */

+/** @defgroup GPIO_pins GPIO pins

+  * @{

+  */

+#define GPIO_PIN_0                 ((uint16_t)0x0001)  /* Pin 0 selected    */

+#define GPIO_PIN_1                 ((uint16_t)0x0002)  /* Pin 1 selected    */

+#define GPIO_PIN_2                 ((uint16_t)0x0004)  /* Pin 2 selected    */

+#define GPIO_PIN_3                 ((uint16_t)0x0008)  /* Pin 3 selected    */

+#define GPIO_PIN_4                 ((uint16_t)0x0010)  /* Pin 4 selected    */

+#define GPIO_PIN_5                 ((uint16_t)0x0020)  /* Pin 5 selected    */

+#define GPIO_PIN_6                 ((uint16_t)0x0040)  /* Pin 6 selected    */

+#define GPIO_PIN_7                 ((uint16_t)0x0080)  /* Pin 7 selected    */

+#define GPIO_PIN_8                 ((uint16_t)0x0100)  /* Pin 8 selected    */

+#define GPIO_PIN_9                 ((uint16_t)0x0200)  /* Pin 9 selected    */

+#define GPIO_PIN_10                ((uint16_t)0x0400)  /* Pin 10 selected   */

+#define GPIO_PIN_11                ((uint16_t)0x0800)  /* Pin 11 selected   */

+#define GPIO_PIN_12                ((uint16_t)0x1000)  /* Pin 12 selected   */

+#define GPIO_PIN_13                ((uint16_t)0x2000)  /* Pin 13 selected   */

+#define GPIO_PIN_14                ((uint16_t)0x4000)  /* Pin 14 selected   */

+#define GPIO_PIN_15                ((uint16_t)0x8000)  /* Pin 15 selected   */

+#define GPIO_PIN_All               ((uint16_t)0xFFFF)  /* All pins selected */

+

+#define GPIO_PIN_MASK              (0x0000FFFFu) /* PIN mask for assert test */

+/**

+  * @}

+  */

+

+/** @defgroup GPIO_mode GPIO mode

+  * @brief GPIO Configuration Mode

+  *        Elements values convention: 0xX0yz00YZ

+  *           - X  : GPIO mode or EXTI Mode

+  *           - y  : External IT or Event trigger detection

+  *           - z  : IO configuration on External IT or Event

+  *           - Y  : Output type (Push Pull or Open Drain)

+  *           - Z  : IO Direction mode (Input, Output, Alternate or Analog)

+  * @{

+  */

+#define  GPIO_MODE_INPUT                        (0x00000000u)   /*!< Input Floating Mode                   */

+#define  GPIO_MODE_OUTPUT_PP                    (0x00000001u)   /*!< Output Push Pull Mode                 */

+#define  GPIO_MODE_OUTPUT_OD                    (0x00000011u)   /*!< Output Open Drain Mode                */

+#define  GPIO_MODE_AF_PP                        (0x00000002u)   /*!< Alternate Function Push Pull Mode     */

+#define  GPIO_MODE_AF_OD                        (0x00000012u)   /*!< Alternate Function Open Drain Mode    */

+#define  GPIO_MODE_ANALOG                       (0x00000003u)   /*!< Analog Mode  */

+#define  GPIO_MODE_ANALOG_ADC_CONTROL           (0x0000000Bu)   /*!< Analog Mode for ADC conversion */

+#define  GPIO_MODE_IT_RISING                    (0x10110000u)   /*!< External Interrupt Mode with Rising edge trigger detection          */

+#define  GPIO_MODE_IT_FALLING                   (0x10210000u)   /*!< External Interrupt Mode with Falling edge trigger detection         */

+#define  GPIO_MODE_IT_RISING_FALLING            (0x10310000u)   /*!< External Interrupt Mode with Rising/Falling edge trigger detection  */

+#define  GPIO_MODE_EVT_RISING                   (0x10120000u)   /*!< External Event Mode with Rising edge trigger detection              */

+#define  GPIO_MODE_EVT_FALLING                  (0x10220000u)   /*!< External Event Mode with Falling edge trigger detection             */

+#define  GPIO_MODE_EVT_RISING_FALLING           (0x10320000u)   /*!< External Event Mode with Rising/Falling edge trigger detection      */

+/**

+  * @}

+  */

+

+/** @defgroup GPIO_speed GPIO speed

+  * @brief GPIO Output Maximum frequency

+  * @{

+  */

+#define  GPIO_SPEED_FREQ_LOW        (0x00000000u)   /*!< range up to 5 MHz, please refer to the product datasheet */

+#define  GPIO_SPEED_FREQ_MEDIUM     (0x00000001u)   /*!< range  5 MHz to 25 MHz, please refer to the product datasheet */

+#define  GPIO_SPEED_FREQ_HIGH       (0x00000002u)   /*!< range 25 MHz to 50 MHz, please refer to the product datasheet */

+#define  GPIO_SPEED_FREQ_VERY_HIGH  (0x00000003u)   /*!< range 50 MHz to 80 MHz, please refer to the product datasheet */

+/**

+  * @}

+  */

+

+ /** @defgroup GPIO_pull GPIO pull

+   * @brief GPIO Pull-Up or Pull-Down Activation

+   * @{

+   */

+#define  GPIO_NOPULL        (0x00000000u)   /*!< No Pull-up or Pull-down activation  */

+#define  GPIO_PULLUP        (0x00000001u)   /*!< Pull-up activation                  */

+#define  GPIO_PULLDOWN      (0x00000002u)   /*!< Pull-down activation                */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Exported macro ------------------------------------------------------------*/

+/** @defgroup GPIO_Exported_Macros GPIO Exported Macros

+  * @{

+  */

+

+/**

+  * @brief  Check whether the specified EXTI line flag is set or not.

+  * @param  __EXTI_LINE__: specifies the EXTI line flag to check.

+  *         This parameter can be GPIO_PIN_x where x can be(0..15)

+  * @retval The new state of __EXTI_LINE__ (SET or RESET).

+  */

+#define __HAL_GPIO_EXTI_GET_FLAG(__EXTI_LINE__)       (EXTI->PR1 & (__EXTI_LINE__))

+

+/**

+  * @brief  Clear the EXTI's line pending flags.

+  * @param  __EXTI_LINE__: specifies the EXTI lines flags to clear.

+  *         This parameter can be any combination of GPIO_PIN_x where x can be (0..15)

+  * @retval None

+  */

+#define __HAL_GPIO_EXTI_CLEAR_FLAG(__EXTI_LINE__)     (EXTI->PR1 = (__EXTI_LINE__))

+

+/**

+  * @brief  Check whether the specified EXTI line is asserted or not.

+  * @param  __EXTI_LINE__: specifies the EXTI line to check.

+  *          This parameter can be GPIO_PIN_x where x can be(0..15)

+  * @retval The new state of __EXTI_LINE__ (SET or RESET).

+  */

+#define __HAL_GPIO_EXTI_GET_IT(__EXTI_LINE__)         (EXTI->PR1 & (__EXTI_LINE__))

+

+/**

+  * @brief  Clear the EXTI's line pending bits.

+  * @param  __EXTI_LINE__: specifies the EXTI lines to clear.

+  *          This parameter can be any combination of GPIO_PIN_x where x can be (0..15)

+  * @retval None

+  */

+#define __HAL_GPIO_EXTI_CLEAR_IT(__EXTI_LINE__)       (EXTI->PR1 = (__EXTI_LINE__))

+

+/**

+  * @brief  Generate a Software interrupt on selected EXTI line.

+  * @param  __EXTI_LINE__: specifies the EXTI line to check.

+  *          This parameter can be GPIO_PIN_x where x can be(0..15)

+  * @retval None

+  */

+#define __HAL_GPIO_EXTI_GENERATE_SWIT(__EXTI_LINE__)  (EXTI->SWIER1 |= (__EXTI_LINE__))

+

+/**

+  * @}

+  */

+

+/* Private macros ------------------------------------------------------------*/

+/** @addtogroup GPIO_Private_Macros GPIO Private Macros

+  * @{

+  */

+#define IS_GPIO_PIN_ACTION(ACTION)  (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET))

+

+#define IS_GPIO_PIN(__PIN__)        ((((uint32_t)(__PIN__) & GPIO_PIN_MASK) != 0x00U) &&\

+                                     (((uint32_t)(__PIN__) & ~GPIO_PIN_MASK) == 0x00U))

+

+#define IS_GPIO_MODE(__MODE__)      (((__MODE__) == GPIO_MODE_INPUT)              ||\

+                                     ((__MODE__) == GPIO_MODE_OUTPUT_PP)          ||\

+                                     ((__MODE__) == GPIO_MODE_OUTPUT_OD)          ||\

+                                     ((__MODE__) == GPIO_MODE_AF_PP)              ||\

+                                     ((__MODE__) == GPIO_MODE_AF_OD)              ||\

+                                     ((__MODE__) == GPIO_MODE_IT_RISING)          ||\

+                                     ((__MODE__) == GPIO_MODE_IT_FALLING)         ||\

+                                     ((__MODE__) == GPIO_MODE_IT_RISING_FALLING)  ||\

+                                     ((__MODE__) == GPIO_MODE_EVT_RISING)         ||\

+                                     ((__MODE__) == GPIO_MODE_EVT_FALLING)        ||\

+                                     ((__MODE__) == GPIO_MODE_EVT_RISING_FALLING) ||\

+                                     ((__MODE__) == GPIO_MODE_ANALOG)             ||\

+                                     ((__MODE__) == GPIO_MODE_ANALOG_ADC_CONTROL))

+

+#define IS_GPIO_SPEED(__SPEED__)    (((__SPEED__) == GPIO_SPEED_FREQ_LOW)       ||\

+                                     ((__SPEED__) == GPIO_SPEED_FREQ_MEDIUM)    ||\

+                                     ((__SPEED__) == GPIO_SPEED_FREQ_HIGH)      ||\

+                                     ((__SPEED__) == GPIO_SPEED_FREQ_VERY_HIGH))

+

+#define IS_GPIO_PULL(__PULL__)      (((__PULL__) == GPIO_NOPULL)   ||\

+                                     ((__PULL__) == GPIO_PULLUP)   || \

+                                     ((__PULL__) == GPIO_PULLDOWN))

+/**

+  * @}

+  */

+

+/* Include GPIO HAL Extended module */

+#include "stm32l4xx_hal_gpio_ex.h"

+

+/* Exported functions --------------------------------------------------------*/

+/** @addtogroup GPIO_Exported_Functions GPIO Exported Functions

+  * @{

+  */

+

+/** @addtogroup GPIO_Exported_Functions_Group1 Initialization/de-initialization functions

+ *  @brief    Initialization and Configuration functions

+ * @{

+ */

+

+/* Initialization and de-initialization functions *****************************/

+void              HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);

+void              HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin);

+

+/**

+  * @}

+  */

+

+/** @addtogroup GPIO_Exported_Functions_Group2 IO operation functions

+ * @{

+ */

+

+/* IO operation functions *****************************************************/

+GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

+void              HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);

+void              HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

+HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

+void              HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);

+void              HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* __STM32L4xx_HAL_GPIO_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h
new file mode 100644
index 0000000..85281c4
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h
@@ -0,0 +1,909 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_gpio_ex.h

+  * @author  MCD Application Team

+  * @brief   Header file of GPIO HAL Extended module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef __STM32L4xx_HAL_GPIO_EX_H

+#define __STM32L4xx_HAL_GPIO_EX_H

+

+#ifdef __cplusplus

+ extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup GPIOEx GPIOEx

+  * @brief GPIO Extended HAL module driver

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+/* Exported constants --------------------------------------------------------*/

+/** @defgroup GPIOEx_Exported_Constants GPIOEx Exported Constants

+  * @{

+  */

+

+/** @defgroup GPIOEx_Alternate_function_selection GPIOEx Alternate function selection

+  * @{

+  */

+

+#if defined(STM32L412xx) || defined(STM32L422xx)

+/*--------------STM32L412xx/STM32L422xx---*/

+/**

+  * @brief   AF 0 selection

+  */

+#define GPIO_AF0_RTC_50Hz      ((uint8_t)0x00)  /* RTC_50Hz Alternate Function mapping                       */

+#define GPIO_AF0_MCO           ((uint8_t)0x00)  /* MCO (MCO1 and MCO2) Alternate Function mapping            */

+#define GPIO_AF0_SWJ           ((uint8_t)0x00)  /* SWJ (SWD and JTAG) Alternate Function mapping             */

+#define GPIO_AF0_TRACE         ((uint8_t)0x00)  /* TRACE Alternate Function mapping                          */

+

+/**

+  * @brief   AF 1 selection

+  */

+#define GPIO_AF1_TIM1          ((uint8_t)0x01)  /* TIM1 Alternate Function mapping */

+#define GPIO_AF1_TIM2          ((uint8_t)0x01)  /* TIM2 Alternate Function mapping */

+#define GPIO_AF1_LPTIM1        ((uint8_t)0x01)  /* LPTIM1 Alternate Function mapping */

+#define GPIO_AF1_IR            ((uint8_t)0x01)  /* IR Alternate Function mapping */

+

+/**

+  * @brief   AF 2 selection

+  */

+#define GPIO_AF2_TIM1          ((uint8_t)0x02)  /* TIM1 Alternate Function mapping */

+#define GPIO_AF2_TIM2          ((uint8_t)0x02)  /* TIM2 Alternate Function mapping */

+

+/**

+  * @brief   AF 3 selection

+  */

+#define GPIO_AF3_USART2        ((uint8_t)0x03)  /* USART1 Alternate Function mapping */

+#define GPIO_AF3_TIM1_COMP1    ((uint8_t)0x03)  /* TIM1/COMP1 Break in Alternate Function mapping  */

+

+/**

+  * @brief   AF 4 selection

+  */

+#define GPIO_AF4_I2C1          ((uint8_t)0x04)  /* I2C1 Alternate Function mapping   */

+#define GPIO_AF4_I2C2          ((uint8_t)0x04)  /* I2C2 Alternate Function mapping   */

+#define GPIO_AF4_I2C3          ((uint8_t)0x04)  /* I2C3 Alternate Function mapping   */

+

+/**

+  * @brief   AF 5 selection

+  */

+#define GPIO_AF5_SPI1          ((uint8_t)0x05)  /* SPI1 Alternate Function mapping   */

+#define GPIO_AF5_SPI2          ((uint8_t)0x05)  /* SPI2 Alternate Function mapping   */

+

+/**

+  * @brief   AF 6 selection

+  */

+#define GPIO_AF6_COMP1         ((uint8_t)0x06)  /* COMP1 Alternate Function mapping   */

+

+/**

+  * @brief   AF 7 selection

+  */

+#define GPIO_AF7_USART1        ((uint8_t)0x07)  /* USART1 Alternate Function mapping     */

+#define GPIO_AF7_USART2        ((uint8_t)0x07)  /* USART2 Alternate Function mapping     */

+#define GPIO_AF7_USART3        ((uint8_t)0x07)  /* USART3 Alternate Function mapping     */

+

+/**

+  * @brief   AF 8 selection

+  */

+#define GPIO_AF8_LPUART1       ((uint8_t)0x08)  /* LPUART1 Alternate Function mapping */

+

+/**

+  * @brief   AF 9 selection

+  */

+#define GPIO_AF9_TSC           ((uint8_t)0x09)  /* TSC Alternate Function mapping   */

+

+/**

+  * @brief   AF 10 selection

+  */

+#define GPIO_AF10_USB_FS       ((uint8_t)0x0A)  /* USB_FS Alternate Function mapping */

+#define GPIO_AF10_QUADSPI      ((uint8_t)0x0A)  /* QUADSPI Alternate Function mapping */

+

+/**

+  * @brief   AF 12 selection

+  */

+#define GPIO_AF12_COMP1        ((uint8_t)0x0C)  /* COMP1 Alternate Function mapping   */

+

+

+/**

+  * @brief   AF 14 selection

+  */

+#define GPIO_AF14_TIM2         ((uint8_t)0x0E)  /* TIM2 Alternate Function mapping */

+#define GPIO_AF14_TIM15        ((uint8_t)0x0E)  /* TIM15 Alternate Function mapping */

+#define GPIO_AF14_TIM16        ((uint8_t)0x0E)  /* TIM16 Alternate Function mapping */

+#define GPIO_AF14_LPTIM2       ((uint8_t)0x0E)  /* LPTIM2 Alternate Function mapping */

+

+/**

+  * @brief   AF 15 selection

+  */

+#define GPIO_AF15_EVENTOUT     ((uint8_t)0x0F)  /* EVENTOUT Alternate Function mapping */

+

+#define IS_GPIO_AF(AF)   ((AF) <= (uint8_t)0x0F)

+

+#endif /* STM32L412xx || STM32L422xx */

+

+#if defined(STM32L431xx) || defined(STM32L432xx) || defined(STM32L433xx) || defined(STM32L442xx) || defined(STM32L443xx)

+/*--------------STM32L431xx/STM32L432xx/STM32L433xx/STM32L442xx/STM32L443xx---*/

+/**

+  * @brief   AF 0 selection

+  */

+#define GPIO_AF0_RTC_50Hz      ((uint8_t)0x00)  /* RTC_50Hz Alternate Function mapping                       */

+#define GPIO_AF0_MCO           ((uint8_t)0x00)  /* MCO (MCO1 and MCO2) Alternate Function mapping            */

+#define GPIO_AF0_SWJ           ((uint8_t)0x00)  /* SWJ (SWD and JTAG) Alternate Function mapping             */

+#if defined(STM32L433xx) || defined(STM32L443xx)

+#define GPIO_AF0_LCDBIAS       ((uint8_t)0x00)  /* LCDBIAS Alternate Function mapping                          */

+#endif /* STM32L433xx || STM32L443xx */

+#define GPIO_AF0_TRACE         ((uint8_t)0x00)  /* TRACE Alternate Function mapping                          */

+

+/**

+  * @brief   AF 1 selection

+  */

+#define GPIO_AF1_TIM1          ((uint8_t)0x01)  /* TIM1 Alternate Function mapping */

+#define GPIO_AF1_TIM2          ((uint8_t)0x01)  /* TIM2 Alternate Function mapping */

+#define GPIO_AF1_LPTIM1        ((uint8_t)0x01)  /* LPTIM1 Alternate Function mapping */

+#define GPIO_AF1_IR            ((uint8_t)0x01)  /* IR Alternate Function mapping */

+

+/**

+  * @brief   AF 2 selection

+  */

+#define GPIO_AF2_TIM1          ((uint8_t)0x02)  /* TIM1 Alternate Function mapping */

+#define GPIO_AF2_TIM2          ((uint8_t)0x02)  /* TIM2 Alternate Function mapping */

+

+/**

+  * @brief   AF 3 selection

+  */

+#define GPIO_AF3_USART2        ((uint8_t)0x03)  /* USART1 Alternate Function mapping */

+#define GPIO_AF3_TIM1_COMP2    ((uint8_t)0x03)  /* TIM1/COMP2 Break in Alternate Function mapping  */

+#define GPIO_AF3_TIM1_COMP1    ((uint8_t)0x03)  /* TIM1/COMP1 Break in Alternate Function mapping  */

+

+/**

+  * @brief   AF 4 selection

+  */

+#define GPIO_AF4_I2C1          ((uint8_t)0x04)  /* I2C1 Alternate Function mapping   */

+#define GPIO_AF4_I2C2          ((uint8_t)0x04)  /* I2C2 Alternate Function mapping   */

+#define GPIO_AF4_I2C3          ((uint8_t)0x04)  /* I2C3 Alternate Function mapping   */

+

+/**

+  * @brief   AF 5 selection

+  */

+#define GPIO_AF5_SPI1          ((uint8_t)0x05)  /* SPI1 Alternate Function mapping   */

+#define GPIO_AF5_SPI2          ((uint8_t)0x05)  /* SPI2 Alternate Function mapping   */

+

+/**

+  * @brief   AF 6 selection

+  */

+#define GPIO_AF6_SPI3          ((uint8_t)0x06)  /* SPI3 Alternate Function mapping   */

+#define GPIO_AF6_COMP1         ((uint8_t)0x06)  /* COMP1 Alternate Function mapping   */

+

+/**

+  * @brief   AF 7 selection

+  */

+#define GPIO_AF7_USART1        ((uint8_t)0x07)  /* USART1 Alternate Function mapping     */

+#define GPIO_AF7_USART2        ((uint8_t)0x07)  /* USART2 Alternate Function mapping     */

+#define GPIO_AF7_USART3        ((uint8_t)0x07)  /* USART3 Alternate Function mapping     */

+

+/**

+  * @brief   AF 8 selection

+  */

+#define GPIO_AF8_LPUART1       ((uint8_t)0x08)  /* LPUART1 Alternate Function mapping */

+

+/**

+  * @brief   AF 9 selection

+  */

+#define GPIO_AF9_CAN1          ((uint8_t)0x09)  /* CAN1 Alternate Function mapping    */

+#define GPIO_AF9_TSC           ((uint8_t)0x09)  /* TSC Alternate Function mapping   */

+

+/**

+  * @brief   AF 10 selection

+  */

+#if defined(STM32L432xx) || defined(STM32L433xx) || defined(STM32L442xx) || defined(STM32L443xx)

+#define GPIO_AF10_USB_FS       ((uint8_t)0x0A)  /* USB_FS Alternate Function mapping */

+#endif /* STM32L432xx || STM32L433xx || STM32L442xx || STM32L443xx */

+#define GPIO_AF10_QUADSPI      ((uint8_t)0x0A)  /* QUADSPI Alternate Function mapping */

+

+#if defined(STM32L433xx) || defined(STM32L443xx)

+/**

+  * @brief   AF 11 selection

+  */

+#define GPIO_AF11_LCD          ((uint8_t)0x0B)  /* LCD Alternate Function mapping */

+#endif /* STM32L433xx || STM32L443xx */

+

+/**

+  * @brief   AF 12 selection

+  */

+#define GPIO_AF12_SWPMI1       ((uint8_t)0x0C)  /* SWPMI1 Alternate Function mapping  */

+#define GPIO_AF12_COMP1        ((uint8_t)0x0C)  /* COMP1 Alternate Function mapping   */

+#define GPIO_AF12_COMP2        ((uint8_t)0x0C)  /* COMP2 Alternate Function mapping   */

+#define GPIO_AF12_SDMMC1       ((uint8_t)0x0C)  /* SDMMC1 Alternate Function mapping  */

+

+/**

+  * @brief   AF 13 selection

+  */

+#define GPIO_AF13_SAI1         ((uint8_t)0x0D)  /* SAI1 Alternate Function mapping */

+

+/**

+  * @brief   AF 14 selection

+  */

+#define GPIO_AF14_TIM2         ((uint8_t)0x0E)  /* TIM2 Alternate Function mapping */

+#define GPIO_AF14_TIM15        ((uint8_t)0x0E)  /* TIM15 Alternate Function mapping */

+#define GPIO_AF14_TIM16        ((uint8_t)0x0E)  /* TIM16 Alternate Function mapping */

+#define GPIO_AF14_LPTIM2       ((uint8_t)0x0E)  /* LPTIM2 Alternate Function mapping */

+

+/**

+  * @brief   AF 15 selection

+  */

+#define GPIO_AF15_EVENTOUT     ((uint8_t)0x0F)  /* EVENTOUT Alternate Function mapping */

+

+#define IS_GPIO_AF(AF)   ((AF) <= (uint8_t)0x0F)

+

+#endif /* STM32L431xx || STM32L432xx || STM32L433xx || STM32L442xx || STM32L443xx */

+

+#if defined(STM32L451xx) || defined(STM32L452xx) || defined(STM32L462xx)

+/*--------------STM32L451xx/STM32L452xx/STM32L462xx---------------------------*/

+/**

+  * @brief   AF 0 selection

+  */

+#define GPIO_AF0_RTC_50Hz      ((uint8_t)0x00)  /* RTC_50Hz Alternate Function mapping                       */

+#define GPIO_AF0_MCO           ((uint8_t)0x00)  /* MCO (MCO1 and MCO2) Alternate Function mapping            */

+#define GPIO_AF0_SWJ           ((uint8_t)0x00)  /* SWJ (SWD and JTAG) Alternate Function mapping             */

+#define GPIO_AF0_TRACE         ((uint8_t)0x00)  /* TRACE Alternate Function mapping                          */

+

+/**

+  * @brief   AF 1 selection

+  */

+#define GPIO_AF1_TIM1          ((uint8_t)0x01)  /* TIM1 Alternate Function mapping */

+#define GPIO_AF1_TIM2          ((uint8_t)0x01)  /* TIM2 Alternate Function mapping */

+#define GPIO_AF1_LPTIM1        ((uint8_t)0x01)  /* LPTIM1 Alternate Function mapping */

+#define GPIO_AF1_IR            ((uint8_t)0x01)  /* IR Alternate Function mapping */

+

+/**

+  * @brief   AF 2 selection

+  */

+#define GPIO_AF2_TIM1          ((uint8_t)0x02)  /* TIM1 Alternate Function mapping */

+#define GPIO_AF2_TIM2          ((uint8_t)0x02)  /* TIM2 Alternate Function mapping */

+#define GPIO_AF2_TIM3          ((uint8_t)0x02)  /* TIM3 Alternate Function mapping */

+#define GPIO_AF2_I2C4          ((uint8_t)0x02)  /* I2C4 Alternate Function mapping */

+

+/**

+  * @brief   AF 3 selection

+  */

+#define GPIO_AF3_TIM1_COMP2    ((uint8_t)0x03)  /* TIM1/COMP2 Break in Alternate Function mapping  */

+#define GPIO_AF3_TIM1_COMP1    ((uint8_t)0x03)  /* TIM1/COMP1 Break in Alternate Function mapping  */

+#define GPIO_AF3_USART2        ((uint8_t)0x03)  /* USART2 Alternate Function mapping     */

+#define GPIO_AF3_CAN1          ((uint8_t)0x03)  /* CAN1 Alternate Function mapping  */

+#define GPIO_AF3_I2C4          ((uint8_t)0x03)  /* I2C4 Alternate Function mapping */

+

+/**

+  * @brief   AF 4 selection

+  */

+#define GPIO_AF4_I2C1          ((uint8_t)0x04)  /* I2C1 Alternate Function mapping   */

+#define GPIO_AF4_I2C2          ((uint8_t)0x04)  /* I2C2 Alternate Function mapping   */

+#define GPIO_AF4_I2C3          ((uint8_t)0x04)  /* I2C3 Alternate Function mapping   */

+#define GPIO_AF4_I2C4          ((uint8_t)0x04)  /* I2C4 Alternate Function mapping   */

+

+/**

+  * @brief   AF 5 selection

+  */

+#define GPIO_AF5_SPI1          ((uint8_t)0x05)  /* SPI1 Alternate Function mapping   */

+#define GPIO_AF5_SPI2          ((uint8_t)0x05)  /* SPI2 Alternate Function mapping   */

+#define GPIO_AF5_I2C4          ((uint8_t)0x05)  /* I2C4 Alternate Function mapping   */

+

+/**

+  * @brief   AF 6 selection

+  */

+#define GPIO_AF6_SPI3          ((uint8_t)0x06)  /* SPI3 Alternate Function mapping   */

+#define GPIO_AF6_DFSDM1        ((uint8_t)0x06)  /* DFSDM1 Alternate Function mapping */

+#define GPIO_AF6_COMP1         ((uint8_t)0x06)  /* COMP1 Alternate Function mapping   */

+

+/**

+  * @brief   AF 7 selection

+  */

+#define GPIO_AF7_USART1        ((uint8_t)0x07)  /* USART1 Alternate Function mapping     */

+#define GPIO_AF7_USART2        ((uint8_t)0x07)  /* USART2 Alternate Function mapping     */

+#define GPIO_AF7_USART3        ((uint8_t)0x07)  /* USART3 Alternate Function mapping     */

+

+/**

+  * @brief   AF 8 selection

+  */

+#define GPIO_AF8_UART4         ((uint8_t)0x08)  /* UART4 Alternate Function mapping   */

+#define GPIO_AF8_LPUART1       ((uint8_t)0x08)  /* LPUART1 Alternate Function mapping */

+#define GPIO_AF8_CAN1          ((uint8_t)0x08)  /* CAN1 Alternate Function mapping  */

+

+

+/**

+  * @brief   AF 9 selection

+  */

+#define GPIO_AF9_CAN1          ((uint8_t)0x09)  /* CAN1 Alternate Function mapping  */

+#define GPIO_AF9_TSC           ((uint8_t)0x09)  /* TSC Alternate Function mapping   */

+

+/**

+  * @brief   AF 10 selection

+  */

+#if defined(STM32L452xx) || defined(STM32L462xx)

+#define GPIO_AF10_USB_FS       ((uint8_t)0x0A)  /* USB_FS Alternate Function mapping */

+#endif /* STM32L452xx || STM32L462xx */

+#define GPIO_AF10_QUADSPI      ((uint8_t)0x0A)  /* QUADSPI Alternate Function mapping */

+#define GPIO_AF10_CAN1         ((uint8_t)0x0A)  /* CAN1 Alternate Function mapping  */

+

+/**

+  * @brief   AF 11 selection

+  */

+

+/**

+  * @brief   AF 12 selection

+  */

+#define GPIO_AF12_COMP1        ((uint8_t)0x0C)  /* COMP1 Alternate Function mapping   */

+#define GPIO_AF12_COMP2        ((uint8_t)0x0C)  /* COMP2 Alternate Function mapping   */

+#define GPIO_AF12_SDMMC1       ((uint8_t)0x0C)  /* SDMMC1 Alternate Function mapping  */

+

+/**

+  * @brief   AF 13 selection

+  */

+#define GPIO_AF13_SAI1         ((uint8_t)0x0D)  /* SAI1 Alternate Function mapping */

+

+/**

+  * @brief   AF 14 selection

+  */

+#define GPIO_AF14_TIM2         ((uint8_t)0x0E)  /* TIM2 Alternate Function mapping */

+#define GPIO_AF14_TIM15        ((uint8_t)0x0E)  /* TIM15 Alternate Function mapping */

+#define GPIO_AF14_TIM16        ((uint8_t)0x0E)  /* TIM16 Alternate Function mapping */

+#define GPIO_AF14_TIM17        ((uint8_t)0x0E)  /* TIM17 Alternate Function mapping */

+#define GPIO_AF14_LPTIM2       ((uint8_t)0x0E)  /* LPTIM2 Alternate Function mapping */

+

+/**

+  * @brief   AF 15 selection

+  */

+#define GPIO_AF15_EVENTOUT     ((uint8_t)0x0F)  /* EVENTOUT Alternate Function mapping */

+

+#define IS_GPIO_AF(AF)   ((AF) <= (uint8_t)0x0F)

+

+#endif /* STM32L451xx || STM32L452xx || STM32L462xx */

+

+#if defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx)

+/*--------------STM32L471xx/STM32L475xx/STM32L476xx/STM32L485xx/STM32L486xx---*/

+/**

+  * @brief   AF 0 selection

+  */

+#define GPIO_AF0_RTC_50Hz      ((uint8_t)0x00)  /* RTC_50Hz Alternate Function mapping                       */

+#define GPIO_AF0_MCO           ((uint8_t)0x00)  /* MCO (MCO1 and MCO2) Alternate Function mapping            */

+#define GPIO_AF0_SWJ           ((uint8_t)0x00)  /* SWJ (SWD and JTAG) Alternate Function mapping             */

+#if defined(STM32L476xx) || defined(STM32L486xx)

+#define GPIO_AF0_LCDBIAS       ((uint8_t)0x00)  /* LCDBIAS Alternate Function mapping                        */

+#endif /* STM32L476xx || STM32L486xx */

+#define GPIO_AF0_TRACE         ((uint8_t)0x00)  /* TRACE Alternate Function mapping                          */

+

+/**

+  * @brief   AF 1 selection

+  */

+#define GPIO_AF1_TIM1          ((uint8_t)0x01)  /* TIM1 Alternate Function mapping */

+#define GPIO_AF1_TIM2          ((uint8_t)0x01)  /* TIM2 Alternate Function mapping */

+#define GPIO_AF1_TIM5          ((uint8_t)0x01)  /* TIM5 Alternate Function mapping */

+#define GPIO_AF1_TIM8          ((uint8_t)0x01)  /* TIM8 Alternate Function mapping */

+#define GPIO_AF1_LPTIM1        ((uint8_t)0x01)  /* LPTIM1 Alternate Function mapping */

+#define GPIO_AF1_IR            ((uint8_t)0x01)  /* IR Alternate Function mapping */

+

+/**

+  * @brief   AF 2 selection

+  */

+#define GPIO_AF2_TIM1          ((uint8_t)0x02)  /* TIM1 Alternate Function mapping */

+#define GPIO_AF2_TIM2          ((uint8_t)0x02)  /* TIM2 Alternate Function mapping */

+#define GPIO_AF2_TIM3          ((uint8_t)0x02)  /* TIM3 Alternate Function mapping */

+#define GPIO_AF2_TIM4          ((uint8_t)0x02)  /* TIM4 Alternate Function mapping */

+#define GPIO_AF2_TIM5          ((uint8_t)0x02)  /* TIM5 Alternate Function mapping */

+

+/**

+  * @brief   AF 3 selection

+  */

+#define GPIO_AF3_TIM8          ((uint8_t)0x03)  /* TIM8 Alternate Function mapping  */

+#define GPIO_AF3_TIM1_COMP2    ((uint8_t)0x03)  /* TIM1/COMP2 Break in Alternate Function mapping  */

+#define GPIO_AF3_TIM1_COMP1    ((uint8_t)0x03)  /* TIM1/COMP1 Break in Alternate Function mapping  */

+

+/**

+  * @brief   AF 4 selection

+  */

+#define GPIO_AF4_I2C1          ((uint8_t)0x04)  /* I2C1 Alternate Function mapping   */

+#define GPIO_AF4_I2C2          ((uint8_t)0x04)  /* I2C2 Alternate Function mapping   */

+#define GPIO_AF4_I2C3          ((uint8_t)0x04)  /* I2C3 Alternate Function mapping   */

+

+/**

+  * @brief   AF 5 selection

+  */

+#define GPIO_AF5_SPI1          ((uint8_t)0x05)  /* SPI1 Alternate Function mapping   */

+#define GPIO_AF5_SPI2          ((uint8_t)0x05)  /* SPI2 Alternate Function mapping   */

+

+/**

+  * @brief   AF 6 selection

+  */

+#define GPIO_AF6_SPI3          ((uint8_t)0x06)  /* SPI3 Alternate Function mapping   */

+#define GPIO_AF6_DFSDM1        ((uint8_t)0x06)  /* DFSDM1 Alternate Function mapping */

+

+/**

+  * @brief   AF 7 selection

+  */

+#define GPIO_AF7_USART1        ((uint8_t)0x07)  /* USART1 Alternate Function mapping     */

+#define GPIO_AF7_USART2        ((uint8_t)0x07)  /* USART2 Alternate Function mapping     */

+#define GPIO_AF7_USART3        ((uint8_t)0x07)  /* USART3 Alternate Function mapping     */

+

+/**

+  * @brief   AF 8 selection

+  */

+#define GPIO_AF8_UART4         ((uint8_t)0x08)  /* UART4 Alternate Function mapping   */

+#define GPIO_AF8_UART5         ((uint8_t)0x08)  /* UART5 Alternate Function mapping   */

+#define GPIO_AF8_LPUART1       ((uint8_t)0x08)  /* LPUART1 Alternate Function mapping */

+

+

+/**

+  * @brief   AF 9 selection

+  */

+#define GPIO_AF9_CAN1          ((uint8_t)0x09)  /* CAN1 Alternate Function mapping  */

+#define GPIO_AF9_TSC           ((uint8_t)0x09)  /* TSC Alternate Function mapping   */

+

+/**

+  * @brief   AF 10 selection

+  */

+#if defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx)

+#define GPIO_AF10_OTG_FS       ((uint8_t)0x0A)  /* OTG_FS Alternate Function mapping */

+#endif /* STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx */

+#define GPIO_AF10_QUADSPI      ((uint8_t)0x0A)  /* QUADSPI Alternate Function mapping */

+

+#if defined(STM32L476xx) || defined(STM32L486xx)

+/**

+  * @brief   AF 11 selection

+  */

+#define GPIO_AF11_LCD          ((uint8_t)0x0B)  /* LCD Alternate Function mapping */

+#endif /* STM32L476xx || STM32L486xx */

+

+/**

+  * @brief   AF 12 selection

+  */

+#define GPIO_AF12_FMC          ((uint8_t)0x0C)  /* FMC Alternate Function mapping     */

+#define GPIO_AF12_SWPMI1       ((uint8_t)0x0C)  /* SWPMI1 Alternate Function mapping  */

+#define GPIO_AF12_COMP1        ((uint8_t)0x0C)  /* COMP1 Alternate Function mapping   */

+#define GPIO_AF12_COMP2        ((uint8_t)0x0C)  /* COMP2 Alternate Function mapping   */

+#define GPIO_AF12_SDMMC1       ((uint8_t)0x0C)  /* SDMMC1 Alternate Function mapping  */

+

+/**

+  * @brief   AF 13 selection

+  */

+#define GPIO_AF13_SAI1         ((uint8_t)0x0D)  /* SAI1 Alternate Function mapping */

+#define GPIO_AF13_SAI2         ((uint8_t)0x0D)  /* SAI2 Alternate Function mapping */

+#define GPIO_AF13_TIM8_COMP2   ((uint8_t)0x0D)  /* TIM8/COMP2 Break in Alternate Function mapping  */

+#define GPIO_AF13_TIM8_COMP1   ((uint8_t)0x0D)  /* TIM8/COMP1 Break in Alternate Function mapping  */

+

+/**

+  * @brief   AF 14 selection

+  */

+#define GPIO_AF14_TIM2         ((uint8_t)0x0E)  /* TIM2 Alternate Function mapping */

+#define GPIO_AF14_TIM15        ((uint8_t)0x0E)  /* TIM15 Alternate Function mapping */

+#define GPIO_AF14_TIM16        ((uint8_t)0x0E)  /* TIM16 Alternate Function mapping */

+#define GPIO_AF14_TIM17        ((uint8_t)0x0E)  /* TIM17 Alternate Function mapping */

+#define GPIO_AF14_LPTIM2       ((uint8_t)0x0E)  /* LPTIM2 Alternate Function mapping */

+#define GPIO_AF14_TIM8_COMP1   ((uint8_t)0x0E)  /* TIM8/COMP1 Break in Alternate Function mapping  */

+

+/**

+  * @brief   AF 15 selection

+  */

+#define GPIO_AF15_EVENTOUT     ((uint8_t)0x0F)  /* EVENTOUT Alternate Function mapping */

+

+#define IS_GPIO_AF(AF)   ((AF) <= (uint8_t)0x0F)

+

+#endif /* STM32L471xx || STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx */

+

+#if defined(STM32L496xx) || defined(STM32L4A6xx)

+/*--------------------------------STM32L496xx/STM32L4A6xx---------------------*/

+/**

+  * @brief   AF 0 selection

+  */

+#define GPIO_AF0_RTC_50Hz      ((uint8_t)0x00)  /* RTC_50Hz Alternate Function mapping                       */

+#define GPIO_AF0_MCO           ((uint8_t)0x00)  /* MCO (MCO1 and MCO2) Alternate Function mapping            */

+#define GPIO_AF0_SWJ           ((uint8_t)0x00)  /* SWJ (SWD and JTAG) Alternate Function mapping             */

+#define GPIO_AF0_TRACE         ((uint8_t)0x00)  /* TRACE Alternate Function mapping                          */

+

+/**

+  * @brief   AF 1 selection

+  */

+#define GPIO_AF1_TIM1          ((uint8_t)0x01)  /* TIM1 Alternate Function mapping */

+#define GPIO_AF1_TIM2          ((uint8_t)0x01)  /* TIM2 Alternate Function mapping */

+#define GPIO_AF1_TIM5          ((uint8_t)0x01)  /* TIM5 Alternate Function mapping */

+#define GPIO_AF1_TIM8          ((uint8_t)0x01)  /* TIM8 Alternate Function mapping */

+#define GPIO_AF1_LPTIM1        ((uint8_t)0x01)  /* LPTIM1 Alternate Function mapping */

+#define GPIO_AF1_IR            ((uint8_t)0x01)  /* IR Alternate Function mapping */

+

+/**

+  * @brief   AF 2 selection

+  */

+#define GPIO_AF2_TIM1          ((uint8_t)0x02)  /* TIM1 Alternate Function mapping */

+#define GPIO_AF2_TIM2          ((uint8_t)0x02)  /* TIM2 Alternate Function mapping */

+#define GPIO_AF2_TIM3          ((uint8_t)0x02)  /* TIM3 Alternate Function mapping */

+#define GPIO_AF2_TIM4          ((uint8_t)0x02)  /* TIM4 Alternate Function mapping */

+#define GPIO_AF2_TIM5          ((uint8_t)0x02)  /* TIM5 Alternate Function mapping */

+#define GPIO_AF2_I2C4          ((uint8_t)0x02)  /* I2C4 Alternate Function mapping */

+

+/**

+  * @brief   AF 3 selection

+  */

+#define GPIO_AF3_TIM8          ((uint8_t)0x03)  /* TIM8 Alternate Function mapping  */

+#define GPIO_AF3_TIM1_COMP2    ((uint8_t)0x03)  /* TIM1/COMP2 Break in Alternate Function mapping  */

+#define GPIO_AF3_TIM1_COMP1    ((uint8_t)0x03)  /* TIM1/COMP1 Break in Alternate Function mapping  */

+#define GPIO_AF3_CAN2          ((uint8_t)0x03)  /* CAN2 Alternate Function mapping    */

+#define GPIO_AF3_I2C4          ((uint8_t)0x03)  /* I2C4 Alternate Function mapping */

+#define GPIO_AF3_QUADSPI       ((uint8_t)0x03)  /* QUADSPI Alternate Function mapping */

+#define GPIO_AF3_SPI2          ((uint8_t)0x03)  /* SPI2 Alternate Function mapping */

+#define GPIO_AF3_USART2        ((uint8_t)0x03)  /* USART2 Alternate Function mapping */

+

+/**

+  * @brief   AF 4 selection

+  */

+#define GPIO_AF4_I2C1          ((uint8_t)0x04)  /* I2C1 Alternate Function mapping   */

+#define GPIO_AF4_I2C2          ((uint8_t)0x04)  /* I2C2 Alternate Function mapping   */

+#define GPIO_AF4_I2C3          ((uint8_t)0x04)  /* I2C3 Alternate Function mapping   */

+#define GPIO_AF4_I2C4          ((uint8_t)0x04)  /* I2C4 Alternate Function mapping   */

+#define GPIO_AF4_DCMI          ((uint8_t)0x04)  /* DCMI Alternate Function mapping   */

+

+/**

+  * @brief   AF 5 selection

+  */

+#define GPIO_AF5_SPI1          ((uint8_t)0x05)  /* SPI1 Alternate Function mapping   */

+#define GPIO_AF5_SPI2          ((uint8_t)0x05)  /* SPI2 Alternate Function mapping   */

+#define GPIO_AF5_DCMI          ((uint8_t)0x05)  /* DCMI Alternate Function mapping   */

+#define GPIO_AF5_I2C4          ((uint8_t)0x05)  /* I2C4 Alternate Function mapping */

+#define GPIO_AF5_QUADSPI       ((uint8_t)0x05)  /* QUADSPI Alternate Function mapping */

+

+/**

+  * @brief   AF 6 selection

+  */

+#define GPIO_AF6_SPI3          ((uint8_t)0x06)  /* SPI3 Alternate Function mapping   */

+#define GPIO_AF6_DFSDM1        ((uint8_t)0x06)  /* DFSDM1 Alternate Function mapping */

+#define GPIO_AF6_I2C3          ((uint8_t)0x06)  /* I2C3 Alternate Function mapping */

+

+/**

+  * @brief   AF 7 selection

+  */

+#define GPIO_AF7_USART1        ((uint8_t)0x07)  /* USART1 Alternate Function mapping     */

+#define GPIO_AF7_USART2        ((uint8_t)0x07)  /* USART2 Alternate Function mapping     */

+#define GPIO_AF7_USART3        ((uint8_t)0x07)  /* USART3 Alternate Function mapping     */

+

+/**

+  * @brief   AF 8 selection

+  */

+#define GPIO_AF8_UART4         ((uint8_t)0x08)  /* UART4 Alternate Function mapping   */

+#define GPIO_AF8_UART5         ((uint8_t)0x08)  /* UART5 Alternate Function mapping   */

+#define GPIO_AF8_LPUART1       ((uint8_t)0x08)  /* LPUART1 Alternate Function mapping */

+#define GPIO_AF8_CAN2          ((uint8_t)0x08)  /* CAN2 Alternate Function mapping    */

+

+/**

+  * @brief   AF 9 selection

+  */

+#define GPIO_AF9_CAN1          ((uint8_t)0x09)  /* CAN1 Alternate Function mapping  */

+#define GPIO_AF9_TSC           ((uint8_t)0x09)  /* TSC Alternate Function mapping   */

+

+/**

+  * @brief   AF 10 selection

+  */

+#define GPIO_AF10_OTG_FS       ((uint8_t)0x0A)  /* OTG_FS Alternate Function mapping */

+#define GPIO_AF10_QUADSPI      ((uint8_t)0x0A)  /* QUADSPI Alternate Function mapping */

+#define GPIO_AF10_CAN2         ((uint8_t)0x0A)  /* CAN2 Alternate Function mapping */

+#define GPIO_AF10_DCMI         ((uint8_t)0x0A)  /* DCMI Alternate Function mapping */

+

+/**

+  * @brief   AF 11 selection

+  */

+#define GPIO_AF11_LCD          ((uint8_t)0x0B)  /* LCD Alternate Function mapping */

+

+/**

+  * @brief   AF 12 selection

+  */

+#define GPIO_AF12_FMC          ((uint8_t)0x0C)  /* FMC Alternate Function mapping     */

+#define GPIO_AF12_SWPMI1       ((uint8_t)0x0C)  /* SWPMI1 Alternate Function mapping  */

+#define GPIO_AF12_COMP1        ((uint8_t)0x0C)  /* COMP1 Alternate Function mapping   */

+#define GPIO_AF12_COMP2        ((uint8_t)0x0C)  /* COMP2 Alternate Function mapping   */

+#define GPIO_AF12_SDMMC1       ((uint8_t)0x0C)  /* SDMMC1 Alternate Function mapping  */

+#define GPIO_AF12_TIM1_COMP2   ((uint8_t)0x0C)  /* TIM1/COMP2 Break in Alternate Function mapping  */

+#define GPIO_AF12_TIM1_COMP1   ((uint8_t)0x0C)  /* TIM1/COMP1 Break in Alternate Function mapping  */

+#define GPIO_AF12_TIM8_COMP2   ((uint8_t)0x0C)  /* TIM8/COMP2 Break in Alternate Function mapping  */

+

+/**

+  * @brief   AF 13 selection

+  */

+#define GPIO_AF13_SAI1         ((uint8_t)0x0D)  /* SAI1 Alternate Function mapping */

+#define GPIO_AF13_SAI2         ((uint8_t)0x0D)  /* SAI2 Alternate Function mapping */

+#define GPIO_AF13_TIM8_COMP2   ((uint8_t)0x0D)  /* TIM8/COMP2 Break in Alternate Function mapping  */

+#define GPIO_AF13_TIM8_COMP1   ((uint8_t)0x0D)  /* TIM8/COMP1 Break in Alternate Function mapping  */

+

+/**

+  * @brief   AF 14 selection

+  */

+#define GPIO_AF14_TIM2         ((uint8_t)0x0E)  /* TIM2 Alternate Function mapping */

+#define GPIO_AF14_TIM15        ((uint8_t)0x0E)  /* TIM15 Alternate Function mapping */

+#define GPIO_AF14_TIM16        ((uint8_t)0x0E)  /* TIM16 Alternate Function mapping */

+#define GPIO_AF14_TIM17        ((uint8_t)0x0E)  /* TIM17 Alternate Function mapping */

+#define GPIO_AF14_LPTIM2       ((uint8_t)0x0E)  /* LPTIM2 Alternate Function mapping */

+#define GPIO_AF14_TIM8_COMP1   ((uint8_t)0x0E)  /* TIM8/COMP1 Break in Alternate Function mapping  */

+

+/**

+  * @brief   AF 15 selection

+  */

+#define GPIO_AF15_EVENTOUT     ((uint8_t)0x0F)  /* EVENTOUT Alternate Function mapping */

+

+#define IS_GPIO_AF(AF)   ((AF) <= (uint8_t)0x0F)

+

+#endif /* STM32L496xx || STM32L4A6xx */

+

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+/*---STM32L4R5xx/STM32L4R7xx/STM32L4R9xx/STM32L4S5xx/STM32L4S7xx/STM32L4S9xx--*/

+/**

+  * @brief   AF 0 selection

+  */

+#define GPIO_AF0_RTC_50Hz      ((uint8_t)0x00)  /* RTC_50Hz Alternate Function mapping                       */

+#define GPIO_AF0_MCO           ((uint8_t)0x00)  /* MCO (MCO1 and MCO2) Alternate Function mapping            */

+#define GPIO_AF0_SWJ           ((uint8_t)0x00)  /* SWJ (SWD and JTAG) Alternate Function mapping             */

+#define GPIO_AF0_TRACE         ((uint8_t)0x00)  /* TRACE Alternate Function mapping                          */

+

+/**

+  * @brief   AF 1 selection

+  */

+#define GPIO_AF1_TIM1          ((uint8_t)0x01)  /* TIM1 Alternate Function mapping */

+#define GPIO_AF1_TIM2          ((uint8_t)0x01)  /* TIM2 Alternate Function mapping */

+#define GPIO_AF1_TIM5          ((uint8_t)0x01)  /* TIM5 Alternate Function mapping */

+#define GPIO_AF1_TIM8          ((uint8_t)0x01)  /* TIM8 Alternate Function mapping */

+#define GPIO_AF1_LPTIM1        ((uint8_t)0x01)  /* LPTIM1 Alternate Function mapping */

+#define GPIO_AF1_IR            ((uint8_t)0x01)  /* IR Alternate Function mapping   */

+

+/**

+  * @brief   AF 2 selection

+  */

+#define GPIO_AF2_TIM1          ((uint8_t)0x02)  /* TIM1 Alternate Function mapping */

+#define GPIO_AF2_TIM2          ((uint8_t)0x02)  /* TIM2 Alternate Function mapping */

+#define GPIO_AF2_TIM3          ((uint8_t)0x02)  /* TIM3 Alternate Function mapping */

+#define GPIO_AF2_TIM4          ((uint8_t)0x02)  /* TIM4 Alternate Function mapping */

+#define GPIO_AF2_TIM5          ((uint8_t)0x02)  /* TIM5 Alternate Function mapping */

+

+/**

+  * @brief   AF 3 selection

+  */

+#define GPIO_AF3_I2C4          ((uint8_t)0x03)  /* I2C4 Alternate Function mapping   */

+#define GPIO_AF3_OCTOSPIM_P1   ((uint8_t)0x03)  /* OctoSPI Manager Port 1 Alternate Function mapping */

+#define GPIO_AF3_SAI1          ((uint8_t)0x03)  /* SAI1 Alternate Function mapping */

+#define GPIO_AF3_SPI2          ((uint8_t)0x03)  /* SPI2 Alternate Function mapping   */

+#define GPIO_AF3_TIM1_COMP1    ((uint8_t)0x03)  /* TIM1/COMP1 Break in Alternate Function mapping  */

+#define GPIO_AF3_TIM1_COMP2    ((uint8_t)0x03)  /* TIM1/COMP2 Break in Alternate Function mapping  */

+#define GPIO_AF3_TIM8          ((uint8_t)0x03)  /* TIM8 Alternate Function mapping   */

+#define GPIO_AF3_TIM8_COMP1    ((uint8_t)0x03)  /* TIM8/COMP1 Break in Alternate Function mapping  */

+#define GPIO_AF3_TIM8_COMP2    ((uint8_t)0x03)  /* TIM8/COMP2 Break in Alternate Function mapping  */

+#define GPIO_AF3_USART2        ((uint8_t)0x03)  /* USART2 Alternate Function mapping   */

+

+/**

+  * @brief   AF 4 selection

+  */

+#define GPIO_AF4_I2C1          ((uint8_t)0x04)  /* I2C1 Alternate Function mapping   */

+#define GPIO_AF4_I2C2          ((uint8_t)0x04)  /* I2C2 Alternate Function mapping   */

+#define GPIO_AF4_I2C3          ((uint8_t)0x04)  /* I2C3 Alternate Function mapping   */

+#define GPIO_AF4_I2C4          ((uint8_t)0x04)  /* I2C4 Alternate Function mapping   */

+#define GPIO_AF4_DCMI          ((uint8_t)0x04)  /* DCMI Alternate Function mapping   */

+

+/**

+  * @brief   AF 5 selection

+  */

+#define GPIO_AF5_DCMI          ((uint8_t)0x05)  /* DCMI Alternate Function mapping     */

+#define GPIO_AF5_DFSDM1        ((uint8_t)0x05)  /* DFSDM1 Alternate Function mapping   */

+#define GPIO_AF5_I2C4          ((uint8_t)0x05)  /* I2C4 Alternate Function mapping     */

+#define GPIO_AF5_OCTOSPIM_P1   ((uint8_t)0x05)  /* OctoSPI Manager Port 1 Alternate Function mapping */

+#define GPIO_AF5_OCTOSPIM_P2   ((uint8_t)0x05)  /* OctoSPI Manager Port 2 Alternate Function mapping */

+#define GPIO_AF5_SPI1          ((uint8_t)0x05)  /* SPI1 Alternate Function mapping     */

+#define GPIO_AF5_SPI2          ((uint8_t)0x05)  /* SPI2 Alternate Function mapping     */

+#define GPIO_AF5_SPI3          ((uint8_t)0x05)  /* SPI2 Alternate Function mapping     */

+

+/**

+  * @brief   AF 6 selection

+  */

+#define GPIO_AF6_DFSDM1        ((uint8_t)0x06)  /* DFSDM1 Alternate Function mapping */

+#define GPIO_AF6_I2C3          ((uint8_t)0x06)  /* I2C3 Alternate Function mapping   */

+#define GPIO_AF6_SPI3          ((uint8_t)0x06)  /* SPI3 Alternate Function mapping   */

+

+/**

+  * @brief   AF 7 selection

+  */

+#define GPIO_AF7_USART1        ((uint8_t)0x07)  /* USART1 Alternate Function mapping */

+#define GPIO_AF7_USART2        ((uint8_t)0x07)  /* USART2 Alternate Function mapping */

+#define GPIO_AF7_USART3        ((uint8_t)0x07)  /* USART3 Alternate Function mapping */

+

+/**

+  * @brief   AF 8 selection

+  */

+#define GPIO_AF8_LPUART1       ((uint8_t)0x08)  /* LPUART1 Alternate Function mapping */

+#define GPIO_AF8_SDMMC1        ((uint8_t)0x08)  /* SDMMC1 Alternate Function mapping  */

+#define GPIO_AF8_UART4         ((uint8_t)0x08)  /* UART4 Alternate Function mapping   */

+#define GPIO_AF8_UART5         ((uint8_t)0x08)  /* UART5 Alternate Function mapping   */

+

+/**

+  * @brief   AF 9 selection

+  */

+#define GPIO_AF9_CAN1          ((uint8_t)0x09)  /* CAN1 Alternate Function mapping  */

+#define GPIO_AF9_LTDC          ((uint8_t)0x09)  /* LTDC Alternate Function mapping  */

+#define GPIO_AF9_TSC           ((uint8_t)0x09)  /* TSC Alternate Function mapping   */

+

+/**

+  * @brief   AF 10 selection

+  */

+#define GPIO_AF10_DCMI         ((uint8_t)0x0A)  /* DCMI Alternate Function mapping     */

+#define GPIO_AF10_OCTOSPIM_P1  ((uint8_t)0x0A)  /* OctoSPI Manager Port 1 Alternate Function mapping */

+#define GPIO_AF10_OCTOSPIM_P2  ((uint8_t)0x0A)  /* OctoSPI Manager Port 2 Alternate Function mapping */

+#define GPIO_AF10_OTG_FS       ((uint8_t)0x0A)  /* OTG_FS Alternate Function mapping   */

+

+/**

+  * @brief   AF 11 selection

+  */

+#define GPIO_AF11_DSI          ((uint8_t)0x0B)  /* DSI Alternate Function mapping  */

+#define GPIO_AF11_LTDC         ((uint8_t)0x0B)  /* LTDC Alternate Function mapping */

+

+/**

+  * @brief   AF 12 selection

+  */

+#define GPIO_AF12_COMP1        ((uint8_t)0x0C)  /* COMP1 Alternate Function mapping   */

+#define GPIO_AF12_COMP2        ((uint8_t)0x0C)  /* COMP2 Alternate Function mapping   */

+#define GPIO_AF12_DSI          ((uint8_t)0x0C)  /* DSI Alternate Function mapping     */

+#define GPIO_AF12_FMC          ((uint8_t)0x0C)  /* FMC Alternate Function mapping     */

+#define GPIO_AF12_SDMMC1       ((uint8_t)0x0C)  /* SDMMC1 Alternate Function mapping  */

+#define GPIO_AF12_TIM1_COMP1   ((uint8_t)0x0C)  /* TIM1/COMP1 Break in Alternate Function mapping  */

+#define GPIO_AF12_TIM1_COMP2   ((uint8_t)0x0C)  /* TIM1/COMP2 Break in Alternate Function mapping  */

+#define GPIO_AF12_TIM8_COMP2   ((uint8_t)0x0C)  /* TIM8/COMP2 Break in Alternate Function mapping  */

+

+/**

+  * @brief   AF 13 selection

+  */

+#define GPIO_AF13_SAI1         ((uint8_t)0x0D)  /* SAI1 Alternate Function mapping */

+#define GPIO_AF13_SAI2         ((uint8_t)0x0D)  /* SAI2 Alternate Function mapping */

+#define GPIO_AF13_TIM8_COMP1   ((uint8_t)0x0D)  /* TIM8/COMP1 Break in Alternate Function mapping  */

+

+/**

+  * @brief   AF 14 selection

+  */

+#define GPIO_AF14_TIM15        ((uint8_t)0x0E)  /* TIM15 Alternate Function mapping  */

+#define GPIO_AF14_TIM16        ((uint8_t)0x0E)  /* TIM16 Alternate Function mapping  */

+#define GPIO_AF14_TIM17        ((uint8_t)0x0E)  /* TIM17 Alternate Function mapping  */

+#define GPIO_AF14_LPTIM2       ((uint8_t)0x0E)  /* LPTIM2 Alternate Function mapping */

+#define GPIO_AF14_TIM8_COMP2   ((uint8_t)0x0E)  /* TIM8/COMP2 Break in Alternate Function mapping   */

+

+/**

+  * @brief   AF 15 selection

+  */

+#define GPIO_AF15_EVENTOUT     ((uint8_t)0x0F)  /* EVENTOUT Alternate Function mapping */

+

+#define IS_GPIO_AF(AF)   ((AF) <= (uint8_t)0x0F)

+

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Exported macro ------------------------------------------------------------*/

+/** @defgroup GPIOEx_Exported_Macros GPIOEx Exported Macros

+  * @{

+  */

+

+/** @defgroup GPIOEx_Get_Port_Index GPIOEx_Get Port Index

+* @{

+  */

+#if defined(STM32L412xx) || defined(STM32L422xx)

+

+#define GPIO_GET_INDEX(__GPIOx__)    (((__GPIOx__) == (GPIOA))? 0uL :\

+                                      ((__GPIOx__) == (GPIOB))? 1uL :\

+                                      ((__GPIOx__) == (GPIOC))? 2uL :\

+                                      ((__GPIOx__) == (GPIOD))? 3uL : 7uL)

+

+#endif /* STM32L412xx || STM32L422xx */

+

+#if defined(STM32L431xx) || defined(STM32L433xx) || defined(STM32L443xx)

+

+#define GPIO_GET_INDEX(__GPIOx__)    (((__GPIOx__) == (GPIOA))? 0uL :\

+                                      ((__GPIOx__) == (GPIOB))? 1uL :\

+                                      ((__GPIOx__) == (GPIOC))? 2uL :\

+                                      ((__GPIOx__) == (GPIOD))? 3uL :\

+                                      ((__GPIOx__) == (GPIOE))? 4uL : 7uL)

+

+#endif /* STM32L431xx || STM32L433xx || STM32L443xx */

+

+#if defined(STM32L432xx) || defined(STM32L442xx)

+

+#define GPIO_GET_INDEX(__GPIOx__)    (((__GPIOx__) == (GPIOA))? 0uL :\

+                                      ((__GPIOx__) == (GPIOB))? 1uL :\

+                                      ((__GPIOx__) == (GPIOC))? 2uL : 7uL)

+

+#endif /* STM32L432xx || STM32L442xx */

+

+#if defined(STM32L451xx) || defined(STM32L452xx) || defined(STM32L462xx)

+

+#define GPIO_GET_INDEX(__GPIOx__)    (((__GPIOx__) == (GPIOA))? 0uL :\

+                                      ((__GPIOx__) == (GPIOB))? 1uL :\

+                                      ((__GPIOx__) == (GPIOC))? 2uL :\

+                                      ((__GPIOx__) == (GPIOD))? 3uL :\

+                                      ((__GPIOx__) == (GPIOE))? 4uL : 7uL)

+

+#endif /* STM32L451xx || STM32L452xx || STM32L462xx */

+

+#if defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx)

+

+#define GPIO_GET_INDEX(__GPIOx__)    (((__GPIOx__) == (GPIOA))? 0uL :\

+                                      ((__GPIOx__) == (GPIOB))? 1uL :\

+                                      ((__GPIOx__) == (GPIOC))? 2uL :\

+                                      ((__GPIOx__) == (GPIOD))? 3uL :\

+                                      ((__GPIOx__) == (GPIOE))? 4uL :\

+                                      ((__GPIOx__) == (GPIOF))? 5uL :\

+                                      ((__GPIOx__) == (GPIOG))? 6uL : 7uL)

+

+#endif /* STM32L471xx || STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx */

+

+#if defined(STM32L496xx) || defined(STM32L4A6xx)

+

+#define GPIO_GET_INDEX(__GPIOx__)    (((__GPIOx__) == (GPIOA))? 0uL :\

+                                      ((__GPIOx__) == (GPIOB))? 1uL :\

+                                      ((__GPIOx__) == (GPIOC))? 2uL :\

+                                      ((__GPIOx__) == (GPIOD))? 3uL :\

+                                      ((__GPIOx__) == (GPIOE))? 4uL :\

+                                      ((__GPIOx__) == (GPIOF))? 5uL :\

+                                      ((__GPIOx__) == (GPIOG))? 6uL :\

+                                      ((__GPIOx__) == (GPIOH))? 7uL : 8uL)

+

+#endif /* STM32L496xx || STM32L4A6xx */

+

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+

+#define GPIO_GET_INDEX(__GPIOx__)    (((__GPIOx__) == (GPIOA))? 0uL :\

+                                      ((__GPIOx__) == (GPIOB))? 1uL :\

+                                      ((__GPIOx__) == (GPIOC))? 2uL :\

+                                      ((__GPIOx__) == (GPIOD))? 3uL :\

+                                      ((__GPIOx__) == (GPIOE))? 4uL :\

+                                      ((__GPIOx__) == (GPIOF))? 5uL :\

+                                      ((__GPIOx__) == (GPIOG))? 6uL :\

+                                      ((__GPIOx__) == (GPIOH))? 7uL : 8uL)

+

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Exported functions --------------------------------------------------------*/

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* __STM32L4xx_HAL_GPIO_EX_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h
new file mode 100644
index 0000000..d69ccd1
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h
@@ -0,0 +1,782 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_i2c.h

+  * @author  MCD Application Team

+  * @brief   Header file of I2C HAL module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef STM32L4xx_HAL_I2C_H

+#define STM32L4xx_HAL_I2C_H

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup I2C

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+/** @defgroup I2C_Exported_Types I2C Exported Types

+  * @{

+  */

+

+/** @defgroup I2C_Configuration_Structure_definition I2C Configuration Structure definition

+  * @brief  I2C Configuration Structure definition

+  * @{

+  */

+typedef struct

+{

+  uint32_t Timing;              /*!< Specifies the I2C_TIMINGR_register value.

+                                  This parameter calculated by referring to I2C initialization

+                                         section in Reference manual */

+

+  uint32_t OwnAddress1;         /*!< Specifies the first device own address.

+                                  This parameter can be a 7-bit or 10-bit address. */

+

+  uint32_t AddressingMode;      /*!< Specifies if 7-bit or 10-bit addressing mode is selected.

+                                  This parameter can be a value of @ref I2C_ADDRESSING_MODE */

+

+  uint32_t DualAddressMode;     /*!< Specifies if dual addressing mode is selected.

+                                  This parameter can be a value of @ref I2C_DUAL_ADDRESSING_MODE */

+

+  uint32_t OwnAddress2;         /*!< Specifies the second device own address if dual addressing mode is selected

+                                  This parameter can be a 7-bit address. */

+

+  uint32_t OwnAddress2Masks;    /*!< Specifies the acknowledge mask address second device own address if dual addressing mode is selected

+                                  This parameter can be a value of @ref I2C_OWN_ADDRESS2_MASKS */

+

+  uint32_t GeneralCallMode;     /*!< Specifies if general call mode is selected.

+                                  This parameter can be a value of @ref I2C_GENERAL_CALL_ADDRESSING_MODE */

+

+  uint32_t NoStretchMode;       /*!< Specifies if nostretch mode is selected.

+                                  This parameter can be a value of @ref I2C_NOSTRETCH_MODE */

+

+} I2C_InitTypeDef;

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_state_structure_definition HAL state structure definition

+  * @brief  HAL State structure definition

+  * @note  HAL I2C State value coding follow below described bitmap :\n

+  *          b7-b6  Error information\n

+  *             00 : No Error\n

+  *             01 : Abort (Abort user request on going)\n

+  *             10 : Timeout\n

+  *             11 : Error\n

+  *          b5     Peripheral initialization status\n

+  *             0  : Reset (peripheral not initialized)\n

+  *             1  : Init done (peripheral initialized and ready to use. HAL I2C Init function called)\n

+  *          b4     (not used)\n

+  *             x  : Should be set to 0\n

+  *          b3\n

+  *             0  : Ready or Busy (No Listen mode ongoing)\n

+  *             1  : Listen (peripheral in Address Listen Mode)\n

+  *          b2     Intrinsic process state\n

+  *             0  : Ready\n

+  *             1  : Busy (peripheral busy with some configuration or internal operations)\n

+  *          b1     Rx state\n

+  *             0  : Ready (no Rx operation ongoing)\n

+  *             1  : Busy (Rx operation ongoing)\n

+  *          b0     Tx state\n

+  *             0  : Ready (no Tx operation ongoing)\n

+  *             1  : Busy (Tx operation ongoing)

+  * @{

+  */

+typedef enum

+{

+  HAL_I2C_STATE_RESET             = 0x00U,   /*!< Peripheral is not yet Initialized         */

+  HAL_I2C_STATE_READY             = 0x20U,   /*!< Peripheral Initialized and ready for use  */

+  HAL_I2C_STATE_BUSY              = 0x24U,   /*!< An internal process is ongoing            */

+  HAL_I2C_STATE_BUSY_TX           = 0x21U,   /*!< Data Transmission process is ongoing      */

+  HAL_I2C_STATE_BUSY_RX           = 0x22U,   /*!< Data Reception process is ongoing         */

+  HAL_I2C_STATE_LISTEN            = 0x28U,   /*!< Address Listen Mode is ongoing            */

+  HAL_I2C_STATE_BUSY_TX_LISTEN    = 0x29U,   /*!< Address Listen Mode and Data Transmission

+                                                 process is ongoing                         */

+  HAL_I2C_STATE_BUSY_RX_LISTEN    = 0x2AU,   /*!< Address Listen Mode and Data Reception

+                                                 process is ongoing                         */

+  HAL_I2C_STATE_ABORT             = 0x60U,   /*!< Abort user request ongoing                */

+  HAL_I2C_STATE_TIMEOUT           = 0xA0U,   /*!< Timeout state                             */

+  HAL_I2C_STATE_ERROR             = 0xE0U    /*!< Error                                     */

+

+} HAL_I2C_StateTypeDef;

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_mode_structure_definition HAL mode structure definition

+  * @brief  HAL Mode structure definition

+  * @note  HAL I2C Mode value coding follow below described bitmap :\n

+  *          b7     (not used)\n

+  *             x  : Should be set to 0\n

+  *          b6\n

+  *             0  : None\n

+  *             1  : Memory (HAL I2C communication is in Memory Mode)\n

+  *          b5\n

+  *             0  : None\n

+  *             1  : Slave (HAL I2C communication is in Slave Mode)\n

+  *          b4\n

+  *             0  : None\n

+  *             1  : Master (HAL I2C communication is in Master Mode)\n

+  *          b3-b2-b1-b0  (not used)\n

+  *             xxxx : Should be set to 0000

+  * @{

+  */

+typedef enum

+{

+  HAL_I2C_MODE_NONE               = 0x00U,   /*!< No I2C communication on going             */

+  HAL_I2C_MODE_MASTER             = 0x10U,   /*!< I2C communication is in Master Mode       */

+  HAL_I2C_MODE_SLAVE              = 0x20U,   /*!< I2C communication is in Slave Mode        */

+  HAL_I2C_MODE_MEM                = 0x40U    /*!< I2C communication is in Memory Mode       */

+

+} HAL_I2C_ModeTypeDef;

+

+/**

+  * @}

+  */

+

+/** @defgroup I2C_Error_Code_definition I2C Error Code definition

+  * @brief  I2C Error Code definition

+  * @{

+  */

+#define HAL_I2C_ERROR_NONE      (0x00000000U)    /*!< No error              */

+#define HAL_I2C_ERROR_BERR      (0x00000001U)    /*!< BERR error            */

+#define HAL_I2C_ERROR_ARLO      (0x00000002U)    /*!< ARLO error            */

+#define HAL_I2C_ERROR_AF        (0x00000004U)    /*!< ACKF error            */

+#define HAL_I2C_ERROR_OVR       (0x00000008U)    /*!< OVR error             */

+#define HAL_I2C_ERROR_DMA       (0x00000010U)    /*!< DMA transfer error    */

+#define HAL_I2C_ERROR_TIMEOUT   (0x00000020U)    /*!< Timeout error         */

+#define HAL_I2C_ERROR_SIZE      (0x00000040U)    /*!< Size Management error */

+#define HAL_I2C_ERROR_DMA_PARAM (0x00000080U)    /*!< DMA Parameter Error   */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+#define HAL_I2C_ERROR_INVALID_CALLBACK  (0x00000100U)    /*!< Invalid Callback error */

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+#define HAL_I2C_ERROR_INVALID_PARAM     (0x00000200U)    /*!< Invalid Parameters error  */

+/**

+  * @}

+  */

+

+/** @defgroup I2C_handle_Structure_definition I2C handle Structure definition

+  * @brief  I2C handle Structure definition

+  * @{

+  */

+typedef struct __I2C_HandleTypeDef

+{

+  I2C_TypeDef                *Instance;      /*!< I2C registers base address                */

+

+  I2C_InitTypeDef            Init;           /*!< I2C communication parameters              */

+

+  uint8_t                    *pBuffPtr;      /*!< Pointer to I2C transfer buffer            */

+

+  uint16_t                   XferSize;       /*!< I2C transfer size                         */

+

+  __IO uint16_t              XferCount;      /*!< I2C transfer counter                      */

+

+  __IO uint32_t              XferOptions;    /*!< I2C sequantial transfer options, this parameter can

+                                                  be a value of @ref I2C_XFEROPTIONS */

+

+  __IO uint32_t              PreviousState;  /*!< I2C communication Previous state          */

+

+  HAL_StatusTypeDef(*XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources);  /*!< I2C transfer IRQ handler function pointer */

+

+  DMA_HandleTypeDef          *hdmatx;        /*!< I2C Tx DMA handle parameters              */

+

+  DMA_HandleTypeDef          *hdmarx;        /*!< I2C Rx DMA handle parameters              */

+

+  HAL_LockTypeDef            Lock;           /*!< I2C locking object                        */

+

+  __IO HAL_I2C_StateTypeDef  State;          /*!< I2C communication state                   */

+

+  __IO HAL_I2C_ModeTypeDef   Mode;           /*!< I2C communication mode                    */

+

+  __IO uint32_t              ErrorCode;      /*!< I2C Error code                            */

+

+  __IO uint32_t              AddrEventCount; /*!< I2C Address Event counter                 */

+

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+  void (* MasterTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);           /*!< I2C Master Tx Transfer completed callback */

+  void (* MasterRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);           /*!< I2C Master Rx Transfer completed callback */

+  void (* SlaveTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);            /*!< I2C Slave Tx Transfer completed callback  */

+  void (* SlaveRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);            /*!< I2C Slave Rx Transfer completed callback  */

+  void (* ListenCpltCallback)(struct __I2C_HandleTypeDef *hi2c);             /*!< I2C Listen Complete callback              */

+  void (* MemTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);              /*!< I2C Memory Tx Transfer completed callback */

+  void (* MemRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);              /*!< I2C Memory Rx Transfer completed callback */

+  void (* ErrorCallback)(struct __I2C_HandleTypeDef *hi2c);                  /*!< I2C Error callback                        */

+  void (* AbortCpltCallback)(struct __I2C_HandleTypeDef *hi2c);              /*!< I2C Abort callback                        */

+

+  void (* AddrCallback)(struct __I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode);  /*!< I2C Slave Address Match callback */

+

+  void (* MspInitCallback)(struct __I2C_HandleTypeDef *hi2c);                /*!< I2C Msp Init callback                     */

+  void (* MspDeInitCallback)(struct __I2C_HandleTypeDef *hi2c);              /*!< I2C Msp DeInit callback                   */

+

+#endif  /* USE_HAL_I2C_REGISTER_CALLBACKS */

+} I2C_HandleTypeDef;

+

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+/**

+  * @brief  HAL I2C Callback ID enumeration definition

+  */

+typedef enum

+{

+  HAL_I2C_MASTER_TX_COMPLETE_CB_ID      = 0x00U,    /*!< I2C Master Tx Transfer completed callback ID  */

+  HAL_I2C_MASTER_RX_COMPLETE_CB_ID      = 0x01U,    /*!< I2C Master Rx Transfer completed callback ID  */

+  HAL_I2C_SLAVE_TX_COMPLETE_CB_ID       = 0x02U,    /*!< I2C Slave Tx Transfer completed callback ID   */

+  HAL_I2C_SLAVE_RX_COMPLETE_CB_ID       = 0x03U,    /*!< I2C Slave Rx Transfer completed callback ID   */

+  HAL_I2C_LISTEN_COMPLETE_CB_ID         = 0x04U,    /*!< I2C Listen Complete callback ID               */

+  HAL_I2C_MEM_TX_COMPLETE_CB_ID         = 0x05U,    /*!< I2C Memory Tx Transfer callback ID            */

+  HAL_I2C_MEM_RX_COMPLETE_CB_ID         = 0x06U,    /*!< I2C Memory Rx Transfer completed callback ID  */

+  HAL_I2C_ERROR_CB_ID                   = 0x07U,    /*!< I2C Error callback ID                         */

+  HAL_I2C_ABORT_CB_ID                   = 0x08U,    /*!< I2C Abort callback ID                         */

+

+  HAL_I2C_MSPINIT_CB_ID                 = 0x09U,    /*!< I2C Msp Init callback ID                      */

+  HAL_I2C_MSPDEINIT_CB_ID               = 0x0AU     /*!< I2C Msp DeInit callback ID                    */

+

+} HAL_I2C_CallbackIDTypeDef;

+

+/**

+  * @brief  HAL I2C Callback pointer definition

+  */

+typedef  void (*pI2C_CallbackTypeDef)(I2C_HandleTypeDef *hi2c); /*!< pointer to an I2C callback function */

+typedef  void (*pI2C_AddrCallbackTypeDef)(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*!< pointer to an I2C Address Match callback function */

+

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+/* Exported constants --------------------------------------------------------*/

+

+/** @defgroup I2C_Exported_Constants I2C Exported Constants

+  * @{

+  */

+

+/** @defgroup I2C_XFEROPTIONS  I2C Sequential Transfer Options

+  * @{

+  */

+#define I2C_FIRST_FRAME                 ((uint32_t)I2C_SOFTEND_MODE)

+#define I2C_FIRST_AND_NEXT_FRAME        ((uint32_t)(I2C_RELOAD_MODE | I2C_SOFTEND_MODE))

+#define I2C_NEXT_FRAME                  ((uint32_t)(I2C_RELOAD_MODE | I2C_SOFTEND_MODE))

+#define I2C_FIRST_AND_LAST_FRAME        ((uint32_t)I2C_AUTOEND_MODE)

+#define I2C_LAST_FRAME                  ((uint32_t)I2C_AUTOEND_MODE)

+#define I2C_LAST_FRAME_NO_STOP          ((uint32_t)I2C_SOFTEND_MODE)

+

+/* List of XferOptions in usage of :

+ * 1- Restart condition in all use cases (direction change or not)

+ */

+#define  I2C_OTHER_FRAME                (0x000000AAU)

+#define  I2C_OTHER_AND_LAST_FRAME       (0x0000AA00U)

+/**

+  * @}

+  */

+

+/** @defgroup I2C_ADDRESSING_MODE I2C Addressing Mode

+  * @{

+  */

+#define I2C_ADDRESSINGMODE_7BIT         (0x00000001U)

+#define I2C_ADDRESSINGMODE_10BIT        (0x00000002U)

+/**

+  * @}

+  */

+

+/** @defgroup I2C_DUAL_ADDRESSING_MODE I2C Dual Addressing Mode

+  * @{

+  */

+#define I2C_DUALADDRESS_DISABLE         (0x00000000U)

+#define I2C_DUALADDRESS_ENABLE          I2C_OAR2_OA2EN

+/**

+  * @}

+  */

+

+/** @defgroup I2C_OWN_ADDRESS2_MASKS I2C Own Address2 Masks

+  * @{

+  */

+#define I2C_OA2_NOMASK                  ((uint8_t)0x00U)

+#define I2C_OA2_MASK01                  ((uint8_t)0x01U)

+#define I2C_OA2_MASK02                  ((uint8_t)0x02U)

+#define I2C_OA2_MASK03                  ((uint8_t)0x03U)

+#define I2C_OA2_MASK04                  ((uint8_t)0x04U)

+#define I2C_OA2_MASK05                  ((uint8_t)0x05U)

+#define I2C_OA2_MASK06                  ((uint8_t)0x06U)

+#define I2C_OA2_MASK07                  ((uint8_t)0x07U)

+/**

+  * @}

+  */

+

+/** @defgroup I2C_GENERAL_CALL_ADDRESSING_MODE I2C General Call Addressing Mode

+  * @{

+  */

+#define I2C_GENERALCALL_DISABLE         (0x00000000U)

+#define I2C_GENERALCALL_ENABLE          I2C_CR1_GCEN

+/**

+  * @}

+  */

+

+/** @defgroup I2C_NOSTRETCH_MODE I2C No-Stretch Mode

+  * @{

+  */

+#define I2C_NOSTRETCH_DISABLE           (0x00000000U)

+#define I2C_NOSTRETCH_ENABLE            I2C_CR1_NOSTRETCH

+/**

+  * @}

+  */

+

+/** @defgroup I2C_MEMORY_ADDRESS_SIZE I2C Memory Address Size

+  * @{

+  */

+#define I2C_MEMADD_SIZE_8BIT            (0x00000001U)

+#define I2C_MEMADD_SIZE_16BIT           (0x00000002U)

+/**

+  * @}

+  */

+

+/** @defgroup I2C_XFERDIRECTION I2C Transfer Direction Master Point of View

+  * @{

+  */

+#define I2C_DIRECTION_TRANSMIT          (0x00000000U)

+#define I2C_DIRECTION_RECEIVE           (0x00000001U)

+/**

+  * @}

+  */

+

+/** @defgroup I2C_RELOAD_END_MODE I2C Reload End Mode

+  * @{

+  */

+#define  I2C_RELOAD_MODE                I2C_CR2_RELOAD

+#define  I2C_AUTOEND_MODE               I2C_CR2_AUTOEND

+#define  I2C_SOFTEND_MODE               (0x00000000U)

+/**

+  * @}

+  */

+

+/** @defgroup I2C_START_STOP_MODE I2C Start or Stop Mode

+  * @{

+  */

+#define  I2C_NO_STARTSTOP               (0x00000000U)

+#define  I2C_GENERATE_STOP              (uint32_t)(0x80000000U | I2C_CR2_STOP)

+#define  I2C_GENERATE_START_READ        (uint32_t)(0x80000000U | I2C_CR2_START | I2C_CR2_RD_WRN)

+#define  I2C_GENERATE_START_WRITE       (uint32_t)(0x80000000U | I2C_CR2_START)

+/**

+  * @}

+  */

+

+/** @defgroup I2C_Interrupt_configuration_definition I2C Interrupt configuration definition

+  * @brief I2C Interrupt definition

+  *        Elements values convention: 0xXXXXXXXX

+  *           - XXXXXXXX  : Interrupt control mask

+  * @{

+  */

+#define I2C_IT_ERRI                     I2C_CR1_ERRIE

+#define I2C_IT_TCI                      I2C_CR1_TCIE

+#define I2C_IT_STOPI                    I2C_CR1_STOPIE

+#define I2C_IT_NACKI                    I2C_CR1_NACKIE

+#define I2C_IT_ADDRI                    I2C_CR1_ADDRIE

+#define I2C_IT_RXI                      I2C_CR1_RXIE

+#define I2C_IT_TXI                      I2C_CR1_TXIE

+/**

+  * @}

+  */

+

+/** @defgroup I2C_Flag_definition I2C Flag definition

+  * @{

+  */

+#define I2C_FLAG_TXE                    I2C_ISR_TXE

+#define I2C_FLAG_TXIS                   I2C_ISR_TXIS

+#define I2C_FLAG_RXNE                   I2C_ISR_RXNE

+#define I2C_FLAG_ADDR                   I2C_ISR_ADDR

+#define I2C_FLAG_AF                     I2C_ISR_NACKF

+#define I2C_FLAG_STOPF                  I2C_ISR_STOPF

+#define I2C_FLAG_TC                     I2C_ISR_TC

+#define I2C_FLAG_TCR                    I2C_ISR_TCR

+#define I2C_FLAG_BERR                   I2C_ISR_BERR

+#define I2C_FLAG_ARLO                   I2C_ISR_ARLO

+#define I2C_FLAG_OVR                    I2C_ISR_OVR

+#define I2C_FLAG_PECERR                 I2C_ISR_PECERR

+#define I2C_FLAG_TIMEOUT                I2C_ISR_TIMEOUT

+#define I2C_FLAG_ALERT                  I2C_ISR_ALERT

+#define I2C_FLAG_BUSY                   I2C_ISR_BUSY

+#define I2C_FLAG_DIR                    I2C_ISR_DIR

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Exported macros -----------------------------------------------------------*/

+

+/** @defgroup I2C_Exported_Macros I2C Exported Macros

+  * @{

+  */

+

+/** @brief Reset I2C handle state.

+  * @param  __HANDLE__ specifies the I2C Handle.

+  * @retval None

+  */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+#define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__)                do{                                                   \

+                                                                    (__HANDLE__)->State = HAL_I2C_STATE_RESET;       \

+                                                                    (__HANDLE__)->MspInitCallback = NULL;            \

+                                                                    (__HANDLE__)->MspDeInitCallback = NULL;          \

+                                                                  } while(0)

+#else

+#define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__)                ((__HANDLE__)->State = HAL_I2C_STATE_RESET)

+#endif

+

+/** @brief  Enable the specified I2C interrupt.

+  * @param  __HANDLE__ specifies the I2C Handle.

+  * @param  __INTERRUPT__ specifies the interrupt source to enable.

+  *        This parameter can be one of the following values:

+  *            @arg @ref I2C_IT_ERRI  Errors interrupt enable

+  *            @arg @ref I2C_IT_TCI   Transfer complete interrupt enable

+  *            @arg @ref I2C_IT_STOPI STOP detection interrupt enable

+  *            @arg @ref I2C_IT_NACKI NACK received interrupt enable

+  *            @arg @ref I2C_IT_ADDRI Address match interrupt enable

+  *            @arg @ref I2C_IT_RXI   RX interrupt enable

+  *            @arg @ref I2C_IT_TXI   TX interrupt enable

+  *

+  * @retval None

+  */

+#define __HAL_I2C_ENABLE_IT(__HANDLE__, __INTERRUPT__)          ((__HANDLE__)->Instance->CR1 |= (__INTERRUPT__))

+

+/** @brief  Disable the specified I2C interrupt.

+  * @param  __HANDLE__ specifies the I2C Handle.

+  * @param  __INTERRUPT__ specifies the interrupt source to disable.

+  *        This parameter can be one of the following values:

+  *            @arg @ref I2C_IT_ERRI  Errors interrupt enable

+  *            @arg @ref I2C_IT_TCI   Transfer complete interrupt enable

+  *            @arg @ref I2C_IT_STOPI STOP detection interrupt enable

+  *            @arg @ref I2C_IT_NACKI NACK received interrupt enable

+  *            @arg @ref I2C_IT_ADDRI Address match interrupt enable

+  *            @arg @ref I2C_IT_RXI   RX interrupt enable

+  *            @arg @ref I2C_IT_TXI   TX interrupt enable

+  *

+  * @retval None

+  */

+#define __HAL_I2C_DISABLE_IT(__HANDLE__, __INTERRUPT__)         ((__HANDLE__)->Instance->CR1 &= (~(__INTERRUPT__)))

+

+/** @brief  Check whether the specified I2C interrupt source is enabled or not.

+  * @param  __HANDLE__ specifies the I2C Handle.

+  * @param  __INTERRUPT__ specifies the I2C interrupt source to check.

+  *          This parameter can be one of the following values:

+  *            @arg @ref I2C_IT_ERRI  Errors interrupt enable

+  *            @arg @ref I2C_IT_TCI   Transfer complete interrupt enable

+  *            @arg @ref I2C_IT_STOPI STOP detection interrupt enable

+  *            @arg @ref I2C_IT_NACKI NACK received interrupt enable

+  *            @arg @ref I2C_IT_ADDRI Address match interrupt enable

+  *            @arg @ref I2C_IT_RXI   RX interrupt enable

+  *            @arg @ref I2C_IT_TXI   TX interrupt enable

+  *

+  * @retval The new state of __INTERRUPT__ (SET or RESET).

+  */

+#define __HAL_I2C_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__)      ((((__HANDLE__)->Instance->CR1 & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET)

+

+/** @brief  Check whether the specified I2C flag is set or not.

+  * @param  __HANDLE__ specifies the I2C Handle.

+  * @param  __FLAG__ specifies the flag to check.

+  *        This parameter can be one of the following values:

+  *            @arg @ref I2C_FLAG_TXE     Transmit data register empty

+  *            @arg @ref I2C_FLAG_TXIS    Transmit interrupt status

+  *            @arg @ref I2C_FLAG_RXNE    Receive data register not empty

+  *            @arg @ref I2C_FLAG_ADDR    Address matched (slave mode)

+  *            @arg @ref I2C_FLAG_AF      Acknowledge failure received flag

+  *            @arg @ref I2C_FLAG_STOPF   STOP detection flag

+  *            @arg @ref I2C_FLAG_TC      Transfer complete (master mode)

+  *            @arg @ref I2C_FLAG_TCR     Transfer complete reload

+  *            @arg @ref I2C_FLAG_BERR    Bus error

+  *            @arg @ref I2C_FLAG_ARLO    Arbitration lost

+  *            @arg @ref I2C_FLAG_OVR     Overrun/Underrun

+  *            @arg @ref I2C_FLAG_PECERR  PEC error in reception

+  *            @arg @ref I2C_FLAG_TIMEOUT Timeout or Tlow detection flag

+  *            @arg @ref I2C_FLAG_ALERT   SMBus alert

+  *            @arg @ref I2C_FLAG_BUSY    Bus busy

+  *            @arg @ref I2C_FLAG_DIR     Transfer direction (slave mode)

+  *

+  * @retval The new state of __FLAG__ (SET or RESET).

+  */

+#define I2C_FLAG_MASK  (0x0001FFFFU)

+#define __HAL_I2C_GET_FLAG(__HANDLE__, __FLAG__) (((((__HANDLE__)->Instance->ISR) & (__FLAG__)) == (__FLAG__)) ? SET : RESET)

+

+/** @brief  Clear the I2C pending flags which are cleared by writing 1 in a specific bit.

+  * @param  __HANDLE__ specifies the I2C Handle.

+  * @param  __FLAG__ specifies the flag to clear.

+  *          This parameter can be any combination of the following values:

+  *            @arg @ref I2C_FLAG_TXE     Transmit data register empty

+  *            @arg @ref I2C_FLAG_ADDR    Address matched (slave mode)

+  *            @arg @ref I2C_FLAG_AF      Acknowledge failure received flag

+  *            @arg @ref I2C_FLAG_STOPF   STOP detection flag

+  *            @arg @ref I2C_FLAG_BERR    Bus error

+  *            @arg @ref I2C_FLAG_ARLO    Arbitration lost

+  *            @arg @ref I2C_FLAG_OVR     Overrun/Underrun

+  *            @arg @ref I2C_FLAG_PECERR  PEC error in reception

+  *            @arg @ref I2C_FLAG_TIMEOUT Timeout or Tlow detection flag

+  *            @arg @ref I2C_FLAG_ALERT   SMBus alert

+  *

+  * @retval None

+  */

+#define __HAL_I2C_CLEAR_FLAG(__HANDLE__, __FLAG__) (((__FLAG__) == I2C_FLAG_TXE) ? ((__HANDLE__)->Instance->ISR |= (__FLAG__)) \

+                                                                                 : ((__HANDLE__)->Instance->ICR = (__FLAG__)))

+

+/** @brief  Enable the specified I2C peripheral.

+  * @param  __HANDLE__ specifies the I2C Handle.

+  * @retval None

+  */

+#define __HAL_I2C_ENABLE(__HANDLE__)                            (SET_BIT((__HANDLE__)->Instance->CR1,  I2C_CR1_PE))

+

+/** @brief  Disable the specified I2C peripheral.

+  * @param  __HANDLE__ specifies the I2C Handle.

+  * @retval None

+  */

+#define __HAL_I2C_DISABLE(__HANDLE__)                           (CLEAR_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE))

+

+/** @brief  Generate a Non-Acknowledge I2C peripheral in Slave mode.

+  * @param  __HANDLE__ specifies the I2C Handle.

+  * @retval None

+  */

+#define __HAL_I2C_GENERATE_NACK(__HANDLE__)                     (SET_BIT((__HANDLE__)->Instance->CR2, I2C_CR2_NACK))

+/**

+  * @}

+  */

+

+/* Include I2C HAL Extended module */

+#include "stm32l4xx_hal_i2c_ex.h"

+

+/* Exported functions --------------------------------------------------------*/

+/** @addtogroup I2C_Exported_Functions

+  * @{

+  */

+

+/** @addtogroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions

+  * @{

+  */

+/* Initialization and de-initialization functions******************************/

+HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c);

+HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c);

+void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c);

+void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c);

+

+/* Callbacks Register/UnRegister functions  ***********************************/

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID, pI2C_CallbackTypeDef pCallback);

+HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID);

+

+HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pCallback);

+HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+/**

+  * @}

+  */

+

+/** @addtogroup I2C_Exported_Functions_Group2 Input and Output operation functions

+  * @{

+  */

+/* IO operation functions  ****************************************************/

+/******* Blocking mode: Polling */

+HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);

+HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);

+HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout);

+HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout);

+HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);

+HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);

+HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout);

+

+/******* Non-Blocking mode: Interrupt */

+HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);

+HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);

+HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);

+HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);

+HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);

+HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);

+

+HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);

+HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);

+HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);

+HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);

+HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c);

+HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c);

+HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress);

+

+/******* Non-Blocking mode: DMA */

+HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);

+HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);

+HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);

+HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);

+HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);

+HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);

+

+HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);

+HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);

+HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);

+HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);

+/**

+  * @}

+  */

+

+/** @addtogroup I2C_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks

+ * @{

+ */

+/******* I2C IRQHandler and Callbacks used in non blocking modes (Interrupt and DMA) */

+void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c);

+void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c);

+void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c);

+void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c);

+void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c);

+void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c);

+void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode);

+void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c);

+void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c);

+void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c);

+void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c);

+void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c);

+/**

+  * @}

+  */

+

+/** @addtogroup I2C_Exported_Functions_Group3 Peripheral State, Mode and Error functions

+  * @{

+  */

+/* Peripheral State, Mode and Error functions  *********************************/

+HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c);

+HAL_I2C_ModeTypeDef  HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c);

+uint32_t             HAL_I2C_GetError(I2C_HandleTypeDef *hi2c);

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Private constants ---------------------------------------------------------*/

+/** @defgroup I2C_Private_Constants I2C Private Constants

+  * @{

+  */

+

+/**

+  * @}

+  */

+

+/* Private macros ------------------------------------------------------------*/

+/** @defgroup I2C_Private_Macro I2C Private Macros

+  * @{

+  */

+

+#define IS_I2C_ADDRESSING_MODE(MODE)    (((MODE) == I2C_ADDRESSINGMODE_7BIT) || \

+                                         ((MODE) == I2C_ADDRESSINGMODE_10BIT))

+

+#define IS_I2C_DUAL_ADDRESS(ADDRESS)    (((ADDRESS) == I2C_DUALADDRESS_DISABLE) || \

+                                         ((ADDRESS) == I2C_DUALADDRESS_ENABLE))

+

+#define IS_I2C_OWN_ADDRESS2_MASK(MASK)  (((MASK) == I2C_OA2_NOMASK)  || \

+                                         ((MASK) == I2C_OA2_MASK01) || \

+                                         ((MASK) == I2C_OA2_MASK02) || \

+                                         ((MASK) == I2C_OA2_MASK03) || \

+                                         ((MASK) == I2C_OA2_MASK04) || \

+                                         ((MASK) == I2C_OA2_MASK05) || \

+                                         ((MASK) == I2C_OA2_MASK06) || \

+                                         ((MASK) == I2C_OA2_MASK07))

+

+#define IS_I2C_GENERAL_CALL(CALL)       (((CALL) == I2C_GENERALCALL_DISABLE) || \

+                                         ((CALL) == I2C_GENERALCALL_ENABLE))

+

+#define IS_I2C_NO_STRETCH(STRETCH)      (((STRETCH) == I2C_NOSTRETCH_DISABLE) || \

+                                         ((STRETCH) == I2C_NOSTRETCH_ENABLE))

+

+#define IS_I2C_MEMADD_SIZE(SIZE)        (((SIZE) == I2C_MEMADD_SIZE_8BIT) || \

+                                         ((SIZE) == I2C_MEMADD_SIZE_16BIT))

+

+#define IS_TRANSFER_MODE(MODE)          (((MODE) == I2C_RELOAD_MODE)   || \

+                                         ((MODE) == I2C_AUTOEND_MODE) || \

+                                         ((MODE) == I2C_SOFTEND_MODE))

+

+#define IS_TRANSFER_REQUEST(REQUEST)    (((REQUEST) == I2C_GENERATE_STOP)        || \

+                                         ((REQUEST) == I2C_GENERATE_START_READ)  || \

+                                         ((REQUEST) == I2C_GENERATE_START_WRITE) || \

+                                         ((REQUEST) == I2C_NO_STARTSTOP))

+

+#define IS_I2C_TRANSFER_OPTIONS_REQUEST(REQUEST)  (((REQUEST) == I2C_FIRST_FRAME)          || \

+                                                   ((REQUEST) == I2C_FIRST_AND_NEXT_FRAME) || \

+                                                   ((REQUEST) == I2C_NEXT_FRAME)           || \

+                                                   ((REQUEST) == I2C_FIRST_AND_LAST_FRAME) || \

+                                                   ((REQUEST) == I2C_LAST_FRAME)           || \

+                                                   ((REQUEST) == I2C_LAST_FRAME_NO_STOP)   || \

+                                                   IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST))

+

+#define IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == I2C_OTHER_FRAME)     || \

+                                                        ((REQUEST) == I2C_OTHER_AND_LAST_FRAME))

+

+#define I2C_RESET_CR2(__HANDLE__)                 ((__HANDLE__)->Instance->CR2 &= (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_HEAD10R | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_RD_WRN)))

+

+#define I2C_GET_ADDR_MATCH(__HANDLE__)            ((uint16_t)(((__HANDLE__)->Instance->ISR & I2C_ISR_ADDCODE) >> 16U))

+#define I2C_GET_DIR(__HANDLE__)                   ((uint8_t)(((__HANDLE__)->Instance->ISR & I2C_ISR_DIR) >> 16U))

+#define I2C_GET_STOP_MODE(__HANDLE__)             ((__HANDLE__)->Instance->CR2 & I2C_CR2_AUTOEND)

+#define I2C_GET_OWN_ADDRESS1(__HANDLE__)          ((uint16_t)((__HANDLE__)->Instance->OAR1 & I2C_OAR1_OA1))

+#define I2C_GET_OWN_ADDRESS2(__HANDLE__)          ((uint16_t)((__HANDLE__)->Instance->OAR2 & I2C_OAR2_OA2))

+

+#define IS_I2C_OWN_ADDRESS1(ADDRESS1)             ((ADDRESS1) <= 0x000003FFU)

+#define IS_I2C_OWN_ADDRESS2(ADDRESS2)             ((ADDRESS2) <= (uint16_t)0x00FFU)

+

+#define I2C_MEM_ADD_MSB(__ADDRESS__)              ((uint8_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0xFF00U))) >> 8U)))

+#define I2C_MEM_ADD_LSB(__ADDRESS__)              ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)(0x00FFU))))

+

+#define I2C_GENERATE_START(__ADDMODE__,__ADDRESS__) (((__ADDMODE__) == I2C_ADDRESSINGMODE_7BIT) ? (uint32_t)((((uint32_t)(__ADDRESS__) & (I2C_CR2_SADD)) | (I2C_CR2_START) | (I2C_CR2_AUTOEND)) & (~I2C_CR2_RD_WRN)) : \

+                                                          (uint32_t)((((uint32_t)(__ADDRESS__) & (I2C_CR2_SADD)) | (I2C_CR2_ADD10) | (I2C_CR2_START)) & (~I2C_CR2_RD_WRN)))

+

+#define I2C_CHECK_FLAG(__ISR__, __FLAG__)         ((((__ISR__) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET)

+#define I2C_CHECK_IT_SOURCE(__CR1__, __IT__)      ((((__CR1__) & (__IT__)) == (__IT__)) ? SET : RESET)

+/**

+  * @}

+  */

+

+/* Private Functions ---------------------------------------------------------*/

+/** @defgroup I2C_Private_Functions I2C Private Functions

+  * @{

+  */

+/* Private functions are defined in stm32l4xx_hal_i2c.c file */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+

+#endif /* STM32L4xx_HAL_I2C_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h
new file mode 100644
index 0000000..690623d
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h
@@ -0,0 +1,173 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_i2c_ex.h

+  * @author  MCD Application Team

+  * @brief   Header file of I2C HAL Extended module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef STM32L4xx_HAL_I2C_EX_H

+#define STM32L4xx_HAL_I2C_EX_H

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup I2CEx

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+/* Exported constants --------------------------------------------------------*/

+

+/** @defgroup I2CEx_Exported_Constants I2C Extended Exported Constants

+  * @{

+  */

+

+/** @defgroup I2CEx_Analog_Filter I2C Extended Analog Filter

+  * @{

+  */

+#define I2C_ANALOGFILTER_ENABLE         0x00000000U

+#define I2C_ANALOGFILTER_DISABLE        I2C_CR1_ANFOFF

+/**

+  * @}

+  */

+

+/** @defgroup I2CEx_FastModePlus I2C Extended Fast Mode Plus

+  * @{

+  */

+#define I2C_FMP_NOT_SUPPORTED           0xAAAA0000U                                     /*!< Fast Mode Plus not supported       */

+#define I2C_FASTMODEPLUS_PB6            SYSCFG_CFGR1_I2C_PB6_FMP                        /*!< Enable Fast Mode Plus on PB6       */

+#define I2C_FASTMODEPLUS_PB7            SYSCFG_CFGR1_I2C_PB7_FMP                        /*!< Enable Fast Mode Plus on PB7       */

+#if defined(SYSCFG_CFGR1_I2C_PB8_FMP)

+#define I2C_FASTMODEPLUS_PB8            SYSCFG_CFGR1_I2C_PB8_FMP                        /*!< Enable Fast Mode Plus on PB8       */

+#define I2C_FASTMODEPLUS_PB9            SYSCFG_CFGR1_I2C_PB9_FMP                        /*!< Enable Fast Mode Plus on PB9       */

+#else

+#define I2C_FASTMODEPLUS_PB8            (uint32_t)(0x00000010U | I2C_FMP_NOT_SUPPORTED) /*!< Fast Mode Plus PB8 not supported   */

+#define I2C_FASTMODEPLUS_PB9            (uint32_t)(0x00000012U | I2C_FMP_NOT_SUPPORTED) /*!< Fast Mode Plus PB9 not supported   */

+#endif

+#define I2C_FASTMODEPLUS_I2C1           SYSCFG_CFGR1_I2C1_FMP                           /*!< Enable Fast Mode Plus on I2C1 pins */

+#if defined(SYSCFG_CFGR1_I2C2_FMP)

+#define I2C_FASTMODEPLUS_I2C2           SYSCFG_CFGR1_I2C2_FMP                           /*!< Enable Fast Mode Plus on I2C2 pins */

+#else

+#define I2C_FASTMODEPLUS_I2C2           (uint32_t)(0x00000200U | I2C_FMP_NOT_SUPPORTED) /*!< Fast Mode Plus I2C2 not supported  */

+#endif

+#define I2C_FASTMODEPLUS_I2C3           SYSCFG_CFGR1_I2C3_FMP                           /*!< Enable Fast Mode Plus on I2C3 pins */

+#if defined(SYSCFG_CFGR1_I2C4_FMP)

+#define I2C_FASTMODEPLUS_I2C4           SYSCFG_CFGR1_I2C4_FMP                           /*!< Enable Fast Mode Plus on I2C4 pins */

+#else

+#define I2C_FASTMODEPLUS_I2C4           (uint32_t)(0x00000800U | I2C_FMP_NOT_SUPPORTED) /*!< Fast Mode Plus I2C4 not supported  */

+#endif

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Exported macro ------------------------------------------------------------*/

+/* Exported functions --------------------------------------------------------*/

+

+/** @addtogroup I2CEx_Exported_Functions I2C Extended Exported Functions

+  * @{

+  */

+

+/** @addtogroup I2CEx_Exported_Functions_Group1 Extended features functions

+  * @brief    Extended features functions

+  * @{

+  */

+

+/* Peripheral Control functions  ************************************************/

+HAL_StatusTypeDef HAL_I2CEx_ConfigAnalogFilter(I2C_HandleTypeDef *hi2c, uint32_t AnalogFilter);

+HAL_StatusTypeDef HAL_I2CEx_ConfigDigitalFilter(I2C_HandleTypeDef *hi2c, uint32_t DigitalFilter);

+HAL_StatusTypeDef HAL_I2CEx_EnableWakeUp(I2C_HandleTypeDef *hi2c);

+HAL_StatusTypeDef HAL_I2CEx_DisableWakeUp(I2C_HandleTypeDef *hi2c);

+void HAL_I2CEx_EnableFastModePlus(uint32_t ConfigFastModePlus);

+void HAL_I2CEx_DisableFastModePlus(uint32_t ConfigFastModePlus);

+

+/* Private constants ---------------------------------------------------------*/

+/** @defgroup I2CEx_Private_Constants I2C Extended Private Constants

+  * @{

+  */

+

+/**

+  * @}

+  */

+

+/* Private macros ------------------------------------------------------------*/

+/** @defgroup I2CEx_Private_Macro I2C Extended Private Macros

+  * @{

+  */

+#define IS_I2C_ANALOG_FILTER(FILTER)    (((FILTER) == I2C_ANALOGFILTER_ENABLE) || \

+                                          ((FILTER) == I2C_ANALOGFILTER_DISABLE))

+

+#define IS_I2C_DIGITAL_FILTER(FILTER)   ((FILTER) <= 0x0000000FU)

+

+#define IS_I2C_FASTMODEPLUS(__CONFIG__) ((((__CONFIG__) & I2C_FMP_NOT_SUPPORTED) != I2C_FMP_NOT_SUPPORTED) && \

+                                         ((((__CONFIG__) & (I2C_FASTMODEPLUS_PB6))  == I2C_FASTMODEPLUS_PB6)     || \

+                                          (((__CONFIG__) & (I2C_FASTMODEPLUS_PB7))  == I2C_FASTMODEPLUS_PB7)     || \

+                                          (((__CONFIG__) & (I2C_FASTMODEPLUS_PB8))  == I2C_FASTMODEPLUS_PB8)     || \

+                                          (((__CONFIG__) & (I2C_FASTMODEPLUS_PB9))  == I2C_FASTMODEPLUS_PB9)     || \

+                                          (((__CONFIG__) & (I2C_FASTMODEPLUS_I2C1)) == I2C_FASTMODEPLUS_I2C1)    || \

+                                          (((__CONFIG__) & (I2C_FASTMODEPLUS_I2C2)) == I2C_FASTMODEPLUS_I2C2)    || \

+                                          (((__CONFIG__) & (I2C_FASTMODEPLUS_I2C3)) == I2C_FASTMODEPLUS_I2C3)    || \

+                                          (((__CONFIG__) & (I2C_FASTMODEPLUS_I2C4)) == I2C_FASTMODEPLUS_I2C4)))

+

+

+

+/**

+  * @}

+  */

+

+/* Private Functions ---------------------------------------------------------*/

+/** @defgroup I2CEx_Private_Functions I2C Extended Private Functions

+  * @{

+  */

+/* Private functions are defined in stm32l4xx_hal_i2c_ex.c file */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* STM32L4xx_HAL_I2C_EX_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd.h
new file mode 100644
index 0000000..bc1975a
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd.h
@@ -0,0 +1,1004 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_pcd.h

+  * @author  MCD Application Team

+  * @brief   Header file of PCD HAL module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef STM32L4xx_HAL_PCD_H

+#define STM32L4xx_HAL_PCD_H

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_ll_usb.h"

+

+#if defined (USB) || defined (USB_OTG_FS)

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup PCD

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+/** @defgroup PCD_Exported_Types PCD Exported Types

+  * @{

+  */

+

+/**

+  * @brief  PCD State structure definition

+  */

+typedef enum

+{

+  HAL_PCD_STATE_RESET   = 0x00,

+  HAL_PCD_STATE_READY   = 0x01,

+  HAL_PCD_STATE_ERROR   = 0x02,

+  HAL_PCD_STATE_BUSY    = 0x03,

+  HAL_PCD_STATE_TIMEOUT = 0x04

+} PCD_StateTypeDef;

+

+/* Device LPM suspend state */

+typedef enum

+{

+  LPM_L0 = 0x00, /* on */

+  LPM_L1 = 0x01, /* LPM L1 sleep */

+  LPM_L2 = 0x02, /* suspend */

+  LPM_L3 = 0x03, /* off */

+} PCD_LPM_StateTypeDef;

+

+typedef enum

+{

+  PCD_LPM_L0_ACTIVE = 0x00, /* on */

+  PCD_LPM_L1_ACTIVE = 0x01, /* LPM L1 sleep */

+} PCD_LPM_MsgTypeDef;

+

+typedef enum

+{

+  PCD_BCD_ERROR                     = 0xFF,

+  PCD_BCD_CONTACT_DETECTION         = 0xFE,

+  PCD_BCD_STD_DOWNSTREAM_PORT       = 0xFD,

+  PCD_BCD_CHARGING_DOWNSTREAM_PORT  = 0xFC,

+  PCD_BCD_DEDICATED_CHARGING_PORT   = 0xFB,

+  PCD_BCD_DISCOVERY_COMPLETED       = 0x00,

+

+} PCD_BCD_MsgTypeDef;

+

+#if defined (USB)

+

+#endif /* defined (USB) */

+#if defined (USB_OTG_FS)

+typedef USB_OTG_GlobalTypeDef  PCD_TypeDef;

+typedef USB_OTG_CfgTypeDef     PCD_InitTypeDef;

+typedef USB_OTG_EPTypeDef      PCD_EPTypeDef;

+#endif /* defined (USB_OTG_FS) */

+#if defined (USB)

+typedef USB_TypeDef        PCD_TypeDef;

+typedef USB_CfgTypeDef     PCD_InitTypeDef;

+typedef USB_EPTypeDef      PCD_EPTypeDef;

+#endif /* defined (USB) */

+

+/**

+  * @brief  PCD Handle Structure definition

+  */

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+typedef struct __PCD_HandleTypeDef

+#else

+typedef struct

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+{

+  PCD_TypeDef             *Instance;   /*!< Register base address              */

+  PCD_InitTypeDef         Init;        /*!< PCD required parameters            */

+  __IO uint8_t            USB_Address; /*!< USB Address                        */

+#if defined (USB_OTG_FS)

+  PCD_EPTypeDef           IN_ep[16];   /*!< IN endpoint parameters             */

+  PCD_EPTypeDef           OUT_ep[16];  /*!< OUT endpoint parameters            */

+#endif /* defined (USB_OTG_FS) */

+#if defined (USB)

+  PCD_EPTypeDef           IN_ep[8];   /*!< IN endpoint parameters             */

+  PCD_EPTypeDef           OUT_ep[8];  /*!< OUT endpoint parameters            */

+#endif /* defined (USB) */

+  HAL_LockTypeDef         Lock;        /*!< PCD peripheral status              */

+  __IO PCD_StateTypeDef   State;       /*!< PCD communication state            */

+  __IO  uint32_t          ErrorCode;   /*!< PCD Error code                     */

+  uint32_t                Setup[12];   /*!< Setup packet buffer                */

+  PCD_LPM_StateTypeDef    LPM_State;   /*!< LPM State                          */

+  uint32_t                BESL;

+

+

+  uint32_t lpm_active;                 /*!< Enable or disable the Link Power Management .

+                                       This parameter can be set to ENABLE or DISABLE        */

+

+  uint32_t battery_charging_active;    /*!< Enable or disable Battery charging.

+                                       This parameter can be set to ENABLE or DISABLE        */

+  void                    *pData;      /*!< Pointer to upper stack Handler */

+

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+  void (* SOFCallback)(struct __PCD_HandleTypeDef *hpcd);                              /*!< USB OTG PCD SOF callback                */

+  void (* SetupStageCallback)(struct __PCD_HandleTypeDef *hpcd);                       /*!< USB OTG PCD Setup Stage callback        */

+  void (* ResetCallback)(struct __PCD_HandleTypeDef *hpcd);                            /*!< USB OTG PCD Reset callback              */

+  void (* SuspendCallback)(struct __PCD_HandleTypeDef *hpcd);                          /*!< USB OTG PCD Suspend callback            */

+  void (* ResumeCallback)(struct __PCD_HandleTypeDef *hpcd);                           /*!< USB OTG PCD Resume callback             */

+  void (* ConnectCallback)(struct __PCD_HandleTypeDef *hpcd);                          /*!< USB OTG PCD Connect callback            */

+  void (* DisconnectCallback)(struct __PCD_HandleTypeDef *hpcd);                       /*!< USB OTG PCD Disconnect callback         */

+

+  void (* DataOutStageCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum);      /*!< USB OTG PCD Data OUT Stage callback     */

+  void (* DataInStageCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum);       /*!< USB OTG PCD Data IN Stage callback      */

+  void (* ISOOUTIncompleteCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum);  /*!< USB OTG PCD ISO OUT Incomplete callback */

+  void (* ISOINIncompleteCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum);   /*!< USB OTG PCD ISO IN Incomplete callback  */

+  void (* BCDCallback)(struct __PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg);      /*!< USB OTG PCD BCD callback                */

+  void (* LPMCallback)(struct __PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg);      /*!< USB OTG PCD LPM callback                */

+

+  void (* MspInitCallback)(struct __PCD_HandleTypeDef *hpcd);                          /*!< USB OTG PCD Msp Init callback           */

+  void (* MspDeInitCallback)(struct __PCD_HandleTypeDef *hpcd);                        /*!< USB OTG PCD Msp DeInit callback         */

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+} PCD_HandleTypeDef;

+

+/**

+  * @}

+  */

+

+/* Include PCD HAL Extended module */

+#include "stm32l4xx_hal_pcd_ex.h"

+

+/* Exported constants --------------------------------------------------------*/

+/** @defgroup PCD_Exported_Constants PCD Exported Constants

+  * @{

+  */

+

+/** @defgroup PCD_Speed PCD Speed

+  * @{

+  */

+#define PCD_SPEED_FULL               USBD_FS_SPEED

+/**

+  * @}

+  */

+

+/** @defgroup PCD_PHY_Module PCD PHY Module

+  * @{

+  */

+#define PCD_PHY_ULPI                 1U

+#define PCD_PHY_EMBEDDED             2U

+#define PCD_PHY_UTMI                 3U

+/**

+  * @}

+  */

+

+/** @defgroup PCD_Error_Code_definition PCD Error Code definition

+  * @brief  PCD Error Code definition

+  * @{

+  */

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+#define  HAL_PCD_ERROR_INVALID_CALLBACK                        (0x00000010U)    /*!< Invalid Callback error  */

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Exported macros -----------------------------------------------------------*/

+/** @defgroup PCD_Exported_Macros PCD Exported Macros

+ *  @brief macros to handle interrupts and specific clock configurations

+ * @{

+ */

+#if defined (USB_OTG_FS)

+#define __HAL_PCD_ENABLE(__HANDLE__)                       (void)USB_EnableGlobalInt ((__HANDLE__)->Instance)

+#define __HAL_PCD_DISABLE(__HANDLE__)                      (void)USB_DisableGlobalInt ((__HANDLE__)->Instance)

+

+#define __HAL_PCD_GET_FLAG(__HANDLE__, __INTERRUPT__)      ((USB_ReadInterrupts((__HANDLE__)->Instance) & (__INTERRUPT__)) == (__INTERRUPT__))

+#define __HAL_PCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__)    (((__HANDLE__)->Instance->GINTSTS) &=  (__INTERRUPT__))

+#define __HAL_PCD_IS_INVALID_INTERRUPT(__HANDLE__)         (USB_ReadInterrupts((__HANDLE__)->Instance) == 0U)

+

+

+#define __HAL_PCD_UNGATE_PHYCLOCK(__HANDLE__)             *(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE) &= \

+                                                          ~(USB_OTG_PCGCCTL_STOPCLK)

+

+#define __HAL_PCD_GATE_PHYCLOCK(__HANDLE__)               *(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE) |= USB_OTG_PCGCCTL_STOPCLK

+

+#define __HAL_PCD_IS_PHY_SUSPENDED(__HANDLE__)            ((*(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE)) & 0x10U)

+

+#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT()    EXTI->IMR1 |= USB_OTG_FS_WAKEUP_EXTI_LINE

+#define __HAL_USB_OTG_FS_WAKEUP_EXTI_DISABLE_IT()   EXTI->IMR1 &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE)

+#endif /* defined (USB_OTG_FS) */

+

+#if defined (USB)

+#define __HAL_PCD_ENABLE(__HANDLE__)                                  (void)USB_EnableGlobalInt ((__HANDLE__)->Instance)

+#define __HAL_PCD_DISABLE(__HANDLE__)                                 (void)USB_DisableGlobalInt ((__HANDLE__)->Instance)

+#define __HAL_PCD_GET_FLAG(__HANDLE__, __INTERRUPT__)                 ((USB_ReadInterrupts((__HANDLE__)->Instance) & (__INTERRUPT__)) == (__INTERRUPT__))

+#define __HAL_PCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__)               (((__HANDLE__)->Instance->ISTR) &= ~(__INTERRUPT__))

+

+#define __HAL_USB_WAKEUP_EXTI_ENABLE_IT()                             EXTI->IMR1 |= USB_WAKEUP_EXTI_LINE

+#define __HAL_USB_WAKEUP_EXTI_DISABLE_IT()                            EXTI->IMR1 &= ~(USB_WAKEUP_EXTI_LINE)

+#endif /* defined (USB) */

+

+/**

+  * @}

+  */

+

+/* Exported functions --------------------------------------------------------*/

+/** @addtogroup PCD_Exported_Functions PCD Exported Functions

+  * @{

+  */

+

+/* Initialization/de-initialization functions  ********************************/

+/** @addtogroup PCD_Exported_Functions_Group1 Initialization and de-initialization functions

+  * @{

+  */

+HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd);

+HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd);

+void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd);

+void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd);

+

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+/** @defgroup HAL_PCD_Callback_ID_enumeration_definition HAL USB OTG PCD Callback ID enumeration definition

+  * @brief  HAL USB OTG PCD Callback ID enumeration definition

+  * @{

+  */

+typedef enum

+{

+  HAL_PCD_SOF_CB_ID          = 0x01,      /*!< USB PCD SOF callback ID          */

+  HAL_PCD_SETUPSTAGE_CB_ID   = 0x02,      /*!< USB PCD Setup Stage callback ID  */

+  HAL_PCD_RESET_CB_ID        = 0x03,      /*!< USB PCD Reset callback ID        */

+  HAL_PCD_SUSPEND_CB_ID      = 0x04,      /*!< USB PCD Suspend callback ID      */

+  HAL_PCD_RESUME_CB_ID       = 0x05,      /*!< USB PCD Resume callback ID       */

+  HAL_PCD_CONNECT_CB_ID      = 0x06,      /*!< USB PCD Connect callback ID      */

+  HAL_PCD_DISCONNECT_CB_ID  = 0x07,      /*!< USB PCD Disconnect callback ID   */

+

+  HAL_PCD_MSPINIT_CB_ID      = 0x08,      /*!< USB PCD MspInit callback ID      */

+  HAL_PCD_MSPDEINIT_CB_ID    = 0x09       /*!< USB PCD MspDeInit callback ID    */

+

+} HAL_PCD_CallbackIDTypeDef;

+/**

+  * @}

+  */

+

+/** @defgroup HAL_PCD_Callback_pointer_definition HAL USB OTG PCD Callback pointer definition

+  * @brief  HAL USB OTG PCD Callback pointer definition

+  * @{

+  */

+

+typedef void (*pPCD_CallbackTypeDef)(PCD_HandleTypeDef *hpcd);                                   /*!< pointer to a common USB OTG PCD callback function  */

+typedef void (*pPCD_DataOutStageCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum);        /*!< pointer to USB OTG PCD Data OUT Stage callback     */

+typedef void (*pPCD_DataInStageCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum);         /*!< pointer to USB OTG PCD Data IN Stage callback      */

+typedef void (*pPCD_IsoOutIncpltCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum);        /*!< pointer to USB OTG PCD ISO OUT Incomplete callback */

+typedef void (*pPCD_IsoInIncpltCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum);         /*!< pointer to USB OTG PCD ISO IN Incomplete callback  */

+typedef void (*pPCD_LpmCallbackTypeDef)(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg);        /*!< pointer to USB OTG PCD LPM callback                */

+typedef void (*pPCD_BcdCallbackTypeDef)(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg);        /*!< pointer to USB OTG PCD BCD callback                */

+

+/**

+  * @}

+  */

+

+HAL_StatusTypeDef HAL_PCD_RegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID, pPCD_CallbackTypeDef pCallback);

+HAL_StatusTypeDef HAL_PCD_UnRegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID);

+

+HAL_StatusTypeDef HAL_PCD_RegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd, pPCD_DataOutStageCallbackTypeDef pCallback);

+HAL_StatusTypeDef HAL_PCD_UnRegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd);

+

+HAL_StatusTypeDef HAL_PCD_RegisterDataInStageCallback(PCD_HandleTypeDef *hpcd, pPCD_DataInStageCallbackTypeDef pCallback);

+HAL_StatusTypeDef HAL_PCD_UnRegisterDataInStageCallback(PCD_HandleTypeDef *hpcd);

+

+HAL_StatusTypeDef HAL_PCD_RegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd, pPCD_IsoOutIncpltCallbackTypeDef pCallback);

+HAL_StatusTypeDef HAL_PCD_UnRegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd);

+

+HAL_StatusTypeDef HAL_PCD_RegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd, pPCD_IsoInIncpltCallbackTypeDef pCallback);

+HAL_StatusTypeDef HAL_PCD_UnRegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd);

+

+HAL_StatusTypeDef HAL_PCD_RegisterBcdCallback(PCD_HandleTypeDef *hpcd, pPCD_BcdCallbackTypeDef pCallback);

+HAL_StatusTypeDef HAL_PCD_UnRegisterBcdCallback(PCD_HandleTypeDef *hpcd);

+

+HAL_StatusTypeDef HAL_PCD_RegisterLpmCallback(PCD_HandleTypeDef *hpcd, pPCD_LpmCallbackTypeDef pCallback);

+HAL_StatusTypeDef HAL_PCD_UnRegisterLpmCallback(PCD_HandleTypeDef *hpcd);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+/**

+  * @}

+  */

+

+/* I/O operation functions  ***************************************************/

+/* Non-Blocking mode: Interrupt */

+/** @addtogroup PCD_Exported_Functions_Group2 Input and Output operation functions

+  * @{

+  */

+HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd);

+HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd);

+void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd);

+

+void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd);

+void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd);

+void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd);

+void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd);

+void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd);

+void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd);

+void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd);

+

+void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum);

+void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum);

+void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum);

+void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum);

+/**

+  * @}

+  */

+

+/* Peripheral Control functions  **********************************************/

+/** @addtogroup PCD_Exported_Functions_Group3 Peripheral Control functions

+  * @{

+  */

+HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd);

+HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd);

+HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address);

+HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type);

+HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr);

+HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len);

+HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len);

+uint32_t          HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef *hpcd, uint8_t ep_addr);

+HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr);

+HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr);

+HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr);

+HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd);

+HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd);

+/**

+  * @}

+  */

+

+/* Peripheral State functions  ************************************************/

+/** @addtogroup PCD_Exported_Functions_Group4 Peripheral State functions

+  * @{

+  */

+PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef *hpcd);

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Private constants ---------------------------------------------------------*/

+/** @defgroup PCD_Private_Constants PCD Private Constants

+  * @{

+  */

+/** @defgroup USB_EXTI_Line_Interrupt USB EXTI line interrupt

+  * @{

+  */

+#if defined (USB_OTG_FS)

+#define USB_OTG_FS_WAKEUP_EXTI_RISING_EDGE                            0x08U

+#define USB_OTG_FS_WAKEUP_EXTI_FALLING_EDGE                           0x0CU

+#define USB_OTG_FS_WAKEUP_EXTI_RISING_FALLING_EDGE                    0x10U

+

+#define USB_OTG_FS_WAKEUP_EXTI_LINE                                   (0x1U << 17)  /*!< USB FS EXTI Line WakeUp Interrupt */

+#endif /* defined (USB_OTG_FS) */

+

+#if defined (USB)

+#define  USB_WAKEUP_EXTI_LINE                                         (0x1U << 17)  /*!< USB FS EXTI Line WakeUp Interrupt */

+#endif /* defined (USB) */

+

+/**

+  * @}

+  */

+#if defined (USB)

+/** @defgroup PCD_EP0_MPS PCD EP0 MPS

+  * @{

+  */

+#define PCD_EP0MPS_64                                                 DEP0CTL_MPS_64

+#define PCD_EP0MPS_32                                                 DEP0CTL_MPS_32

+#define PCD_EP0MPS_16                                                 DEP0CTL_MPS_16

+#define PCD_EP0MPS_08                                                 DEP0CTL_MPS_8

+/**

+  * @}

+  */

+

+/** @defgroup PCD_ENDP PCD ENDP

+  * @{

+  */

+#define PCD_ENDP0                                                     0U

+#define PCD_ENDP1                                                     1U

+#define PCD_ENDP2                                                     2U

+#define PCD_ENDP3                                                     3U

+#define PCD_ENDP4                                                     4U

+#define PCD_ENDP5                                                     5U

+#define PCD_ENDP6                                                     6U

+#define PCD_ENDP7                                                     7U

+/**

+  * @}

+  */

+

+/** @defgroup PCD_ENDP_Kind PCD Endpoint Kind

+  * @{

+  */

+#define PCD_SNG_BUF                                                   0U

+#define PCD_DBL_BUF                                                   1U

+/**

+  * @}

+  */

+#endif /* defined (USB) */

+/**

+  * @}

+  */

+

+#if defined (USB_OTG_FS)

+#ifndef USB_OTG_DOEPINT_OTEPSPR

+#define USB_OTG_DOEPINT_OTEPSPR                (0x1UL << 5)      /*!< Status Phase Received interrupt */

+#endif

+

+#ifndef USB_OTG_DOEPMSK_OTEPSPRM

+#define USB_OTG_DOEPMSK_OTEPSPRM               (0x1UL << 5)      /*!< Setup Packet Received interrupt mask */

+#endif

+

+#ifndef USB_OTG_DOEPINT_NAK

+#define USB_OTG_DOEPINT_NAK                    (0x1UL << 13)      /*!< NAK interrupt */

+#endif

+

+#ifndef USB_OTG_DOEPMSK_NAKM

+#define USB_OTG_DOEPMSK_NAKM                   (0x1UL << 13)      /*!< OUT Packet NAK interrupt mask */

+#endif

+

+#ifndef USB_OTG_DOEPINT_STPKTRX

+#define USB_OTG_DOEPINT_STPKTRX                (0x1UL << 15)      /*!< Setup Packet Received interrupt */

+#endif

+

+#ifndef USB_OTG_DOEPMSK_NYETM

+#define USB_OTG_DOEPMSK_NYETM                  (0x1UL << 14)      /*!< Setup Packet Received interrupt mask */

+#endif

+#endif /* defined (USB_OTG_FS) */

+

+/* Private macros ------------------------------------------------------------*/

+/** @defgroup PCD_Private_Macros PCD Private Macros

+ * @{

+ */

+#if defined (USB)

+/********************  Bit definition for USB_COUNTn_RX register  *************/

+#define USB_CNTRX_NBLK_MSK                    (0x1FU << 10)

+#define USB_CNTRX_BLSIZE                      (0x1U << 15)

+

+/* SetENDPOINT */

+#define PCD_SET_ENDPOINT(USBx, bEpNum, wRegValue)  (*(__IO uint16_t *)(&(USBx)->EP0R + ((bEpNum) * 2U)) = (uint16_t)(wRegValue))

+

+/* GetENDPOINT */

+#define PCD_GET_ENDPOINT(USBx, bEpNum)            (*(__IO uint16_t *)(&(USBx)->EP0R + ((bEpNum) * 2U)))

+

+/* ENDPOINT transfer */

+#define USB_EP0StartXfer                          USB_EPStartXfer

+

+/**

+  * @brief  sets the type in the endpoint register(bits EP_TYPE[1:0])

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @param  wType Endpoint Type.

+  * @retval None

+  */

+#define PCD_SET_EPTYPE(USBx, bEpNum, wType) (PCD_SET_ENDPOINT((USBx), (bEpNum), \

+                                             ((PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EP_T_MASK) | (wType) | USB_EP_CTR_TX | USB_EP_CTR_RX)))

+

+/**

+  * @brief  gets the type in the endpoint register(bits EP_TYPE[1:0])

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @retval Endpoint Type

+  */

+#define PCD_GET_EPTYPE(USBx, bEpNum) (PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EP_T_FIELD)

+

+/**

+  * @brief free buffer used from the application realizing it to the line

+  *         toggles bit SW_BUF in the double buffered endpoint register

+  * @param USBx USB device.

+  * @param   bEpNum, bDir

+  * @retval None

+  */

+#define PCD_FreeUserBuffer(USBx, bEpNum, bDir) do { \

+  if ((bDir) == 0U) \

+  { \

+    /* OUT double buffered endpoint */ \

+    PCD_TX_DTOG((USBx), (bEpNum)); \

+  } \

+  else if ((bDir) == 1U) \

+  { \

+    /* IN double buffered endpoint */ \

+    PCD_RX_DTOG((USBx), (bEpNum)); \

+  } \

+} while(0)

+

+/**

+  * @brief  sets the status for tx transfer (bits STAT_TX[1:0]).

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @param  wState new state

+  * @retval None

+  */

+#define PCD_SET_EP_TX_STATUS(USBx, bEpNum, wState) do { \

+   register uint16_t _wRegVal; \

+   \

+    _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPTX_DTOGMASK; \

+   /* toggle first bit ? */ \

+   if ((USB_EPTX_DTOG1 & (wState))!= 0U) \

+   { \

+      _wRegVal ^= USB_EPTX_DTOG1; \

+   } \

+   /* toggle second bit ?  */ \

+   if ((USB_EPTX_DTOG2 & (wState))!= 0U) \

+   { \

+      _wRegVal ^= USB_EPTX_DTOG2; \

+   } \

+   PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); \

+  } while(0) /* PCD_SET_EP_TX_STATUS */

+

+/**

+  * @brief  sets the status for rx transfer (bits STAT_TX[1:0])

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @param  wState new state

+  * @retval None

+  */

+#define PCD_SET_EP_RX_STATUS(USBx, bEpNum,wState) do { \

+    register uint16_t _wRegVal; \

+    \

+    _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPRX_DTOGMASK; \

+    /* toggle first bit ? */ \

+    if ((USB_EPRX_DTOG1 & (wState))!= 0U) \

+    { \

+       _wRegVal ^= USB_EPRX_DTOG1; \

+    } \

+    /* toggle second bit ? */ \

+    if ((USB_EPRX_DTOG2 & (wState))!= 0U) \

+    { \

+       _wRegVal ^= USB_EPRX_DTOG2; \

+    } \

+    PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); \

+  } while(0) /* PCD_SET_EP_RX_STATUS */

+

+/**

+  * @brief  sets the status for rx & tx (bits STAT_TX[1:0] & STAT_RX[1:0])

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @param  wStaterx new state.

+  * @param  wStatetx new state.

+  * @retval None

+  */

+#define PCD_SET_EP_TXRX_STATUS(USBx, bEpNum, wStaterx, wStatetx) do { \

+    register uint16_t _wRegVal; \

+    \

+    _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & (USB_EPRX_DTOGMASK | USB_EPTX_STAT); \

+    /* toggle first bit ? */ \

+    if ((USB_EPRX_DTOG1 & (wStaterx))!= 0U) \

+    { \

+      _wRegVal ^= USB_EPRX_DTOG1; \

+    } \

+    /* toggle second bit ? */ \

+    if ((USB_EPRX_DTOG2 & (wStaterx))!= 0U) \

+    { \

+      _wRegVal ^= USB_EPRX_DTOG2; \

+    } \

+    /* toggle first bit ? */ \

+    if ((USB_EPTX_DTOG1 & (wStatetx))!= 0U) \

+    { \

+      _wRegVal ^= USB_EPTX_DTOG1; \

+    } \

+    /* toggle second bit ?  */ \

+    if ((USB_EPTX_DTOG2 & (wStatetx))!= 0U) \

+    { \

+      _wRegVal ^= USB_EPTX_DTOG2; \

+    } \

+    \

+    PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); \

+  } while(0) /* PCD_SET_EP_TXRX_STATUS */

+

+/**

+  * @brief  gets the status for tx/rx transfer (bits STAT_TX[1:0]

+  *         /STAT_RX[1:0])

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @retval status

+  */

+#define PCD_GET_EP_TX_STATUS(USBx, bEpNum)     ((uint16_t)PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPTX_STAT)

+#define PCD_GET_EP_RX_STATUS(USBx, bEpNum)     ((uint16_t)PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPRX_STAT)

+

+/**

+  * @brief  sets directly the VALID tx/rx-status into the endpoint register

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @retval None

+  */

+#define PCD_SET_EP_TX_VALID(USBx, bEpNum)      (PCD_SET_EP_TX_STATUS((USBx), (bEpNum), USB_EP_TX_VALID))

+#define PCD_SET_EP_RX_VALID(USBx, bEpNum)      (PCD_SET_EP_RX_STATUS((USBx), (bEpNum), USB_EP_RX_VALID))

+

+/**

+  * @brief  checks stall condition in an endpoint.

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @retval TRUE = endpoint in stall condition.

+  */

+#define PCD_GET_EP_TX_STALL_STATUS(USBx, bEpNum) (PCD_GET_EP_TX_STATUS((USBx), (bEpNum)) \

+                                   == USB_EP_TX_STALL)

+#define PCD_GET_EP_RX_STALL_STATUS(USBx, bEpNum) (PCD_GET_EP_RX_STATUS((USBx), (bEpNum)) \

+                                   == USB_EP_RX_STALL)

+

+/**

+  * @brief  set & clear EP_KIND bit.

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @retval None

+  */

+#define PCD_SET_EP_KIND(USBx, bEpNum) do { \

+    register uint16_t _wRegVal; \

+    \

+    _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPREG_MASK; \

+    \

+    PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX | USB_EP_KIND)); \

+  } while(0) /* PCD_SET_EP_KIND */

+

+#define PCD_CLEAR_EP_KIND(USBx, bEpNum) do { \

+    register uint16_t _wRegVal; \

+    \

+    _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPKIND_MASK; \

+    \

+    PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); \

+  } while(0) /* PCD_CLEAR_EP_KIND */

+

+/**

+  * @brief  Sets/clears directly STATUS_OUT bit in the endpoint register.

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @retval None

+  */

+#define PCD_SET_OUT_STATUS(USBx, bEpNum)       PCD_SET_EP_KIND((USBx), (bEpNum))

+#define PCD_CLEAR_OUT_STATUS(USBx, bEpNum)     PCD_CLEAR_EP_KIND((USBx), (bEpNum))

+

+/**

+  * @brief  Sets/clears directly EP_KIND bit in the endpoint register.

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @retval None

+  */

+#define PCD_SET_EP_DBUF(USBx, bEpNum)          PCD_SET_EP_KIND((USBx), (bEpNum))

+#define PCD_CLEAR_EP_DBUF(USBx, bEpNum)        PCD_CLEAR_EP_KIND((USBx), (bEpNum))

+

+/**

+  * @brief  Clears bit CTR_RX / CTR_TX in the endpoint register.

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @retval None

+  */

+#define PCD_CLEAR_RX_EP_CTR(USBx, bEpNum) do { \

+    register uint16_t _wRegVal; \

+    \

+    _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & (0x7FFFU & USB_EPREG_MASK); \

+    \

+    PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_TX)); \

+  } while(0) /* PCD_CLEAR_RX_EP_CTR */

+

+#define PCD_CLEAR_TX_EP_CTR(USBx, bEpNum) do { \

+    register uint16_t _wRegVal; \

+    \

+    _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & (0xFF7FU & USB_EPREG_MASK); \

+    \

+    PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX)); \

+  } while(0) /* PCD_CLEAR_TX_EP_CTR */

+

+/**

+  * @brief  Toggles DTOG_RX / DTOG_TX bit in the endpoint register.

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @retval None

+  */

+#define PCD_RX_DTOG(USBx, bEpNum) do { \

+    register uint16_t _wEPVal; \

+    \

+    _wEPVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPREG_MASK; \

+    \

+    PCD_SET_ENDPOINT((USBx), (bEpNum), (_wEPVal | USB_EP_CTR_RX | USB_EP_CTR_TX | USB_EP_DTOG_RX)); \

+  } while(0) /* PCD_RX_DTOG */

+

+#define PCD_TX_DTOG(USBx, bEpNum) do { \

+    register uint16_t _wEPVal; \

+    \

+    _wEPVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPREG_MASK; \

+    \

+    PCD_SET_ENDPOINT((USBx), (bEpNum), (_wEPVal | USB_EP_CTR_RX | USB_EP_CTR_TX | USB_EP_DTOG_TX)); \

+  } while(0) /* PCD_TX_DTOG */

+/**

+  * @brief  Clears DTOG_RX / DTOG_TX bit in the endpoint register.

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @retval None

+  */

+#define PCD_CLEAR_RX_DTOG(USBx, bEpNum) do { \

+    register uint16_t _wRegVal; \

+    \

+    _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)); \

+    \

+    if ((_wRegVal & USB_EP_DTOG_RX) != 0U)\

+    { \

+      PCD_RX_DTOG((USBx), (bEpNum)); \

+    } \

+  } while(0) /* PCD_CLEAR_RX_DTOG */

+

+#define PCD_CLEAR_TX_DTOG(USBx, bEpNum) do { \

+    register uint16_t _wRegVal; \

+    \

+    _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)); \

+    \

+    if ((_wRegVal & USB_EP_DTOG_TX) != 0U)\

+    { \

+      PCD_TX_DTOG((USBx), (bEpNum)); \

+    } \

+  } while(0) /* PCD_CLEAR_TX_DTOG */

+

+/**

+  * @brief  Sets address in an endpoint register.

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @param  bAddr Address.

+  * @retval None

+  */

+#define PCD_SET_EP_ADDRESS(USBx, bEpNum, bAddr) do { \

+    register uint16_t _wRegVal; \

+    \

+    _wRegVal = (PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPREG_MASK) | (bAddr); \

+    \

+    PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); \

+  } while(0) /* PCD_SET_EP_ADDRESS */

+

+/**

+  * @brief  Gets address in an endpoint register.

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @retval None

+  */

+#define PCD_GET_EP_ADDRESS(USBx, bEpNum) ((uint8_t)(PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPADDR_FIELD))

+

+#define PCD_EP_TX_CNT(USBx, bEpNum) ((uint16_t *)((((uint32_t)(USBx)->BTABLE + ((uint32_t)(bEpNum) * 8U) + 2U) * PMA_ACCESS) + ((uint32_t)(USBx) + 0x400U)))

+#define PCD_EP_RX_CNT(USBx, bEpNum) ((uint16_t *)((((uint32_t)(USBx)->BTABLE + ((uint32_t)(bEpNum) * 8U) + 6U) * PMA_ACCESS) + ((uint32_t)(USBx) + 0x400U)))

+

+/**

+  * @brief  sets address of the tx/rx buffer.

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @param  wAddr address to be set (must be word aligned).

+  * @retval None

+  */

+#define PCD_SET_EP_TX_ADDRESS(USBx, bEpNum, wAddr) do { \

+  register uint16_t *_wRegVal; \

+  register uint32_t _wRegBase = (uint32_t)USBx; \

+  \

+  _wRegBase += (uint32_t)(USBx)->BTABLE; \

+  _wRegVal = (uint16_t *)(_wRegBase + 0x400U + (((uint32_t)(bEpNum) * 8U) * PMA_ACCESS)); \

+  *_wRegVal = ((wAddr) >> 1) << 1; \

+} while(0) /* PCD_SET_EP_TX_ADDRESS */

+

+#define PCD_SET_EP_RX_ADDRESS(USBx, bEpNum, wAddr) do { \

+  register uint16_t *_wRegVal; \

+  register uint32_t _wRegBase = (uint32_t)USBx; \

+  \

+  _wRegBase += (uint32_t)(USBx)->BTABLE; \

+  _wRegVal = (uint16_t *)(_wRegBase + 0x400U + ((((uint32_t)(bEpNum) * 8U) + 4U) * PMA_ACCESS)); \

+  *_wRegVal = ((wAddr) >> 1) << 1; \

+} while(0) /* PCD_SET_EP_RX_ADDRESS */

+

+/**

+  * @brief  Gets address of the tx/rx buffer.

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @retval address of the buffer.

+  */

+#define PCD_GET_EP_TX_ADDRESS(USBx, bEpNum) ((uint16_t)*PCD_EP_TX_ADDRESS((USBx), (bEpNum)))

+#define PCD_GET_EP_RX_ADDRESS(USBx, bEpNum) ((uint16_t)*PCD_EP_RX_ADDRESS((USBx), (bEpNum)))

+

+/**

+  * @brief  Sets counter of rx buffer with no. of blocks.

+  * @param  pdwReg Register pointer

+  * @param  wCount Counter.

+  * @param  wNBlocks no. of Blocks.

+  * @retval None

+  */

+#define PCD_CALC_BLK32(pdwReg, wCount, wNBlocks) do { \

+    (wNBlocks) = (wCount) >> 5; \

+    *(pdwReg) = (uint16_t)(((wNBlocks) << 10) | USB_CNTRX_BLSIZE); \

+  } while(0) /* PCD_CALC_BLK32 */

+

+#define PCD_CALC_BLK2(pdwReg, wCount, wNBlocks) do { \

+    (wNBlocks) = (wCount) >> 1; \

+    if (((wCount) & 0x1U) != 0U) \

+    { \

+      (wNBlocks)++; \

+    } \

+    *(pdwReg) = (uint16_t)((wNBlocks) << 10); \

+  } while(0) /* PCD_CALC_BLK2 */

+

+#define PCD_SET_EP_CNT_RX_REG(pdwReg, wCount)  do { \

+    uint32_t wNBlocks; \

+    if ((wCount) == 0U) \

+    { \

+      *(pdwReg) &= (uint16_t)~USB_CNTRX_NBLK_MSK; \

+      *(pdwReg) |= USB_CNTRX_BLSIZE; \

+    } \

+    else if((wCount) < 62U) \

+    { \

+      PCD_CALC_BLK2((pdwReg), (wCount), wNBlocks); \

+    } \

+    else \

+    { \

+      PCD_CALC_BLK32((pdwReg),(wCount), wNBlocks); \

+    } \

+  } while(0) /* PCD_SET_EP_CNT_RX_REG */

+

+#define PCD_SET_EP_RX_DBUF0_CNT(USBx, bEpNum, wCount) do { \

+     register uint32_t _wRegBase = (uint32_t)(USBx); \

+     uint16_t *pdwReg; \

+     \

+    _wRegBase += (uint32_t)(USBx)->BTABLE; \

+    pdwReg = (uint16_t *)(_wRegBase + 0x400U + ((((uint32_t)(bEpNum) * 8U) + 2U) * PMA_ACCESS)); \

+    PCD_SET_EP_CNT_RX_REG(pdwReg, (wCount)); \

+  } while(0)

+

+/**

+  * @brief  sets counter for the tx/rx buffer.

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @param  wCount Counter value.

+  * @retval None

+  */

+#define PCD_SET_EP_TX_CNT(USBx, bEpNum, wCount) do { \

+    register uint32_t _wRegBase = (uint32_t)(USBx); \

+    uint16_t *_wRegVal; \

+    \

+    _wRegBase += (uint32_t)(USBx)->BTABLE; \

+    _wRegVal = (uint16_t *)(_wRegBase + 0x400U + ((((uint32_t)(bEpNum) * 8U) + 2U) * PMA_ACCESS)); \

+    *_wRegVal = (uint16_t)(wCount); \

+} while(0)

+

+#define PCD_SET_EP_RX_CNT(USBx, bEpNum, wCount) do { \

+    register uint32_t _wRegBase = (uint32_t)(USBx); \

+    uint16_t *_wRegVal; \

+    \

+    _wRegBase += (uint32_t)(USBx)->BTABLE; \

+    _wRegVal = (uint16_t *)(_wRegBase + 0x400U + ((((uint32_t)(bEpNum) * 8U) + 6U) * PMA_ACCESS)); \

+    PCD_SET_EP_CNT_RX_REG(_wRegVal, (wCount)); \

+} while(0)

+

+/**

+  * @brief  gets counter of the tx buffer.

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @retval Counter value

+  */

+#define PCD_GET_EP_TX_CNT(USBx, bEpNum)        ((uint32_t)(*PCD_EP_TX_CNT((USBx), (bEpNum))) & 0x3ffU)

+#define PCD_GET_EP_RX_CNT(USBx, bEpNum)        ((uint32_t)(*PCD_EP_RX_CNT((USBx), (bEpNum))) & 0x3ffU)

+

+/**

+  * @brief  Sets buffer 0/1 address in a double buffer endpoint.

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @param  wBuf0Addr buffer 0 address.

+  * @retval Counter value

+  */

+#define PCD_SET_EP_DBUF0_ADDR(USBx, bEpNum, wBuf0Addr) do { \

+    PCD_SET_EP_TX_ADDRESS((USBx), (bEpNum), (wBuf0Addr)); \

+  } while(0) /* PCD_SET_EP_DBUF0_ADDR */

+#define PCD_SET_EP_DBUF1_ADDR(USBx, bEpNum, wBuf1Addr) do { \

+    PCD_SET_EP_RX_ADDRESS((USBx), (bEpNum), (wBuf1Addr)); \

+  } while(0) /* PCD_SET_EP_DBUF1_ADDR */

+

+/**

+  * @brief  Sets addresses in a double buffer endpoint.

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @param  wBuf0Addr: buffer 0 address.

+  * @param  wBuf1Addr = buffer 1 address.

+  * @retval None

+  */

+#define PCD_SET_EP_DBUF_ADDR(USBx, bEpNum, wBuf0Addr, wBuf1Addr) do { \

+    PCD_SET_EP_DBUF0_ADDR((USBx), (bEpNum), (wBuf0Addr)); \

+    PCD_SET_EP_DBUF1_ADDR((USBx), (bEpNum), (wBuf1Addr)); \

+  } while(0) /* PCD_SET_EP_DBUF_ADDR */

+

+/**

+  * @brief  Gets buffer 0/1 address of a double buffer endpoint.

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @retval None

+  */

+#define PCD_GET_EP_DBUF0_ADDR(USBx, bEpNum)    (PCD_GET_EP_TX_ADDRESS((USBx), (bEpNum)))

+#define PCD_GET_EP_DBUF1_ADDR(USBx, bEpNum)    (PCD_GET_EP_RX_ADDRESS((USBx), (bEpNum)))

+

+/**

+  * @brief  Gets buffer 0/1 address of a double buffer endpoint.

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @param  bDir endpoint dir  EP_DBUF_OUT = OUT

+  *         EP_DBUF_IN  = IN

+  * @param  wCount: Counter value

+  * @retval None

+  */

+#define PCD_SET_EP_DBUF0_CNT(USBx, bEpNum, bDir, wCount) do { \

+    if ((bDir) == 0U) \

+      /* OUT endpoint */ \

+    { \

+      PCD_SET_EP_RX_DBUF0_CNT((USBx), (bEpNum), (wCount)); \

+    } \

+    else \

+    { \

+      if ((bDir) == 1U) \

+      { \

+        /* IN endpoint */ \

+        PCD_SET_EP_TX_CNT((USBx), (bEpNum), (wCount)); \

+      } \

+    } \

+  } while(0) /* SetEPDblBuf0Count*/

+

+#define PCD_SET_EP_DBUF1_CNT(USBx, bEpNum, bDir, wCount) do { \

+    register uint32_t _wBase = (uint32_t)(USBx); \

+    uint16_t *_wEPRegVal; \

+    \

+    if ((bDir) == 0U) \

+    { \

+      /* OUT endpoint */ \

+      PCD_SET_EP_RX_CNT((USBx), (bEpNum), (wCount)); \

+    } \

+    else \

+    { \

+      if ((bDir) == 1U) \

+      { \

+        /* IN endpoint */ \

+        _wBase += (uint32_t)(USBx)->BTABLE; \

+        _wEPRegVal = (uint16_t *)(_wBase + 0x400U + ((((uint32_t)(bEpNum) * 8U) + 6U) * PMA_ACCESS)); \

+        *_wEPRegVal = (uint16_t)(wCount); \

+      } \

+    } \

+  } while(0) /* SetEPDblBuf1Count */

+

+#define PCD_SET_EP_DBUF_CNT(USBx, bEpNum, bDir, wCount) do { \

+    PCD_SET_EP_DBUF0_CNT((USBx), (bEpNum), (bDir), (wCount)); \

+    PCD_SET_EP_DBUF1_CNT((USBx), (bEpNum), (bDir), (wCount)); \

+  } while(0) /* PCD_SET_EP_DBUF_CNT  */

+

+/**

+  * @brief  Gets buffer 0/1 rx/tx counter for double buffering.

+  * @param  USBx USB peripheral instance register address.

+  * @param  bEpNum Endpoint Number.

+  * @retval None

+  */

+#define PCD_GET_EP_DBUF0_CNT(USBx, bEpNum)     (PCD_GET_EP_TX_CNT((USBx), (bEpNum)))

+#define PCD_GET_EP_DBUF1_CNT(USBx, bEpNum)     (PCD_GET_EP_RX_CNT((USBx), (bEpNum)))

+

+#endif /* defined (USB) */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+#endif /* defined (USB) || defined (USB_OTG_FS) */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* STM32L4xx_HAL_PCD_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd_ex.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd_ex.h
new file mode 100644
index 0000000..ac1529e
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd_ex.h
@@ -0,0 +1,97 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_pcd_ex.h

+  * @author  MCD Application Team

+  * @brief   Header file of PCD HAL Extension module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef STM32L4xx_HAL_PCD_EX_H

+#define STM32L4xx_HAL_PCD_EX_H

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+#if defined (USB) || defined (USB_OTG_FS)

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup PCDEx

+  * @{

+  */

+/* Exported types ------------------------------------------------------------*/

+/* Exported constants --------------------------------------------------------*/

+/* Exported macros -----------------------------------------------------------*/

+/* Exported functions --------------------------------------------------------*/

+/** @addtogroup PCDEx_Exported_Functions PCDEx Exported Functions

+  * @{

+  */

+/** @addtogroup PCDEx_Exported_Functions_Group1 Peripheral Control functions

+  * @{

+  */

+

+#if defined (USB_OTG_FS)

+HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size);

+HAL_StatusTypeDef HAL_PCDEx_SetRxFiFo(PCD_HandleTypeDef *hpcd, uint16_t size);

+#endif /* defined (USB_OTG_FS) */

+

+#if defined (USB)

+HAL_StatusTypeDef  HAL_PCDEx_PMAConfig(PCD_HandleTypeDef *hpcd,

+                                       uint16_t ep_addr,

+                                       uint16_t ep_kind,

+                                       uint32_t pmaadress);

+#endif /* defined (USB) */

+

+HAL_StatusTypeDef HAL_PCDEx_ActivateLPM(PCD_HandleTypeDef *hpcd);

+HAL_StatusTypeDef HAL_PCDEx_DeActivateLPM(PCD_HandleTypeDef *hpcd);

+

+

+HAL_StatusTypeDef HAL_PCDEx_ActivateBCD(PCD_HandleTypeDef *hpcd);

+HAL_StatusTypeDef HAL_PCDEx_DeActivateBCD(PCD_HandleTypeDef *hpcd);

+void HAL_PCDEx_BCD_VBUSDetect(PCD_HandleTypeDef *hpcd);

+

+void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg);

+void HAL_PCDEx_BCD_Callback(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg);

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+#endif /* defined (USB) || defined (USB_OTG_FS) */

+

+#ifdef __cplusplus

+}

+#endif

+

+

+#endif /* STM32L4xx_HAL_PCD_EX_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h
new file mode 100644
index 0000000..1e20ff7
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h
@@ -0,0 +1,414 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_pwr.h

+  * @author  MCD Application Team

+  * @brief   Header file of PWR HAL module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef __STM32L4xx_HAL_PWR_H

+#define __STM32L4xx_HAL_PWR_H

+

+#ifdef __cplusplus

+ extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup PWR

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+

+/** @defgroup PWR_Exported_Types PWR Exported Types

+  * @{

+  */

+

+/**

+  * @brief  PWR PVD configuration structure definition

+  */

+typedef struct

+{

+  uint32_t PVDLevel;   /*!< PVDLevel: Specifies the PVD detection level.

+                            This parameter can be a value of @ref PWR_PVD_detection_level. */

+

+  uint32_t Mode;      /*!< Mode: Specifies the operating mode for the selected pins.

+                           This parameter can be a value of @ref PWR_PVD_Mode. */

+}PWR_PVDTypeDef;

+

+

+/**

+  * @}

+  */

+

+/* Exported constants --------------------------------------------------------*/

+

+/** @defgroup PWR_Exported_Constants PWR Exported Constants

+  * @{

+  */

+

+

+/** @defgroup PWR_PVD_detection_level Programmable Voltage Detection levels

+  * @{

+  */

+#define PWR_PVDLEVEL_0                  PWR_CR2_PLS_LEV0  /*!< PVD threshold around 2.0 V */

+#define PWR_PVDLEVEL_1                  PWR_CR2_PLS_LEV1  /*!< PVD threshold around 2.2 V */

+#define PWR_PVDLEVEL_2                  PWR_CR2_PLS_LEV2  /*!< PVD threshold around 2.4 V */

+#define PWR_PVDLEVEL_3                  PWR_CR2_PLS_LEV3  /*!< PVD threshold around 2.5 V */

+#define PWR_PVDLEVEL_4                  PWR_CR2_PLS_LEV4  /*!< PVD threshold around 2.6 V */

+#define PWR_PVDLEVEL_5                  PWR_CR2_PLS_LEV5  /*!< PVD threshold around 2.8 V */

+#define PWR_PVDLEVEL_6                  PWR_CR2_PLS_LEV6  /*!< PVD threshold around 2.9 V */

+#define PWR_PVDLEVEL_7                  PWR_CR2_PLS_LEV7  /*!< External input analog voltage (compared internally to VREFINT) */

+/**

+  * @}

+  */

+

+/** @defgroup PWR_PVD_Mode  PWR PVD interrupt and event mode

+  * @{

+  */

+#define PWR_PVD_MODE_NORMAL                 ((uint32_t)0x00000000)   /*!< Basic mode is used */

+#define PWR_PVD_MODE_IT_RISING              ((uint32_t)0x00010001)   /*!< External Interrupt Mode with Rising edge trigger detection */

+#define PWR_PVD_MODE_IT_FALLING             ((uint32_t)0x00010002)   /*!< External Interrupt Mode with Falling edge trigger detection */

+#define PWR_PVD_MODE_IT_RISING_FALLING      ((uint32_t)0x00010003)   /*!< External Interrupt Mode with Rising/Falling edge trigger detection */

+#define PWR_PVD_MODE_EVENT_RISING           ((uint32_t)0x00020001)   /*!< Event Mode with Rising edge trigger detection */

+#define PWR_PVD_MODE_EVENT_FALLING          ((uint32_t)0x00020002)   /*!< Event Mode with Falling edge trigger detection */

+#define PWR_PVD_MODE_EVENT_RISING_FALLING   ((uint32_t)0x00020003)   /*!< Event Mode with Rising/Falling edge trigger detection */

+/**

+  * @}

+  */

+

+

+

+

+/** @defgroup PWR_Regulator_state_in_SLEEP_STOP_mode  PWR regulator mode

+  * @{

+  */

+#define PWR_MAINREGULATOR_ON            ((uint32_t)0x00000000) /*!< Regulator in main mode      */

+#define PWR_LOWPOWERREGULATOR_ON        PWR_CR1_LPR            /*!< Regulator in low-power mode */

+/**

+  * @}

+  */

+

+/** @defgroup PWR_SLEEP_mode_entry  PWR SLEEP mode entry

+  * @{

+  */

+#define PWR_SLEEPENTRY_WFI              ((uint8_t)0x01)        /*!< Wait For Interruption instruction to enter Sleep mode */

+#define PWR_SLEEPENTRY_WFE              ((uint8_t)0x02)        /*!< Wait For Event instruction to enter Sleep mode        */

+/**

+  * @}

+  */

+

+/** @defgroup PWR_STOP_mode_entry  PWR STOP mode entry

+  * @{

+  */

+#define PWR_STOPENTRY_WFI               ((uint8_t)0x01)       /*!< Wait For Interruption instruction to enter Stop mode */

+#define PWR_STOPENTRY_WFE               ((uint8_t)0x02)       /*!< Wait For Event instruction to enter Stop mode        */

+/**

+  * @}

+  */

+

+

+/** @defgroup PWR_PVD_EXTI_LINE  PWR PVD external interrupt line

+  * @{

+  */

+#define PWR_EXTI_LINE_PVD  ((uint32_t)0x00010000)   /*!< External interrupt line 16 Connected to the PVD EXTI Line */

+/**

+  * @}

+  */

+

+/** @defgroup PWR_PVD_EVENT_LINE  PWR PVD event line

+  * @{

+  */

+#define PWR_EVENT_LINE_PVD  ((uint32_t)0x00010000)  /*!< Event line 16 Connected to the PVD Event Line */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Exported macros -----------------------------------------------------------*/

+/** @defgroup PWR_Exported_Macros  PWR Exported Macros

+  * @{

+  */

+

+/** @brief  Check whether or not a specific PWR flag is set.

+  * @param  __FLAG__: specifies the flag to check.

+  *           This parameter can be one of the following values:

+  *            @arg @ref PWR_FLAG_WUF1 Wake Up Flag 1. Indicates that a wakeup event

+  *                  was received from the WKUP pin 1.

+  *            @arg @ref PWR_FLAG_WUF2 Wake Up Flag 2. Indicates that a wakeup event

+  *                  was received from the WKUP pin 2.

+  *            @arg @ref PWR_FLAG_WUF3 Wake Up Flag 3. Indicates that a wakeup event

+  *                  was received from the WKUP pin 3.

+  *            @arg @ref PWR_FLAG_WUF4 Wake Up Flag 4. Indicates that a wakeup event

+  *                  was received from the WKUP pin 4.

+  *            @arg @ref PWR_FLAG_WUF5 Wake Up Flag 5. Indicates that a wakeup event

+  *                  was received from the WKUP pin 5.

+  *            @arg @ref PWR_FLAG_SB StandBy Flag. Indicates that the system

+  *                  entered StandBy mode.

+  *            @arg @ref PWR_FLAG_EXT_SMPS External SMPS Ready Flag. When available on device, indicates

+  *                 that external switch can be closed to connect to the external SMPS, when the Range 2

+  *                 of internal regulator is ready.

+  *            @arg @ref PWR_FLAG_WUFI Wake-Up Flag Internal. Set when a wakeup is detected on

+  *                 the internal wakeup line.

+  *            @arg @ref PWR_FLAG_REGLPS Low Power Regulator Started. Indicates whether or not the

+  *                 low-power regulator is ready.

+  *            @arg @ref PWR_FLAG_REGLPF Low Power Regulator Flag. Indicates whether the

+  *                 regulator is ready in main mode or is in low-power mode.

+  *            @arg @ref PWR_FLAG_VOSF Voltage Scaling Flag. Indicates whether the regulator is ready

+  *                 in the selected voltage range or is still changing to the required voltage level.

+  *            @arg @ref PWR_FLAG_PVDO Power Voltage Detector Output. Indicates whether VDD voltage is

+  *                  below or above the selected PVD threshold.

+  *            @arg @ref PWR_FLAG_PVMO1 Peripheral Voltage Monitoring Output 1. Indicates whether VDDUSB voltage is

+  *                  is below or above PVM1 threshold (applicable when USB feature is supported).

+  @if STM32L486xx

+  *            @arg @ref PWR_FLAG_PVMO2 Peripheral Voltage Monitoring Output 2. Indicates whether VDDIO2 voltage is

+  *                  is below or above PVM2 threshold (applicable when VDDIO2 is present on device).

+  @endif

+  *            @arg @ref PWR_FLAG_PVMO3 Peripheral Voltage Monitoring Output 3. Indicates whether VDDA voltage is

+  *                  is below or above PVM3 threshold.

+  *            @arg @ref PWR_FLAG_PVMO4 Peripheral Voltage Monitoring Output 4. Indicates whether VDDA voltage is

+  *                  is below or above PVM4 threshold.

+  *

+  * @retval The new state of __FLAG__ (TRUE or FALSE).

+  */

+#define __HAL_PWR_GET_FLAG(__FLAG__)  ( ((((uint8_t)(__FLAG__)) >> 5U) == 1)  ?\

+                                      (PWR->SR1 & (1U << ((__FLAG__) & 31U))) :\

+                                      (PWR->SR2 & (1U << ((__FLAG__) & 31U))) )

+

+/** @brief  Clear a specific PWR flag.

+  * @param  __FLAG__: specifies the flag to clear.

+  *          This parameter can be one of the following values:

+  *            @arg @ref PWR_FLAG_WUF1 Wake Up Flag 1. Indicates that a wakeup event

+  *                  was received from the WKUP pin 1.

+  *            @arg @ref PWR_FLAG_WUF2 Wake Up Flag 2. Indicates that a wakeup event

+  *                  was received from the WKUP pin 2.

+  *            @arg @ref PWR_FLAG_WUF3 Wake Up Flag 3. Indicates that a wakeup event

+  *                  was received from the WKUP pin 3.

+  *            @arg @ref PWR_FLAG_WUF4 Wake Up Flag 4. Indicates that a wakeup event

+  *                  was received from the WKUP pin 4.

+  *            @arg @ref PWR_FLAG_WUF5 Wake Up Flag 5. Indicates that a wakeup event

+  *                  was received from the WKUP pin 5.

+  *            @arg @ref PWR_FLAG_WU Encompasses all five Wake Up Flags.

+  *            @arg @ref PWR_FLAG_SB Standby Flag. Indicates that the system

+  *                  entered Standby mode.

+  * @retval None

+  */

+#define __HAL_PWR_CLEAR_FLAG(__FLAG__)   ( (((uint8_t)(__FLAG__)) == PWR_FLAG_WU) ?\

+                                         (PWR->SCR  = (__FLAG__)) :\

+                                         (PWR->SCR = (1U << ((__FLAG__) & 31U))) )

+/**

+  * @brief Enable the PVD Extended Interrupt Line.

+  * @retval None

+  */

+#define __HAL_PWR_PVD_EXTI_ENABLE_IT()   SET_BIT(EXTI->IMR1, PWR_EXTI_LINE_PVD)

+

+/**

+  * @brief Disable the PVD Extended Interrupt Line.

+  * @retval None

+  */

+#define __HAL_PWR_PVD_EXTI_DISABLE_IT()  CLEAR_BIT(EXTI->IMR1, PWR_EXTI_LINE_PVD)

+

+/**

+  * @brief Enable the PVD Event Line.

+  * @retval None

+  */

+#define __HAL_PWR_PVD_EXTI_ENABLE_EVENT()   SET_BIT(EXTI->EMR1, PWR_EVENT_LINE_PVD)

+

+/**

+  * @brief Disable the PVD Event Line.

+  * @retval None

+  */

+#define __HAL_PWR_PVD_EXTI_DISABLE_EVENT()  CLEAR_BIT(EXTI->EMR1, PWR_EVENT_LINE_PVD)

+

+/**

+  * @brief Enable the PVD Extended Interrupt Rising Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE()   SET_BIT(EXTI->RTSR1, PWR_EXTI_LINE_PVD)

+

+/**

+  * @brief Disable the PVD Extended Interrupt Rising Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE()  CLEAR_BIT(EXTI->RTSR1, PWR_EXTI_LINE_PVD)

+

+/**

+  * @brief Enable the PVD Extended Interrupt Falling Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE()   SET_BIT(EXTI->FTSR1, PWR_EXTI_LINE_PVD)

+

+

+/**

+  * @brief Disable the PVD Extended Interrupt Falling Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE()  CLEAR_BIT(EXTI->FTSR1, PWR_EXTI_LINE_PVD)

+

+

+/**

+  * @brief  Enable the PVD Extended Interrupt Rising & Falling Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_FALLING_EDGE()  \

+  do {                                                   \

+    __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE();             \

+    __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE();            \

+  } while(0)

+

+/**

+  * @brief Disable the PVD Extended Interrupt Rising & Falling Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_FALLING_EDGE()  \

+  do {                                                    \

+    __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE();             \

+    __HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE();            \

+  } while(0)

+

+/**

+  * @brief  Generate a Software interrupt on selected EXTI line.

+  * @retval None

+  */

+#define __HAL_PWR_PVD_EXTI_GENERATE_SWIT() SET_BIT(EXTI->SWIER1, PWR_EXTI_LINE_PVD)

+

+/**

+  * @brief Check whether or not the PVD EXTI interrupt flag is set.

+  * @retval EXTI PVD Line Status.

+  */

+#define __HAL_PWR_PVD_EXTI_GET_FLAG()  (EXTI->PR1 & PWR_EXTI_LINE_PVD)

+

+/**

+  * @brief Clear the PVD EXTI interrupt flag.

+  * @retval None

+  */

+#define __HAL_PWR_PVD_EXTI_CLEAR_FLAG()  WRITE_REG(EXTI->PR1, PWR_EXTI_LINE_PVD)

+

+/**

+  * @}

+  */

+

+

+/* Private macros --------------------------------------------------------*/

+/** @addtogroup  PWR_Private_Macros   PWR Private Macros

+  * @{

+  */

+

+#define IS_PWR_PVD_LEVEL(LEVEL) (((LEVEL) == PWR_PVDLEVEL_0) || ((LEVEL) == PWR_PVDLEVEL_1)|| \

+                                 ((LEVEL) == PWR_PVDLEVEL_2) || ((LEVEL) == PWR_PVDLEVEL_3)|| \

+                                 ((LEVEL) == PWR_PVDLEVEL_4) || ((LEVEL) == PWR_PVDLEVEL_5)|| \

+                                 ((LEVEL) == PWR_PVDLEVEL_6) || ((LEVEL) == PWR_PVDLEVEL_7))

+

+#define IS_PWR_PVD_MODE(MODE)  (((MODE) == PWR_PVD_MODE_NORMAL)              ||\

+                                ((MODE) == PWR_PVD_MODE_IT_RISING)           ||\

+                                ((MODE) == PWR_PVD_MODE_IT_FALLING)          ||\

+                                ((MODE) == PWR_PVD_MODE_IT_RISING_FALLING)   ||\

+                                ((MODE) == PWR_PVD_MODE_EVENT_RISING)        ||\

+                                ((MODE) == PWR_PVD_MODE_EVENT_FALLING)       ||\

+                                ((MODE) == PWR_PVD_MODE_EVENT_RISING_FALLING))

+

+#define IS_PWR_REGULATOR(REGULATOR)      (((REGULATOR) == PWR_MAINREGULATOR_ON) || \

+                                          ((REGULATOR) == PWR_LOWPOWERREGULATOR_ON))

+

+#define IS_PWR_SLEEP_ENTRY(ENTRY) (((ENTRY) == PWR_SLEEPENTRY_WFI) || ((ENTRY) == PWR_SLEEPENTRY_WFE))

+

+#define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPENTRY_WFI) || ((ENTRY) == PWR_STOPENTRY_WFE) )

+

+/**

+  * @}

+  */

+

+/* Include PWR HAL Extended module */

+#include "stm32l4xx_hal_pwr_ex.h"

+

+/* Exported functions --------------------------------------------------------*/

+

+/** @addtogroup PWR_Exported_Functions PWR Exported Functions

+  * @{

+  */

+

+/** @addtogroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions

+  * @{

+  */

+

+/* Initialization and de-initialization functions *******************************/

+void HAL_PWR_DeInit(void);

+void HAL_PWR_EnableBkUpAccess(void);

+void HAL_PWR_DisableBkUpAccess(void);

+

+/**

+  * @}

+  */

+

+/** @addtogroup PWR_Exported_Functions_Group2 Peripheral Control functions

+  * @{

+  */

+

+/* Peripheral Control functions  ************************************************/

+HAL_StatusTypeDef HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD);

+void HAL_PWR_EnablePVD(void);

+void HAL_PWR_DisablePVD(void);

+

+

+/* WakeUp pins configuration functions ****************************************/

+void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinPolarity);

+void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx);

+

+/* Low Power modes configuration functions ************************************/

+void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry);

+void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry);

+void HAL_PWR_EnterSTANDBYMode(void);

+

+void HAL_PWR_EnableSleepOnExit(void);

+void HAL_PWR_DisableSleepOnExit(void);

+void HAL_PWR_EnableSEVOnPend(void);

+void HAL_PWR_DisableSEVOnPend(void);

+

+void HAL_PWR_PVDCallback(void);

+

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+

+#endif /* __STM32L4xx_HAL_PWR_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h
new file mode 100644
index 0000000..b6364c5
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h
@@ -0,0 +1,907 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_pwr_ex.h

+  * @author  MCD Application Team

+  * @brief   Header file of PWR HAL Extended module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef __STM32L4xx_HAL_PWR_EX_H

+#define __STM32L4xx_HAL_PWR_EX_H

+

+#ifdef __cplusplus

+ extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup PWREx

+  * @{

+  */

+

+

+/* Exported types ------------------------------------------------------------*/

+

+/** @defgroup PWREx_Exported_Types PWR Extended Exported Types

+  * @{

+  */

+

+

+/**

+  * @brief  PWR PVM configuration structure definition

+  */

+typedef struct

+{

+  uint32_t PVMType;   /*!< PVMType: Specifies which voltage is monitored and against which threshold.

+                           This parameter can be a value of @ref PWREx_PVM_Type.

+                           @arg @ref PWR_PVM_1 Peripheral Voltage Monitoring 1 enable: VDDUSB versus 1.2 V (applicable when USB feature is supported).

+@if STM32L486xx

+                           @arg @ref PWR_PVM_2 Peripheral Voltage Monitoring 2 enable: VDDIO2 versus 0.9 V (applicable when VDDIO2 is present on device).

+@endif

+                           @arg @ref PWR_PVM_3 Peripheral Voltage Monitoring 3 enable: VDDA versus 1.62 V.

+                           @arg @ref PWR_PVM_4 Peripheral Voltage Monitoring 4 enable: VDDA versus 2.2 V. */

+

+  uint32_t Mode;      /*!< Mode: Specifies the operating mode for the selected pins.

+                           This parameter can be a value of @ref PWREx_PVM_Mode. */

+}PWR_PVMTypeDef;

+

+/**

+  * @}

+  */

+

+/* Exported constants --------------------------------------------------------*/

+

+/** @defgroup PWREx_Exported_Constants  PWR Extended Exported Constants

+  * @{

+  */

+

+/** @defgroup PWREx_WUP_Polarity Shift to apply to retrieve polarity information from PWR_WAKEUP_PINy_xxx constants

+  * @{

+  */

+#define PWR_WUP_POLARITY_SHIFT                  0x05   /*!< Internal constant used to retrieve wakeup pin polariry */

+/**

+  * @}

+  */

+

+

+/** @defgroup PWREx_WakeUp_Pins  PWR wake-up pins

+  * @{

+  */

+#define PWR_WAKEUP_PIN1                 PWR_CR3_EWUP1  /*!< Wakeup pin 1 (with high level polarity) */

+#define PWR_WAKEUP_PIN2                 PWR_CR3_EWUP2  /*!< Wakeup pin 2 (with high level polarity) */

+#define PWR_WAKEUP_PIN3                 PWR_CR3_EWUP3  /*!< Wakeup pin 3 (with high level polarity) */

+#define PWR_WAKEUP_PIN4                 PWR_CR3_EWUP4  /*!< Wakeup pin 4 (with high level polarity) */

+#define PWR_WAKEUP_PIN5                 PWR_CR3_EWUP5  /*!< Wakeup pin 5 (with high level polarity) */

+#define PWR_WAKEUP_PIN1_HIGH            PWR_CR3_EWUP1  /*!< Wakeup pin 1 (with high level polarity) */

+#define PWR_WAKEUP_PIN2_HIGH            PWR_CR3_EWUP2  /*!< Wakeup pin 2 (with high level polarity) */

+#define PWR_WAKEUP_PIN3_HIGH            PWR_CR3_EWUP3  /*!< Wakeup pin 3 (with high level polarity) */

+#define PWR_WAKEUP_PIN4_HIGH            PWR_CR3_EWUP4  /*!< Wakeup pin 4 (with high level polarity) */

+#define PWR_WAKEUP_PIN5_HIGH            PWR_CR3_EWUP5  /*!< Wakeup pin 5 (with high level polarity) */

+#define PWR_WAKEUP_PIN1_LOW             (uint32_t)((PWR_CR4_WP1<<PWR_WUP_POLARITY_SHIFT) | PWR_CR3_EWUP1) /*!< Wakeup pin 1 (with low level polarity) */

+#define PWR_WAKEUP_PIN2_LOW             (uint32_t)((PWR_CR4_WP2<<PWR_WUP_POLARITY_SHIFT) | PWR_CR3_EWUP2) /*!< Wakeup pin 2 (with low level polarity) */

+#define PWR_WAKEUP_PIN3_LOW             (uint32_t)((PWR_CR4_WP3<<PWR_WUP_POLARITY_SHIFT) | PWR_CR3_EWUP3) /*!< Wakeup pin 3 (with low level polarity) */

+#define PWR_WAKEUP_PIN4_LOW             (uint32_t)((PWR_CR4_WP4<<PWR_WUP_POLARITY_SHIFT) | PWR_CR3_EWUP4) /*!< Wakeup pin 4 (with low level polarity) */

+#define PWR_WAKEUP_PIN5_LOW             (uint32_t)((PWR_CR4_WP5<<PWR_WUP_POLARITY_SHIFT) | PWR_CR3_EWUP5) /*!< Wakeup pin 5 (with low level polarity) */

+/**

+  * @}

+  */

+

+/** @defgroup PWREx_PVM_Type Peripheral Voltage Monitoring type

+  * @{

+  */

+#if defined(PWR_CR2_PVME1)

+#define PWR_PVM_1                  PWR_CR2_PVME1  /*!< Peripheral Voltage Monitoring 1 enable: VDDUSB versus 1.2 V (applicable when USB feature is supported) */

+#endif /* PWR_CR2_PVME1 */

+#if defined(PWR_CR2_PVME2)

+#define PWR_PVM_2                  PWR_CR2_PVME2  /*!< Peripheral Voltage Monitoring 2 enable: VDDIO2 versus 0.9 V (applicable when VDDIO2 is present on device) */

+#endif /* PWR_CR2_PVME2 */

+#define PWR_PVM_3                  PWR_CR2_PVME3  /*!< Peripheral Voltage Monitoring 3 enable: VDDA versus 1.62 V */

+#define PWR_PVM_4                  PWR_CR2_PVME4  /*!< Peripheral Voltage Monitoring 4 enable: VDDA versus 2.2 V  */

+/**

+  * @}

+  */

+

+/** @defgroup PWREx_PVM_Mode  PWR PVM interrupt and event mode

+  * @{

+  */

+#define PWR_PVM_MODE_NORMAL                 ((uint32_t)0x00000000)   /*!< basic mode is used */

+#define PWR_PVM_MODE_IT_RISING              ((uint32_t)0x00010001)   /*!< External Interrupt Mode with Rising edge trigger detection */

+#define PWR_PVM_MODE_IT_FALLING             ((uint32_t)0x00010002)   /*!< External Interrupt Mode with Falling edge trigger detection */

+#define PWR_PVM_MODE_IT_RISING_FALLING      ((uint32_t)0x00010003)   /*!< External Interrupt Mode with Rising/Falling edge trigger detection */

+#define PWR_PVM_MODE_EVENT_RISING           ((uint32_t)0x00020001)   /*!< Event Mode with Rising edge trigger detection */

+#define PWR_PVM_MODE_EVENT_FALLING          ((uint32_t)0x00020002)   /*!< Event Mode with Falling edge trigger detection */

+#define PWR_PVM_MODE_EVENT_RISING_FALLING   ((uint32_t)0x00020003)   /*!< Event Mode with Rising/Falling edge trigger detection */

+/**

+  * @}

+  */

+

+

+

+/** @defgroup PWREx_Regulator_Voltage_Scale  PWR Regulator voltage scale

+  * @{

+  */

+#if defined(PWR_CR5_R1MODE)

+#define PWR_REGULATOR_VOLTAGE_SCALE1_BOOST  ((uint32_t)0x00000000)  /*!< Voltage scaling range 1 boost mode  */

+#endif

+#define PWR_REGULATOR_VOLTAGE_SCALE1        PWR_CR1_VOS_0           /*!< Voltage scaling range 1 normal mode */

+#define PWR_REGULATOR_VOLTAGE_SCALE2        PWR_CR1_VOS_1           /*!< Voltage scaling range 2             */

+/**

+  * @}

+  */

+

+

+/** @defgroup PWREx_VBAT_Battery_Charging_Selection PWR battery charging resistor selection

+  * @{

+  */

+#define PWR_BATTERY_CHARGING_RESISTOR_5          ((uint32_t)0x00000000) /*!< VBAT charging through a 5 kOhms resistor   */

+#define PWR_BATTERY_CHARGING_RESISTOR_1_5         PWR_CR4_VBRS          /*!< VBAT charging through a 1.5 kOhms resistor */

+/**

+  * @}

+  */

+

+/** @defgroup PWREx_VBAT_Battery_Charging PWR battery charging

+  * @{

+  */

+#define PWR_BATTERY_CHARGING_DISABLE        ((uint32_t)0x00000000)

+#define PWR_BATTERY_CHARGING_ENABLE         PWR_CR4_VBE

+/**

+  * @}

+  */

+

+/** @defgroup PWREx_GPIO_Bit_Number GPIO bit number for I/O setting in standby/shutdown mode

+  * @{

+  */

+#define PWR_GPIO_BIT_0   PWR_PUCRA_PA0    /*!< GPIO port I/O pin 0  */

+#define PWR_GPIO_BIT_1   PWR_PUCRA_PA1    /*!< GPIO port I/O pin 1  */

+#define PWR_GPIO_BIT_2   PWR_PUCRA_PA2    /*!< GPIO port I/O pin 2  */

+#define PWR_GPIO_BIT_3   PWR_PUCRA_PA3    /*!< GPIO port I/O pin 3  */

+#define PWR_GPIO_BIT_4   PWR_PUCRA_PA4    /*!< GPIO port I/O pin 4  */

+#define PWR_GPIO_BIT_5   PWR_PUCRA_PA5    /*!< GPIO port I/O pin 5  */

+#define PWR_GPIO_BIT_6   PWR_PUCRA_PA6    /*!< GPIO port I/O pin 6  */

+#define PWR_GPIO_BIT_7   PWR_PUCRA_PA7    /*!< GPIO port I/O pin 7  */

+#define PWR_GPIO_BIT_8   PWR_PUCRA_PA8    /*!< GPIO port I/O pin 8  */

+#define PWR_GPIO_BIT_9   PWR_PUCRA_PA9    /*!< GPIO port I/O pin 9  */

+#define PWR_GPIO_BIT_10  PWR_PUCRA_PA10   /*!< GPIO port I/O pin 10 */

+#define PWR_GPIO_BIT_11  PWR_PUCRA_PA11   /*!< GPIO port I/O pin 11 */

+#define PWR_GPIO_BIT_12  PWR_PUCRA_PA12   /*!< GPIO port I/O pin 12 */

+#define PWR_GPIO_BIT_13  PWR_PUCRA_PA13   /*!< GPIO port I/O pin 13 */

+#define PWR_GPIO_BIT_14  PWR_PDCRA_PA14   /*!< GPIO port I/O pin 14 */

+#define PWR_GPIO_BIT_15  PWR_PUCRA_PA15   /*!< GPIO port I/O pin 15 */

+/**

+  * @}

+  */

+

+/** @defgroup PWREx_GPIO GPIO port

+  * @{

+  */

+#define PWR_GPIO_A   0x00000000U      /*!< GPIO port A */

+#define PWR_GPIO_B   0x00000001U      /*!< GPIO port B */

+#define PWR_GPIO_C   0x00000002U      /*!< GPIO port C */

+#if defined(GPIOD_BASE)

+#define PWR_GPIO_D   0x00000003U      /*!< GPIO port D */

+#endif

+#if defined(GPIOE_BASE)

+#define PWR_GPIO_E   0x00000004U      /*!< GPIO port E */

+#endif

+#if defined(GPIOF_BASE)

+#define PWR_GPIO_F   0x00000005U      /*!< GPIO port F */

+#endif

+#if defined(GPIOG_BASE)

+#define PWR_GPIO_G   0x00000006U      /*!< GPIO port G */

+#endif

+#define PWR_GPIO_H   0x00000007U      /*!< GPIO port H */

+#if defined(GPIOI_BASE)

+#define PWR_GPIO_I   0x00000008U      /*!< GPIO port I */

+#endif

+/**

+  * @}

+  */

+

+/** @defgroup PWREx_PVM_EXTI_LINE PWR PVM external interrupts lines

+  * @{

+  */

+#if defined(PWR_CR2_PVME1)

+#define PWR_EXTI_LINE_PVM1  ((uint32_t)0x00000008)  /*!< External interrupt line 35 Connected to the PVM1 EXTI Line   */

+#endif /* PWR_CR2_PVME1 */

+#if defined(PWR_CR2_PVME2)

+#define PWR_EXTI_LINE_PVM2  ((uint32_t)0x00000010)  /*!< External interrupt line 36 Connected to the PVM2 EXTI Line   */

+#endif /* PWR_CR2_PVME2 */

+#define PWR_EXTI_LINE_PVM3  ((uint32_t)0x00000020)  /*!< External interrupt line 37 Connected to the PVM3 EXTI Line   */

+#define PWR_EXTI_LINE_PVM4  ((uint32_t)0x00000040)  /*!< External interrupt line 38 Connected to the PVM4 EXTI Line   */

+/**

+  * @}

+  */

+

+/** @defgroup PWREx_PVM_EVENT_LINE PWR PVM event lines

+  * @{

+  */

+#if defined(PWR_CR2_PVME1)

+#define PWR_EVENT_LINE_PVM1 ((uint32_t)0x00000008)  /*!< Event line 35 Connected to the PVM1 EXTI Line */

+#endif /* PWR_CR2_PVME1 */

+#if defined(PWR_CR2_PVME2)

+#define PWR_EVENT_LINE_PVM2 ((uint32_t)0x00000010)  /*!< Event line 36 Connected to the PVM2 EXTI Line */

+#endif /* PWR_CR2_PVME2 */

+#define PWR_EVENT_LINE_PVM3 ((uint32_t)0x00000020)  /*!< Event line 37 Connected to the PVM3 EXTI Line */

+#define PWR_EVENT_LINE_PVM4 ((uint32_t)0x00000040)  /*!< Event line 38 Connected to the PVM4 EXTI Line */

+/**

+  * @}

+  */

+

+/** @defgroup PWREx_Flag  PWR Status Flags

+  *        Elements values convention: 0000 0000 0XXY YYYYb

+  *           - Y YYYY  : Flag position in the XX register (5 bits)

+  *           - XX  : Status register (2 bits)

+  *                 - 01: SR1 register

+  *                 - 10: SR2 register

+  *        The only exception is PWR_FLAG_WU, encompassing all

+  *        wake-up flags and set to PWR_SR1_WUF.

+  * @{

+  */

+#define PWR_FLAG_WUF1                       ((uint32_t)0x0020)   /*!< Wakeup event on wakeup pin 1 */

+#define PWR_FLAG_WUF2                       ((uint32_t)0x0021)   /*!< Wakeup event on wakeup pin 2 */

+#define PWR_FLAG_WUF3                       ((uint32_t)0x0022)   /*!< Wakeup event on wakeup pin 3 */

+#define PWR_FLAG_WUF4                       ((uint32_t)0x0023)   /*!< Wakeup event on wakeup pin 4 */

+#define PWR_FLAG_WUF5                       ((uint32_t)0x0024)   /*!< Wakeup event on wakeup pin 5 */

+#define PWR_FLAG_WU                         PWR_SR1_WUF          /*!< Encompass wakeup event on all wakeup pins */

+#define PWR_FLAG_SB                         ((uint32_t)0x0028)   /*!< Standby flag */

+#if defined(PWR_SR1_EXT_SMPS_RDY)

+#define PWR_FLAG_EXT_SMPS                   ((uint32_t)0x002D)   /*!< Switching to external SMPS ready flag */

+#endif /* PWR_SR1_EXT_SMPS_RDY */

+#define PWR_FLAG_WUFI                       ((uint32_t)0x002F)   /*!< Wakeup on internal wakeup line */

+

+#define PWR_FLAG_REGLPS                     ((uint32_t)0x0048)   /*!< Low-power regulator start flag */

+#define PWR_FLAG_REGLPF                     ((uint32_t)0x0049)   /*!< Low-power regulator flag */

+#define PWR_FLAG_VOSF                       ((uint32_t)0x004A)   /*!< Voltage scaling flag */

+#define PWR_FLAG_PVDO                       ((uint32_t)0x004B)   /*!< Power Voltage Detector output flag */

+#if defined(PWR_CR2_PVME1)

+#define PWR_FLAG_PVMO1                      ((uint32_t)0x004C)   /*!< Power Voltage Monitoring 1 output flag */

+#endif /* PWR_CR2_PVME1 */

+#if defined(PWR_CR2_PVME2)

+#define PWR_FLAG_PVMO2                      ((uint32_t)0x004D)   /*!< Power Voltage Monitoring 2 output flag */

+#endif /* PWR_CR2_PVME2 */

+#define PWR_FLAG_PVMO3                      ((uint32_t)0x004E)   /*!< Power Voltage Monitoring 3 output flag */

+#define PWR_FLAG_PVMO4                      ((uint32_t)0x004F)   /*!< Power Voltage Monitoring 4 output flag */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Exported macros -----------------------------------------------------------*/

+/** @defgroup PWREx_Exported_Macros PWR Extended Exported Macros

+ * @{

+ */

+

+#if defined(PWR_CR2_PVME1)

+/**

+  * @brief Enable the PVM1 Extended Interrupt Line.

+  * @retval None

+  */

+#define __HAL_PWR_PVM1_EXTI_ENABLE_IT()   SET_BIT(EXTI->IMR2, PWR_EXTI_LINE_PVM1)

+

+/**

+  * @brief Disable the PVM1 Extended Interrupt Line.

+  * @retval None

+  */

+#define __HAL_PWR_PVM1_EXTI_DISABLE_IT()  CLEAR_BIT(EXTI->IMR2, PWR_EXTI_LINE_PVM1)

+

+/**

+  * @brief Enable the PVM1 Event Line.

+  * @retval None

+  */

+#define __HAL_PWR_PVM1_EXTI_ENABLE_EVENT()   SET_BIT(EXTI->EMR2, PWR_EVENT_LINE_PVM1)

+

+/**

+  * @brief Disable the PVM1 Event Line.

+  * @retval None

+  */

+#define __HAL_PWR_PVM1_EXTI_DISABLE_EVENT()  CLEAR_BIT(EXTI->EMR2, PWR_EVENT_LINE_PVM1)

+

+/**

+  * @brief Enable the PVM1 Extended Interrupt Rising Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM1_EXTI_ENABLE_RISING_EDGE()   SET_BIT(EXTI->RTSR2, PWR_EXTI_LINE_PVM1)

+

+/**

+  * @brief Disable the PVM1 Extended Interrupt Rising Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM1_EXTI_DISABLE_RISING_EDGE()  CLEAR_BIT(EXTI->RTSR2, PWR_EXTI_LINE_PVM1)

+

+/**

+  * @brief Enable the PVM1 Extended Interrupt Falling Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM1_EXTI_ENABLE_FALLING_EDGE()   SET_BIT(EXTI->FTSR2, PWR_EXTI_LINE_PVM1)

+

+

+/**

+  * @brief Disable the PVM1 Extended Interrupt Falling Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM1_EXTI_DISABLE_FALLING_EDGE()  CLEAR_BIT(EXTI->FTSR2, PWR_EXTI_LINE_PVM1)

+

+

+/**

+  * @brief  PVM1 EXTI line configuration: set rising & falling edge trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM1_EXTI_ENABLE_RISING_FALLING_EDGE()  \

+  do {                                                    \

+    __HAL_PWR_PVM1_EXTI_ENABLE_RISING_EDGE();             \

+    __HAL_PWR_PVM1_EXTI_ENABLE_FALLING_EDGE();            \

+  } while(0)

+

+/**

+  * @brief Disable the PVM1 Extended Interrupt Rising & Falling Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM1_EXTI_DISABLE_RISING_FALLING_EDGE()  \

+  do {                                                     \

+    __HAL_PWR_PVM1_EXTI_DISABLE_RISING_EDGE();             \

+    __HAL_PWR_PVM1_EXTI_DISABLE_FALLING_EDGE();            \

+  } while(0)

+

+/**

+  * @brief  Generate a Software interrupt on selected EXTI line.

+  * @retval None

+  */

+#define __HAL_PWR_PVM1_EXTI_GENERATE_SWIT() SET_BIT(EXTI->SWIER2, PWR_EXTI_LINE_PVM1)

+

+/**

+  * @brief Check whether the specified PVM1 EXTI interrupt flag is set or not.

+  * @retval EXTI PVM1 Line Status.

+  */

+#define __HAL_PWR_PVM1_EXTI_GET_FLAG()  (EXTI->PR2 & PWR_EXTI_LINE_PVM1)

+

+/**

+  * @brief Clear the PVM1 EXTI flag.

+  * @retval None

+  */

+#define __HAL_PWR_PVM1_EXTI_CLEAR_FLAG()  WRITE_REG(EXTI->PR2, PWR_EXTI_LINE_PVM1)

+

+#endif /* PWR_CR2_PVME1 */

+

+

+#if defined(PWR_CR2_PVME2)

+/**

+  * @brief Enable the PVM2 Extended Interrupt Line.

+  * @retval None

+  */

+#define __HAL_PWR_PVM2_EXTI_ENABLE_IT()   SET_BIT(EXTI->IMR2, PWR_EXTI_LINE_PVM2)

+

+/**

+  * @brief Disable the PVM2 Extended Interrupt Line.

+  * @retval None

+  */

+#define __HAL_PWR_PVM2_EXTI_DISABLE_IT()  CLEAR_BIT(EXTI->IMR2, PWR_EXTI_LINE_PVM2)

+

+/**

+  * @brief Enable the PVM2 Event Line.

+  * @retval None

+  */

+#define __HAL_PWR_PVM2_EXTI_ENABLE_EVENT()   SET_BIT(EXTI->EMR2, PWR_EVENT_LINE_PVM2)

+

+/**

+  * @brief Disable the PVM2 Event Line.

+  * @retval None

+  */

+#define __HAL_PWR_PVM2_EXTI_DISABLE_EVENT()  CLEAR_BIT(EXTI->EMR2, PWR_EVENT_LINE_PVM2)

+

+/**

+  * @brief Enable the PVM2 Extended Interrupt Rising Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM2_EXTI_ENABLE_RISING_EDGE()   SET_BIT(EXTI->RTSR2, PWR_EXTI_LINE_PVM2)

+

+/**

+  * @brief Disable the PVM2 Extended Interrupt Rising Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM2_EXTI_DISABLE_RISING_EDGE()  CLEAR_BIT(EXTI->RTSR2, PWR_EXTI_LINE_PVM2)

+

+/**

+  * @brief Enable the PVM2 Extended Interrupt Falling Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM2_EXTI_ENABLE_FALLING_EDGE()   SET_BIT(EXTI->FTSR2, PWR_EXTI_LINE_PVM2)

+

+

+/**

+  * @brief Disable the PVM2 Extended Interrupt Falling Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM2_EXTI_DISABLE_FALLING_EDGE()  CLEAR_BIT(EXTI->FTSR2, PWR_EXTI_LINE_PVM2)

+

+

+/**

+  * @brief  PVM2 EXTI line configuration: set rising & falling edge trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM2_EXTI_ENABLE_RISING_FALLING_EDGE()  \

+  do {                                                    \

+    __HAL_PWR_PVM2_EXTI_ENABLE_RISING_EDGE();             \

+    __HAL_PWR_PVM2_EXTI_ENABLE_FALLING_EDGE();            \

+  } while(0)

+

+/**

+  * @brief Disable the PVM2 Extended Interrupt Rising & Falling Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM2_EXTI_DISABLE_RISING_FALLING_EDGE()  \

+  do {                                                     \

+    __HAL_PWR_PVM2_EXTI_DISABLE_RISING_EDGE();             \

+    __HAL_PWR_PVM2_EXTI_DISABLE_FALLING_EDGE();            \

+  } while(0)

+

+/**

+  * @brief  Generate a Software interrupt on selected EXTI line.

+  * @retval None

+  */

+#define __HAL_PWR_PVM2_EXTI_GENERATE_SWIT() SET_BIT(EXTI->SWIER2, PWR_EXTI_LINE_PVM2)

+

+/**

+  * @brief Check whether the specified PVM2 EXTI interrupt flag is set or not.

+  * @retval EXTI PVM2 Line Status.

+  */

+#define __HAL_PWR_PVM2_EXTI_GET_FLAG()  (EXTI->PR2 & PWR_EXTI_LINE_PVM2)

+

+/**

+  * @brief Clear the PVM2 EXTI flag.

+  * @retval None

+  */

+#define __HAL_PWR_PVM2_EXTI_CLEAR_FLAG()  WRITE_REG(EXTI->PR2, PWR_EXTI_LINE_PVM2)

+

+#endif /* PWR_CR2_PVME2 */

+

+

+/**

+  * @brief Enable the PVM3 Extended Interrupt Line.

+  * @retval None

+  */

+#define __HAL_PWR_PVM3_EXTI_ENABLE_IT()   SET_BIT(EXTI->IMR2, PWR_EXTI_LINE_PVM3)

+

+/**

+  * @brief Disable the PVM3 Extended Interrupt Line.

+  * @retval None

+  */

+#define __HAL_PWR_PVM3_EXTI_DISABLE_IT()  CLEAR_BIT(EXTI->IMR2, PWR_EXTI_LINE_PVM3)

+

+/**

+  * @brief Enable the PVM3 Event Line.

+  * @retval None

+  */

+#define __HAL_PWR_PVM3_EXTI_ENABLE_EVENT()   SET_BIT(EXTI->EMR2, PWR_EVENT_LINE_PVM3)

+

+/**

+  * @brief Disable the PVM3 Event Line.

+  * @retval None

+  */

+#define __HAL_PWR_PVM3_EXTI_DISABLE_EVENT()  CLEAR_BIT(EXTI->EMR2, PWR_EVENT_LINE_PVM3)

+

+/**

+  * @brief Enable the PVM3 Extended Interrupt Rising Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM3_EXTI_ENABLE_RISING_EDGE()   SET_BIT(EXTI->RTSR2, PWR_EXTI_LINE_PVM3)

+

+/**

+  * @brief Disable the PVM3 Extended Interrupt Rising Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM3_EXTI_DISABLE_RISING_EDGE()  CLEAR_BIT(EXTI->RTSR2, PWR_EXTI_LINE_PVM3)

+

+/**

+  * @brief Enable the PVM3 Extended Interrupt Falling Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM3_EXTI_ENABLE_FALLING_EDGE()   SET_BIT(EXTI->FTSR2, PWR_EXTI_LINE_PVM3)

+

+

+/**

+  * @brief Disable the PVM3 Extended Interrupt Falling Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM3_EXTI_DISABLE_FALLING_EDGE()  CLEAR_BIT(EXTI->FTSR2, PWR_EXTI_LINE_PVM3)

+

+

+/**

+  * @brief  PVM3 EXTI line configuration: set rising & falling edge trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM3_EXTI_ENABLE_RISING_FALLING_EDGE()  \

+  do {                                                    \

+    __HAL_PWR_PVM3_EXTI_ENABLE_RISING_EDGE();             \

+    __HAL_PWR_PVM3_EXTI_ENABLE_FALLING_EDGE();            \

+  } while(0)

+

+/**

+  * @brief Disable the PVM3 Extended Interrupt Rising & Falling Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM3_EXTI_DISABLE_RISING_FALLING_EDGE()  \

+  do {                                                     \

+    __HAL_PWR_PVM3_EXTI_DISABLE_RISING_EDGE();             \

+    __HAL_PWR_PVM3_EXTI_DISABLE_FALLING_EDGE();            \

+  } while(0)

+

+/**

+  * @brief  Generate a Software interrupt on selected EXTI line.

+  * @retval None

+  */

+#define __HAL_PWR_PVM3_EXTI_GENERATE_SWIT() SET_BIT(EXTI->SWIER2, PWR_EXTI_LINE_PVM3)

+

+/**

+  * @brief Check whether the specified PVM3 EXTI interrupt flag is set or not.

+  * @retval EXTI PVM3 Line Status.

+  */

+#define __HAL_PWR_PVM3_EXTI_GET_FLAG()  (EXTI->PR2 & PWR_EXTI_LINE_PVM3)

+

+/**

+  * @brief Clear the PVM3 EXTI flag.

+  * @retval None

+  */

+#define __HAL_PWR_PVM3_EXTI_CLEAR_FLAG()  WRITE_REG(EXTI->PR2, PWR_EXTI_LINE_PVM3)

+

+

+

+

+/**

+  * @brief Enable the PVM4 Extended Interrupt Line.

+  * @retval None

+  */

+#define __HAL_PWR_PVM4_EXTI_ENABLE_IT()   SET_BIT(EXTI->IMR2, PWR_EXTI_LINE_PVM4)

+

+/**

+  * @brief Disable the PVM4 Extended Interrupt Line.

+  * @retval None

+  */

+#define __HAL_PWR_PVM4_EXTI_DISABLE_IT()  CLEAR_BIT(EXTI->IMR2, PWR_EXTI_LINE_PVM4)

+

+/**

+  * @brief Enable the PVM4 Event Line.

+  * @retval None

+  */

+#define __HAL_PWR_PVM4_EXTI_ENABLE_EVENT()   SET_BIT(EXTI->EMR2, PWR_EVENT_LINE_PVM4)

+

+/**

+  * @brief Disable the PVM4 Event Line.

+  * @retval None

+  */

+#define __HAL_PWR_PVM4_EXTI_DISABLE_EVENT()  CLEAR_BIT(EXTI->EMR2, PWR_EVENT_LINE_PVM4)

+

+/**

+  * @brief Enable the PVM4 Extended Interrupt Rising Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM4_EXTI_ENABLE_RISING_EDGE()   SET_BIT(EXTI->RTSR2, PWR_EXTI_LINE_PVM4)

+

+/**

+  * @brief Disable the PVM4 Extended Interrupt Rising Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM4_EXTI_DISABLE_RISING_EDGE()  CLEAR_BIT(EXTI->RTSR2, PWR_EXTI_LINE_PVM4)

+

+/**

+  * @brief Enable the PVM4 Extended Interrupt Falling Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM4_EXTI_ENABLE_FALLING_EDGE()   SET_BIT(EXTI->FTSR2, PWR_EXTI_LINE_PVM4)

+

+

+/**

+  * @brief Disable the PVM4 Extended Interrupt Falling Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM4_EXTI_DISABLE_FALLING_EDGE()  CLEAR_BIT(EXTI->FTSR2, PWR_EXTI_LINE_PVM4)

+

+

+/**

+  * @brief  PVM4 EXTI line configuration: set rising & falling edge trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM4_EXTI_ENABLE_RISING_FALLING_EDGE()  \

+  do {                                                    \

+    __HAL_PWR_PVM4_EXTI_ENABLE_RISING_EDGE();             \

+    __HAL_PWR_PVM4_EXTI_ENABLE_FALLING_EDGE();            \

+  } while(0)

+

+/**

+  * @brief Disable the PVM4 Extended Interrupt Rising & Falling Trigger.

+  * @retval None

+  */

+#define __HAL_PWR_PVM4_EXTI_DISABLE_RISING_FALLING_EDGE()  \

+  do {                                                     \

+    __HAL_PWR_PVM4_EXTI_DISABLE_RISING_EDGE();             \

+    __HAL_PWR_PVM4_EXTI_DISABLE_FALLING_EDGE();            \

+  } while(0)

+

+/**

+  * @brief  Generate a Software interrupt on selected EXTI line.

+  * @retval None

+  */

+#define __HAL_PWR_PVM4_EXTI_GENERATE_SWIT() SET_BIT(EXTI->SWIER2, PWR_EXTI_LINE_PVM4)

+

+/**

+  * @brief Check whether or not the specified PVM4 EXTI interrupt flag is set.

+  * @retval EXTI PVM4 Line Status.

+  */

+#define __HAL_PWR_PVM4_EXTI_GET_FLAG()  (EXTI->PR2 & PWR_EXTI_LINE_PVM4)

+

+/**

+  * @brief Clear the PVM4 EXTI flag.

+  * @retval None

+  */

+#define __HAL_PWR_PVM4_EXTI_CLEAR_FLAG()  WRITE_REG(EXTI->PR2, PWR_EXTI_LINE_PVM4)

+

+

+/**

+  * @brief Configure the main internal regulator output voltage.

+  * @param  __REGULATOR__: specifies the regulator output voltage to achieve

+  *         a tradeoff between performance and power consumption.

+  *          This parameter can be one of the following values:

+  *            @arg @ref PWR_REGULATOR_VOLTAGE_SCALE1  Regulator voltage output range 1 mode,

+  *                                                typical output voltage at 1.2 V,

+  *                                                system frequency up to 80 MHz.

+  *            @arg @ref PWR_REGULATOR_VOLTAGE_SCALE2  Regulator voltage output range 2 mode,

+  *                                                typical output voltage at 1.0 V,

+  *                                                system frequency up to 26 MHz.

+  * @note  This macro is similar to HAL_PWREx_ControlVoltageScaling() API but doesn't check

+  *        whether or not VOSF flag is cleared when moving from range 2 to range 1. User

+  *        may resort to __HAL_PWR_GET_FLAG() macro to check VOSF bit resetting.

+  * @retval None

+  */

+#define __HAL_PWR_VOLTAGESCALING_CONFIG(__REGULATOR__) do {                                                     \

+                                                            __IO uint32_t tmpreg;                               \

+                                                            MODIFY_REG(PWR->CR1, PWR_CR1_VOS, (__REGULATOR__)); \

+                                                            /* Delay after an RCC peripheral clock enabling */  \

+                                                            tmpreg = READ_BIT(PWR->CR1, PWR_CR1_VOS);           \

+                                                            UNUSED(tmpreg);                                     \

+                                                          } while(0)

+

+/**

+  * @}

+  */

+

+/* Private macros --------------------------------------------------------*/

+/** @addtogroup  PWREx_Private_Macros   PWR Extended Private Macros

+  * @{

+  */

+

+#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1) || \

+                                ((PIN) == PWR_WAKEUP_PIN2) || \

+                                ((PIN) == PWR_WAKEUP_PIN3) || \

+                                ((PIN) == PWR_WAKEUP_PIN4) || \

+                                ((PIN) == PWR_WAKEUP_PIN5) || \

+                                ((PIN) == PWR_WAKEUP_PIN1_HIGH) || \

+                                ((PIN) == PWR_WAKEUP_PIN2_HIGH) || \

+                                ((PIN) == PWR_WAKEUP_PIN3_HIGH) || \

+                                ((PIN) == PWR_WAKEUP_PIN4_HIGH) || \

+                                ((PIN) == PWR_WAKEUP_PIN5_HIGH) || \

+                                ((PIN) == PWR_WAKEUP_PIN1_LOW) || \

+                                ((PIN) == PWR_WAKEUP_PIN2_LOW) || \

+                                ((PIN) == PWR_WAKEUP_PIN3_LOW) || \

+                                ((PIN) == PWR_WAKEUP_PIN4_LOW) || \

+                                ((PIN) == PWR_WAKEUP_PIN5_LOW))

+

+#if defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx)                                                   || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define IS_PWR_PVM_TYPE(TYPE) (((TYPE) == PWR_PVM_1) ||\

+                               ((TYPE) == PWR_PVM_2) ||\

+                               ((TYPE) == PWR_PVM_3) ||\

+                               ((TYPE) == PWR_PVM_4))

+#elif defined (STM32L471xx)

+#define IS_PWR_PVM_TYPE(TYPE) (((TYPE) == PWR_PVM_2) ||\

+                               ((TYPE) == PWR_PVM_3) ||\

+                               ((TYPE) == PWR_PVM_4))

+#endif

+

+#if defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L433xx) || defined (STM32L443xx) || defined (STM32L452xx) || defined (STM32L462xx)

+#define IS_PWR_PVM_TYPE(TYPE) (((TYPE) == PWR_PVM_1) ||\

+                               ((TYPE) == PWR_PVM_3) ||\

+                               ((TYPE) == PWR_PVM_4))

+#elif defined (STM32L431xx) || defined (STM32L432xx) || defined (STM32L442xx) || defined (STM32L451xx)

+#define IS_PWR_PVM_TYPE(TYPE) (((TYPE) == PWR_PVM_3) ||\

+                               ((TYPE) == PWR_PVM_4))

+#endif

+

+#define IS_PWR_PVM_MODE(MODE)  (((MODE) == PWR_PVM_MODE_NORMAL)              ||\

+                                ((MODE) == PWR_PVM_MODE_IT_RISING)           ||\

+                                ((MODE) == PWR_PVM_MODE_IT_FALLING)          ||\

+                                ((MODE) == PWR_PVM_MODE_IT_RISING_FALLING)   ||\

+                                ((MODE) == PWR_PVM_MODE_EVENT_RISING)        ||\

+                                ((MODE) == PWR_PVM_MODE_EVENT_FALLING)       ||\

+                                ((MODE) == PWR_PVM_MODE_EVENT_RISING_FALLING))

+

+#if defined(PWR_CR5_R1MODE)

+#define IS_PWR_VOLTAGE_SCALING_RANGE(RANGE) (((RANGE) == PWR_REGULATOR_VOLTAGE_SCALE1_BOOST) || \

+                                             ((RANGE) == PWR_REGULATOR_VOLTAGE_SCALE1)       || \

+                                             ((RANGE) == PWR_REGULATOR_VOLTAGE_SCALE2))

+#else

+#define IS_PWR_VOLTAGE_SCALING_RANGE(RANGE) (((RANGE) == PWR_REGULATOR_VOLTAGE_SCALE1) || \

+                                             ((RANGE) == PWR_REGULATOR_VOLTAGE_SCALE2))

+#endif

+

+

+#define IS_PWR_BATTERY_RESISTOR_SELECT(RESISTOR) (((RESISTOR) == PWR_BATTERY_CHARGING_RESISTOR_5) ||\

+                                                  ((RESISTOR) == PWR_BATTERY_CHARGING_RESISTOR_1_5))

+

+#define IS_PWR_BATTERY_CHARGING(CHARGING) (((CHARGING) == PWR_BATTERY_CHARGING_DISABLE) ||\

+                                           ((CHARGING) == PWR_BATTERY_CHARGING_ENABLE))

+

+#define IS_PWR_GPIO_BIT_NUMBER(BIT_NUMBER) (((BIT_NUMBER) & GPIO_PIN_MASK) != (uint32_t)0x00)

+

+

+#if defined (STM32L412xx) || defined (STM32L422xx)

+#define IS_PWR_GPIO(GPIO) (((GPIO) == PWR_GPIO_A) ||\

+                           ((GPIO) == PWR_GPIO_B) ||\

+                           ((GPIO) == PWR_GPIO_C) ||\

+                           ((GPIO) == PWR_GPIO_D) ||\

+                           ((GPIO) == PWR_GPIO_H))

+#elif defined (STM32L431xx) || defined (STM32L433xx) || defined (STM32L443xx) || \

+      defined (STM32L451xx) || defined (STM32L452xx) || defined (STM32L462xx)

+#define IS_PWR_GPIO(GPIO) (((GPIO) == PWR_GPIO_A) ||\

+                           ((GPIO) == PWR_GPIO_B) ||\

+                           ((GPIO) == PWR_GPIO_C) ||\

+                           ((GPIO) == PWR_GPIO_D) ||\

+                           ((GPIO) == PWR_GPIO_E) ||\

+                           ((GPIO) == PWR_GPIO_H))

+#elif defined (STM32L432xx) || defined (STM32L442xx)

+#define IS_PWR_GPIO(GPIO) (((GPIO) == PWR_GPIO_A) ||\

+                           ((GPIO) == PWR_GPIO_B) ||\

+                           ((GPIO) == PWR_GPIO_C) ||\

+                           ((GPIO) == PWR_GPIO_H))

+#elif defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx)

+#define IS_PWR_GPIO(GPIO) (((GPIO) == PWR_GPIO_A) ||\

+                           ((GPIO) == PWR_GPIO_B) ||\

+                           ((GPIO) == PWR_GPIO_C) ||\

+                           ((GPIO) == PWR_GPIO_D) ||\

+                           ((GPIO) == PWR_GPIO_E) ||\

+                           ((GPIO) == PWR_GPIO_F) ||\

+                           ((GPIO) == PWR_GPIO_G) ||\

+                           ((GPIO) == PWR_GPIO_H))

+#elif defined (STM32L496xx) || defined (STM32L4A6xx) || \

+      defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define IS_PWR_GPIO(GPIO) (((GPIO) == PWR_GPIO_A) ||\

+                           ((GPIO) == PWR_GPIO_B) ||\

+                           ((GPIO) == PWR_GPIO_C) ||\

+                           ((GPIO) == PWR_GPIO_D) ||\

+                           ((GPIO) == PWR_GPIO_E) ||\

+                           ((GPIO) == PWR_GPIO_F) ||\

+                           ((GPIO) == PWR_GPIO_G) ||\

+                           ((GPIO) == PWR_GPIO_H) ||\

+                           ((GPIO) == PWR_GPIO_I))

+#endif

+

+

+/**

+  * @}

+  */

+

+

+/** @addtogroup PWREx_Exported_Functions PWR Extended Exported Functions

+  * @{

+  */

+

+/** @addtogroup PWREx_Exported_Functions_Group1 Extended Peripheral Control functions

+  * @{

+  */

+

+

+/* Peripheral Control functions  **********************************************/

+uint32_t HAL_PWREx_GetVoltageRange(void);

+HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling);

+void HAL_PWREx_EnableBatteryCharging(uint32_t ResistorSelection);

+void HAL_PWREx_DisableBatteryCharging(void);

+#if defined(PWR_CR2_USV)

+void HAL_PWREx_EnableVddUSB(void);

+void HAL_PWREx_DisableVddUSB(void);

+#endif /* PWR_CR2_USV */

+#if defined(PWR_CR2_IOSV)

+void HAL_PWREx_EnableVddIO2(void);

+void HAL_PWREx_DisableVddIO2(void);

+#endif /* PWR_CR2_IOSV */

+void HAL_PWREx_EnableInternalWakeUpLine(void);

+void HAL_PWREx_DisableInternalWakeUpLine(void);

+HAL_StatusTypeDef HAL_PWREx_EnableGPIOPullUp(uint32_t GPIO, uint32_t GPIONumber);

+HAL_StatusTypeDef HAL_PWREx_DisableGPIOPullUp(uint32_t GPIO, uint32_t GPIONumber);

+HAL_StatusTypeDef HAL_PWREx_EnableGPIOPullDown(uint32_t GPIO, uint32_t GPIONumber);

+HAL_StatusTypeDef HAL_PWREx_DisableGPIOPullDown(uint32_t GPIO, uint32_t GPIONumber);

+void HAL_PWREx_EnablePullUpPullDownConfig(void);

+void HAL_PWREx_DisablePullUpPullDownConfig(void);

+void HAL_PWREx_EnableSRAM2ContentRetention(void);

+void HAL_PWREx_DisableSRAM2ContentRetention(void);

+#if defined(PWR_CR1_RRSTP)

+void HAL_PWREx_EnableSRAM3ContentRetention(void);

+void HAL_PWREx_DisableSRAM3ContentRetention(void);

+#endif /* PWR_CR1_RRSTP */

+#if defined(PWR_CR3_DSIPDEN)

+void HAL_PWREx_EnableDSIPinsPDActivation(void);

+void HAL_PWREx_DisableDSIPinsPDActivation(void);

+#endif /* PWR_CR3_DSIPDEN */

+#if defined(PWR_CR2_PVME1)

+void HAL_PWREx_EnablePVM1(void);

+void HAL_PWREx_DisablePVM1(void);

+#endif /* PWR_CR2_PVME1 */

+#if defined(PWR_CR2_PVME2)

+void HAL_PWREx_EnablePVM2(void);

+void HAL_PWREx_DisablePVM2(void);

+#endif /* PWR_CR2_PVME2 */

+void HAL_PWREx_EnablePVM3(void);

+void HAL_PWREx_DisablePVM3(void);

+void HAL_PWREx_EnablePVM4(void);

+void HAL_PWREx_DisablePVM4(void);

+HAL_StatusTypeDef HAL_PWREx_ConfigPVM(PWR_PVMTypeDef *sConfigPVM);

+#if defined(PWR_CR3_ENULP)

+void HAL_PWREx_EnableBORPVD_ULP(void);

+void HAL_PWREx_DisableBORPVD_ULP(void);

+#endif /* PWR_CR3_ENULP */

+#if defined(PWR_CR4_EXT_SMPS_ON)

+void HAL_PWREx_EnableExtSMPS_0V95(void);

+void HAL_PWREx_DisableExtSMPS_0V95(void);

+#endif /* PWR_CR4_EXT_SMPS_ON */

+

+

+/* Low Power modes configuration functions ************************************/

+void HAL_PWREx_EnableLowPowerRunMode(void);

+HAL_StatusTypeDef HAL_PWREx_DisableLowPowerRunMode(void);

+void HAL_PWREx_EnterSTOP0Mode(uint8_t STOPEntry);

+void HAL_PWREx_EnterSTOP1Mode(uint8_t STOPEntry);

+void HAL_PWREx_EnterSTOP2Mode(uint8_t STOPEntry);

+void HAL_PWREx_EnterSHUTDOWNMode(void);

+

+void HAL_PWREx_PVD_PVM_IRQHandler(void);

+#if defined(PWR_CR2_PVME1)

+void HAL_PWREx_PVM1Callback(void);

+#endif /* PWR_CR2_PVME1 */

+#if defined(PWR_CR2_PVME2)

+void HAL_PWREx_PVM2Callback(void);

+#endif /* PWR_CR2_PVME2 */

+void HAL_PWREx_PVM3Callback(void);

+void HAL_PWREx_PVM4Callback(void);

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+

+#endif /* __STM32L4xx_HAL_PWR_EX_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_qspi.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_qspi.h
new file mode 100644
index 0000000..f0729a5
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_qspi.h
@@ -0,0 +1,769 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_qspi.h

+  * @author  MCD Application Team

+  * @brief   Header file of QSPI HAL module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                       opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef STM32L4xx_HAL_QSPI_H

+#define STM32L4xx_HAL_QSPI_H

+

+#ifdef __cplusplus

+ extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+#if defined(QUADSPI)

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup QSPI

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+/** @defgroup QSPI_Exported_Types QSPI Exported Types

+  * @{

+  */

+

+/**

+  * @brief  QSPI Init structure definition

+  */

+typedef struct

+{

+  uint32_t ClockPrescaler;     /* Specifies the prescaler factor for generating clock based on the AHB clock.

+                                  This parameter can be a number between 0 and 255 */

+  uint32_t FifoThreshold;      /* Specifies the threshold number of bytes in the FIFO (used only in indirect mode)

+                                  This parameter can be a value between 1 and 16 */

+  uint32_t SampleShifting;     /* Specifies the Sample Shift. The data is sampled 1/2 clock cycle delay later to

+                                  take in account external signal delays. (It should be QSPI_SAMPLE_SHIFTING_NONE in DDR mode)

+                                  This parameter can be a value of @ref QSPI_SampleShifting */

+  uint32_t FlashSize;          /* Specifies the Flash Size. FlashSize+1 is effectively the number of address bits

+                                  required to address the flash memory. The flash capacity can be up to 4GB

+                                  (addressed using 32 bits) in indirect mode, but the addressable space in

+                                  memory-mapped mode is limited to 256MB

+                                  This parameter can be a number between 0 and 31 */

+  uint32_t ChipSelectHighTime; /* Specifies the Chip Select High Time. ChipSelectHighTime+1 defines the minimum number

+                                  of clock cycles which the chip select must remain high between commands.

+                                  This parameter can be a value of @ref QSPI_ChipSelectHighTime */

+  uint32_t ClockMode;          /* Specifies the Clock Mode. It indicates the level that clock takes between commands.

+                                  This parameter can be a value of @ref QSPI_ClockMode */

+#if defined(QUADSPI_CR_DFM)

+  uint32_t FlashID;            /* Specifies the Flash which will be used,

+                                  This parameter can be a value of @ref QSPI_Flash_Select */

+  uint32_t DualFlash;          /* Specifies the Dual Flash Mode State

+                                  This parameter can be a value of @ref QSPI_DualFlash_Mode */

+#endif

+}QSPI_InitTypeDef;

+

+/**

+  * @brief HAL QSPI State structures definition

+  */

+typedef enum

+{

+  HAL_QSPI_STATE_RESET             = 0x00U,    /*!< Peripheral not initialized                            */

+  HAL_QSPI_STATE_READY             = 0x01U,    /*!< Peripheral initialized and ready for use              */

+  HAL_QSPI_STATE_BUSY              = 0x02U,    /*!< Peripheral in indirect mode and busy                  */

+  HAL_QSPI_STATE_BUSY_INDIRECT_TX  = 0x12U,    /*!< Peripheral in indirect mode with transmission ongoing */

+  HAL_QSPI_STATE_BUSY_INDIRECT_RX  = 0x22U,    /*!< Peripheral in indirect mode with reception ongoing    */

+  HAL_QSPI_STATE_BUSY_AUTO_POLLING = 0x42U,    /*!< Peripheral in auto polling mode ongoing               */

+  HAL_QSPI_STATE_BUSY_MEM_MAPPED   = 0x82U,    /*!< Peripheral in memory mapped mode ongoing              */

+  HAL_QSPI_STATE_ABORT             = 0x08U,    /*!< Peripheral with abort request ongoing                 */

+  HAL_QSPI_STATE_ERROR             = 0x04U     /*!< Peripheral in error                                   */

+}HAL_QSPI_StateTypeDef;

+

+/**

+  * @brief  QSPI Handle Structure definition

+  */

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+typedef struct __QSPI_HandleTypeDef

+#else

+typedef struct

+#endif

+{

+  QUADSPI_TypeDef            *Instance;        /* QSPI registers base address        */

+  QSPI_InitTypeDef           Init;             /* QSPI communication parameters      */

+  uint8_t                    *pTxBuffPtr;      /* Pointer to QSPI Tx transfer Buffer */

+  __IO uint32_t              TxXferSize;       /* QSPI Tx Transfer size              */

+  __IO uint32_t              TxXferCount;      /* QSPI Tx Transfer Counter           */

+  uint8_t                    *pRxBuffPtr;      /* Pointer to QSPI Rx transfer Buffer */

+  __IO uint32_t              RxXferSize;       /* QSPI Rx Transfer size              */

+  __IO uint32_t              RxXferCount;      /* QSPI Rx Transfer Counter           */

+  DMA_HandleTypeDef          *hdma;            /* QSPI Rx/Tx DMA Handle parameters   */

+  __IO HAL_LockTypeDef       Lock;             /* Locking object                     */

+  __IO HAL_QSPI_StateTypeDef State;            /* QSPI communication state           */

+  __IO uint32_t              ErrorCode;        /* QSPI Error code                    */

+  uint32_t                   Timeout;          /* Timeout for the QSPI memory access */

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+  void (* ErrorCallback)        (struct __QSPI_HandleTypeDef *hqspi);

+  void (* AbortCpltCallback)    (struct __QSPI_HandleTypeDef *hqspi);

+  void (* FifoThresholdCallback)(struct __QSPI_HandleTypeDef *hqspi);

+  void (* CmdCpltCallback)      (struct __QSPI_HandleTypeDef *hqspi);

+  void (* RxCpltCallback)       (struct __QSPI_HandleTypeDef *hqspi);

+  void (* TxCpltCallback)       (struct __QSPI_HandleTypeDef *hqspi);

+  void (* RxHalfCpltCallback)   (struct __QSPI_HandleTypeDef *hqspi);

+  void (* TxHalfCpltCallback)   (struct __QSPI_HandleTypeDef *hqspi);

+  void (* StatusMatchCallback)  (struct __QSPI_HandleTypeDef *hqspi);

+  void (* TimeOutCallback)      (struct __QSPI_HandleTypeDef *hqspi);

+

+  void (* MspInitCallback)      (struct __QSPI_HandleTypeDef *hqspi);

+  void (* MspDeInitCallback)    (struct __QSPI_HandleTypeDef *hqspi);

+#endif

+}QSPI_HandleTypeDef;

+

+/**

+  * @brief  QSPI Command structure definition

+  */

+typedef struct

+{

+  uint32_t Instruction;        /* Specifies the Instruction to be sent

+                                  This parameter can be a value (8-bit) between 0x00 and 0xFF */

+  uint32_t Address;            /* Specifies the Address to be sent (Size from 1 to 4 bytes according AddressSize)

+                                  This parameter can be a value (32-bits) between 0x0 and 0xFFFFFFFF */

+  uint32_t AlternateBytes;     /* Specifies the Alternate Bytes to be sent (Size from 1 to 4 bytes according AlternateBytesSize)

+                                  This parameter can be a value (32-bits) between 0x0 and 0xFFFFFFFF */

+  uint32_t AddressSize;        /* Specifies the Address Size

+                                  This parameter can be a value of @ref QSPI_AddressSize */

+  uint32_t AlternateBytesSize; /* Specifies the Alternate Bytes Size

+                                  This parameter can be a value of @ref QSPI_AlternateBytesSize */

+  uint32_t DummyCycles;        /* Specifies the Number of Dummy Cycles.

+                                  This parameter can be a number between 0 and 31 */

+  uint32_t InstructionMode;    /* Specifies the Instruction Mode

+                                  This parameter can be a value of @ref QSPI_InstructionMode */

+  uint32_t AddressMode;        /* Specifies the Address Mode

+                                  This parameter can be a value of @ref QSPI_AddressMode */

+  uint32_t AlternateByteMode;  /* Specifies the Alternate Bytes Mode

+                                  This parameter can be a value of @ref QSPI_AlternateBytesMode */

+  uint32_t DataMode;           /* Specifies the Data Mode (used for dummy cycles and data phases)

+                                  This parameter can be a value of @ref QSPI_DataMode */

+  uint32_t NbData;             /* Specifies the number of data to transfer. (This is the number of bytes)

+                                  This parameter can be any value between 0 and 0xFFFFFFFF (0 means undefined length

+                                  until end of memory)*/

+  uint32_t DdrMode;            /* Specifies the double data rate mode for address, alternate byte and data phase

+                                  This parameter can be a value of @ref QSPI_DdrMode */

+  uint32_t DdrHoldHalfCycle;   /* Specifies if the DDR hold is enabled. When enabled it delays the data

+                                  output by one half of system clock in DDR mode.

+                                  Not available on all devices.

+                                  This parameter can be a value of @ref QSPI_DdrHoldHalfCycle */

+  uint32_t SIOOMode;           /* Specifies the send instruction only once mode

+                                  This parameter can be a value of @ref QSPI_SIOOMode */

+}QSPI_CommandTypeDef;

+

+/**

+  * @brief  QSPI Auto Polling mode configuration structure definition

+  */

+typedef struct

+{

+  uint32_t Match;              /* Specifies the value to be compared with the masked status register to get a match.

+                                  This parameter can be any value between 0 and 0xFFFFFFFF */

+  uint32_t Mask;               /* Specifies the mask to be applied to the status bytes received.

+                                  This parameter can be any value between 0 and 0xFFFFFFFF */

+  uint32_t Interval;           /* Specifies the number of clock cycles between two read during automatic polling phases.

+                                  This parameter can be any value between 0 and 0xFFFF */

+  uint32_t StatusBytesSize;    /* Specifies the size of the status bytes received.

+                                  This parameter can be any value between 1 and 4 */

+  uint32_t MatchMode;          /* Specifies the method used for determining a match.

+                                  This parameter can be a value of @ref QSPI_MatchMode */

+  uint32_t AutomaticStop;      /* Specifies if automatic polling is stopped after a match.

+                                  This parameter can be a value of @ref QSPI_AutomaticStop */

+}QSPI_AutoPollingTypeDef;

+

+/**

+  * @brief  QSPI Memory Mapped mode configuration structure definition

+  */

+typedef struct

+{

+  uint32_t TimeOutPeriod;      /* Specifies the number of clock to wait when the FIFO is full before to release the chip select.

+                                  This parameter can be any value between 0 and 0xFFFF */

+  uint32_t TimeOutActivation;  /* Specifies if the timeout counter is enabled to release the chip select.

+                                  This parameter can be a value of @ref QSPI_TimeOutActivation */

+}QSPI_MemoryMappedTypeDef;

+

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+/**

+  * @brief  HAL QSPI Callback ID enumeration definition

+  */

+typedef enum

+{

+  HAL_QSPI_ERROR_CB_ID          = 0x00U,  /*!< QSPI Error Callback ID            */

+  HAL_QSPI_ABORT_CB_ID          = 0x01U,  /*!< QSPI Abort Callback ID            */

+  HAL_QSPI_FIFO_THRESHOLD_CB_ID = 0x02U,  /*!< QSPI FIFO Threshold Callback ID   */

+  HAL_QSPI_CMD_CPLT_CB_ID       = 0x03U,  /*!< QSPI Command Complete Callback ID */

+  HAL_QSPI_RX_CPLT_CB_ID        = 0x04U,  /*!< QSPI Rx Complete Callback ID      */

+  HAL_QSPI_TX_CPLT_CB_ID        = 0x05U,  /*!< QSPI Tx Complete Callback ID      */

+  HAL_QSPI_RX_HALF_CPLT_CB_ID   = 0x06U,  /*!< QSPI Rx Half Complete Callback ID */

+  HAL_QSPI_TX_HALF_CPLT_CB_ID   = 0x07U,  /*!< QSPI Tx Half Complete Callback ID */

+  HAL_QSPI_STATUS_MATCH_CB_ID   = 0x08U,  /*!< QSPI Status Match Callback ID     */

+  HAL_QSPI_TIMEOUT_CB_ID        = 0x09U,  /*!< QSPI Timeout Callback ID          */

+

+  HAL_QSPI_MSP_INIT_CB_ID       = 0x0AU,  /*!< QSPI MspInit Callback ID          */

+  HAL_QSPI_MSP_DEINIT_CB_ID     = 0x0B0   /*!< QSPI MspDeInit Callback ID        */

+}HAL_QSPI_CallbackIDTypeDef;

+

+/**

+  * @brief  HAL QSPI Callback pointer definition

+  */

+typedef void (*pQSPI_CallbackTypeDef)(QSPI_HandleTypeDef *hqspi);

+#endif

+/**

+  * @}

+  */

+

+/* Exported constants --------------------------------------------------------*/

+/** @defgroup QSPI_Exported_Constants QSPI Exported Constants

+  * @{

+  */

+

+/** @defgroup QSPI_ErrorCode QSPI Error Code

+  * @{

+  */

+#define HAL_QSPI_ERROR_NONE             0x00000000U /*!< No error                 */

+#define HAL_QSPI_ERROR_TIMEOUT          0x00000001U /*!< Timeout error            */

+#define HAL_QSPI_ERROR_TRANSFER         0x00000002U /*!< Transfer error           */

+#define HAL_QSPI_ERROR_DMA              0x00000004U /*!< DMA transfer error       */

+#define HAL_QSPI_ERROR_INVALID_PARAM    0x00000008U /*!< Invalid parameters error */

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+#define HAL_QSPI_ERROR_INVALID_CALLBACK 0x00000010U /*!< Invalid callback error   */

+#endif

+/**

+  * @}

+  */

+

+/** @defgroup QSPI_SampleShifting QSPI Sample Shifting

+  * @{

+  */

+#define QSPI_SAMPLE_SHIFTING_NONE      0x00000000U                   /*!<No clock cycle shift to sample data*/

+#define QSPI_SAMPLE_SHIFTING_HALFCYCLE ((uint32_t)QUADSPI_CR_SSHIFT) /*!<1/2 clock cycle shift to sample data*/

+/**

+  * @}

+  */

+

+/** @defgroup QSPI_ChipSelectHighTime QSPI ChipSelect High Time

+  * @{

+  */

+#define QSPI_CS_HIGH_TIME_1_CYCLE      0x00000000U                                         /*!<nCS stay high for at least 1 clock cycle between commands*/

+#define QSPI_CS_HIGH_TIME_2_CYCLE      ((uint32_t)QUADSPI_DCR_CSHT_0)                      /*!<nCS stay high for at least 2 clock cycles between commands*/

+#define QSPI_CS_HIGH_TIME_3_CYCLE      ((uint32_t)QUADSPI_DCR_CSHT_1)                      /*!<nCS stay high for at least 3 clock cycles between commands*/

+#define QSPI_CS_HIGH_TIME_4_CYCLE      ((uint32_t)QUADSPI_DCR_CSHT_0 | QUADSPI_DCR_CSHT_1) /*!<nCS stay high for at least 4 clock cycles between commands*/

+#define QSPI_CS_HIGH_TIME_5_CYCLE      ((uint32_t)QUADSPI_DCR_CSHT_2)                      /*!<nCS stay high for at least 5 clock cycles between commands*/

+#define QSPI_CS_HIGH_TIME_6_CYCLE      ((uint32_t)QUADSPI_DCR_CSHT_2 | QUADSPI_DCR_CSHT_0) /*!<nCS stay high for at least 6 clock cycles between commands*/

+#define QSPI_CS_HIGH_TIME_7_CYCLE      ((uint32_t)QUADSPI_DCR_CSHT_2 | QUADSPI_DCR_CSHT_1) /*!<nCS stay high for at least 7 clock cycles between commands*/

+#define QSPI_CS_HIGH_TIME_8_CYCLE      ((uint32_t)QUADSPI_DCR_CSHT)                        /*!<nCS stay high for at least 8 clock cycles between commands*/

+/**

+  * @}

+  */

+

+/** @defgroup QSPI_ClockMode QSPI Clock Mode

+  * @{

+  */

+#define QSPI_CLOCK_MODE_0              0x00000000U                    /*!<Clk stays low while nCS is released*/

+#define QSPI_CLOCK_MODE_3              ((uint32_t)QUADSPI_DCR_CKMODE) /*!<Clk goes high while nCS is released*/

+/**

+  * @}

+  */

+

+#if defined(QUADSPI_CR_DFM)

+/** @defgroup QSPI_Flash_Select QSPI Flash Select

+  * @{

+  */

+#define QSPI_FLASH_ID_1                0x00000000U                 /*!<FLASH 1 selected*/

+#define QSPI_FLASH_ID_2                ((uint32_t)QUADSPI_CR_FSEL) /*!<FLASH 2 selected*/

+/**

+  * @}

+  */

+

+  /** @defgroup QSPI_DualFlash_Mode QSPI Dual Flash Mode

+  * @{

+  */

+#define QSPI_DUALFLASH_ENABLE          ((uint32_t)QUADSPI_CR_DFM) /*!<Dual-flash mode enabled*/

+#define QSPI_DUALFLASH_DISABLE         0x00000000U                /*!<Dual-flash mode disabled*/

+/**

+  * @}

+  */

+

+#endif

+/** @defgroup QSPI_AddressSize QSPI Address Size

+  * @{

+  */

+#define QSPI_ADDRESS_8_BITS            0x00000000U                      /*!<8-bit address*/

+#define QSPI_ADDRESS_16_BITS           ((uint32_t)QUADSPI_CCR_ADSIZE_0) /*!<16-bit address*/

+#define QSPI_ADDRESS_24_BITS           ((uint32_t)QUADSPI_CCR_ADSIZE_1) /*!<24-bit address*/

+#define QSPI_ADDRESS_32_BITS           ((uint32_t)QUADSPI_CCR_ADSIZE)   /*!<32-bit address*/

+/**

+  * @}

+  */

+

+/** @defgroup QSPI_AlternateBytesSize QSPI Alternate Bytes Size

+  * @{

+  */

+#define QSPI_ALTERNATE_BYTES_8_BITS    0x00000000U                      /*!<8-bit alternate bytes*/

+#define QSPI_ALTERNATE_BYTES_16_BITS   ((uint32_t)QUADSPI_CCR_ABSIZE_0) /*!<16-bit alternate bytes*/

+#define QSPI_ALTERNATE_BYTES_24_BITS   ((uint32_t)QUADSPI_CCR_ABSIZE_1) /*!<24-bit alternate bytes*/

+#define QSPI_ALTERNATE_BYTES_32_BITS   ((uint32_t)QUADSPI_CCR_ABSIZE)   /*!<32-bit alternate bytes*/

+/**

+  * @}

+  */

+

+/** @defgroup QSPI_InstructionMode QSPI Instruction Mode

+* @{

+*/

+#define QSPI_INSTRUCTION_NONE          0x00000000U                     /*!<No instruction*/

+#define QSPI_INSTRUCTION_1_LINE        ((uint32_t)QUADSPI_CCR_IMODE_0) /*!<Instruction on a single line*/

+#define QSPI_INSTRUCTION_2_LINES       ((uint32_t)QUADSPI_CCR_IMODE_1) /*!<Instruction on two lines*/

+#define QSPI_INSTRUCTION_4_LINES       ((uint32_t)QUADSPI_CCR_IMODE)   /*!<Instruction on four lines*/

+/**

+  * @}

+  */

+

+/** @defgroup QSPI_AddressMode QSPI Address Mode

+* @{

+*/

+#define QSPI_ADDRESS_NONE              0x00000000U                      /*!<No address*/

+#define QSPI_ADDRESS_1_LINE            ((uint32_t)QUADSPI_CCR_ADMODE_0) /*!<Address on a single line*/

+#define QSPI_ADDRESS_2_LINES           ((uint32_t)QUADSPI_CCR_ADMODE_1) /*!<Address on two lines*/

+#define QSPI_ADDRESS_4_LINES           ((uint32_t)QUADSPI_CCR_ADMODE)   /*!<Address on four lines*/

+/**

+  * @}

+  */

+

+/** @defgroup QSPI_AlternateBytesMode QSPI Alternate Bytes Mode

+* @{

+*/

+#define QSPI_ALTERNATE_BYTES_NONE      0x00000000U                      /*!<No alternate bytes*/

+#define QSPI_ALTERNATE_BYTES_1_LINE    ((uint32_t)QUADSPI_CCR_ABMODE_0) /*!<Alternate bytes on a single line*/

+#define QSPI_ALTERNATE_BYTES_2_LINES   ((uint32_t)QUADSPI_CCR_ABMODE_1) /*!<Alternate bytes on two lines*/

+#define QSPI_ALTERNATE_BYTES_4_LINES   ((uint32_t)QUADSPI_CCR_ABMODE)   /*!<Alternate bytes on four lines*/

+/**

+  * @}

+  */

+

+/** @defgroup QSPI_DataMode QSPI Data Mode

+  * @{

+  */

+#define QSPI_DATA_NONE                 0x00000000U                     /*!<No data*/

+#define QSPI_DATA_1_LINE               ((uint32_t)QUADSPI_CCR_DMODE_0) /*!<Data on a single line*/

+#define QSPI_DATA_2_LINES              ((uint32_t)QUADSPI_CCR_DMODE_1) /*!<Data on two lines*/

+#define QSPI_DATA_4_LINES              ((uint32_t)QUADSPI_CCR_DMODE)   /*!<Data on four lines*/

+/**

+  * @}

+  */

+

+/** @defgroup QSPI_DdrMode QSPI DDR Mode

+  * @{

+  */

+#define QSPI_DDR_MODE_DISABLE          0x00000000U                  /*!<Double data rate mode disabled*/

+#define QSPI_DDR_MODE_ENABLE           ((uint32_t)QUADSPI_CCR_DDRM) /*!<Double data rate mode enabled*/

+/**

+  * @}

+  */

+

+/** @defgroup QSPI_DdrHoldHalfCycle QSPI DDR Data Output Delay

+  * @{

+  */

+#define QSPI_DDR_HHC_ANALOG_DELAY      0x00000000U                  /*!<Delay the data output using analog delay in DDR mode*/

+#if defined(QUADSPI_CCR_DHHC)

+#define QSPI_DDR_HHC_HALF_CLK_DELAY    ((uint32_t)QUADSPI_CCR_DHHC) /*!<Delay the data output by one half of system clock in DDR mode*/

+#endif

+/**

+  * @}

+  */

+

+/** @defgroup QSPI_SIOOMode QSPI Send Instruction Mode

+  * @{

+  */

+#define QSPI_SIOO_INST_EVERY_CMD       0x00000000U                  /*!<Send instruction on every transaction*/

+#define QSPI_SIOO_INST_ONLY_FIRST_CMD  ((uint32_t)QUADSPI_CCR_SIOO) /*!<Send instruction only for the first command*/

+/**

+  * @}

+  */

+

+/** @defgroup QSPI_MatchMode QSPI Match Mode

+  * @{

+  */

+#define QSPI_MATCH_MODE_AND            0x00000000U                /*!<AND match mode between unmasked bits*/

+#define QSPI_MATCH_MODE_OR             ((uint32_t)QUADSPI_CR_PMM) /*!<OR match mode between unmasked bits*/

+/**

+  * @}

+  */

+

+/** @defgroup QSPI_AutomaticStop QSPI Automatic Stop

+  * @{

+  */

+#define QSPI_AUTOMATIC_STOP_DISABLE    0x00000000U                 /*!<AutoPolling stops only with abort or QSPI disabling*/

+#define QSPI_AUTOMATIC_STOP_ENABLE     ((uint32_t)QUADSPI_CR_APMS) /*!<AutoPolling stops as soon as there is a match*/

+/**

+  * @}

+  */

+

+/** @defgroup QSPI_TimeOutActivation QSPI Timeout Activation

+  * @{

+  */

+#define QSPI_TIMEOUT_COUNTER_DISABLE   0x00000000U                 /*!<Timeout counter disabled, nCS remains active*/

+#define QSPI_TIMEOUT_COUNTER_ENABLE    ((uint32_t)QUADSPI_CR_TCEN) /*!<Timeout counter enabled, nCS released when timeout expires*/

+/**

+  * @}

+  */

+

+/** @defgroup QSPI_Flags QSPI Flags

+  * @{

+  */

+#define QSPI_FLAG_BUSY                 QUADSPI_SR_BUSY /*!<Busy flag: operation is ongoing*/

+#define QSPI_FLAG_TO                   QUADSPI_SR_TOF  /*!<Timeout flag: timeout occurs in memory-mapped mode*/

+#define QSPI_FLAG_SM                   QUADSPI_SR_SMF  /*!<Status match flag: received data matches in autopolling mode*/

+#define QSPI_FLAG_FT                   QUADSPI_SR_FTF  /*!<Fifo threshold flag: Fifo threshold reached or data left after read from memory is complete*/

+#define QSPI_FLAG_TC                   QUADSPI_SR_TCF  /*!<Transfer complete flag: programmed number of data have been transferred or the transfer has been aborted*/

+#define QSPI_FLAG_TE                   QUADSPI_SR_TEF  /*!<Transfer error flag: invalid address is being accessed*/

+/**

+  * @}

+  */

+

+/** @defgroup QSPI_Interrupts QSPI Interrupts

+  * @{

+  */

+#define QSPI_IT_TO                     QUADSPI_CR_TOIE /*!<Interrupt on the timeout flag*/

+#define QSPI_IT_SM                     QUADSPI_CR_SMIE /*!<Interrupt on the status match flag*/

+#define QSPI_IT_FT                     QUADSPI_CR_FTIE /*!<Interrupt on the fifo threshold flag*/

+#define QSPI_IT_TC                     QUADSPI_CR_TCIE /*!<Interrupt on the transfer complete flag*/

+#define QSPI_IT_TE                     QUADSPI_CR_TEIE /*!<Interrupt on the transfer error flag*/

+/**

+  * @}

+  */

+

+/** @defgroup QSPI_Timeout_definition QSPI Timeout definition

+  * @brief QSPI Timeout definition

+  * @{

+  */

+#define HAL_QSPI_TIMEOUT_DEFAULT_VALUE 5000U /* 5 s */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Exported macros -----------------------------------------------------------*/

+/** @defgroup QSPI_Exported_Macros QSPI Exported Macros

+  * @{

+  */

+/** @brief Reset QSPI handle state.

+  * @param  __HANDLE__ : QSPI handle.

+  * @retval None

+  */

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+#define __HAL_QSPI_RESET_HANDLE_STATE(__HANDLE__)           do {                                              \

+                                                                  (__HANDLE__)->State = HAL_QSPI_STATE_RESET; \

+                                                                  (__HANDLE__)->MspInitCallback = NULL;       \

+                                                                  (__HANDLE__)->MspDeInitCallback = NULL;     \

+                                                               } while(0)

+#else

+#define __HAL_QSPI_RESET_HANDLE_STATE(__HANDLE__)           ((__HANDLE__)->State = HAL_QSPI_STATE_RESET)

+#endif

+

+/** @brief  Enable the QSPI peripheral.

+  * @param  __HANDLE__ : specifies the QSPI Handle.

+  * @retval None

+  */

+#define __HAL_QSPI_ENABLE(__HANDLE__)                       SET_BIT((__HANDLE__)->Instance->CR, QUADSPI_CR_EN)

+

+/** @brief  Disable the QSPI peripheral.

+  * @param  __HANDLE__ : specifies the QSPI Handle.

+  * @retval None

+  */

+#define __HAL_QSPI_DISABLE(__HANDLE__)                      CLEAR_BIT((__HANDLE__)->Instance->CR, QUADSPI_CR_EN)

+

+/** @brief  Enable the specified QSPI interrupt.

+  * @param  __HANDLE__ : specifies the QSPI Handle.

+  * @param  __INTERRUPT__ : specifies the QSPI interrupt source to enable.

+  *          This parameter can be one of the following values:

+  *            @arg QSPI_IT_TO: QSPI Timeout interrupt

+  *            @arg QSPI_IT_SM: QSPI Status match interrupt

+  *            @arg QSPI_IT_FT: QSPI FIFO threshold interrupt

+  *            @arg QSPI_IT_TC: QSPI Transfer complete interrupt

+  *            @arg QSPI_IT_TE: QSPI Transfer error interrupt

+  * @retval None

+  */

+#define __HAL_QSPI_ENABLE_IT(__HANDLE__, __INTERRUPT__)     SET_BIT((__HANDLE__)->Instance->CR, (__INTERRUPT__))

+

+

+/** @brief  Disable the specified QSPI interrupt.

+  * @param  __HANDLE__ : specifies the QSPI Handle.

+  * @param  __INTERRUPT__ : specifies the QSPI interrupt source to disable.

+  *          This parameter can be one of the following values:

+  *            @arg QSPI_IT_TO: QSPI Timeout interrupt

+  *            @arg QSPI_IT_SM: QSPI Status match interrupt

+  *            @arg QSPI_IT_FT: QSPI FIFO threshold interrupt

+  *            @arg QSPI_IT_TC: QSPI Transfer complete interrupt

+  *            @arg QSPI_IT_TE: QSPI Transfer error interrupt

+  * @retval None

+  */

+#define __HAL_QSPI_DISABLE_IT(__HANDLE__, __INTERRUPT__)    CLEAR_BIT((__HANDLE__)->Instance->CR, (__INTERRUPT__))

+

+/** @brief  Check whether the specified QSPI interrupt source is enabled or not.

+  * @param  __HANDLE__ : specifies the QSPI Handle.

+  * @param  __INTERRUPT__ : specifies the QSPI interrupt source to check.

+  *          This parameter can be one of the following values:

+  *            @arg QSPI_IT_TO: QSPI Timeout interrupt

+  *            @arg QSPI_IT_SM: QSPI Status match interrupt

+  *            @arg QSPI_IT_FT: QSPI FIFO threshold interrupt

+  *            @arg QSPI_IT_TC: QSPI Transfer complete interrupt

+  *            @arg QSPI_IT_TE: QSPI Transfer error interrupt

+  * @retval The new state of __INTERRUPT__ (TRUE or FALSE).

+  */

+#define __HAL_QSPI_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) (READ_BIT((__HANDLE__)->Instance->CR, (__INTERRUPT__)) == (__INTERRUPT__))

+

+/**

+  * @brief  Check whether the selected QSPI flag is set or not.

+  * @param  __HANDLE__ : specifies the QSPI Handle.

+  * @param  __FLAG__ : specifies the QSPI flag to check.

+  *          This parameter can be one of the following values:

+  *            @arg QSPI_FLAG_BUSY: QSPI Busy flag

+  *            @arg QSPI_FLAG_TO:   QSPI Timeout flag

+  *            @arg QSPI_FLAG_SM:   QSPI Status match flag

+  *            @arg QSPI_FLAG_FT:   QSPI FIFO threshold flag

+  *            @arg QSPI_FLAG_TC:   QSPI Transfer complete flag

+  *            @arg QSPI_FLAG_TE:   QSPI Transfer error flag

+  * @retval None

+  */

+#define __HAL_QSPI_GET_FLAG(__HANDLE__, __FLAG__)           ((READ_BIT((__HANDLE__)->Instance->SR, (__FLAG__)) != 0U) ? SET : RESET)

+

+/** @brief  Clears the specified QSPI's flag status.

+  * @param  __HANDLE__ : specifies the QSPI Handle.

+  * @param  __FLAG__ : specifies the QSPI clear register flag that needs to be set

+  *          This parameter can be one of the following values:

+  *            @arg QSPI_FLAG_TO: QSPI Timeout flag

+  *            @arg QSPI_FLAG_SM: QSPI Status match flag

+  *            @arg QSPI_FLAG_TC: QSPI Transfer complete flag

+  *            @arg QSPI_FLAG_TE: QSPI Transfer error flag

+  * @retval None

+  */

+#define __HAL_QSPI_CLEAR_FLAG(__HANDLE__, __FLAG__)         WRITE_REG((__HANDLE__)->Instance->FCR, (__FLAG__))

+/**

+  * @}

+  */

+

+/* Exported functions --------------------------------------------------------*/

+/** @addtogroup QSPI_Exported_Functions

+  * @{

+  */

+

+/** @addtogroup QSPI_Exported_Functions_Group1

+  * @{

+  */

+/* Initialization/de-initialization functions  ********************************/

+HAL_StatusTypeDef     HAL_QSPI_Init     (QSPI_HandleTypeDef *hqspi);

+HAL_StatusTypeDef     HAL_QSPI_DeInit   (QSPI_HandleTypeDef *hqspi);

+void                  HAL_QSPI_MspInit  (QSPI_HandleTypeDef *hqspi);

+void                  HAL_QSPI_MspDeInit(QSPI_HandleTypeDef *hqspi);

+/**

+  * @}

+  */

+

+/** @addtogroup QSPI_Exported_Functions_Group2

+  * @{

+  */

+/* IO operation functions *****************************************************/

+/* QSPI IRQ handler method */

+void                  HAL_QSPI_IRQHandler(QSPI_HandleTypeDef *hqspi);

+

+/* QSPI indirect mode */

+HAL_StatusTypeDef     HAL_QSPI_Command      (QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t Timeout);

+HAL_StatusTypeDef     HAL_QSPI_Transmit     (QSPI_HandleTypeDef *hqspi, uint8_t *pData, uint32_t Timeout);

+HAL_StatusTypeDef     HAL_QSPI_Receive      (QSPI_HandleTypeDef *hqspi, uint8_t *pData, uint32_t Timeout);

+HAL_StatusTypeDef     HAL_QSPI_Command_IT   (QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd);

+HAL_StatusTypeDef     HAL_QSPI_Transmit_IT  (QSPI_HandleTypeDef *hqspi, uint8_t *pData);

+HAL_StatusTypeDef     HAL_QSPI_Receive_IT   (QSPI_HandleTypeDef *hqspi, uint8_t *pData);

+HAL_StatusTypeDef     HAL_QSPI_Transmit_DMA (QSPI_HandleTypeDef *hqspi, uint8_t *pData);

+HAL_StatusTypeDef     HAL_QSPI_Receive_DMA  (QSPI_HandleTypeDef *hqspi, uint8_t *pData);

+

+/* QSPI status flag polling mode */

+HAL_StatusTypeDef     HAL_QSPI_AutoPolling   (QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_AutoPollingTypeDef *cfg, uint32_t Timeout);

+HAL_StatusTypeDef     HAL_QSPI_AutoPolling_IT(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_AutoPollingTypeDef *cfg);

+

+/* QSPI memory-mapped mode */

+HAL_StatusTypeDef     HAL_QSPI_MemoryMapped(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_MemoryMappedTypeDef *cfg);

+

+/* Callback functions in non-blocking modes ***********************************/

+void                  HAL_QSPI_ErrorCallback        (QSPI_HandleTypeDef *hqspi);

+void                  HAL_QSPI_AbortCpltCallback    (QSPI_HandleTypeDef *hqspi);

+void                  HAL_QSPI_FifoThresholdCallback(QSPI_HandleTypeDef *hqspi);

+

+/* QSPI indirect mode */

+void                  HAL_QSPI_CmdCpltCallback      (QSPI_HandleTypeDef *hqspi);

+void                  HAL_QSPI_RxCpltCallback       (QSPI_HandleTypeDef *hqspi);

+void                  HAL_QSPI_TxCpltCallback       (QSPI_HandleTypeDef *hqspi);

+void                  HAL_QSPI_RxHalfCpltCallback   (QSPI_HandleTypeDef *hqspi);

+void                  HAL_QSPI_TxHalfCpltCallback   (QSPI_HandleTypeDef *hqspi);

+

+/* QSPI status flag polling mode */

+void                  HAL_QSPI_StatusMatchCallback  (QSPI_HandleTypeDef *hqspi);

+

+/* QSPI memory-mapped mode */

+void                  HAL_QSPI_TimeOutCallback      (QSPI_HandleTypeDef *hqspi);

+

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+/* QSPI callback registering/unregistering */

+HAL_StatusTypeDef     HAL_QSPI_RegisterCallback     (QSPI_HandleTypeDef *hqspi, HAL_QSPI_CallbackIDTypeDef CallbackId, pQSPI_CallbackTypeDef pCallback);

+HAL_StatusTypeDef     HAL_QSPI_UnRegisterCallback   (QSPI_HandleTypeDef *hqspi, HAL_QSPI_CallbackIDTypeDef CallbackId);

+#endif

+/**

+  * @}

+  */

+

+/** @addtogroup QSPI_Exported_Functions_Group3

+  * @{

+  */

+/* Peripheral Control and State functions  ************************************/

+HAL_QSPI_StateTypeDef HAL_QSPI_GetState        (QSPI_HandleTypeDef *hqspi);

+uint32_t              HAL_QSPI_GetError        (QSPI_HandleTypeDef *hqspi);

+HAL_StatusTypeDef     HAL_QSPI_Abort           (QSPI_HandleTypeDef *hqspi);

+HAL_StatusTypeDef     HAL_QSPI_Abort_IT        (QSPI_HandleTypeDef *hqspi);

+void                  HAL_QSPI_SetTimeout      (QSPI_HandleTypeDef *hqspi, uint32_t Timeout);

+HAL_StatusTypeDef     HAL_QSPI_SetFifoThreshold(QSPI_HandleTypeDef *hqspi, uint32_t Threshold);

+uint32_t              HAL_QSPI_GetFifoThreshold(QSPI_HandleTypeDef *hqspi);

+#if defined(QUADSPI_CR_DFM)

+HAL_StatusTypeDef     HAL_QSPI_SetFlashID      (QSPI_HandleTypeDef *hqspi, uint32_t FlashID);

+#endif

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+/* End of exported functions -------------------------------------------------*/

+

+/* Private macros ------------------------------------------------------------*/

+/** @defgroup QSPI_Private_Macros QSPI Private Macros

+  * @{

+  */

+#define IS_QSPI_CLOCK_PRESCALER(PRESCALER) ((PRESCALER) <= 0xFFU)

+

+#define IS_QSPI_FIFO_THRESHOLD(THR)        (((THR) > 0U) && ((THR) <= 16U))

+

+#define IS_QSPI_SSHIFT(SSHIFT)             (((SSHIFT) == QSPI_SAMPLE_SHIFTING_NONE) || \

+                                            ((SSHIFT) == QSPI_SAMPLE_SHIFTING_HALFCYCLE))

+

+#define IS_QSPI_FLASH_SIZE(FSIZE)          (((FSIZE) <= 31U))

+

+#define IS_QSPI_CS_HIGH_TIME(CSHTIME)      (((CSHTIME) == QSPI_CS_HIGH_TIME_1_CYCLE) || \

+                                            ((CSHTIME) == QSPI_CS_HIGH_TIME_2_CYCLE) || \

+                                            ((CSHTIME) == QSPI_CS_HIGH_TIME_3_CYCLE) || \

+                                            ((CSHTIME) == QSPI_CS_HIGH_TIME_4_CYCLE) || \

+                                            ((CSHTIME) == QSPI_CS_HIGH_TIME_5_CYCLE) || \

+                                            ((CSHTIME) == QSPI_CS_HIGH_TIME_6_CYCLE) || \

+                                            ((CSHTIME) == QSPI_CS_HIGH_TIME_7_CYCLE) || \

+                                            ((CSHTIME) == QSPI_CS_HIGH_TIME_8_CYCLE))

+

+#define IS_QSPI_CLOCK_MODE(CLKMODE)        (((CLKMODE) == QSPI_CLOCK_MODE_0) || \

+                                            ((CLKMODE) == QSPI_CLOCK_MODE_3))

+

+#if defined(QUADSPI_CR_DFM)

+#define IS_QSPI_FLASH_ID(FLASH_ID)         (((FLASH_ID) == QSPI_FLASH_ID_1) || \

+                                            ((FLASH_ID) == QSPI_FLASH_ID_2))

+

+#define IS_QSPI_DUAL_FLASH_MODE(MODE)      (((MODE) == QSPI_DUALFLASH_ENABLE) || \

+                                            ((MODE) == QSPI_DUALFLASH_DISABLE))

+

+#endif

+#define IS_QSPI_INSTRUCTION(INSTRUCTION)   ((INSTRUCTION) <= 0xFFU)

+

+#define IS_QSPI_ADDRESS_SIZE(ADDR_SIZE)    (((ADDR_SIZE) == QSPI_ADDRESS_8_BITS)  || \

+                                            ((ADDR_SIZE) == QSPI_ADDRESS_16_BITS) || \

+                                            ((ADDR_SIZE) == QSPI_ADDRESS_24_BITS) || \

+                                            ((ADDR_SIZE) == QSPI_ADDRESS_32_BITS))

+

+#define IS_QSPI_ALTERNATE_BYTES_SIZE(SIZE) (((SIZE) == QSPI_ALTERNATE_BYTES_8_BITS)  || \

+                                            ((SIZE) == QSPI_ALTERNATE_BYTES_16_BITS) || \

+                                            ((SIZE) == QSPI_ALTERNATE_BYTES_24_BITS) || \

+                                            ((SIZE) == QSPI_ALTERNATE_BYTES_32_BITS))

+

+#define IS_QSPI_DUMMY_CYCLES(DCY)          ((DCY) <= 31U)

+

+#define IS_QSPI_INSTRUCTION_MODE(MODE)     (((MODE) == QSPI_INSTRUCTION_NONE)    || \

+                                            ((MODE) == QSPI_INSTRUCTION_1_LINE)  || \

+                                            ((MODE) == QSPI_INSTRUCTION_2_LINES) || \

+                                            ((MODE) == QSPI_INSTRUCTION_4_LINES))

+

+#define IS_QSPI_ADDRESS_MODE(MODE)         (((MODE) == QSPI_ADDRESS_NONE)    || \

+                                            ((MODE) == QSPI_ADDRESS_1_LINE)  || \

+                                            ((MODE) == QSPI_ADDRESS_2_LINES) || \

+                                            ((MODE) == QSPI_ADDRESS_4_LINES))

+

+#define IS_QSPI_ALTERNATE_BYTES_MODE(MODE) (((MODE) == QSPI_ALTERNATE_BYTES_NONE)    || \

+                                            ((MODE) == QSPI_ALTERNATE_BYTES_1_LINE)  || \

+                                            ((MODE) == QSPI_ALTERNATE_BYTES_2_LINES) || \

+                                            ((MODE) == QSPI_ALTERNATE_BYTES_4_LINES))

+

+#define IS_QSPI_DATA_MODE(MODE)            (((MODE) == QSPI_DATA_NONE)    || \

+                                            ((MODE) == QSPI_DATA_1_LINE)  || \

+                                            ((MODE) == QSPI_DATA_2_LINES) || \

+                                            ((MODE) == QSPI_DATA_4_LINES))

+

+#define IS_QSPI_DDR_MODE(DDR_MODE)         (((DDR_MODE) == QSPI_DDR_MODE_DISABLE) || \

+                                            ((DDR_MODE) == QSPI_DDR_MODE_ENABLE))

+

+#if defined(QUADSPI_CCR_DHHC)

+#define IS_QSPI_DDR_HHC(DDR_HHC)           (((DDR_HHC) == QSPI_DDR_HHC_ANALOG_DELAY) || \

+                                            ((DDR_HHC) == QSPI_DDR_HHC_HALF_CLK_DELAY))

+

+#else

+#define IS_QSPI_DDR_HHC(DDR_HHC)           (((DDR_HHC) == QSPI_DDR_HHC_ANALOG_DELAY))

+

+#endif

+#define IS_QSPI_SIOO_MODE(SIOO_MODE)       (((SIOO_MODE) == QSPI_SIOO_INST_EVERY_CMD) || \

+                                            ((SIOO_MODE) == QSPI_SIOO_INST_ONLY_FIRST_CMD))

+

+#define IS_QSPI_INTERVAL(INTERVAL)         ((INTERVAL) <= QUADSPI_PIR_INTERVAL)

+

+#define IS_QSPI_STATUS_BYTES_SIZE(SIZE)    (((SIZE) >= 1U) && ((SIZE) <= 4U))

+

+#define IS_QSPI_MATCH_MODE(MODE)           (((MODE) == QSPI_MATCH_MODE_AND) || \

+                                            ((MODE) == QSPI_MATCH_MODE_OR))

+

+#define IS_QSPI_AUTOMATIC_STOP(APMS)       (((APMS) == QSPI_AUTOMATIC_STOP_DISABLE) || \

+                                            ((APMS) == QSPI_AUTOMATIC_STOP_ENABLE))

+

+#define IS_QSPI_TIMEOUT_ACTIVATION(TCEN)   (((TCEN) == QSPI_TIMEOUT_COUNTER_DISABLE) || \

+                                            ((TCEN) == QSPI_TIMEOUT_COUNTER_ENABLE))

+

+#define IS_QSPI_TIMEOUT_PERIOD(PERIOD)     ((PERIOD) <= 0xFFFFU)

+/**

+* @}

+*/

+/* End of private macros -----------------------------------------------------*/

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#endif /* defined(QUADSPI) || defined(QUADSPI1) || defined(QUADSPI2) */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* STM32L4xx_HAL_QSPI_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h
new file mode 100644
index 0000000..5111e73
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h
@@ -0,0 +1,4743 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_rcc.h

+  * @author  MCD Application Team

+  * @brief   Header file of RCC HAL module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef __STM32L4xx_HAL_RCC_H

+#define __STM32L4xx_HAL_RCC_H

+

+#ifdef __cplusplus

+ extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup RCC

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+/** @defgroup RCC_Exported_Types RCC Exported Types

+  * @{

+  */

+

+/**

+  * @brief  RCC PLL configuration structure definition

+  */

+typedef struct

+{

+  uint32_t PLLState;   /*!< The new state of the PLL.

+                            This parameter can be a value of @ref RCC_PLL_Config                      */

+

+  uint32_t PLLSource;  /*!< RCC_PLLSource: PLL entry clock source.

+                            This parameter must be a value of @ref RCC_PLL_Clock_Source               */

+

+  uint32_t PLLM;       /*!< PLLM: Division factor for PLL VCO input clock.

+                            This parameter must be a number between Min_Data = 1 and Max_Data = 16 on STM32L4Rx/STM32L4Sx devices.

+                            This parameter must be a number between Min_Data = 1 and Max_Data = 8 on the other devices */

+

+  uint32_t PLLN;       /*!< PLLN: Multiplication factor for PLL VCO output clock.

+                            This parameter must be a number between Min_Data = 8 and Max_Data = 86    */

+

+#if defined(RCC_PLLP_SUPPORT)

+  uint32_t PLLP;       /*!< PLLP: Division factor for SAI clock.

+                            This parameter must be a value of @ref RCC_PLLP_Clock_Divider             */

+#endif /* RCC_PLLP_SUPPORT */

+

+  uint32_t PLLQ;       /*!< PLLQ: Division factor for SDMMC1, RNG and USB clocks.

+                            This parameter must be a value of @ref RCC_PLLQ_Clock_Divider             */

+

+  uint32_t PLLR;       /*!< PLLR: Division for the main system clock.

+                            User have to set the PLLR parameter correctly to not exceed max frequency 120MHZ

+                            on STM32L4Rx/STM32L4Sx devices else 80MHz on the other devices.

+                            This parameter must be a value of @ref RCC_PLLR_Clock_Divider             */

+

+}RCC_PLLInitTypeDef;

+

+/**

+  * @brief  RCC Internal/External Oscillator (HSE, HSI, MSI, LSE and LSI) configuration structure definition

+  */

+typedef struct

+{

+  uint32_t OscillatorType;       /*!< The oscillators to be configured.

+                                      This parameter can be a value of @ref RCC_Oscillator_Type                   */

+

+  uint32_t HSEState;             /*!< The new state of the HSE.

+                                      This parameter can be a value of @ref RCC_HSE_Config                        */

+

+  uint32_t LSEState;             /*!< The new state of the LSE.

+                                      This parameter can be a value of @ref RCC_LSE_Config                        */

+

+  uint32_t HSIState;             /*!< The new state of the HSI.

+                                      This parameter can be a value of @ref RCC_HSI_Config                        */

+

+  uint32_t HSICalibrationValue;  /*!< The calibration trimming value (default is RCC_HSICALIBRATION_DEFAULT).

+                                      This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F on STM32L43x/STM32L44x/STM32L47x/STM32L48x devices.

+                                      This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x7F on the other devices */

+

+  uint32_t LSIState;             /*!< The new state of the LSI.

+                                      This parameter can be a value of @ref RCC_LSI_Config                        */

+#if defined(RCC_CSR_LSIPREDIV)

+

+  uint32_t LSIDiv;               /*!< The division factor of the LSI.

+                                      This parameter can be a value of @ref RCC_LSI_Div                           */

+#endif /* RCC_CSR_LSIPREDIV */

+

+  uint32_t MSIState;             /*!< The new state of the MSI.

+                                      This parameter can be a value of @ref RCC_MSI_Config */

+

+  uint32_t MSICalibrationValue;  /*!< The calibration trimming value (default is RCC_MSICALIBRATION_DEFAULT).

+                                      This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF */

+

+  uint32_t MSIClockRange;        /*!< The MSI frequency range.

+                                      This parameter can be a value of @ref RCC_MSI_Clock_Range  */

+

+  uint32_t HSI48State;             /*!< The new state of the HSI48 (only applicable to STM32L43x/STM32L44x/STM32L49x/STM32L4Ax devices).

+                                        This parameter can be a value of @ref RCC_HSI48_Config */

+

+  RCC_PLLInitTypeDef PLL;        /*!< Main PLL structure parameters                                               */

+

+}RCC_OscInitTypeDef;

+

+/**

+  * @brief  RCC System, AHB and APB busses clock configuration structure definition

+  */

+typedef struct

+{

+  uint32_t ClockType;             /*!< The clock to be configured.

+                                       This parameter can be a value of @ref RCC_System_Clock_Type      */

+

+  uint32_t SYSCLKSource;          /*!< The clock source used as system clock (SYSCLK).

+                                       This parameter can be a value of @ref RCC_System_Clock_Source    */

+

+  uint32_t AHBCLKDivider;         /*!< The AHB clock (HCLK) divider. This clock is derived from the system clock (SYSCLK).

+                                       This parameter can be a value of @ref RCC_AHB_Clock_Source       */

+

+  uint32_t APB1CLKDivider;        /*!< The APB1 clock (PCLK1) divider. This clock is derived from the AHB clock (HCLK).

+                                       This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */

+

+  uint32_t APB2CLKDivider;        /*!< The APB2 clock (PCLK2) divider. This clock is derived from the AHB clock (HCLK).

+                                       This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */

+

+}RCC_ClkInitTypeDef;

+

+/**

+  * @}

+  */

+

+/* Exported constants --------------------------------------------------------*/

+/** @defgroup RCC_Exported_Constants RCC Exported Constants

+  * @{

+  */

+

+/** @defgroup RCC_Timeout_Value Timeout Values

+  * @{

+  */

+#define RCC_DBP_TIMEOUT_VALUE          2U            /* 2 ms (minimum Tick + 1) */

+#define RCC_LSE_TIMEOUT_VALUE          LSE_STARTUP_TIMEOUT

+/**

+  * @}

+  */

+

+/** @defgroup RCC_Oscillator_Type Oscillator Type

+  * @{

+  */

+#define RCC_OSCILLATORTYPE_NONE        0x00000000U   /*!< Oscillator configuration unchanged */

+#define RCC_OSCILLATORTYPE_HSE         0x00000001U   /*!< HSE to configure */

+#define RCC_OSCILLATORTYPE_HSI         0x00000002U   /*!< HSI to configure */

+#define RCC_OSCILLATORTYPE_LSE         0x00000004U   /*!< LSE to configure */

+#define RCC_OSCILLATORTYPE_LSI         0x00000008U   /*!< LSI to configure */

+#define RCC_OSCILLATORTYPE_MSI         0x00000010U   /*!< MSI to configure */

+#if defined(RCC_HSI48_SUPPORT)

+#define RCC_OSCILLATORTYPE_HSI48       0x00000020U   /*!< HSI48 to configure */

+#endif /* RCC_HSI48_SUPPORT */

+/**

+  * @}

+  */

+

+/** @defgroup RCC_HSE_Config HSE Config

+  * @{

+  */

+#define RCC_HSE_OFF                    0x00000000U                    /*!< HSE clock deactivation */

+#define RCC_HSE_ON                     RCC_CR_HSEON                   /*!< HSE clock activation */

+#define RCC_HSE_BYPASS                 (RCC_CR_HSEBYP | RCC_CR_HSEON) /*!< External clock source for HSE clock */

+/**

+  * @}

+  */

+

+/** @defgroup RCC_LSE_Config LSE Config

+  * @{

+  */

+#define RCC_LSE_OFF                    0x00000000U                           /*!< LSE clock deactivation */

+#define RCC_LSE_ON                     RCC_BDCR_LSEON                        /*!< LSE clock activation */

+#define RCC_LSE_BYPASS                 (RCC_BDCR_LSEBYP | RCC_BDCR_LSEON)    /*!< External clock source for LSE clock */

+#if defined(RCC_BDCR_LSESYSDIS)

+#define RCC_LSE_ON_RTC_ONLY            (RCC_BDCR_LSESYSDIS | RCC_BDCR_LSEON) /*!< LSE clock activation without propagation to system */

+#define RCC_LSE_BYPASS_RTC_ONLY        (RCC_BDCR_LSEBYP | RCC_BDCR_LSESYSDIS | RCC_BDCR_LSEON) /*!< External clock source for LSE clock without propagation to system */

+#endif /* RCC_BDCR_LSESYSDIS */

+/**

+  * @}

+  */

+

+/** @defgroup RCC_HSI_Config HSI Config

+  * @{

+  */

+#define RCC_HSI_OFF                    0x00000000U   /*!< HSI clock deactivation */

+#define RCC_HSI_ON                     RCC_CR_HSION  /*!< HSI clock activation */

+

+#if defined(STM32L431xx) || defined(STM32L432xx) || defined(STM32L433xx) || defined(STM32L442xx) || defined(STM32L443xx) || \

+    defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx)

+#define RCC_HSICALIBRATION_DEFAULT     0x10U         /* Default HSI calibration trimming value */

+#else

+#define RCC_HSICALIBRATION_DEFAULT     0x40U         /* Default HSI calibration trimming value */

+#endif /* STM32L431xx || STM32L432xx || STM32L433xx || STM32L442xx || STM32L443xx || */

+       /* STM32L471xx || STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx    */

+/**

+  * @}

+  */

+

+/** @defgroup RCC_LSI_Config LSI Config

+  * @{

+  */

+#define RCC_LSI_OFF                    0x00000000U   /*!< LSI clock deactivation */

+#define RCC_LSI_ON                     RCC_CSR_LSION /*!< LSI clock activation */

+/**

+  * @}

+  */

+#if defined(RCC_CSR_LSIPREDIV)

+

+/** @defgroup RCC_LSI_Div LSI Div

+  * @{

+  */

+#define RCC_LSI_DIV1                   0x00000000U       /*!< LSI clock not divided    */

+#define RCC_LSI_DIV128                 RCC_CSR_LSIPREDIV /*!< LSI clock divided by 128 */

+/**

+  * @}

+  */

+#endif /* RCC_CSR_LSIPREDIV */

+

+/** @defgroup RCC_MSI_Config MSI Config

+  * @{

+  */

+#define RCC_MSI_OFF                    0x00000000U   /*!< MSI clock deactivation */

+#define RCC_MSI_ON                     RCC_CR_MSION  /*!< MSI clock activation */

+

+#define RCC_MSICALIBRATION_DEFAULT     0U            /*!< Default MSI calibration trimming value */

+/**

+  * @}

+  */

+

+#if defined(RCC_HSI48_SUPPORT)

+/** @defgroup RCC_HSI48_Config HSI48 Config

+  * @{

+  */

+#define RCC_HSI48_OFF                  0x00000000U       /*!< HSI48 clock deactivation */

+#define RCC_HSI48_ON                   RCC_CRRCR_HSI48ON /*!< HSI48 clock activation */

+/**

+  * @}

+  */

+#else

+/** @defgroup RCC_HSI48_Config HSI48 Config

+  * @{

+  */

+#define RCC_HSI48_OFF                  0x00000000U   /*!< HSI48 clock deactivation */

+/**

+  * @}

+  */

+#endif /* RCC_HSI48_SUPPORT */

+

+/** @defgroup RCC_PLL_Config PLL Config

+  * @{

+  */

+#define RCC_PLL_NONE                   0x00000000U   /*!< PLL configuration unchanged */

+#define RCC_PLL_OFF                    0x00000001U   /*!< PLL deactivation */

+#define RCC_PLL_ON                     0x00000002U   /*!< PLL activation */

+/**

+  * @}

+  */

+

+#if defined(RCC_PLLP_SUPPORT)

+/** @defgroup RCC_PLLP_Clock_Divider PLLP Clock Divider

+  * @{

+  */

+#if defined(RCC_PLLP_DIV_2_31_SUPPORT)

+#define RCC_PLLP_DIV2                  0x00000002U   /*!< PLLP division factor = 2  */

+#define RCC_PLLP_DIV3                  0x00000003U   /*!< PLLP division factor = 3  */

+#define RCC_PLLP_DIV4                  0x00000004U   /*!< PLLP division factor = 4  */

+#define RCC_PLLP_DIV5                  0x00000005U   /*!< PLLP division factor = 5  */

+#define RCC_PLLP_DIV6                  0x00000006U   /*!< PLLP division factor = 6  */

+#define RCC_PLLP_DIV7                  0x00000007U   /*!< PLLP division factor = 7  */

+#define RCC_PLLP_DIV8                  0x00000008U   /*!< PLLP division factor = 8  */

+#define RCC_PLLP_DIV9                  0x00000009U   /*!< PLLP division factor = 9  */

+#define RCC_PLLP_DIV10                 0x0000000AU   /*!< PLLP division factor = 10 */

+#define RCC_PLLP_DIV11                 0x0000000BU   /*!< PLLP division factor = 11 */

+#define RCC_PLLP_DIV12                 0x0000000CU   /*!< PLLP division factor = 12 */

+#define RCC_PLLP_DIV13                 0x0000000DU   /*!< PLLP division factor = 13 */

+#define RCC_PLLP_DIV14                 0x0000000EU   /*!< PLLP division factor = 14 */

+#define RCC_PLLP_DIV15                 0x0000000FU   /*!< PLLP division factor = 15 */

+#define RCC_PLLP_DIV16                 0x00000010U   /*!< PLLP division factor = 16 */

+#define RCC_PLLP_DIV17                 0x00000011U   /*!< PLLP division factor = 17 */

+#define RCC_PLLP_DIV18                 0x00000012U   /*!< PLLP division factor = 18 */

+#define RCC_PLLP_DIV19                 0x00000013U   /*!< PLLP division factor = 19 */

+#define RCC_PLLP_DIV20                 0x00000014U   /*!< PLLP division factor = 20 */

+#define RCC_PLLP_DIV21                 0x00000015U   /*!< PLLP division factor = 21 */

+#define RCC_PLLP_DIV22                 0x00000016U   /*!< PLLP division factor = 22 */

+#define RCC_PLLP_DIV23                 0x00000017U   /*!< PLLP division factor = 23 */

+#define RCC_PLLP_DIV24                 0x00000018U   /*!< PLLP division factor = 24 */

+#define RCC_PLLP_DIV25                 0x00000019U   /*!< PLLP division factor = 25 */

+#define RCC_PLLP_DIV26                 0x0000001AU   /*!< PLLP division factor = 26 */

+#define RCC_PLLP_DIV27                 0x0000001BU   /*!< PLLP division factor = 27 */

+#define RCC_PLLP_DIV28                 0x0000001CU   /*!< PLLP division factor = 28 */

+#define RCC_PLLP_DIV29                 0x0000001DU   /*!< PLLP division factor = 29 */

+#define RCC_PLLP_DIV30                 0x0000001EU   /*!< PLLP division factor = 30 */

+#define RCC_PLLP_DIV31                 0x0000001FU   /*!< PLLP division factor = 31 */

+#else

+#define RCC_PLLP_DIV7                  0x00000007U   /*!< PLLP division factor = 7  */

+#define RCC_PLLP_DIV17                 0x00000011U   /*!< PLLP division factor = 17 */

+#endif /* RCC_PLLP_DIV_2_31_SUPPORT */

+/**

+  * @}

+  */

+#endif /* RCC_PLLP_SUPPORT */

+

+/** @defgroup RCC_PLLQ_Clock_Divider PLLQ Clock Divider

+  * @{

+  */

+#define RCC_PLLQ_DIV2                  0x00000002U   /*!< PLLQ division factor = 2 */

+#define RCC_PLLQ_DIV4                  0x00000004U   /*!< PLLQ division factor = 4 */

+#define RCC_PLLQ_DIV6                  0x00000006U   /*!< PLLQ division factor = 6 */

+#define RCC_PLLQ_DIV8                  0x00000008U   /*!< PLLQ division factor = 8 */

+/**

+  * @}

+  */

+

+/** @defgroup RCC_PLLR_Clock_Divider PLLR Clock Divider

+  * @{

+  */

+#define RCC_PLLR_DIV2                  0x00000002U   /*!< PLLR division factor = 2 */

+#define RCC_PLLR_DIV4                  0x00000004U   /*!< PLLR division factor = 4 */

+#define RCC_PLLR_DIV6                  0x00000006U   /*!< PLLR division factor = 6 */

+#define RCC_PLLR_DIV8                  0x00000008U   /*!< PLLR division factor = 8 */

+/**

+  * @}

+  */

+

+/** @defgroup RCC_PLL_Clock_Source PLL Clock Source

+  * @{

+  */

+#define RCC_PLLSOURCE_NONE             0x00000000U             /*!< No clock selected as PLL entry clock source  */

+#define RCC_PLLSOURCE_MSI              RCC_PLLCFGR_PLLSRC_MSI  /*!< MSI clock selected as PLL entry clock source */

+#define RCC_PLLSOURCE_HSI              RCC_PLLCFGR_PLLSRC_HSI  /*!< HSI clock selected as PLL entry clock source */

+#define RCC_PLLSOURCE_HSE              RCC_PLLCFGR_PLLSRC_HSE  /*!< HSE clock selected as PLL entry clock source */

+/**

+  * @}

+  */

+

+/** @defgroup RCC_PLL_Clock_Output PLL Clock Output

+  * @{

+  */

+#if defined(RCC_PLLSAI2_SUPPORT)

+#define RCC_PLL_SAI3CLK                RCC_PLLCFGR_PLLPEN      /*!< PLLSAI3CLK selection from main PLL (for devices with PLLSAI2) */

+#elif defined(RCC_PLLSAI1_SUPPORT)

+#define RCC_PLL_SAI2CLK                RCC_PLLCFGR_PLLPEN      /*!< PLLSAI2CLK selection from main PLL (for devices without PLLSAI2) */

+#endif /* RCC_PLLSAI2_SUPPORT */

+#define RCC_PLL_48M1CLK                RCC_PLLCFGR_PLLQEN      /*!< PLL48M1CLK selection from main PLL */

+#define RCC_PLL_SYSCLK                 RCC_PLLCFGR_PLLREN      /*!< PLLCLK selection from main PLL */

+/**

+  * @}

+  */

+#if defined(RCC_PLLSAI1_SUPPORT)

+

+/** @defgroup RCC_PLLSAI1_Clock_Output PLLSAI1 Clock Output

+  * @{

+  */

+#define RCC_PLLSAI1_SAI1CLK            RCC_PLLSAI1CFGR_PLLSAI1PEN /*!< PLLSAI1CLK selection from PLLSAI1 */

+#define RCC_PLLSAI1_48M2CLK            RCC_PLLSAI1CFGR_PLLSAI1QEN /*!< PLL48M2CLK selection from PLLSAI1 */

+#define RCC_PLLSAI1_ADC1CLK            RCC_PLLSAI1CFGR_PLLSAI1REN /*!< PLLADC1CLK selection from PLLSAI1 */

+/**

+  * @}

+  */

+#endif /* RCC_PLLSAI1_SUPPORT */

+

+#if defined(RCC_PLLSAI2_SUPPORT)

+

+/** @defgroup RCC_PLLSAI2_Clock_Output PLLSAI2 Clock Output

+  * @{

+  */

+#define RCC_PLLSAI2_SAI2CLK            RCC_PLLSAI2CFGR_PLLSAI2PEN /*!< PLLSAI2CLK selection from PLLSAI2 */

+#if defined(RCC_PLLSAI2Q_DIV_SUPPORT)

+#define RCC_PLLSAI2_DSICLK             RCC_PLLSAI2CFGR_PLLSAI2QEN /*!< PLLDSICLK selection from PLLSAI2  */

+#endif /* RCC_PLLSAI2Q_DIV_SUPPORT */

+#if defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx) || defined(STM32L496xx) || defined(STM32L4A6xx)

+#define RCC_PLLSAI2_ADC2CLK            RCC_PLLSAI2CFGR_PLLSAI2REN /*!< PLLADC2CLK selection from PLLSAI2 */

+#else

+#define RCC_PLLSAI2_LTDCCLK            RCC_PLLSAI2CFGR_PLLSAI2REN /*!< PLLLTDCCLK selection from PLLSAI2 */

+#endif /* STM32L471xx || STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx || STM32L496xx || STM32L4A6xx */

+/**

+  * @}

+  */

+

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+/** @defgroup RCC_MSI_Clock_Range MSI Clock Range

+  * @{

+  */

+#define RCC_MSIRANGE_0                 RCC_CR_MSIRANGE_0  /*!< MSI = 100 KHz  */

+#define RCC_MSIRANGE_1                 RCC_CR_MSIRANGE_1  /*!< MSI = 200 KHz  */

+#define RCC_MSIRANGE_2                 RCC_CR_MSIRANGE_2  /*!< MSI = 400 KHz  */

+#define RCC_MSIRANGE_3                 RCC_CR_MSIRANGE_3  /*!< MSI = 800 KHz  */

+#define RCC_MSIRANGE_4                 RCC_CR_MSIRANGE_4  /*!< MSI = 1 MHz    */

+#define RCC_MSIRANGE_5                 RCC_CR_MSIRANGE_5  /*!< MSI = 2 MHz    */

+#define RCC_MSIRANGE_6                 RCC_CR_MSIRANGE_6  /*!< MSI = 4 MHz    */

+#define RCC_MSIRANGE_7                 RCC_CR_MSIRANGE_7  /*!< MSI = 8 MHz    */

+#define RCC_MSIRANGE_8                 RCC_CR_MSIRANGE_8  /*!< MSI = 16 MHz   */

+#define RCC_MSIRANGE_9                 RCC_CR_MSIRANGE_9  /*!< MSI = 24 MHz   */

+#define RCC_MSIRANGE_10                RCC_CR_MSIRANGE_10 /*!< MSI = 32 MHz   */

+#define RCC_MSIRANGE_11                RCC_CR_MSIRANGE_11 /*!< MSI = 48 MHz   */

+/**

+  * @}

+  */

+

+/** @defgroup RCC_System_Clock_Type System Clock Type

+  * @{

+  */

+#define RCC_CLOCKTYPE_SYSCLK           0x00000001U   /*!< SYSCLK to configure */

+#define RCC_CLOCKTYPE_HCLK             0x00000002U   /*!< HCLK to configure */

+#define RCC_CLOCKTYPE_PCLK1            0x00000004U   /*!< PCLK1 to configure */

+#define RCC_CLOCKTYPE_PCLK2            0x00000008U   /*!< PCLK2 to configure */

+/**

+  * @}

+  */

+

+/** @defgroup RCC_System_Clock_Source System Clock Source

+  * @{

+  */

+#define RCC_SYSCLKSOURCE_MSI           RCC_CFGR_SW_MSI    /*!< MSI selection as system clock */

+#define RCC_SYSCLKSOURCE_HSI           RCC_CFGR_SW_HSI    /*!< HSI selection as system clock */

+#define RCC_SYSCLKSOURCE_HSE           RCC_CFGR_SW_HSE    /*!< HSE selection as system clock */

+#define RCC_SYSCLKSOURCE_PLLCLK        RCC_CFGR_SW_PLL    /*!< PLL selection as system clock */

+/**

+  * @}

+  */

+

+/** @defgroup RCC_System_Clock_Source_Status System Clock Source Status

+  * @{

+  */

+#define RCC_SYSCLKSOURCE_STATUS_MSI    RCC_CFGR_SWS_MSI   /*!< MSI used as system clock */

+#define RCC_SYSCLKSOURCE_STATUS_HSI    RCC_CFGR_SWS_HSI   /*!< HSI used as system clock */

+#define RCC_SYSCLKSOURCE_STATUS_HSE    RCC_CFGR_SWS_HSE   /*!< HSE used as system clock */

+#define RCC_SYSCLKSOURCE_STATUS_PLLCLK RCC_CFGR_SWS_PLL   /*!< PLL used as system clock */

+/**

+  * @}

+  */

+

+/** @defgroup RCC_AHB_Clock_Source AHB Clock Source

+  * @{

+  */

+#define RCC_SYSCLK_DIV1                RCC_CFGR_HPRE_DIV1   /*!< SYSCLK not divided */

+#define RCC_SYSCLK_DIV2                RCC_CFGR_HPRE_DIV2   /*!< SYSCLK divided by 2 */

+#define RCC_SYSCLK_DIV4                RCC_CFGR_HPRE_DIV4   /*!< SYSCLK divided by 4 */

+#define RCC_SYSCLK_DIV8                RCC_CFGR_HPRE_DIV8   /*!< SYSCLK divided by 8 */

+#define RCC_SYSCLK_DIV16               RCC_CFGR_HPRE_DIV16  /*!< SYSCLK divided by 16 */

+#define RCC_SYSCLK_DIV64               RCC_CFGR_HPRE_DIV64  /*!< SYSCLK divided by 64 */

+#define RCC_SYSCLK_DIV128              RCC_CFGR_HPRE_DIV128 /*!< SYSCLK divided by 128 */

+#define RCC_SYSCLK_DIV256              RCC_CFGR_HPRE_DIV256 /*!< SYSCLK divided by 256 */

+#define RCC_SYSCLK_DIV512              RCC_CFGR_HPRE_DIV512 /*!< SYSCLK divided by 512 */

+/**

+  * @}

+  */

+

+/** @defgroup RCC_APB1_APB2_Clock_Source APB1 APB2 Clock Source

+  * @{

+  */

+#define RCC_HCLK_DIV1                  RCC_CFGR_PPRE1_DIV1  /*!< HCLK not divided */

+#define RCC_HCLK_DIV2                  RCC_CFGR_PPRE1_DIV2  /*!< HCLK divided by 2 */

+#define RCC_HCLK_DIV4                  RCC_CFGR_PPRE1_DIV4  /*!< HCLK divided by 4 */

+#define RCC_HCLK_DIV8                  RCC_CFGR_PPRE1_DIV8  /*!< HCLK divided by 8 */

+#define RCC_HCLK_DIV16                 RCC_CFGR_PPRE1_DIV16 /*!< HCLK divided by 16 */

+/**

+  * @}

+  */

+

+/** @defgroup RCC_RTC_Clock_Source RTC Clock Source

+  * @{

+  */

+#define RCC_RTCCLKSOURCE_NONE          0x00000000U          /*!< No clock used as RTC clock */

+#define RCC_RTCCLKSOURCE_LSE           RCC_BDCR_RTCSEL_0    /*!< LSE oscillator clock used as RTC clock */

+#define RCC_RTCCLKSOURCE_LSI           RCC_BDCR_RTCSEL_1    /*!< LSI oscillator clock used as RTC clock */

+#define RCC_RTCCLKSOURCE_HSE_DIV32     RCC_BDCR_RTCSEL      /*!< HSE oscillator clock divided by 32 used as RTC clock */

+/**

+  * @}

+  */

+

+/** @defgroup RCC_MCO_Index MCO Index

+  * @{

+  */

+#define RCC_MCO1                       0x00000000U

+#define RCC_MCO                        RCC_MCO1      /*!< MCO1 to be compliant with other families with 2 MCOs*/

+/**

+  * @}

+  */

+

+/** @defgroup RCC_MCO1_Clock_Source MCO1 Clock Source

+  * @{

+  */

+#define RCC_MCO1SOURCE_NOCLOCK         0x00000000U                            /*!< MCO1 output disabled, no clock on MCO1 */

+#define RCC_MCO1SOURCE_SYSCLK          RCC_CFGR_MCOSEL_0                      /*!< SYSCLK selection as MCO1 source */

+#define RCC_MCO1SOURCE_MSI             RCC_CFGR_MCOSEL_1                      /*!< MSI selection as MCO1 source */

+#define RCC_MCO1SOURCE_HSI             (RCC_CFGR_MCOSEL_0| RCC_CFGR_MCOSEL_1) /*!< HSI selection as MCO1 source */

+#define RCC_MCO1SOURCE_HSE             RCC_CFGR_MCOSEL_2                      /*!< HSE selection as MCO1 source */

+#define RCC_MCO1SOURCE_PLLCLK          (RCC_CFGR_MCOSEL_0|RCC_CFGR_MCOSEL_2)  /*!< PLLCLK selection as MCO1 source */

+#define RCC_MCO1SOURCE_LSI             (RCC_CFGR_MCOSEL_1|RCC_CFGR_MCOSEL_2)  /*!< LSI selection as MCO1 source */

+#define RCC_MCO1SOURCE_LSE             (RCC_CFGR_MCOSEL_0|RCC_CFGR_MCOSEL_1|RCC_CFGR_MCOSEL_2) /*!< LSE selection as MCO1 source */

+#if defined(RCC_HSI48_SUPPORT)

+#define RCC_MCO1SOURCE_HSI48           RCC_CFGR_MCOSEL_3                      /*!< HSI48 selection as MCO1 source (STM32L43x/STM32L44x devices) */

+#endif /* RCC_HSI48_SUPPORT */

+/**

+  * @}

+  */

+

+/** @defgroup RCC_MCOx_Clock_Prescaler MCO1 Clock Prescaler

+  * @{

+  */

+#define RCC_MCODIV_1                   RCC_CFGR_MCOPRE_DIV1     /*!< MCO not divided  */

+#define RCC_MCODIV_2                   RCC_CFGR_MCOPRE_DIV2     /*!< MCO divided by 2 */

+#define RCC_MCODIV_4                   RCC_CFGR_MCOPRE_DIV4     /*!< MCO divided by 4 */

+#define RCC_MCODIV_8                   RCC_CFGR_MCOPRE_DIV8     /*!< MCO divided by 8 */

+#define RCC_MCODIV_16                  RCC_CFGR_MCOPRE_DIV16    /*!< MCO divided by 16 */

+/**

+  * @}

+  */

+

+/** @defgroup RCC_Interrupt Interrupts

+  * @{

+  */

+#define RCC_IT_LSIRDY                  RCC_CIFR_LSIRDYF      /*!< LSI Ready Interrupt flag */

+#define RCC_IT_LSERDY                  RCC_CIFR_LSERDYF      /*!< LSE Ready Interrupt flag */

+#define RCC_IT_MSIRDY                  RCC_CIFR_MSIRDYF      /*!< MSI Ready Interrupt flag */

+#define RCC_IT_HSIRDY                  RCC_CIFR_HSIRDYF      /*!< HSI16 Ready Interrupt flag */

+#define RCC_IT_HSERDY                  RCC_CIFR_HSERDYF      /*!< HSE Ready Interrupt flag */

+#define RCC_IT_PLLRDY                  RCC_CIFR_PLLRDYF      /*!< PLL Ready Interrupt flag */

+#if defined(RCC_PLLSAI1_SUPPORT)

+#define RCC_IT_PLLSAI1RDY              RCC_CIFR_PLLSAI1RDYF  /*!< PLLSAI1 Ready Interrupt flag */

+#endif /* RCC_PLLSAI1_SUPPORT */

+#if defined(RCC_PLLSAI2_SUPPORT)

+#define RCC_IT_PLLSAI2RDY              RCC_CIFR_PLLSAI2RDYF  /*!< PLLSAI2 Ready Interrupt flag */

+#endif /* RCC_PLLSAI2_SUPPORT */

+#define RCC_IT_CSS                     RCC_CIFR_CSSF        /*!< Clock Security System Interrupt flag */

+#define RCC_IT_LSECSS                  RCC_CIFR_LSECSSF     /*!< LSE Clock Security System Interrupt flag */

+#if defined(RCC_HSI48_SUPPORT)

+#define RCC_IT_HSI48RDY                RCC_CIFR_HSI48RDYF   /*!< HSI48 Ready Interrupt flag */

+#endif /* RCC_HSI48_SUPPORT */

+/**

+  * @}

+  */

+

+/** @defgroup RCC_Flag Flags

+  *        Elements values convention: XXXYYYYYb

+  *           - YYYYY  : Flag position in the register

+  *           - XXX  : Register index

+  *                 - 001: CR register

+  *                 - 010: BDCR register

+  *                 - 011: CSR register

+  *                 - 100: CRRCR register

+  * @{

+  */

+/* Flags in the CR register */

+#define RCC_FLAG_MSIRDY                ((CR_REG_INDEX << 5U) | RCC_CR_MSIRDY_Pos) /*!< MSI Ready flag */

+#define RCC_FLAG_HSIRDY                ((CR_REG_INDEX << 5U) | RCC_CR_HSIRDY_Pos) /*!< HSI Ready flag */

+#define RCC_FLAG_HSERDY                ((CR_REG_INDEX << 5U) | RCC_CR_HSERDY_Pos) /*!< HSE Ready flag */

+#define RCC_FLAG_PLLRDY                ((CR_REG_INDEX << 5U) | RCC_CR_PLLRDY_Pos) /*!< PLL Ready flag */

+#if defined(RCC_PLLSAI1_SUPPORT)

+#define RCC_FLAG_PLLSAI1RDY            ((CR_REG_INDEX << 5U) | RCC_CR_PLLSAI1RDY_Pos) /*!< PLLSAI1 Ready flag */

+#endif /* RCC_PLLSAI1_SUPPORT */

+#if defined(RCC_PLLSAI2_SUPPORT)

+#define RCC_FLAG_PLLSAI2RDY            ((CR_REG_INDEX << 5U) | RCC_CR_PLLSAI2RDY_Pos) /*!< PLLSAI2 Ready flag */

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+/* Flags in the BDCR register */

+#define RCC_FLAG_LSERDY                ((BDCR_REG_INDEX << 5U) | RCC_BDCR_LSERDY_Pos)  /*!< LSE Ready flag */

+#define RCC_FLAG_LSECSSD               ((BDCR_REG_INDEX << 5U) | RCC_BDCR_LSECSSD_Pos) /*!< LSE Clock Security System Interrupt flag */

+

+/* Flags in the CSR register */

+#define RCC_FLAG_LSIRDY                ((CSR_REG_INDEX << 5U) | RCC_CSR_LSIRDY_Pos)    /*!< LSI Ready flag */

+#define RCC_FLAG_FWRST                 ((CSR_REG_INDEX << 5U) | RCC_CSR_FWRSTF_Pos)    /*!< Firewall reset flag */

+#define RCC_FLAG_OBLRST                ((CSR_REG_INDEX << 5U) | RCC_CSR_OBLRSTF_Pos)   /*!< Option Byte Loader reset flag */

+#define RCC_FLAG_PINRST                ((CSR_REG_INDEX << 5U) | RCC_CSR_PINRSTF_Pos)   /*!< PIN reset flag */

+#define RCC_FLAG_BORRST                ((CSR_REG_INDEX << 5U) | RCC_CSR_BORRSTF_Pos)   /*!< BOR reset flag */

+#define RCC_FLAG_SFTRST                ((CSR_REG_INDEX << 5U) | RCC_CSR_SFTRSTF_Pos)   /*!< Software Reset flag */

+#define RCC_FLAG_IWDGRST               ((CSR_REG_INDEX << 5U) | RCC_CSR_IWDGRSTF_Pos)  /*!< Independent Watchdog reset flag */

+#define RCC_FLAG_WWDGRST               ((CSR_REG_INDEX << 5U) | RCC_CSR_WWDGRSTF_Pos)  /*!< Window watchdog reset flag */

+#define RCC_FLAG_LPWRRST               ((CSR_REG_INDEX << 5U) | RCC_CSR_LPWRRSTF_Pos)  /*!< Low-Power reset flag */

+

+#if defined(RCC_HSI48_SUPPORT)

+/* Flags in the CRRCR register */

+#define RCC_FLAG_HSI48RDY              ((CRRCR_REG_INDEX << 5U) | RCC_CRRCR_HSI48RDY_Pos) /*!< HSI48 Ready flag */

+#endif /* RCC_HSI48_SUPPORT */

+/**

+  * @}

+  */

+

+/** @defgroup RCC_LSEDrive_Config LSE Drive Config

+  * @{

+  */

+#define RCC_LSEDRIVE_LOW                 0x00000000U         /*!< LSE low drive capability */

+#define RCC_LSEDRIVE_MEDIUMLOW           RCC_BDCR_LSEDRV_0   /*!< LSE medium low drive capability */

+#define RCC_LSEDRIVE_MEDIUMHIGH          RCC_BDCR_LSEDRV_1   /*!< LSE medium high drive capability */

+#define RCC_LSEDRIVE_HIGH                RCC_BDCR_LSEDRV     /*!< LSE high drive capability */

+/**

+  * @}

+  */

+

+/** @defgroup RCC_Stop_WakeUpClock Wake-Up from STOP Clock

+  * @{

+  */

+#define RCC_STOP_WAKEUPCLOCK_MSI       0x00000000U           /*!< MSI selection after wake-up from STOP */

+#define RCC_STOP_WAKEUPCLOCK_HSI       RCC_CFGR_STOPWUCK     /*!< HSI selection after wake-up from STOP */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Exported macros -----------------------------------------------------------*/

+

+/** @defgroup RCC_Exported_Macros RCC Exported Macros

+  * @{

+  */

+

+/** @defgroup RCC_AHB1_Peripheral_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable

+  * @brief  Enable or disable the AHB1 peripheral clock.

+  * @note   After reset, the peripheral clock (used for registers read/write access)

+  *         is disabled and the application software has to enable this clock before

+  *         using it.

+  * @{

+  */

+

+#define __HAL_RCC_DMA1_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#define __HAL_RCC_DMA2_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#if defined(DMAMUX1)

+#define __HAL_RCC_DMAMUX1_CLK_ENABLE()         do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMAMUX1EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMAMUX1EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* DMAMUX1 */

+

+#define __HAL_RCC_FLASH_CLK_ENABLE()           do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_FLASHEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_FLASHEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#define __HAL_RCC_CRC_CLK_ENABLE()             do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#define __HAL_RCC_TSC_CLK_ENABLE()             do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_TSCEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_TSCEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#if defined(DMA2D)

+#define __HAL_RCC_DMA2D_CLK_ENABLE()           do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* DMA2D */

+

+#if defined(GFXMMU)

+#define __HAL_RCC_GFXMMU_CLK_ENABLE()          do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GFXMMUEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GFXMMUEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* GFXMMU */

+

+

+#define __HAL_RCC_DMA1_CLK_DISABLE()           CLEAR_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN)

+

+#define __HAL_RCC_DMA2_CLK_DISABLE()           CLEAR_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN)

+

+#if defined(DMAMUX1)

+#define __HAL_RCC_DMAMUX1_CLK_DISABLE()        CLEAR_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMAMUX1EN)

+#endif /* DMAMUX1 */

+

+#define __HAL_RCC_FLASH_CLK_DISABLE()          CLEAR_BIT(RCC->AHB1ENR, RCC_AHB1ENR_FLASHEN)

+

+#define __HAL_RCC_CRC_CLK_DISABLE()            CLEAR_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN)

+

+#define __HAL_RCC_TSC_CLK_DISABLE()            CLEAR_BIT(RCC->AHB1ENR, RCC_AHB1ENR_TSCEN)

+

+#if defined(DMA2D)

+#define __HAL_RCC_DMA2D_CLK_DISABLE()          CLEAR_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN)

+#endif /* DMA2D */

+

+#if defined(GFXMMU)

+#define __HAL_RCC_GFXMMU_CLK_DISABLE()         CLEAR_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GFXMMUEN)

+#endif /* GFXMMU */

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_AHB2_Peripheral_Clock_Enable_Disable AHB2 Peripheral Clock Enable Disable

+  * @brief  Enable or disable the AHB2 peripheral clock.

+  * @note   After reset, the peripheral clock (used for registers read/write access)

+  *         is disabled and the application software has to enable this clock before

+  *         using it.

+  * @{

+  */

+

+#define __HAL_RCC_GPIOA_CLK_ENABLE()           do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOAEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOAEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#define __HAL_RCC_GPIOB_CLK_ENABLE()           do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOBEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOBEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#define __HAL_RCC_GPIOC_CLK_ENABLE()           do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOCEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOCEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#if defined(GPIOD)

+#define __HAL_RCC_GPIOD_CLK_ENABLE()           do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIODEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIODEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* GPIOD */

+

+#if defined(GPIOE)

+#define __HAL_RCC_GPIOE_CLK_ENABLE()           do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOEEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOEEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* GPIOE */

+

+#if defined(GPIOF)

+#define __HAL_RCC_GPIOF_CLK_ENABLE()           do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOFEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOFEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* GPIOF */

+

+#if defined(GPIOG)

+#define __HAL_RCC_GPIOG_CLK_ENABLE()           do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOGEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOGEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* GPIOG */

+

+#define __HAL_RCC_GPIOH_CLK_ENABLE()           do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOHEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOHEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#if defined(GPIOI)

+#define __HAL_RCC_GPIOI_CLK_ENABLE()           do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOIEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOIEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* GPIOI */

+

+#if defined(USB_OTG_FS)

+#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE()      do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_OTGFSEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_OTGFSEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* USB_OTG_FS */

+

+#define __HAL_RCC_ADC_CLK_ENABLE()             do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_ADCEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_ADCEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#if defined(DCMI)

+#define __HAL_RCC_DCMI_CLK_ENABLE()             do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* DCMI */

+

+#if defined(AES)

+#define __HAL_RCC_AES_CLK_ENABLE()             do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* AES */

+

+#if defined(HASH)

+#define __HAL_RCC_HASH_CLK_ENABLE()             do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* HASH */

+

+#define __HAL_RCC_RNG_CLK_ENABLE()             do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#if defined(OCTOSPIM)

+#define __HAL_RCC_OSPIM_CLK_ENABLE()           do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_OSPIMEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_OSPIMEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* OCTOSPIM */

+

+#if defined(SDMMC1) && defined(RCC_AHB2ENR_SDMMC1EN)

+#define __HAL_RCC_SDMMC1_CLK_ENABLE()          do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_SDMMC1EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_SDMMC1EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* SDMMC1 && RCC_AHB2ENR_SDMMC1EN */

+

+

+#define __HAL_RCC_GPIOA_CLK_DISABLE()          CLEAR_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOAEN)

+

+#define __HAL_RCC_GPIOB_CLK_DISABLE()          CLEAR_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOBEN)

+

+#define __HAL_RCC_GPIOC_CLK_DISABLE()          CLEAR_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOCEN)

+

+#if defined(GPIOD)

+#define __HAL_RCC_GPIOD_CLK_DISABLE()          CLEAR_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIODEN)

+#endif /* GPIOD */

+

+#if defined(GPIOE)

+#define __HAL_RCC_GPIOE_CLK_DISABLE()          CLEAR_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOEEN)

+#endif /* GPIOE */

+

+#if defined(GPIOF)

+#define __HAL_RCC_GPIOF_CLK_DISABLE()          CLEAR_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOFEN)

+#endif /* GPIOF */

+

+#if defined(GPIOG)

+#define __HAL_RCC_GPIOG_CLK_DISABLE()          CLEAR_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOGEN)

+#endif /* GPIOG */

+

+#define __HAL_RCC_GPIOH_CLK_DISABLE()          CLEAR_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOHEN)

+

+#if defined(GPIOI)

+#define __HAL_RCC_GPIOI_CLK_DISABLE()          CLEAR_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOIEN)

+#endif /* GPIOI */

+

+#if defined(USB_OTG_FS)

+#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE()     CLEAR_BIT(RCC->AHB2ENR, RCC_AHB2ENR_OTGFSEN);

+#endif /* USB_OTG_FS */

+

+#define __HAL_RCC_ADC_CLK_DISABLE()            CLEAR_BIT(RCC->AHB2ENR, RCC_AHB2ENR_ADCEN)

+

+#if defined(DCMI)

+#define __HAL_RCC_DCMI_CLK_DISABLE()           CLEAR_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN)

+#endif /* DCMI */

+

+#if defined(AES)

+#define __HAL_RCC_AES_CLK_DISABLE()            CLEAR_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN);

+#endif /* AES */

+

+#if defined(HASH)

+#define __HAL_RCC_HASH_CLK_DISABLE()           CLEAR_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN)

+#endif /* HASH */

+

+#define __HAL_RCC_RNG_CLK_DISABLE()            CLEAR_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN)

+

+#if defined(OCTOSPIM)

+#define __HAL_RCC_OSPIM_CLK_DISABLE()          CLEAR_BIT(RCC->AHB2ENR, RCC_AHB2ENR_OSPIMEN)

+#endif /* OCTOSPIM */

+

+#if defined(SDMMC1) && defined(RCC_AHB2ENR_SDMMC1EN)

+#define __HAL_RCC_SDMMC1_CLK_DISABLE()         CLEAR_BIT(RCC->AHB2ENR, RCC_AHB2ENR_SDMMC1EN)

+#endif /* SDMMC1 && RCC_AHB2ENR_SDMMC1EN */

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_AHB3_Clock_Enable_Disable AHB3 Peripheral Clock Enable Disable

+  * @brief  Enable or disable the AHB3 peripheral clock.

+  * @note   After reset, the peripheral clock (used for registers read/write access)

+  *         is disabled and the application software has to enable this clock before

+  *         using it.

+  * @{

+  */

+

+#if defined(FMC_BANK1)

+#define __HAL_RCC_FMC_CLK_ENABLE()             do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* FMC_BANK1 */

+

+#if defined(QUADSPI)

+#define __HAL_RCC_QSPI_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* QUADSPI */

+

+#if defined(OCTOSPI1)

+#define __HAL_RCC_OSPI1_CLK_ENABLE()           do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_OSPI1EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_OSPI1EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* OCTOSPI1 */

+

+#if defined(OCTOSPI2)

+#define __HAL_RCC_OSPI2_CLK_ENABLE()           do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->AHB3ENR, RCC_AHB3ENR_OSPI2EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_OSPI2EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* OCTOSPI2 */

+

+#if defined(FMC_BANK1)

+#define __HAL_RCC_FMC_CLK_DISABLE()            CLEAR_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN)

+#endif /* FMC_BANK1 */

+

+#if defined(QUADSPI)

+#define __HAL_RCC_QSPI_CLK_DISABLE()           CLEAR_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN)

+#endif /* QUADSPI */

+

+#if defined(OCTOSPI1)

+#define __HAL_RCC_OSPI1_CLK_DISABLE()          CLEAR_BIT(RCC->AHB3ENR, RCC_AHB3ENR_OSPI1EN)

+#endif /* OCTOSPI1 */

+

+#if defined(OCTOSPI2)

+#define __HAL_RCC_OSPI2_CLK_DISABLE()          CLEAR_BIT(RCC->AHB3ENR, RCC_AHB3ENR_OSPI2EN)

+#endif /* OCTOSPI2 */

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable

+  * @brief  Enable or disable the APB1 peripheral clock.

+  * @note   After reset, the peripheral clock (used for registers read/write access)

+  *         is disabled and the application software has to enable this clock before

+  *         using it.

+  * @{

+  */

+

+#define __HAL_RCC_TIM2_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM2EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM2EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#if defined(TIM3)

+#define __HAL_RCC_TIM3_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM3EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM3EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* TIM3 */

+

+#if defined(TIM4)

+#define __HAL_RCC_TIM4_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM4EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM4EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* TIM4 */

+

+#if defined(TIM5)

+#define __HAL_RCC_TIM5_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM5EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM5EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* TIM5 */

+

+#define __HAL_RCC_TIM6_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM6EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM6EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#if defined(TIM7)

+#define __HAL_RCC_TIM7_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM7EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM7EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* TIM7 */

+

+#if defined(LCD)

+#define __HAL_RCC_LCD_CLK_ENABLE()             do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_LCDEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_LCDEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* LCD */

+

+#if defined(RCC_APB1ENR1_RTCAPBEN)

+#define __HAL_RCC_RTCAPB_CLK_ENABLE()          do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_RTCAPBEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_RTCAPBEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* RCC_APB1ENR1_RTCAPBEN */

+

+#define __HAL_RCC_WWDG_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_WWDGEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_WWDGEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#if defined(SPI2)

+#define __HAL_RCC_SPI2_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_SPI2EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_SPI2EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* SPI2 */

+

+#if defined(SPI3)

+#define __HAL_RCC_SPI3_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_SPI3EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_SPI3EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* SPI3 */

+

+#define __HAL_RCC_USART2_CLK_ENABLE()          do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_USART2EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_USART2EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#if defined(USART3)

+#define __HAL_RCC_USART3_CLK_ENABLE()          do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_USART3EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_USART3EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* USART3 */

+

+#if defined(UART4)

+#define __HAL_RCC_UART4_CLK_ENABLE()           do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_UART4EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_UART4EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* UART4 */

+

+#if defined(UART5)

+#define __HAL_RCC_UART5_CLK_ENABLE()           do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_UART5EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_UART5EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* UART5 */

+

+#define __HAL_RCC_I2C1_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_I2C1EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_I2C1EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#if defined(I2C2)

+#define __HAL_RCC_I2C2_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_I2C2EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_I2C2EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* I2C2 */

+

+#define __HAL_RCC_I2C3_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_I2C3EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_I2C3EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#if defined(I2C4)

+#define __HAL_RCC_I2C4_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR2, RCC_APB1ENR2_I2C4EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR2, RCC_APB1ENR2_I2C4EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* I2C4 */

+

+#if defined(CRS)

+#define __HAL_RCC_CRS_CLK_ENABLE()             do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_CRSEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_CRSEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* CRS */

+

+#if defined(CAN1)

+#define __HAL_RCC_CAN1_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_CAN1EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_CAN1EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* CAN1 */

+

+#if defined(CAN2)

+#define __HAL_RCC_CAN2_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_CAN2EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_CAN2EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* CAN2 */

+

+#if defined(USB)

+#define __HAL_RCC_USB_CLK_ENABLE()             do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_USBFSEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_USBFSEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* USB */

+

+#define __HAL_RCC_PWR_CLK_ENABLE()             do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_PWREN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_PWREN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#if defined(DAC1)

+#define __HAL_RCC_DAC1_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_DAC1EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_DAC1EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* DAC1 */

+

+#define __HAL_RCC_OPAMP_CLK_ENABLE()           do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_OPAMPEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_OPAMPEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#define __HAL_RCC_LPTIM1_CLK_ENABLE()          do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR1, RCC_APB1ENR1_LPTIM1EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_LPTIM1EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#define __HAL_RCC_LPUART1_CLK_ENABLE()         do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR2, RCC_APB1ENR2_LPUART1EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR2, RCC_APB1ENR2_LPUART1EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#if defined(SWPMI1)

+#define __HAL_RCC_SWPMI1_CLK_ENABLE()          do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR2, RCC_APB1ENR2_SWPMI1EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR2, RCC_APB1ENR2_SWPMI1EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* SWPMI1 */

+

+#define __HAL_RCC_LPTIM2_CLK_ENABLE()          do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB1ENR2, RCC_APB1ENR2_LPTIM2EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB1ENR2, RCC_APB1ENR2_LPTIM2EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+

+#define __HAL_RCC_TIM2_CLK_DISABLE()           CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM2EN)

+

+#if defined(TIM3)

+#define __HAL_RCC_TIM3_CLK_DISABLE()           CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM3EN)

+#endif /* TIM3 */

+

+#if defined(TIM4)

+#define __HAL_RCC_TIM4_CLK_DISABLE()           CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM4EN)

+#endif /* TIM4 */

+

+#if defined(TIM5)

+#define __HAL_RCC_TIM5_CLK_DISABLE()           CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM5EN)

+#endif /* TIM5 */

+

+#define __HAL_RCC_TIM6_CLK_DISABLE()           CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM6EN)

+

+#if defined(TIM7)

+#define __HAL_RCC_TIM7_CLK_DISABLE()           CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM7EN)

+#endif /* TIM7 */

+

+#if defined(LCD)

+#define __HAL_RCC_LCD_CLK_DISABLE()            CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_LCDEN);

+#endif /* LCD */

+

+#if defined(RCC_APB1ENR1_RTCAPBEN)

+#define __HAL_RCC_RTCAPB_CLK_DISABLE()         CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_RTCAPBEN);

+#endif /* RCC_APB1ENR1_RTCAPBEN */

+

+#if defined(SPI2)

+#define __HAL_RCC_SPI2_CLK_DISABLE()           CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_SPI2EN)

+#endif /* SPI2 */

+

+#if defined(SPI3)

+#define __HAL_RCC_SPI3_CLK_DISABLE()           CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_SPI3EN)

+#endif /* SPI3 */

+

+#define __HAL_RCC_USART2_CLK_DISABLE()         CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_USART2EN)

+

+#if defined(USART3)

+#define __HAL_RCC_USART3_CLK_DISABLE()         CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_USART3EN)

+#endif /* USART3 */

+

+#if defined(UART4)

+#define __HAL_RCC_UART4_CLK_DISABLE()          CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_UART4EN)

+#endif /* UART4 */

+

+#if defined(UART5)

+#define __HAL_RCC_UART5_CLK_DISABLE()          CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_UART5EN)

+#endif /* UART5 */

+

+#define __HAL_RCC_I2C1_CLK_DISABLE()           CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_I2C1EN)

+

+#if defined(I2C2)

+#define __HAL_RCC_I2C2_CLK_DISABLE()           CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_I2C2EN)

+#endif /* I2C2 */

+

+#define __HAL_RCC_I2C3_CLK_DISABLE()           CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_I2C3EN)

+

+#if defined(I2C4)

+#define __HAL_RCC_I2C4_CLK_DISABLE()           CLEAR_BIT(RCC->APB1ENR2, RCC_APB1ENR2_I2C4EN)

+#endif /* I2C4 */

+

+#if defined(CRS)

+#define __HAL_RCC_CRS_CLK_DISABLE()            CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_CRSEN);

+#endif /* CRS */

+

+#if defined(CAN1)

+#define __HAL_RCC_CAN1_CLK_DISABLE()           CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_CAN1EN)

+#endif /* CAN1 */

+

+#if defined(CAN2)

+#define __HAL_RCC_CAN2_CLK_DISABLE()           CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_CAN2EN)

+#endif /* CAN2 */

+

+#if defined(USB)

+#define __HAL_RCC_USB_CLK_DISABLE()            CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_USBFSEN);

+#endif /* USB */

+

+#define __HAL_RCC_PWR_CLK_DISABLE()            CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_PWREN)

+

+#if defined(DAC1)

+#define __HAL_RCC_DAC1_CLK_DISABLE()           CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_DAC1EN)

+#endif /* DAC1 */

+

+#define __HAL_RCC_OPAMP_CLK_DISABLE()          CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_OPAMPEN)

+

+#define __HAL_RCC_LPTIM1_CLK_DISABLE()         CLEAR_BIT(RCC->APB1ENR1, RCC_APB1ENR1_LPTIM1EN)

+

+#define __HAL_RCC_LPUART1_CLK_DISABLE()        CLEAR_BIT(RCC->APB1ENR2, RCC_APB1ENR2_LPUART1EN)

+

+#if defined(SWPMI1)

+#define __HAL_RCC_SWPMI1_CLK_DISABLE()         CLEAR_BIT(RCC->APB1ENR2, RCC_APB1ENR2_SWPMI1EN)

+#endif /* SWPMI1 */

+

+#define __HAL_RCC_LPTIM2_CLK_DISABLE()         CLEAR_BIT(RCC->APB1ENR2, RCC_APB1ENR2_LPTIM2EN)

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable

+  * @brief  Enable or disable the APB2 peripheral clock.

+  * @note   After reset, the peripheral clock (used for registers read/write access)

+  *         is disabled and the application software has to enable this clock before

+  *         using it.

+  * @{

+  */

+

+#define __HAL_RCC_SYSCFG_CLK_ENABLE()          do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#define __HAL_RCC_FIREWALL_CLK_ENABLE()        do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB2ENR, RCC_APB2ENR_FWEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_FWEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#if defined(SDMMC1) && defined(RCC_APB2ENR_SDMMC1EN)

+#define __HAL_RCC_SDMMC1_CLK_ENABLE()          do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDMMC1EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDMMC1EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* SDMMC1 && RCC_APB2ENR_SDMMC1EN */

+

+#define __HAL_RCC_TIM1_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#define __HAL_RCC_SPI1_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#if defined(TIM8)

+#define __HAL_RCC_TIM8_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* TIM8 */

+

+#define __HAL_RCC_USART1_CLK_ENABLE()          do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+

+#define __HAL_RCC_TIM15_CLK_ENABLE()           do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM15EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM15EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#define __HAL_RCC_TIM16_CLK_ENABLE()           do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM16EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM16EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+

+#if defined(TIM17)

+#define __HAL_RCC_TIM17_CLK_ENABLE()           do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM17EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM17EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* TIM17 */

+

+#if defined(SAI1)

+#define __HAL_RCC_SAI1_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* SAI1 */

+

+#if defined(SAI2)

+#define __HAL_RCC_SAI2_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* SAI2 */

+

+#if defined(DFSDM1_Filter0)

+#define __HAL_RCC_DFSDM1_CLK_ENABLE()          do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* DFSDM1_Filter0 */

+

+#if defined(LTDC)

+#define __HAL_RCC_LTDC_CLK_ENABLE()            do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* LTDC */

+

+#if defined(DSI)

+#define __HAL_RCC_DSI_CLK_ENABLE()             do { \

+                                                 __IO uint32_t tmpreg; \

+                                                 SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN); \

+                                                 /* Delay after an RCC peripheral clock enabling */ \

+                                                 tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN); \

+                                                 UNUSED(tmpreg); \

+                                               } while(0)

+#endif /* DSI */

+

+

+#define __HAL_RCC_SYSCFG_CLK_DISABLE()         CLEAR_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN)

+

+#if defined(SDMMC1) && defined(RCC_APB2ENR_SDMMC1EN)

+#define __HAL_RCC_SDMMC1_CLK_DISABLE()         CLEAR_BIT(RCC->APB2ENR, RCC_APB2ENR_SDMMC1EN)

+#endif /* SDMMC1 && RCC_APB2ENR_SDMMC1EN */

+

+#define __HAL_RCC_TIM1_CLK_DISABLE()           CLEAR_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN)

+

+#define __HAL_RCC_SPI1_CLK_DISABLE()           CLEAR_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN)

+

+#if defined(TIM8)

+#define __HAL_RCC_TIM8_CLK_DISABLE()           CLEAR_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN)

+#endif /* TIM8 */

+

+#define __HAL_RCC_USART1_CLK_DISABLE()         CLEAR_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN)

+

+#define __HAL_RCC_TIM15_CLK_DISABLE()          CLEAR_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM15EN)

+

+#define __HAL_RCC_TIM16_CLK_DISABLE()          CLEAR_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM16EN)

+

+#if defined(TIM17)

+#define __HAL_RCC_TIM17_CLK_DISABLE()          CLEAR_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM17EN)

+#endif /* TIM17 */

+

+#if defined(SAI1)

+#define __HAL_RCC_SAI1_CLK_DISABLE()           CLEAR_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN)

+#endif /* SAI1 */

+

+#if defined(SAI2)

+#define __HAL_RCC_SAI2_CLK_DISABLE()           CLEAR_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN)

+#endif /* SAI2 */

+

+#if defined(DFSDM1_Filter0)

+#define __HAL_RCC_DFSDM1_CLK_DISABLE()         CLEAR_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN)

+#endif /* DFSDM1_Filter0 */

+

+#if defined(LTDC)

+#define __HAL_RCC_LTDC_CLK_DISABLE()           CLEAR_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN)

+#endif /* LTDC */

+

+#if defined(DSI)

+#define __HAL_RCC_DSI_CLK_DISABLE()            CLEAR_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN)

+#endif /* DSI */

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enabled or Disabled Status

+  * @brief  Check whether the AHB1 peripheral clock is enabled or not.

+  * @note   After reset, the peripheral clock (used for registers read/write access)

+  *         is disabled and the application software has to enable this clock before

+  *         using it.

+  * @{

+  */

+

+#define __HAL_RCC_DMA1_IS_CLK_ENABLED()        (READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN) != 0U)

+

+#define __HAL_RCC_DMA2_IS_CLK_ENABLED()        (READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN) != 0U)

+

+#if defined(DMAMUX1)

+#define __HAL_RCC_DMAMUX1_IS_CLK_ENABLED()     (READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMAMUX1EN) != 0U)

+#endif /* DMAMUX1 */

+

+#define __HAL_RCC_FLASH_IS_CLK_ENABLED()       (READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_FLASHEN) != 0U)

+

+#define __HAL_RCC_CRC_IS_CLK_ENABLED()         (READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN) != 0U)

+

+#define __HAL_RCC_TSC_IS_CLK_ENABLED()         (READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_TSCEN) != 0U)

+

+#if defined(DMA2D)

+#define __HAL_RCC_DMA2D_IS_CLK_ENABLED()       (READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN) != 0U)

+#endif /* DMA2D */

+

+#if defined(GFXMMU)

+#define __HAL_RCC_GFXMMU_IS_CLK_ENABLED()      (READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GFXMMUEN) != 0U)

+#endif /* GFXMMU */

+

+

+#define __HAL_RCC_DMA1_IS_CLK_DISABLED()       (READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN) == 0U)

+

+#define __HAL_RCC_DMA2_IS_CLK_DISABLED()       (READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN) == 0U)

+

+#if defined(DMAMUX1)

+#define __HAL_RCC_DMAMUX1_IS_CLK_DISABLED()    (READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMAMUX1EN) == 0U)

+#endif /* DMAMUX1 */

+

+#define __HAL_RCC_FLASH_IS_CLK_DISABLED()      (READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_FLASHEN) == 0U)

+

+#define __HAL_RCC_CRC_IS_CLK_DISABLED()        (READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_CRCEN) == 0U)

+

+#define __HAL_RCC_TSC_IS_CLK_DISABLED()        (READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_TSCEN) == 0U)

+

+#if defined(DMA2D)

+#define __HAL_RCC_DMA2D_IS_CLK_DISABLED()      (READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2DEN) == 0U)

+#endif /* DMA2D */

+

+#if defined(GFXMMU)

+#define __HAL_RCC_GFXMMU_IS_CLK_DISABLED()     (READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GFXMMUEN) == 0U)

+#endif /* GFXMMU */

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_AHB2_Clock_Enable_Disable_Status AHB2 Peripheral Clock Enabled or Disabled Status

+  * @brief  Check whether the AHB2 peripheral clock is enabled or not.

+  * @note   After reset, the peripheral clock (used for registers read/write access)

+  *         is disabled and the application software has to enable this clock before

+  *         using it.

+  * @{

+  */

+

+#define __HAL_RCC_GPIOA_IS_CLK_ENABLED()       (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOAEN) != 0U)

+

+#define __HAL_RCC_GPIOB_IS_CLK_ENABLED()       (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOBEN) != 0U)

+

+#define __HAL_RCC_GPIOC_IS_CLK_ENABLED()       (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOCEN) != 0U)

+

+#if defined(GPIOD)

+#define __HAL_RCC_GPIOD_IS_CLK_ENABLED()       (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIODEN) != 0U)

+#endif /* GPIOD */

+

+#if defined(GPIOE)

+#define __HAL_RCC_GPIOE_IS_CLK_ENABLED()       (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOEEN) != 0U)

+#endif /* GPIOE */

+

+#if defined(GPIOF)

+#define __HAL_RCC_GPIOF_IS_CLK_ENABLED()       (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOFEN) != 0U)

+#endif /* GPIOF */

+

+#if defined(GPIOG)

+#define __HAL_RCC_GPIOG_IS_CLK_ENABLED()       (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOGEN) != 0U)

+#endif /* GPIOG */

+

+#define __HAL_RCC_GPIOH_IS_CLK_ENABLED()       (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOHEN) != 0U)

+

+#if defined(GPIOI)

+#define __HAL_RCC_GPIOI_IS_CLK_ENABLED()       (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOIEN) != 0U)

+#endif /* GPIOI */

+

+#if defined(USB_OTG_FS)

+#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED()  (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_OTGFSEN) != 0U)

+#endif /* USB_OTG_FS */

+

+#define __HAL_RCC_ADC_IS_CLK_ENABLED()         (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_ADCEN) != 0U)

+

+#if defined(DCMI)

+#define __HAL_RCC_DCMI_IS_CLK_ENABLED()        (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN) != 0U)

+#endif /* DCMI */

+

+#if defined(AES)

+#define __HAL_RCC_AES_IS_CLK_ENABLED()         (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN) != 0U)

+#endif /* AES */

+

+#if defined(HASH)

+#define __HAL_RCC_HASH_IS_CLK_ENABLED()        (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN) != 0U)

+#endif /* HASH */

+

+#define __HAL_RCC_RNG_IS_CLK_ENABLED()         (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN) != 0U)

+

+

+#define __HAL_RCC_GPIOA_IS_CLK_DISABLED()      (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOAEN) == 0U)

+

+#define __HAL_RCC_GPIOB_IS_CLK_DISABLED()      (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOBEN) == 0U)

+

+#define __HAL_RCC_GPIOC_IS_CLK_DISABLED()      (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOCEN) == 0U)

+

+#if defined(GPIOD)

+#define __HAL_RCC_GPIOD_IS_CLK_DISABLED()      (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIODEN) == 0U)

+#endif /* GPIOD */

+

+#if defined(GPIOE)

+#define __HAL_RCC_GPIOE_IS_CLK_DISABLED()      (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOEEN) == 0U)

+#endif /* GPIOE */

+

+#if defined(GPIOF)

+#define __HAL_RCC_GPIOF_IS_CLK_DISABLED()      (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOFEN) == 0U)

+#endif /* GPIOF */

+

+#if defined(GPIOG)

+#define __HAL_RCC_GPIOG_IS_CLK_DISABLED()      (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOGEN) == 0U)

+#endif /* GPIOG */

+

+#define __HAL_RCC_GPIOH_IS_CLK_DISABLED()      (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOHEN) == 0U)

+

+#if defined(GPIOI)

+#define __HAL_RCC_GPIOI_IS_CLK_DISABLED()      (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOIEN) == 0U)

+#endif /* GPIOI */

+

+#if defined(USB_OTG_FS)

+#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_OTGFSEN) == 0U)

+#endif /* USB_OTG_FS */

+

+#define __HAL_RCC_ADC_IS_CLK_DISABLED()        (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_ADCEN) == 0U)

+

+#if defined(DCMI)

+#define __HAL_RCC_DCMI_IS_CLK_DISABLED()       (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_DCMIEN) == 0U)

+#endif /* DCMI */

+

+#if defined(AES)

+#define __HAL_RCC_AES_IS_CLK_DISABLED()        (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_AESEN) == 0U)

+#endif /* AES */

+

+#if defined(HASH)

+#define __HAL_RCC_HASH_IS_CLK_DISABLED()       (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_HASHEN) == 0U)

+#endif /* HASH */

+

+#define __HAL_RCC_RNG_IS_CLK_DISABLED()        (READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN) == 0U)

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_AHB3_Clock_Enable_Disable_Status AHB3 Peripheral Clock Enabled or Disabled Status

+  * @brief  Check whether the AHB3 peripheral clock is enabled or not.

+  * @note   After reset, the peripheral clock (used for registers read/write access)

+  *         is disabled and the application software has to enable this clock before

+  *         using it.

+  * @{

+  */

+

+#if defined(FMC_BANK1)

+#define __HAL_RCC_FMC_IS_CLK_ENABLED()         (READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN) != 0U)

+#endif /* FMC_BANK1 */

+

+#if defined(QUADSPI)

+#define __HAL_RCC_QSPI_IS_CLK_ENABLED()        (READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN) != 0U)

+#endif /* QUADSPI */

+

+#if defined(FMC_BANK1)

+#define __HAL_RCC_FMC_IS_CLK_DISABLED()        (READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN) == 0U)

+#endif /* FMC_BANK1 */

+

+#if defined(QUADSPI)

+#define __HAL_RCC_QSPI_IS_CLK_DISABLED()       (READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_QSPIEN) == 0U)

+#endif /* QUADSPI */

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_APB1_Clock_Enable_Disable_Status APB1 Peripheral Clock Enabled or Disabled Status

+  * @brief  Check whether the APB1 peripheral clock is enabled or not.

+  * @note   After reset, the peripheral clock (used for registers read/write access)

+  *         is disabled and the application software has to enable this clock before

+  *         using it.

+  * @{

+  */

+

+#define __HAL_RCC_TIM2_IS_CLK_ENABLED()        (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM2EN) != 0U)

+

+#if defined(TIM3)

+#define __HAL_RCC_TIM3_IS_CLK_ENABLED()        (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM3EN) != 0U)

+#endif /* TIM3 */

+

+#if defined(TIM4)

+#define __HAL_RCC_TIM4_IS_CLK_ENABLED()        (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM4EN) != 0U)

+#endif /* TIM4 */

+

+#if defined(TIM5)

+#define __HAL_RCC_TIM5_IS_CLK_ENABLED()        (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM5EN) != 0U)

+#endif /* TIM5 */

+

+#define __HAL_RCC_TIM6_IS_CLK_ENABLED()        (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM6EN) != 0U)

+

+#if defined(TIM7)

+#define __HAL_RCC_TIM7_IS_CLK_ENABLED()        (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM7EN) != 0U)

+#endif /* TIM7 */

+

+#if defined(LCD)

+#define __HAL_RCC_LCD_IS_CLK_ENABLED()         (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_LCDEN) != 0U)

+#endif /* LCD */

+

+#if defined(RCC_APB1ENR1_RTCAPBEN)

+#define __HAL_RCC_RTCAPB_IS_CLK_ENABLED()      (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_RTCAPBEN) != 0U)

+#endif /* RCC_APB1ENR1_RTCAPBEN */

+

+#define __HAL_RCC_WWDG_IS_CLK_ENABLED()        (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_WWDGEN) != 0U)

+

+#if defined(SPI2)

+#define __HAL_RCC_SPI2_IS_CLK_ENABLED()        (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_SPI2EN) != 0U)

+#endif /* SPI2 */

+

+#if defined(SPI3)

+#define __HAL_RCC_SPI3_IS_CLK_ENABLED()        (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_SPI3EN) != 0U)

+#endif /* SPI3 */

+

+#define __HAL_RCC_USART2_IS_CLK_ENABLED()      (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_USART2EN) != 0U)

+

+#if defined(USART3)

+#define __HAL_RCC_USART3_IS_CLK_ENABLED()      (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_USART3EN) != 0U)

+#endif /* USART3 */

+

+#if defined(UART4)

+#define __HAL_RCC_UART4_IS_CLK_ENABLED()       (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_UART4EN) != 0U)

+#endif /* UART4 */

+

+#if defined(UART5)

+#define __HAL_RCC_UART5_IS_CLK_ENABLED()       (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_UART5EN) != 0U)

+#endif /* UART5 */

+

+#define __HAL_RCC_I2C1_IS_CLK_ENABLED()        (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_I2C1EN) != 0U)

+

+#if defined(I2C2)

+#define __HAL_RCC_I2C2_IS_CLK_ENABLED()        (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_I2C2EN) != 0U)

+#endif /* I2C2 */

+

+#define __HAL_RCC_I2C3_IS_CLK_ENABLED()        (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_I2C3EN) != 0U)

+

+#if defined(I2C4)

+#define __HAL_RCC_I2C4_IS_CLK_ENABLED()        (READ_BIT(RCC->APB1ENR2, RCC_APB1ENR2_I2C4EN) != 0U)

+#endif /* I2C4 */

+

+#if defined(CRS)

+#define __HAL_RCC_CRS_IS_CLK_ENABLED()         (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_CRSEN) != 0U)

+#endif /* CRS */

+

+#if defined(CAN1)

+#define __HAL_RCC_CAN1_IS_CLK_ENABLED()        (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_CAN1EN) != 0U)

+#endif /* CAN1 */

+

+#if defined(CAN2)

+#define __HAL_RCC_CAN2_IS_CLK_ENABLED()        (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_CAN2EN) != 0U)

+#endif /* CAN2 */

+

+#if defined(USB)

+#define __HAL_RCC_USB_IS_CLK_ENABLED()         (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_USBFSEN) != 0U)

+#endif /* USB */

+

+#define __HAL_RCC_PWR_IS_CLK_ENABLED()         (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_PWREN) != 0U)

+

+#if defined(DAC1)

+#define __HAL_RCC_DAC1_IS_CLK_ENABLED()        (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_DAC1EN) != 0U)

+#endif /* DAC1 */

+

+#define __HAL_RCC_OPAMP_IS_CLK_ENABLED()       (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_OPAMPEN) != 0U)

+

+#define __HAL_RCC_LPTIM1_IS_CLK_ENABLED()      (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_LPTIM1EN) != 0U)

+

+#define __HAL_RCC_LPUART1_IS_CLK_ENABLED()     (READ_BIT(RCC->APB1ENR2, RCC_APB1ENR2_LPUART1EN) != 0U)

+

+#if defined(SWPMI1)

+#define __HAL_RCC_SWPMI1_IS_CLK_ENABLED()      (READ_BIT(RCC->APB1ENR2, RCC_APB1ENR2_SWPMI1EN) != 0U)

+#endif /* SWPMI1 */

+

+#define __HAL_RCC_LPTIM2_IS_CLK_ENABLED()      (READ_BIT(RCC->APB1ENR2, RCC_APB1ENR2_LPTIM2EN) != 0U)

+

+

+#define __HAL_RCC_TIM2_IS_CLK_DISABLED()       (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM2EN) == 0U)

+

+#if defined(TIM3)

+#define __HAL_RCC_TIM3_IS_CLK_DISABLED()       (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM3EN) == 0U)

+#endif /* TIM3 */

+

+#if defined(TIM4)

+#define __HAL_RCC_TIM4_IS_CLK_DISABLED()       (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM4EN) == 0U)

+#endif /* TIM4 */

+

+#if defined(TIM5)

+#define __HAL_RCC_TIM5_IS_CLK_DISABLED()       (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM5EN) == 0U)

+#endif /* TIM5 */

+

+#define __HAL_RCC_TIM6_IS_CLK_DISABLED()       (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM6EN) == 0U)

+

+#if defined(TIM7)

+#define __HAL_RCC_TIM7_IS_CLK_DISABLED()       (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_TIM7EN) == 0U)

+#endif /* TIM7 */

+

+#if defined(LCD)

+#define __HAL_RCC_LCD_IS_CLK_DISABLED()        (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_LCDEN) == 0U)

+#endif /* LCD */

+

+#if defined(RCC_APB1ENR1_RTCAPBEN)

+#define __HAL_RCC_RTCAPB_IS_CLK_DISABLED()     (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_RTCAPBEN) == 0U)

+#endif /* RCC_APB1ENR1_RTCAPBEN */

+

+#define __HAL_RCC_WWDG_IS_CLK_DISABLED()       (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_WWDGEN) == 0U)

+

+#if defined(SPI2)

+#define __HAL_RCC_SPI2_IS_CLK_DISABLED()       (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_SPI2EN) == 0U)

+#endif /* SPI2 */

+

+#if defined(SPI3)

+#define __HAL_RCC_SPI3_IS_CLK_DISABLED()       (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_SPI3EN) == 0U)

+#endif /* SPI3 */

+

+#define __HAL_RCC_USART2_IS_CLK_DISABLED()     (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_USART2EN) == 0U)

+

+#if defined(USART3)

+#define __HAL_RCC_USART3_IS_CLK_DISABLED()     (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_USART3EN) == 0U)

+#endif /* USART3 */

+

+#if defined(UART4)

+#define __HAL_RCC_UART4_IS_CLK_DISABLED()      (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_UART4EN) == 0U)

+#endif /* UART4 */

+

+#if defined(UART5)

+#define __HAL_RCC_UART5_IS_CLK_DISABLED()      (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_UART5EN) == 0U)

+#endif /* UART5 */

+

+#define __HAL_RCC_I2C1_IS_CLK_DISABLED()       (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_I2C1EN) == 0U)

+

+#if defined(I2C2)

+#define __HAL_RCC_I2C2_IS_CLK_DISABLED()       (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_I2C2EN) == 0U)

+#endif /* I2C2 */

+

+#define __HAL_RCC_I2C3_IS_CLK_DISABLED()       (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_I2C3EN) == 0U)

+

+#if defined(I2C4)

+#define __HAL_RCC_I2C4_IS_CLK_DISABLED()       (READ_BIT(RCC->APB1ENR2, RCC_APB1ENR2_I2C4EN) == 0U)

+#endif /* I2C4 */

+

+#if defined(CRS)

+#define __HAL_RCC_CRS_IS_CLK_DISABLED()        (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_CRSEN) == 0U)

+#endif /* CRS */

+

+#if defined(CAN1)

+#define __HAL_RCC_CAN1_IS_CLK_DISABLED()       (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_CAN1EN) == 0U)

+#endif /* CAN1 */

+

+#if defined(CAN2)

+#define __HAL_RCC_CAN2_IS_CLK_DISABLED()       (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_CAN2EN) == 0U)

+#endif /* CAN2 */

+

+#if defined(USB)

+#define __HAL_RCC_USB_IS_CLK_DISABLED()        (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_USBFSEN) == 0U)

+#endif /* USB */

+

+#define __HAL_RCC_PWR_IS_CLK_DISABLED()        (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_PWREN) == 0U)

+

+#if defined(DAC1)

+#define __HAL_RCC_DAC1_IS_CLK_DISABLED()       (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_DAC1EN) == 0U)

+#endif /* DAC1 */

+

+#define __HAL_RCC_OPAMP_IS_CLK_DISABLED()      (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_OPAMPEN) == 0U)

+

+#define __HAL_RCC_LPTIM1_IS_CLK_DISABLED()     (READ_BIT(RCC->APB1ENR1, RCC_APB1ENR1_LPTIM1EN) == 0U)

+

+#define __HAL_RCC_LPUART1_IS_CLK_DISABLED()    (READ_BIT(RCC->APB1ENR2, RCC_APB1ENR2_LPUART1EN) == 0U)

+

+#if defined(SWPMI1)

+#define __HAL_RCC_SWPMI1_IS_CLK_DISABLED()     (READ_BIT(RCC->APB1ENR2, RCC_APB1ENR2_SWPMI1EN) == 0U)

+#endif /* SWPMI1 */

+

+#define __HAL_RCC_LPTIM2_IS_CLK_DISABLED()     (READ_BIT(RCC->APB1ENR2, RCC_APB1ENR2_LPTIM2EN) == 0U)

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_APB2_Clock_Enable_Disable_Status APB2 Peripheral Clock Enabled or Disabled Status

+  * @brief  Check whether the APB2 peripheral clock is enabled or not.

+  * @note   After reset, the peripheral clock (used for registers read/write access)

+  *         is disabled and the application software has to enable this clock before

+  *         using it.

+  * @{

+  */

+

+#define __HAL_RCC_SYSCFG_IS_CLK_ENABLED()      (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN) != 0U)

+

+#define __HAL_RCC_FIREWALL_IS_CLK_ENABLED()    (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_FWEN) != 0U)

+

+#if defined(SDMMC1) && defined(RCC_APB2ENR_SDMMC1EN)

+#define __HAL_RCC_SDMMC1_IS_CLK_ENABLED()      (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDMMC1EN) != 0U)

+#endif /* SDMMC1 && RCC_APB2ENR_SDMMC1EN */

+

+#define __HAL_RCC_TIM1_IS_CLK_ENABLED()        (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN) != 0U)

+

+#define __HAL_RCC_SPI1_IS_CLK_ENABLED()        (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN) != 0U)

+

+#if defined(TIM8)

+#define __HAL_RCC_TIM8_IS_CLK_ENABLED()        (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN) != 0U)

+#endif /* TIM8 */

+

+#define __HAL_RCC_USART1_IS_CLK_ENABLED()      (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN) != 0U)

+

+#define __HAL_RCC_TIM15_IS_CLK_ENABLED()       (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM15EN) != 0U)

+

+#define __HAL_RCC_TIM16_IS_CLK_ENABLED()       (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM16EN) != 0U)

+

+#if defined(TIM17)

+#define __HAL_RCC_TIM17_IS_CLK_ENABLED()       (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM17EN) != 0U)

+#endif /* TIM17 */

+

+#if defined(SAI1)

+#define __HAL_RCC_SAI1_IS_CLK_ENABLED()        (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN) != 0U)

+#endif /* SAI1 */

+

+#if defined(SAI2)

+#define __HAL_RCC_SAI2_IS_CLK_ENABLED()        (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN) != 0U)

+#endif /* SAI2 */

+

+#if defined(DFSDM1_Filter0)

+#define __HAL_RCC_DFSDM1_IS_CLK_ENABLED()      (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN) != 0U)

+#endif /* DFSDM1_Filter0 */

+

+#if defined(LTDC)

+#define __HAL_RCC_LTDC_IS_CLK_ENABLED()        (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN) != 0U)

+#endif /* LTDC */

+

+#if defined(DSI)

+#define __HAL_RCC_DSI_IS_CLK_ENABLED()         (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN) != 0U)

+#endif /* DSI */

+

+

+#define __HAL_RCC_SYSCFG_IS_CLK_DISABLED()     (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN) == 0U)

+

+#if defined(SDMMC1) && defined(RCC_APB2ENR_SDMMC1EN)

+#define __HAL_RCC_SDMMC1_IS_CLK_DISABLED()     (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDMMC1EN) == 0U)

+#endif /* SDMMC1 && RCC_APB2ENR_SDMMC1EN */

+

+#define __HAL_RCC_TIM1_IS_CLK_DISABLED()       (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN) == 0U)

+

+#define __HAL_RCC_SPI1_IS_CLK_DISABLED()       (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN) == 0U)

+

+#if defined(TIM8)

+#define __HAL_RCC_TIM8_IS_CLK_DISABLED()       (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN) == 0U)

+#endif /* TIM8 */

+

+#define __HAL_RCC_USART1_IS_CLK_DISABLED()     (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN) == 0U)

+

+#define __HAL_RCC_TIM15_IS_CLK_DISABLED()      (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM15EN) == 0U)

+

+#define __HAL_RCC_TIM16_IS_CLK_DISABLED()      (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM16EN) == 0U)

+

+#if defined(TIM17)

+#define __HAL_RCC_TIM17_IS_CLK_DISABLED()      (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM17EN) == 0U)

+#endif /* TIM17 */

+

+#if defined(SAI1)

+#define __HAL_RCC_SAI1_IS_CLK_DISABLED()       (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN) == 0U)

+#endif /* SAI1 */

+

+#if defined(SAI2)

+#define __HAL_RCC_SAI2_IS_CLK_DISABLED()       (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI2EN) == 0U)

+#endif /* SAI2 */

+

+#if defined(DFSDM1_Filter0)

+#define __HAL_RCC_DFSDM1_IS_CLK_DISABLED()     (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN) == 0U)

+#endif /* DFSDM1_Filter0 */

+

+#if defined(LTDC)

+#define __HAL_RCC_LTDC_IS_CLK_DISABLED()       (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_LTDCEN) == 0U)

+#endif /* LTDC */

+

+#if defined(DSI)

+#define __HAL_RCC_DSI_IS_CLK_DISABLED()        (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DSIEN) == 0U)

+#endif /* DSI */

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_AHB1_Force_Release_Reset AHB1 Peripheral Force Release Reset

+  * @brief  Force or release AHB1 peripheral reset.

+  * @{

+  */

+#define __HAL_RCC_AHB1_FORCE_RESET()           WRITE_REG(RCC->AHB1RSTR, 0xFFFFFFFFU)

+

+#define __HAL_RCC_DMA1_FORCE_RESET()           SET_BIT(RCC->AHB1RSTR, RCC_AHB1RSTR_DMA1RST)

+

+#define __HAL_RCC_DMA2_FORCE_RESET()           SET_BIT(RCC->AHB1RSTR, RCC_AHB1RSTR_DMA2RST)

+

+#if defined(DMAMUX1)

+#define __HAL_RCC_DMAMUX1_FORCE_RESET()        SET_BIT(RCC->AHB1RSTR, RCC_AHB1RSTR_DMAMUX1RST)

+#endif /* DMAMUX1 */

+

+#define __HAL_RCC_FLASH_FORCE_RESET()          SET_BIT(RCC->AHB1RSTR, RCC_AHB1RSTR_FLASHRST)

+

+#define __HAL_RCC_CRC_FORCE_RESET()            SET_BIT(RCC->AHB1RSTR, RCC_AHB1RSTR_CRCRST)

+

+#define __HAL_RCC_TSC_FORCE_RESET()            SET_BIT(RCC->AHB1RSTR, RCC_AHB1RSTR_TSCRST)

+

+#if defined(DMA2D)

+#define __HAL_RCC_DMA2D_FORCE_RESET()          SET_BIT(RCC->AHB1RSTR, RCC_AHB1RSTR_DMA2DRST)

+#endif /* DMA2D */

+

+#if defined(GFXMMU)

+#define __HAL_RCC_GFXMMU_FORCE_RESET()         SET_BIT(RCC->AHB1RSTR, RCC_AHB1RSTR_GFXMMURST)

+#endif /* GFXMMU */

+

+

+#define __HAL_RCC_AHB1_RELEASE_RESET()         WRITE_REG(RCC->AHB1RSTR, 0x00000000U)

+

+#define __HAL_RCC_DMA1_RELEASE_RESET()         CLEAR_BIT(RCC->AHB1RSTR, RCC_AHB1RSTR_DMA1RST)

+

+#define __HAL_RCC_DMA2_RELEASE_RESET()         CLEAR_BIT(RCC->AHB1RSTR, RCC_AHB1RSTR_DMA2RST)

+

+#if defined(DMAMUX1)

+#define __HAL_RCC_DMAMUX1_RELEASE_RESET()      CLEAR_BIT(RCC->AHB1RSTR, RCC_AHB1RSTR_DMAMUX1RST)

+#endif /* DMAMUX1 */

+

+#define __HAL_RCC_FLASH_RELEASE_RESET()        CLEAR_BIT(RCC->AHB1RSTR, RCC_AHB1RSTR_FLASHRST)

+

+#define __HAL_RCC_CRC_RELEASE_RESET()          CLEAR_BIT(RCC->AHB1RSTR, RCC_AHB1RSTR_CRCRST)

+

+#define __HAL_RCC_TSC_RELEASE_RESET()          CLEAR_BIT(RCC->AHB1RSTR, RCC_AHB1RSTR_TSCRST)

+

+#if defined(DMA2D)

+#define __HAL_RCC_DMA2D_RELEASE_RESET()        CLEAR_BIT(RCC->AHB1RSTR, RCC_AHB1RSTR_DMA2DRST)

+#endif /* DMA2D */

+

+#if defined(GFXMMU)

+#define __HAL_RCC_GFXMMU_RELEASE_RESET()       CLEAR_BIT(RCC->AHB1RSTR, RCC_AHB1RSTR_GFXMMURST)

+#endif /* GFXMMU */

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_AHB2_Force_Release_Reset AHB2 Peripheral Force Release Reset

+  * @brief  Force or release AHB2 peripheral reset.

+  * @{

+  */

+#define __HAL_RCC_AHB2_FORCE_RESET()           WRITE_REG(RCC->AHB2RSTR, 0xFFFFFFFFU)

+

+#define __HAL_RCC_GPIOA_FORCE_RESET()          SET_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_GPIOARST)

+

+#define __HAL_RCC_GPIOB_FORCE_RESET()          SET_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_GPIOBRST)

+

+#define __HAL_RCC_GPIOC_FORCE_RESET()          SET_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_GPIOCRST)

+

+#if defined(GPIOD)

+#define __HAL_RCC_GPIOD_FORCE_RESET()          SET_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_GPIODRST)

+#endif /* GPIOD */

+

+#if defined(GPIOE)

+#define __HAL_RCC_GPIOE_FORCE_RESET()          SET_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_GPIOERST)

+#endif /* GPIOE */

+

+#if defined(GPIOF)

+#define __HAL_RCC_GPIOF_FORCE_RESET()          SET_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_GPIOFRST)

+#endif /* GPIOF */

+

+#if defined(GPIOG)

+#define __HAL_RCC_GPIOG_FORCE_RESET()          SET_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_GPIOGRST)

+#endif /* GPIOG */

+

+#define __HAL_RCC_GPIOH_FORCE_RESET()          SET_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_GPIOHRST)

+

+#if defined(GPIOI)

+#define __HAL_RCC_GPIOI_FORCE_RESET()          SET_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_GPIOIRST)

+#endif /* GPIOI */

+

+#if defined(USB_OTG_FS)

+#define __HAL_RCC_USB_OTG_FS_FORCE_RESET()     SET_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_OTGFSRST)

+#endif /* USB_OTG_FS */

+

+#define __HAL_RCC_ADC_FORCE_RESET()            SET_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_ADCRST)

+

+#if defined(DCMI)

+#define __HAL_RCC_DCMI_FORCE_RESET()           SET_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_DCMIRST)

+#endif /* DCMI */

+

+#if defined(AES)

+#define __HAL_RCC_AES_FORCE_RESET()            SET_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_AESRST)

+#endif /* AES */

+

+#if defined(HASH)

+#define __HAL_RCC_HASH_FORCE_RESET()           SET_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_HASHRST)

+#endif /* HASH */

+

+#define __HAL_RCC_RNG_FORCE_RESET()            SET_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_RNGRST)

+

+#if defined(OCTOSPIM)

+#define __HAL_RCC_OSPIM_FORCE_RESET()          SET_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_OSPIMRST)

+#endif /* OCTOSPIM */

+

+#if defined(SDMMC1) && defined(RCC_AHB2RSTR_SDMMC1RST)

+#define __HAL_RCC_SDMMC1_FORCE_RESET()         SET_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_SDMMC1RST)

+#endif /* SDMMC1 && RCC_AHB2RSTR_SDMMC1RST */

+

+

+#define __HAL_RCC_AHB2_RELEASE_RESET()         WRITE_REG(RCC->AHB2RSTR, 0x00000000U)

+

+#define __HAL_RCC_GPIOA_RELEASE_RESET()        CLEAR_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_GPIOARST)

+

+#define __HAL_RCC_GPIOB_RELEASE_RESET()        CLEAR_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_GPIOBRST)

+

+#define __HAL_RCC_GPIOC_RELEASE_RESET()        CLEAR_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_GPIOCRST)

+

+#if defined(GPIOD)

+#define __HAL_RCC_GPIOD_RELEASE_RESET()        CLEAR_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_GPIODRST)

+#endif /* GPIOD */

+

+#if defined(GPIOE)

+#define __HAL_RCC_GPIOE_RELEASE_RESET()        CLEAR_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_GPIOERST)

+#endif /* GPIOE */

+

+#if defined(GPIOF)

+#define __HAL_RCC_GPIOF_RELEASE_RESET()        CLEAR_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_GPIOFRST)

+#endif /* GPIOF */

+

+#if defined(GPIOG)

+#define __HAL_RCC_GPIOG_RELEASE_RESET()        CLEAR_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_GPIOGRST)

+#endif /* GPIOG */

+

+#define __HAL_RCC_GPIOH_RELEASE_RESET()        CLEAR_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_GPIOHRST)

+

+#if defined(GPIOI)

+#define __HAL_RCC_GPIOI_RELEASE_RESET()        CLEAR_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_GPIOIRST)

+#endif /* GPIOI */

+

+#if defined(USB_OTG_FS)

+#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET()   CLEAR_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_OTGFSRST)

+#endif /* USB_OTG_FS */

+

+#define __HAL_RCC_ADC_RELEASE_RESET()          CLEAR_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_ADCRST)

+

+#if defined(DCMI)

+#define __HAL_RCC_DCMI_RELEASE_RESET()         CLEAR_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_DCMIRST)

+#endif /* DCMI */

+

+#if defined(AES)

+#define __HAL_RCC_AES_RELEASE_RESET()          CLEAR_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_AESRST)

+#endif /* AES */

+

+#if defined(HASH)

+#define __HAL_RCC_HASH_RELEASE_RESET()         CLEAR_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_HASHRST)

+#endif /* HASH */

+

+#define __HAL_RCC_RNG_RELEASE_RESET()          CLEAR_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_RNGRST)

+

+#if defined(OCTOSPIM)

+#define __HAL_RCC_OSPIM_RELEASE_RESET()        CLEAR_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_OSPIMRST)

+#endif /* OCTOSPIM */

+

+#if defined(SDMMC1) && defined(RCC_AHB2RSTR_SDMMC1RST)

+#define __HAL_RCC_SDMMC1_RELEASE_RESET()       CLEAR_BIT(RCC->AHB2RSTR, RCC_AHB2RSTR_SDMMC1RST)

+#endif /* SDMMC1 && RCC_AHB2RSTR_SDMMC1RST */

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_AHB3_Force_Release_Reset AHB3 Peripheral Force Release Reset

+  * @brief  Force or release AHB3 peripheral reset.

+  * @{

+  */

+#define __HAL_RCC_AHB3_FORCE_RESET()           WRITE_REG(RCC->AHB3RSTR, 0xFFFFFFFFU)

+

+#if defined(FMC_BANK1)

+#define __HAL_RCC_FMC_FORCE_RESET()            SET_BIT(RCC->AHB3RSTR, RCC_AHB3RSTR_FMCRST)

+#endif /* FMC_BANK1 */

+

+#if defined(QUADSPI)

+#define __HAL_RCC_QSPI_FORCE_RESET()           SET_BIT(RCC->AHB3RSTR, RCC_AHB3RSTR_QSPIRST)

+#endif /* QUADSPI */

+

+#if defined(OCTOSPI1)

+#define __HAL_RCC_OSPI1_FORCE_RESET()          SET_BIT(RCC->AHB3RSTR, RCC_AHB3RSTR_OSPI1RST)

+#endif /* OCTOSPI1 */

+

+#if defined(OCTOSPI2)

+#define __HAL_RCC_OSPI2_FORCE_RESET()          SET_BIT(RCC->AHB3RSTR, RCC_AHB3RSTR_OSPI2RST)

+#endif /* OCTOSPI2 */

+

+#define __HAL_RCC_AHB3_RELEASE_RESET()         WRITE_REG(RCC->AHB3RSTR, 0x00000000U)

+

+#if defined(FMC_BANK1)

+#define __HAL_RCC_FMC_RELEASE_RESET()          CLEAR_BIT(RCC->AHB3RSTR, RCC_AHB3RSTR_FMCRST)

+#endif /* FMC_BANK1 */

+

+#if defined(QUADSPI)

+#define __HAL_RCC_QSPI_RELEASE_RESET()         CLEAR_BIT(RCC->AHB3RSTR, RCC_AHB3RSTR_QSPIRST)

+#endif /* QUADSPI */

+

+#if defined(OCTOSPI1)

+#define __HAL_RCC_OSPI1_RELEASE_RESET()        CLEAR_BIT(RCC->AHB3RSTR, RCC_AHB3RSTR_OSPI1RST)

+#endif /* OCTOSPI1 */

+

+#if defined(OCTOSPI2)

+#define __HAL_RCC_OSPI2_RELEASE_RESET()        CLEAR_BIT(RCC->AHB3RSTR, RCC_AHB3RSTR_OSPI2RST)

+#endif /* OCTOSPI2 */

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_APB1_Force_Release_Reset APB1 Peripheral Force Release Reset

+  * @brief  Force or release APB1 peripheral reset.

+  * @{

+  */

+#define __HAL_RCC_APB1_FORCE_RESET()           WRITE_REG(RCC->APB1RSTR1, 0xFFFFFFFFU)

+

+#define __HAL_RCC_TIM2_FORCE_RESET()           SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_TIM2RST)

+

+#if defined(TIM3)

+#define __HAL_RCC_TIM3_FORCE_RESET()           SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_TIM3RST)

+#endif /* TIM3 */

+

+#if defined(TIM4)

+#define __HAL_RCC_TIM4_FORCE_RESET()           SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_TIM4RST)

+#endif /* TIM4 */

+

+#if defined(TIM5)

+#define __HAL_RCC_TIM5_FORCE_RESET()           SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_TIM5RST)

+#endif /* TIM5 */

+

+#define __HAL_RCC_TIM6_FORCE_RESET()           SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_TIM6RST)

+

+#if defined(TIM7)

+#define __HAL_RCC_TIM7_FORCE_RESET()           SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_TIM7RST)

+#endif /* TIM7 */

+

+#if defined(LCD)

+#define __HAL_RCC_LCD_FORCE_RESET()            SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_LCDRST)

+#endif /* LCD */

+

+#if defined(SPI2)

+#define __HAL_RCC_SPI2_FORCE_RESET()           SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_SPI2RST)

+#endif /* SPI2 */

+

+#if defined(SPI3)

+#define __HAL_RCC_SPI3_FORCE_RESET()           SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_SPI3RST)

+#endif /* SPI3 */

+

+#define __HAL_RCC_USART2_FORCE_RESET()         SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_USART2RST)

+

+#if defined(USART3)

+#define __HAL_RCC_USART3_FORCE_RESET()         SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_USART3RST)

+#endif /* USART3 */

+

+#if defined(UART4)

+#define __HAL_RCC_UART4_FORCE_RESET()          SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_UART4RST)

+#endif /* UART4 */

+

+#if defined(UART5)

+#define __HAL_RCC_UART5_FORCE_RESET()          SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_UART5RST)

+#endif /* UART5 */

+

+#define __HAL_RCC_I2C1_FORCE_RESET()           SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_I2C1RST)

+

+#if defined(I2C2)

+#define __HAL_RCC_I2C2_FORCE_RESET()           SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_I2C2RST)

+#endif /* I2C2 */

+

+#define __HAL_RCC_I2C3_FORCE_RESET()           SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_I2C3RST)

+

+#if defined(I2C4)

+#define __HAL_RCC_I2C4_FORCE_RESET()           SET_BIT(RCC->APB1RSTR2, RCC_APB1RSTR2_I2C4RST)

+#endif /* I2C4 */

+

+#if defined(CRS)

+#define __HAL_RCC_CRS_FORCE_RESET()            SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_CRSRST)

+#endif /* CRS */

+

+#if defined(CAN1)

+#define __HAL_RCC_CAN1_FORCE_RESET()           SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_CAN1RST)

+#endif /* CAN1 */

+

+#if defined(CAN2)

+#define __HAL_RCC_CAN2_FORCE_RESET()           SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_CAN2RST)

+#endif /* CAN2 */

+

+#if defined(USB)

+#define __HAL_RCC_USB_FORCE_RESET()            SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_USBFSRST)

+#endif /* USB */

+

+#define __HAL_RCC_PWR_FORCE_RESET()            SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_PWRRST)

+

+#if defined(DAC1)

+#define __HAL_RCC_DAC1_FORCE_RESET()           SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_DAC1RST)

+#endif /* DAC1 */

+

+#define __HAL_RCC_OPAMP_FORCE_RESET()          SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_OPAMPRST)

+

+#define __HAL_RCC_LPTIM1_FORCE_RESET()         SET_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_LPTIM1RST)

+

+#define __HAL_RCC_LPUART1_FORCE_RESET()        SET_BIT(RCC->APB1RSTR2, RCC_APB1RSTR2_LPUART1RST)

+

+#if defined(SWPMI1)

+#define __HAL_RCC_SWPMI1_FORCE_RESET()         SET_BIT(RCC->APB1RSTR2, RCC_APB1RSTR2_SWPMI1RST)

+#endif /* SWPMI1 */

+

+#define __HAL_RCC_LPTIM2_FORCE_RESET()         SET_BIT(RCC->APB1RSTR2, RCC_APB1RSTR2_LPTIM2RST)

+

+

+#define __HAL_RCC_APB1_RELEASE_RESET()         WRITE_REG(RCC->APB1RSTR1, 0x00000000U)

+

+#define __HAL_RCC_TIM2_RELEASE_RESET()         CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_TIM2RST)

+

+#if defined(TIM3)

+#define __HAL_RCC_TIM3_RELEASE_RESET()         CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_TIM3RST)

+#endif /* TIM3 */

+

+#if defined(TIM4)

+#define __HAL_RCC_TIM4_RELEASE_RESET()         CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_TIM4RST)

+#endif /* TIM4 */

+

+#if defined(TIM5)

+#define __HAL_RCC_TIM5_RELEASE_RESET()         CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_TIM5RST)

+#endif /* TIM5 */

+

+#define __HAL_RCC_TIM6_RELEASE_RESET()         CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_TIM6RST)

+

+#if defined(TIM7)

+#define __HAL_RCC_TIM7_RELEASE_RESET()         CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_TIM7RST)

+#endif /* TIM7 */

+

+#if defined(LCD)

+#define __HAL_RCC_LCD_RELEASE_RESET()          CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_LCDRST)

+#endif /* LCD */

+

+#if defined(SPI2)

+#define __HAL_RCC_SPI2_RELEASE_RESET()         CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_SPI2RST)

+#endif /* SPI2 */

+

+#if defined(SPI3)

+#define __HAL_RCC_SPI3_RELEASE_RESET()         CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_SPI3RST)

+#endif /* SPI3 */

+

+#define __HAL_RCC_USART2_RELEASE_RESET()       CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_USART2RST)

+

+#if defined(USART3)

+#define __HAL_RCC_USART3_RELEASE_RESET()       CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_USART3RST)

+#endif /* USART3 */

+

+#if defined(UART4)

+#define __HAL_RCC_UART4_RELEASE_RESET()        CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_UART4RST)

+#endif /* UART4 */

+

+#if defined(UART5)

+#define __HAL_RCC_UART5_RELEASE_RESET()        CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_UART5RST)

+#endif /* UART5 */

+

+#define __HAL_RCC_I2C1_RELEASE_RESET()         CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_I2C1RST)

+

+#if defined(I2C2)

+#define __HAL_RCC_I2C2_RELEASE_RESET()         CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_I2C2RST)

+#endif /* I2C2 */

+

+#define __HAL_RCC_I2C3_RELEASE_RESET()         CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_I2C3RST)

+

+#if defined(I2C4)

+#define __HAL_RCC_I2C4_RELEASE_RESET()         CLEAR_BIT(RCC->APB1RSTR2, RCC_APB1RSTR2_I2C4RST)

+#endif /* I2C4 */

+

+#if defined(CRS)

+#define __HAL_RCC_CRS_RELEASE_RESET()          CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_CRSRST)

+#endif /* CRS */

+

+#if defined(CAN1)

+#define __HAL_RCC_CAN1_RELEASE_RESET()         CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_CAN1RST)

+#endif /* CAN1 */

+

+#if defined(CAN2)

+#define __HAL_RCC_CAN2_RELEASE_RESET()         CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_CAN2RST)

+#endif /* CAN2 */

+

+#if defined(USB)

+#define __HAL_RCC_USB_RELEASE_RESET()          CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_USBFSRST)

+#endif /* USB */

+

+#define __HAL_RCC_PWR_RELEASE_RESET()          CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_PWRRST)

+

+#if defined(DAC1)

+#define __HAL_RCC_DAC1_RELEASE_RESET()         CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_DAC1RST)

+#endif /* DAC1 */

+

+#define __HAL_RCC_OPAMP_RELEASE_RESET()        CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_OPAMPRST)

+

+#define __HAL_RCC_LPTIM1_RELEASE_RESET()       CLEAR_BIT(RCC->APB1RSTR1, RCC_APB1RSTR1_LPTIM1RST)

+

+#define __HAL_RCC_LPUART1_RELEASE_RESET()      CLEAR_BIT(RCC->APB1RSTR2, RCC_APB1RSTR2_LPUART1RST)

+

+#if defined(SWPMI1)

+#define __HAL_RCC_SWPMI1_RELEASE_RESET()       CLEAR_BIT(RCC->APB1RSTR2, RCC_APB1RSTR2_SWPMI1RST)

+#endif /* SWPMI1 */

+

+#define __HAL_RCC_LPTIM2_RELEASE_RESET()       CLEAR_BIT(RCC->APB1RSTR2, RCC_APB1RSTR2_LPTIM2RST)

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_APB2_Force_Release_Reset APB2 Peripheral Force Release Reset

+  * @brief  Force or release APB2 peripheral reset.

+  * @{

+  */

+#define __HAL_RCC_APB2_FORCE_RESET()           WRITE_REG(RCC->APB2RSTR, 0xFFFFFFFFU)

+

+#define __HAL_RCC_SYSCFG_FORCE_RESET()         SET_BIT(RCC->APB2RSTR, RCC_APB2RSTR_SYSCFGRST)

+

+#if defined(SDMMC1) && defined(RCC_APB2RSTR_SDMMC1RST)

+#define __HAL_RCC_SDMMC1_FORCE_RESET()         SET_BIT(RCC->APB2RSTR, RCC_APB2RSTR_SDMMC1RST)

+#endif /* SDMMC1 && RCC_APB2RSTR_SDMMC1RST */

+

+#define __HAL_RCC_TIM1_FORCE_RESET()           SET_BIT(RCC->APB2RSTR, RCC_APB2RSTR_TIM1RST)

+

+#define __HAL_RCC_SPI1_FORCE_RESET()           SET_BIT(RCC->APB2RSTR, RCC_APB2RSTR_SPI1RST)

+

+#if defined(TIM8)

+#define __HAL_RCC_TIM8_FORCE_RESET()           SET_BIT(RCC->APB2RSTR, RCC_APB2RSTR_TIM8RST)

+#endif /* TIM8 */

+

+#define __HAL_RCC_USART1_FORCE_RESET()         SET_BIT(RCC->APB2RSTR, RCC_APB2RSTR_USART1RST)

+

+#define __HAL_RCC_TIM15_FORCE_RESET()          SET_BIT(RCC->APB2RSTR, RCC_APB2RSTR_TIM15RST)

+

+#define __HAL_RCC_TIM16_FORCE_RESET()          SET_BIT(RCC->APB2RSTR, RCC_APB2RSTR_TIM16RST)

+

+#if defined(TIM17)

+#define __HAL_RCC_TIM17_FORCE_RESET()          SET_BIT(RCC->APB2RSTR, RCC_APB2RSTR_TIM17RST)

+#endif /* TIM17 */

+

+#if defined(SAI1)

+#define __HAL_RCC_SAI1_FORCE_RESET()           SET_BIT(RCC->APB2RSTR, RCC_APB2RSTR_SAI1RST)

+#endif /* SAI1 */

+

+#if defined(SAI2)

+#define __HAL_RCC_SAI2_FORCE_RESET()           SET_BIT(RCC->APB2RSTR, RCC_APB2RSTR_SAI2RST)

+#endif /* SAI2 */

+

+#if defined(DFSDM1_Filter0)

+#define __HAL_RCC_DFSDM1_FORCE_RESET()         SET_BIT(RCC->APB2RSTR, RCC_APB2RSTR_DFSDM1RST)

+#endif /* DFSDM1_Filter0 */

+

+#if defined(LTDC)

+#define __HAL_RCC_LTDC_FORCE_RESET()           SET_BIT(RCC->APB2RSTR, RCC_APB2RSTR_LTDCRST)

+#endif /* LTDC */

+

+#if defined(DSI)

+#define __HAL_RCC_DSI_FORCE_RESET()            SET_BIT(RCC->APB2RSTR, RCC_APB2RSTR_DSIRST)

+#endif /* DSI */

+

+

+#define __HAL_RCC_APB2_RELEASE_RESET()         WRITE_REG(RCC->APB2RSTR, 0x00000000U)

+

+#define __HAL_RCC_SYSCFG_RELEASE_RESET()       CLEAR_BIT(RCC->APB2RSTR, RCC_APB2RSTR_SYSCFGRST)

+

+#if defined(SDMMC1) && defined(RCC_APB2RSTR_SDMMC1RST)

+#define __HAL_RCC_SDMMC1_RELEASE_RESET()       CLEAR_BIT(RCC->APB2RSTR, RCC_APB2RSTR_SDMMC1RST)

+#endif /* SDMMC1 && RCC_APB2RSTR_SDMMC1RST */

+

+#define __HAL_RCC_TIM1_RELEASE_RESET()         CLEAR_BIT(RCC->APB2RSTR, RCC_APB2RSTR_TIM1RST)

+

+#define __HAL_RCC_SPI1_RELEASE_RESET()         CLEAR_BIT(RCC->APB2RSTR, RCC_APB2RSTR_SPI1RST)

+

+#if defined(TIM8)

+#define __HAL_RCC_TIM8_RELEASE_RESET()         CLEAR_BIT(RCC->APB2RSTR, RCC_APB2RSTR_TIM8RST)

+#endif /* TIM8 */

+

+#define __HAL_RCC_USART1_RELEASE_RESET()       CLEAR_BIT(RCC->APB2RSTR, RCC_APB2RSTR_USART1RST)

+

+#define __HAL_RCC_TIM15_RELEASE_RESET()        CLEAR_BIT(RCC->APB2RSTR, RCC_APB2RSTR_TIM15RST)

+

+#define __HAL_RCC_TIM16_RELEASE_RESET()        CLEAR_BIT(RCC->APB2RSTR, RCC_APB2RSTR_TIM16RST)

+

+#if defined(TIM17)

+#define __HAL_RCC_TIM17_RELEASE_RESET()        CLEAR_BIT(RCC->APB2RSTR, RCC_APB2RSTR_TIM17RST)

+#endif /* TIM17 */

+

+#if defined(SAI1)

+#define __HAL_RCC_SAI1_RELEASE_RESET()         CLEAR_BIT(RCC->APB2RSTR, RCC_APB2RSTR_SAI1RST)

+#endif /* SAI1 */

+

+#if defined(SAI2)

+#define __HAL_RCC_SAI2_RELEASE_RESET()         CLEAR_BIT(RCC->APB2RSTR, RCC_APB2RSTR_SAI2RST)

+#endif /* SAI2 */

+

+#if defined(DFSDM1_Filter0)

+#define __HAL_RCC_DFSDM1_RELEASE_RESET()       CLEAR_BIT(RCC->APB2RSTR, RCC_APB2RSTR_DFSDM1RST)

+#endif /* DFSDM1_Filter0 */

+

+#if defined(LTDC)

+#define __HAL_RCC_LTDC_RELEASE_RESET()         CLEAR_BIT(RCC->APB2RSTR, RCC_APB2RSTR_LTDCRST)

+#endif /* LTDC */

+

+#if defined(DSI)

+#define __HAL_RCC_DSI_RELEASE_RESET()          CLEAR_BIT(RCC->APB2RSTR, RCC_APB2RSTR_DSIRST)

+#endif /* DSI */

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_AHB1_Clock_Sleep_Enable_Disable AHB1 Peripheral Clock Sleep Enable Disable

+  * @brief  Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode.

+  * @note   Peripheral clock gating in SLEEP mode can be used to further reduce

+  *         power consumption.

+  * @note   After wakeup from SLEEP mode, the peripheral clock is enabled again.

+  * @note   By default, all peripheral clocks are enabled during SLEEP mode.

+  * @{

+  */

+

+#define __HAL_RCC_DMA1_CLK_SLEEP_ENABLE()      SET_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_DMA1SMEN)

+

+#define __HAL_RCC_DMA2_CLK_SLEEP_ENABLE()      SET_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_DMA2SMEN)

+

+#if defined(DMAMUX1)

+#define __HAL_RCC_DMAMUX1_CLK_SLEEP_ENABLE()   SET_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_DMAMUX1SMEN)

+#endif /* DMAMUX1 */

+

+#define __HAL_RCC_FLASH_CLK_SLEEP_ENABLE()     SET_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_FLASHSMEN)

+

+#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE()     SET_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_SRAM1SMEN)

+

+#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE()       SET_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_CRCSMEN)

+

+#define __HAL_RCC_TSC_CLK_SLEEP_ENABLE()       SET_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_TSCSMEN)

+

+#if defined(DMA2D)

+#define __HAL_RCC_DMA2D_CLK_SLEEP_ENABLE()     SET_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_DMA2DSMEN)

+#endif /* DMA2D */

+

+#if defined(GFXMMU)

+#define __HAL_RCC_GFXMMU_CLK_SLEEP_ENABLE()    SET_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_GFXMMUSMEN)

+#endif /* GFXMMU */

+

+

+#define __HAL_RCC_DMA1_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_DMA1SMEN)

+

+#define __HAL_RCC_DMA2_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_DMA2SMEN)

+

+#if defined(DMAMUX1)

+#define __HAL_RCC_DMAMUX1_CLK_SLEEP_DISABLE()  CLEAR_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_DMAMUX1SMEN)

+#endif /* DMAMUX1 */

+

+#define __HAL_RCC_FLASH_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_FLASHSMEN)

+

+#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_SRAM1SMEN)

+

+#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE()      CLEAR_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_CRCSMEN)

+

+#define __HAL_RCC_TSC_CLK_SLEEP_DISABLE()      CLEAR_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_TSCSMEN)

+

+#if defined(DMA2D)

+#define __HAL_RCC_DMA2D_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_DMA2DSMEN)

+#endif /* DMA2D */

+

+#if defined(GFXMMU)

+#define __HAL_RCC_GFXMMU_CLK_SLEEP_DISABLE()   CLEAR_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_GFXMMUSMEN)

+#endif /* GFXMMU */

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_AHB2_Clock_Sleep_Enable_Disable AHB2 Peripheral Clock Sleep Enable Disable

+  * @brief  Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode.

+  * @note   Peripheral clock gating in SLEEP mode can be used to further reduce

+  *         power consumption.

+  * @note   After wakeup from SLEEP mode, the peripheral clock is enabled again.

+  * @note   By default, all peripheral clocks are enabled during SLEEP mode.

+  * @{

+  */

+

+#define __HAL_RCC_GPIOA_CLK_SLEEP_ENABLE()     SET_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOASMEN)

+

+#define __HAL_RCC_GPIOB_CLK_SLEEP_ENABLE()     SET_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOBSMEN)

+

+#define __HAL_RCC_GPIOC_CLK_SLEEP_ENABLE()     SET_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOCSMEN)

+

+#if defined(GPIOD)

+#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE()     SET_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIODSMEN)

+#endif /* GPIOD */

+

+#if defined(GPIOE)

+#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE()     SET_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOESMEN)

+#endif /* GPIOE */

+

+#if defined(GPIOF)

+#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE()     SET_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOFSMEN)

+#endif /* GPIOF */

+

+#if defined(GPIOG)

+#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE()     SET_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOGSMEN)

+#endif /* GPIOG */

+

+#define __HAL_RCC_GPIOH_CLK_SLEEP_ENABLE()     SET_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOHSMEN)

+

+#if defined(GPIOI)

+#define __HAL_RCC_GPIOI_CLK_SLEEP_ENABLE()     SET_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOISMEN)

+#endif /* GPIOI */

+

+#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE()     SET_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_SRAM2SMEN)

+

+#if defined(SRAM3)

+#define __HAL_RCC_SRAM3_CLK_SLEEP_ENABLE()     SET_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_SRAM3SMEN)

+#endif /* SRAM3 */

+

+#if defined(USB_OTG_FS)

+#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE()  SET_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_OTGFSSMEN)

+#endif /* USB_OTG_FS */

+

+#define __HAL_RCC_ADC_CLK_SLEEP_ENABLE()       SET_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_ADCSMEN)

+

+#if defined(DCMI)

+#define __HAL_RCC_DCMI_CLK_SLEEP_ENABLE()      SET_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_DCMISMEN)

+#endif /* DCMI */

+

+#if defined(AES)

+#define __HAL_RCC_AES_CLK_SLEEP_ENABLE()       SET_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_AESSMEN)

+#endif /* AES */

+

+#if defined(HASH)

+#define __HAL_RCC_HASH_CLK_SLEEP_ENABLE()      SET_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_HASHSMEN)

+#endif /* HASH */

+

+#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE()       SET_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_RNGSMEN)

+

+#if defined(OCTOSPIM)

+#define __HAL_RCC_OSPIM_CLK_SLEEP_ENABLE()     SET_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_OSPIMSMEN)

+#endif /* OCTOSPIM */

+

+#if defined(SDMMC1) && defined(RCC_AHB2SMENR_SDMMC1SMEN)

+#define __HAL_RCC_SDMMC1_CLK_SLEEP_ENABLE()    SET_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_SDMMC1SMEN)

+#endif /* SDMMC1 && RCC_AHB2SMENR_SDMMC1SMEN */

+

+

+#define __HAL_RCC_GPIOA_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOASMEN)

+

+#define __HAL_RCC_GPIOB_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOBSMEN)

+

+#define __HAL_RCC_GPIOC_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOCSMEN)

+

+#if defined(GPIOD)

+#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIODSMEN)

+#endif /* GPIOD */

+

+#if defined(GPIOE)

+#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOESMEN)

+#endif /* GPIOE */

+

+#if defined(GPIOF)

+#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOFSMEN)

+#endif /* GPIOF */

+

+#if defined(GPIOG)

+#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOGSMEN)

+#endif /* GPIOG */

+

+#define __HAL_RCC_GPIOH_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOHSMEN)

+

+#if defined(GPIOI)

+#define __HAL_RCC_GPIOI_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOISMEN)

+#endif /* GPIOI */

+

+#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_SRAM2SMEN)

+

+#if defined(SRAM3)

+#define __HAL_RCC_SRAM3_IS_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_SRAM3SMEN)

+#endif /* SRAM3 */

+

+#if defined(USB_OTG_FS)

+#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() CLEAR_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_OTGFSSMEN)

+#endif /* USB_OTG_FS */

+

+#define __HAL_RCC_ADC_CLK_SLEEP_DISABLE()      CLEAR_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_ADCSMEN)

+

+#if defined(DCMI)

+#define __HAL_RCC_DCMI_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_DCMISMEN)

+#endif /* DCMI */

+

+#if defined(AES)

+#define __HAL_RCC_AES_CLK_SLEEP_DISABLE()      CLEAR_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_AESSMEN)

+#endif /* AES */

+

+#if defined(HASH)

+#define __HAL_RCC_HASH_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_HASHSMEN)

+#endif /* HASH */

+

+#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE()      CLEAR_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_RNGSMEN)

+

+#if defined(OCTOSPIM)

+#define __HAL_RCC_OSPIM_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_OSPIMSMEN)

+#endif /* OCTOSPIM */

+

+#if defined(SDMMC1) && defined(RCC_AHB2SMENR_SDMMC1SMEN)

+#define __HAL_RCC_SDMMC1_CLK_SLEEP_DISABLE()   CLEAR_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_SDMMC1SMEN)

+#endif /* SDMMC1 && RCC_AHB2SMENR_SDMMC1SMEN */

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_AHB3_Clock_Sleep_Enable_Disable AHB3 Peripheral Clock Sleep Enable Disable

+  * @brief  Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode.

+  * @note   Peripheral clock gating in SLEEP mode can be used to further reduce

+  *         power consumption.

+  * @note   After wakeup from SLEEP mode, the peripheral clock is enabled again.

+  * @note   By default, all peripheral clocks are enabled during SLEEP mode.

+  * @{

+  */

+

+#if defined(QUADSPI)

+#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE()      SET_BIT(RCC->AHB3SMENR, RCC_AHB3SMENR_QSPISMEN)

+#endif /* QUADSPI */

+

+#if defined(OCTOSPI1)

+#define __HAL_RCC_OSPI1_CLK_SLEEP_ENABLE()     SET_BIT(RCC->AHB3SMENR, RCC_AHB3SMENR_OSPI1SMEN)

+#endif /* OCTOSPI1 */

+

+#if defined(OCTOSPI2)

+#define __HAL_RCC_OSPI2_CLK_SLEEP_ENABLE()     SET_BIT(RCC->AHB3SMENR, RCC_AHB3SMENR_OSPI2SMEN)

+#endif /* OCTOSPI2 */

+

+#if defined(FMC_BANK1)

+#define __HAL_RCC_FMC_CLK_SLEEP_ENABLE()       SET_BIT(RCC->AHB3SMENR, RCC_AHB3SMENR_FMCSMEN)

+#endif /* FMC_BANK1 */

+

+#if defined(QUADSPI)

+#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->AHB3SMENR, RCC_AHB3SMENR_QSPISMEN)

+#endif /* QUADSPI */

+

+#if defined(OCTOSPI1)

+#define __HAL_RCC_OSPI1_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->AHB3SMENR, RCC_AHB3SMENR_OSPI1SMEN)

+#endif /* OCTOSPI1 */

+

+#if defined(OCTOSPI2)

+#define __HAL_RCC_OSPI2_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->AHB3SMENR, RCC_AHB3SMENR_OSPI2SMEN)

+#endif /* OCTOSPI2 */

+

+#if defined(FMC_BANK1)

+#define __HAL_RCC_FMC_CLK_SLEEP_DISABLE()      CLEAR_BIT(RCC->AHB3SMENR, RCC_AHB3SMENR_FMCSMEN)

+#endif /* FMC_BANK1 */

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_APB1_Clock_Sleep_Enable_Disable APB1 Peripheral Clock Sleep Enable Disable

+  * @brief  Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode.

+  * @note   Peripheral clock gating in SLEEP mode can be used to further reduce

+  *         power consumption.

+  * @note   After wakeup from SLEEP mode, the peripheral clock is enabled again.

+  * @note   By default, all peripheral clocks are enabled during SLEEP mode.

+  * @{

+  */

+

+#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM2SMEN)

+

+#if defined(TIM3)

+#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM3SMEN)

+#endif /* TIM3 */

+

+#if defined(TIM4)

+#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM4SMEN)

+#endif /* TIM4 */

+

+#if defined(TIM5)

+#define __HAL_RCC_TIM5_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM5SMEN)

+#endif /* TIM5 */

+

+#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM6SMEN)

+

+#if defined(TIM7)

+#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM7SMEN)

+#endif /* TIM7 */

+

+#if defined(LCD)

+#define __HAL_RCC_LCD_CLK_SLEEP_ENABLE()       SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_LCDSMEN)

+#endif /* LCD */

+

+#if defined(RCC_APB1SMENR1_RTCAPBSMEN)

+#define __HAL_RCC_RTCAPB_CLK_SLEEP_ENABLE()    SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_RTCAPBSMEN)

+#endif /* RCC_APB1SMENR1_RTCAPBSMEN */

+

+#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_WWDGSMEN)

+

+#if defined(SPI2)

+#define __HAL_RCC_SPI2_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_SPI2SMEN)

+#endif /* SPI2 */

+

+#if defined(SPI3)

+#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_SPI3SMEN)

+#endif /* SPI3 */

+

+#define __HAL_RCC_USART2_CLK_SLEEP_ENABLE()    SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_USART2SMEN)

+

+#if defined(USART3)

+#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE()    SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_USART3SMEN)

+#endif /* USART3 */

+

+#if defined(UART4)

+#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE()     SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_UART4SMEN)

+#endif /* UART4 */

+

+#if defined(UART5)

+#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE()     SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_UART5SMEN)

+#endif /* UART5 */

+

+#define __HAL_RCC_I2C1_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_I2C1SMEN)

+

+#if defined(I2C2)

+#define __HAL_RCC_I2C2_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_I2C2SMEN)

+#endif /* I2C2 */

+

+#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_I2C3SMEN)

+

+#if defined(I2C4)

+#define __HAL_RCC_I2C4_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB1SMENR2, RCC_APB1SMENR2_I2C4SMEN)

+#endif /* I2C4 */

+

+#if defined(CRS)

+#define __HAL_RCC_CRS_CLK_SLEEP_ENABLE()       SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_CRSSMEN)

+#endif /* CRS */

+

+#if defined(CAN1)

+#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_CAN1SMEN)

+#endif /* CAN1 */

+

+#if defined(CAN2)

+#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_CAN2SMEN)

+#endif /* CAN2 */

+

+#if defined(USB)

+#define __HAL_RCC_USB_CLK_SLEEP_ENABLE()       SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_USBFSSMEN)

+#endif /* USB */

+

+#define __HAL_RCC_PWR_CLK_SLEEP_ENABLE()       SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_PWRSMEN)

+

+#if defined(DAC1)

+#define __HAL_RCC_DAC1_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_DAC1SMEN)

+#endif /* DAC1 */

+

+#define __HAL_RCC_OPAMP_CLK_SLEEP_ENABLE()     SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_OPAMPSMEN)

+

+#define __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE()    SET_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_LPTIM1SMEN)

+

+#define __HAL_RCC_LPUART1_CLK_SLEEP_ENABLE()   SET_BIT(RCC->APB1SMENR2, RCC_APB1SMENR2_LPUART1SMEN)

+

+#if defined(SWPMI1)

+#define __HAL_RCC_SWPMI1_CLK_SLEEP_ENABLE()    SET_BIT(RCC->APB1SMENR2, RCC_APB1SMENR2_SWPMI1SMEN)

+#endif /* SWPMI1 */

+

+#define __HAL_RCC_LPTIM2_CLK_SLEEP_ENABLE()    SET_BIT(RCC->APB1SMENR2, RCC_APB1SMENR2_LPTIM2SMEN)

+

+

+#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM2SMEN)

+

+#if defined(TIM3)

+#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM3SMEN)

+#endif /* TIM3 */

+

+#if defined(TIM4)

+#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM4SMEN)

+#endif /* TIM4 */

+

+#if defined(TIM5)

+#define __HAL_RCC_TIM5_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM5SMEN)

+#endif /* TIM5 */

+

+#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM6SMEN)

+

+#if defined(TIM7)

+#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM7SMEN)

+#endif /* TIM7 */

+

+#if defined(LCD)

+#define __HAL_RCC_LCD_CLK_SLEEP_DISABLE()      CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_LCDSMEN)

+#endif /* LCD */

+

+#if defined(RCC_APB1SMENR1_RTCAPBSMEN)

+#define __HAL_RCC_RTCAPB_CLK_SLEEP_DISABLE()   CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_RTCAPBSMEN)

+#endif /* RCC_APB1SMENR1_RTCAPBSMEN */

+

+#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_WWDGSMEN)

+

+#if defined(SPI2)

+#define __HAL_RCC_SPI2_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_SPI2SMEN)

+#endif /* SPI2 */

+

+#if defined(SPI3)

+#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_SPI3SMEN)

+#endif /* SPI3 */

+

+#define __HAL_RCC_USART2_CLK_SLEEP_DISABLE()   CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_USART2SMEN)

+

+#if defined(USART3)

+#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE()   CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_USART3SMEN)

+#endif /* USART3 */

+

+#if defined(UART4)

+#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_UART4SMEN)

+#endif /* UART4 */

+

+#if defined(UART5)

+#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_UART5SMEN)

+#endif /* UART5 */

+

+#define __HAL_RCC_I2C1_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_I2C1SMEN)

+

+#if defined(I2C2)

+#define __HAL_RCC_I2C2_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_I2C2SMEN)

+#endif /* I2C2 */

+

+#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_I2C3SMEN)

+

+#if defined(I2C4)

+#define __HAL_RCC_I2C4_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB1SMENR2, RCC_APB1SMENR2_I2C4SMEN)

+#endif /* I2C4 */

+

+#if defined(CRS)

+#define __HAL_RCC_CRS_CLK_SLEEP_DISABLE()      CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_CRSSMEN)

+#endif /* CRS */

+

+#if defined(CAN1)

+#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_CAN1SMEN)

+#endif /* CAN1 */

+

+#if defined(CAN2)

+#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_CAN2SMEN)

+#endif /* CAN2 */

+

+#if defined(USB)

+#define __HAL_RCC_USB_CLK_SLEEP_DISABLE()      CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_USBFSSMEN)

+#endif /* USB */

+

+#define __HAL_RCC_PWR_CLK_SLEEP_DISABLE()      CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_PWRSMEN)

+

+#if defined(DAC1)

+#define __HAL_RCC_DAC1_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_DAC1SMEN)

+#endif /* DAC1 */

+

+#define __HAL_RCC_OPAMP_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_OPAMPSMEN)

+

+#define __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE()   CLEAR_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_LPTIM1SMEN)

+

+#define __HAL_RCC_LPUART1_CLK_SLEEP_DISABLE()  CLEAR_BIT(RCC->APB1SMENR2, RCC_APB1SMENR2_LPUART1SMEN)

+

+#if defined(SWPMI1)

+#define __HAL_RCC_SWPMI1_CLK_SLEEP_DISABLE()   CLEAR_BIT(RCC->APB1SMENR2, RCC_APB1SMENR2_SWPMI1SMEN)

+#endif /* SWPMI1 */

+

+#define __HAL_RCC_LPTIM2_CLK_SLEEP_DISABLE()   CLEAR_BIT(RCC->APB1SMENR2, RCC_APB1SMENR2_LPTIM2SMEN)

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_APB2_Clock_Sleep_Enable_Disable APB2 Peripheral Clock Sleep Enable Disable

+  * @brief  Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode.

+  * @note   Peripheral clock gating in SLEEP mode can be used to further reduce

+  *         power consumption.

+  * @note   After wakeup from SLEEP mode, the peripheral clock is enabled again.

+  * @note   By default, all peripheral clocks are enabled during SLEEP mode.

+  * @{

+  */

+

+#define __HAL_RCC_SYSCFG_CLK_SLEEP_ENABLE()    SET_BIT(RCC->APB2SMENR, RCC_APB2SMENR_SYSCFGSMEN)

+

+#if defined(SDMMC1) && defined(RCC_APB2SMENR_SDMMC1SMEN)

+#define __HAL_RCC_SDMMC1_CLK_SLEEP_ENABLE()    SET_BIT(RCC->APB2SMENR, RCC_APB2SMENR_SDMMC1SMEN)

+#endif /* SDMMC1 && RCC_APB2SMENR_SDMMC1SMEN */

+

+#define __HAL_RCC_TIM1_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB2SMENR, RCC_APB2SMENR_TIM1SMEN)

+

+#define __HAL_RCC_SPI1_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB2SMENR, RCC_APB2SMENR_SPI1SMEN)

+

+#if defined(TIM8)

+#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB2SMENR, RCC_APB2SMENR_TIM8SMEN)

+#endif /* TIM8 */

+

+#define __HAL_RCC_USART1_CLK_SLEEP_ENABLE()    SET_BIT(RCC->APB2SMENR, RCC_APB2SMENR_USART1SMEN)

+

+#define __HAL_RCC_TIM15_CLK_SLEEP_ENABLE()     SET_BIT(RCC->APB2SMENR, RCC_APB2SMENR_TIM15SMEN)

+

+#define __HAL_RCC_TIM16_CLK_SLEEP_ENABLE()     SET_BIT(RCC->APB2SMENR, RCC_APB2SMENR_TIM16SMEN)

+

+#if defined(TIM17)

+#define __HAL_RCC_TIM17_CLK_SLEEP_ENABLE()     SET_BIT(RCC->APB2SMENR, RCC_APB2SMENR_TIM17SMEN)

+#endif /* TIM17 */

+

+#if defined(SAI1)

+#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB2SMENR, RCC_APB2SMENR_SAI1SMEN)

+#endif /* SAI1 */

+

+#if defined(SAI2)

+#define __HAL_RCC_SAI2_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB2SMENR, RCC_APB2SMENR_SAI2SMEN)

+#endif /* SAI2 */

+

+#if defined(DFSDM1_Filter0)

+#define __HAL_RCC_DFSDM1_CLK_SLEEP_ENABLE()    SET_BIT(RCC->APB2SMENR, RCC_APB2SMENR_DFSDM1SMEN)

+#endif /* DFSDM1_Filter0 */

+

+#if defined(LTDC)

+#define __HAL_RCC_LTDC_CLK_SLEEP_ENABLE()      SET_BIT(RCC->APB2SMENR, RCC_APB2SMENR_LTDCSMEN)

+#endif /* LTDC */

+

+#if defined(DSI)

+#define __HAL_RCC_DSI_CLK_SLEEP_ENABLE()       SET_BIT(RCC->APB2SMENR, RCC_APB2SMENR_DSISMEN)

+#endif /* DSI */

+

+

+#define __HAL_RCC_SYSCFG_CLK_SLEEP_DISABLE()   CLEAR_BIT(RCC->APB2SMENR, RCC_APB2SMENR_SYSCFGSMEN)

+

+#if defined(SDMMC1) && defined(RCC_APB2SMENR_SDMMC1SMEN)

+#define __HAL_RCC_SDMMC1_CLK_SLEEP_DISABLE()   CLEAR_BIT(RCC->APB2SMENR, RCC_APB2SMENR_SDMMC1SMEN)

+#endif /* SDMMC1 && RCC_APB2SMENR_SDMMC1SMEN */

+

+#define __HAL_RCC_TIM1_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB2SMENR, RCC_APB2SMENR_TIM1SMEN)

+

+#define __HAL_RCC_SPI1_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB2SMENR, RCC_APB2SMENR_SPI1SMEN)

+

+#if defined(TIM8)

+#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB2SMENR, RCC_APB2SMENR_TIM8SMEN)

+#endif /* TIM8 */

+

+#define __HAL_RCC_USART1_CLK_SLEEP_DISABLE()   CLEAR_BIT(RCC->APB2SMENR, RCC_APB2SMENR_USART1SMEN)

+

+#define __HAL_RCC_TIM15_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->APB2SMENR, RCC_APB2SMENR_TIM15SMEN)

+

+#define __HAL_RCC_TIM16_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->APB2SMENR, RCC_APB2SMENR_TIM16SMEN)

+

+#if defined(TIM17)

+#define __HAL_RCC_TIM17_CLK_SLEEP_DISABLE()    CLEAR_BIT(RCC->APB2SMENR, RCC_APB2SMENR_TIM17SMEN)

+#endif /* TIM17 */

+

+#if defined(SAI1)

+#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB2SMENR, RCC_APB2SMENR_SAI1SMEN)

+#endif /* SAI1 */

+

+#if defined(SAI2)

+#define __HAL_RCC_SAI2_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB2SMENR, RCC_APB2SMENR_SAI2SMEN)

+#endif /* SAI2 */

+

+#if defined(DFSDM1_Filter0)

+#define __HAL_RCC_DFSDM1_CLK_SLEEP_DISABLE()   CLEAR_BIT(RCC->APB2SMENR, RCC_APB2SMENR_DFSDM1SMEN)

+#endif /* DFSDM1_Filter0 */

+

+#if defined(LTDC)

+#define __HAL_RCC_LTDC_CLK_SLEEP_DISABLE()     CLEAR_BIT(RCC->APB2SMENR, RCC_APB2SMENR_LTDCSMEN)

+#endif /* LTDC */

+

+#if defined(DSI)

+#define __HAL_RCC_DSI_CLK_SLEEP_DISABLE()      CLEAR_BIT(RCC->APB2SMENR, RCC_APB2SMENR_DSISMEN)

+#endif /* DSI */

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_AHB1_Clock_Sleep_Enable_Disable_Status AHB1 Peripheral Clock Sleep Enabled or Disabled Status

+  * @brief  Check whether the AHB1 peripheral clock during Low Power (Sleep) mode is enabled or not.

+  * @note   Peripheral clock gating in SLEEP mode can be used to further reduce

+  *         power consumption.

+  * @note   After wakeup from SLEEP mode, the peripheral clock is enabled again.

+  * @note   By default, all peripheral clocks are enabled during SLEEP mode.

+  * @{

+  */

+

+#define __HAL_RCC_DMA1_IS_CLK_SLEEP_ENABLED()    (READ_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_DMA1SMEN) != 0U)

+

+#define __HAL_RCC_DMA2_IS_CLK_SLEEP_ENABLED()    (READ_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_DMA2SMEN) != 0U)

+

+#if defined(DMAMUX1)

+#define __HAL_RCC_DMAMUX1_IS_CLK_SLEEP_ENABLED() (READ_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_DMAMUX1SMEN) != 0U)

+#endif /* DMAMUX1 */

+

+#define __HAL_RCC_FLASH_IS_CLK_SLEEP_ENABLED()   (READ_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_FLASHSMEN) != 0U)

+

+#define __HAL_RCC_SRAM1_IS_CLK_SLEEP_ENABLED()   (READ_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_SRAM1SMEN) != 0U)

+

+#define __HAL_RCC_CRC_IS_CLK_SLEEP_ENABLED()     (READ_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_CRCSMEN) != 0U)

+

+#define __HAL_RCC_TSC_IS_CLK_SLEEP_ENABLED()     (READ_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_TSCSMEN) != 0U)

+

+#if defined(DMA2D)

+#define __HAL_RCC_DMA2D_IS_CLK_SLEEP_ENABLED()   (READ_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_DMA2DSMEN) != 0U)

+#endif /* DMA2D */

+

+#if defined(GFXMMU)

+#define __HAL_RCC_GFXMMU_IS_CLK_SLEEP_ENABLED()  (READ_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_GFXMMUSMEN) != 0U)

+#endif /* GFXMMU */

+

+

+#define __HAL_RCC_DMA1_IS_CLK_SLEEP_DISABLED()   (READ_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_DMA1SMEN) == 0U)

+

+#define __HAL_RCC_DMA2_IS_CLK_SLEEP_DISABLED()   (READ_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_DMA2SMEN) == 0U)

+

+#if defined(DMAMUX1)

+#define __HAL_RCC_DMAMUX1_IS_CLK_SLEEP_DISABLED() (READ_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_DMAMUX1SMEN) == 0U)

+#endif /* DMAMUX1 */

+

+#define __HAL_RCC_FLASH_IS_CLK_SLEEP_DISABLED()  (READ_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_FLASHSMEN) == 0U)

+

+#define __HAL_RCC_SRAM1_IS_CLK_SLEEP_DISABLED()  (READ_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_SRAM1SMEN) == 0U)

+

+#define __HAL_RCC_CRC_IS_CLK_SLEEP_DISABLED()    (READ_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_CRCSMEN) == 0U)

+

+#define __HAL_RCC_TSC_IS_CLK_SLEEP_DISABLED()    (READ_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_TSCSMEN) == 0U)

+

+#if defined(DMA2D)

+#define __HAL_RCC_DMA2D_IS_CLK_SLEEP_DISABLED()  (READ_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_DMA2DSMEN) == 0U)

+#endif /* DMA2D */

+

+#if defined(GFXMMU)

+#define __HAL_RCC_GFXMMU_IS_CLK_SLEEP_DISABLED() (READ_BIT(RCC->AHB1SMENR, RCC_AHB1SMENR_GFXMMUSMEN) == 0U)

+#endif /* GFXMMU */

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_AHB2_Clock_Sleep_Enable_Disable_Status AHB2 Peripheral Clock Sleep Enabled or Disabled Status

+  * @brief  Check whether the AHB2 peripheral clock during Low Power (Sleep) mode is enabled or not.

+  * @note   Peripheral clock gating in SLEEP mode can be used to further reduce

+  *         power consumption.

+  * @note   After wakeup from SLEEP mode, the peripheral clock is enabled again.

+  * @note   By default, all peripheral clocks are enabled during SLEEP mode.

+  * @{

+  */

+

+#define __HAL_RCC_GPIOA_IS_CLK_SLEEP_ENABLED()   (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOASMEN) != 0U)

+

+#define __HAL_RCC_GPIOB_IS_CLK_SLEEP_ENABLED()   (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOBSMEN) != 0U)

+

+#define __HAL_RCC_GPIOC_IS_CLK_SLEEP_ENABLED()   (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOCSMEN) != 0U)

+

+#if defined(GPIOD)

+#define __HAL_RCC_GPIOD_IS_CLK_SLEEP_ENABLED()   (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIODSMEN) != 0U)

+#endif /* GPIOD */

+

+#if defined(GPIOE)

+#define __HAL_RCC_GPIOE_IS_CLK_SLEEP_ENABLED()   (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOESMEN) != 0U)

+#endif /* GPIOE */

+

+#if defined(GPIOF)

+#define __HAL_RCC_GPIOF_IS_CLK_SLEEP_ENABLED()   (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOFSMEN) != 0U)

+#endif /* GPIOF */

+

+#if defined(GPIOG)

+#define __HAL_RCC_GPIOG_IS_CLK_SLEEP_ENABLED()   (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOGSMEN) != 0U)

+#endif /* GPIOG */

+

+#define __HAL_RCC_GPIOH_IS_CLK_SLEEP_ENABLED()   (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOHSMEN) != 0U)

+

+#if defined(GPIOI)

+#define __HAL_RCC_GPIOI_IS_CLK_SLEEP_ENABLED()   (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOISMEN) != 0U)

+#endif /* GPIOI */

+

+#define __HAL_RCC_SRAM2_IS_CLK_SLEEP_ENABLED()   (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_SRAM2SMEN) != 0U)

+

+#if defined(SRAM3)

+#define __HAL_RCC_SRAM3_IS_CLK_SLEEP_ENABLED()   (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_SRAM3SMEN) != 0U)

+#endif /* SRAM3 */

+

+#if defined(USB_OTG_FS)

+#define __HAL_RCC_USB_OTG_FS_IS_CLK_SLEEP_ENABLED()  (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_OTGFSSMEN) != 0U)

+#endif /* USB_OTG_FS */

+

+#define __HAL_RCC_ADC_IS_CLK_SLEEP_ENABLED()     (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_ADCSMEN) != 0U)

+

+#if defined(DCMI)

+#define __HAL_RCC_DCMI_IS_CLK_SLEEP_ENABLED()    (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_DCMISMEN) != 0U)

+#endif /* DCMI */

+

+#if defined(AES)

+#define __HAL_RCC_AES_IS_CLK_SLEEP_ENABLED()     (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_AESSMEN) != 0U)

+#endif /* AES */

+

+#if defined(HASH)

+#define __HAL_RCC_HASH_IS_CLK_SLEEP_ENABLED()    (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_HASHSMEN) != 0U)

+#endif /* HASH */

+

+#define __HAL_RCC_RNG_IS_CLK_SLEEP_ENABLED()     (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_RNGSMEN) != 0U)

+

+#if defined(OCTOSPIM)

+#define __HAL_RCC_OSPIM_IS_CLK_SLEEP_ENABLED()   (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_OSPIMSMEN) != 0U)

+#endif /* OCTOSPIM */

+

+#if defined(SDMMC1) && defined(RCC_AHB2SMENR_SDMMC1SMEN)

+#define __HAL_RCC_SDMMC1_IS_CLK_SLEEP_ENABLED()  (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_SDMMC1SMEN) != 0U)

+#endif /* SDMMC1 && RCC_AHB2SMENR_SDMMC1SMEN */

+

+

+#define __HAL_RCC_GPIOA_IS_CLK_SLEEP_DISABLED()  (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOASMEN) == 0U)

+

+#define __HAL_RCC_GPIOB_IS_CLK_SLEEP_DISABLED()  (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOBSMEN) == 0U)

+

+#define __HAL_RCC_GPIOC_IS_CLK_SLEEP_DISABLED()  (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOCSMEN) == 0U)

+

+#if defined(GPIOD)

+#define __HAL_RCC_GPIOD_IS_CLK_SLEEP_DISABLED()  (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIODSMEN) == 0U)

+#endif /* GPIOD */

+

+#if defined(GPIOE)

+#define __HAL_RCC_GPIOE_IS_CLK_SLEEP_DISABLED()  (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOESMEN) == 0U)

+#endif /* GPIOE */

+

+#if defined(GPIOF)

+#define __HAL_RCC_GPIOF_IS_CLK_SLEEP_DISABLED()  (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOFSMEN) == 0U)

+#endif /* GPIOF */

+

+#if defined(GPIOG)

+#define __HAL_RCC_GPIOG_IS_CLK_SLEEP_DISABLED()  (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOGSMEN) == 0U)

+#endif /* GPIOG */

+

+#define __HAL_RCC_GPIOH_IS_CLK_SLEEP_DISABLED()  (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOHSMEN) == 0U)

+

+#if defined(GPIOI)

+#define __HAL_RCC_GPIOI_IS_CLK_SLEEP_DISABLED()  (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_GPIOISMEN) == 0U)

+#endif /* GPIOI */

+

+#define __HAL_RCC_SRAM2_IS_CLK_SLEEP_DISABLED()  (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_SRAM2SMEN) == 0U)

+

+#if defined(SRAM3)

+#define __HAL_RCC_SRAM3_IS_CLK_SLEEP_DISABLED()  (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_SRAM3SMEN) == 0U)

+#endif /* SRAM3 */

+

+#if defined(USB_OTG_FS)

+#define __HAL_RCC_USB_OTG_FS_IS_CLK_SLEEP_DISABLED() (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_OTGFSSMEN) == 0U)

+#endif /* USB_OTG_FS */

+

+#define __HAL_RCC_ADC_IS_CLK_SLEEP_DISABLED()    (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_ADCSMEN) == 0U)

+

+#if defined(DCMI)

+#define __HAL_RCC_DCMI_IS_CLK_SLEEP_DISABLED()   (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_DCMISMEN) == 0U)

+#endif /* DCMI */

+

+#if defined(AES)

+#define __HAL_RCC_AES_IS_CLK_SLEEP_DISABLED()    (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_AESSMEN) == 0U)

+#endif /* AES */

+

+#if defined(HASH)

+#define __HAL_RCC_HASH_IS_CLK_SLEEP_DISABLED()   (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_HASHSMEN) == 0U)

+#endif /* HASH */

+

+#define __HAL_RCC_RNG_IS_CLK_SLEEP_DISABLED()    (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_RNGSMEN) == 0U)

+

+#if defined(OCTOSPIM)

+#define __HAL_RCC_OSPIM_IS_CLK_SLEEP_DISABLED()  (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_OSPIMSMEN) == 0U)

+#endif /* OCTOSPIM */

+

+#if defined(SDMMC1) && defined(RCC_AHB2SMENR_SDMMC1SMEN)

+#define __HAL_RCC_SDMMC1_IS_CLK_SLEEP_DISABLED() (READ_BIT(RCC->AHB2SMENR, RCC_AHB2SMENR_SDMMC1SMEN) == 0U)

+#endif /* SDMMC1 && RCC_AHB2SMENR_SDMMC1SMEN */

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_AHB3_Clock_Sleep_Enable_Disable_Status AHB3 Peripheral Clock Sleep Enabled or Disabled Status

+  * @brief  Check whether the AHB3 peripheral clock during Low Power (Sleep) mode is enabled or not.

+  * @note   Peripheral clock gating in SLEEP mode can be used to further reduce

+  *         power consumption.

+  * @note   After wakeup from SLEEP mode, the peripheral clock is enabled again.

+  * @note   By default, all peripheral clocks are enabled during SLEEP mode.

+  * @{

+  */

+

+#if defined(QUADSPI)

+#define __HAL_RCC_QSPI_IS_CLK_SLEEP_ENABLED()    (READ_BIT(RCC->AHB3SMENR, RCC_AHB3SMENR_QSPISMEN) != 0U)

+#endif /* QUADSPI */

+

+#if defined(OCTOSPI1)

+#define __HAL_RCC_OSPI1_IS_CLK_SLEEP_ENABLED()   (READ_BIT(RCC->AHB3SMENR, RCC_AHB3SMENR_OSPI1SMEN) != 0U)

+#endif /* OCTOSPI1 */

+

+#if defined(OCTOSPI2)

+#define __HAL_RCC_OSPI2_IS_CLK_SLEEP_ENABLED()   (READ_BIT(RCC->AHB3SMENR, RCC_AHB3SMENR_OSPI2SMEN) != 0U)

+#endif /* OCTOSPI2 */

+

+#if defined(FMC_BANK1)

+#define __HAL_RCC_FMC_IS_CLK_SLEEP_ENABLED()     (READ_BIT(RCC->AHB3SMENR, RCC_AHB3SMENR_FMCSMEN) != 0U)

+#endif /* FMC_BANK1 */

+

+

+#if defined(QUADSPI)

+#define __HAL_RCC_QSPI_IS_CLK_SLEEP_DISABLED()   (READ_BIT(RCC->AHB3SMENR, RCC_AHB3SMENR_QSPISMEN) == 0U)

+#endif /* QUADSPI */

+

+#if defined(OCTOSPI1)

+#define __HAL_RCC_OSPI1_IS_CLK_SLEEP_DISABLED()  (READ_BIT(RCC->AHB3SMENR, RCC_AHB3SMENR_OSPI1SMEN) == 0U)

+#endif /* OCTOSPI1 */

+

+#if defined(OCTOSPI2)

+#define __HAL_RCC_OSPI2_IS_CLK_SLEEP_DISABLED()  (READ_BIT(RCC->AHB3SMENR, RCC_AHB3SMENR_OSPI2SMEN) == 0U)

+#endif /* OCTOSPI2 */

+

+#if defined(FMC_BANK1)

+#define __HAL_RCC_FMC_IS_CLK_SLEEP_DISABLED()    (READ_BIT(RCC->AHB3SMENR, RCC_AHB3SMENR_FMCSMEN) == 0U)

+#endif /* FMC_BANK1 */

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_APB1_Clock_Sleep_Enable_Disable_Status APB1 Peripheral Clock Sleep Enabled or Disabled Status

+  * @brief  Check whether the APB1 peripheral clock during Low Power (Sleep) mode is enabled or not.

+  * @note   Peripheral clock gating in SLEEP mode can be used to further reduce

+  *         power consumption.

+  * @note   After wakeup from SLEEP mode, the peripheral clock is enabled again.

+  * @note   By default, all peripheral clocks are enabled during SLEEP mode.

+  * @{

+  */

+

+#define __HAL_RCC_TIM2_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM2SMEN) != 0U)

+

+#if defined(TIM3)

+#define __HAL_RCC_TIM3_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM3SMEN) != 0U)

+#endif /* TIM3 */

+

+#if defined(TIM4)

+#define __HAL_RCC_TIM4_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM4SMEN) != 0U)

+#endif /* TIM4 */

+

+#if defined(TIM5)

+#define __HAL_RCC_TIM5_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM5SMEN) != 0U)

+#endif /* TIM5 */

+

+#define __HAL_RCC_TIM6_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM6SMEN) != 0U)

+

+#if defined(TIM7)

+#define __HAL_RCC_TIM7_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM7SMEN) != 0U)

+#endif /* TIM7 */

+

+#if defined(LCD)

+#define __HAL_RCC_LCD_IS_CLK_SLEEP_ENABLED()       (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_LCDSMEN) != 0U)

+#endif /* LCD */

+

+#if defined(RCC_APB1SMENR1_RTCAPBSMEN)

+#define __HAL_RCC_RTCAPB_IS_CLK_SLEEP_ENABLED()    (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_RTCAPBSMEN) != 0U)

+#endif /* RCC_APB1SMENR1_RTCAPBSMEN */

+

+#define __HAL_RCC_WWDG_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_WWDGSMEN) != 0U)

+

+#if defined(SPI2)

+#define __HAL_RCC_SPI2_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_SPI2SMEN) != 0U)

+#endif /* SPI2 */

+

+#if defined(SPI3)

+#define __HAL_RCC_SPI3_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_SPI3SMEN) != 0U)

+#endif /* SPI3 */

+

+#define __HAL_RCC_USART2_IS_CLK_SLEEP_ENABLED()    (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_USART2SMEN) != 0U)

+

+#if defined(USART3)

+#define __HAL_RCC_USART3_IS_CLK_SLEEP_ENABLED()    (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_USART3SMEN) != 0U)

+#endif /* USART3 */

+

+#if defined(UART4)

+#define __HAL_RCC_UART4_IS_CLK_SLEEP_ENABLED()     (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_UART4SMEN) != 0U)

+#endif /* UART4 */

+

+#if defined(UART5)

+#define __HAL_RCC_UART5_IS_CLK_SLEEP_ENABLED()     (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_UART5SMEN) != 0U)

+#endif /* UART5 */

+

+#define __HAL_RCC_I2C1_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_I2C1SMEN) != 0U)

+

+#if defined(I2C2)

+#define __HAL_RCC_I2C2_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_I2C2SMEN) != 0U)

+#endif /* I2C2 */

+

+#define __HAL_RCC_I2C3_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_I2C3SMEN) != 0U)

+

+#if defined(I2C4)

+#define __HAL_RCC_I2C4_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB1SMENR2, RCC_APB1SMENR2_I2C4SMEN) != 0U)

+#endif /* I2C4 */

+

+#if defined(CRS)

+#define __HAL_RCC_CRS_IS_CLK_SLEEP_ENABLED()       (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_CRSSMEN) != 0U)

+#endif /* CRS */

+

+#if defined(CAN1)

+#define __HAL_RCC_CAN1_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_CAN1SMEN) != 0U)

+#endif /* CAN1 */

+

+#if defined(CAN2)

+#define __HAL_RCC_CAN2_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_CAN2SMEN) != 0U)

+#endif /* CAN2 */

+

+#if defined(USB)

+#define __HAL_RCC_USB_IS_CLK_SLEEP_ENABLED()       (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_USBFSSMEN) != 0U)

+#endif /* USB */

+

+#define __HAL_RCC_PWR_IS_CLK_SLEEP_ENABLED()       (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_PWRSMEN) != 0U)

+

+#if defined(DAC1)

+#define __HAL_RCC_DAC1_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_DAC1SMEN) != 0U)

+#endif /* DAC1 */

+

+#define __HAL_RCC_OPAMP_IS_CLK_SLEEP_ENABLED()     (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_OPAMPSMEN) != 0U)

+

+#define __HAL_RCC_LPTIM1_IS_CLK_SLEEP_ENABLED()    (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_LPTIM1SMEN) != 0U)

+

+#define __HAL_RCC_LPUART1_IS_CLK_SLEEP_ENABLED()   (READ_BIT(RCC->APB1SMENR2, RCC_APB1SMENR2_LPUART1SMEN) != 0U)

+

+#if defined(SWPMI1)

+#define __HAL_RCC_SWPMI1_IS_CLK_SLEEP_ENABLED()    (READ_BIT(RCC->APB1SMENR2, RCC_APB1SMENR2_SWPMI1SMEN) != 0U)

+#endif /* SWPMI1 */

+

+#define __HAL_RCC_LPTIM2_IS_CLK_SLEEP_ENABLED()    (READ_BIT(RCC->APB1SMENR2, RCC_APB1SMENR2_LPTIM2SMEN) != 0U)

+

+

+#define __HAL_RCC_TIM2_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM2SMEN) == 0U)

+

+#if defined(TIM3)

+#define __HAL_RCC_TIM3_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM3SMEN) == 0U)

+#endif /* TIM3 */

+

+#if defined(TIM4)

+#define __HAL_RCC_TIM4_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM4SMEN) == 0U)

+#endif /* TIM4 */

+

+#if defined(TIM5)

+#define __HAL_RCC_TIM5_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM5SMEN) == 0U)

+#endif /* TIM5 */

+

+#define __HAL_RCC_TIM6_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM6SMEN) == 0U)

+

+#if defined(TIM7)

+#define __HAL_RCC_TIM7_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_TIM7SMEN) == 0U)

+#endif /* TIM7 */

+

+#if defined(LCD)

+#define __HAL_RCC_LCD_IS_CLK_SLEEP_DISABLED()      (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_LCDSMEN) == 0U)

+#endif /* LCD */

+

+#if defined(RCC_APB1SMENR1_RTCAPBSMEN)

+#define __HAL_RCC_RTCAPB_IS_CLK_SLEEP_DISABLED()   (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_RTCAPBSMEN) == 0U)

+#endif /* RCC_APB1SMENR1_RTCAPBSMEN */

+

+#define __HAL_RCC_WWDG_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_WWDGSMEN) == 0U)

+

+#if defined(SPI2)

+#define __HAL_RCC_SPI2_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_SPI2SMEN) == 0U)

+#endif /* SPI2 */

+

+#if defined(SPI3)

+#define __HAL_RCC_SPI3_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_SPI3SMEN) == 0U)

+#endif /* SPI3 */

+

+#define __HAL_RCC_USART2_IS_CLK_SLEEP_DISABLED()   (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_USART2SMEN) == 0U)

+

+#if defined(USART3)

+#define __HAL_RCC_USART3_IS_CLK_SLEEP_DISABLED()   (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_USART3SMEN) == 0U)

+#endif /* USART3 */

+

+#if defined(UART4)

+#define __HAL_RCC_UART4_IS_CLK_SLEEP_DISABLED()    (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_UART4SMEN) == 0U)

+#endif /* UART4 */

+

+#if defined(UART5)

+#define __HAL_RCC_UART5_IS_CLK_SLEEP_DISABLED()    (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_UART5SMEN) == 0U)

+#endif /* UART5 */

+

+#define __HAL_RCC_I2C1_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_I2C1SMEN) == 0U)

+

+#if defined(I2C2)

+#define __HAL_RCC_I2C2_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_I2C2SMEN) == 0U)

+#endif /* I2C2 */

+

+#define __HAL_RCC_I2C3_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_I2C3SMEN) == 0U)

+

+#if defined(I2C4)

+#define __HAL_RCC_I2C4_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB1SMENR2, RCC_APB1SMENR2_I2C4SMEN) == 0U)

+#endif /* I2C4 */

+

+#if defined(CRS)

+#define __HAL_RCC_CRS_IS_CLK_SLEEP_DISABLED()      (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_CRSSMEN) == 0U)

+#endif /* CRS */

+

+#if defined(CAN1)

+#define __HAL_RCC_CAN1_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_CAN1SMEN) == 0U)

+#endif /* CAN1 */

+

+#if defined(CAN2)

+#define __HAL_RCC_CAN2_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_CAN2SMEN) == 0U)

+#endif /* CAN2 */

+

+#if defined(USB)

+#define __HAL_RCC_USB_IS_CLK_SLEEP_DISABLED()      (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_USBFSSMEN) == 0U)

+#endif /* USB */

+

+#define __HAL_RCC_PWR_IS_CLK_SLEEP_DISABLED()      (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_PWRSMEN) == 0U)

+

+#if defined(DAC1)

+#define __HAL_RCC_DAC1_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_DAC1SMEN) == 0U)

+#endif /* DAC1 */

+

+#define __HAL_RCC_OPAMP_IS_CLK_SLEEP_DISABLED()    (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_OPAMPSMEN) == 0U)

+

+#define __HAL_RCC_LPTIM1_IS_CLK_SLEEP_DISABLED()   (READ_BIT(RCC->APB1SMENR1, RCC_APB1SMENR1_LPTIM1SMEN) == 0U)

+

+#define __HAL_RCC_LPUART1_IS_CLK_SLEEP_DISABLED()  (READ_BIT(RCC->APB1SMENR2, RCC_APB1SMENR2_LPUART1SMEN) == 0U)

+

+#if defined(SWPMI1)

+#define __HAL_RCC_SWPMI1_IS_CLK_SLEEP_DISABLED()   (READ_BIT(RCC->APB1SMENR2, RCC_APB1SMENR2_SWPMI1SMEN) == 0U)

+#endif /* SWPMI1 */

+

+#define __HAL_RCC_LPTIM2_IS_CLK_SLEEP_DISABLED()   (READ_BIT(RCC->APB1SMENR2, RCC_APB1SMENR2_LPTIM2SMEN) == 0U)

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_APB2_Clock_Sleep_Enable_Disable_Status APB2 Peripheral Clock Sleep Enabled or Disabled Status

+  * @brief  Check whether the APB2 peripheral clock during Low Power (Sleep) mode is enabled or not.

+  * @note   Peripheral clock gating in SLEEP mode can be used to further reduce

+  *         power consumption.

+  * @note   After wakeup from SLEEP mode, the peripheral clock is enabled again.

+  * @note   By default, all peripheral clocks are enabled during SLEEP mode.

+  * @{

+  */

+

+#define __HAL_RCC_SYSCFG_IS_CLK_SLEEP_ENABLED()    (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_SYSCFGSMEN) != 0U)

+

+#if defined(SDMMC1) && defined(RCC_APB2SMENR_SDMMC1SMEN)

+#define __HAL_RCC_SDMMC1_IS_CLK_SLEEP_ENABLED()    (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_SDMMC1SMEN) != 0U)

+#endif /* SDMMC1 && RCC_APB2SMENR_SDMMC1SMEN */

+

+#define __HAL_RCC_TIM1_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_TIM1SMEN) != 0U)

+

+#define __HAL_RCC_SPI1_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_SPI1SMEN) != 0U)

+

+#if defined(TIM8)

+#define __HAL_RCC_TIM8_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_TIM8SMEN) != 0U)

+#endif /* TIM8 */

+

+#define __HAL_RCC_USART1_IS_CLK_SLEEP_ENABLED()    (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_USART1SMEN) != 0U)

+

+#define __HAL_RCC_TIM15_IS_CLK_SLEEP_ENABLED()     (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_TIM15SMEN) != 0U)

+

+#define __HAL_RCC_TIM16_IS_CLK_SLEEP_ENABLED()     (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_TIM16SMEN) != 0U)

+

+#if defined(TIM17)

+#define __HAL_RCC_TIM17_IS_CLK_SLEEP_ENABLED()     (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_TIM17SMEN) != 0U)

+#endif /* TIM17 */

+

+#if defined(SAI1)

+#define __HAL_RCC_SAI1_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_SAI1SMEN) != 0U)

+#endif /* SAI1 */

+

+#if defined(SAI2)

+#define __HAL_RCC_SAI2_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_SAI2SMEN) != 0U)

+#endif /* SAI2 */

+

+#if defined(DFSDM1_Filter0)

+#define __HAL_RCC_DFSDM1_IS_CLK_SLEEP_ENABLED()    (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_DFSDM1SMEN) != 0U)

+#endif /* DFSDM1_Filter0 */

+

+#if defined(LTDC)

+#define __HAL_RCC_LTDC_IS_CLK_SLEEP_ENABLED()      (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_LTDCSMEN) != 0U)

+#endif /* LTDC */

+

+#if defined(DSI)

+#define __HAL_RCC_DSI_IS_CLK_SLEEP_ENABLED()       (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_DSISMEN) != 0U)

+#endif /* DSI */

+

+

+#define __HAL_RCC_SYSCFG_IS_CLK_SLEEP_DISABLED()   (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_SYSCFGSMEN) == 0U)

+

+#if defined(SDMMC1) && defined(RCC_APB2SMENR_SDMMC1SMEN)

+#define __HAL_RCC_SDMMC1_IS_CLK_SLEEP_DISABLED()   (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_SDMMC1SMEN) == 0U)

+#endif /* SDMMC1 && RCC_APB2SMENR_SDMMC1SMEN */

+

+#define __HAL_RCC_TIM1_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_TIM1SMEN) == 0U)

+

+#define __HAL_RCC_SPI1_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_SPI1SMEN) == 0U)

+

+#if defined(TIM8)

+#define __HAL_RCC_TIM8_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_TIM8SMEN) == 0U)

+#endif /* TIM8 */

+

+#define __HAL_RCC_USART1_IS_CLK_SLEEP_DISABLED()   (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_USART1SMEN) == 0U)

+

+#define __HAL_RCC_TIM15_IS_CLK_SLEEP_DISABLED()    (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_TIM15SMEN) == 0U)

+

+#define __HAL_RCC_TIM16_IS_CLK_SLEEP_DISABLED()    (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_TIM16SMEN) == 0U)

+

+#if defined(TIM17)

+#define __HAL_RCC_TIM17_IS_CLK_SLEEP_DISABLED()    (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_TIM17SMEN) == 0U)

+#endif /* TIM17 */

+

+#if defined(SAI1)

+#define __HAL_RCC_SAI1_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_SAI1SMEN) == 0U)

+#endif /* SAI1 */

+

+#if defined(SAI2)

+#define __HAL_RCC_SAI2_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_SAI2SMEN) == 0U)

+#endif /* SAI2 */

+

+#if defined(DFSDM1_Filter0)

+#define __HAL_RCC_DFSDM1_IS_CLK_SLEEP_DISABLED()   (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_DFSDM1SMEN) == 0U)

+#endif /* DFSDM1_Filter0 */

+

+#if defined(LTDC)

+#define __HAL_RCC_LTDC_IS_CLK_SLEEP_DISABLED()     (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_LTDCSMEN) == 0U)

+#endif /* LTDC */

+

+#if defined(DSI)

+#define __HAL_RCC_DSI_IS_CLK_SLEEP_DISABLED()      (READ_BIT(RCC->APB2SMENR, RCC_APB2SMENR_DSISMEN) == 0U)

+#endif /* DSI */

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_Backup_Domain_Reset RCC Backup Domain Reset

+  * @{

+  */

+

+/** @brief  Macros to force or release the Backup domain reset.

+  * @note   This function resets the RTC peripheral (including the backup registers)

+  *         and the RTC clock source selection in RCC_CSR register.

+  * @note   The BKPSRAM is not affected by this reset.

+  * @retval None

+  */

+#define __HAL_RCC_BACKUPRESET_FORCE()   SET_BIT(RCC->BDCR, RCC_BDCR_BDRST)

+

+#define __HAL_RCC_BACKUPRESET_RELEASE() CLEAR_BIT(RCC->BDCR, RCC_BDCR_BDRST)

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_RTC_Clock_Configuration RCC RTC Clock Configuration

+  * @{

+  */

+

+/** @brief  Macros to enable or disable the RTC clock.

+  * @note   As the RTC is in the Backup domain and write access is denied to

+  *         this domain after reset, you have to enable write access using

+  *         HAL_PWR_EnableBkUpAccess() function before to configure the RTC

+  *         (to be done once after reset).

+  * @note   These macros must be used after the RTC clock source was selected.

+  * @retval None

+  */

+#define __HAL_RCC_RTC_ENABLE()         SET_BIT(RCC->BDCR, RCC_BDCR_RTCEN)

+

+#define __HAL_RCC_RTC_DISABLE()        CLEAR_BIT(RCC->BDCR, RCC_BDCR_RTCEN)

+

+/**

+  * @}

+  */

+

+/** @brief  Macros to enable or disable the Internal High Speed 16MHz oscillator (HSI).

+  * @note   The HSI is stopped by hardware when entering STOP and STANDBY modes.

+  *         It is used (enabled by hardware) as system clock source after startup

+  *         from Reset, wakeup from STOP and STANDBY mode, or in case of failure

+  *         of the HSE used directly or indirectly as system clock (if the Clock

+  *         Security System CSS is enabled).

+  * @note   HSI can not be stopped if it is used as system clock source. In this case,

+  *         you have to select another source of the system clock then stop the HSI.

+  * @note   After enabling the HSI, the application software should wait on HSIRDY

+  *         flag to be set indicating that HSI clock is stable and can be used as

+  *         system clock source.

+  *         This parameter can be: ENABLE or DISABLE.

+  * @note   When the HSI is stopped, HSIRDY flag goes low after 6 HSI oscillator

+  *         clock cycles.

+  * @retval None

+  */

+#define __HAL_RCC_HSI_ENABLE()  SET_BIT(RCC->CR, RCC_CR_HSION)

+

+#define __HAL_RCC_HSI_DISABLE() CLEAR_BIT(RCC->CR, RCC_CR_HSION)

+

+/** @brief  Macro to adjust the Internal High Speed 16MHz oscillator (HSI) calibration value.

+  * @note   The calibration is used to compensate for the variations in voltage

+  *         and temperature that influence the frequency of the internal HSI RC.

+  * @param  __HSICALIBRATIONVALUE__ specifies the calibration trimming value

+  *         (default is RCC_HSICALIBRATION_DEFAULT).

+  *         This parameter must be a number between 0 and 0x1F (STM32L43x/STM32L44x/STM32L47x/STM32L48x) or 0x7F (for other devices).

+  * @retval None

+  */

+#define __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(__HSICALIBRATIONVALUE__) \

+                  MODIFY_REG(RCC->ICSCR, RCC_ICSCR_HSITRIM, (__HSICALIBRATIONVALUE__) << RCC_ICSCR_HSITRIM_Pos)

+

+/**

+  * @brief    Macros to enable or disable the wakeup the Internal High Speed oscillator (HSI)

+  *           in parallel to the Internal Multi Speed oscillator (MSI) used at system wakeup.

+  * @note     The enable of this function has not effect on the HSION bit.

+  *           This parameter can be: ENABLE or DISABLE.

+  * @retval None

+  */

+#define __HAL_RCC_HSIAUTOMATIC_START_ENABLE()   SET_BIT(RCC->CR, RCC_CR_HSIASFS)

+

+#define __HAL_RCC_HSIAUTOMATIC_START_DISABLE()  CLEAR_BIT(RCC->CR, RCC_CR_HSIASFS)

+

+/**

+  * @brief    Macros to enable or disable the force of the Internal High Speed oscillator (HSI)

+  *           in STOP mode to be quickly available as kernel clock for USARTs and I2Cs.

+  * @note     Keeping the HSI ON in STOP mode allows to avoid slowing down the communication

+  *           speed because of the HSI startup time.

+  * @note     The enable of this function has not effect on the HSION bit.

+  *           This parameter can be: ENABLE or DISABLE.

+  * @retval None

+  */

+#define __HAL_RCC_HSISTOP_ENABLE()     SET_BIT(RCC->CR, RCC_CR_HSIKERON)

+

+#define __HAL_RCC_HSISTOP_DISABLE()    CLEAR_BIT(RCC->CR, RCC_CR_HSIKERON)

+

+/**

+  * @brief  Macros to enable or disable the Internal Multi Speed oscillator (MSI).

+  * @note     The MSI is stopped by hardware when entering STOP and STANDBY modes.

+  *           It is used (enabled by hardware) as system clock source after

+  *           startup from Reset, wakeup from STOP and STANDBY mode, or in case

+  *           of failure of the HSE used directly or indirectly as system clock

+  *           (if the Clock Security System CSS is enabled).

+  * @note     MSI can not be stopped if it is used as system clock source.

+  *           In this case, you have to select another source of the system

+  *           clock then stop the MSI.

+  * @note     After enabling the MSI, the application software should wait on

+  *           MSIRDY flag to be set indicating that MSI clock is stable and can

+  *           be used as system clock source.

+  * @note   When the MSI is stopped, MSIRDY flag goes low after 6 MSI oscillator

+  *         clock cycles.

+  * @retval None

+  */

+#define __HAL_RCC_MSI_ENABLE()  SET_BIT(RCC->CR, RCC_CR_MSION)

+

+#define __HAL_RCC_MSI_DISABLE() CLEAR_BIT(RCC->CR, RCC_CR_MSION)

+

+/** @brief  Macro Adjusts the Internal Multi Speed oscillator (MSI) calibration value.

+  * @note   The calibration is used to compensate for the variations in voltage

+  *         and temperature that influence the frequency of the internal MSI RC.

+  *         Refer to the Application Note AN3300 for more details on how to

+  *         calibrate the MSI.

+  * @param  __MSICALIBRATIONVALUE__ specifies the calibration trimming value

+  *         (default is RCC_MSICALIBRATION_DEFAULT).

+  *         This parameter must be a number between 0 and 255.

+  * @retval None

+  */

+#define __HAL_RCC_MSI_CALIBRATIONVALUE_ADJUST(__MSICALIBRATIONVALUE__) \

+                  MODIFY_REG(RCC->ICSCR, RCC_ICSCR_MSITRIM, (__MSICALIBRATIONVALUE__) << RCC_ICSCR_MSITRIM_Pos)

+

+/**

+  * @brief  Macro configures the Internal Multi Speed oscillator (MSI) clock range in run mode

+  * @note     After restart from Reset , the MSI clock is around 4 MHz.

+  *           After stop the startup clock can be MSI (at any of its possible

+  *           frequencies, the one that was used before entering stop mode) or HSI.

+  *          After Standby its frequency can be selected between 4 possible values

+  *          (1, 2, 4 or 8 MHz).

+  * @note     MSIRANGE can be modified when MSI is OFF (MSION=0) or when MSI is ready

+  *          (MSIRDY=1).

+  * @note    The MSI clock range after reset can be modified on the fly.

+  * @param  __MSIRANGEVALUE__ specifies the MSI clock range.

+  *         This parameter must be one of the following values:

+  *            @arg @ref RCC_MSIRANGE_0  MSI clock is around 100 KHz

+  *            @arg @ref RCC_MSIRANGE_1  MSI clock is around 200 KHz

+  *            @arg @ref RCC_MSIRANGE_2  MSI clock is around 400 KHz

+  *            @arg @ref RCC_MSIRANGE_3  MSI clock is around 800 KHz

+  *            @arg @ref RCC_MSIRANGE_4  MSI clock is around 1 MHz

+  *            @arg @ref RCC_MSIRANGE_5  MSI clock is around 2 MHz

+  *            @arg @ref RCC_MSIRANGE_6  MSI clock is around 4 MHz (default after Reset)

+  *            @arg @ref RCC_MSIRANGE_7  MSI clock is around 8 MHz

+  *            @arg @ref RCC_MSIRANGE_8  MSI clock is around 16 MHz

+  *            @arg @ref RCC_MSIRANGE_9  MSI clock is around 24 MHz

+  *            @arg @ref RCC_MSIRANGE_10  MSI clock is around 32 MHz

+  *            @arg @ref RCC_MSIRANGE_11  MSI clock is around 48 MHz

+  * @retval None

+  */

+#define __HAL_RCC_MSI_RANGE_CONFIG(__MSIRANGEVALUE__) \

+                  do {                                                         \

+                    SET_BIT(RCC->CR, RCC_CR_MSIRGSEL);                         \

+                    MODIFY_REG(RCC->CR, RCC_CR_MSIRANGE, (__MSIRANGEVALUE__)); \

+                  } while(0)

+

+/**

+  * @brief  Macro configures the Internal Multi Speed oscillator (MSI) clock range after Standby mode

+  *         After Standby its frequency can be selected between 4 possible values (1, 2, 4 or 8 MHz).

+  * @param  __MSIRANGEVALUE__ specifies the MSI clock range.

+  *         This parameter must be one of the following values:

+  *            @arg @ref RCC_MSIRANGE_4  MSI clock is around 1 MHz

+  *            @arg @ref RCC_MSIRANGE_5  MSI clock is around 2 MHz

+  *            @arg @ref RCC_MSIRANGE_6  MSI clock is around 4 MHz (default after Reset)

+  *            @arg @ref RCC_MSIRANGE_7  MSI clock is around 8 MHz

+  * @retval None

+  */

+#define __HAL_RCC_MSI_STANDBY_RANGE_CONFIG(__MSIRANGEVALUE__) \

+                  MODIFY_REG(RCC->CSR, RCC_CSR_MSISRANGE, (__MSIRANGEVALUE__) << 4U)

+

+/** @brief  Macro to get the Internal Multi Speed oscillator (MSI) clock range in run mode

+  * @retval MSI clock range.

+  *         This parameter must be one of the following values:

+  *            @arg @ref RCC_MSIRANGE_0  MSI clock is around 100 KHz

+  *            @arg @ref RCC_MSIRANGE_1  MSI clock is around 200 KHz

+  *            @arg @ref RCC_MSIRANGE_2  MSI clock is around 400 KHz

+  *            @arg @ref RCC_MSIRANGE_3  MSI clock is around 800 KHz

+  *            @arg @ref RCC_MSIRANGE_4  MSI clock is around 1 MHz

+  *            @arg @ref RCC_MSIRANGE_5  MSI clock is around 2 MHz

+  *            @arg @ref RCC_MSIRANGE_6  MSI clock is around 4 MHz (default after Reset)

+  *            @arg @ref RCC_MSIRANGE_7  MSI clock is around 8 MHz

+  *            @arg @ref RCC_MSIRANGE_8  MSI clock is around 16 MHz

+  *            @arg @ref RCC_MSIRANGE_9  MSI clock is around 24 MHz

+  *            @arg @ref RCC_MSIRANGE_10  MSI clock is around 32 MHz

+  *            @arg @ref RCC_MSIRANGE_11  MSI clock is around 48 MHz

+  */

+#define __HAL_RCC_GET_MSI_RANGE()                                              \

+                  ((READ_BIT(RCC->CR, RCC_CR_MSIRGSEL) != 0U) ?             \

+                   READ_BIT(RCC->CR, RCC_CR_MSIRANGE) :                        \

+                   (READ_BIT(RCC->CSR, RCC_CSR_MSISRANGE) >> 4U))

+

+/** @brief  Macros to enable or disable the Internal Low Speed oscillator (LSI).

+  * @note   After enabling the LSI, the application software should wait on

+  *         LSIRDY flag to be set indicating that LSI clock is stable and can

+  *         be used to clock the IWDG and/or the RTC.

+  * @note   LSI can not be disabled if the IWDG is running.

+  * @note   When the LSI is stopped, LSIRDY flag goes low after 6 LSI oscillator

+  *         clock cycles.

+  * @retval None

+  */

+#define __HAL_RCC_LSI_ENABLE()         SET_BIT(RCC->CSR, RCC_CSR_LSION)

+

+#define __HAL_RCC_LSI_DISABLE()        CLEAR_BIT(RCC->CSR, RCC_CSR_LSION)

+

+/**

+  * @brief  Macro to configure the External High Speed oscillator (HSE).

+  * @note   Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not

+  *         supported by this macro. User should request a transition to HSE Off

+  *         first and then HSE On or HSE Bypass.

+  * @note   After enabling the HSE (RCC_HSE_ON or RCC_HSE_Bypass), the application

+  *         software should wait on HSERDY flag to be set indicating that HSE clock

+  *         is stable and can be used to clock the PLL and/or system clock.

+  * @note   HSE state can not be changed if it is used directly or through the

+  *         PLL as system clock. In this case, you have to select another source

+  *         of the system clock then change the HSE state (ex. disable it).

+  * @note   The HSE is stopped by hardware when entering STOP and STANDBY modes.

+  * @note   This function reset the CSSON bit, so if the clock security system(CSS)

+  *         was previously enabled you have to enable it again after calling this

+  *         function.

+  * @param  __STATE__ specifies the new state of the HSE.

+  *         This parameter can be one of the following values:

+  *            @arg @ref RCC_HSE_OFF  Turn OFF the HSE oscillator, HSERDY flag goes low after

+  *                              6 HSE oscillator clock cycles.

+  *            @arg @ref RCC_HSE_ON  Turn ON the HSE oscillator.

+  *            @arg @ref RCC_HSE_BYPASS  HSE oscillator bypassed with external clock.

+  * @retval None

+  */

+#define __HAL_RCC_HSE_CONFIG(__STATE__)                      \

+                    do {                                     \

+                      if((__STATE__) == RCC_HSE_ON)          \

+                      {                                      \

+                        SET_BIT(RCC->CR, RCC_CR_HSEON);      \

+                      }                                      \

+                      else if((__STATE__) == RCC_HSE_BYPASS) \

+                      {                                      \

+                        SET_BIT(RCC->CR, RCC_CR_HSEBYP);     \

+                        SET_BIT(RCC->CR, RCC_CR_HSEON);      \

+                      }                                      \

+                      else                                   \

+                      {                                      \

+                        CLEAR_BIT(RCC->CR, RCC_CR_HSEON);    \

+                        CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP);   \

+                      }                                      \

+                    } while(0)

+

+/**

+  * @brief  Macro to configure the External Low Speed oscillator (LSE).

+  * @note   Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not

+  *         supported by this macro. User should request a transition to LSE Off

+  *         first and then LSE On or LSE Bypass.

+  * @note   As the LSE is in the Backup domain and write access is denied to

+  *         this domain after reset, you have to enable write access using

+  *         HAL_PWR_EnableBkUpAccess() function before to configure the LSE

+  *         (to be done once after reset).

+  * @note   After enabling the LSE (RCC_LSE_ON or RCC_LSE_BYPASS), the application

+  *         software should wait on LSERDY flag to be set indicating that LSE clock

+  *         is stable and can be used to clock the RTC.

+  * @param  __STATE__ specifies the new state of the LSE.

+  *         This parameter can be one of the following values:

+  *            @arg @ref RCC_LSE_OFF  Turn OFF the LSE oscillator, LSERDY flag goes low after

+  *                              6 LSE oscillator clock cycles.

+  *            @arg @ref RCC_LSE_ON  Turn ON the LSE oscillator.

+  *            @arg @ref RCC_LSE_BYPASS  LSE oscillator bypassed with external clock.

+  * @retval None

+  */

+#define __HAL_RCC_LSE_CONFIG(__STATE__)                        \

+                    do {                                       \

+                      if((__STATE__) == RCC_LSE_ON)            \

+                      {                                        \

+                        SET_BIT(RCC->BDCR, RCC_BDCR_LSEON);    \

+                      }                                        \

+                      else if((__STATE__) == RCC_LSE_BYPASS)   \

+                      {                                        \

+                        SET_BIT(RCC->BDCR, RCC_BDCR_LSEBYP);   \

+                        SET_BIT(RCC->BDCR, RCC_BDCR_LSEON);    \

+                      }                                        \

+                      else                                     \

+                      {                                        \

+                        CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON);  \

+                        CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \

+                      }                                        \

+                    } while(0)

+

+#if defined(RCC_HSI48_SUPPORT)

+

+/** @brief  Macros to enable or disable the Internal High Speed 48MHz oscillator (HSI48).

+  * @note   The HSI48 is stopped by hardware when entering STOP and STANDBY modes.

+  * @note   After enabling the HSI48, the application software should wait on HSI48RDY

+  *         flag to be set indicating that HSI48 clock is stable.

+  *         This parameter can be: ENABLE or DISABLE.

+  * @retval None

+  */

+#define __HAL_RCC_HSI48_ENABLE()  SET_BIT(RCC->CRRCR, RCC_CRRCR_HSI48ON)

+

+#define __HAL_RCC_HSI48_DISABLE() CLEAR_BIT(RCC->CRRCR, RCC_CRRCR_HSI48ON)

+

+#endif /* RCC_HSI48_SUPPORT */

+

+/** @brief  Macros to configure the RTC clock (RTCCLK).

+  * @note   As the RTC clock configuration bits are in the Backup domain and write

+  *         access is denied to this domain after reset, you have to enable write

+  *         access using the Power Backup Access macro before to configure

+  *         the RTC clock source (to be done once after reset).

+  * @note   Once the RTC clock is configured it cannot be changed unless the

+  *         Backup domain is reset using __HAL_RCC_BACKUPRESET_FORCE() macro, or by

+  *         a Power On Reset (POR).

+  *

+  * @param  __RTC_CLKSOURCE__ specifies the RTC clock source.

+  *         This parameter can be one of the following values:

+  *            @arg @ref RCC_RTCCLKSOURCE_NONE  No clock selected as RTC clock.

+  *            @arg @ref RCC_RTCCLKSOURCE_LSE  LSE selected as RTC clock.

+  *            @arg @ref RCC_RTCCLKSOURCE_LSI  LSI selected as RTC clock.

+  *            @arg @ref RCC_RTCCLKSOURCE_HSE_DIV32  HSE clock divided by 32 selected

+  *

+  * @note   If the LSE or LSI is used as RTC clock source, the RTC continues to

+  *         work in STOP and STANDBY modes, and can be used as wakeup source.

+  *         However, when the HSE clock is used as RTC clock source, the RTC

+  *         cannot be used in STOP and STANDBY modes.

+  * @note   The maximum input clock frequency for RTC is 1MHz (when using HSE as

+  *         RTC clock source).

+  * @retval None

+  */

+#define __HAL_RCC_RTC_CONFIG(__RTC_CLKSOURCE__)  \

+                  MODIFY_REG( RCC->BDCR, RCC_BDCR_RTCSEL, (__RTC_CLKSOURCE__))

+

+

+/** @brief  Macro to get the RTC clock source.

+  * @retval The returned value can be one of the following:

+  *            @arg @ref RCC_RTCCLKSOURCE_NONE  No clock selected as RTC clock.

+  *            @arg @ref RCC_RTCCLKSOURCE_LSE  LSE selected as RTC clock.

+  *            @arg @ref RCC_RTCCLKSOURCE_LSI  LSI selected as RTC clock.

+  *            @arg @ref RCC_RTCCLKSOURCE_HSE_DIV32  HSE clock divided by 32 selected

+  */

+#define  __HAL_RCC_GET_RTC_SOURCE() (READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL))

+

+/** @brief  Macros to enable or disable the main PLL.

+  * @note   After enabling the main PLL, the application software should wait on

+  *         PLLRDY flag to be set indicating that PLL clock is stable and can

+  *         be used as system clock source.

+  * @note   The main PLL can not be disabled if it is used as system clock source

+  * @note   The main PLL is disabled by hardware when entering STOP and STANDBY modes.

+  * @retval None

+  */

+#define __HAL_RCC_PLL_ENABLE()         SET_BIT(RCC->CR, RCC_CR_PLLON)

+

+#define __HAL_RCC_PLL_DISABLE()        CLEAR_BIT(RCC->CR, RCC_CR_PLLON)

+

+/** @brief  Macro to configure the PLL clock source.

+  * @note   This function must be used only when the main PLL is disabled.

+  * @param  __PLLSOURCE__ specifies the PLL entry clock source.

+  *         This parameter can be one of the following values:

+  *            @arg @ref RCC_PLLSOURCE_NONE  No clock selected as PLL clock entry

+  *            @arg @ref RCC_PLLSOURCE_MSI  MSI oscillator clock selected as PLL clock entry

+  *            @arg @ref RCC_PLLSOURCE_HSI  HSI oscillator clock selected as PLL clock entry

+  *            @arg @ref RCC_PLLSOURCE_HSE  HSE oscillator clock selected as PLL clock entry

+  * @note   This clock source is common for the main PLL and audio PLL (PLLSAI1 and PLLSAI2).

+  * @retval None

+  *

+  */

+#define __HAL_RCC_PLL_PLLSOURCE_CONFIG(__PLLSOURCE__) \

+                  MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, (__PLLSOURCE__))

+

+/** @brief  Macro to configure the PLL source division factor M.

+  * @note   This function must be used only when the main PLL is disabled.

+  * @param  __PLLM__ specifies the division factor for PLL VCO input clock

+  *         This parameter must be a number between Min_Data = 1 and Max_Data = 16 on STM32L4Rx/STM32L4Sx devices.

+  *         This parameter must be a number between Min_Data = 1 and Max_Data = 8 on other devices.

+  * @note   You have to set the PLLM parameter correctly to ensure that the VCO input

+  *         frequency ranges from 4 to 16 MHz. It is recommended to select a frequency

+  *         of 16 MHz to limit PLL jitter.

+  * @retval None

+  *

+  */

+#define __HAL_RCC_PLL_PLLM_CONFIG(__PLLM__) \

+                  MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, ((__PLLM__) - 1) << 4U)

+

+/**

+  * @brief  Macro to configure the main PLL clock source, multiplication and division factors.

+  * @note   This function must be used only when the main PLL is disabled.

+  *

+  * @param  __PLLSOURCE__ specifies the PLL entry clock source.

+  *          This parameter can be one of the following values:

+  *            @arg @ref RCC_PLLSOURCE_NONE  No clock selected as PLL clock entry

+  *            @arg @ref RCC_PLLSOURCE_MSI  MSI oscillator clock selected as PLL clock entry

+  *            @arg @ref RCC_PLLSOURCE_HSI  HSI oscillator clock selected as PLL clock entry

+  *            @arg @ref RCC_PLLSOURCE_HSE  HSE oscillator clock selected as PLL clock entry

+  * @note   This clock source is common for the main PLL and audio PLL (PLLSAI1 and PLLSAI2).

+  *

+  * @param  __PLLM__ specifies the division factor for PLL VCO input clock.

+  *          This parameter must be a number between Min_Data = 1 and Max_Data = 16 on STM32L4Rx/STM32L4Sx devices.

+  *          This parameter must be a number between Min_Data = 1 and Max_Data = 8 on other devices.

+  * @note   You have to set the PLLM parameter correctly to ensure that the VCO input

+  *         frequency ranges from 4 to 16 MHz. It is recommended to select a frequency

+  *         of 16 MHz to limit PLL jitter.

+  *

+  * @param  __PLLN__ specifies the multiplication factor for PLL VCO output clock.

+  *          This parameter must be a number between 8 and 86.

+  * @note   You have to set the PLLN parameter correctly to ensure that the VCO

+  *         output frequency is between 64 and 344 MHz.

+  *

+  * @param  __PLLP__ specifies the division factor for SAI clock when SAI available on device.

+  *          This parameter must be a number in the range (7 or 17) for STM32L47x/STM32L48x

+  *          else (2 to 31).

+  *

+  * @param  __PLLQ__ specifies the division factor for OTG FS, SDMMC1 and RNG clocks.

+  *          This parameter must be in the range (2, 4, 6 or 8).

+  * @note   If the USB OTG FS is used in your application, you have to set the

+  *         PLLQ parameter correctly to have 48 MHz clock for the USB. However,

+  *         the SDMMC1 and RNG need a frequency lower than or equal to 48 MHz to work

+  *         correctly.

+  * @param  __PLLR__ specifies the division factor for the main system clock.

+  * @note   You have to set the PLLR parameter correctly to not exceed 80MHZ.

+  *          This parameter must be in the range (2, 4, 6 or 8).

+  * @retval None

+  */

+#if defined(RCC_PLLP_DIV_2_31_SUPPORT)

+

+#define __HAL_RCC_PLL_CONFIG(__PLLSOURCE__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__,__PLLR__ ) \

+                  MODIFY_REG(RCC->PLLCFGR, \

+                             (RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | \

+                              RCC_PLLCFGR_PLLQ | RCC_PLLCFGR_PLLR | RCC_PLLCFGR_PLLP | RCC_PLLCFGR_PLLPDIV), \

+                             ((__PLLSOURCE__) | \

+                              (((__PLLM__) - 1U) << RCC_PLLCFGR_PLLM_Pos) | \

+                              ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \

+                              ((((__PLLQ__) >> 1U) - 1U) << RCC_PLLCFGR_PLLQ_Pos) | \

+                              ((((__PLLR__) >> 1U) - 1U) << RCC_PLLCFGR_PLLR_Pos) | \

+                              ((uint32_t)(__PLLP__) << RCC_PLLCFGR_PLLPDIV_Pos)))

+

+#elif defined(RCC_PLLP_SUPPORT)

+

+#define __HAL_RCC_PLL_CONFIG(__PLLSOURCE__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__,__PLLR__ ) \

+                  MODIFY_REG(RCC->PLLCFGR, \

+                             (RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | \

+                              RCC_PLLCFGR_PLLQ | RCC_PLLCFGR_PLLR | RCC_PLLCFGR_PLLP), \

+                             ((__PLLSOURCE__) | \

+                              (((__PLLM__) - 1U) << RCC_PLLCFGR_PLLM_Pos) | \

+                              ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \

+                              ((((__PLLQ__) >> 1U) - 1U) << RCC_PLLCFGR_PLLQ_Pos) | \

+                              ((((__PLLR__) >> 1U) - 1U) << RCC_PLLCFGR_PLLR_Pos) | \

+                              (((__PLLP__) >> 4U) << RCC_PLLCFGR_PLLP_Pos)))

+

+#else

+

+#define __HAL_RCC_PLL_CONFIG(__PLLSOURCE__, __PLLM__, __PLLN__, __PLLQ__,__PLLR__ ) \

+                  MODIFY_REG(RCC->PLLCFGR, \

+                             (RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | \

+                              RCC_PLLCFGR_PLLQ | RCC_PLLCFGR_PLLR), \

+                             ((__PLLSOURCE__) | \

+                              (((__PLLM__) - 1U) << RCC_PLLCFGR_PLLM_Pos) | \

+                              ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \

+                              ((((__PLLQ__) >> 1U) - 1U) << RCC_PLLCFGR_PLLQ_Pos) | \

+                              ((((__PLLR__) >> 1U) - 1U) << RCC_PLLCFGR_PLLR_Pos)))

+

+#endif /* RCC_PLLP_DIV_2_31_SUPPORT */

+

+/** @brief  Macro to get the oscillator used as PLL clock source.

+  * @retval The oscillator used as PLL clock source. The returned value can be one

+  *         of the following:

+  *              - RCC_PLLSOURCE_NONE: No oscillator is used as PLL clock source.

+  *              - RCC_PLLSOURCE_MSI: MSI oscillator is used as PLL clock source.

+  *              - RCC_PLLSOURCE_HSI: HSI oscillator is used as PLL clock source.

+  *              - RCC_PLLSOURCE_HSE: HSE oscillator is used as PLL clock source.

+  */

+#define __HAL_RCC_GET_PLL_OSCSOURCE() (READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC))

+

+/**

+  * @brief  Enable or disable each clock output (RCC_PLL_SYSCLK, RCC_PLL_48M1CLK, RCC_PLL_SAI3CLK)

+  * @note   Enabling/disabling clock outputs RCC_PLL_SAI3CLK and RCC_PLL_48M1CLK can be done at anytime

+  *         without the need to stop the PLL in order to save power. But RCC_PLL_SYSCLK cannot

+  *         be stopped if used as System Clock.

+  * @param  __PLLCLOCKOUT__ specifies the PLL clock to be output.

+  *          This parameter can be one or a combination of the following values:

+  *            @arg @ref RCC_PLL_SAI3CLK  This clock is used to generate an accurate clock to achieve

+  *                                   high-quality audio performance on SAI interface in case.

+  *            @arg @ref RCC_PLL_48M1CLK  This Clock is used to generate the clock for the USB OTG FS (48 MHz),

+  *                                   the random analog generator (<=48 MHz) and the SDMMC1 (<= 48 MHz).

+  *            @arg @ref RCC_PLL_SYSCLK  This Clock is used to generate the high speed system clock (up to 80MHz)

+  * @retval None

+  */

+#define __HAL_RCC_PLLCLKOUT_ENABLE(__PLLCLOCKOUT__)   SET_BIT(RCC->PLLCFGR, (__PLLCLOCKOUT__))

+

+#define __HAL_RCC_PLLCLKOUT_DISABLE(__PLLCLOCKOUT__)  CLEAR_BIT(RCC->PLLCFGR, (__PLLCLOCKOUT__))

+

+/**

+  * @brief  Get clock output enable status (RCC_PLL_SYSCLK, RCC_PLL_48M1CLK, RCC_PLL_SAI3CLK)

+  * @param  __PLLCLOCKOUT__ specifies the output PLL clock to be checked.

+  *          This parameter can be one of the following values:

+  *            @arg @ref RCC_PLL_SAI3CLK  This clock is used to generate an accurate clock to achieve

+  *                                   high-quality audio performance on SAI interface in case.

+  *            @arg @ref RCC_PLL_48M1CLK  This Clock is used to generate the clock for the USB OTG FS (48 MHz),

+  *                                   the random analog generator (<=48 MHz) and the SDMMC1 (<= 48 MHz).

+  *            @arg @ref RCC_PLL_SYSCLK  This Clock is used to generate the high speed system clock (up to 80MHz)

+  * @retval SET / RESET

+  */

+#define __HAL_RCC_GET_PLLCLKOUT_CONFIG(__PLLCLOCKOUT__)  READ_BIT(RCC->PLLCFGR, (__PLLCLOCKOUT__))

+

+/**

+  * @brief  Macro to configure the system clock source.

+  * @param  __SYSCLKSOURCE__ specifies the system clock source.

+  *          This parameter can be one of the following values:

+  *              - RCC_SYSCLKSOURCE_MSI: MSI oscillator is used as system clock source.

+  *              - RCC_SYSCLKSOURCE_HSI: HSI oscillator is used as system clock source.

+  *              - RCC_SYSCLKSOURCE_HSE: HSE oscillator is used as system clock source.

+  *              - RCC_SYSCLKSOURCE_PLLCLK: PLL output is used as system clock source.

+  * @retval None

+  */

+#define __HAL_RCC_SYSCLK_CONFIG(__SYSCLKSOURCE__) \

+                  MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, (__SYSCLKSOURCE__))

+

+/** @brief  Macro to get the clock source used as system clock.

+  * @retval The clock source used as system clock. The returned value can be one

+  *         of the following:

+  *              - RCC_SYSCLKSOURCE_STATUS_MSI: MSI used as system clock.

+  *              - RCC_SYSCLKSOURCE_STATUS_HSI: HSI used as system clock.

+  *              - RCC_SYSCLKSOURCE_STATUS_HSE: HSE used as system clock.

+  *              - RCC_SYSCLKSOURCE_STATUS_PLLCLK: PLL used as system clock.

+  */

+#define __HAL_RCC_GET_SYSCLK_SOURCE() (READ_BIT(RCC->CFGR, RCC_CFGR_SWS))

+

+/**

+  * @brief  Macro to configure the External Low Speed oscillator (LSE) drive capability.

+  * @note   As the LSE is in the Backup domain and write access is denied to

+  *         this domain after reset, you have to enable write access using

+  *         HAL_PWR_EnableBkUpAccess() function before to configure the LSE

+  *         (to be done once after reset).

+  * @param  __LSEDRIVE__ specifies the new state of the LSE drive capability.

+  *          This parameter can be one of the following values:

+  *            @arg @ref RCC_LSEDRIVE_LOW  LSE oscillator low drive capability.

+  *            @arg @ref RCC_LSEDRIVE_MEDIUMLOW  LSE oscillator medium low drive capability.

+  *            @arg @ref RCC_LSEDRIVE_MEDIUMHIGH  LSE oscillator medium high drive capability.

+  *            @arg @ref RCC_LSEDRIVE_HIGH  LSE oscillator high drive capability.

+  * @retval None

+  */

+#define __HAL_RCC_LSEDRIVE_CONFIG(__LSEDRIVE__) \

+                  MODIFY_REG(RCC->BDCR, RCC_BDCR_LSEDRV, (__LSEDRIVE__))

+

+/**

+  * @brief  Macro to configure the wake up from stop clock.

+  * @param  __STOPWUCLK__ specifies the clock source used after wake up from stop.

+  *         This parameter can be one of the following values:

+  *            @arg @ref RCC_STOP_WAKEUPCLOCK_MSI  MSI selected as system clock source

+  *            @arg @ref RCC_STOP_WAKEUPCLOCK_HSI  HSI selected as system clock source

+  * @retval None

+  */

+#define __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(__STOPWUCLK__) \

+                  MODIFY_REG(RCC->CFGR, RCC_CFGR_STOPWUCK, (__STOPWUCLK__))

+

+

+/** @brief  Macro to configure the MCO clock.

+  * @param  __MCOCLKSOURCE__ specifies the MCO clock source.

+  *          This parameter can be one of the following values:

+  *            @arg @ref RCC_MCO1SOURCE_NOCLOCK  MCO output disabled

+  *            @arg @ref RCC_MCO1SOURCE_SYSCLK  System  clock selected as MCO source

+  *            @arg @ref RCC_MCO1SOURCE_MSI  MSI clock selected as MCO source

+  *            @arg @ref RCC_MCO1SOURCE_HSI  HSI clock selected as MCO source

+  *            @arg @ref RCC_MCO1SOURCE_HSE  HSE clock selected as MCO sourcee

+  *            @arg @ref RCC_MCO1SOURCE_PLLCLK  Main PLL clock selected as MCO source

+  *            @arg @ref RCC_MCO1SOURCE_LSI  LSI clock selected as MCO source

+  *            @arg @ref RCC_MCO1SOURCE_LSE  LSE clock selected as MCO source

+  @if STM32L443xx

+  *            @arg @ref RCC_MCO1SOURCE_HSI48  HSI48 clock selected as MCO source for devices with HSI48

+  @endif

+  @if STM32L4A6xx

+  *            @arg @ref RCC_MCO1SOURCE_HSI48  HSI48 clock selected as MCO source for devices with HSI48

+  @endif

+  * @param  __MCODIV__ specifies the MCO clock prescaler.

+  *          This parameter can be one of the following values:

+  *            @arg @ref RCC_MCODIV_1   MCO clock source is divided by 1

+  *            @arg @ref RCC_MCODIV_2   MCO clock source is divided by 2

+  *            @arg @ref RCC_MCODIV_4   MCO clock source is divided by 4

+  *            @arg @ref RCC_MCODIV_8   MCO clock source is divided by 8

+  *            @arg @ref RCC_MCODIV_16  MCO clock source is divided by 16

+  */

+#define __HAL_RCC_MCO1_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \

+                 MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCOSEL | RCC_CFGR_MCOPRE), ((__MCOCLKSOURCE__) | (__MCODIV__)))

+

+/** @defgroup RCC_Flags_Interrupts_Management Flags Interrupts Management

+  * @brief macros to manage the specified RCC Flags and interrupts.

+  * @{

+  */

+

+/** @brief  Enable RCC interrupt(s).

+  * @param  __INTERRUPT__ specifies the RCC interrupt source(s) to be enabled.

+  *         This parameter can be any combination of the following values:

+  *            @arg @ref RCC_IT_LSIRDY  LSI ready interrupt

+  *            @arg @ref RCC_IT_LSERDY  LSE ready interrupt

+  *            @arg @ref RCC_IT_MSIRDY  HSI ready interrupt

+  *            @arg @ref RCC_IT_HSIRDY  HSI ready interrupt

+  *            @arg @ref RCC_IT_HSERDY  HSE ready interrupt

+  *            @arg @ref RCC_IT_PLLRDY  Main PLL ready interrupt

+  *            @arg @ref RCC_IT_PLLSAI1RDY  PLLSAI1 ready interrupt for devices with PLLSAI1

+  *            @arg @ref RCC_IT_PLLSAI2RDY  PLLSAI2 ready interrupt for devices with PLLSAI2

+  *            @arg @ref RCC_IT_LSECSS  LSE Clock security system interrupt

+  @if STM32L443xx

+  *            @arg @ref RCC_IT_HSI48RDY  HSI48 ready interrupt for devices with HSI48

+  @endif

+  @if STM32L4A6xx

+  *            @arg @ref RCC_IT_HSI48RDY  HSI48 ready interrupt for devices with HSI48

+  @endif

+  * @retval None

+  */

+#define __HAL_RCC_ENABLE_IT(__INTERRUPT__) SET_BIT(RCC->CIER, (__INTERRUPT__))

+

+/** @brief Disable RCC interrupt(s).

+  * @param  __INTERRUPT__ specifies the RCC interrupt source(s) to be disabled.

+  *         This parameter can be any combination of the following values:

+  *            @arg @ref RCC_IT_LSIRDY  LSI ready interrupt

+  *            @arg @ref RCC_IT_LSERDY  LSE ready interrupt

+  *            @arg @ref RCC_IT_MSIRDY  HSI ready interrupt

+  *            @arg @ref RCC_IT_HSIRDY  HSI ready interrupt

+  *            @arg @ref RCC_IT_HSERDY  HSE ready interrupt

+  *            @arg @ref RCC_IT_PLLRDY  Main PLL ready interrupt

+  *            @arg @ref RCC_IT_PLLSAI1RDY  PLLSAI1 ready interrupt for devices with PLLSAI1

+  *            @arg @ref RCC_IT_PLLSAI2RDY  PLLSAI2 ready interrupt for devices with PLLSAI2

+  *            @arg @ref RCC_IT_LSECSS  LSE Clock security system interrupt

+  @if STM32L443xx

+  *            @arg @ref RCC_IT_HSI48RDY  HSI48 ready interrupt for devices with HSI48

+  @endif

+  @if STM32L4A6xx

+  *            @arg @ref RCC_IT_HSI48RDY  HSI48 ready interrupt for devices with HSI48

+  @endif

+  * @retval None

+  */

+#define __HAL_RCC_DISABLE_IT(__INTERRUPT__) CLEAR_BIT(RCC->CIER, (__INTERRUPT__))

+

+/** @brief  Clear the RCC's interrupt pending bits.

+  * @param  __INTERRUPT__ specifies the interrupt pending bit to clear.

+  *         This parameter can be any combination of the following values:

+  *            @arg @ref RCC_IT_LSIRDY  LSI ready interrupt

+  *            @arg @ref RCC_IT_LSERDY  LSE ready interrupt

+  *            @arg @ref RCC_IT_MSIRDY  MSI ready interrupt

+  *            @arg @ref RCC_IT_HSIRDY  HSI ready interrupt

+  *            @arg @ref RCC_IT_HSERDY  HSE ready interrupt

+  *            @arg @ref RCC_IT_PLLRDY  Main PLL ready interrupt

+  *            @arg @ref RCC_IT_PLLSAI1RDY  PLLSAI1 ready interrupt for devices with PLLSAI1

+  *            @arg @ref RCC_IT_PLLSAI2RDY  PLLSAI2 ready interrupt for devices with PLLSAI2

+  *            @arg @ref RCC_IT_CSS  HSE Clock security system interrupt

+  *            @arg @ref RCC_IT_LSECSS  LSE Clock security system interrupt

+  @if STM32L443xx

+  *            @arg @ref RCC_IT_HSI48RDY  HSI48 ready interrupt for devices with HSI48

+  @endif

+  @if STM32L4A6xx

+  *            @arg @ref RCC_IT_HSI48RDY  HSI48 ready interrupt for devices with HSI48

+  @endif

+  * @retval None

+  */

+#define __HAL_RCC_CLEAR_IT(__INTERRUPT__) WRITE_REG(RCC->CICR, (__INTERRUPT__))

+

+/** @brief  Check whether the RCC interrupt has occurred or not.

+  * @param  __INTERRUPT__ specifies the RCC interrupt source to check.

+  *         This parameter can be one of the following values:

+  *            @arg @ref RCC_IT_LSIRDY  LSI ready interrupt

+  *            @arg @ref RCC_IT_LSERDY  LSE ready interrupt

+  *            @arg @ref RCC_IT_MSIRDY  MSI ready interrupt

+  *            @arg @ref RCC_IT_HSIRDY  HSI ready interrupt

+  *            @arg @ref RCC_IT_HSERDY  HSE ready interrupt

+  *            @arg @ref RCC_IT_PLLRDY  Main PLL ready interrupt

+  *            @arg @ref RCC_IT_PLLSAI1RDY  PLLSAI1 ready interrupt for devices with PLLSAI1

+  *            @arg @ref RCC_IT_PLLSAI2RDY  PLLSAI2 ready interrupt for devices with PLLSAI2

+  *            @arg @ref RCC_IT_CSS  HSE Clock security system interrupt

+  *            @arg @ref RCC_IT_LSECSS  LSE Clock security system interrupt

+  @if STM32L443xx

+  *            @arg @ref RCC_IT_HSI48RDY HSI48 ready interrupt for devices with HSI48

+  @endif

+  @if STM32L4A6xx

+  *            @arg @ref RCC_IT_HSI48RDY HSI48 ready interrupt for devices with HSI48

+  @endif

+  * @retval The new state of __INTERRUPT__ (TRUE or FALSE).

+  */

+#define __HAL_RCC_GET_IT(__INTERRUPT__) (READ_BIT(RCC->CIFR, (__INTERRUPT__)) == (__INTERRUPT__))

+

+/** @brief Set RMVF bit to clear the reset flags.

+  *        The reset flags are: RCC_FLAG_FWRRST, RCC_FLAG_OBLRST, RCC_FLAG_PINRST, RCC_FLAG_BORRST,

+  *        RCC_FLAG_SFTRST, RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST and RCC_FLAG_LPWRRST.

+  * @retval None

+ */

+#define __HAL_RCC_CLEAR_RESET_FLAGS() SET_BIT(RCC->CSR, RCC_CSR_RMVF)

+

+/** @brief  Check whether the selected RCC flag is set or not.

+  * @param  __FLAG__ specifies the flag to check.

+  *         This parameter can be one of the following values:

+  *            @arg @ref RCC_FLAG_MSIRDY  MSI oscillator clock ready

+  *            @arg @ref RCC_FLAG_HSIRDY  HSI oscillator clock ready

+  *            @arg @ref RCC_FLAG_HSERDY  HSE oscillator clock ready

+  *            @arg @ref RCC_FLAG_PLLRDY  Main PLL clock ready

+  *            @arg @ref RCC_FLAG_PLLSAI1RDY  PLLSAI1 clock ready for devices with PLLSAI1

+  *            @arg @ref RCC_FLAG_PLLSAI2RDY  PLLSAI2 clock ready for devices with PLLSAI2

+  @if STM32L443xx

+  *            @arg @ref RCC_FLAG_HSI48RDY  HSI48 clock ready for devices with HSI48

+  @endif

+  @if STM32L4A6xx

+  *            @arg @ref RCC_FLAG_HSI48RDY  HSI48 clock ready for devices with HSI48

+  @endif

+  *            @arg @ref RCC_FLAG_LSERDY  LSE oscillator clock ready

+  *            @arg @ref RCC_FLAG_LSECSSD  Clock security system failure on LSE oscillator detection

+  *            @arg @ref RCC_FLAG_LSIRDY  LSI oscillator clock ready

+  *            @arg @ref RCC_FLAG_BORRST  BOR reset

+  *            @arg @ref RCC_FLAG_OBLRST  OBLRST reset

+  *            @arg @ref RCC_FLAG_PINRST  Pin reset

+  *            @arg @ref RCC_FLAG_FWRST  FIREWALL reset

+  *            @arg @ref RCC_FLAG_SFTRST  Software reset

+  *            @arg @ref RCC_FLAG_IWDGRST  Independent Watchdog reset

+  *            @arg @ref RCC_FLAG_WWDGRST  Window Watchdog reset

+  *            @arg @ref RCC_FLAG_LPWRRST  Low Power reset

+  * @retval The new state of __FLAG__ (TRUE or FALSE).

+  */

+#if defined(RCC_HSI48_SUPPORT)

+#define __HAL_RCC_GET_FLAG(__FLAG__) (((((((__FLAG__) >> 5U) == 1U) ? RCC->CR :                    \

+                                        ((((__FLAG__) >> 5U) == 4U) ? RCC->CRRCR :                 \

+                                        ((((__FLAG__) >> 5U) == 2U) ? RCC->BDCR :                  \

+                                        ((((__FLAG__) >> 5U) == 3U) ? RCC->CSR : RCC->CIFR)))) &   \

+                                          (1U << ((__FLAG__) & RCC_FLAG_MASK))) != 0U) ? 1U : 0U)

+#else

+#define __HAL_RCC_GET_FLAG(__FLAG__) (((((((__FLAG__) >> 5U) == 1U) ? RCC->CR :                    \

+                                        ((((__FLAG__) >> 5U) == 2U) ? RCC->BDCR :                  \

+                                        ((((__FLAG__) >> 5U) == 3U) ? RCC->CSR : RCC->CIFR))) &    \

+                                          (1U << ((__FLAG__) & RCC_FLAG_MASK))) != 0U) ? 1U : 0U)

+#endif /* RCC_HSI48_SUPPORT */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Private constants ---------------------------------------------------------*/

+/** @defgroup RCC_Private_Constants RCC Private Constants

+  * @{

+  */

+/* Defines used for Flags */

+#define CR_REG_INDEX              1U

+#define BDCR_REG_INDEX            2U

+#define CSR_REG_INDEX             3U

+#if defined(RCC_HSI48_SUPPORT)

+#define CRRCR_REG_INDEX           4U

+#endif /* RCC_HSI48_SUPPORT */

+

+#define RCC_FLAG_MASK             0x1FU

+/**

+  * @}

+  */

+

+/* Private macros ------------------------------------------------------------*/

+/** @addtogroup RCC_Private_Macros

+  * @{

+  */

+

+#if defined(RCC_HSI48_SUPPORT)

+#define IS_RCC_OSCILLATORTYPE(__OSCILLATOR__) (((__OSCILLATOR__) == RCC_OSCILLATORTYPE_NONE)                               || \

+                                               (((__OSCILLATOR__) & RCC_OSCILLATORTYPE_HSE)   == RCC_OSCILLATORTYPE_HSE)   || \

+                                               (((__OSCILLATOR__) & RCC_OSCILLATORTYPE_HSI)   == RCC_OSCILLATORTYPE_HSI)   || \

+                                               (((__OSCILLATOR__) & RCC_OSCILLATORTYPE_HSI48) == RCC_OSCILLATORTYPE_HSI48) || \

+                                               (((__OSCILLATOR__) & RCC_OSCILLATORTYPE_MSI)   == RCC_OSCILLATORTYPE_MSI)   || \

+                                               (((__OSCILLATOR__) & RCC_OSCILLATORTYPE_LSI)   == RCC_OSCILLATORTYPE_LSI)   || \

+                                               (((__OSCILLATOR__) & RCC_OSCILLATORTYPE_LSE)   == RCC_OSCILLATORTYPE_LSE))

+#else

+#define IS_RCC_OSCILLATORTYPE(__OSCILLATOR__) (((__OSCILLATOR__) == RCC_OSCILLATORTYPE_NONE)                           || \

+                                               (((__OSCILLATOR__) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) || \

+                                               (((__OSCILLATOR__) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) || \

+                                               (((__OSCILLATOR__) & RCC_OSCILLATORTYPE_MSI) == RCC_OSCILLATORTYPE_MSI) || \

+                                               (((__OSCILLATOR__) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) || \

+                                               (((__OSCILLATOR__) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE))

+#endif /* RCC_HSI48_SUPPORT */

+

+#define IS_RCC_HSE(__HSE__)  (((__HSE__) == RCC_HSE_OFF) || ((__HSE__) == RCC_HSE_ON) || \

+                              ((__HSE__) == RCC_HSE_BYPASS))

+

+#if defined(RCC_BDCR_LSESYSDIS)

+#define IS_RCC_LSE(__LSE__)  (((__LSE__) == RCC_LSE_OFF) || ((__LSE__) == RCC_LSE_ON) || ((__LSE__) == RCC_LSE_BYPASS_RTC_ONLY) || \

+                              ((__LSE__) == RCC_LSE_ON_RTC_ONLY) || ((__LSE__) == RCC_LSE_BYPASS))

+#else

+#define IS_RCC_LSE(__LSE__)  (((__LSE__) == RCC_LSE_OFF) || ((__LSE__) == RCC_LSE_ON) || \

+                              ((__LSE__) == RCC_LSE_BYPASS))

+#endif /* RCC_BDCR_LSESYSDIS */

+

+#define IS_RCC_HSI(__HSI__)  (((__HSI__) == RCC_HSI_OFF) || ((__HSI__) == RCC_HSI_ON))

+

+#define IS_RCC_HSI_CALIBRATION_VALUE(__VALUE__) ((__VALUE__) <= (RCC_ICSCR_HSITRIM >> RCC_ICSCR_HSITRIM_Pos))

+

+#define IS_RCC_LSI(__LSI__)  (((__LSI__) == RCC_LSI_OFF) || ((__LSI__) == RCC_LSI_ON))

+

+#if defined(RCC_CSR_LSIPREDIV)

+#define IS_RCC_LSIDIV(__LSIDIV__)  (((__LSIDIV__) == RCC_LSI_DIV1) || ((__LSIDIV__) == RCC_LSI_DIV128))

+#endif /* RCC_CSR_LSIPREDIV */

+

+#define IS_RCC_MSI(__MSI__)  (((__MSI__) == RCC_MSI_OFF) || ((__MSI__) == RCC_MSI_ON))

+

+#define IS_RCC_MSICALIBRATION_VALUE(__VALUE__) ((__VALUE__) <= 255U)

+

+#if defined(RCC_HSI48_SUPPORT)

+#define IS_RCC_HSI48(__HSI48__)  (((__HSI48__) == RCC_HSI48_OFF) || ((__HSI48__) == RCC_HSI48_ON))

+#endif /* RCC_HSI48_SUPPORT */

+

+#define IS_RCC_PLL(__PLL__) (((__PLL__) == RCC_PLL_NONE) ||((__PLL__) == RCC_PLL_OFF) || \

+                             ((__PLL__) == RCC_PLL_ON))

+

+#define IS_RCC_PLLSOURCE(__SOURCE__) (((__SOURCE__) == RCC_PLLSOURCE_NONE) || \

+                                      ((__SOURCE__) == RCC_PLLSOURCE_MSI)  || \

+                                      ((__SOURCE__) == RCC_PLLSOURCE_HSI)  || \

+                                      ((__SOURCE__) == RCC_PLLSOURCE_HSE))

+

+#if defined(RCC_PLLM_DIV_1_16_SUPPORT)

+#define IS_RCC_PLLM_VALUE(__VALUE__) ((1U <= (__VALUE__)) && ((__VALUE__) <= 16U))

+#else

+#define IS_RCC_PLLM_VALUE(__VALUE__) ((1U <= (__VALUE__)) && ((__VALUE__) <= 8U))

+#endif /*RCC_PLLM_DIV_1_16_SUPPORT */

+

+#define IS_RCC_PLLN_VALUE(__VALUE__) ((8U <= (__VALUE__)) && ((__VALUE__) <= 86U))

+

+#if defined(RCC_PLLP_DIV_2_31_SUPPORT)

+#define IS_RCC_PLLP_VALUE(__VALUE__) (((__VALUE__) >= 2U) && ((__VALUE__) <= 31U))

+#else

+#define IS_RCC_PLLP_VALUE(__VALUE__) (((__VALUE__) == 7U) || ((__VALUE__) == 17U))

+#endif /*RCC_PLLP_DIV_2_31_SUPPORT */

+

+#define IS_RCC_PLLQ_VALUE(__VALUE__) (((__VALUE__) == 2U) || ((__VALUE__) == 4U) || \

+                                      ((__VALUE__) == 6U) || ((__VALUE__) == 8U))

+

+#define IS_RCC_PLLR_VALUE(__VALUE__) (((__VALUE__) == 2U) || ((__VALUE__) == 4U) || \

+                                      ((__VALUE__) == 6U) || ((__VALUE__) == 8U))

+

+#if defined(RCC_PLLSAI1_SUPPORT)

+#define IS_RCC_PLLSAI1CLOCKOUT_VALUE(__VALUE__) (((((__VALUE__) & RCC_PLLSAI1_SAI1CLK) == RCC_PLLSAI1_SAI1CLK)  || \

+                                                  (((__VALUE__) & RCC_PLLSAI1_48M2CLK) == RCC_PLLSAI1_48M2CLK)  || \

+                                                  (((__VALUE__) & RCC_PLLSAI1_ADC1CLK) == RCC_PLLSAI1_ADC1CLK)) && \

+                                                 (((__VALUE__) & ~(RCC_PLLSAI1_SAI1CLK|RCC_PLLSAI1_48M2CLK|RCC_PLLSAI1_ADC1CLK)) == 0U))

+#endif /* RCC_PLLSAI1_SUPPORT */

+

+#if defined(RCC_PLLSAI2_SUPPORT)

+#if defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx) || defined(STM32L496xx) || defined(STM32L4A6xx)

+#define IS_RCC_PLLSAI2CLOCKOUT_VALUE(__VALUE__) (((((__VALUE__) & RCC_PLLSAI2_SAI2CLK) == RCC_PLLSAI2_SAI2CLK)  || \

+                                                  (((__VALUE__) & RCC_PLLSAI2_ADC2CLK) == RCC_PLLSAI2_ADC2CLK)) && \

+                                                 (((__VALUE__) & ~(RCC_PLLSAI2_SAI2CLK|RCC_PLLSAI2_ADC2CLK)) == 0U))

+#elif defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+#define IS_RCC_PLLSAI2CLOCKOUT_VALUE(__VALUE__) (((((__VALUE__) & RCC_PLLSAI2_SAI2CLK) == RCC_PLLSAI2_SAI2CLK)  || \

+                                                  (((__VALUE__) & RCC_PLLSAI2_DSICLK)  == RCC_PLLSAI2_DSICLK)   || \

+                                                  (((__VALUE__) & RCC_PLLSAI2_LTDCCLK) == RCC_PLLSAI2_LTDCCLK)) && \

+                                                 (((__VALUE__) & ~(RCC_PLLSAI2_SAI2CLK|RCC_PLLSAI2_DSICLK|RCC_PLLSAI2_LTDCCLK)) == 0U))

+#endif /* STM32L471xx || STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx || STM32L496xx || STM32L4A6xx */

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+#define IS_RCC_MSI_CLOCK_RANGE(__RANGE__) (((__RANGE__) == RCC_MSIRANGE_0)  || \

+                                           ((__RANGE__) == RCC_MSIRANGE_1)  || \

+                                           ((__RANGE__) == RCC_MSIRANGE_2)  || \

+                                           ((__RANGE__) == RCC_MSIRANGE_3)  || \

+                                           ((__RANGE__) == RCC_MSIRANGE_4)  || \

+                                           ((__RANGE__) == RCC_MSIRANGE_5)  || \

+                                           ((__RANGE__) == RCC_MSIRANGE_6)  || \

+                                           ((__RANGE__) == RCC_MSIRANGE_7)  || \

+                                           ((__RANGE__) == RCC_MSIRANGE_8)  || \

+                                           ((__RANGE__) == RCC_MSIRANGE_9)  || \

+                                           ((__RANGE__) == RCC_MSIRANGE_10) || \

+                                           ((__RANGE__) == RCC_MSIRANGE_11))

+

+#define IS_RCC_MSI_STANDBY_CLOCK_RANGE(__RANGE__) (((__RANGE__) == RCC_MSIRANGE_4)  || \

+                                                   ((__RANGE__) == RCC_MSIRANGE_5)  || \

+                                                   ((__RANGE__) == RCC_MSIRANGE_6)  || \

+                                                   ((__RANGE__) == RCC_MSIRANGE_7))

+

+#define IS_RCC_CLOCKTYPE(__CLK__)  ((1U <= (__CLK__)) && ((__CLK__) <= 15U))

+

+#define IS_RCC_SYSCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_SYSCLKSOURCE_MSI) || \

+                                         ((__SOURCE__) == RCC_SYSCLKSOURCE_HSI) || \

+                                         ((__SOURCE__) == RCC_SYSCLKSOURCE_HSE) || \

+                                         ((__SOURCE__) == RCC_SYSCLKSOURCE_PLLCLK))

+

+#define IS_RCC_HCLK(__HCLK__) (((__HCLK__) == RCC_SYSCLK_DIV1)   || ((__HCLK__) == RCC_SYSCLK_DIV2)   || \

+                               ((__HCLK__) == RCC_SYSCLK_DIV4)   || ((__HCLK__) == RCC_SYSCLK_DIV8)   || \

+                               ((__HCLK__) == RCC_SYSCLK_DIV16)  || ((__HCLK__) == RCC_SYSCLK_DIV64)  || \

+                               ((__HCLK__) == RCC_SYSCLK_DIV128) || ((__HCLK__) == RCC_SYSCLK_DIV256) || \

+                               ((__HCLK__) == RCC_SYSCLK_DIV512))

+

+#define IS_RCC_PCLK(__PCLK__) (((__PCLK__) == RCC_HCLK_DIV1) || ((__PCLK__) == RCC_HCLK_DIV2) || \

+                               ((__PCLK__) == RCC_HCLK_DIV4) || ((__PCLK__) == RCC_HCLK_DIV8) || \

+                               ((__PCLK__) == RCC_HCLK_DIV16))

+

+#define IS_RCC_RTCCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_RTCCLKSOURCE_NONE)   || \

+                                         ((__SOURCE__) == RCC_RTCCLKSOURCE_LSE)    || \

+                                         ((__SOURCE__) == RCC_RTCCLKSOURCE_LSI)    || \

+                                         ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV32))

+

+#define IS_RCC_MCO(__MCOX__) ((__MCOX__) == RCC_MCO1)

+

+#if defined(RCC_HSI48_SUPPORT)

+#define IS_RCC_MCO1SOURCE(__SOURCE__) (((__SOURCE__) == RCC_MCO1SOURCE_NOCLOCK) || \

+                                       ((__SOURCE__) == RCC_MCO1SOURCE_SYSCLK) || \

+                                       ((__SOURCE__) == RCC_MCO1SOURCE_MSI) || \

+                                       ((__SOURCE__) == RCC_MCO1SOURCE_HSI) || \

+                                       ((__SOURCE__) == RCC_MCO1SOURCE_HSE) || \

+                                       ((__SOURCE__) == RCC_MCO1SOURCE_PLLCLK) || \

+                                       ((__SOURCE__) == RCC_MCO1SOURCE_LSI) || \

+                                       ((__SOURCE__) == RCC_MCO1SOURCE_LSE) || \

+                                       ((__SOURCE__) == RCC_MCO1SOURCE_HSI48))

+#else

+#define IS_RCC_MCO1SOURCE(__SOURCE__) (((__SOURCE__) == RCC_MCO1SOURCE_NOCLOCK) || \

+                                       ((__SOURCE__) == RCC_MCO1SOURCE_SYSCLK) || \

+                                       ((__SOURCE__) == RCC_MCO1SOURCE_MSI) || \

+                                       ((__SOURCE__) == RCC_MCO1SOURCE_HSI) || \

+                                       ((__SOURCE__) == RCC_MCO1SOURCE_HSE) || \

+                                       ((__SOURCE__) == RCC_MCO1SOURCE_PLLCLK) || \

+                                       ((__SOURCE__) == RCC_MCO1SOURCE_LSI) || \

+                                       ((__SOURCE__) == RCC_MCO1SOURCE_LSE))

+#endif /* RCC_HSI48_SUPPORT */

+

+#define IS_RCC_MCODIV(__DIV__) (((__DIV__) == RCC_MCODIV_1) || ((__DIV__) == RCC_MCODIV_2) || \

+                                ((__DIV__) == RCC_MCODIV_4) || ((__DIV__) == RCC_MCODIV_8) || \

+                                ((__DIV__) == RCC_MCODIV_16))

+

+#define IS_RCC_LSE_DRIVE(__DRIVE__) (((__DRIVE__) == RCC_LSEDRIVE_LOW)        || \

+                                     ((__DRIVE__) == RCC_LSEDRIVE_MEDIUMLOW)  || \

+                                     ((__DRIVE__) == RCC_LSEDRIVE_MEDIUMHIGH) || \

+                                     ((__DRIVE__) == RCC_LSEDRIVE_HIGH))

+

+#define IS_RCC_STOP_WAKEUPCLOCK(__SOURCE__) (((__SOURCE__) == RCC_STOP_WAKEUPCLOCK_MSI) || \

+                                             ((__SOURCE__) == RCC_STOP_WAKEUPCLOCK_HSI))

+/**

+  * @}

+  */

+

+/* Include RCC HAL Extended module */

+#include "stm32l4xx_hal_rcc_ex.h"

+

+/* Exported functions --------------------------------------------------------*/

+/** @addtogroup RCC_Exported_Functions

+  * @{

+  */

+

+

+/** @addtogroup RCC_Exported_Functions_Group1

+  * @{

+  */

+

+/* Initialization and de-initialization functions  ******************************/

+HAL_StatusTypeDef HAL_RCC_DeInit(void);

+HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct);

+HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency);

+

+/**

+  * @}

+  */

+

+/** @addtogroup RCC_Exported_Functions_Group2

+  * @{

+  */

+

+/* Peripheral Control functions  ************************************************/

+void              HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv);

+void              HAL_RCC_EnableCSS(void);

+uint32_t          HAL_RCC_GetSysClockFreq(void);

+uint32_t          HAL_RCC_GetHCLKFreq(void);

+uint32_t          HAL_RCC_GetPCLK1Freq(void);

+uint32_t          HAL_RCC_GetPCLK2Freq(void);

+void              HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct);

+void              HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency);

+/* CSS NMI IRQ handler */

+void              HAL_RCC_NMI_IRQHandler(void);

+/* User Callbacks in non blocking mode (IT mode) */

+void              HAL_RCC_CSSCallback(void);

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* __STM32L4xx_HAL_RCC_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h
new file mode 100644
index 0000000..8f5a2fb
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h
@@ -0,0 +1,3125 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_rcc_ex.h

+  * @author  MCD Application Team

+  * @brief   Header file of RCC HAL Extended module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef __STM32L4xx_HAL_RCC_EX_H

+#define __STM32L4xx_HAL_RCC_EX_H

+

+#ifdef __cplusplus

+ extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup RCCEx

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+

+/** @defgroup RCCEx_Exported_Types RCCEx Exported Types

+  * @{

+  */

+

+#if defined(RCC_PLLSAI1_SUPPORT)

+/**

+  * @brief  PLLSAI1 Clock structure definition

+  */

+typedef struct

+{

+

+  uint32_t PLLSAI1Source;    /*!< PLLSAI1Source: PLLSAI1 entry clock source.

+                                  This parameter must be a value of @ref RCC_PLL_Clock_Source */

+

+#if defined(RCC_PLLSAI1M_DIV_1_16_SUPPORT)

+  uint32_t PLLSAI1M;         /*!< PLLSAI1M: specifies the division factor for PLLSAI1 input clock.

+                                  This parameter must be a number between Min_Data = 1 and Max_Data = 16 */

+#else

+  uint32_t PLLSAI1M;         /*!< PLLSAI1M: specifies the division factor for PLLSAI1 input clock.

+                                  This parameter must be a number between Min_Data = 1 and Max_Data = 8 */

+#endif

+

+  uint32_t PLLSAI1N;         /*!< PLLSAI1N: specifies the multiplication factor for PLLSAI1 VCO output clock.

+                                  This parameter must be a number between 8 and 86 or 127 depending on devices. */

+

+  uint32_t PLLSAI1P;         /*!< PLLSAI1P: specifies the division factor for SAI clock.

+                                  This parameter must be a value of @ref RCC_PLLP_Clock_Divider */

+

+  uint32_t PLLSAI1Q;         /*!< PLLSAI1Q: specifies the division factor for USB/RNG/SDMMC1 clock.

+                                  This parameter must be a value of @ref RCC_PLLQ_Clock_Divider */

+

+  uint32_t PLLSAI1R;         /*!< PLLSAI1R: specifies the division factor for ADC clock.

+                                  This parameter must be a value of @ref RCC_PLLR_Clock_Divider */

+

+  uint32_t PLLSAI1ClockOut;  /*!< PLLSAIClockOut: specifies PLLSAI1 output clock to be enabled.

+                                  This parameter must be a value of @ref RCC_PLLSAI1_Clock_Output */

+}RCC_PLLSAI1InitTypeDef;

+#endif /* RCC_PLLSAI1_SUPPORT */

+

+#if defined(RCC_PLLSAI2_SUPPORT)

+/**

+  * @brief  PLLSAI2 Clock structure definition

+  */

+typedef struct

+{

+

+  uint32_t PLLSAI2Source;    /*!< PLLSAI2Source: PLLSAI2 entry clock source.

+                                  This parameter must be a value of @ref RCC_PLL_Clock_Source */

+

+#if defined(RCC_PLLSAI2M_DIV_1_16_SUPPORT)

+  uint32_t PLLSAI2M;         /*!< PLLSAI2M: specifies the division factor for PLLSAI2 input clock.

+                                  This parameter must be a number between Min_Data = 1 and Max_Data = 16 */

+#else

+  uint32_t PLLSAI2M;         /*!< PLLSAI2M: specifies the division factor for PLLSAI2 input clock.

+                                  This parameter must be a number between Min_Data = 1 and Max_Data = 8 */

+#endif

+

+  uint32_t PLLSAI2N;         /*!< PLLSAI2N: specifies the multiplication factor for PLLSAI2 VCO output clock.

+                                  This parameter must be a number between 8 and 86 or 127 depending on devices. */

+

+  uint32_t PLLSAI2P;         /*!< PLLSAI2P: specifies the division factor for SAI clock.

+                                  This parameter must be a value of @ref RCC_PLLP_Clock_Divider */

+

+#if defined(RCC_PLLSAI2Q_DIV_SUPPORT)

+  uint32_t PLLSAI2Q;         /*!< PLLSAI2Q: specifies the division factor for DSI clock.

+                                  This parameter must be a value of @ref RCC_PLLQ_Clock_Divider */

+#endif

+

+  uint32_t PLLSAI2R;         /*!< PLLSAI2R: specifies the division factor for ADC clock.

+                                  This parameter must be a value of @ref RCC_PLLR_Clock_Divider */

+

+  uint32_t PLLSAI2ClockOut;  /*!< PLLSAIClockOut: specifies PLLSAI2 output clock to be enabled.

+                                  This parameter must be a value of @ref RCC_PLLSAI2_Clock_Output */

+}RCC_PLLSAI2InitTypeDef;

+

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+/**

+  * @brief  RCC extended clocks structure definition

+  */

+typedef struct

+{

+  uint32_t PeriphClockSelection;   /*!< The Extended Clock to be configured.

+                                        This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */

+#if defined(RCC_PLLSAI1_SUPPORT)

+

+  RCC_PLLSAI1InitTypeDef PLLSAI1;  /*!< PLLSAI1 structure parameters.

+                                        This parameter will be used only when PLLSAI1 is selected as Clock Source for SAI1, USB/RNG/SDMMC1 or ADC */

+#endif /* RCC_PLLSAI1_SUPPORT */

+#if defined(RCC_PLLSAI2_SUPPORT)

+

+  RCC_PLLSAI2InitTypeDef PLLSAI2;  /*!< PLLSAI2 structure parameters.

+                                        This parameter will be used only when PLLSAI2 is selected as Clock Source for SAI2 or ADC */

+

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+  uint32_t Usart1ClockSelection;   /*!< Specifies USART1 clock source.

+                                        This parameter can be a value of @ref RCCEx_USART1_Clock_Source */

+

+  uint32_t Usart2ClockSelection;   /*!< Specifies USART2 clock source.

+                                        This parameter can be a value of @ref RCCEx_USART2_Clock_Source */

+

+#if defined(USART3)

+

+  uint32_t Usart3ClockSelection;   /*!< Specifies USART3 clock source.

+                                        This parameter can be a value of @ref RCCEx_USART3_Clock_Source */

+

+#endif /* USART3 */

+

+#if defined(UART4)

+

+  uint32_t Uart4ClockSelection;    /*!< Specifies UART4 clock source.

+                                        This parameter can be a value of @ref RCCEx_UART4_Clock_Source */

+

+#endif /* UART4 */

+

+#if defined(UART5)

+

+  uint32_t Uart5ClockSelection;    /*!< Specifies UART5 clock source.

+                                        This parameter can be a value of @ref RCCEx_UART5_Clock_Source */

+

+#endif /* UART5 */

+

+  uint32_t Lpuart1ClockSelection;  /*!< Specifies LPUART1 clock source.

+                                        This parameter can be a value of @ref RCCEx_LPUART1_Clock_Source */

+

+  uint32_t I2c1ClockSelection;     /*!< Specifies I2C1 clock source.

+                                        This parameter can be a value of @ref RCCEx_I2C1_Clock_Source */

+

+#if defined(I2C2)

+

+  uint32_t I2c2ClockSelection;     /*!< Specifies I2C2 clock source.

+                                        This parameter can be a value of @ref RCCEx_I2C2_Clock_Source */

+

+#endif /* I2C2 */

+

+  uint32_t I2c3ClockSelection;     /*!< Specifies I2C3 clock source.

+                                        This parameter can be a value of @ref RCCEx_I2C3_Clock_Source */

+

+#if defined(I2C4)

+

+  uint32_t I2c4ClockSelection;     /*!< Specifies I2C4 clock source.

+                                        This parameter can be a value of @ref RCCEx_I2C4_Clock_Source */

+

+#endif /* I2C4 */

+

+  uint32_t Lptim1ClockSelection;   /*!< Specifies LPTIM1 clock source.

+                                        This parameter can be a value of @ref RCCEx_LPTIM1_Clock_Source */

+

+  uint32_t Lptim2ClockSelection;   /*!< Specifies LPTIM2 clock source.

+                                        This parameter can be a value of @ref RCCEx_LPTIM2_Clock_Source */

+#if defined(SAI1)

+

+  uint32_t Sai1ClockSelection;     /*!< Specifies SAI1 clock source.

+                                        This parameter can be a value of @ref RCCEx_SAI1_Clock_Source */

+#endif /* SAI1 */

+

+#if defined(SAI2)

+

+  uint32_t Sai2ClockSelection;     /*!< Specifies SAI2 clock source.

+                                        This parameter can be a value of @ref RCCEx_SAI2_Clock_Source */

+

+#endif /* SAI2 */

+

+#if defined(USB_OTG_FS) || defined(USB)

+

+  uint32_t UsbClockSelection;      /*!< Specifies USB clock source (warning: same source for SDMMC1 and RNG).

+                                        This parameter can be a value of @ref RCCEx_USB_Clock_Source */

+

+#endif /* USB_OTG_FS || USB */

+

+#if defined(SDMMC1)

+

+  uint32_t Sdmmc1ClockSelection;   /*!< Specifies SDMMC1 clock source (warning: same source for USB and RNG).

+                                        This parameter can be a value of @ref RCCEx_SDMMC1_Clock_Source */

+

+#endif /* SDMMC1 */

+

+  uint32_t RngClockSelection;      /*!< Specifies RNG clock source (warning: same source for USB and SDMMC1).

+                                        This parameter can be a value of @ref RCCEx_RNG_Clock_Source */

+

+#if !defined(STM32L412xx) && !defined(STM32L422xx)

+  uint32_t AdcClockSelection;      /*!< Specifies ADC interface clock source.

+                                        This parameter can be a value of @ref RCCEx_ADC_Clock_Source */

+#endif /* !STM32L412xx && !STM32L422xx */

+

+#if defined(SWPMI1)

+

+  uint32_t Swpmi1ClockSelection;   /*!< Specifies SWPMI1 clock source.

+                                        This parameter can be a value of @ref RCCEx_SWPMI1_Clock_Source */

+

+#endif /* SWPMI1 */

+

+#if defined(DFSDM1_Filter0)

+

+  uint32_t Dfsdm1ClockSelection;   /*!< Specifies DFSDM1 clock source.

+                                        This parameter can be a value of @ref RCCEx_DFSDM1_Clock_Source */

+

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+  uint32_t Dfsdm1AudioClockSelection; /*!< Specifies DFSDM1 audio clock source.

+                                        This parameter can be a value of @ref RCCEx_DFSDM1_Audio_Clock_Source */

+

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+#endif /* DFSDM1_Filter0 */

+

+#if defined(LTDC)

+

+  uint32_t LtdcClockSelection;     /*!< Specifies LTDC clock source.

+                                        This parameter can be a value of @ref RCCEx_LTDC_Clock_Source */

+

+#endif /* LTDC */

+

+#if defined(DSI)

+

+  uint32_t DsiClockSelection;      /*!< Specifies DSI clock source.

+                                        This parameter can be a value of @ref RCCEx_DSI_Clock_Source */

+

+#endif /* DSI */

+

+#if defined(OCTOSPI1) || defined(OCTOSPI2)

+

+  uint32_t OspiClockSelection;     /*!< Specifies OctoSPI clock source.

+                                        This parameter can be a value of @ref RCCEx_OSPI_Clock_Source */

+

+#endif

+

+  uint32_t RTCClockSelection;      /*!< Specifies RTC clock source.

+                                        This parameter can be a value of @ref RCC_RTC_Clock_Source */

+}RCC_PeriphCLKInitTypeDef;

+

+#if defined(CRS)

+

+/**

+  * @brief RCC_CRS Init structure definition

+  */

+typedef struct

+{

+  uint32_t Prescaler;             /*!< Specifies the division factor of the SYNC signal.

+                                     This parameter can be a value of @ref RCCEx_CRS_SynchroDivider */

+

+  uint32_t Source;                /*!< Specifies the SYNC signal source.

+                                     This parameter can be a value of @ref RCCEx_CRS_SynchroSource */

+

+  uint32_t Polarity;              /*!< Specifies the input polarity for the SYNC signal source.

+                                     This parameter can be a value of @ref RCCEx_CRS_SynchroPolarity */

+

+  uint32_t ReloadValue;           /*!< Specifies the value to be loaded in the frequency error counter with each SYNC event.

+                                      It can be calculated in using macro __HAL_RCC_CRS_RELOADVALUE_CALCULATE(__FTARGET__, __FSYNC__)

+                                     This parameter must be a number between 0 and 0xFFFF or a value of @ref RCCEx_CRS_ReloadValueDefault .*/

+

+  uint32_t ErrorLimitValue;       /*!< Specifies the value to be used to evaluate the captured frequency error value.

+                                     This parameter must be a number between 0 and 0xFF or a value of @ref RCCEx_CRS_ErrorLimitDefault */

+

+  uint32_t HSI48CalibrationValue; /*!< Specifies a user-programmable trimming value to the HSI48 oscillator.

+                                     This parameter must be a number between 0 and 0x7F for STM32L412xx/L422xx, between 0 and 0x3F otherwise,

+                                     or a value of @ref RCCEx_CRS_HSI48CalibrationDefault */

+

+}RCC_CRSInitTypeDef;

+

+/**

+  * @brief RCC_CRS Synchronization structure definition

+  */

+typedef struct

+{

+  uint32_t ReloadValue;           /*!< Specifies the value loaded in the Counter reload value.

+                                     This parameter must be a number between 0 and 0xFFFF */

+

+  uint32_t HSI48CalibrationValue; /*!< Specifies value loaded in HSI48 oscillator smooth trimming.

+                                     This parameter must be a number between 0 and 0x7F for STM32L412xx/L422xx, between 0 and 0x3F otherwise */

+

+  uint32_t FreqErrorCapture;      /*!< Specifies the value loaded in the .FECAP, the frequency error counter

+                                                                    value latched in the time of the last SYNC event.

+                                    This parameter must be a number between 0 and 0xFFFF */

+

+  uint32_t FreqErrorDirection;    /*!< Specifies the value loaded in the .FEDIR, the counting direction of the

+                                                                    frequency error counter latched in the time of the last SYNC event.

+                                                                    It shows whether the actual frequency is below or above the target.

+                                    This parameter must be a value of @ref RCCEx_CRS_FreqErrorDirection*/

+

+}RCC_CRSSynchroInfoTypeDef;

+

+#endif /* CRS */

+/**

+  * @}

+  */

+

+/* Exported constants --------------------------------------------------------*/

+/** @defgroup RCCEx_Exported_Constants RCCEx Exported Constants

+  * @{

+  */

+

+/** @defgroup RCCEx_LSCO_Clock_Source Low Speed Clock Source

+  * @{

+  */

+#define RCC_LSCOSOURCE_LSI             0x00000000U         /*!< LSI selection for low speed clock output */

+#define RCC_LSCOSOURCE_LSE             RCC_BDCR_LSCOSEL    /*!< LSE selection for low speed clock output */

+/**

+  * @}

+  */

+

+/** @defgroup RCCEx_Periph_Clock_Selection Periph Clock Selection

+  * @{

+  */

+#define RCC_PERIPHCLK_USART1           0x00000001U

+#define RCC_PERIPHCLK_USART2           0x00000002U

+#if defined(USART3)

+#define RCC_PERIPHCLK_USART3           0x00000004U

+#endif

+#if defined(UART4)

+#define RCC_PERIPHCLK_UART4            0x00000008U

+#endif

+#if defined(UART5)

+#define RCC_PERIPHCLK_UART5            0x00000010U

+#endif

+#define RCC_PERIPHCLK_LPUART1          0x00000020U

+#define RCC_PERIPHCLK_I2C1             0x00000040U

+#if defined(I2C2)

+#define RCC_PERIPHCLK_I2C2             0x00000080U

+#endif

+#define RCC_PERIPHCLK_I2C3             0x00000100U

+#define RCC_PERIPHCLK_LPTIM1           0x00000200U

+#define RCC_PERIPHCLK_LPTIM2           0x00000400U

+#if defined(SAI1)

+#define RCC_PERIPHCLK_SAI1             0x00000800U

+#endif

+#if defined(SAI2)

+#define RCC_PERIPHCLK_SAI2             0x00001000U

+#endif

+#if defined(USB_OTG_FS) || defined(USB)

+#define RCC_PERIPHCLK_USB              0x00002000U

+#endif

+#define RCC_PERIPHCLK_ADC              0x00004000U

+#if defined(SWPMI1)

+#define RCC_PERIPHCLK_SWPMI1           0x00008000U

+#endif

+#if defined(DFSDM1_Filter0)

+#define RCC_PERIPHCLK_DFSDM1           0x00010000U

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+#define RCC_PERIPHCLK_DFSDM1AUDIO      0x00200000U

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+#endif

+#define RCC_PERIPHCLK_RTC              0x00020000U

+#define RCC_PERIPHCLK_RNG              0x00040000U

+#if defined(SDMMC1)

+#define RCC_PERIPHCLK_SDMMC1           0x00080000U

+#endif

+#if defined(I2C4)

+#define RCC_PERIPHCLK_I2C4             0x00100000U

+#endif

+#if defined(LTDC)

+#define RCC_PERIPHCLK_LTDC             0x00400000U

+#endif

+#if defined(DSI)

+#define RCC_PERIPHCLK_DSI              0x00800000U

+#endif

+#if defined(OCTOSPI1) || defined(OCTOSPI2)

+#define RCC_PERIPHCLK_OSPI             0x01000000U

+#endif

+/**

+  * @}

+  */

+

+

+/** @defgroup RCCEx_USART1_Clock_Source USART1 Clock Source

+  * @{

+  */

+#define RCC_USART1CLKSOURCE_PCLK2      0x00000000U

+#define RCC_USART1CLKSOURCE_SYSCLK     RCC_CCIPR_USART1SEL_0

+#define RCC_USART1CLKSOURCE_HSI        RCC_CCIPR_USART1SEL_1

+#define RCC_USART1CLKSOURCE_LSE        (RCC_CCIPR_USART1SEL_0 | RCC_CCIPR_USART1SEL_1)

+/**

+  * @}

+  */

+

+/** @defgroup RCCEx_USART2_Clock_Source USART2 Clock Source

+  * @{

+  */

+#define RCC_USART2CLKSOURCE_PCLK1      0x00000000U

+#define RCC_USART2CLKSOURCE_SYSCLK     RCC_CCIPR_USART2SEL_0

+#define RCC_USART2CLKSOURCE_HSI        RCC_CCIPR_USART2SEL_1

+#define RCC_USART2CLKSOURCE_LSE        (RCC_CCIPR_USART2SEL_0 | RCC_CCIPR_USART2SEL_1)

+/**

+  * @}

+  */

+

+#if defined(USART3)

+/** @defgroup RCCEx_USART3_Clock_Source USART3 Clock Source

+  * @{

+  */

+#define RCC_USART3CLKSOURCE_PCLK1      0x00000000U

+#define RCC_USART3CLKSOURCE_SYSCLK     RCC_CCIPR_USART3SEL_0

+#define RCC_USART3CLKSOURCE_HSI        RCC_CCIPR_USART3SEL_1

+#define RCC_USART3CLKSOURCE_LSE        (RCC_CCIPR_USART3SEL_0 | RCC_CCIPR_USART3SEL_1)

+/**

+  * @}

+  */

+#endif /* USART3 */

+

+#if defined(UART4)

+/** @defgroup RCCEx_UART4_Clock_Source UART4 Clock Source

+  * @{

+  */

+#define RCC_UART4CLKSOURCE_PCLK1       0x00000000U

+#define RCC_UART4CLKSOURCE_SYSCLK      RCC_CCIPR_UART4SEL_0

+#define RCC_UART4CLKSOURCE_HSI         RCC_CCIPR_UART4SEL_1

+#define RCC_UART4CLKSOURCE_LSE         (RCC_CCIPR_UART4SEL_0 | RCC_CCIPR_UART4SEL_1)

+/**

+  * @}

+  */

+#endif /* UART4 */

+

+#if defined(UART5)

+/** @defgroup RCCEx_UART5_Clock_Source UART5 Clock Source

+  * @{

+  */

+#define RCC_UART5CLKSOURCE_PCLK1       0x00000000U

+#define RCC_UART5CLKSOURCE_SYSCLK      RCC_CCIPR_UART5SEL_0

+#define RCC_UART5CLKSOURCE_HSI         RCC_CCIPR_UART5SEL_1

+#define RCC_UART5CLKSOURCE_LSE         (RCC_CCIPR_UART5SEL_0 | RCC_CCIPR_UART5SEL_1)

+/**

+  * @}

+  */

+#endif /* UART5 */

+

+/** @defgroup RCCEx_LPUART1_Clock_Source LPUART1 Clock Source

+  * @{

+  */

+#define RCC_LPUART1CLKSOURCE_PCLK1     0x00000000U

+#define RCC_LPUART1CLKSOURCE_SYSCLK    RCC_CCIPR_LPUART1SEL_0

+#define RCC_LPUART1CLKSOURCE_HSI       RCC_CCIPR_LPUART1SEL_1

+#define RCC_LPUART1CLKSOURCE_LSE       (RCC_CCIPR_LPUART1SEL_0 | RCC_CCIPR_LPUART1SEL_1)

+/**

+  * @}

+  */

+

+/** @defgroup RCCEx_I2C1_Clock_Source I2C1 Clock Source

+  * @{

+  */

+#define RCC_I2C1CLKSOURCE_PCLK1        0x00000000U

+#define RCC_I2C1CLKSOURCE_SYSCLK       RCC_CCIPR_I2C1SEL_0

+#define RCC_I2C1CLKSOURCE_HSI          RCC_CCIPR_I2C1SEL_1

+/**

+  * @}

+  */

+

+#if defined(I2C2)

+/** @defgroup RCCEx_I2C2_Clock_Source I2C2 Clock Source

+  * @{

+  */

+#define RCC_I2C2CLKSOURCE_PCLK1        0x00000000U

+#define RCC_I2C2CLKSOURCE_SYSCLK       RCC_CCIPR_I2C2SEL_0

+#define RCC_I2C2CLKSOURCE_HSI          RCC_CCIPR_I2C2SEL_1

+/**

+  * @}

+  */

+#endif /* I2C2 */

+

+/** @defgroup RCCEx_I2C3_Clock_Source I2C3 Clock Source

+  * @{

+  */

+#define RCC_I2C3CLKSOURCE_PCLK1        0x00000000U

+#define RCC_I2C3CLKSOURCE_SYSCLK       RCC_CCIPR_I2C3SEL_0

+#define RCC_I2C3CLKSOURCE_HSI          RCC_CCIPR_I2C3SEL_1

+/**

+  * @}

+  */

+

+#if defined(I2C4)

+/** @defgroup RCCEx_I2C4_Clock_Source I2C4 Clock Source

+  * @{

+  */

+#define RCC_I2C4CLKSOURCE_PCLK1        0x00000000U

+#define RCC_I2C4CLKSOURCE_SYSCLK       RCC_CCIPR2_I2C4SEL_0

+#define RCC_I2C4CLKSOURCE_HSI          RCC_CCIPR2_I2C4SEL_1

+/**

+  * @}

+  */

+#endif /* I2C4 */

+

+#if defined(SAI1)

+/** @defgroup RCCEx_SAI1_Clock_Source SAI1 Clock Source

+  * @{

+  */

+#define RCC_SAI1CLKSOURCE_PLLSAI1      0x00000000U

+#if defined(RCC_PLLSAI2_SUPPORT)

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+#define RCC_SAI1CLKSOURCE_PLLSAI2      RCC_CCIPR2_SAI1SEL_0

+#else

+#define RCC_SAI1CLKSOURCE_PLLSAI2      RCC_CCIPR_SAI1SEL_0

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+#endif /* RCC_PLLSAI2_SUPPORT */

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+#define RCC_SAI1CLKSOURCE_PLL          RCC_CCIPR2_SAI1SEL_1

+#define RCC_SAI1CLKSOURCE_PIN          (RCC_CCIPR2_SAI1SEL_1 | RCC_CCIPR2_SAI1SEL_0)

+#define RCC_SAI1CLKSOURCE_HSI          RCC_CCIPR2_SAI1SEL_2

+#else

+#define RCC_SAI1CLKSOURCE_PLL          RCC_CCIPR_SAI1SEL_1

+#define RCC_SAI1CLKSOURCE_PIN          RCC_CCIPR_SAI1SEL

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+/**

+  * @}

+  */

+#endif /* SAI1 */

+

+#if defined(SAI2)

+/** @defgroup RCCEx_SAI2_Clock_Source SAI2 Clock Source

+  * @{

+  */

+#define RCC_SAI2CLKSOURCE_PLLSAI1      0x00000000U

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+#define RCC_SAI2CLKSOURCE_PLLSAI2      RCC_CCIPR2_SAI2SEL_0

+#define RCC_SAI2CLKSOURCE_PLL          RCC_CCIPR2_SAI2SEL_1

+#define RCC_SAI2CLKSOURCE_PIN          (RCC_CCIPR2_SAI2SEL_1 | RCC_CCIPR2_SAI2SEL_0)

+#define RCC_SAI2CLKSOURCE_HSI          RCC_CCIPR2_SAI2SEL_2

+#else

+#define RCC_SAI2CLKSOURCE_PLLSAI2      RCC_CCIPR_SAI2SEL_0

+#define RCC_SAI2CLKSOURCE_PLL          RCC_CCIPR_SAI2SEL_1

+#define RCC_SAI2CLKSOURCE_PIN          RCC_CCIPR_SAI2SEL

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+/**

+  * @}

+  */

+#endif /* SAI2 */

+

+/** @defgroup RCCEx_LPTIM1_Clock_Source LPTIM1 Clock Source

+  * @{

+  */

+#define RCC_LPTIM1CLKSOURCE_PCLK1      0x00000000U

+#define RCC_LPTIM1CLKSOURCE_LSI        RCC_CCIPR_LPTIM1SEL_0

+#define RCC_LPTIM1CLKSOURCE_HSI        RCC_CCIPR_LPTIM1SEL_1

+#define RCC_LPTIM1CLKSOURCE_LSE        RCC_CCIPR_LPTIM1SEL

+/**

+  * @}

+  */

+

+/** @defgroup RCCEx_LPTIM2_Clock_Source LPTIM2 Clock Source

+  * @{

+  */

+#define RCC_LPTIM2CLKSOURCE_PCLK1      0x00000000U

+#define RCC_LPTIM2CLKSOURCE_LSI        RCC_CCIPR_LPTIM2SEL_0

+#define RCC_LPTIM2CLKSOURCE_HSI        RCC_CCIPR_LPTIM2SEL_1

+#define RCC_LPTIM2CLKSOURCE_LSE        RCC_CCIPR_LPTIM2SEL

+/**

+  * @}

+  */

+

+#if defined(SDMMC1)

+/** @defgroup RCCEx_SDMMC1_Clock_Source SDMMC1 Clock Source

+  * @{

+  */

+#if defined(RCC_HSI48_SUPPORT)

+#define RCC_SDMMC1CLKSOURCE_HSI48      0x00000000U  /*!< HSI48 clock selected as SDMMC1 clock          */

+#else

+#define RCC_SDMMC1CLKSOURCE_NONE       0x00000000U  /*!< No clock selected as SDMMC1 clock             */

+#endif /* RCC_HSI48_SUPPORT */

+#define RCC_SDMMC1CLKSOURCE_PLLSAI1    RCC_CCIPR_CLK48SEL_0     /*!< PLLSAI1 "Q" clock selected as SDMMC1 clock    */

+#define RCC_SDMMC1CLKSOURCE_PLL        RCC_CCIPR_CLK48SEL_1     /*!< PLL "Q" clock selected as SDMMC1 clock        */

+#define RCC_SDMMC1CLKSOURCE_MSI        RCC_CCIPR_CLK48SEL       /*!< MSI clock selected as SDMMC1 clock            */

+#if defined(RCC_CCIPR2_SDMMCSEL)

+#define RCC_SDMMC1CLKSOURCE_PLLP       RCC_CCIPR2_SDMMCSEL      /*!< PLL "P" clock selected as SDMMC1 kernel clock */

+#endif /* RCC_CCIPR2_SDMMCSEL */

+/**

+  * @}

+  */

+#endif /* SDMMC1 */

+

+/** @defgroup RCCEx_RNG_Clock_Source RNG Clock Source

+  * @{

+  */

+#if defined(RCC_HSI48_SUPPORT)

+#define RCC_RNGCLKSOURCE_HSI48         0x00000000U

+#else

+#define RCC_RNGCLKSOURCE_NONE          0x00000000U

+#endif /* RCC_HSI48_SUPPORT */

+#if defined(RCC_PLLSAI1_SUPPORT)

+#define RCC_RNGCLKSOURCE_PLLSAI1       RCC_CCIPR_CLK48SEL_0

+#endif /* RCC_PLLSAI1_SUPPORT */

+#define RCC_RNGCLKSOURCE_PLL           RCC_CCIPR_CLK48SEL_1

+#define RCC_RNGCLKSOURCE_MSI           RCC_CCIPR_CLK48SEL

+/**

+  * @}

+  */

+

+#if defined(USB_OTG_FS) || defined(USB)

+/** @defgroup RCCEx_USB_Clock_Source USB Clock Source

+  * @{

+  */

+#if defined(RCC_HSI48_SUPPORT)

+#define RCC_USBCLKSOURCE_HSI48         0x00000000U

+#else

+#define RCC_USBCLKSOURCE_NONE          0x00000000U

+#endif /* RCC_HSI48_SUPPORT */

+#if defined(RCC_PLLSAI1_SUPPORT)

+#define RCC_USBCLKSOURCE_PLLSAI1       RCC_CCIPR_CLK48SEL_0

+#endif /* RCC_PLLSAI1_SUPPORT */

+#define RCC_USBCLKSOURCE_PLL           RCC_CCIPR_CLK48SEL_1

+#define RCC_USBCLKSOURCE_MSI           RCC_CCIPR_CLK48SEL

+/**

+  * @}

+  */

+#endif /* USB_OTG_FS || USB */

+

+/** @defgroup RCCEx_ADC_Clock_Source ADC Clock Source

+  * @{

+  */

+#define RCC_ADCCLKSOURCE_NONE         0x00000000U

+#if defined(RCC_PLLSAI1_SUPPORT)

+#define RCC_ADCCLKSOURCE_PLLSAI1      RCC_CCIPR_ADCSEL_0

+#endif /* RCC_PLLSAI1_SUPPORT */

+#if defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx) || defined(STM32L496xx) || defined(STM32L4A6xx)

+#define RCC_ADCCLKSOURCE_PLLSAI2      RCC_CCIPR_ADCSEL_1

+#endif /* STM32L471xx || STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx || STM32L496xx || STM32L4A6xx */

+#if defined(RCC_CCIPR_ADCSEL)

+#define RCC_ADCCLKSOURCE_SYSCLK       RCC_CCIPR_ADCSEL

+#else

+#define RCC_ADCCLKSOURCE_SYSCLK       0x30000000U

+#endif /* RCC_CCIPR_ADCSEL */

+/**

+  * @}

+  */

+

+#if defined(SWPMI1)

+/** @defgroup RCCEx_SWPMI1_Clock_Source SWPMI1 Clock Source

+  * @{

+  */

+#define RCC_SWPMI1CLKSOURCE_PCLK1      0x00000000U

+#define RCC_SWPMI1CLKSOURCE_HSI        RCC_CCIPR_SWPMI1SEL

+/**

+  * @}

+  */

+#endif /* SWPMI1 */

+

+#if defined(DFSDM1_Filter0)

+/** @defgroup RCCEx_DFSDM1_Clock_Source DFSDM1 Clock Source

+  * @{

+  */

+#define RCC_DFSDM1CLKSOURCE_PCLK2      0x00000000U

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+#define RCC_DFSDM1CLKSOURCE_SYSCLK     RCC_CCIPR2_DFSDM1SEL

+#else

+#define RCC_DFSDM1CLKSOURCE_SYSCLK     RCC_CCIPR_DFSDM1SEL

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+/**

+  * @}

+  */

+

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+/** @defgroup RCCEx_DFSDM1_Audio_Clock_Source DFSDM1 Audio Clock Source

+  * @{

+  */

+#define RCC_DFSDM1AUDIOCLKSOURCE_SAI1   0x00000000U

+#define RCC_DFSDM1AUDIOCLKSOURCE_HSI    RCC_CCIPR2_ADFSDM1SEL_0

+#define RCC_DFSDM1AUDIOCLKSOURCE_MSI    RCC_CCIPR2_ADFSDM1SEL_1

+/**

+  * @}

+  */

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+#endif /* DFSDM1_Filter0 */

+

+#if defined(LTDC)

+/** @defgroup RCCEx_LTDC_Clock_Source LTDC Clock Source

+  * @{

+  */

+#define RCC_LTDCCLKSOURCE_PLLSAI2_DIV2  0x00000000U

+#define RCC_LTDCCLKSOURCE_PLLSAI2_DIV4  RCC_CCIPR2_PLLSAI2DIVR_0

+#define RCC_LTDCCLKSOURCE_PLLSAI2_DIV8  RCC_CCIPR2_PLLSAI2DIVR_1

+#define RCC_LTDCCLKSOURCE_PLLSAI2_DIV16 RCC_CCIPR2_PLLSAI2DIVR

+/**

+  * @}

+  */

+#endif /* LTDC */

+

+#if defined(DSI)

+/** @defgroup RCCEx_DSI_Clock_Source DSI Clock Source

+  * @{

+  */

+#define RCC_DSICLKSOURCE_DSIPHY        0x00000000U

+#define RCC_DSICLKSOURCE_PLLSAI2       RCC_CCIPR2_DSISEL

+/**

+  * @}

+  */

+#endif /* DSI */

+

+#if defined(OCTOSPI1) || defined(OCTOSPI2)

+/** @defgroup RCCEx_OSPI_Clock_Source OctoSPI Clock Source

+  * @{

+  */

+#define RCC_OSPICLKSOURCE_SYSCLK    0x00000000U

+#define RCC_OSPICLKSOURCE_MSI       RCC_CCIPR2_OSPISEL_0

+#define RCC_OSPICLKSOURCE_PLL       RCC_CCIPR2_OSPISEL_1

+/**

+  * @}

+  */

+#endif /* OCTOSPI1 || OCTOSPI2 */

+

+/** @defgroup RCCEx_EXTI_LINE_LSECSS  RCC LSE CSS external interrupt line

+  * @{

+  */

+#define RCC_EXTI_LINE_LSECSS           EXTI_IMR1_IM19        /*!< External interrupt line 19 connected to the LSE CSS EXTI Line */

+/**

+  * @}

+  */

+

+#if defined(CRS)

+

+/** @defgroup RCCEx_CRS_Status RCCEx CRS Status

+  * @{

+  */

+#define RCC_CRS_NONE                   0x00000000U

+#define RCC_CRS_TIMEOUT                0x00000001U

+#define RCC_CRS_SYNCOK                 0x00000002U

+#define RCC_CRS_SYNCWARN               0x00000004U

+#define RCC_CRS_SYNCERR                0x00000008U

+#define RCC_CRS_SYNCMISS               0x00000010U

+#define RCC_CRS_TRIMOVF                0x00000020U

+/**

+  * @}

+  */

+

+/** @defgroup RCCEx_CRS_SynchroSource RCCEx CRS SynchroSource

+  * @{

+  */

+#define RCC_CRS_SYNC_SOURCE_GPIO       0x00000000U             /*!< Synchro Signal source GPIO */

+#define RCC_CRS_SYNC_SOURCE_LSE        CRS_CFGR_SYNCSRC_0      /*!< Synchro Signal source LSE */

+#define RCC_CRS_SYNC_SOURCE_USB        CRS_CFGR_SYNCSRC_1      /*!< Synchro Signal source USB SOF (default)*/

+/**

+  * @}

+  */

+

+/** @defgroup RCCEx_CRS_SynchroDivider RCCEx CRS SynchroDivider

+  * @{

+  */

+#define RCC_CRS_SYNC_DIV1        0x00000000U                               /*!< Synchro Signal not divided (default) */

+#define RCC_CRS_SYNC_DIV2        CRS_CFGR_SYNCDIV_0                        /*!< Synchro Signal divided by 2 */

+#define RCC_CRS_SYNC_DIV4        CRS_CFGR_SYNCDIV_1                        /*!< Synchro Signal divided by 4 */

+#define RCC_CRS_SYNC_DIV8        (CRS_CFGR_SYNCDIV_1 | CRS_CFGR_SYNCDIV_0) /*!< Synchro Signal divided by 8 */

+#define RCC_CRS_SYNC_DIV16       CRS_CFGR_SYNCDIV_2                        /*!< Synchro Signal divided by 16 */

+#define RCC_CRS_SYNC_DIV32       (CRS_CFGR_SYNCDIV_2 | CRS_CFGR_SYNCDIV_0) /*!< Synchro Signal divided by 32 */

+#define RCC_CRS_SYNC_DIV64       (CRS_CFGR_SYNCDIV_2 | CRS_CFGR_SYNCDIV_1) /*!< Synchro Signal divided by 64 */

+#define RCC_CRS_SYNC_DIV128      CRS_CFGR_SYNCDIV                          /*!< Synchro Signal divided by 128 */

+/**

+  * @}

+  */

+

+/** @defgroup RCCEx_CRS_SynchroPolarity RCCEx CRS SynchroPolarity

+  * @{

+  */

+#define RCC_CRS_SYNC_POLARITY_RISING   0x00000000U         /*!< Synchro Active on rising edge (default) */

+#define RCC_CRS_SYNC_POLARITY_FALLING  CRS_CFGR_SYNCPOL    /*!< Synchro Active on falling edge */

+/**

+  * @}

+  */

+

+/** @defgroup RCCEx_CRS_ReloadValueDefault RCCEx CRS ReloadValueDefault

+  * @{

+  */

+#define RCC_CRS_RELOADVALUE_DEFAULT    0x0000BB7FU   /*!< The reset value of the RELOAD field corresponds

+                                                          to a target frequency of 48 MHz and a synchronization signal frequency of 1 kHz (SOF signal from USB). */

+/**

+  * @}

+  */

+

+/** @defgroup RCCEx_CRS_ErrorLimitDefault RCCEx CRS ErrorLimitDefault

+  * @{

+  */

+#define RCC_CRS_ERRORLIMIT_DEFAULT     0x00000022U   /*!< Default Frequency error limit */

+/**

+  * @}

+  */

+

+/** @defgroup RCCEx_CRS_HSI48CalibrationDefault RCCEx CRS HSI48CalibrationDefault

+  * @{

+  */

+#if defined(STM32L412xx) || defined(STM32L422xx)

+#define RCC_CRS_HSI48CALIBRATION_DEFAULT 0x00000040U /*!< The default value is 64, which corresponds to the middle of the trimming interval.

+                                                          The trimming step is specified in the product datasheet. A higher TRIM value

+                                                          corresponds to a higher output frequency */

+#else

+#define RCC_CRS_HSI48CALIBRATION_DEFAULT 0x00000020U /*!< The default value is 32, which corresponds to the middle of the trimming interval.

+                                                          The trimming step is specified in the product datasheet. A higher TRIM value

+                                                          corresponds to a higher output frequency */

+#endif

+/**

+  * @}

+  */

+

+/** @defgroup RCCEx_CRS_FreqErrorDirection RCCEx CRS FreqErrorDirection

+  * @{

+  */

+#define RCC_CRS_FREQERRORDIR_UP        0x00000000U   /*!< Upcounting direction, the actual frequency is above the target */

+#define RCC_CRS_FREQERRORDIR_DOWN      CRS_ISR_FEDIR /*!< Downcounting direction, the actual frequency is below the target */

+/**

+  * @}

+  */

+

+/** @defgroup RCCEx_CRS_Interrupt_Sources RCCEx CRS Interrupt Sources

+  * @{

+  */

+#define RCC_CRS_IT_SYNCOK              CRS_CR_SYNCOKIE       /*!< SYNC event OK */

+#define RCC_CRS_IT_SYNCWARN            CRS_CR_SYNCWARNIE     /*!< SYNC warning */

+#define RCC_CRS_IT_ERR                 CRS_CR_ERRIE          /*!< Error */

+#define RCC_CRS_IT_ESYNC               CRS_CR_ESYNCIE        /*!< Expected SYNC */

+#define RCC_CRS_IT_SYNCERR             CRS_CR_ERRIE          /*!< SYNC error */

+#define RCC_CRS_IT_SYNCMISS            CRS_CR_ERRIE          /*!< SYNC missed */

+#define RCC_CRS_IT_TRIMOVF             CRS_CR_ERRIE           /*!< Trimming overflow or underflow */

+

+/**

+  * @}

+  */

+

+/** @defgroup RCCEx_CRS_Flags RCCEx CRS Flags

+  * @{

+  */

+#define RCC_CRS_FLAG_SYNCOK            CRS_ISR_SYNCOKF       /*!< SYNC event OK flag     */

+#define RCC_CRS_FLAG_SYNCWARN          CRS_ISR_SYNCWARNF     /*!< SYNC warning flag      */

+#define RCC_CRS_FLAG_ERR               CRS_ISR_ERRF          /*!< Error flag        */

+#define RCC_CRS_FLAG_ESYNC             CRS_ISR_ESYNCF        /*!< Expected SYNC flag     */

+#define RCC_CRS_FLAG_SYNCERR           CRS_ISR_SYNCERR       /*!< SYNC error */

+#define RCC_CRS_FLAG_SYNCMISS          CRS_ISR_SYNCMISS      /*!< SYNC missed*/

+#define RCC_CRS_FLAG_TRIMOVF           CRS_ISR_TRIMOVF       /*!< Trimming overflow or underflow */

+

+/**

+  * @}

+  */

+

+#endif /* CRS */

+

+/**

+  * @}

+  */

+

+/* Exported macros -----------------------------------------------------------*/

+/** @defgroup RCCEx_Exported_Macros RCCEx Exported Macros

+ * @{

+ */

+

+#if defined(RCC_PLLSAI1_SUPPORT)

+

+/**

+  * @brief  Macro to configure the PLLSAI1 clock multiplication and division factors.

+  *

+  * @note   This function must be used only when the PLLSAI1 is disabled.

+  * @note   PLLSAI1 clock source is common with the main PLL (configured through

+  *         __HAL_RCC_PLL_CONFIG() macro)

+  *

+  @if STM32L4S9xx

+  * @param  __PLLSAI1M__ specifies the division factor of PLLSAI1 input clock.

+  *         This parameter must be a number between Min_Data = 1 and Max_Data = 16.

+  *

+  @endif

+  * @param  __PLLSAI1N__ specifies the multiplication factor for PLLSAI1 VCO output clock.

+  *         This parameter must be a number between 8 and 86.

+  * @note   You have to set the PLLSAI1N parameter correctly to ensure that the VCO

+  *         output frequency is between 64 and 344 MHz.

+  *         PLLSAI1 clock frequency = f(PLLSAI1) multiplied by PLLSAI1N

+  *

+  * @param  __PLLSAI1P__ specifies the division factor for SAI clock.

+  *         This parameter must be a number in the range (7 or 17) for STM32L47xxx/L48xxx

+  *         else (2 to 31).

+  *         SAI1 clock frequency = f(PLLSAI1) / PLLSAI1P

+  *

+  * @param  __PLLSAI1Q__ specifies the division factor for USB/RNG/SDMMC1 clock.

+  *         This parameter must be in the range (2, 4, 6 or 8).

+  *         USB/RNG/SDMMC1 clock frequency = f(PLLSAI1) / PLLSAI1Q

+  *

+  * @param  __PLLSAI1R__ specifies the division factor for SAR ADC clock.

+  *         This parameter must be in the range (2, 4, 6 or 8).

+  *         ADC clock frequency = f(PLLSAI1) / PLLSAI1R

+  *

+  * @retval None

+  */

+#if defined(RCC_PLLSAI1M_DIV_1_16_SUPPORT)

+

+#if defined(RCC_PLLSAI1P_DIV_2_31_SUPPORT)

+

+#define __HAL_RCC_PLLSAI1_CONFIG(__PLLSAI1M__, __PLLSAI1N__, __PLLSAI1P__, __PLLSAI1Q__, __PLLSAI1R__) \

+                  MODIFY_REG(RCC->PLLSAI1CFGR, \

+                             (RCC_PLLSAI1CFGR_PLLSAI1M | RCC_PLLSAI1CFGR_PLLSAI1N | RCC_PLLSAI1CFGR_PLLSAI1P | \

+                              RCC_PLLSAI1CFGR_PLLSAI1Q | RCC_PLLSAI1CFGR_PLLSAI1R | RCC_PLLSAI1CFGR_PLLSAI1PDIV), \

+                             ((((__PLLSAI1M__) - 1U) << RCC_PLLSAI1CFGR_PLLSAI1M_Pos) | \

+                              ((__PLLSAI1N__) << RCC_PLLSAI1CFGR_PLLSAI1N_Pos) | \

+                              ((((__PLLSAI1Q__) >> 1U) - 1U) << RCC_PLLSAI1CFGR_PLLSAI1Q_Pos) | \

+                              ((((__PLLSAI1R__) >> 1U) - 1U) << RCC_PLLSAI1CFGR_PLLSAI1R_Pos) | \

+                              ((uint32_t)(__PLLSAI1P__) << RCC_PLLSAI1CFGR_PLLSAI1PDIV_Pos)))

+

+#else

+

+#define __HAL_RCC_PLLSAI1_CONFIG(__PLLSAI1M__, __PLLSAI1N__, __PLLSAI1P__, __PLLSAI1Q__, __PLLSAI1R__) \

+                  MODIFY_REG(RCC->PLLSAI1CFGR, \

+                             (RCC_PLLSAI1CFGR_PLLSAI1M | RCC_PLLSAI1CFGR_PLLSAI1N | RCC_PLLSAI1CFGR_PLLSAI1P | \

+                              RCC_PLLSAI1CFGR_PLLSAI1Q | RCC_PLLSAI1CFGR_PLLSAI1R), \

+                             ((((__PLLSAI1M__) - 1U) << RCC_PLLSAI1CFGR_PLLSAI1M_Pos) | \

+                              ((__PLLSAI1N__) << RCC_PLLSAI1CFGR_PLLSAI1N_Pos) | \

+                              ((((__PLLSAI1Q__) >> 1U) - 1U) << RCC_PLLSAI1CFGR_PLLSAI1Q_Pos) | \

+                              ((((__PLLSAI1R__) >> 1U) - 1U) << RCC_PLLSAI1CFGR_PLLSAI1R_Pos) | \

+                              (((__PLLSAI1P__) >> 4U) << RCC_PLLSAI1CFGR_PLLSAI1P_Pos)))

+

+#endif /* RCC_PLLSAI1P_DIV_2_31_SUPPORT */

+

+#else

+

+#if defined(RCC_PLLSAI1P_DIV_2_31_SUPPORT)

+

+#define __HAL_RCC_PLLSAI1_CONFIG(__PLLSAI1N__, __PLLSAI1P__, __PLLSAI1Q__, __PLLSAI1R__) \

+                  MODIFY_REG(RCC->PLLSAI1CFGR, \

+                             (RCC_PLLSAI1CFGR_PLLSAI1N | RCC_PLLSAI1CFGR_PLLSAI1P | \

+                              RCC_PLLSAI1CFGR_PLLSAI1Q | RCC_PLLSAI1CFGR_PLLSAI1R | RCC_PLLSAI1CFGR_PLLSAI1PDIV), \

+                             (((__PLLSAI1N__) << RCC_PLLSAI1CFGR_PLLSAI1N_Pos) | \

+                              ((((__PLLSAI1Q__) >> 1U) - 1U) << RCC_PLLSAI1CFGR_PLLSAI1Q_Pos) | \

+                              ((((__PLLSAI1R__) >> 1U) - 1U) << RCC_PLLSAI1CFGR_PLLSAI1R_Pos) | \

+                              ((uint32_t)(__PLLSAI1P__) << RCC_PLLSAI1CFGR_PLLSAI1PDIV_Pos)))

+

+#else

+

+#define __HAL_RCC_PLLSAI1_CONFIG(__PLLSAI1N__, __PLLSAI1P__, __PLLSAI1Q__, __PLLSAI1R__) \

+                  MODIFY_REG(RCC->PLLSAI1CFGR, \

+                             (RCC_PLLSAI1CFGR_PLLSAI1N | RCC_PLLSAI1CFGR_PLLSAI1P | \

+                              RCC_PLLSAI1CFGR_PLLSAI1Q | RCC_PLLSAI1CFGR_PLLSAI1R), \

+                             (((__PLLSAI1N__) << RCC_PLLSAI1CFGR_PLLSAI1N_Pos) | \

+                              ((((__PLLSAI1Q__) >> 1U) - 1U) << RCC_PLLSAI1CFGR_PLLSAI1Q_Pos) | \

+                              ((((__PLLSAI1R__) >> 1U) - 1U) << RCC_PLLSAI1CFGR_PLLSAI1R_Pos) | \

+                              (((__PLLSAI1P__) >> 4U) << RCC_PLLSAI1CFGR_PLLSAI1P_Pos)))

+

+#endif /* RCC_PLLSAI1P_DIV_2_31_SUPPORT */

+

+#endif /* RCC_PLLSAI1M_DIV_1_16_SUPPORT */

+

+/**

+  * @brief  Macro to configure the PLLSAI1 clock multiplication factor N.

+  *

+  * @note   This function must be used only when the PLLSAI1 is disabled.

+  * @note   PLLSAI1 clock source is common with the main PLL (configured through

+  *         __HAL_RCC_PLL_CONFIG() macro)

+  *

+  * @param  __PLLSAI1N__ specifies the multiplication factor for PLLSAI1 VCO output clock.

+  *          This parameter must be a number between 8 and 86.

+  * @note   You have to set the PLLSAI1N parameter correctly to ensure that the VCO

+  *         output frequency is between 64 and 344 MHz.

+  *         Use to set PLLSAI1 clock frequency = f(PLLSAI1) multiplied by PLLSAI1N

+  *

+  * @retval None

+  */

+#define __HAL_RCC_PLLSAI1_MULN_CONFIG(__PLLSAI1N__) \

+                  MODIFY_REG(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1N, (__PLLSAI1N__) << RCC_PLLSAI1CFGR_PLLSAI1N_Pos)

+

+#if defined(RCC_PLLSAI1M_DIV_1_16_SUPPORT)

+

+/** @brief  Macro to configure the PLLSAI1 input clock division factor M.

+  *

+  * @note   This function must be used only when the PLLSAI1 is disabled.

+  * @note   PLLSAI1 clock source is common with the main PLL (configured through

+  *         __HAL_RCC_PLL_CONFIG() macro)

+  *

+  * @param  __PLLSAI1M__ specifies the division factor for PLLSAI1 clock.

+  *         This parameter must be a number between Min_Data = 1 and Max_Data = 16.

+  *

+  * @retval None

+  */

+

+#define __HAL_RCC_PLLSAI1_DIVM_CONFIG(__PLLSAI1M__) \

+                  MODIFY_REG(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1M, ((__PLLSAI1M__) - 1U) << RCC_PLLSAI1CFGR_PLLSAI1M_Pos)

+

+#endif /* RCC_PLLSAI1M_DIV_1_16_SUPPORT */

+

+/** @brief  Macro to configure the PLLSAI1 clock division factor P.

+  *

+  * @note   This function must be used only when the PLLSAI1 is disabled.

+  * @note   PLLSAI1 clock source is common with the main PLL (configured through

+  *         __HAL_RCC_PLL_CONFIG() macro)

+  *

+  * @param  __PLLSAI1P__ specifies the division factor for SAI clock.

+  *         This parameter must be a number in the range (7 or 17) for STM32L47xxx/L48xxx

+  *         else (2 to 31).

+  *         Use to set SAI1 clock frequency = f(PLLSAI1) / PLLSAI1P

+  *

+  * @retval None

+  */

+#if defined(RCC_PLLSAI1P_DIV_2_31_SUPPORT)

+

+#define __HAL_RCC_PLLSAI1_DIVP_CONFIG(__PLLSAI1P__) \

+                  MODIFY_REG(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1PDIV, (__PLLSAI1P__) << RCC_PLLSAI1CFGR_PLLSAI1PDIV_Pos)

+

+#else

+

+#define __HAL_RCC_PLLSAI1_DIVP_CONFIG(__PLLSAI1P__) \

+                  MODIFY_REG(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1P, ((__PLLSAI1P__) >> 4U) << RCC_PLLSAI1CFGR_PLLSAI1P_Pos)

+

+#endif /* RCC_PLLSAI1P_DIV_2_31_SUPPORT */

+

+/** @brief  Macro to configure the PLLSAI1 clock division factor Q.

+  *

+  * @note   This function must be used only when the PLLSAI1 is disabled.

+  * @note   PLLSAI1 clock source is common with the main PLL (configured through

+  *         __HAL_RCC_PLL_CONFIG() macro)

+  *

+  * @param  __PLLSAI1Q__ specifies the division factor for USB/RNG/SDMMC1 clock.

+  *         This parameter must be in the range (2, 4, 6 or 8).

+  *         Use to set USB/RNG/SDMMC1 clock frequency = f(PLLSAI1) / PLLSAI1Q

+  *

+  * @retval None

+  */

+#define __HAL_RCC_PLLSAI1_DIVQ_CONFIG(__PLLSAI1Q__) \

+                  MODIFY_REG(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1Q, (((__PLLSAI1Q__) >> 1U) - 1U) << RCC_PLLSAI1CFGR_PLLSAI1Q_Pos)

+

+/** @brief  Macro to configure the PLLSAI1 clock division factor R.

+  *

+  * @note   This function must be used only when the PLLSAI1 is disabled.

+  * @note   PLLSAI1 clock source is common with the main PLL (configured through

+  *         __HAL_RCC_PLL_CONFIG() macro)

+  *

+  * @param  __PLLSAI1R__ specifies the division factor for ADC clock.

+  *         This parameter must be in the range (2, 4, 6 or 8)

+  *         Use to set ADC clock frequency = f(PLLSAI1) / PLLSAI1R

+  *

+  * @retval None

+  */

+#define __HAL_RCC_PLLSAI1_DIVR_CONFIG(__PLLSAI1R__) \

+                  MODIFY_REG(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1R, (((__PLLSAI1R__) >> 1U) - 1U) << RCC_PLLSAI1CFGR_PLLSAI1R_Pos)

+

+/**

+  * @brief  Macros to enable or disable the PLLSAI1.

+  * @note   The PLLSAI1 is disabled by hardware when entering STOP and STANDBY modes.

+  * @retval None

+  */

+

+#define __HAL_RCC_PLLSAI1_ENABLE()  SET_BIT(RCC->CR, RCC_CR_PLLSAI1ON)

+

+#define __HAL_RCC_PLLSAI1_DISABLE() CLEAR_BIT(RCC->CR, RCC_CR_PLLSAI1ON)

+

+/**

+  * @brief  Macros to enable or disable each clock output (PLLSAI1_SAI1, PLLSAI1_USB2 and PLLSAI1_ADC1).

+  * @note   Enabling and disabling those clocks can be done without the need to stop the PLL.

+  *         This is mainly used to save Power.

+  * @param  __PLLSAI1_CLOCKOUT__ specifies the PLLSAI1 clock to be output.

+  *         This parameter can be one or a combination of the following values:

+  *            @arg @ref RCC_PLLSAI1_SAI1CLK  This clock is used to generate an accurate clock to achieve

+  *                                   high-quality audio performance on SAI interface in case.

+  *            @arg @ref RCC_PLLSAI1_48M2CLK  This clock is used to generate the clock for the USB OTG FS (48 MHz),

+  *                                   the random number generator (<=48 MHz) and the SDIO (<= 48 MHz).

+  *            @arg @ref RCC_PLLSAI1_ADC1CLK  Clock used to clock ADC peripheral.

+  * @retval None

+  */

+

+#define __HAL_RCC_PLLSAI1CLKOUT_ENABLE(__PLLSAI1_CLOCKOUT__)   SET_BIT(RCC->PLLSAI1CFGR, (__PLLSAI1_CLOCKOUT__))

+

+#define __HAL_RCC_PLLSAI1CLKOUT_DISABLE(__PLLSAI1_CLOCKOUT__)  CLEAR_BIT(RCC->PLLSAI1CFGR, (__PLLSAI1_CLOCKOUT__))

+

+/**

+  * @brief  Macro to get clock output enable status (PLLSAI1_SAI1, PLLSAI1_USB2 and PLLSAI1_ADC1).

+  * @param  __PLLSAI1_CLOCKOUT__ specifies the PLLSAI1 clock to be output.

+  *         This parameter can be one of the following values:

+  *            @arg @ref RCC_PLLSAI1_SAI1CLK  This clock is used to generate an accurate clock to achieve

+  *                                   high-quality audio performance on SAI interface in case.

+  *            @arg @ref RCC_PLLSAI1_48M2CLK  This clock is used to generate the clock for the USB OTG FS (48 MHz),

+  *                                   the random number generator (<=48 MHz) and the SDIO (<= 48 MHz).

+  *            @arg @ref RCC_PLLSAI1_ADC1CLK  Clock used to clock ADC peripheral.

+  * @retval SET / RESET

+  */

+#define __HAL_RCC_GET_PLLSAI1CLKOUT_CONFIG(__PLLSAI1_CLOCKOUT__)  READ_BIT(RCC->PLLSAI1CFGR, (__PLLSAI1_CLOCKOUT__))

+

+#endif /* RCC_PLLSAI1_SUPPORT */

+

+#if defined(RCC_PLLSAI2_SUPPORT)

+

+/**

+  * @brief  Macro to configure the PLLSAI2 clock multiplication and division factors.

+  *

+  * @note   This function must be used only when the PLLSAI2 is disabled.

+  * @note   PLLSAI2 clock source is common with the main PLL (configured through

+  *         __HAL_RCC_PLL_CONFIG() macro)

+  *

+  @if STM32L4S9xx

+  * @param  __PLLSAI2M__ specifies the division factor of PLLSAI2 input clock.

+  *         This parameter must be a number between Min_Data = 1 and Max_Data = 16.

+  *

+  @endif

+  * @param  __PLLSAI2N__ specifies the multiplication factor for PLLSAI2 VCO output clock.

+  *          This parameter must be a number between 8 and 86.

+  * @note   You have to set the PLLSAI2N parameter correctly to ensure that the VCO

+  *         output frequency is between 64 and 344 MHz.

+  *

+  * @param  __PLLSAI2P__ specifies the division factor for SAI clock.

+  *         This parameter must be a number in the range (7 or 17) for STM32L47xxx/L48xxx

+  *         else (2 to 31).

+  *         SAI2 clock frequency = f(PLLSAI2) / PLLSAI2P

+  *

+  @if STM32L4S9xx

+  * @param  __PLLSAI2Q__ specifies the division factor for DSI clock.

+  *         This parameter must be in the range (2, 4, 6 or 8).

+  *         DSI clock frequency = f(PLLSAI2) / PLLSAI2Q

+  *

+  @endif

+  * @param  __PLLSAI2R__ specifies the division factor for SAR ADC clock.

+  *         This parameter must be in the range (2, 4, 6 or 8).

+  *

+  * @retval None

+  */

+

+#if defined(RCC_PLLSAI2M_DIV_1_16_SUPPORT)

+

+# if defined(RCC_PLLSAI2P_DIV_2_31_SUPPORT) && defined(RCC_PLLSAI2Q_DIV_SUPPORT)

+

+#define __HAL_RCC_PLLSAI2_CONFIG(__PLLSAI2M__, __PLLSAI2N__, __PLLSAI2P__, __PLLSAI2Q__, __PLLSAI2R__) \

+                  MODIFY_REG(RCC->PLLSAI2CFGR, \

+                             (RCC_PLLSAI2CFGR_PLLSAI2M | RCC_PLLSAI2CFGR_PLLSAI2N | RCC_PLLSAI2CFGR_PLLSAI2P | \

+                              RCC_PLLSAI2CFGR_PLLSAI2Q | RCC_PLLSAI2CFGR_PLLSAI2R | RCC_PLLSAI2CFGR_PLLSAI2PDIV), \

+                             ((((__PLLSAI2M__) - 1U) << RCC_PLLSAI2CFGR_PLLSAI2M_Pos) | \

+                              ((__PLLSAI2N__) << RCC_PLLSAI2CFGR_PLLSAI2N_Pos) | \

+                              ((((__PLLSAI2Q__) >> 1U) - 1U) << RCC_PLLSAI2CFGR_PLLSAI2Q_Pos) | \

+                              ((((__PLLSAI2R__) >> 1U) - 1U) << RCC_PLLSAI2CFGR_PLLSAI2R_Pos) | \

+                              ((uint32_t)(__PLLSAI2P__) << RCC_PLLSAI2CFGR_PLLSAI2PDIV_Pos)))

+

+# elif defined(RCC_PLLSAI2P_DIV_2_31_SUPPORT)

+

+#define __HAL_RCC_PLLSAI2_CONFIG(__PLLSAI2M__, __PLLSAI2N__, __PLLSAI2P__, __PLLSAI2R__) \

+                  MODIFY_REG(RCC->PLLSAI2CFGR, \

+                             (RCC_PLLSAI2CFGR_PLLSAI2M | RCC_PLLSAI2CFGR_PLLSAI2N | RCC_PLLSAI2CFGR_PLLSAI2P | \

+                              RCC_PLLSAI2CFGR_PLLSAI2R | RCC_PLLSAI2CFGR_PLLSAI2PDIV), \

+                             ((((__PLLSAI2M__) - 1U) << RCC_PLLSAI2CFGR_PLLSAI2M_Pos) | \

+                              ((__PLLSAI2N__) << RCC_PLLSAI2CFGR_PLLSAI2N_Pos) | \

+                              ((((__PLLSAI2R__) >> 1U) - 1U) << RCC_PLLSAI2CFGR_PLLSAI2R_Pos) | \

+                              ((uint32_t)(__PLLSAI2P__) << RCC_PLLSAI2CFGR_PLLSAI2PDIV_Pos)))

+

+# else

+

+#define __HAL_RCC_PLLSAI2_CONFIG(__PLLSAI2M__, __PLLSAI2N__, __PLLSAI2P__, __PLLSAI2R__) \

+                  MODIFY_REG(RCC->PLLSAI2CFGR, \

+                             (RCC_PLLSAI2CFGR_PLLSAI2M | RCC_PLLSAI2CFGR_PLLSAI2N | RCC_PLLSAI2CFGR_PLLSAI2P | \

+                              RCC_PLLSAI2CFGR_PLLSAI2R), \

+                             ((((__PLLSAI2M__) - 1U) << RCC_PLLSAI2CFGR_PLLSAI2M_Pos) | \

+                              ((__PLLSAI2N__) << RCC_PLLSAI2CFGR_PLLSAI2N_Pos) | \

+                              ((((__PLLSAI2R__) >> 1U) - 1U) << RCC_PLLSAI2CFGR_PLLSAI2R_Pos) | \

+                              (((__PLLSAI2P__) >> 4U) << RCC_PLLSAI2CFGR_PLLSAI2P_Pos)))

+

+# endif /* RCC_PLLSAI2P_DIV_2_31_SUPPORT && RCC_PLLSAI2Q_DIV_SUPPORT */

+

+#else

+

+#  if defined(RCC_PLLSAI2P_DIV_2_31_SUPPORT) && defined(RCC_PLLSAI2Q_DIV_SUPPORT)

+

+#define __HAL_RCC_PLLSAI2_CONFIG(__PLLSAI2N__, __PLLSAI2P__, __PLLSAI2Q__, __PLLSAI2R__) \

+                  MODIFY_REG(RCC->PLLSAI2CFGR, \

+                             (RCC_PLLSAI2CFGR_PLLSAI2N | RCC_PLLSAI2CFGR_PLLSAI2P | \

+                              RCC_PLLSAI2CFGR_PLLSAI2Q | RCC_PLLSAI2CFGR_PLLSAI2R | RCC_PLLSAI2CFGR_PLLSAI2PDIV), \

+                             (((__PLLSAI2N__) << RCC_PLLSAI2CFGR_PLLSAI2N_Pos) | \

+                              ((((__PLLSAI2Q__) >> 1U) - 1U) << RCC_PLLSAI2CFGR_PLLSAI2Q_Pos) | \

+                              ((((__PLLSAI2R__) >> 1U) - 1U) << RCC_PLLSAI2CFGR_PLLSAI2R_Pos) | \

+                              ((uint32_t)(__PLLSAI2P__) << RCC_PLLSAI2CFGR_PLLSAI2PDIV_Pos)))

+

+# elif defined(RCC_PLLSAI2P_DIV_2_31_SUPPORT)

+

+#define __HAL_RCC_PLLSAI2_CONFIG(__PLLSAI2N__, __PLLSAI2P__, __PLLSAI2R__) \

+                  MODIFY_REG(RCC->PLLSAI2CFGR, \

+                             (RCC_PLLSAI2CFGR_PLLSAI2N | RCC_PLLSAI2CFGR_PLLSAI2P | \

+                              RCC_PLLSAI2CFGR_PLLSAI2R | RCC_PLLSAI2CFGR_PLLSAI2PDIV), \

+                             (((__PLLSAI2N__) << RCC_PLLSAI2CFGR_PLLSAI2N_Pos) | \

+                              ((((__PLLSAI2R__) >> 1U) - 1U) << RCC_PLLSAI2CFGR_PLLSAI2R_Pos) | \

+                              ((uint32_t)(__PLLSAI2P__) << RCC_PLLSAI2CFGR_PLLSAI2PDIV_Pos)))

+

+# else

+

+#define __HAL_RCC_PLLSAI2_CONFIG(__PLLSAI2N__, __PLLSAI2P__, __PLLSAI2R__) \

+                  MODIFY_REG(RCC->PLLSAI2CFGR, \

+                             (RCC_PLLSAI2CFGR_PLLSAI2N | RCC_PLLSAI2CFGR_PLLSAI2P | \

+                              RCC_PLLSAI2CFGR_PLLSAI2R), \

+                             (((__PLLSAI2N__) << RCC_PLLSAI2CFGR_PLLSAI2N_Pos) | \

+                              ((((__PLLSAI2R__) >> 1U) - 1U) << RCC_PLLSAI2CFGR_PLLSAI2R_Pos) | \

+                              (((__PLLSAI2P__) >> 4U) << RCC_PLLSAI2CFGR_PLLSAI2P_Pos)))

+

+# endif /* RCC_PLLSAI2P_DIV_2_31_SUPPORT && RCC_PLLSAI2Q_DIV_SUPPORT */

+

+#endif /* RCC_PLLSAI2M_DIV_1_16_SUPPORT */

+

+

+/**

+  * @brief  Macro to configure the PLLSAI2 clock multiplication factor N.

+  *

+  * @note   This function must be used only when the PLLSAI2 is disabled.

+  * @note   PLLSAI2 clock source is common with the main PLL (configured through

+  *         __HAL_RCC_PLL_CONFIG() macro)

+  *

+  * @param  __PLLSAI2N__ specifies the multiplication factor for PLLSAI2 VCO output clock.

+  *          This parameter must be a number between 8 and 86.

+  * @note   You have to set the PLLSAI2N parameter correctly to ensure that the VCO

+  *         output frequency is between 64 and 344 MHz.

+  *         PLLSAI1 clock frequency = f(PLLSAI1) multiplied by PLLSAI2N

+  *

+  * @retval None

+  */

+#define __HAL_RCC_PLLSAI2_MULN_CONFIG(__PLLSAI2N__) \

+                  MODIFY_REG(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2N, (__PLLSAI2N__) << RCC_PLLSAI2CFGR_PLLSAI2N_Pos)

+

+#if defined(RCC_PLLSAI2M_DIV_1_16_SUPPORT)

+

+/** @brief  Macro to configure the PLLSAI2 input clock division factor M.

+  *

+  * @note   This function must be used only when the PLLSAI2 is disabled.

+  * @note   PLLSAI2 clock source is common with the main PLL (configured through

+  *         __HAL_RCC_PLL_CONFIG() macro)

+  *

+  * @param  __PLLSAI2M__ specifies the division factor for PLLSAI2 clock.

+  *         This parameter must be a number between Min_Data = 1 and Max_Data = 16.

+  *

+  * @retval None

+  */

+

+#define __HAL_RCC_PLLSAI2_DIVM_CONFIG(__PLLSAI2M__) \

+                  MODIFY_REG(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2M,  ((__PLLSAI2M__) - 1U) << RCC_PLLSAI2CFGR_PLLSAI2M_Pos)

+

+#endif /* RCC_PLLSAI2M_DIV_1_16_SUPPORT */

+

+/** @brief  Macro to configure the PLLSAI2 clock division factor P.

+  *

+  * @note   This function must be used only when the PLLSAI2 is disabled.

+  * @note   PLLSAI2 clock source is common with the main PLL (configured through

+  *         __HAL_RCC_PLL_CONFIG() macro)

+  *

+  * @param  __PLLSAI2P__ specifies the division factor.

+  *         This parameter must be a number in the range (7 or 17).

+  *         Use to set SAI2 clock frequency = f(PLLSAI2) / __PLLSAI2P__

+  *

+  * @retval None

+  */

+#define __HAL_RCC_PLLSAI2_DIVP_CONFIG(__PLLSAI2P__) \

+                  MODIFY_REG(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2P, ((__PLLSAI2P__) >> 4U) << RCC_PLLSAI2CFGR_PLLSAI2P_Pos)

+

+#if defined(RCC_PLLSAI2Q_DIV_SUPPORT)

+

+/** @brief  Macro to configure the PLLSAI2 clock division factor Q.

+  *

+  * @note   This function must be used only when the PLLSAI2 is disabled.

+  * @note   PLLSAI2 clock source is common with the main PLL (configured through

+  *         __HAL_RCC_PLL_CONFIG() macro)

+  *

+  * @param  __PLLSAI2Q__ specifies the division factor for USB/RNG/SDMMC1 clock.

+  *         This parameter must be in the range (2, 4, 6 or 8).

+  *         Use to set USB/RNG/SDMMC1 clock frequency = f(PLLSAI2) / PLLSAI2Q

+  *

+  * @retval None

+  */

+#define __HAL_RCC_PLLSAI2_DIVQ_CONFIG(__PLLSAI2Q__) \

+                  MODIFY_REG(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2Q, (((__PLLSAI2Q__) >> 1U) - 1U) << RCC_PLLSAI2CFGR_PLLSAI2Q_Pos)

+

+#endif /* RCC_PLLSAI2Q_DIV_SUPPORT */

+

+/** @brief  Macro to configure the PLLSAI2 clock division factor R.

+  *

+  * @note   This function must be used only when the PLLSAI2 is disabled.

+  * @note   PLLSAI2 clock source is common with the main PLL (configured through

+  *         __HAL_RCC_PLL_CONFIG() macro)

+  *

+  * @param  __PLLSAI2R__ specifies the division factor.

+  *         This parameter must be in the range (2, 4, 6 or 8).

+  *         Use to set ADC clock frequency = f(PLLSAI2) / __PLLSAI2R__

+  *

+  * @retval None

+  */

+#define __HAL_RCC_PLLSAI2_DIVR_CONFIG(__PLLSAI2R__) \

+                  MODIFY_REG(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2R, (((__PLLSAI2R__) >> 1U) - 1U) << RCC_PLLSAI2CFGR_PLLSAI2R_Pos)

+

+/**

+  * @brief  Macros to enable or disable the PLLSAI2.

+  * @note   The PLLSAI2 is disabled by hardware when entering STOP and STANDBY modes.

+  * @retval None

+  */

+

+#define __HAL_RCC_PLLSAI2_ENABLE()  SET_BIT(RCC->CR, RCC_CR_PLLSAI2ON)

+

+#define __HAL_RCC_PLLSAI2_DISABLE() CLEAR_BIT(RCC->CR, RCC_CR_PLLSAI2ON)

+

+/**

+  * @brief  Macros to enable or disable each clock output (PLLSAI2_SAI2, PLLSAI2_ADC2 and RCC_PLLSAI2_DSICLK).

+  * @note   Enabling and disabling those clocks can be done without the need to stop the PLL.

+  *         This is mainly used to save Power.

+  * @param  __PLLSAI2_CLOCKOUT__ specifies the PLLSAI2 clock to be output.

+  *         This parameter can be one or a combination of the following values:

+  @if STM32L486xx

+  *            @arg @ref RCC_PLLSAI2_SAI2CLK  This clock is used to generate an accurate clock to achieve

+  *                                           high-quality audio performance on SAI interface in case.

+  *            @arg @ref RCC_PLLSAI2_ADC2CLK  Clock used to clock ADC peripheral.

+  @endif

+  @if STM32L4A6xx

+  *            @arg @ref RCC_PLLSAI2_SAI2CLK  This clock is used to generate an accurate clock to achieve

+  *                                           high-quality audio performance on SAI interface in case.

+  *            @arg @ref RCC_PLLSAI2_ADC2CLK  Clock used to clock ADC peripheral.

+  @endif

+  @if STM32L4S9xx

+  *            @arg @ref RCC_PLLSAI2_SAI2CLK  This clock is used to generate an accurate clock to achieve

+  *                                           high-quality audio performance on SAI interface in case.

+  *            @arg @ref RCC_PLLSAI2_DSICLK   Clock used to clock DSI peripheral.

+  @endif

+  * @retval None

+  */

+

+#define __HAL_RCC_PLLSAI2CLKOUT_ENABLE(__PLLSAI2_CLOCKOUT__)  SET_BIT(RCC->PLLSAI2CFGR, (__PLLSAI2_CLOCKOUT__))

+

+#define __HAL_RCC_PLLSAI2CLKOUT_DISABLE(__PLLSAI2_CLOCKOUT__) CLEAR_BIT(RCC->PLLSAI2CFGR, (__PLLSAI2_CLOCKOUT__))

+

+/**

+  * @brief  Macro to get clock output enable status (PLLSAI2_SAI2, PLLSAI2_ADC2 and RCC_PLLSAI2_DSICLK).

+  * @param  __PLLSAI2_CLOCKOUT__ specifies the PLLSAI2 clock to be output.

+  *          This parameter can be one of the following values:

+  @if STM32L486xx

+  *            @arg @ref RCC_PLLSAI2_SAI2CLK  This clock is used to generate an accurate clock to achieve

+  *                                           high-quality audio performance on SAI interface in case.

+  *            @arg @ref RCC_PLLSAI2_ADC2CLK  Clock used to clock ADC peripheral.

+  @endif

+  @if STM32L4A6xx

+  *            @arg @ref RCC_PLLSAI2_SAI2CLK  This clock is used to generate an accurate clock to achieve

+  *                                           high-quality audio performance on SAI interface in case.

+  *            @arg @ref RCC_PLLSAI2_ADC2CLK  Clock used to clock ADC peripheral.

+  @endif

+  @if STM32L4S9xx

+  *            @arg @ref RCC_PLLSAI2_SAI2CLK  This clock is used to generate an accurate clock to achieve

+  *                                           high-quality audio performance on SAI interface in case.

+  *            @arg @ref RCC_PLLSAI2_DSICLK   Clock used to clock DSI peripheral.

+  @endif

+  * @retval SET / RESET

+  */

+#define __HAL_RCC_GET_PLLSAI2CLKOUT_CONFIG(__PLLSAI2_CLOCKOUT__)  READ_BIT(RCC->PLLSAI2CFGR, (__PLLSAI2_CLOCKOUT__))

+

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+#if defined(SAI1)

+

+/**

+  * @brief  Macro to configure the SAI1 clock source.

+  * @param  __SAI1_CLKSOURCE__ defines the SAI1 clock source. This clock is derived

+  *         from the PLLSAI1, system PLL or external clock (through a dedicated pin).

+  *          This parameter can be one of the following values:

+  *             @arg @ref RCC_SAI1CLKSOURCE_PLLSAI1  SAI1 clock = PLLSAI1 "P" clock (PLLSAI1CLK)

+  @if STM32L486xx

+  *             @arg @ref RCC_SAI1CLKSOURCE_PLLSAI2  SAI1 clock = PLLSAI2 "P" clock (PLLSAI2CLK) for devices with PLLSAI2

+  @endif

+  *             @arg @ref RCC_SAI1CLKSOURCE_PLL  SAI1 clock  = PLL "P" clock (PLLSAI3CLK if PLLSAI2 exists, else PLLSAI2CLK)

+  *             @arg @ref RCC_SAI1CLKSOURCE_PIN  SAI1 clock = External Clock (SAI1_EXTCLK)

+  @if STM32L4S9xx

+  *             @arg @ref RCC_SAI1CLKSOURCE_HSI  SAI1 clock = HSI16

+  @endif

+  *

+  @if STM32L443xx

+  * @note  HSI16 is automatically set as SAI1 clock source when PLL are disabled for devices without PLLSAI2.

+  @endif

+  *

+  * @retval None

+  */

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+#define __HAL_RCC_SAI1_CONFIG(__SAI1_CLKSOURCE__)\

+                  MODIFY_REG(RCC->CCIPR2, RCC_CCIPR2_SAI1SEL, (__SAI1_CLKSOURCE__))

+#else

+#define __HAL_RCC_SAI1_CONFIG(__SAI1_CLKSOURCE__)\

+                  MODIFY_REG(RCC->CCIPR, RCC_CCIPR_SAI1SEL, (__SAI1_CLKSOURCE__))

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+/** @brief  Macro to get the SAI1 clock source.

+  * @retval The clock source can be one of the following values:

+  *             @arg @ref RCC_SAI1CLKSOURCE_PLLSAI1  SAI1 clock = PLLSAI1 "P" clock (PLLSAI1CLK)

+  @if STM32L486xx

+  *             @arg @ref RCC_SAI1CLKSOURCE_PLLSAI2  SAI1 clock = PLLSAI2 "P" clock (PLLSAI2CLK) for devices with PLLSAI2

+  @endif

+  *             @arg @ref RCC_SAI1CLKSOURCE_PLL  SAI1 clock  = PLL "P" clock (PLLSAI3CLK if PLLSAI2 exists, else PLLSAI2CLK)

+  *             @arg @ref RCC_SAI1CLKSOURCE_PIN  SAI1 clock = External Clock (SAI1_EXTCLK)

+  *

+  * @note  Despite returned values RCC_SAI1CLKSOURCE_PLLSAI1 or RCC_SAI1CLKSOURCE_PLL, HSI16 is automatically set as SAI1

+  *        clock source when PLLs are disabled for devices without PLLSAI2.

+  *

+  */

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+#define __HAL_RCC_GET_SAI1_SOURCE() (READ_BIT(RCC->CCIPR2, RCC_CCIPR2_SAI1SEL))

+#else

+#define __HAL_RCC_GET_SAI1_SOURCE() (READ_BIT(RCC->CCIPR, RCC_CCIPR_SAI1SEL))

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+#endif /* SAI1 */

+

+#if defined(SAI2)

+

+/**

+  * @brief  Macro to configure the SAI2 clock source.

+  * @param  __SAI2_CLKSOURCE__ defines the SAI2 clock source. This clock is derived

+  *         from the PLLSAI2, system PLL or external clock (through a dedicated pin).

+  *          This parameter can be one of the following values:

+  *             @arg @ref RCC_SAI2CLKSOURCE_PLLSAI1  SAI2 clock = PLLSAI1 "P" clock (PLLSAI1CLK)

+  *             @arg @ref RCC_SAI2CLKSOURCE_PLLSAI2  SAI2 clock = PLLSAI2 "P" clock (PLLSAI2CLK)

+  *             @arg @ref RCC_SAI2CLKSOURCE_PLL  SAI2 clock  = PLL "P" clock (PLLSAI3CLK)

+  *             @arg @ref RCC_SAI2CLKSOURCE_PIN  SAI2 clock = External Clock (SAI2_EXTCLK)

+  @if STM32L4S9xx

+  *             @arg @ref RCC_SAI2CLKSOURCE_HSI  SAI2 clock = HSI16

+  @endif

+  *

+  * @retval None

+  */

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+#define __HAL_RCC_SAI2_CONFIG(__SAI2_CLKSOURCE__ )\

+                  MODIFY_REG(RCC->CCIPR2, RCC_CCIPR2_SAI2SEL, (__SAI2_CLKSOURCE__))

+#else

+#define __HAL_RCC_SAI2_CONFIG(__SAI2_CLKSOURCE__ )\

+                  MODIFY_REG(RCC->CCIPR, RCC_CCIPR_SAI2SEL, (__SAI2_CLKSOURCE__))

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+/** @brief  Macro to get the SAI2 clock source.

+  * @retval The clock source can be one of the following values:

+  *             @arg @ref RCC_SAI2CLKSOURCE_PLLSAI1  SAI2 clock = PLLSAI1 "P" clock (PLLSAI1CLK)

+  *             @arg @ref RCC_SAI2CLKSOURCE_PLLSAI2  SAI2 clock = PLLSAI2 "P" clock (PLLSAI2CLK)

+  *             @arg @ref RCC_SAI2CLKSOURCE_PLL  SAI2 clock  = PLL "P" clock (PLLSAI3CLK)

+  *             @arg @ref RCC_SAI2CLKSOURCE_PIN  SAI2 clock = External Clock (SAI2_EXTCLK)

+  */

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+#define __HAL_RCC_GET_SAI2_SOURCE() (READ_BIT(RCC->CCIPR2, RCC_CCIPR2_SAI2SEL))

+#else

+#define __HAL_RCC_GET_SAI2_SOURCE() (READ_BIT(RCC->CCIPR, RCC_CCIPR_SAI2SEL))

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+#endif /* SAI2 */

+

+/** @brief  Macro to configure the I2C1 clock (I2C1CLK).

+  *

+  * @param  __I2C1_CLKSOURCE__ specifies the I2C1 clock source.

+  *          This parameter can be one of the following values:

+  *            @arg @ref RCC_I2C1CLKSOURCE_PCLK1  PCLK1 selected as I2C1 clock

+  *            @arg @ref RCC_I2C1CLKSOURCE_HSI  HSI selected as I2C1 clock

+  *            @arg @ref RCC_I2C1CLKSOURCE_SYSCLK  System Clock selected as I2C1 clock

+  * @retval None

+  */

+#define __HAL_RCC_I2C1_CONFIG(__I2C1_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR, RCC_CCIPR_I2C1SEL, (__I2C1_CLKSOURCE__))

+

+/** @brief  Macro to get the I2C1 clock source.

+  * @retval The clock source can be one of the following values:

+  *            @arg @ref RCC_I2C1CLKSOURCE_PCLK1  PCLK1 selected as I2C1 clock

+  *            @arg @ref RCC_I2C1CLKSOURCE_HSI  HSI selected as I2C1 clock

+  *            @arg @ref RCC_I2C1CLKSOURCE_SYSCLK  System Clock selected as I2C1 clock

+  */

+#define __HAL_RCC_GET_I2C1_SOURCE() (READ_BIT(RCC->CCIPR, RCC_CCIPR_I2C1SEL))

+

+#if defined(I2C2)

+

+/** @brief  Macro to configure the I2C2 clock (I2C2CLK).

+  *

+  * @param  __I2C2_CLKSOURCE__ specifies the I2C2 clock source.

+  *          This parameter can be one of the following values:

+  *            @arg @ref RCC_I2C2CLKSOURCE_PCLK1  PCLK1 selected as I2C2 clock

+  *            @arg @ref RCC_I2C2CLKSOURCE_HSI  HSI selected as I2C2 clock

+  *            @arg @ref RCC_I2C2CLKSOURCE_SYSCLK  System Clock selected as I2C2 clock

+  * @retval None

+  */

+#define __HAL_RCC_I2C2_CONFIG(__I2C2_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR, RCC_CCIPR_I2C2SEL, (__I2C2_CLKSOURCE__))

+

+/** @brief  Macro to get the I2C2 clock source.

+  * @retval The clock source can be one of the following values:

+  *            @arg @ref RCC_I2C2CLKSOURCE_PCLK1  PCLK1 selected as I2C2 clock

+  *            @arg @ref RCC_I2C2CLKSOURCE_HSI  HSI selected as I2C2 clock

+  *            @arg @ref RCC_I2C2CLKSOURCE_SYSCLK  System Clock selected as I2C2 clock

+  */

+#define __HAL_RCC_GET_I2C2_SOURCE() (READ_BIT(RCC->CCIPR, RCC_CCIPR_I2C2SEL))

+

+#endif /* I2C2 */

+

+/** @brief  Macro to configure the I2C3 clock (I2C3CLK).

+  *

+  * @param  __I2C3_CLKSOURCE__ specifies the I2C3 clock source.

+  *          This parameter can be one of the following values:

+  *            @arg @ref RCC_I2C3CLKSOURCE_PCLK1  PCLK1 selected as I2C3 clock

+  *            @arg @ref RCC_I2C3CLKSOURCE_HSI  HSI selected as I2C3 clock

+  *            @arg @ref RCC_I2C3CLKSOURCE_SYSCLK  System Clock selected as I2C3 clock

+  * @retval None

+  */

+#define __HAL_RCC_I2C3_CONFIG(__I2C3_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR, RCC_CCIPR_I2C3SEL, (__I2C3_CLKSOURCE__))

+

+/** @brief  Macro to get the I2C3 clock source.

+  * @retval The clock source can be one of the following values:

+  *            @arg @ref RCC_I2C3CLKSOURCE_PCLK1  PCLK1 selected as I2C3 clock

+  *            @arg @ref RCC_I2C3CLKSOURCE_HSI  HSI selected as I2C3 clock

+  *            @arg @ref RCC_I2C3CLKSOURCE_SYSCLK  System Clock selected as I2C3 clock

+  */

+#define __HAL_RCC_GET_I2C3_SOURCE() (READ_BIT(RCC->CCIPR, RCC_CCIPR_I2C3SEL))

+

+#if defined(I2C4)

+

+/** @brief  Macro to configure the I2C4 clock (I2C4CLK).

+  *

+  * @param  __I2C4_CLKSOURCE__ specifies the I2C4 clock source.

+  *          This parameter can be one of the following values:

+  *            @arg @ref RCC_I2C4CLKSOURCE_PCLK1  PCLK1 selected as I2C4 clock

+  *            @arg @ref RCC_I2C4CLKSOURCE_HSI  HSI selected as I2C4 clock

+  *            @arg @ref RCC_I2C4CLKSOURCE_SYSCLK  System Clock selected as I2C4 clock

+  * @retval None

+  */

+#define __HAL_RCC_I2C4_CONFIG(__I2C4_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR2, RCC_CCIPR2_I2C4SEL, (__I2C4_CLKSOURCE__))

+

+/** @brief  Macro to get the I2C4 clock source.

+  * @retval The clock source can be one of the following values:

+  *            @arg @ref RCC_I2C4CLKSOURCE_PCLK1  PCLK1 selected as I2C4 clock

+  *            @arg @ref RCC_I2C4CLKSOURCE_HSI  HSI selected as I2C4 clock

+  *            @arg @ref RCC_I2C4CLKSOURCE_SYSCLK  System Clock selected as I2C4 clock

+  */

+#define __HAL_RCC_GET_I2C4_SOURCE() (READ_BIT(RCC->CCIPR2, RCC_CCIPR2_I2C4SEL))

+

+#endif /* I2C4 */

+

+

+/** @brief  Macro to configure the USART1 clock (USART1CLK).

+  *

+  * @param  __USART1_CLKSOURCE__ specifies the USART1 clock source.

+  *          This parameter can be one of the following values:

+  *            @arg @ref RCC_USART1CLKSOURCE_PCLK2  PCLK2 selected as USART1 clock

+  *            @arg @ref RCC_USART1CLKSOURCE_HSI  HSI selected as USART1 clock

+  *            @arg @ref RCC_USART1CLKSOURCE_SYSCLK  System Clock selected as USART1 clock

+  *            @arg @ref RCC_USART1CLKSOURCE_LSE  SE selected as USART1 clock

+  * @retval None

+  */

+#define __HAL_RCC_USART1_CONFIG(__USART1_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR, RCC_CCIPR_USART1SEL, (__USART1_CLKSOURCE__))

+

+/** @brief  Macro to get the USART1 clock source.

+  * @retval The clock source can be one of the following values:

+  *            @arg @ref RCC_USART1CLKSOURCE_PCLK2  PCLK2 selected as USART1 clock

+  *            @arg @ref RCC_USART1CLKSOURCE_HSI  HSI selected as USART1 clock

+  *            @arg @ref RCC_USART1CLKSOURCE_SYSCLK  System Clock selected as USART1 clock

+  *            @arg @ref RCC_USART1CLKSOURCE_LSE  LSE selected as USART1 clock

+  */

+#define __HAL_RCC_GET_USART1_SOURCE() (READ_BIT(RCC->CCIPR, RCC_CCIPR_USART1SEL))

+

+/** @brief  Macro to configure the USART2 clock (USART2CLK).

+  *

+  * @param  __USART2_CLKSOURCE__ specifies the USART2 clock source.

+  *          This parameter can be one of the following values:

+  *            @arg @ref RCC_USART2CLKSOURCE_PCLK1  PCLK1 selected as USART2 clock

+  *            @arg @ref RCC_USART2CLKSOURCE_HSI  HSI selected as USART2 clock

+  *            @arg @ref RCC_USART2CLKSOURCE_SYSCLK  System Clock selected as USART2 clock

+  *            @arg @ref RCC_USART2CLKSOURCE_LSE  LSE selected as USART2 clock

+  * @retval None

+  */

+#define __HAL_RCC_USART2_CONFIG(__USART2_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR, RCC_CCIPR_USART2SEL, (__USART2_CLKSOURCE__))

+

+/** @brief  Macro to get the USART2 clock source.

+  * @retval The clock source can be one of the following values:

+  *            @arg @ref RCC_USART2CLKSOURCE_PCLK1  PCLK1 selected as USART2 clock

+  *            @arg @ref RCC_USART2CLKSOURCE_HSI  HSI selected as USART2 clock

+  *            @arg @ref RCC_USART2CLKSOURCE_SYSCLK  System Clock selected as USART2 clock

+  *            @arg @ref RCC_USART2CLKSOURCE_LSE  LSE selected as USART2 clock

+  */

+#define __HAL_RCC_GET_USART2_SOURCE() (READ_BIT(RCC->CCIPR, RCC_CCIPR_USART2SEL))

+

+#if defined(USART3)

+

+/** @brief  Macro to configure the USART3 clock (USART3CLK).

+  *

+  * @param  __USART3_CLKSOURCE__ specifies the USART3 clock source.

+  *          This parameter can be one of the following values:

+  *            @arg @ref RCC_USART3CLKSOURCE_PCLK1  PCLK1 selected as USART3 clock

+  *            @arg @ref RCC_USART3CLKSOURCE_HSI  HSI selected as USART3 clock

+  *            @arg @ref RCC_USART3CLKSOURCE_SYSCLK  System Clock selected as USART3 clock

+  *            @arg @ref RCC_USART3CLKSOURCE_LSE  LSE selected as USART3 clock

+  * @retval None

+  */

+#define __HAL_RCC_USART3_CONFIG(__USART3_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR, RCC_CCIPR_USART3SEL, (__USART3_CLKSOURCE__))

+

+/** @brief  Macro to get the USART3 clock source.

+  * @retval The clock source can be one of the following values:

+  *            @arg @ref RCC_USART3CLKSOURCE_PCLK1  PCLK1 selected as USART3 clock

+  *            @arg @ref RCC_USART3CLKSOURCE_HSI  HSI selected as USART3 clock

+  *            @arg @ref RCC_USART3CLKSOURCE_SYSCLK  System Clock selected as USART3 clock

+  *            @arg @ref RCC_USART3CLKSOURCE_LSE  LSE selected as USART3 clock

+  */

+#define __HAL_RCC_GET_USART3_SOURCE() (READ_BIT(RCC->CCIPR, RCC_CCIPR_USART3SEL))

+

+#endif /* USART3 */

+

+#if defined(UART4)

+

+/** @brief  Macro to configure the UART4 clock (UART4CLK).

+  *

+  * @param  __UART4_CLKSOURCE__ specifies the UART4 clock source.

+  *          This parameter can be one of the following values:

+  *            @arg @ref RCC_UART4CLKSOURCE_PCLK1  PCLK1 selected as UART4 clock

+  *            @arg @ref RCC_UART4CLKSOURCE_HSI  HSI selected as UART4 clock

+  *            @arg @ref RCC_UART4CLKSOURCE_SYSCLK  System Clock selected as UART4 clock

+  *            @arg @ref RCC_UART4CLKSOURCE_LSE  LSE selected as UART4 clock

+  * @retval None

+  */

+#define __HAL_RCC_UART4_CONFIG(__UART4_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR, RCC_CCIPR_UART4SEL, (__UART4_CLKSOURCE__))

+

+/** @brief  Macro to get the UART4 clock source.

+  * @retval The clock source can be one of the following values:

+  *            @arg @ref RCC_UART4CLKSOURCE_PCLK1  PCLK1 selected as UART4 clock

+  *            @arg @ref RCC_UART4CLKSOURCE_HSI  HSI selected as UART4 clock

+  *            @arg @ref RCC_UART4CLKSOURCE_SYSCLK  System Clock selected as UART4 clock

+  *            @arg @ref RCC_UART4CLKSOURCE_LSE  LSE selected as UART4 clock

+  */

+#define __HAL_RCC_GET_UART4_SOURCE() (READ_BIT(RCC->CCIPR, RCC_CCIPR_UART4SEL))

+

+#endif /* UART4 */

+

+#if defined(UART5)

+

+/** @brief  Macro to configure the UART5 clock (UART5CLK).

+  *

+  * @param  __UART5_CLKSOURCE__ specifies the UART5 clock source.

+  *          This parameter can be one of the following values:

+  *            @arg @ref RCC_UART5CLKSOURCE_PCLK1  PCLK1 selected as UART5 clock

+  *            @arg @ref RCC_UART5CLKSOURCE_HSI  HSI selected as UART5 clock

+  *            @arg @ref RCC_UART5CLKSOURCE_SYSCLK  System Clock selected as UART5 clock

+  *            @arg @ref RCC_UART5CLKSOURCE_LSE  LSE selected as UART5 clock

+  * @retval None

+  */

+#define __HAL_RCC_UART5_CONFIG(__UART5_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR, RCC_CCIPR_UART5SEL, (__UART5_CLKSOURCE__))

+

+/** @brief  Macro to get the UART5 clock source.

+  * @retval The clock source can be one of the following values:

+  *            @arg @ref RCC_UART5CLKSOURCE_PCLK1  PCLK1 selected as UART5 clock

+  *            @arg @ref RCC_UART5CLKSOURCE_HSI  HSI selected as UART5 clock

+  *            @arg @ref RCC_UART5CLKSOURCE_SYSCLK  System Clock selected as UART5 clock

+  *            @arg @ref RCC_UART5CLKSOURCE_LSE  LSE selected as UART5 clock

+  */

+#define __HAL_RCC_GET_UART5_SOURCE() (READ_BIT(RCC->CCIPR, RCC_CCIPR_UART5SEL))

+

+#endif /* UART5 */

+

+/** @brief  Macro to configure the LPUART1 clock (LPUART1CLK).

+  *

+  * @param  __LPUART1_CLKSOURCE__ specifies the LPUART1 clock source.

+  *          This parameter can be one of the following values:

+  *            @arg @ref RCC_LPUART1CLKSOURCE_PCLK1  PCLK1 selected as LPUART1 clock

+  *            @arg @ref RCC_LPUART1CLKSOURCE_HSI  HSI selected as LPUART1 clock

+  *            @arg @ref RCC_LPUART1CLKSOURCE_SYSCLK  System Clock selected as LPUART1 clock

+  *            @arg @ref RCC_LPUART1CLKSOURCE_LSE  LSE selected as LPUART1 clock

+  * @retval None

+  */

+#define __HAL_RCC_LPUART1_CONFIG(__LPUART1_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR, RCC_CCIPR_LPUART1SEL, (__LPUART1_CLKSOURCE__))

+

+/** @brief  Macro to get the LPUART1 clock source.

+  * @retval The clock source can be one of the following values:

+  *            @arg @ref RCC_LPUART1CLKSOURCE_PCLK1  PCLK1 selected as LPUART1 clock

+  *            @arg @ref RCC_LPUART1CLKSOURCE_HSI  HSI selected as LPUART1 clock

+  *            @arg @ref RCC_LPUART1CLKSOURCE_SYSCLK  System Clock selected as LPUART1 clock

+  *            @arg @ref RCC_LPUART1CLKSOURCE_LSE  LSE selected as LPUART1 clock

+  */

+#define __HAL_RCC_GET_LPUART1_SOURCE() (READ_BIT(RCC->CCIPR, RCC_CCIPR_LPUART1SEL))

+

+/** @brief  Macro to configure the LPTIM1 clock (LPTIM1CLK).

+  *

+  * @param  __LPTIM1_CLKSOURCE__ specifies the LPTIM1 clock source.

+  *          This parameter can be one of the following values:

+  *            @arg @ref RCC_LPTIM1CLKSOURCE_PCLK1  PCLK1 selected as LPTIM1 clock

+  *            @arg @ref RCC_LPTIM1CLKSOURCE_LSI  HSI selected as LPTIM1 clock

+  *            @arg @ref RCC_LPTIM1CLKSOURCE_HSI  LSI selected as LPTIM1 clock

+  *            @arg @ref RCC_LPTIM1CLKSOURCE_LSE  LSE selected as LPTIM1 clock

+  * @retval None

+  */

+#define __HAL_RCC_LPTIM1_CONFIG(__LPTIM1_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR, RCC_CCIPR_LPTIM1SEL, (__LPTIM1_CLKSOURCE__))

+

+/** @brief  Macro to get the LPTIM1 clock source.

+  * @retval The clock source can be one of the following values:

+  *            @arg @ref RCC_LPTIM1CLKSOURCE_PCLK1  PCLK1 selected as LPUART1 clock

+  *            @arg @ref RCC_LPTIM1CLKSOURCE_LSI  HSI selected as LPUART1 clock

+  *            @arg @ref RCC_LPTIM1CLKSOURCE_HSI  System Clock selected as LPUART1 clock

+  *            @arg @ref RCC_LPTIM1CLKSOURCE_LSE  LSE selected as LPUART1 clock

+  */

+#define __HAL_RCC_GET_LPTIM1_SOURCE() (READ_BIT(RCC->CCIPR, RCC_CCIPR_LPTIM1SEL))

+

+/** @brief  Macro to configure the LPTIM2 clock (LPTIM2CLK).

+  *

+  * @param  __LPTIM2_CLKSOURCE__ specifies the LPTIM2 clock source.

+  *          This parameter can be one of the following values:

+  *            @arg @ref RCC_LPTIM2CLKSOURCE_PCLK1  PCLK1 selected as LPTIM2 clock

+  *            @arg @ref RCC_LPTIM2CLKSOURCE_LSI  HSI selected as LPTIM2 clock

+  *            @arg @ref RCC_LPTIM2CLKSOURCE_HSI  LSI selected as LPTIM2 clock

+  *            @arg @ref RCC_LPTIM2CLKSOURCE_LSE  LSE selected as LPTIM2 clock

+  * @retval None

+  */

+#define __HAL_RCC_LPTIM2_CONFIG(__LPTIM2_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR, RCC_CCIPR_LPTIM2SEL, (__LPTIM2_CLKSOURCE__))

+

+/** @brief  Macro to get the LPTIM2 clock source.

+  * @retval The clock source can be one of the following values:

+  *            @arg @ref RCC_LPTIM2CLKSOURCE_PCLK1  PCLK1 selected as LPUART1 clock

+  *            @arg @ref RCC_LPTIM2CLKSOURCE_LSI  HSI selected as LPUART1 clock

+  *            @arg @ref RCC_LPTIM2CLKSOURCE_HSI  System Clock selected as LPUART1 clock

+  *            @arg @ref RCC_LPTIM2CLKSOURCE_LSE  LSE selected as LPUART1 clock

+  */

+#define __HAL_RCC_GET_LPTIM2_SOURCE() (READ_BIT(RCC->CCIPR, RCC_CCIPR_LPTIM2SEL))

+

+#if defined(SDMMC1)

+

+/** @brief  Macro to configure the SDMMC1 clock.

+  *

+  @if STM32L486xx

+  * @note  USB, RNG and SDMMC1 peripherals share the same 48MHz clock source.

+  @endif

+  *

+  @if STM32L443xx

+  * @note  USB, RNG and SDMMC1 peripherals share the same 48MHz clock source.

+  @endif

+  *

+  * @param  __SDMMC1_CLKSOURCE__ specifies the SDMMC1 clock source.

+  *         This parameter can be one of the following values:

+  @if STM32L486xx

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_NONE  No clock selected as SDMMC1 clock for devices without HSI48

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_MSI  MSI selected as SDMMC1 clock

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_PLLSAI1  PLLSAI1 "Q" Clock selected as SDMMC1 clock

+  @endif

+  @if STM32L443xx

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_HSI48  HSI48 selected as SDMMC1 clock for devices with HSI48

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_MSI  MSI selected as SDMMC1 clock

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_PLLSAI1  PLLSAI1 "Q" Clock selected as SDMMC1 clock

+  @endif

+  @if STM32L4S9xx

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_HSI48  HSI48 selected as SDMMC1 clock for devices with HSI48

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_MSI  MSI selected as SDMMC1 clock

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_PLLSAI1  PLLSAI1 "Q" Clock selected as SDMMC1 clock

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_PLLP  PLL "P" Clock selected as SDMMC1 clock

+  @endif

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_PLL  PLL "Q" Clock selected as SDMMC1 clock

+  * @retval None

+  */

+#if defined(RCC_CCIPR2_SDMMCSEL)

+#define __HAL_RCC_SDMMC1_CONFIG(__SDMMC1_CLKSOURCE__) \

+                  do \

+                  {  \

+                    if((__SDMMC1_CLKSOURCE__) == RCC_SDMMC1CLKSOURCE_PLLP) \

+                    { \

+                      SET_BIT(RCC->CCIPR2, RCC_CCIPR2_SDMMCSEL); \

+                    } \

+                    else \

+                    { \

+                      CLEAR_BIT(RCC->CCIPR2, RCC_CCIPR2_SDMMCSEL); \

+                      MODIFY_REG(RCC->CCIPR, RCC_CCIPR_CLK48SEL, (__SDMMC1_CLKSOURCE__)); \

+                    } \

+                  } while(0)

+#else

+#define __HAL_RCC_SDMMC1_CONFIG(__SDMMC1_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR, RCC_CCIPR_CLK48SEL, (__SDMMC1_CLKSOURCE__))

+#endif /* RCC_CCIPR2_SDMMCSEL */

+

+/** @brief  Macro to get the SDMMC1 clock.

+  * @retval The clock source can be one of the following values:

+  @if STM32L486xx

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_NONE  No clock selected as SDMMC1 clock for devices without HSI48

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_MSI  MSI selected as SDMMC1 clock

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_PLLSAI1  PLLSAI1 "Q" clock (PLL48M2CLK) selected as SDMMC1 clock

+  @endif

+  @if STM32L443xx

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_HSI48  HSI48 selected as SDMMC1 clock for devices with HSI48

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_MSI  MSI selected as SDMMC1 clock

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_PLLSAI1  PLLSAI1 "Q" clock (PLL48M2CLK) selected as SDMMC1 clock

+  @endif

+  @if STM32L4S9xx

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_HSI48  HSI48 selected as SDMMC1 clock for devices with HSI48

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_MSI  MSI selected as SDMMC1 clock

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_PLLSAI1  PLLSAI1 "Q" clock (PLL48M2CLK) selected as SDMMC1 clock

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_PLLP  PLL "P" clock (PLLSAI3CLK) selected as SDMMC1 kernel clock

+  @endif

+  *            @arg @ref RCC_SDMMC1CLKSOURCE_PLL  PLL "Q" clock (PLL48M1CLK) selected as SDMMC1 clock

+  */

+#if defined(RCC_CCIPR2_SDMMCSEL)

+#define __HAL_RCC_GET_SDMMC1_SOURCE() \

+                  ((READ_BIT(RCC->CCIPR2, RCC_CCIPR2_SDMMCSEL) != 0U) ? RCC_SDMMC1CLKSOURCE_PLLP : (READ_BIT(RCC->CCIPR, RCC_CCIPR_CLK48SEL)))

+#else

+#define __HAL_RCC_GET_SDMMC1_SOURCE() \

+                  (READ_BIT(RCC->CCIPR, RCC_CCIPR_CLK48SEL))

+#endif /* RCC_CCIPR2_SDMMCSEL */

+

+#endif /* SDMMC1 */

+

+/** @brief  Macro to configure the RNG clock.

+  *

+  * @note  USB, RNG and SDMMC1 peripherals share the same 48MHz clock source.

+  *

+  * @param  __RNG_CLKSOURCE__ specifies the RNG clock source.

+  *         This parameter can be one of the following values:

+  @if STM32L486xx

+  *            @arg @ref RCC_RNGCLKSOURCE_NONE  No clock selected as RNG clock for devices without HSI48

+  @endif

+  @if STM32L443xx

+  *            @arg @ref RCC_RNGCLKSOURCE_HSI48  HSI48 selected as RNG clock clock for devices with HSI48

+  @endif

+  *            @arg @ref RCC_RNGCLKSOURCE_MSI  MSI selected as RNG clock

+  *            @arg @ref RCC_RNGCLKSOURCE_PLLSAI1  PLLSAI1 Clock selected as RNG clock

+  *            @arg @ref RCC_RNGCLKSOURCE_PLL  PLL Clock selected as RNG clock

+  * @retval None

+  */

+#define __HAL_RCC_RNG_CONFIG(__RNG_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR, RCC_CCIPR_CLK48SEL, (__RNG_CLKSOURCE__))

+

+/** @brief  Macro to get the RNG clock.

+  * @retval The clock source can be one of the following values:

+  @if STM32L486xx

+  *            @arg @ref RCC_RNGCLKSOURCE_NONE  No clock selected as RNG clock for devices without HSI48

+  @endif

+  @if STM32L443xx

+  *            @arg @ref RCC_RNGCLKSOURCE_HSI48  HSI48 selected as RNG clock clock for devices with HSI48

+  @endif

+  *            @arg @ref RCC_RNGCLKSOURCE_MSI  MSI selected as RNG clock

+  *            @arg @ref RCC_RNGCLKSOURCE_PLLSAI1  PLLSAI1 "Q" clock (PLL48M2CLK) selected as RNG clock

+  *            @arg @ref RCC_RNGCLKSOURCE_PLL  PLL "Q" clock (PLL48M1CLK) selected as RNG clock

+  */

+#define __HAL_RCC_GET_RNG_SOURCE() (READ_BIT(RCC->CCIPR, RCC_CCIPR_CLK48SEL))

+

+#if defined(USB_OTG_FS) || defined(USB)

+

+/** @brief  Macro to configure the USB clock (USBCLK).

+  *

+  * @note  USB, RNG and SDMMC1 peripherals share the same 48MHz clock source.

+  *

+  * @param  __USB_CLKSOURCE__ specifies the USB clock source.

+  *         This parameter can be one of the following values:

+  @if STM32L486xx

+  *            @arg @ref RCC_USBCLKSOURCE_NONE  No clock selected as 48MHz clock for devices without HSI48

+  @endif

+  @if STM32L443xx

+  *            @arg @ref RCC_USBCLKSOURCE_HSI48  HSI48 selected as 48MHz clock for devices with HSI48

+  @endif

+  *            @arg @ref RCC_USBCLKSOURCE_MSI  MSI selected as USB clock

+  *            @arg @ref RCC_USBCLKSOURCE_PLLSAI1  PLLSAI1 "Q" clock (PLL48M2CLK) selected as USB clock

+  *            @arg @ref RCC_USBCLKSOURCE_PLL  PLL "Q" clock (PLL48M1CLK) selected as USB clock

+  * @retval None

+  */

+#define __HAL_RCC_USB_CONFIG(__USB_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR, RCC_CCIPR_CLK48SEL, (__USB_CLKSOURCE__))

+

+/** @brief  Macro to get the USB clock source.

+  * @retval The clock source can be one of the following values:

+  @if STM32L486xx

+  *            @arg @ref RCC_USBCLKSOURCE_NONE  No clock selected as 48MHz clock for devices without HSI48

+  @endif

+  @if STM32L443xx

+  *            @arg @ref RCC_USBCLKSOURCE_HSI48  HSI48 selected as 48MHz clock for devices with HSI48

+  @endif

+  *            @arg @ref RCC_USBCLKSOURCE_MSI  MSI selected as USB clock

+  *            @arg @ref RCC_USBCLKSOURCE_PLLSAI1  PLLSAI1 "Q" clock (PLL48M2CLK) selected as USB clock

+  *            @arg @ref RCC_USBCLKSOURCE_PLL  PLL "Q" clock (PLL48M1CLK) selected as USB clock

+  */

+#define __HAL_RCC_GET_USB_SOURCE() (READ_BIT(RCC->CCIPR, RCC_CCIPR_CLK48SEL))

+

+#endif /* USB_OTG_FS || USB */

+

+#if defined(RCC_CCIPR_ADCSEL)

+

+/** @brief  Macro to configure the ADC interface clock.

+  * @param  __ADC_CLKSOURCE__ specifies the ADC digital interface clock source.

+  *         This parameter can be one of the following values:

+  *            @arg @ref RCC_ADCCLKSOURCE_NONE  No clock selected as ADC clock

+  *            @arg @ref RCC_ADCCLKSOURCE_PLLSAI1  PLLSAI1 Clock selected as ADC clock

+  @if STM32L486xx

+  *            @arg @ref RCC_ADCCLKSOURCE_PLLSAI2  PLLSAI2 Clock selected as ADC clock for STM32L47x/STM32L48x/STM32L49x/STM32L4Ax devices

+  @endif

+  *            @arg @ref RCC_ADCCLKSOURCE_SYSCLK  System Clock selected as ADC clock

+  * @retval None

+  */

+#define __HAL_RCC_ADC_CONFIG(__ADC_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR, RCC_CCIPR_ADCSEL, (__ADC_CLKSOURCE__))

+

+/** @brief  Macro to get the ADC clock source.

+  * @retval The clock source can be one of the following values:

+  *            @arg @ref RCC_ADCCLKSOURCE_NONE  No clock selected as ADC clock

+  *            @arg @ref RCC_ADCCLKSOURCE_PLLSAI1  PLLSAI1 Clock selected as ADC clock

+  @if STM32L486xx

+  *            @arg @ref RCC_ADCCLKSOURCE_PLLSAI2  PLLSAI2 Clock selected as ADC clock for STM32L47x/STM32L48x/STM32L49x/STM32L4Ax devices

+  @endif

+  *            @arg @ref RCC_ADCCLKSOURCE_SYSCLK  System Clock selected as ADC clock

+  */

+#define __HAL_RCC_GET_ADC_SOURCE() (READ_BIT(RCC->CCIPR, RCC_CCIPR_ADCSEL))

+#else

+

+/** @brief  Macro to get the ADC clock source.

+  * @retval The clock source can be one of the following values:

+  *            @arg @ref RCC_ADCCLKSOURCE_NONE  No clock selected as ADC clock

+  *            @arg @ref RCC_ADCCLKSOURCE_SYSCLK  System Clock selected as ADC clock

+  */

+#define __HAL_RCC_GET_ADC_SOURCE() ((__HAL_RCC_ADC_IS_CLK_ENABLED() != 0U) ? RCC_ADCCLKSOURCE_SYSCLK : RCC_ADCCLKSOURCE_NONE)

+

+#endif /* RCC_CCIPR_ADCSEL */

+

+#if defined(SWPMI1)

+

+/** @brief  Macro to configure the SWPMI1 clock.

+  * @param  __SWPMI1_CLKSOURCE__ specifies the SWPMI1 clock source.

+  *         This parameter can be one of the following values:

+  *            @arg @ref RCC_SWPMI1CLKSOURCE_PCLK1  PCLK1 Clock selected as SWPMI1 clock

+  *            @arg @ref RCC_SWPMI1CLKSOURCE_HSI  HSI Clock selected as SWPMI1 clock

+  * @retval None

+  */

+#define __HAL_RCC_SWPMI1_CONFIG(__SWPMI1_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR, RCC_CCIPR_SWPMI1SEL, (__SWPMI1_CLKSOURCE__))

+

+/** @brief  Macro to get the SWPMI1 clock source.

+  * @retval The clock source can be one of the following values:

+  *            @arg @ref RCC_SWPMI1CLKSOURCE_PCLK1  PCLK1 Clock selected as SWPMI1 clock

+  *            @arg @ref RCC_SWPMI1CLKSOURCE_HSI  HSI Clock selected as SWPMI1 clock

+  */

+#define __HAL_RCC_GET_SWPMI1_SOURCE() (READ_BIT(RCC->CCIPR, RCC_CCIPR_SWPMI1SEL))

+

+#endif /* SWPMI1 */

+

+#if defined(DFSDM1_Filter0)

+/** @brief  Macro to configure the DFSDM1 clock.

+  * @param  __DFSDM1_CLKSOURCE__ specifies the DFSDM1 clock source.

+  *         This parameter can be one of the following values:

+  *            @arg @ref RCC_DFSDM1CLKSOURCE_PCLK2  PCLK2 Clock selected as DFSDM1 clock

+  *            @arg @ref RCC_DFSDM1CLKSOURCE_SYSCLK  System Clock selected as DFSDM1 clock

+  * @retval None

+  */

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+#define __HAL_RCC_DFSDM1_CONFIG(__DFSDM1_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR2, RCC_CCIPR2_DFSDM1SEL, (__DFSDM1_CLKSOURCE__))

+#else

+#define __HAL_RCC_DFSDM1_CONFIG(__DFSDM1_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR, RCC_CCIPR_DFSDM1SEL, (__DFSDM1_CLKSOURCE__))

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+/** @brief  Macro to get the DFSDM1 clock source.

+  * @retval The clock source can be one of the following values:

+  *            @arg @ref RCC_DFSDM1CLKSOURCE_PCLK2  PCLK2 Clock selected as DFSDM1 clock

+  *            @arg @ref RCC_DFSDM1CLKSOURCE_SYSCLK  System Clock selected as DFSDM1 clock

+  */

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+#define __HAL_RCC_GET_DFSDM1_SOURCE() (READ_BIT(RCC->CCIPR2, RCC_CCIPR2_DFSDM1SEL))

+#else

+#define __HAL_RCC_GET_DFSDM1_SOURCE() (READ_BIT(RCC->CCIPR, RCC_CCIPR_DFSDM1SEL))

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+

+/** @brief  Macro to configure the DFSDM1 audio clock.

+  * @param  __DFSDM1AUDIO_CLKSOURCE__ specifies the DFSDM1 audio clock source.

+  *         This parameter can be one of the following values:

+  *            @arg @ref RCC_DFSDM1AUDIOCLKSOURCE_SAI1  SAI1 clock selected as DFSDM1 audio clock

+  *            @arg @ref RCC_DFSDM1AUDIOCLKSOURCE_HSI   HSI clock selected as DFSDM1 audio clock

+  *            @arg @ref RCC_DFSDM1AUDIOCLKSOURCE_MSI   MSI clock selected as DFSDM1 audio clock

+  * @retval None

+  */

+#define __HAL_RCC_DFSDM1AUDIO_CONFIG(__DFSDM1AUDIO_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR2, RCC_CCIPR2_ADFSDM1SEL, (__DFSDM1AUDIO_CLKSOURCE__))

+

+/** @brief  Macro to get the DFSDM1 audio clock source.

+  * @retval The clock source can be one of the following values:

+  *            @arg @ref RCC_DFSDM1AUDIOCLKSOURCE_SAI1  SAI1 clock selected as DFSDM1 audio clock

+  *            @arg @ref RCC_DFSDM1AUDIOCLKSOURCE_HSI   HSI clock selected as DFSDM1 audio clock

+  *            @arg @ref RCC_DFSDM1AUDIOCLKSOURCE_MSI   MSI clock selected as DFSDM1 audio clock

+  */

+#define __HAL_RCC_GET_DFSDM1AUDIO_SOURCE() (READ_BIT(RCC->CCIPR2, RCC_CCIPR2_ADFSDM1SEL))

+

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+#endif /* DFSDM1_Filter0 */

+

+#if defined(LTDC)

+

+/** @brief  Macro to configure the LTDC clock.

+  * @param  __LTDC_CLKSOURCE__ specifies the DSI clock source.

+  *         This parameter can be one of the following values:

+  *            @arg @ref RCC_LTDCCLKSOURCE_PLLSAI2_DIV2   PLLSAI2 divider R divided by 2 clock selected as LTDC clock

+  *            @arg @ref RCC_LTDCCLKSOURCE_PLLSAI2_DIV4   PLLSAI2 divider R divided by 4 clock selected as LTDC clock

+  *            @arg @ref RCC_LTDCCLKSOURCE_PLLSAI2_DIV8   PLLSAI2 divider R divided by 8 clock selected as LTDC clock

+  *            @arg @ref RCC_LTDCCLKSOURCE_PLLSAI2_DIV16  PLLSAI2 divider R divided by 16 clock selected as LTDC clock

+  * @retval None

+  */

+#define __HAL_RCC_LTDC_CONFIG(__LTDC_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR2, RCC_CCIPR2_PLLSAI2DIVR, (__LTDC_CLKSOURCE__))

+

+/** @brief  Macro to get the LTDC clock source.

+  * @retval The clock source can be one of the following values:

+  *            @arg @ref RCC_LTDCCLKSOURCE_PLLSAI2_DIV2   PLLSAI2 divider R divided by 2 clock selected as LTDC clock

+  *            @arg @ref RCC_LTDCCLKSOURCE_PLLSAI2_DIV4   PLLSAI2 divider R divided by 4 clock selected as LTDC clock

+  *            @arg @ref RCC_LTDCCLKSOURCE_PLLSAI2_DIV8   PLLSAI2 divider R divided by 8 clock selected as LTDC clock

+  *            @arg @ref RCC_LTDCCLKSOURCE_PLLSAI2_DIV16  PLLSAI2 divider R divided by 16 clock selected as LTDC clock

+  */

+#define __HAL_RCC_GET_LTDC_SOURCE() (READ_BIT(RCC->CCIPR2, RCC_CCIPR2_PLLSAI2DIVR))

+

+#endif /* LTDC */

+

+#if defined(DSI)

+

+/** @brief  Macro to configure the DSI clock.

+  * @param  __DSI_CLKSOURCE__ specifies the DSI clock source.

+  *         This parameter can be one of the following values:

+  *            @arg @ref RCC_DSICLKSOURCE_DSIPHY  DSI-PHY clock selected as DSI clock

+  *            @arg @ref RCC_DSICLKSOURCE_PLLSAI2 PLLSAI2 R divider clock selected as DSI clock

+  * @retval None

+  */

+#define __HAL_RCC_DSI_CONFIG(__DSI_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR2, RCC_CCIPR2_DSISEL, (__DSI_CLKSOURCE__))

+

+/** @brief  Macro to get the DSI clock source.

+  * @retval The clock source can be one of the following values:

+  *            @arg @ref RCC_DSICLKSOURCE_DSIPHY  DSI-PHY clock selected as DSI clock

+  *            @arg @ref RCC_DSICLKSOURCE_PLLSAI2 PLLSAI2 R divider clock selected as DSI clock

+  */

+#define __HAL_RCC_GET_DSI_SOURCE() (READ_BIT(RCC->CCIPR2, RCC_CCIPR2_DSISEL))

+

+#endif /* DSI */

+

+#if defined(OCTOSPI1) || defined(OCTOSPI2)

+

+/** @brief  Macro to configure the OctoSPI clock.

+  * @param  __OSPI_CLKSOURCE__ specifies the OctoSPI clock source.

+  *         This parameter can be one of the following values:

+  *            @arg @ref RCC_OSPICLKSOURCE_SYSCLK  System Clock selected as OctoSPI clock

+  *            @arg @ref RCC_OSPICLKSOURCE_MSI     MSI clock selected as OctoSPI clock

+  *            @arg @ref RCC_OSPICLKSOURCE_PLL     PLL Q divider clock selected as OctoSPI clock

+  * @retval None

+  */

+#define __HAL_RCC_OSPI_CONFIG(__OSPI_CLKSOURCE__) \

+                  MODIFY_REG(RCC->CCIPR2, RCC_CCIPR2_OSPISEL, (__OSPI_CLKSOURCE__))

+

+/** @brief  Macro to get the OctoSPI clock source.

+  * @retval The clock source can be one of the following values:

+  *            @arg @ref RCC_OSPICLKSOURCE_SYSCLK  System Clock selected as OctoSPI clock

+  *            @arg @ref RCC_OSPICLKSOURCE_MSI     MSI clock selected as OctoSPI clock

+  *            @arg @ref RCC_OSPICLKSOURCE_PLL     PLL Q divider clock selected as OctoSPI clock

+  */

+#define __HAL_RCC_GET_OSPI_SOURCE() (READ_BIT(RCC->CCIPR2, RCC_CCIPR2_OSPISEL))

+

+#endif /* OCTOSPI1 || OCTOSPI2 */

+

+/** @defgroup RCCEx_Flags_Interrupts_Management Flags Interrupts Management

+  * @brief macros to manage the specified RCC Flags and interrupts.

+  * @{

+  */

+#if defined(RCC_PLLSAI1_SUPPORT)

+

+/** @brief Enable PLLSAI1RDY interrupt.

+  * @retval None

+  */

+#define __HAL_RCC_PLLSAI1_ENABLE_IT()  SET_BIT(RCC->CIER, RCC_CIER_PLLSAI1RDYIE)

+

+/** @brief Disable PLLSAI1RDY interrupt.

+  * @retval None

+  */

+#define __HAL_RCC_PLLSAI1_DISABLE_IT() CLEAR_BIT(RCC->CIER, RCC_CIER_PLLSAI1RDYIE)

+

+/** @brief Clear the PLLSAI1RDY interrupt pending bit.

+  * @retval None

+  */

+#define __HAL_RCC_PLLSAI1_CLEAR_IT()   WRITE_REG(RCC->CICR, RCC_CICR_PLLSAI1RDYC)

+

+/** @brief Check whether PLLSAI1RDY interrupt has occurred or not.

+  * @retval TRUE or FALSE.

+  */

+#define __HAL_RCC_PLLSAI1_GET_IT_SOURCE()     (READ_BIT(RCC->CIFR, RCC_CIFR_PLLSAI1RDYF) == RCC_CIFR_PLLSAI1RDYF)

+

+/** @brief  Check whether the PLLSAI1RDY flag is set or not.

+  * @retval TRUE or FALSE.

+  */

+#define __HAL_RCC_PLLSAI1_GET_FLAG()   (READ_BIT(RCC->CR, RCC_CR_PLLSAI1RDY) == (RCC_CR_PLLSAI1RDY))

+

+#endif /* RCC_PLLSAI1_SUPPORT */

+

+#if defined(RCC_PLLSAI2_SUPPORT)

+

+/** @brief Enable PLLSAI2RDY interrupt.

+  * @retval None

+  */

+#define __HAL_RCC_PLLSAI2_ENABLE_IT()  SET_BIT(RCC->CIER, RCC_CIER_PLLSAI2RDYIE)

+

+/** @brief Disable PLLSAI2RDY interrupt.

+  * @retval None

+  */

+#define __HAL_RCC_PLLSAI2_DISABLE_IT() CLEAR_BIT(RCC->CIER, RCC_CIER_PLLSAI2RDYIE)

+

+/** @brief Clear the PLLSAI2RDY interrupt pending bit.

+  * @retval None

+  */

+#define __HAL_RCC_PLLSAI2_CLEAR_IT()   WRITE_REG(RCC->CICR, RCC_CICR_PLLSAI2RDYC)

+

+/** @brief Check whether the PLLSAI2RDY interrupt has occurred or not.

+  * @retval TRUE or FALSE.

+  */

+#define __HAL_RCC_PLLSAI2_GET_IT_SOURCE()     (READ_BIT(RCC->CIFR, RCC_CIFR_PLLSAI2RDYF) == RCC_CIFR_PLLSAI2RDYF)

+

+/** @brief  Check whether the PLLSAI2RDY flag is set or not.

+  * @retval TRUE or FALSE.

+  */

+#define __HAL_RCC_PLLSAI2_GET_FLAG()   (READ_BIT(RCC->CR, RCC_CR_PLLSAI2RDY) == (RCC_CR_PLLSAI2RDY))

+

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+

+/**

+  * @brief Enable the RCC LSE CSS Extended Interrupt Line.

+  * @retval None

+  */

+#define __HAL_RCC_LSECSS_EXTI_ENABLE_IT()      SET_BIT(EXTI->IMR1, RCC_EXTI_LINE_LSECSS)

+

+/**

+  * @brief Disable the RCC LSE CSS Extended Interrupt Line.

+  * @retval None

+  */

+#define __HAL_RCC_LSECSS_EXTI_DISABLE_IT()     CLEAR_BIT(EXTI->IMR1, RCC_EXTI_LINE_LSECSS)

+

+/**

+  * @brief Enable the RCC LSE CSS Event Line.

+  * @retval None.

+  */

+#define __HAL_RCC_LSECSS_EXTI_ENABLE_EVENT()   SET_BIT(EXTI->EMR1, RCC_EXTI_LINE_LSECSS)

+

+/**

+  * @brief Disable the RCC LSE CSS Event Line.

+  * @retval None.

+  */

+#define __HAL_RCC_LSECSS_EXTI_DISABLE_EVENT()  CLEAR_BIT(EXTI->EMR1, RCC_EXTI_LINE_LSECSS)

+

+

+/**

+  * @brief  Enable the RCC LSE CSS Extended Interrupt Falling Trigger.

+  * @retval None.

+  */

+#define __HAL_RCC_LSECSS_EXTI_ENABLE_FALLING_EDGE()  SET_BIT(EXTI->FTSR1, RCC_EXTI_LINE_LSECSS)

+

+

+/**

+  * @brief Disable the RCC LSE CSS Extended Interrupt Falling Trigger.

+  * @retval None.

+  */

+#define __HAL_RCC_LSECSS_EXTI_DISABLE_FALLING_EDGE()  CLEAR_BIT(EXTI->FTSR1, RCC_EXTI_LINE_LSECSS)

+

+

+/**

+  * @brief  Enable the RCC LSE CSS Extended Interrupt Rising Trigger.

+  * @retval None.

+  */

+#define __HAL_RCC_LSECSS_EXTI_ENABLE_RISING_EDGE()   SET_BIT(EXTI->RTSR1, RCC_EXTI_LINE_LSECSS)

+

+/**

+  * @brief Disable the RCC LSE CSS Extended Interrupt Rising Trigger.

+  * @retval None.

+  */

+#define __HAL_RCC_LSECSS_EXTI_DISABLE_RISING_EDGE()  CLEAR_BIT(EXTI->RTSR1, RCC_EXTI_LINE_LSECSS)

+

+/**

+  * @brief Enable the RCC LSE CSS Extended Interrupt Rising & Falling Trigger.

+  * @retval None.

+  */

+#define __HAL_RCC_LSECSS_EXTI_ENABLE_RISING_FALLING_EDGE()  \

+  do {                                                      \

+    __HAL_RCC_LSECSS_EXTI_ENABLE_RISING_EDGE();             \

+    __HAL_RCC_LSECSS_EXTI_ENABLE_FALLING_EDGE();            \

+  } while(0)

+

+/**

+  * @brief Disable the RCC LSE CSS Extended Interrupt Rising & Falling Trigger.

+  * @retval None.

+  */

+#define __HAL_RCC_LSECSS_EXTI_DISABLE_RISING_FALLING_EDGE()  \

+  do {                                                       \

+    __HAL_RCC_LSECSS_EXTI_DISABLE_RISING_EDGE();             \

+    __HAL_RCC_LSECSS_EXTI_DISABLE_FALLING_EDGE();            \

+  } while(0)

+

+/**

+  * @brief Check whether the specified RCC LSE CSS EXTI interrupt flag is set or not.

+  * @retval EXTI RCC LSE CSS Line Status.

+  */

+#define __HAL_RCC_LSECSS_EXTI_GET_FLAG()       (READ_BIT(EXTI->PR1, RCC_EXTI_LINE_LSECSS) == RCC_EXTI_LINE_LSECSS)

+

+/**

+  * @brief Clear the RCC LSE CSS EXTI flag.

+  * @retval None.

+  */

+#define __HAL_RCC_LSECSS_EXTI_CLEAR_FLAG()     WRITE_REG(EXTI->PR1, RCC_EXTI_LINE_LSECSS)

+

+/**

+  * @brief Generate a Software interrupt on the RCC LSE CSS EXTI line.

+  * @retval None.

+  */

+#define __HAL_RCC_LSECSS_EXTI_GENERATE_SWIT()  SET_BIT(EXTI->SWIER1, RCC_EXTI_LINE_LSECSS)

+

+

+#if defined(CRS)

+

+/**

+  * @brief  Enable the specified CRS interrupts.

+  * @param  __INTERRUPT__ specifies the CRS interrupt sources to be enabled.

+  *          This parameter can be any combination of the following values:

+  *              @arg @ref RCC_CRS_IT_SYNCOK  SYNC event OK interrupt

+  *              @arg @ref RCC_CRS_IT_SYNCWARN  SYNC warning interrupt

+  *              @arg @ref RCC_CRS_IT_ERR  Synchronization or trimming error interrupt

+  *              @arg @ref RCC_CRS_IT_ESYNC  Expected SYNC interrupt

+  * @retval None

+  */

+#define __HAL_RCC_CRS_ENABLE_IT(__INTERRUPT__)   SET_BIT(CRS->CR, (__INTERRUPT__))

+

+/**

+  * @brief  Disable the specified CRS interrupts.

+  * @param  __INTERRUPT__ specifies the CRS interrupt sources to be disabled.

+  *          This parameter can be any combination of the following values:

+  *              @arg @ref RCC_CRS_IT_SYNCOK  SYNC event OK interrupt

+  *              @arg @ref RCC_CRS_IT_SYNCWARN  SYNC warning interrupt

+  *              @arg @ref RCC_CRS_IT_ERR  Synchronization or trimming error interrupt

+  *              @arg @ref RCC_CRS_IT_ESYNC  Expected SYNC interrupt

+  * @retval None

+  */

+#define __HAL_RCC_CRS_DISABLE_IT(__INTERRUPT__)  CLEAR_BIT(CRS->CR, (__INTERRUPT__))

+

+/** @brief  Check whether the CRS interrupt has occurred or not.

+  * @param  __INTERRUPT__ specifies the CRS interrupt source to check.

+  *         This parameter can be one of the following values:

+  *              @arg @ref RCC_CRS_IT_SYNCOK  SYNC event OK interrupt

+  *              @arg @ref RCC_CRS_IT_SYNCWARN  SYNC warning interrupt

+  *              @arg @ref RCC_CRS_IT_ERR  Synchronization or trimming error interrupt

+  *              @arg @ref RCC_CRS_IT_ESYNC  Expected SYNC interrupt

+  * @retval The new state of __INTERRUPT__ (SET or RESET).

+  */

+#define __HAL_RCC_CRS_GET_IT_SOURCE(__INTERRUPT__)  ((READ_BIT(CRS->CR, (__INTERRUPT__)) != 0U) ? SET : RESET)

+

+/** @brief  Clear the CRS interrupt pending bits

+  * @param  __INTERRUPT__ specifies the interrupt pending bit to clear.

+  *         This parameter can be any combination of the following values:

+  *              @arg @ref RCC_CRS_IT_SYNCOK  SYNC event OK interrupt

+  *              @arg @ref RCC_CRS_IT_SYNCWARN  SYNC warning interrupt

+  *              @arg @ref RCC_CRS_IT_ERR  Synchronization or trimming error interrupt

+  *              @arg @ref RCC_CRS_IT_ESYNC  Expected SYNC interrupt

+  *              @arg @ref RCC_CRS_IT_TRIMOVF  Trimming overflow or underflow interrupt

+  *              @arg @ref RCC_CRS_IT_SYNCERR  SYNC error interrupt

+  *              @arg @ref RCC_CRS_IT_SYNCMISS  SYNC missed interrupt

+  */

+/* CRS IT Error Mask */

+#define  RCC_CRS_IT_ERROR_MASK                 (RCC_CRS_IT_TRIMOVF | RCC_CRS_IT_SYNCERR | RCC_CRS_IT_SYNCMISS)

+

+#define __HAL_RCC_CRS_CLEAR_IT(__INTERRUPT__)  do { \

+                                                 if(((__INTERRUPT__) & RCC_CRS_IT_ERROR_MASK) != 0U) \

+                                                 { \

+                                                   WRITE_REG(CRS->ICR, CRS_ICR_ERRC | ((__INTERRUPT__) & ~RCC_CRS_IT_ERROR_MASK)); \

+                                                 } \

+                                                 else \

+                                                 { \

+                                                   WRITE_REG(CRS->ICR, (__INTERRUPT__)); \

+                                                 } \

+                                               } while(0)

+

+/**

+  * @brief  Check whether the specified CRS flag is set or not.

+  * @param  __FLAG__ specifies the flag to check.

+  *          This parameter can be one of the following values:

+  *              @arg @ref RCC_CRS_FLAG_SYNCOK  SYNC event OK

+  *              @arg @ref RCC_CRS_FLAG_SYNCWARN  SYNC warning

+  *              @arg @ref RCC_CRS_FLAG_ERR  Error

+  *              @arg @ref RCC_CRS_FLAG_ESYNC  Expected SYNC

+  *              @arg @ref RCC_CRS_FLAG_TRIMOVF  Trimming overflow or underflow

+  *              @arg @ref RCC_CRS_FLAG_SYNCERR  SYNC error

+  *              @arg @ref RCC_CRS_FLAG_SYNCMISS  SYNC missed

+  * @retval The new state of _FLAG_ (TRUE or FALSE).

+  */

+#define __HAL_RCC_CRS_GET_FLAG(__FLAG__)  (READ_BIT(CRS->ISR, (__FLAG__)) == (__FLAG__))

+

+/**

+  * @brief  Clear the CRS specified FLAG.

+  * @param __FLAG__ specifies the flag to clear.

+  *          This parameter can be one of the following values:

+  *              @arg @ref RCC_CRS_FLAG_SYNCOK  SYNC event OK

+  *              @arg @ref RCC_CRS_FLAG_SYNCWARN  SYNC warning

+  *              @arg @ref RCC_CRS_FLAG_ERR  Error

+  *              @arg @ref RCC_CRS_FLAG_ESYNC  Expected SYNC

+  *              @arg @ref RCC_CRS_FLAG_TRIMOVF  Trimming overflow or underflow

+  *              @arg @ref RCC_CRS_FLAG_SYNCERR  SYNC error

+  *              @arg @ref RCC_CRS_FLAG_SYNCMISS  SYNC missed

+  * @note RCC_CRS_FLAG_ERR clears RCC_CRS_FLAG_TRIMOVF, RCC_CRS_FLAG_SYNCERR, RCC_CRS_FLAG_SYNCMISS and consequently RCC_CRS_FLAG_ERR

+  * @retval None

+  */

+

+/* CRS Flag Error Mask */

+#define RCC_CRS_FLAG_ERROR_MASK                (RCC_CRS_FLAG_TRIMOVF | RCC_CRS_FLAG_SYNCERR | RCC_CRS_FLAG_SYNCMISS)

+

+#define __HAL_RCC_CRS_CLEAR_FLAG(__FLAG__)     do { \

+                                                 if(((__FLAG__) & RCC_CRS_FLAG_ERROR_MASK) != 0U) \

+                                                 { \

+                                                   WRITE_REG(CRS->ICR, CRS_ICR_ERRC | ((__FLAG__) & ~RCC_CRS_FLAG_ERROR_MASK)); \

+                                                 } \

+                                                 else \

+                                                 { \

+                                                   WRITE_REG(CRS->ICR, (__FLAG__)); \

+                                                 } \

+                                               } while(0)

+

+#endif /* CRS */

+

+/**

+  * @}

+  */

+

+#if defined(CRS)

+

+/** @defgroup RCCEx_CRS_Extended_Features RCCEx CRS Extended Features

+  * @{

+  */

+/**

+  * @brief  Enable the oscillator clock for frequency error counter.

+  * @note   when the CEN bit is set the CRS_CFGR register becomes write-protected.

+  * @retval None

+  */

+#define __HAL_RCC_CRS_FREQ_ERROR_COUNTER_ENABLE()  SET_BIT(CRS->CR, CRS_CR_CEN)

+

+/**

+  * @brief  Disable the oscillator clock for frequency error counter.

+  * @retval None

+  */

+#define __HAL_RCC_CRS_FREQ_ERROR_COUNTER_DISABLE() CLEAR_BIT(CRS->CR, CRS_CR_CEN)

+

+/**

+  * @brief  Enable the automatic hardware adjustement of TRIM bits.

+  * @note   When the AUTOTRIMEN bit is set the CRS_CFGR register becomes write-protected.

+  * @retval None

+  */

+#define __HAL_RCC_CRS_AUTOMATIC_CALIB_ENABLE()     SET_BIT(CRS->CR, CRS_CR_AUTOTRIMEN)

+

+/**

+  * @brief  Enable or disable the automatic hardware adjustement of TRIM bits.

+  * @retval None

+  */

+#define __HAL_RCC_CRS_AUTOMATIC_CALIB_DISABLE()    CLEAR_BIT(CRS->CR, CRS_CR_AUTOTRIMEN)

+

+/**

+  * @brief  Macro to calculate reload value to be set in CRS register according to target and sync frequencies

+  * @note   The RELOAD value should be selected according to the ratio between the target frequency and the frequency

+  *             of the synchronization source after prescaling. It is then decreased by one in order to

+  *             reach the expected synchronization on the zero value. The formula is the following:

+  *             RELOAD = (fTARGET / fSYNC) -1

+  * @param  __FTARGET__ Target frequency (value in Hz)

+  * @param  __FSYNC__ Synchronization signal frequency (value in Hz)

+  * @retval None

+  */

+#define __HAL_RCC_CRS_RELOADVALUE_CALCULATE(__FTARGET__, __FSYNC__)  (((__FTARGET__) / (__FSYNC__)) - 1U)

+

+/**

+  * @}

+  */

+

+#endif /* CRS */

+

+/**

+  * @}

+  */

+

+/* Exported functions --------------------------------------------------------*/

+/** @addtogroup RCCEx_Exported_Functions

+  * @{

+  */

+

+/** @addtogroup RCCEx_Exported_Functions_Group1

+  * @{

+  */

+

+HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef  *PeriphClkInit);

+void              HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef  *PeriphClkInit);

+uint32_t          HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk);

+

+/**

+  * @}

+  */

+

+/** @addtogroup RCCEx_Exported_Functions_Group2

+  * @{

+  */

+#if defined(RCC_PLLSAI1_SUPPORT)

+

+HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI1(RCC_PLLSAI1InitTypeDef  *PLLSAI1Init);

+HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI1(void);

+

+#endif /* RCC_PLLSAI1_SUPPORT */

+

+#if defined(RCC_PLLSAI2_SUPPORT)

+

+HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI2(RCC_PLLSAI2InitTypeDef  *PLLSAI2Init);

+HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI2(void);

+

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+void              HAL_RCCEx_WakeUpStopCLKConfig(uint32_t WakeUpClk);

+void              HAL_RCCEx_StandbyMSIRangeConfig(uint32_t MSIRange);

+void              HAL_RCCEx_EnableLSECSS(void);

+void              HAL_RCCEx_DisableLSECSS(void);

+void              HAL_RCCEx_EnableLSECSS_IT(void);

+void              HAL_RCCEx_LSECSS_IRQHandler(void);

+void              HAL_RCCEx_LSECSS_Callback(void);

+void              HAL_RCCEx_EnableLSCO(uint32_t LSCOSource);

+void              HAL_RCCEx_DisableLSCO(void);

+void              HAL_RCCEx_EnableMSIPLLMode(void);

+void              HAL_RCCEx_DisableMSIPLLMode(void);

+

+/**

+  * @}

+  */

+

+#if defined(CRS)

+

+/** @addtogroup RCCEx_Exported_Functions_Group3

+  * @{

+  */

+

+void              HAL_RCCEx_CRSConfig(RCC_CRSInitTypeDef *pInit);

+void              HAL_RCCEx_CRSSoftwareSynchronizationGenerate(void);

+void              HAL_RCCEx_CRSGetSynchronizationInfo(RCC_CRSSynchroInfoTypeDef *pSynchroInfo);

+uint32_t          HAL_RCCEx_CRSWaitSynchronization(uint32_t Timeout);

+void              HAL_RCCEx_CRS_IRQHandler(void);

+void              HAL_RCCEx_CRS_SyncOkCallback(void);

+void              HAL_RCCEx_CRS_SyncWarnCallback(void);

+void              HAL_RCCEx_CRS_ExpectedSyncCallback(void);

+void              HAL_RCCEx_CRS_ErrorCallback(uint32_t Error);

+

+/**

+  * @}

+  */

+

+#endif /* CRS */

+

+/**

+  * @}

+  */

+

+/* Private macros ------------------------------------------------------------*/

+/** @addtogroup RCCEx_Private_Macros

+  * @{

+  */

+

+#define IS_RCC_LSCOSOURCE(__SOURCE__) (((__SOURCE__) == RCC_LSCOSOURCE_LSI) || \

+                                       ((__SOURCE__) == RCC_LSCOSOURCE_LSE))

+

+#if defined(STM32L412xx) || defined(STM32L422xx)

+

+#define IS_RCC_PERIPHCLOCK(__SELECTION__)  \

+               ((((__SELECTION__) & RCC_PERIPHCLK_USART1)  == RCC_PERIPHCLK_USART1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART2)  == RCC_PERIPHCLK_USART2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART3)  == RCC_PERIPHCLK_USART3)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPUART1) == RCC_PERIPHCLK_LPUART1) || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C1)    == RCC_PERIPHCLK_I2C1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C2)    == RCC_PERIPHCLK_I2C2)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C3)    == RCC_PERIPHCLK_I2C3)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM1)  == RCC_PERIPHCLK_LPTIM1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM2)  == RCC_PERIPHCLK_LPTIM2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USB)     == RCC_PERIPHCLK_USB)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_ADC)     == RCC_PERIPHCLK_ADC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RTC)     == RCC_PERIPHCLK_RTC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RNG)     == RCC_PERIPHCLK_RNG))

+

+#elif defined(STM32L431xx)

+

+#define IS_RCC_PERIPHCLOCK(__SELECTION__)  \

+               ((((__SELECTION__) & RCC_PERIPHCLK_USART1)  == RCC_PERIPHCLK_USART1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART2)  == RCC_PERIPHCLK_USART2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART3)  == RCC_PERIPHCLK_USART3)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPUART1) == RCC_PERIPHCLK_LPUART1) || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C1)    == RCC_PERIPHCLK_I2C1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C2)    == RCC_PERIPHCLK_I2C2)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C3)    == RCC_PERIPHCLK_I2C3)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM1)  == RCC_PERIPHCLK_LPTIM1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM2)  == RCC_PERIPHCLK_LPTIM2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SAI1)    == RCC_PERIPHCLK_SAI1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_ADC)     == RCC_PERIPHCLK_ADC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SWPMI1)  == RCC_PERIPHCLK_SWPMI1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RTC)     == RCC_PERIPHCLK_RTC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RNG)     == RCC_PERIPHCLK_RNG)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SDMMC1)  == RCC_PERIPHCLK_SDMMC1))

+

+#elif defined(STM32L432xx) || defined(STM32L442xx)

+

+#define IS_RCC_PERIPHCLOCK(__SELECTION__)  \

+               ((((__SELECTION__) & RCC_PERIPHCLK_USART1)  == RCC_PERIPHCLK_USART1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART2)  == RCC_PERIPHCLK_USART2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPUART1) == RCC_PERIPHCLK_LPUART1) || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C1)    == RCC_PERIPHCLK_I2C1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C3)    == RCC_PERIPHCLK_I2C3)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM1)  == RCC_PERIPHCLK_LPTIM1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM2)  == RCC_PERIPHCLK_LPTIM2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SAI1)    == RCC_PERIPHCLK_SAI1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USB)     == RCC_PERIPHCLK_USB)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_ADC)     == RCC_PERIPHCLK_ADC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SWPMI1)  == RCC_PERIPHCLK_SWPMI1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RTC)     == RCC_PERIPHCLK_RTC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RNG)     == RCC_PERIPHCLK_RNG))

+

+#elif defined(STM32L433xx) || defined(STM32L443xx)

+

+#define IS_RCC_PERIPHCLOCK(__SELECTION__)  \

+               ((((__SELECTION__) & RCC_PERIPHCLK_USART1)  == RCC_PERIPHCLK_USART1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART2)  == RCC_PERIPHCLK_USART2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART3)  == RCC_PERIPHCLK_USART3)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPUART1) == RCC_PERIPHCLK_LPUART1) || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C1)    == RCC_PERIPHCLK_I2C1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C2)    == RCC_PERIPHCLK_I2C2)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C3)    == RCC_PERIPHCLK_I2C3)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM1)  == RCC_PERIPHCLK_LPTIM1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM2)  == RCC_PERIPHCLK_LPTIM2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SAI1)    == RCC_PERIPHCLK_SAI1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USB)     == RCC_PERIPHCLK_USB)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_ADC)     == RCC_PERIPHCLK_ADC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SWPMI1)  == RCC_PERIPHCLK_SWPMI1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RTC)     == RCC_PERIPHCLK_RTC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RNG)     == RCC_PERIPHCLK_RNG)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SDMMC1)  == RCC_PERIPHCLK_SDMMC1))

+

+#elif defined(STM32L451xx)

+

+#define IS_RCC_PERIPHCLOCK(__SELECTION__)  \

+               ((((__SELECTION__) & RCC_PERIPHCLK_USART1)  == RCC_PERIPHCLK_USART1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART2)  == RCC_PERIPHCLK_USART2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART3)  == RCC_PERIPHCLK_USART3)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_UART4)   == RCC_PERIPHCLK_UART4)   || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPUART1) == RCC_PERIPHCLK_LPUART1) || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C1)    == RCC_PERIPHCLK_I2C1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C2)    == RCC_PERIPHCLK_I2C2)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C3)    == RCC_PERIPHCLK_I2C3)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C4)    == RCC_PERIPHCLK_I2C4)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM1)  == RCC_PERIPHCLK_LPTIM1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM2)  == RCC_PERIPHCLK_LPTIM2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SAI1)    == RCC_PERIPHCLK_SAI1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_ADC)     == RCC_PERIPHCLK_ADC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_DFSDM1)  == RCC_PERIPHCLK_DFSDM1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RTC)     == RCC_PERIPHCLK_RTC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RNG)     == RCC_PERIPHCLK_RNG)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SDMMC1)  == RCC_PERIPHCLK_SDMMC1))

+

+#elif defined(STM32L452xx) || defined(STM32L462xx)

+

+#define IS_RCC_PERIPHCLOCK(__SELECTION__)  \

+               ((((__SELECTION__) & RCC_PERIPHCLK_USART1)  == RCC_PERIPHCLK_USART1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART2)  == RCC_PERIPHCLK_USART2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART3)  == RCC_PERIPHCLK_USART3)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_UART4)   == RCC_PERIPHCLK_UART4)   || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPUART1) == RCC_PERIPHCLK_LPUART1) || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C1)    == RCC_PERIPHCLK_I2C1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C2)    == RCC_PERIPHCLK_I2C2)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C3)    == RCC_PERIPHCLK_I2C3)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C4)    == RCC_PERIPHCLK_I2C4)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM1)  == RCC_PERIPHCLK_LPTIM1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM2)  == RCC_PERIPHCLK_LPTIM2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SAI1)    == RCC_PERIPHCLK_SAI1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USB)     == RCC_PERIPHCLK_USB)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_ADC)     == RCC_PERIPHCLK_ADC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_DFSDM1)  == RCC_PERIPHCLK_DFSDM1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RTC)     == RCC_PERIPHCLK_RTC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RNG)     == RCC_PERIPHCLK_RNG)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SDMMC1)  == RCC_PERIPHCLK_SDMMC1))

+

+#elif defined(STM32L471xx)

+

+#define IS_RCC_PERIPHCLOCK(__SELECTION__)  \

+               ((((__SELECTION__) & RCC_PERIPHCLK_USART1)  == RCC_PERIPHCLK_USART1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART2)  == RCC_PERIPHCLK_USART2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART3)  == RCC_PERIPHCLK_USART3)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_UART4)   == RCC_PERIPHCLK_UART4)   || \

+                (((__SELECTION__) & RCC_PERIPHCLK_UART5)   == RCC_PERIPHCLK_UART5)   || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPUART1) == RCC_PERIPHCLK_LPUART1) || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C1)    == RCC_PERIPHCLK_I2C1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C2)    == RCC_PERIPHCLK_I2C2)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C3)    == RCC_PERIPHCLK_I2C3)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM1)  == RCC_PERIPHCLK_LPTIM1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM2)  == RCC_PERIPHCLK_LPTIM2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SAI1)    == RCC_PERIPHCLK_SAI1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SAI2)    == RCC_PERIPHCLK_SAI2)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_ADC)     == RCC_PERIPHCLK_ADC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SWPMI1)  == RCC_PERIPHCLK_SWPMI1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_DFSDM1)  == RCC_PERIPHCLK_DFSDM1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RTC)     == RCC_PERIPHCLK_RTC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RNG)     == RCC_PERIPHCLK_RNG)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SDMMC1)  == RCC_PERIPHCLK_SDMMC1))

+

+#elif defined(STM32L496xx) || defined(STM32L4A6xx)

+

+#define IS_RCC_PERIPHCLOCK(__SELECTION__)  \

+               ((((__SELECTION__) & RCC_PERIPHCLK_USART1)  == RCC_PERIPHCLK_USART1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART2)  == RCC_PERIPHCLK_USART2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART3)  == RCC_PERIPHCLK_USART3)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_UART4)   == RCC_PERIPHCLK_UART4)   || \

+                (((__SELECTION__) & RCC_PERIPHCLK_UART5)   == RCC_PERIPHCLK_UART5)   || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPUART1) == RCC_PERIPHCLK_LPUART1) || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C1)    == RCC_PERIPHCLK_I2C1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C2)    == RCC_PERIPHCLK_I2C2)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C3)    == RCC_PERIPHCLK_I2C3)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C4)    == RCC_PERIPHCLK_I2C4)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM1)  == RCC_PERIPHCLK_LPTIM1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM2)  == RCC_PERIPHCLK_LPTIM2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SAI1)    == RCC_PERIPHCLK_SAI1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SAI2)    == RCC_PERIPHCLK_SAI2)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USB)     == RCC_PERIPHCLK_USB)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_ADC)     == RCC_PERIPHCLK_ADC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SWPMI1)  == RCC_PERIPHCLK_SWPMI1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_DFSDM1)  == RCC_PERIPHCLK_DFSDM1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RTC)     == RCC_PERIPHCLK_RTC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RNG)     == RCC_PERIPHCLK_RNG)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SDMMC1)  == RCC_PERIPHCLK_SDMMC1))

+

+#elif defined(STM32L4R5xx) || defined(STM32L4S5xx)

+

+#define IS_RCC_PERIPHCLOCK(__SELECTION__)  \

+               ((((__SELECTION__) & RCC_PERIPHCLK_USART1)      == RCC_PERIPHCLK_USART1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART2)      == RCC_PERIPHCLK_USART2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART3)      == RCC_PERIPHCLK_USART3)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_UART4)       == RCC_PERIPHCLK_UART4)   || \

+                (((__SELECTION__) & RCC_PERIPHCLK_UART5)       == RCC_PERIPHCLK_UART5)   || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPUART1)     == RCC_PERIPHCLK_LPUART1) || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C1)        == RCC_PERIPHCLK_I2C1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C2)        == RCC_PERIPHCLK_I2C2)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C3)        == RCC_PERIPHCLK_I2C3)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C4)        == RCC_PERIPHCLK_I2C4)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM1)      == RCC_PERIPHCLK_LPTIM1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM2)      == RCC_PERIPHCLK_LPTIM2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SAI1)        == RCC_PERIPHCLK_SAI1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SAI2)        == RCC_PERIPHCLK_SAI2)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USB)         == RCC_PERIPHCLK_USB)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_ADC)         == RCC_PERIPHCLK_ADC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_DFSDM1)      == RCC_PERIPHCLK_DFSDM1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_DFSDM1AUDIO) == RCC_PERIPHCLK_DFSDM1AUDIO) || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RTC)         == RCC_PERIPHCLK_RTC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RNG)         == RCC_PERIPHCLK_RNG)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SDMMC1)      == RCC_PERIPHCLK_SDMMC1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_OSPI)        == RCC_PERIPHCLK_OSPI))

+

+#elif defined(STM32L4R7xx) || defined(STM32L4S7xx)

+

+#define IS_RCC_PERIPHCLOCK(__SELECTION__)  \

+               ((((__SELECTION__) & RCC_PERIPHCLK_USART1)      == RCC_PERIPHCLK_USART1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART2)      == RCC_PERIPHCLK_USART2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART3)      == RCC_PERIPHCLK_USART3)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_UART4)       == RCC_PERIPHCLK_UART4)   || \

+                (((__SELECTION__) & RCC_PERIPHCLK_UART5)       == RCC_PERIPHCLK_UART5)   || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPUART1)     == RCC_PERIPHCLK_LPUART1) || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C1)        == RCC_PERIPHCLK_I2C1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C2)        == RCC_PERIPHCLK_I2C2)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C3)        == RCC_PERIPHCLK_I2C3)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C4)        == RCC_PERIPHCLK_I2C4)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM1)      == RCC_PERIPHCLK_LPTIM1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM2)      == RCC_PERIPHCLK_LPTIM2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SAI1)        == RCC_PERIPHCLK_SAI1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SAI2)        == RCC_PERIPHCLK_SAI2)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USB)         == RCC_PERIPHCLK_USB)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_ADC)         == RCC_PERIPHCLK_ADC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_DFSDM1)      == RCC_PERIPHCLK_DFSDM1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_DFSDM1AUDIO) == RCC_PERIPHCLK_DFSDM1AUDIO) || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RTC)         == RCC_PERIPHCLK_RTC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RNG)         == RCC_PERIPHCLK_RNG)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SDMMC1)      == RCC_PERIPHCLK_SDMMC1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_OSPI)        == RCC_PERIPHCLK_OSPI) || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LTDC)        == RCC_PERIPHCLK_LTDC))

+

+#elif defined(STM32L4R9xx) || defined(STM32L4S9xx)

+

+#define IS_RCC_PERIPHCLOCK(__SELECTION__)  \

+               ((((__SELECTION__) & RCC_PERIPHCLK_USART1)      == RCC_PERIPHCLK_USART1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART2)      == RCC_PERIPHCLK_USART2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART3)      == RCC_PERIPHCLK_USART3)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_UART4)       == RCC_PERIPHCLK_UART4)   || \

+                (((__SELECTION__) & RCC_PERIPHCLK_UART5)       == RCC_PERIPHCLK_UART5)   || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPUART1)     == RCC_PERIPHCLK_LPUART1) || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C1)        == RCC_PERIPHCLK_I2C1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C2)        == RCC_PERIPHCLK_I2C2)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C3)        == RCC_PERIPHCLK_I2C3)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C4)        == RCC_PERIPHCLK_I2C4)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM1)      == RCC_PERIPHCLK_LPTIM1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM2)      == RCC_PERIPHCLK_LPTIM2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SAI1)        == RCC_PERIPHCLK_SAI1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SAI2)        == RCC_PERIPHCLK_SAI2)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USB)         == RCC_PERIPHCLK_USB)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_ADC)         == RCC_PERIPHCLK_ADC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_DFSDM1)      == RCC_PERIPHCLK_DFSDM1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_DFSDM1AUDIO) == RCC_PERIPHCLK_DFSDM1AUDIO) || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RTC)         == RCC_PERIPHCLK_RTC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RNG)         == RCC_PERIPHCLK_RNG)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SDMMC1)      == RCC_PERIPHCLK_SDMMC1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_OSPI)        == RCC_PERIPHCLK_OSPI)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LTDC)        == RCC_PERIPHCLK_LTDC)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_DSI)         == RCC_PERIPHCLK_DSI))

+

+#else

+

+#define IS_RCC_PERIPHCLOCK(__SELECTION__)  \

+               ((((__SELECTION__) & RCC_PERIPHCLK_USART1)  == RCC_PERIPHCLK_USART1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART2)  == RCC_PERIPHCLK_USART2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USART3)  == RCC_PERIPHCLK_USART3)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_UART4)   == RCC_PERIPHCLK_UART4)   || \

+                (((__SELECTION__) & RCC_PERIPHCLK_UART5)   == RCC_PERIPHCLK_UART5)   || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPUART1) == RCC_PERIPHCLK_LPUART1) || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C1)    == RCC_PERIPHCLK_I2C1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C2)    == RCC_PERIPHCLK_I2C2)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_I2C3)    == RCC_PERIPHCLK_I2C3)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM1)  == RCC_PERIPHCLK_LPTIM1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_LPTIM2)  == RCC_PERIPHCLK_LPTIM2)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SAI1)    == RCC_PERIPHCLK_SAI1)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SAI2)    == RCC_PERIPHCLK_SAI2)    || \

+                (((__SELECTION__) & RCC_PERIPHCLK_USB)     == RCC_PERIPHCLK_USB)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_ADC)     == RCC_PERIPHCLK_ADC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SWPMI1)  == RCC_PERIPHCLK_SWPMI1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_DFSDM1)  == RCC_PERIPHCLK_DFSDM1)  || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RTC)     == RCC_PERIPHCLK_RTC)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_RNG)     == RCC_PERIPHCLK_RNG)     || \

+                (((__SELECTION__) & RCC_PERIPHCLK_SDMMC1)  == RCC_PERIPHCLK_SDMMC1))

+

+#endif /* STM32L412xx || STM32L422xx */

+

+#define IS_RCC_USART1CLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_USART1CLKSOURCE_PCLK2)  || \

+                ((__SOURCE__) == RCC_USART1CLKSOURCE_SYSCLK) || \

+                ((__SOURCE__) == RCC_USART1CLKSOURCE_LSE)    || \

+                ((__SOURCE__) == RCC_USART1CLKSOURCE_HSI))

+

+#define IS_RCC_USART2CLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_USART2CLKSOURCE_PCLK1)  || \

+                ((__SOURCE__) == RCC_USART2CLKSOURCE_SYSCLK) || \

+                ((__SOURCE__) == RCC_USART2CLKSOURCE_LSE)    || \

+                ((__SOURCE__) == RCC_USART2CLKSOURCE_HSI))

+

+#if defined(USART3)

+

+#define IS_RCC_USART3CLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_USART3CLKSOURCE_PCLK1)  || \

+                ((__SOURCE__) == RCC_USART3CLKSOURCE_SYSCLK) || \

+                ((__SOURCE__) == RCC_USART3CLKSOURCE_LSE)    || \

+                ((__SOURCE__) == RCC_USART3CLKSOURCE_HSI))

+

+#endif /* USART3 */

+

+#if defined(UART4)

+

+#define IS_RCC_UART4CLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_UART4CLKSOURCE_PCLK1)  || \

+                ((__SOURCE__) == RCC_UART4CLKSOURCE_SYSCLK) || \

+                ((__SOURCE__) == RCC_UART4CLKSOURCE_LSE)    || \

+                ((__SOURCE__) == RCC_UART4CLKSOURCE_HSI))

+

+#endif /* UART4 */

+

+#if defined(UART5)

+

+#define IS_RCC_UART5CLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_UART5CLKSOURCE_PCLK1)  || \

+                ((__SOURCE__) == RCC_UART5CLKSOURCE_SYSCLK) || \

+                ((__SOURCE__) == RCC_UART5CLKSOURCE_LSE)    || \

+                ((__SOURCE__) == RCC_UART5CLKSOURCE_HSI))

+

+#endif /* UART5 */

+

+#define IS_RCC_LPUART1CLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_LPUART1CLKSOURCE_PCLK1)  || \

+                ((__SOURCE__) == RCC_LPUART1CLKSOURCE_SYSCLK) || \

+                ((__SOURCE__) == RCC_LPUART1CLKSOURCE_LSE)    || \

+                ((__SOURCE__) == RCC_LPUART1CLKSOURCE_HSI))

+

+#define IS_RCC_I2C1CLKSOURCE(__SOURCE__)   \

+               (((__SOURCE__) == RCC_I2C1CLKSOURCE_PCLK1) || \

+                ((__SOURCE__) == RCC_I2C1CLKSOURCE_SYSCLK)|| \

+                ((__SOURCE__) == RCC_I2C1CLKSOURCE_HSI))

+

+#if defined(I2C2)

+

+#define IS_RCC_I2C2CLKSOURCE(__SOURCE__)   \

+               (((__SOURCE__) == RCC_I2C2CLKSOURCE_PCLK1) || \

+                ((__SOURCE__) == RCC_I2C2CLKSOURCE_SYSCLK)|| \

+                ((__SOURCE__) == RCC_I2C2CLKSOURCE_HSI))

+

+#endif /* I2C2 */

+

+#define IS_RCC_I2C3CLKSOURCE(__SOURCE__)   \

+               (((__SOURCE__) == RCC_I2C3CLKSOURCE_PCLK1) || \

+                ((__SOURCE__) == RCC_I2C3CLKSOURCE_SYSCLK)|| \

+                ((__SOURCE__) == RCC_I2C3CLKSOURCE_HSI))

+

+#if defined(I2C4)

+

+#define IS_RCC_I2C4CLKSOURCE(__SOURCE__)   \

+               (((__SOURCE__) == RCC_I2C4CLKSOURCE_PCLK1) || \

+                ((__SOURCE__) == RCC_I2C4CLKSOURCE_SYSCLK)|| \

+                ((__SOURCE__) == RCC_I2C4CLKSOURCE_HSI))

+

+#endif /* I2C4 */

+

+#if defined(RCC_PLLSAI2_SUPPORT)

+

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+#define IS_RCC_SAI1CLK(__SOURCE__)   \

+               (((__SOURCE__) == RCC_SAI1CLKSOURCE_PLLSAI1) || \

+                ((__SOURCE__) == RCC_SAI1CLKSOURCE_PLLSAI2) || \

+                ((__SOURCE__) == RCC_SAI1CLKSOURCE_PLL)     || \

+                ((__SOURCE__) == RCC_SAI1CLKSOURCE_PIN)     || \

+                ((__SOURCE__) == RCC_SAI1CLKSOURCE_HSI))

+#else

+#define IS_RCC_SAI1CLK(__SOURCE__)   \

+               (((__SOURCE__) == RCC_SAI1CLKSOURCE_PLLSAI1) || \

+                ((__SOURCE__) == RCC_SAI1CLKSOURCE_PLLSAI2) || \

+                ((__SOURCE__) == RCC_SAI1CLKSOURCE_PLL)     || \

+                ((__SOURCE__) == RCC_SAI1CLKSOURCE_PIN))

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+#elif defined(RCC_PLLSAI1_SUPPORT)

+

+#define IS_RCC_SAI1CLK(__SOURCE__)   \

+               (((__SOURCE__) == RCC_SAI1CLKSOURCE_PLLSAI1) || \

+                ((__SOURCE__) == RCC_SAI1CLKSOURCE_PLL)     || \

+                ((__SOURCE__) == RCC_SAI1CLKSOURCE_PIN))

+

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+#if defined(RCC_PLLSAI2_SUPPORT)

+

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+#define IS_RCC_SAI2CLK(__SOURCE__)   \

+               (((__SOURCE__) == RCC_SAI2CLKSOURCE_PLLSAI1) || \

+                ((__SOURCE__) == RCC_SAI2CLKSOURCE_PLLSAI2) || \

+                ((__SOURCE__) == RCC_SAI2CLKSOURCE_PLL)     || \

+                ((__SOURCE__) == RCC_SAI2CLKSOURCE_PIN)     || \

+                ((__SOURCE__) == RCC_SAI2CLKSOURCE_HSI))

+#else

+#define IS_RCC_SAI2CLK(__SOURCE__)   \

+               (((__SOURCE__) == RCC_SAI2CLKSOURCE_PLLSAI1) || \

+                ((__SOURCE__) == RCC_SAI2CLKSOURCE_PLLSAI2) || \

+                ((__SOURCE__) == RCC_SAI2CLKSOURCE_PLL)     || \

+                ((__SOURCE__) == RCC_SAI2CLKSOURCE_PIN))

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+#define IS_RCC_LPTIM1CLK(__SOURCE__)  \

+               (((__SOURCE__) == RCC_LPTIM1CLKSOURCE_PCLK1) || \

+                ((__SOURCE__) == RCC_LPTIM1CLKSOURCE_LSI)   || \

+                ((__SOURCE__) == RCC_LPTIM1CLKSOURCE_HSI)   || \

+                ((__SOURCE__) == RCC_LPTIM1CLKSOURCE_LSE))

+

+#define IS_RCC_LPTIM2CLK(__SOURCE__)  \

+               (((__SOURCE__) == RCC_LPTIM2CLKSOURCE_PCLK1) || \

+                ((__SOURCE__) == RCC_LPTIM2CLKSOURCE_LSI)   || \

+                ((__SOURCE__) == RCC_LPTIM2CLKSOURCE_HSI)   || \

+                ((__SOURCE__) == RCC_LPTIM2CLKSOURCE_LSE))

+

+#if defined(SDMMC1)

+#if defined(RCC_HSI48_SUPPORT) && defined(RCC_CCIPR2_SDMMCSEL)

+

+#define IS_RCC_SDMMC1CLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_SDMMC1CLKSOURCE_PLLP)    || \

+                ((__SOURCE__) == RCC_SDMMC1CLKSOURCE_HSI48)   || \

+                ((__SOURCE__) == RCC_SDMMC1CLKSOURCE_PLLSAI1) || \

+                ((__SOURCE__) == RCC_SDMMC1CLKSOURCE_PLL)     || \

+                ((__SOURCE__) == RCC_SDMMC1CLKSOURCE_MSI))

+

+#elif defined(RCC_HSI48_SUPPORT)

+

+#define IS_RCC_SDMMC1CLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_SDMMC1CLKSOURCE_HSI48)   || \

+                ((__SOURCE__) == RCC_SDMMC1CLKSOURCE_PLLSAI1) || \

+                ((__SOURCE__) == RCC_SDMMC1CLKSOURCE_PLL)     || \

+                ((__SOURCE__) == RCC_SDMMC1CLKSOURCE_MSI))

+#else

+

+#define IS_RCC_SDMMC1CLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_SDMMC1CLKSOURCE_NONE)    || \

+                ((__SOURCE__) == RCC_SDMMC1CLKSOURCE_PLLSAI1) || \

+                ((__SOURCE__) == RCC_SDMMC1CLKSOURCE_PLL)     || \

+                ((__SOURCE__) == RCC_SDMMC1CLKSOURCE_MSI))

+

+#endif /* RCC_HSI48_SUPPORT */

+#endif /* SDMMC1 */

+

+#if defined(RCC_HSI48_SUPPORT)

+

+#if defined(RCC_PLLSAI1_SUPPORT)

+#define IS_RCC_RNGCLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_RNGCLKSOURCE_HSI48)   || \

+                ((__SOURCE__) == RCC_RNGCLKSOURCE_PLLSAI1) || \

+                ((__SOURCE__) == RCC_RNGCLKSOURCE_PLL)     || \

+                ((__SOURCE__) == RCC_RNGCLKSOURCE_MSI))

+#else

+#define IS_RCC_RNGCLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_RNGCLKSOURCE_HSI48)   || \

+                ((__SOURCE__) == RCC_RNGCLKSOURCE_PLL)     || \

+                ((__SOURCE__) == RCC_RNGCLKSOURCE_MSI))

+#endif /* RCC_PLLSAI1_SUPPORT */

+

+#else

+

+#define IS_RCC_RNGCLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_RNGCLKSOURCE_NONE)    || \

+                ((__SOURCE__) == RCC_RNGCLKSOURCE_PLLSAI1) || \

+                ((__SOURCE__) == RCC_RNGCLKSOURCE_PLL)     || \

+                ((__SOURCE__) == RCC_RNGCLKSOURCE_MSI))

+

+#endif /* RCC_HSI48_SUPPORT */

+

+#if defined(USB_OTG_FS) || defined(USB)

+#if defined(RCC_HSI48_SUPPORT)

+

+#if defined(RCC_PLLSAI1_SUPPORT)

+#define IS_RCC_USBCLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_USBCLKSOURCE_HSI48)   || \

+                ((__SOURCE__) == RCC_USBCLKSOURCE_PLLSAI1) || \

+                ((__SOURCE__) == RCC_USBCLKSOURCE_PLL)     || \

+                ((__SOURCE__) == RCC_USBCLKSOURCE_MSI))

+#else

+#define IS_RCC_USBCLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_USBCLKSOURCE_HSI48)   || \

+                ((__SOURCE__) == RCC_USBCLKSOURCE_PLL)     || \

+                ((__SOURCE__) == RCC_USBCLKSOURCE_MSI))

+#endif /* RCC_PLLSAI1_SUPPORT */

+

+#else

+

+#define IS_RCC_USBCLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_USBCLKSOURCE_NONE)    || \

+                ((__SOURCE__) == RCC_USBCLKSOURCE_PLLSAI1) || \

+                ((__SOURCE__) == RCC_USBCLKSOURCE_PLL)     || \

+                ((__SOURCE__) == RCC_USBCLKSOURCE_MSI))

+

+#endif /* RCC_HSI48_SUPPORT */

+#endif /* USB_OTG_FS || USB */

+

+#if defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx) || defined(STM32L496xx) || defined(STM32L4A6xx)

+

+#define IS_RCC_ADCCLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_ADCCLKSOURCE_NONE)    || \

+                ((__SOURCE__) == RCC_ADCCLKSOURCE_PLLSAI1) || \

+                ((__SOURCE__) == RCC_ADCCLKSOURCE_PLLSAI2) || \

+                ((__SOURCE__) == RCC_ADCCLKSOURCE_SYSCLK))

+

+#else

+

+#if defined(RCC_PLLSAI1_SUPPORT)

+#define IS_RCC_ADCCLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_ADCCLKSOURCE_NONE)    || \

+                ((__SOURCE__) == RCC_ADCCLKSOURCE_PLLSAI1) || \

+                ((__SOURCE__) == RCC_ADCCLKSOURCE_SYSCLK))

+#else

+#define IS_RCC_ADCCLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_ADCCLKSOURCE_NONE)    || \

+                ((__SOURCE__) == RCC_ADCCLKSOURCE_SYSCLK))

+#endif /* RCC_PLLSAI1_SUPPORT */

+

+#endif /* STM32L471xx || STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx || STM32L496xx || STM32L4A6xx */

+

+#if defined(SWPMI1)

+

+#define IS_RCC_SWPMI1CLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_SWPMI1CLKSOURCE_PCLK1) || \

+                ((__SOURCE__) == RCC_SWPMI1CLKSOURCE_HSI))

+

+#endif /* SWPMI1 */

+

+#if defined(DFSDM1_Filter0)

+

+#define IS_RCC_DFSDM1CLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_DFSDM1CLKSOURCE_PCLK2) || \

+                ((__SOURCE__) == RCC_DFSDM1CLKSOURCE_SYSCLK))

+

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+

+#define IS_RCC_DFSDM1AUDIOCLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_SAI1) || \

+                ((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_HSI) || \

+                ((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_MSI))

+

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+#endif /* DFSDM1_Filter0 */

+

+#if defined(LTDC)

+

+#define IS_RCC_LTDCCLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_LTDCCLKSOURCE_PLLSAI2_DIV2) || \

+                ((__SOURCE__) == RCC_LTDCCLKSOURCE_PLLSAI2_DIV4) || \

+                ((__SOURCE__) == RCC_LTDCCLKSOURCE_PLLSAI2_DIV8) || \

+                ((__SOURCE__) == RCC_LTDCCLKSOURCE_PLLSAI2_DIV16))

+

+#endif /* LTDC */

+

+#if defined(DSI)

+

+#define IS_RCC_DSICLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_DSICLKSOURCE_DSIPHY) || \

+                ((__SOURCE__) == RCC_DSICLKSOURCE_PLLSAI2))

+

+#endif /* DSI */

+

+#if defined(OCTOSPI1) || defined(OCTOSPI2)

+

+#define IS_RCC_OSPICLKSOURCE(__SOURCE__)  \

+               (((__SOURCE__) == RCC_OSPICLKSOURCE_SYSCLK) || \

+                ((__SOURCE__) == RCC_OSPICLKSOURCE_MSI) || \

+                ((__SOURCE__) == RCC_OSPICLKSOURCE_PLL))

+

+#endif /* OCTOSPI1 || OCTOSPI2 */

+

+#if defined(RCC_PLLSAI1_SUPPORT)

+

+#define IS_RCC_PLLSAI1SOURCE(__VALUE__)    IS_RCC_PLLSOURCE(__VALUE__)

+

+#if defined(RCC_PLLSAI1M_DIV_1_16_SUPPORT)

+#define IS_RCC_PLLSAI1M_VALUE(__VALUE__)   ((1U <= (__VALUE__)) && ((__VALUE__) <= 16U))

+#else

+#define IS_RCC_PLLSAI1M_VALUE(__VALUE__)   ((1U <= (__VALUE__)) && ((__VALUE__) <= 8U))

+#endif /* RCC_PLLSAI1M_DIV_1_16_SUPPORT */

+

+#define IS_RCC_PLLSAI1N_VALUE(__VALUE__)   ((8U <= (__VALUE__)) && ((__VALUE__) <= 86U))

+

+#if defined(RCC_PLLSAI1P_DIV_2_31_SUPPORT)

+#define IS_RCC_PLLSAI1P_VALUE(__VALUE__)   (((__VALUE__) >= 2U) && ((__VALUE__) <= 31U))

+#else

+#define IS_RCC_PLLSAI1P_VALUE(__VALUE__)   (((__VALUE__) == 7U) || ((__VALUE__) == 17U))

+#endif /* RCC_PLLSAI1P_DIV_2_31_SUPPORT */

+

+#define IS_RCC_PLLSAI1Q_VALUE(__VALUE__)   (((__VALUE__) == 2U) || ((__VALUE__) == 4U) || \

+                                            ((__VALUE__) == 6U) || ((__VALUE__) == 8U))

+

+#define IS_RCC_PLLSAI1R_VALUE(__VALUE__)   (((__VALUE__) == 2U) || ((__VALUE__) == 4U) || \

+                                            ((__VALUE__) == 6U) || ((__VALUE__) == 8U))

+

+#endif /* RCC_PLLSAI1_SUPPORT */

+

+#if defined(RCC_PLLSAI2_SUPPORT)

+

+#define IS_RCC_PLLSAI2SOURCE(__VALUE__)    IS_RCC_PLLSOURCE(__VALUE__)

+

+#if defined(RCC_PLLSAI2M_DIV_1_16_SUPPORT)

+#define IS_RCC_PLLSAI2M_VALUE(__VALUE__)   ((1U <= (__VALUE__)) && ((__VALUE__) <= 16U))

+#else

+#define IS_RCC_PLLSAI2M_VALUE(__VALUE__)   ((1U <= (__VALUE__)) && ((__VALUE__) <= 8U))

+#endif /* RCC_PLLSAI2M_DIV_1_16_SUPPORT */

+

+#define IS_RCC_PLLSAI2N_VALUE(__VALUE__)   ((8U <= (__VALUE__)) && ((__VALUE__) <= 86U))

+

+#if defined(RCC_PLLSAI2P_DIV_2_31_SUPPORT)

+#define IS_RCC_PLLSAI2P_VALUE(__VALUE__)   (((__VALUE__) >= 2U) && ((__VALUE__) <= 31U))

+#else

+#define IS_RCC_PLLSAI2P_VALUE(__VALUE__)   (((__VALUE__) == 7U) || ((__VALUE__) == 17U))

+#endif /* RCC_PLLSAI2P_DIV_2_31_SUPPORT */

+

+#if defined(RCC_PLLSAI2Q_DIV_SUPPORT)

+#define IS_RCC_PLLSAI2Q_VALUE(__VALUE__)   (((__VALUE__) == 2U) || ((__VALUE__) == 4U) || \

+                                            ((__VALUE__) == 6U) || ((__VALUE__) == 8U))

+#endif /* RCC_PLLSAI2Q_DIV_SUPPORT */

+

+#define IS_RCC_PLLSAI2R_VALUE(__VALUE__)   (((__VALUE__) == 2U) || ((__VALUE__) == 4U) || \

+                                            ((__VALUE__) == 6U) || ((__VALUE__) == 8U))

+

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+#if defined(CRS)

+

+#define IS_RCC_CRS_SYNC_SOURCE(__SOURCE__) (((__SOURCE__) == RCC_CRS_SYNC_SOURCE_GPIO) || \

+                                            ((__SOURCE__) == RCC_CRS_SYNC_SOURCE_LSE)  || \

+                                            ((__SOURCE__) == RCC_CRS_SYNC_SOURCE_USB))

+

+#define IS_RCC_CRS_SYNC_DIV(__DIV__)       (((__DIV__) == RCC_CRS_SYNC_DIV1)  || ((__DIV__) == RCC_CRS_SYNC_DIV2)  || \

+                                            ((__DIV__) == RCC_CRS_SYNC_DIV4)  || ((__DIV__) == RCC_CRS_SYNC_DIV8)  || \

+                                            ((__DIV__) == RCC_CRS_SYNC_DIV16) || ((__DIV__) == RCC_CRS_SYNC_DIV32) || \

+                                            ((__DIV__) == RCC_CRS_SYNC_DIV64) || ((__DIV__) == RCC_CRS_SYNC_DIV128))

+

+#define IS_RCC_CRS_SYNC_POLARITY(__POLARITY__) (((__POLARITY__) == RCC_CRS_SYNC_POLARITY_RISING) || \

+                                                ((__POLARITY__) == RCC_CRS_SYNC_POLARITY_FALLING))

+

+#define IS_RCC_CRS_RELOADVALUE(__VALUE__)  (((__VALUE__) <= 0xFFFFU))

+

+#define IS_RCC_CRS_ERRORLIMIT(__VALUE__)   (((__VALUE__) <= 0xFFU))

+

+#define IS_RCC_CRS_HSI48CALIBRATION(__VALUE__) (((__VALUE__) <= 0x3FU))

+

+#define IS_RCC_CRS_FREQERRORDIR(__DIR__)   (((__DIR__) == RCC_CRS_FREQERRORDIR_UP) || \

+                                            ((__DIR__) == RCC_CRS_FREQERRORDIR_DOWN))

+

+#endif /* CRS */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* __STM32L4xx_HAL_RCC_EX_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi.h
new file mode 100644
index 0000000..cd35f17
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi.h
@@ -0,0 +1,846 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_spi.h

+  * @author  MCD Application Team

+  * @brief   Header file of SPI HAL module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef STM32L4xx_HAL_SPI_H

+#define STM32L4xx_HAL_SPI_H

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup SPI

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+/** @defgroup SPI_Exported_Types SPI Exported Types

+  * @{

+  */

+

+/**

+  * @brief  SPI Configuration Structure definition

+  */

+typedef struct

+{

+  uint32_t Mode;                /*!< Specifies the SPI operating mode.

+                                     This parameter can be a value of @ref SPI_Mode */

+

+  uint32_t Direction;           /*!< Specifies the SPI bidirectional mode state.

+                                     This parameter can be a value of @ref SPI_Direction */

+

+  uint32_t DataSize;            /*!< Specifies the SPI data size.

+                                     This parameter can be a value of @ref SPI_Data_Size */

+

+  uint32_t CLKPolarity;         /*!< Specifies the serial clock steady state.

+                                     This parameter can be a value of @ref SPI_Clock_Polarity */

+

+  uint32_t CLKPhase;            /*!< Specifies the clock active edge for the bit capture.

+                                     This parameter can be a value of @ref SPI_Clock_Phase */

+

+  uint32_t NSS;                 /*!< Specifies whether the NSS signal is managed by

+                                     hardware (NSS pin) or by software using the SSI bit.

+                                     This parameter can be a value of @ref SPI_Slave_Select_management */

+

+  uint32_t BaudRatePrescaler;   /*!< Specifies the Baud Rate prescaler value which will be

+                                     used to configure the transmit and receive SCK clock.

+                                     This parameter can be a value of @ref SPI_BaudRate_Prescaler

+                                     @note The communication clock is derived from the master

+                                     clock. The slave clock does not need to be set. */

+

+  uint32_t FirstBit;            /*!< Specifies whether data transfers start from MSB or LSB bit.

+                                     This parameter can be a value of @ref SPI_MSB_LSB_transmission */

+

+  uint32_t TIMode;              /*!< Specifies if the TI mode is enabled or not.

+                                     This parameter can be a value of @ref SPI_TI_mode */

+

+  uint32_t CRCCalculation;      /*!< Specifies if the CRC calculation is enabled or not.

+                                     This parameter can be a value of @ref SPI_CRC_Calculation */

+

+  uint32_t CRCPolynomial;       /*!< Specifies the polynomial used for the CRC calculation.

+                                     This parameter must be an odd number between Min_Data = 1 and Max_Data = 65535 */

+

+  uint32_t CRCLength;           /*!< Specifies the CRC Length used for the CRC calculation.

+                                     CRC Length is only used with Data8 and Data16, not other data size

+                                     This parameter can be a value of @ref SPI_CRC_length */

+

+  uint32_t NSSPMode;            /*!< Specifies whether the NSSP signal is enabled or not .

+                                     This parameter can be a value of @ref SPI_NSSP_Mode

+                                     This mode is activated by the NSSP bit in the SPIx_CR2 register and

+                                     it takes effect only if the SPI interface is configured as Motorola SPI

+                                     master (FRF=0) with capture on the first edge (SPIx_CR1 CPHA = 0,

+                                     CPOL setting is ignored).. */

+} SPI_InitTypeDef;

+

+/**

+  * @brief  HAL SPI State structure definition

+  */

+typedef enum

+{

+  HAL_SPI_STATE_RESET      = 0x00U,    /*!< Peripheral not Initialized                         */

+  HAL_SPI_STATE_READY      = 0x01U,    /*!< Peripheral Initialized and ready for use           */

+  HAL_SPI_STATE_BUSY       = 0x02U,    /*!< an internal process is ongoing                     */

+  HAL_SPI_STATE_BUSY_TX    = 0x03U,    /*!< Data Transmission process is ongoing               */

+  HAL_SPI_STATE_BUSY_RX    = 0x04U,    /*!< Data Reception process is ongoing                  */

+  HAL_SPI_STATE_BUSY_TX_RX = 0x05U,    /*!< Data Transmission and Reception process is ongoing */

+  HAL_SPI_STATE_ERROR      = 0x06U,    /*!< SPI error state                                    */

+  HAL_SPI_STATE_ABORT      = 0x07U     /*!< SPI abort is ongoing                               */

+} HAL_SPI_StateTypeDef;

+

+/**

+  * @brief  SPI handle Structure definition

+  */

+typedef struct __SPI_HandleTypeDef

+{

+  SPI_TypeDef                *Instance;      /*!< SPI registers base address               */

+

+  SPI_InitTypeDef            Init;           /*!< SPI communication parameters             */

+

+  uint8_t                    *pTxBuffPtr;    /*!< Pointer to SPI Tx transfer Buffer        */

+

+  uint16_t                   TxXferSize;     /*!< SPI Tx Transfer size                     */

+

+  __IO uint16_t              TxXferCount;    /*!< SPI Tx Transfer Counter                  */

+

+  uint8_t                    *pRxBuffPtr;    /*!< Pointer to SPI Rx transfer Buffer        */

+

+  uint16_t                   RxXferSize;     /*!< SPI Rx Transfer size                     */

+

+  __IO uint16_t              RxXferCount;    /*!< SPI Rx Transfer Counter                  */

+

+  uint32_t                   CRCSize;        /*!< SPI CRC size used for the transfer       */

+

+  void (*RxISR)(struct __SPI_HandleTypeDef *hspi);   /*!< function pointer on Rx ISR       */

+

+  void (*TxISR)(struct __SPI_HandleTypeDef *hspi);   /*!< function pointer on Tx ISR       */

+

+  DMA_HandleTypeDef          *hdmatx;        /*!< SPI Tx DMA Handle parameters             */

+

+  DMA_HandleTypeDef          *hdmarx;        /*!< SPI Rx DMA Handle parameters             */

+

+  HAL_LockTypeDef            Lock;           /*!< Locking object                           */

+

+  __IO HAL_SPI_StateTypeDef  State;          /*!< SPI communication state                  */

+

+  __IO uint32_t              ErrorCode;      /*!< SPI Error code                           */

+

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+  void (* TxCpltCallback)(struct __SPI_HandleTypeDef *hspi);             /*!< SPI Tx Completed callback          */

+  void (* RxCpltCallback)(struct __SPI_HandleTypeDef *hspi);             /*!< SPI Rx Completed callback          */

+  void (* TxRxCpltCallback)(struct __SPI_HandleTypeDef *hspi);           /*!< SPI TxRx Completed callback        */

+  void (* TxHalfCpltCallback)(struct __SPI_HandleTypeDef *hspi);         /*!< SPI Tx Half Completed callback     */

+  void (* RxHalfCpltCallback)(struct __SPI_HandleTypeDef *hspi);         /*!< SPI Rx Half Completed callback     */

+  void (* TxRxHalfCpltCallback)(struct __SPI_HandleTypeDef *hspi);       /*!< SPI TxRx Half Completed callback   */

+  void (* ErrorCallback)(struct __SPI_HandleTypeDef *hspi);              /*!< SPI Error callback                 */

+  void (* AbortCpltCallback)(struct __SPI_HandleTypeDef *hspi);          /*!< SPI Abort callback                 */

+  void (* MspInitCallback)(struct __SPI_HandleTypeDef *hspi);            /*!< SPI Msp Init callback              */

+  void (* MspDeInitCallback)(struct __SPI_HandleTypeDef *hspi);          /*!< SPI Msp DeInit callback            */

+

+#endif  /* USE_HAL_SPI_REGISTER_CALLBACKS */

+} SPI_HandleTypeDef;

+

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+/**

+  * @brief  HAL SPI Callback ID enumeration definition

+  */

+typedef enum

+{

+  HAL_SPI_TX_COMPLETE_CB_ID             = 0x00U,    /*!< SPI Tx Completed callback ID         */

+  HAL_SPI_RX_COMPLETE_CB_ID             = 0x01U,    /*!< SPI Rx Completed callback ID         */

+  HAL_SPI_TX_RX_COMPLETE_CB_ID          = 0x02U,    /*!< SPI TxRx Completed callback ID       */

+  HAL_SPI_TX_HALF_COMPLETE_CB_ID        = 0x03U,    /*!< SPI Tx Half Completed callback ID    */

+  HAL_SPI_RX_HALF_COMPLETE_CB_ID        = 0x04U,    /*!< SPI Rx Half Completed callback ID    */

+  HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID     = 0x05U,    /*!< SPI TxRx Half Completed callback ID  */

+  HAL_SPI_ERROR_CB_ID                   = 0x06U,    /*!< SPI Error callback ID                */

+  HAL_SPI_ABORT_CB_ID                   = 0x07U,    /*!< SPI Abort callback ID                */

+  HAL_SPI_MSPINIT_CB_ID                 = 0x08U,    /*!< SPI Msp Init callback ID             */

+  HAL_SPI_MSPDEINIT_CB_ID               = 0x09U     /*!< SPI Msp DeInit callback ID           */

+

+} HAL_SPI_CallbackIDTypeDef;

+

+/**

+  * @brief  HAL SPI Callback pointer definition

+  */

+typedef  void (*pSPI_CallbackTypeDef)(SPI_HandleTypeDef *hspi); /*!< pointer to an SPI callback function */

+

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+/**

+  * @}

+  */

+

+/* Exported constants --------------------------------------------------------*/

+/** @defgroup SPI_Exported_Constants SPI Exported Constants

+  * @{

+  */

+

+/** @defgroup SPI_Error_Code SPI Error Code

+  * @{

+  */

+#define HAL_SPI_ERROR_NONE              (0x00000000U)   /*!< No error                               */

+#define HAL_SPI_ERROR_MODF              (0x00000001U)   /*!< MODF error                             */

+#define HAL_SPI_ERROR_CRC               (0x00000002U)   /*!< CRC error                              */

+#define HAL_SPI_ERROR_OVR               (0x00000004U)   /*!< OVR error                              */

+#define HAL_SPI_ERROR_FRE               (0x00000008U)   /*!< FRE error                              */

+#define HAL_SPI_ERROR_DMA               (0x00000010U)   /*!< DMA transfer error                     */

+#define HAL_SPI_ERROR_FLAG              (0x00000020U)   /*!< Error on RXNE/TXE/BSY/FTLVL/FRLVL Flag */

+#define HAL_SPI_ERROR_ABORT             (0x00000040U)   /*!< Error during SPI Abort procedure       */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+#define HAL_SPI_ERROR_INVALID_CALLBACK  (0x00000080U)   /*!< Invalid Callback error                 */

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+/**

+  * @}

+  */

+

+/** @defgroup SPI_Mode SPI Mode

+  * @{

+  */

+#define SPI_MODE_SLAVE                  (0x00000000U)

+#define SPI_MODE_MASTER                 (SPI_CR1_MSTR | SPI_CR1_SSI)

+/**

+  * @}

+  */

+

+/** @defgroup SPI_Direction SPI Direction Mode

+  * @{

+  */

+#define SPI_DIRECTION_2LINES            (0x00000000U)

+#define SPI_DIRECTION_2LINES_RXONLY     SPI_CR1_RXONLY

+#define SPI_DIRECTION_1LINE             SPI_CR1_BIDIMODE

+/**

+  * @}

+  */

+

+/** @defgroup SPI_Data_Size SPI Data Size

+  * @{

+  */

+#define SPI_DATASIZE_4BIT               (0x00000300U)

+#define SPI_DATASIZE_5BIT               (0x00000400U)

+#define SPI_DATASIZE_6BIT               (0x00000500U)

+#define SPI_DATASIZE_7BIT               (0x00000600U)

+#define SPI_DATASIZE_8BIT               (0x00000700U)

+#define SPI_DATASIZE_9BIT               (0x00000800U)

+#define SPI_DATASIZE_10BIT              (0x00000900U)

+#define SPI_DATASIZE_11BIT              (0x00000A00U)

+#define SPI_DATASIZE_12BIT              (0x00000B00U)

+#define SPI_DATASIZE_13BIT              (0x00000C00U)

+#define SPI_DATASIZE_14BIT              (0x00000D00U)

+#define SPI_DATASIZE_15BIT              (0x00000E00U)

+#define SPI_DATASIZE_16BIT              (0x00000F00U)

+/**

+  * @}

+  */

+

+/** @defgroup SPI_Clock_Polarity SPI Clock Polarity

+  * @{

+  */

+#define SPI_POLARITY_LOW                (0x00000000U)

+#define SPI_POLARITY_HIGH               SPI_CR1_CPOL

+/**

+  * @}

+  */

+

+/** @defgroup SPI_Clock_Phase SPI Clock Phase

+  * @{

+  */

+#define SPI_PHASE_1EDGE                 (0x00000000U)

+#define SPI_PHASE_2EDGE                 SPI_CR1_CPHA

+/**

+  * @}

+  */

+

+/** @defgroup SPI_Slave_Select_management SPI Slave Select Management

+  * @{

+  */

+#define SPI_NSS_SOFT                    SPI_CR1_SSM

+#define SPI_NSS_HARD_INPUT              (0x00000000U)

+#define SPI_NSS_HARD_OUTPUT             (SPI_CR2_SSOE << 16U)

+/**

+  * @}

+  */

+

+/** @defgroup SPI_NSSP_Mode SPI NSS Pulse Mode

+  * @{

+  */

+#define SPI_NSS_PULSE_ENABLE            SPI_CR2_NSSP

+#define SPI_NSS_PULSE_DISABLE           (0x00000000U)

+/**

+  * @}

+  */

+

+/** @defgroup SPI_BaudRate_Prescaler SPI BaudRate Prescaler

+  * @{

+  */

+#define SPI_BAUDRATEPRESCALER_2         (0x00000000U)

+#define SPI_BAUDRATEPRESCALER_4         (SPI_CR1_BR_0)

+#define SPI_BAUDRATEPRESCALER_8         (SPI_CR1_BR_1)

+#define SPI_BAUDRATEPRESCALER_16        (SPI_CR1_BR_1 | SPI_CR1_BR_0)

+#define SPI_BAUDRATEPRESCALER_32        (SPI_CR1_BR_2)

+#define SPI_BAUDRATEPRESCALER_64        (SPI_CR1_BR_2 | SPI_CR1_BR_0)

+#define SPI_BAUDRATEPRESCALER_128       (SPI_CR1_BR_2 | SPI_CR1_BR_1)

+#define SPI_BAUDRATEPRESCALER_256       (SPI_CR1_BR_2 | SPI_CR1_BR_1 | SPI_CR1_BR_0)

+/**

+  * @}

+  */

+

+/** @defgroup SPI_MSB_LSB_transmission SPI MSB LSB Transmission

+  * @{

+  */

+#define SPI_FIRSTBIT_MSB                (0x00000000U)

+#define SPI_FIRSTBIT_LSB                SPI_CR1_LSBFIRST

+/**

+  * @}

+  */

+

+/** @defgroup SPI_TI_mode SPI TI Mode

+  * @{

+  */

+#define SPI_TIMODE_DISABLE              (0x00000000U)

+#define SPI_TIMODE_ENABLE               SPI_CR2_FRF

+/**

+  * @}

+  */

+

+/** @defgroup SPI_CRC_Calculation SPI CRC Calculation

+  * @{

+  */

+#define SPI_CRCCALCULATION_DISABLE      (0x00000000U)

+#define SPI_CRCCALCULATION_ENABLE       SPI_CR1_CRCEN

+/**

+  * @}

+  */

+

+/** @defgroup SPI_CRC_length SPI CRC Length

+  * @{

+  * This parameter can be one of the following values:

+  *     SPI_CRC_LENGTH_DATASIZE: aligned with the data size

+  *     SPI_CRC_LENGTH_8BIT    : CRC 8bit

+  *     SPI_CRC_LENGTH_16BIT   : CRC 16bit

+  */

+#define SPI_CRC_LENGTH_DATASIZE         (0x00000000U)

+#define SPI_CRC_LENGTH_8BIT             (0x00000001U)

+#define SPI_CRC_LENGTH_16BIT            (0x00000002U)

+/**

+  * @}

+  */

+

+/** @defgroup SPI_FIFO_reception_threshold SPI FIFO Reception Threshold

+  * @{

+  * This parameter can be one of the following values:

+  *     SPI_RXFIFO_THRESHOLD or SPI_RXFIFO_THRESHOLD_QF :

+  *          RXNE event is generated if the FIFO

+  *          level is greater or equal to 1/4(8-bits).

+  *     SPI_RXFIFO_THRESHOLD_HF: RXNE event is generated if the FIFO

+  *          level is greater or equal to 1/2(16 bits). */

+#define SPI_RXFIFO_THRESHOLD            SPI_CR2_FRXTH

+#define SPI_RXFIFO_THRESHOLD_QF         SPI_CR2_FRXTH

+#define SPI_RXFIFO_THRESHOLD_HF         (0x00000000U)

+/**

+  * @}

+  */

+

+/** @defgroup SPI_Interrupt_definition SPI Interrupt Definition

+  * @{

+  */

+#define SPI_IT_TXE                      SPI_CR2_TXEIE

+#define SPI_IT_RXNE                     SPI_CR2_RXNEIE

+#define SPI_IT_ERR                      SPI_CR2_ERRIE

+/**

+  * @}

+  */

+

+/** @defgroup SPI_Flags_definition SPI Flags Definition

+  * @{

+  */

+#define SPI_FLAG_RXNE                   SPI_SR_RXNE   /* SPI status flag: Rx buffer not empty flag       */

+#define SPI_FLAG_TXE                    SPI_SR_TXE    /* SPI status flag: Tx buffer empty flag           */

+#define SPI_FLAG_BSY                    SPI_SR_BSY    /* SPI status flag: Busy flag                      */

+#define SPI_FLAG_CRCERR                 SPI_SR_CRCERR /* SPI Error flag: CRC error flag                  */

+#define SPI_FLAG_MODF                   SPI_SR_MODF   /* SPI Error flag: Mode fault flag                 */

+#define SPI_FLAG_OVR                    SPI_SR_OVR    /* SPI Error flag: Overrun flag                    */

+#define SPI_FLAG_FRE                    SPI_SR_FRE    /* SPI Error flag: TI mode frame format error flag */

+#define SPI_FLAG_FTLVL                  SPI_SR_FTLVL  /* SPI fifo transmission level                     */

+#define SPI_FLAG_FRLVL                  SPI_SR_FRLVL  /* SPI fifo reception level                        */

+#define SPI_FLAG_MASK                   (SPI_SR_RXNE | SPI_SR_TXE | SPI_SR_BSY | SPI_SR_CRCERR | SPI_SR_MODF | SPI_SR_OVR | SPI_SR_FRE | SPI_SR_FTLVL | SPI_SR_FRLVL)

+/**

+  * @}

+  */

+

+/** @defgroup SPI_transmission_fifo_status_level SPI Transmission FIFO Status Level

+  * @{

+  */

+#define SPI_FTLVL_EMPTY                 (0x00000000U)

+#define SPI_FTLVL_QUARTER_FULL          (0x00000800U)

+#define SPI_FTLVL_HALF_FULL             (0x00001000U)

+#define SPI_FTLVL_FULL                  (0x00001800U)

+

+/**

+  * @}

+  */

+

+/** @defgroup SPI_reception_fifo_status_level SPI Reception FIFO Status Level

+  * @{

+  */

+#define SPI_FRLVL_EMPTY                 (0x00000000U)

+#define SPI_FRLVL_QUARTER_FULL          (0x00000200U)

+#define SPI_FRLVL_HALF_FULL             (0x00000400U)

+#define SPI_FRLVL_FULL                  (0x00000600U)

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Exported macros -----------------------------------------------------------*/

+/** @defgroup SPI_Exported_Macros SPI Exported Macros

+  * @{

+  */

+

+/** @brief  Reset SPI handle state.

+  * @param  __HANDLE__ specifies the SPI Handle.

+  *         This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral.

+  * @retval None

+  */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+#define __HAL_SPI_RESET_HANDLE_STATE(__HANDLE__)                do{                                                  \

+                                                                    (__HANDLE__)->State = HAL_SPI_STATE_RESET;       \

+                                                                    (__HANDLE__)->MspInitCallback = NULL;            \

+                                                                    (__HANDLE__)->MspDeInitCallback = NULL;          \

+                                                                  } while(0)

+#else

+#define __HAL_SPI_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_SPI_STATE_RESET)

+#endif

+

+/** @brief  Enable the specified SPI interrupts.

+  * @param  __HANDLE__ specifies the SPI Handle.

+  *         This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral.

+  * @param  __INTERRUPT__ specifies the interrupt source to enable.

+  *         This parameter can be one of the following values:

+  *            @arg SPI_IT_TXE: Tx buffer empty interrupt enable

+  *            @arg SPI_IT_RXNE: RX buffer not empty interrupt enable

+  *            @arg SPI_IT_ERR: Error interrupt enable

+  * @retval None

+  */

+#define __HAL_SPI_ENABLE_IT(__HANDLE__, __INTERRUPT__)   SET_BIT((__HANDLE__)->Instance->CR2, (__INTERRUPT__))

+

+/** @brief  Disable the specified SPI interrupts.

+  * @param  __HANDLE__ specifies the SPI handle.

+  *         This parameter can be SPIx where x: 1, 2, or 3 to select the SPI peripheral.

+  * @param  __INTERRUPT__ specifies the interrupt source to disable.

+  *         This parameter can be one of the following values:

+  *            @arg SPI_IT_TXE: Tx buffer empty interrupt enable

+  *            @arg SPI_IT_RXNE: RX buffer not empty interrupt enable

+  *            @arg SPI_IT_ERR: Error interrupt enable

+  * @retval None

+  */

+#define __HAL_SPI_DISABLE_IT(__HANDLE__, __INTERRUPT__)  CLEAR_BIT((__HANDLE__)->Instance->CR2, (__INTERRUPT__))

+

+/** @brief  Check whether the specified SPI interrupt source is enabled or not.

+  * @param  __HANDLE__ specifies the SPI Handle.

+  *         This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral.

+  * @param  __INTERRUPT__ specifies the SPI interrupt source to check.

+  *          This parameter can be one of the following values:

+  *            @arg SPI_IT_TXE: Tx buffer empty interrupt enable

+  *            @arg SPI_IT_RXNE: RX buffer not empty interrupt enable

+  *            @arg SPI_IT_ERR: Error interrupt enable

+  * @retval The new state of __IT__ (TRUE or FALSE).

+  */

+#define __HAL_SPI_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->CR2 & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET)

+

+/** @brief  Check whether the specified SPI flag is set or not.

+  * @param  __HANDLE__ specifies the SPI Handle.

+  *         This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral.

+  * @param  __FLAG__ specifies the flag to check.

+  *         This parameter can be one of the following values:

+  *            @arg SPI_FLAG_RXNE: Receive buffer not empty flag

+  *            @arg SPI_FLAG_TXE: Transmit buffer empty flag

+  *            @arg SPI_FLAG_CRCERR: CRC error flag

+  *            @arg SPI_FLAG_MODF: Mode fault flag

+  *            @arg SPI_FLAG_OVR: Overrun flag

+  *            @arg SPI_FLAG_BSY: Busy flag

+  *            @arg SPI_FLAG_FRE: Frame format error flag

+  *            @arg SPI_FLAG_FTLVL: SPI fifo transmission level

+  *            @arg SPI_FLAG_FRLVL: SPI fifo reception level

+  * @retval The new state of __FLAG__ (TRUE or FALSE).

+  */

+#define __HAL_SPI_GET_FLAG(__HANDLE__, __FLAG__) ((((__HANDLE__)->Instance->SR) & (__FLAG__)) == (__FLAG__))

+

+/** @brief  Clear the SPI CRCERR pending flag.

+  * @param  __HANDLE__ specifies the SPI Handle.

+  *         This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral.

+  * @retval None

+  */

+#define __HAL_SPI_CLEAR_CRCERRFLAG(__HANDLE__) ((__HANDLE__)->Instance->SR = (uint16_t)(~SPI_FLAG_CRCERR))

+

+/** @brief  Clear the SPI MODF pending flag.

+  * @param  __HANDLE__ specifies the SPI Handle.

+  *         This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral.

+  * @retval None

+  */

+#define __HAL_SPI_CLEAR_MODFFLAG(__HANDLE__)             \

+  do{                                                    \

+    __IO uint32_t tmpreg_modf = 0x00U;                   \

+    tmpreg_modf = (__HANDLE__)->Instance->SR;            \

+    CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_SPE); \

+    UNUSED(tmpreg_modf);                                 \

+  } while(0U)

+

+/** @brief  Clear the SPI OVR pending flag.

+  * @param  __HANDLE__ specifies the SPI Handle.

+  *         This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral.

+  * @retval None

+  */

+#define __HAL_SPI_CLEAR_OVRFLAG(__HANDLE__)        \

+  do{                                              \

+    __IO uint32_t tmpreg_ovr = 0x00U;              \

+    tmpreg_ovr = (__HANDLE__)->Instance->DR;       \

+    tmpreg_ovr = (__HANDLE__)->Instance->SR;       \

+    UNUSED(tmpreg_ovr);                            \

+  } while(0U)

+

+/** @brief  Clear the SPI FRE pending flag.

+  * @param  __HANDLE__ specifies the SPI Handle.

+  *         This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral.

+  * @retval None

+  */

+#define __HAL_SPI_CLEAR_FREFLAG(__HANDLE__)        \

+  do{                                              \

+  __IO uint32_t tmpreg_fre = 0x00U;                \

+  tmpreg_fre = (__HANDLE__)->Instance->SR;         \

+  UNUSED(tmpreg_fre);                              \

+  }while(0U)

+

+/** @brief  Enable the SPI peripheral.

+  * @param  __HANDLE__ specifies the SPI Handle.

+  *         This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral.

+  * @retval None

+  */

+#define __HAL_SPI_ENABLE(__HANDLE__)  SET_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_SPE)

+

+/** @brief  Disable the SPI peripheral.

+  * @param  __HANDLE__ specifies the SPI Handle.

+  *         This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral.

+  * @retval None

+  */

+#define __HAL_SPI_DISABLE(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_SPE)

+

+/**

+  * @}

+  */

+

+/* Private macros ------------------------------------------------------------*/

+/** @defgroup SPI_Private_Macros SPI Private Macros

+  * @{

+  */

+

+/** @brief  Set the SPI transmit-only mode.

+  * @param  __HANDLE__ specifies the SPI Handle.

+  *         This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral.

+  * @retval None

+  */

+#define SPI_1LINE_TX(__HANDLE__)  SET_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_BIDIOE)

+

+/** @brief  Set the SPI receive-only mode.

+  * @param  __HANDLE__ specifies the SPI Handle.

+  *         This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral.

+  * @retval None

+  */

+#define SPI_1LINE_RX(__HANDLE__)  CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_BIDIOE)

+

+/** @brief  Reset the CRC calculation of the SPI.

+  * @param  __HANDLE__ specifies the SPI Handle.

+  *         This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral.

+  * @retval None

+  */

+#define SPI_RESET_CRC(__HANDLE__) do{CLEAR_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_CRCEN);\

+                                       SET_BIT((__HANDLE__)->Instance->CR1, SPI_CR1_CRCEN);}while(0U)

+

+/** @brief  Check whether the specified SPI flag is set or not.

+  * @param  __SR__  copy of SPI SR regsiter.

+  * @param  __FLAG__ specifies the flag to check.

+  *         This parameter can be one of the following values:

+  *            @arg SPI_FLAG_RXNE: Receive buffer not empty flag

+  *            @arg SPI_FLAG_TXE: Transmit buffer empty flag

+  *            @arg SPI_FLAG_CRCERR: CRC error flag

+  *            @arg SPI_FLAG_MODF: Mode fault flag

+  *            @arg SPI_FLAG_OVR: Overrun flag

+  *            @arg SPI_FLAG_BSY: Busy flag

+  *            @arg SPI_FLAG_FRE: Frame format error flag

+  *            @arg SPI_FLAG_FTLVL: SPI fifo transmission level

+  *            @arg SPI_FLAG_FRLVL: SPI fifo reception level

+  * @retval SET or RESET.

+  */

+#define SPI_CHECK_FLAG(__SR__, __FLAG__)         ((((__SR__) & ((__FLAG__) & SPI_FLAG_MASK)) == ((__FLAG__) & SPI_FLAG_MASK)) ? SET : RESET)

+

+/** @brief  Check whether the specified SPI Interrupt is set or not.

+  * @param  __CR2__  copy of SPI CR2 regsiter.

+  * @param  __INTERRUPT__ specifies the SPI interrupt source to check.

+  *         This parameter can be one of the following values:

+  *            @arg SPI_IT_TXE: Tx buffer empty interrupt enable

+  *            @arg SPI_IT_RXNE: RX buffer not empty interrupt enable

+  *            @arg SPI_IT_ERR: Error interrupt enable

+  * @retval SET or RESET.

+  */

+#define SPI_CHECK_IT_SOURCE(__CR2__, __INTERRUPT__)      ((((__CR2__) & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET)

+

+/** @brief  Checks if SPI Mode parameter is in allowed range.

+  * @param  __MODE__ specifies the SPI Mode.

+  *         This parameter can be a value of @ref SPI_Mode

+  * @retval None

+  */

+#define IS_SPI_MODE(__MODE__) (((__MODE__) == SPI_MODE_SLAVE) || \

+                               ((__MODE__) == SPI_MODE_MASTER))

+

+/** @brief  Checks if SPI Direction Mode parameter is in allowed range.

+  * @param  __MODE__ specifies the SPI Direction Mode.

+  *         This parameter can be a value of @ref SPI_Direction

+  * @retval None

+  */

+#define IS_SPI_DIRECTION(__MODE__) (((__MODE__) == SPI_DIRECTION_2LINES)        || \

+                                    ((__MODE__) == SPI_DIRECTION_2LINES_RXONLY) || \

+                                    ((__MODE__) == SPI_DIRECTION_1LINE))

+

+/** @brief  Checks if SPI Direction Mode parameter is 2 lines.

+  * @param  __MODE__ specifies the SPI Direction Mode.

+  * @retval None

+  */

+#define IS_SPI_DIRECTION_2LINES(__MODE__) ((__MODE__) == SPI_DIRECTION_2LINES)

+

+/** @brief  Checks if SPI Direction Mode parameter is 1 or 2 lines.

+  * @param  __MODE__ specifies the SPI Direction Mode.

+  * @retval None

+  */

+#define IS_SPI_DIRECTION_2LINES_OR_1LINE(__MODE__) (((__MODE__) == SPI_DIRECTION_2LINES) || \

+                                                    ((__MODE__) == SPI_DIRECTION_1LINE))

+

+/** @brief  Checks if SPI Data Size parameter is in allowed range.

+  * @param  __DATASIZE__ specifies the SPI Data Size.

+  *         This parameter can be a value of @ref SPI_Data_Size

+  * @retval None

+  */

+#define IS_SPI_DATASIZE(__DATASIZE__) (((__DATASIZE__) == SPI_DATASIZE_16BIT) || \

+                                       ((__DATASIZE__) == SPI_DATASIZE_15BIT) || \

+                                       ((__DATASIZE__) == SPI_DATASIZE_14BIT) || \

+                                       ((__DATASIZE__) == SPI_DATASIZE_13BIT) || \

+                                       ((__DATASIZE__) == SPI_DATASIZE_12BIT) || \

+                                       ((__DATASIZE__) == SPI_DATASIZE_11BIT) || \

+                                       ((__DATASIZE__) == SPI_DATASIZE_10BIT) || \

+                                       ((__DATASIZE__) == SPI_DATASIZE_9BIT)  || \

+                                       ((__DATASIZE__) == SPI_DATASIZE_8BIT)  || \

+                                       ((__DATASIZE__) == SPI_DATASIZE_7BIT)  || \

+                                       ((__DATASIZE__) == SPI_DATASIZE_6BIT)  || \

+                                       ((__DATASIZE__) == SPI_DATASIZE_5BIT)  || \

+                                       ((__DATASIZE__) == SPI_DATASIZE_4BIT))

+

+/** @brief  Checks if SPI Serial clock steady state parameter is in allowed range.

+  * @param  __CPOL__ specifies the SPI serial clock steady state.

+  *         This parameter can be a value of @ref SPI_Clock_Polarity

+  * @retval None

+  */

+#define IS_SPI_CPOL(__CPOL__) (((__CPOL__) == SPI_POLARITY_LOW) || \

+                               ((__CPOL__) == SPI_POLARITY_HIGH))

+

+/** @brief  Checks if SPI Clock Phase parameter is in allowed range.

+  * @param  __CPHA__ specifies the SPI Clock Phase.

+  *         This parameter can be a value of @ref SPI_Clock_Phase

+  * @retval None

+  */

+#define IS_SPI_CPHA(__CPHA__) (((__CPHA__) == SPI_PHASE_1EDGE) || \

+                               ((__CPHA__) == SPI_PHASE_2EDGE))

+

+/** @brief  Checks if SPI Slave Select parameter is in allowed range.

+  * @param  __NSS__ specifies the SPI Slave Select management parameter.

+  *         This parameter can be a value of @ref SPI_Slave_Select_management

+  * @retval None

+  */

+#define IS_SPI_NSS(__NSS__) (((__NSS__) == SPI_NSS_SOFT)       || \

+                             ((__NSS__) == SPI_NSS_HARD_INPUT) || \

+                             ((__NSS__) == SPI_NSS_HARD_OUTPUT))

+

+/** @brief  Checks if SPI NSS Pulse parameter is in allowed range.

+  * @param  __NSSP__ specifies the SPI NSS Pulse Mode parameter.

+  *         This parameter can be a value of @ref SPI_NSSP_Mode

+  * @retval None

+  */

+#define IS_SPI_NSSP(__NSSP__) (((__NSSP__) == SPI_NSS_PULSE_ENABLE) || \

+                               ((__NSSP__) == SPI_NSS_PULSE_DISABLE))

+

+/** @brief  Checks if SPI Baudrate prescaler parameter is in allowed range.

+  * @param  __PRESCALER__ specifies the SPI Baudrate prescaler.

+  *         This parameter can be a value of @ref SPI_BaudRate_Prescaler

+  * @retval None

+  */

+#define IS_SPI_BAUDRATE_PRESCALER(__PRESCALER__) (((__PRESCALER__) == SPI_BAUDRATEPRESCALER_2)   || \

+                                                  ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_4)   || \

+                                                  ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_8)   || \

+                                                  ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_16)  || \

+                                                  ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_32)  || \

+                                                  ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_64)  || \

+                                                  ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_128) || \

+                                                  ((__PRESCALER__) == SPI_BAUDRATEPRESCALER_256))

+

+/** @brief  Checks if SPI MSB LSB transmission parameter is in allowed range.

+  * @param  __BIT__ specifies the SPI MSB LSB transmission (whether data transfer starts from MSB or LSB bit).

+  *         This parameter can be a value of @ref SPI_MSB_LSB_transmission

+  * @retval None

+  */

+#define IS_SPI_FIRST_BIT(__BIT__) (((__BIT__) == SPI_FIRSTBIT_MSB) || \

+                                   ((__BIT__) == SPI_FIRSTBIT_LSB))

+

+/** @brief  Checks if SPI TI mode parameter is in allowed range.

+  * @param  __MODE__ specifies the SPI TI mode.

+  *         This parameter can be a value of @ref SPI_TI_mode

+  * @retval None

+  */

+#define IS_SPI_TIMODE(__MODE__) (((__MODE__) == SPI_TIMODE_DISABLE) || \

+                                 ((__MODE__) == SPI_TIMODE_ENABLE))

+

+/** @brief  Checks if SPI CRC calculation enabled state is in allowed range.

+  * @param  __CALCULATION__ specifies the SPI CRC calculation enable state.

+  *         This parameter can be a value of @ref SPI_CRC_Calculation

+  * @retval None

+  */

+#define IS_SPI_CRC_CALCULATION(__CALCULATION__) (((__CALCULATION__) == SPI_CRCCALCULATION_DISABLE) || \

+                                                 ((__CALCULATION__) == SPI_CRCCALCULATION_ENABLE))

+

+/** @brief  Checks if SPI CRC length is in allowed range.

+  * @param  __LENGTH__ specifies the SPI CRC length.

+  *         This parameter can be a value of @ref SPI_CRC_length

+  * @retval None

+  */

+#define IS_SPI_CRC_LENGTH(__LENGTH__) (((__LENGTH__) == SPI_CRC_LENGTH_DATASIZE) ||\

+                                       ((__LENGTH__) == SPI_CRC_LENGTH_8BIT)  ||   \

+                                       ((__LENGTH__) == SPI_CRC_LENGTH_16BIT))

+

+/** @brief  Checks if SPI polynomial value to be used for the CRC calculation, is in allowed range.

+  * @param  __POLYNOMIAL__ specifies the SPI polynomial value to be used for the CRC calculation.

+  *         This parameter must be a number between Min_Data = 0 and Max_Data = 65535

+  * @retval None

+  */

+#define IS_SPI_CRC_POLYNOMIAL(__POLYNOMIAL__) (((__POLYNOMIAL__) >= 0x1U) && ((__POLYNOMIAL__) <= 0xFFFFU) && (((__POLYNOMIAL__)&0x1U) != 0U))

+

+/** @brief  Checks if DMA handle is valid.

+  * @param  __HANDLE__ specifies a DMA Handle.

+  * @retval None

+  */

+#define IS_SPI_DMA_HANDLE(__HANDLE__) ((__HANDLE__) != NULL)

+

+/**

+  * @}

+  */

+

+/* Include SPI HAL Extended module */

+#include "stm32l4xx_hal_spi_ex.h"

+

+/* Exported functions --------------------------------------------------------*/

+/** @addtogroup SPI_Exported_Functions

+  * @{

+  */

+

+/** @addtogroup SPI_Exported_Functions_Group1

+  * @{

+  */

+/* Initialization/de-initialization functions  ********************************/

+HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi);

+HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi);

+void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi);

+void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi);

+

+/* Callbacks Register/UnRegister functions  ***********************************/

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+HAL_StatusTypeDef HAL_SPI_RegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID, pSPI_CallbackTypeDef pCallback);

+HAL_StatusTypeDef HAL_SPI_UnRegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+/**

+  * @}

+  */

+

+/** @addtogroup SPI_Exported_Functions_Group2

+  * @{

+  */

+/* I/O operation functions  ***************************************************/

+HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);

+HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);

+HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size,

+                                          uint32_t Timeout);

+HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size);

+HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size);

+HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData,

+                                             uint16_t Size);

+HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size);

+HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size);

+HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData,

+                                              uint16_t Size);

+HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi);

+HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi);

+HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi);

+/* Transfer Abort functions */

+HAL_StatusTypeDef HAL_SPI_Abort(SPI_HandleTypeDef *hspi);

+HAL_StatusTypeDef HAL_SPI_Abort_IT(SPI_HandleTypeDef *hspi);

+

+void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi);

+void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi);

+void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi);

+void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi);

+void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi);

+void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi);

+void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi);

+void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi);

+void HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef *hspi);

+/**

+  * @}

+  */

+

+/** @addtogroup SPI_Exported_Functions_Group3

+  * @{

+  */

+/* Peripheral State and Error functions ***************************************/

+HAL_SPI_StateTypeDef HAL_SPI_GetState(SPI_HandleTypeDef *hspi);

+uint32_t             HAL_SPI_GetError(SPI_HandleTypeDef *hspi);

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* STM32L4xx_HAL_SPI_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi_ex.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi_ex.h
new file mode 100644
index 0000000..c7f6edb
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi_ex.h
@@ -0,0 +1,75 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_spi_ex.h

+  * @author  MCD Application Team

+  * @brief   Header file of SPI HAL Extended module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef STM32L4xx_HAL_SPI_EX_H

+#define STM32L4xx_HAL_SPI_EX_H

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup SPIEx

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+/* Exported constants --------------------------------------------------------*/

+/* Exported macros -----------------------------------------------------------*/

+/* Exported functions --------------------------------------------------------*/

+/** @addtogroup SPIEx_Exported_Functions

+  * @{

+  */

+

+/* Initialization and de-initialization functions  ****************************/

+/* IO operation functions *****************************************************/

+/** @addtogroup SPIEx_Exported_Functions_Group1

+  * @{

+  */

+HAL_StatusTypeDef HAL_SPIEx_FlushRxFifo(SPI_HandleTypeDef *hspi);

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* STM32L4xx_HAL_SPI_EX_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h
new file mode 100644
index 0000000..42cb4ea
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h
@@ -0,0 +1,2141 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_tim.h

+  * @author  MCD Application Team

+  * @brief   Header file of TIM HAL module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef STM32L4xx_HAL_TIM_H

+#define STM32L4xx_HAL_TIM_H

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup TIM

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+/** @defgroup TIM_Exported_Types TIM Exported Types

+  * @{

+  */

+

+/**

+  * @brief  TIM Time base Configuration Structure definition

+  */

+typedef struct

+{

+  uint32_t Prescaler;         /*!< Specifies the prescaler value used to divide the TIM clock.

+                                   This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */

+

+  uint32_t CounterMode;       /*!< Specifies the counter mode.

+                                   This parameter can be a value of @ref TIM_Counter_Mode */

+

+  uint32_t Period;            /*!< Specifies the period value to be loaded into the active

+                                   Auto-Reload Register at the next update event.

+                                   This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF.  */

+

+  uint32_t ClockDivision;     /*!< Specifies the clock division.

+                                   This parameter can be a value of @ref TIM_ClockDivision */

+

+  uint32_t RepetitionCounter;  /*!< Specifies the repetition counter value. Each time the RCR downcounter

+                                    reaches zero, an update event is generated and counting restarts

+                                    from the RCR value (N).

+                                    This means in PWM mode that (N+1) corresponds to:

+                                        - the number of PWM periods in edge-aligned mode

+                                        - the number of half PWM period in center-aligned mode

+                                     GP timers: this parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF.

+                                     Advanced timers: this parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. */

+

+  uint32_t AutoReloadPreload;  /*!< Specifies the auto-reload preload.

+                                   This parameter can be a value of @ref TIM_AutoReloadPreload */

+} TIM_Base_InitTypeDef;

+

+/**

+  * @brief  TIM Output Compare Configuration Structure definition

+  */

+typedef struct

+{

+  uint32_t OCMode;        /*!< Specifies the TIM mode.

+                               This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */

+

+  uint32_t Pulse;         /*!< Specifies the pulse value to be loaded into the Capture Compare Register.

+                               This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */

+

+  uint32_t OCPolarity;    /*!< Specifies the output polarity.

+                               This parameter can be a value of @ref TIM_Output_Compare_Polarity */

+

+  uint32_t OCNPolarity;   /*!< Specifies the complementary output polarity.

+                               This parameter can be a value of @ref TIM_Output_Compare_N_Polarity

+                               @note This parameter is valid only for timer instances supporting break feature. */

+

+  uint32_t OCFastMode;    /*!< Specifies the Fast mode state.

+                               This parameter can be a value of @ref TIM_Output_Fast_State

+                               @note This parameter is valid only in PWM1 and PWM2 mode. */

+

+

+  uint32_t OCIdleState;   /*!< Specifies the TIM Output Compare pin state during Idle state.

+                               This parameter can be a value of @ref TIM_Output_Compare_Idle_State

+                               @note This parameter is valid only for timer instances supporting break feature. */

+

+  uint32_t OCNIdleState;  /*!< Specifies the TIM Output Compare pin state during Idle state.

+                               This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State

+                               @note This parameter is valid only for timer instances supporting break feature. */

+} TIM_OC_InitTypeDef;

+

+/**

+  * @brief  TIM One Pulse Mode Configuration Structure definition

+  */

+typedef struct

+{

+  uint32_t OCMode;        /*!< Specifies the TIM mode.

+                               This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */

+

+  uint32_t Pulse;         /*!< Specifies the pulse value to be loaded into the Capture Compare Register.

+                               This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */

+

+  uint32_t OCPolarity;    /*!< Specifies the output polarity.

+                               This parameter can be a value of @ref TIM_Output_Compare_Polarity */

+

+  uint32_t OCNPolarity;   /*!< Specifies the complementary output polarity.

+                               This parameter can be a value of @ref TIM_Output_Compare_N_Polarity

+                               @note This parameter is valid only for timer instances supporting break feature. */

+

+  uint32_t OCIdleState;   /*!< Specifies the TIM Output Compare pin state during Idle state.

+                               This parameter can be a value of @ref TIM_Output_Compare_Idle_State

+                               @note This parameter is valid only for timer instances supporting break feature. */

+

+  uint32_t OCNIdleState;  /*!< Specifies the TIM Output Compare pin state during Idle state.

+                               This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State

+                               @note This parameter is valid only for timer instances supporting break feature. */

+

+  uint32_t ICPolarity;    /*!< Specifies the active edge of the input signal.

+                               This parameter can be a value of @ref TIM_Input_Capture_Polarity */

+

+  uint32_t ICSelection;   /*!< Specifies the input.

+                              This parameter can be a value of @ref TIM_Input_Capture_Selection */

+

+  uint32_t ICFilter;      /*!< Specifies the input capture filter.

+                              This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */

+} TIM_OnePulse_InitTypeDef;

+

+/**

+  * @brief  TIM Input Capture Configuration Structure definition

+  */

+typedef struct

+{

+  uint32_t  ICPolarity;  /*!< Specifies the active edge of the input signal.

+                              This parameter can be a value of @ref TIM_Input_Capture_Polarity */

+

+  uint32_t ICSelection;  /*!< Specifies the input.

+                              This parameter can be a value of @ref TIM_Input_Capture_Selection */

+

+  uint32_t ICPrescaler;  /*!< Specifies the Input Capture Prescaler.

+                              This parameter can be a value of @ref TIM_Input_Capture_Prescaler */

+

+  uint32_t ICFilter;     /*!< Specifies the input capture filter.

+                              This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */

+} TIM_IC_InitTypeDef;

+

+/**

+  * @brief  TIM Encoder Configuration Structure definition

+  */

+typedef struct

+{

+  uint32_t EncoderMode;   /*!< Specifies the active edge of the input signal.

+                               This parameter can be a value of @ref TIM_Encoder_Mode */

+

+  uint32_t IC1Polarity;   /*!< Specifies the active edge of the input signal.

+                               This parameter can be a value of @ref TIM_Input_Capture_Polarity */

+

+  uint32_t IC1Selection;  /*!< Specifies the input.

+                               This parameter can be a value of @ref TIM_Input_Capture_Selection */

+

+  uint32_t IC1Prescaler;  /*!< Specifies the Input Capture Prescaler.

+                               This parameter can be a value of @ref TIM_Input_Capture_Prescaler */

+

+  uint32_t IC1Filter;     /*!< Specifies the input capture filter.

+                               This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */

+

+  uint32_t IC2Polarity;   /*!< Specifies the active edge of the input signal.

+                               This parameter can be a value of @ref TIM_Input_Capture_Polarity */

+

+  uint32_t IC2Selection;  /*!< Specifies the input.

+                              This parameter can be a value of @ref TIM_Input_Capture_Selection */

+

+  uint32_t IC2Prescaler;  /*!< Specifies the Input Capture Prescaler.

+                               This parameter can be a value of @ref TIM_Input_Capture_Prescaler */

+

+  uint32_t IC2Filter;     /*!< Specifies the input capture filter.

+                               This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */

+} TIM_Encoder_InitTypeDef;

+

+/**

+  * @brief  Clock Configuration Handle Structure definition

+  */

+typedef struct

+{

+  uint32_t ClockSource;     /*!< TIM clock sources

+                                 This parameter can be a value of @ref TIM_Clock_Source */

+  uint32_t ClockPolarity;   /*!< TIM clock polarity

+                                 This parameter can be a value of @ref TIM_Clock_Polarity */

+  uint32_t ClockPrescaler;  /*!< TIM clock prescaler

+                                 This parameter can be a value of @ref TIM_Clock_Prescaler */

+  uint32_t ClockFilter;     /*!< TIM clock filter

+                                 This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */

+} TIM_ClockConfigTypeDef;

+

+/**

+  * @brief  TIM Clear Input Configuration Handle Structure definition

+  */

+typedef struct

+{

+  uint32_t ClearInputState;      /*!< TIM clear Input state

+                                      This parameter can be ENABLE or DISABLE */

+  uint32_t ClearInputSource;     /*!< TIM clear Input sources

+                                      This parameter can be a value of @ref TIM_ClearInput_Source */

+  uint32_t ClearInputPolarity;   /*!< TIM Clear Input polarity

+                                      This parameter can be a value of @ref TIM_ClearInput_Polarity */

+  uint32_t ClearInputPrescaler;  /*!< TIM Clear Input prescaler

+                                      This parameter must be 0: When OCRef clear feature is used with ETR source, ETR prescaler must be off */

+  uint32_t ClearInputFilter;     /*!< TIM Clear Input filter

+                                      This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */

+} TIM_ClearInputConfigTypeDef;

+

+/**

+  * @brief  TIM Master configuration Structure definition

+  * @note   Advanced timers provide TRGO2 internal line which is redirected

+  *         to the ADC

+  */

+typedef struct

+{

+  uint32_t  MasterOutputTrigger;   /*!< Trigger output (TRGO) selection

+                                        This parameter can be a value of @ref TIM_Master_Mode_Selection */

+  uint32_t  MasterOutputTrigger2;  /*!< Trigger output2 (TRGO2) selection

+                                        This parameter can be a value of @ref TIM_Master_Mode_Selection_2 */

+  uint32_t  MasterSlaveMode;       /*!< Master/slave mode selection

+                                        This parameter can be a value of @ref TIM_Master_Slave_Mode */

+} TIM_MasterConfigTypeDef;

+

+/**

+  * @brief  TIM Slave configuration Structure definition

+  */

+typedef struct

+{

+  uint32_t  SlaveMode;         /*!< Slave mode selection

+                                    This parameter can be a value of @ref TIM_Slave_Mode */

+  uint32_t  InputTrigger;      /*!< Input Trigger source

+                                    This parameter can be a value of @ref TIM_Trigger_Selection */

+  uint32_t  TriggerPolarity;   /*!< Input Trigger polarity

+                                    This parameter can be a value of @ref TIM_Trigger_Polarity */

+  uint32_t  TriggerPrescaler;  /*!< Input trigger prescaler

+                                    This parameter can be a value of @ref TIM_Trigger_Prescaler */

+  uint32_t  TriggerFilter;     /*!< Input trigger filter

+                                    This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF  */

+

+} TIM_SlaveConfigTypeDef;

+

+/**

+  * @brief  TIM Break input(s) and Dead time configuration Structure definition

+  * @note   2 break inputs can be configured (BKIN and BKIN2) with configurable

+  *        filter and polarity.

+  */

+typedef struct

+{

+  uint32_t OffStateRunMode;      /*!< TIM off state in run mode

+                                      This parameter can be a value of @ref TIM_OSSR_Off_State_Selection_for_Run_mode_state */

+  uint32_t OffStateIDLEMode;     /*!< TIM off state in IDLE mode

+                                      This parameter can be a value of @ref TIM_OSSI_Off_State_Selection_for_Idle_mode_state */

+  uint32_t LockLevel;            /*!< TIM Lock level

+                                      This parameter can be a value of @ref TIM_Lock_level */

+  uint32_t DeadTime;             /*!< TIM dead Time

+                                      This parameter can be a number between Min_Data = 0x00 and Max_Data = 0xFF */

+  uint32_t BreakState;           /*!< TIM Break State

+                                      This parameter can be a value of @ref TIM_Break_Input_enable_disable */

+  uint32_t BreakPolarity;        /*!< TIM Break input polarity

+                                      This parameter can be a value of @ref TIM_Break_Polarity */

+  uint32_t BreakFilter;          /*!< Specifies the break input filter.

+                                      This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */

+  uint32_t Break2State;          /*!< TIM Break2 State

+                                      This parameter can be a value of @ref TIM_Break2_Input_enable_disable */

+  uint32_t Break2Polarity;       /*!< TIM Break2 input polarity

+                                      This parameter can be a value of @ref TIM_Break2_Polarity */

+  uint32_t Break2Filter;         /*!< TIM break2 input filter.

+                                      This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */

+  uint32_t AutomaticOutput;      /*!< TIM Automatic Output Enable state

+                                      This parameter can be a value of @ref TIM_AOE_Bit_Set_Reset */

+} TIM_BreakDeadTimeConfigTypeDef;

+

+/**

+  * @brief  HAL State structures definition

+  */

+typedef enum

+{

+  HAL_TIM_STATE_RESET             = 0x00U,    /*!< Peripheral not yet initialized or disabled  */

+  HAL_TIM_STATE_READY             = 0x01U,    /*!< Peripheral Initialized and ready for use    */

+  HAL_TIM_STATE_BUSY              = 0x02U,    /*!< An internal process is ongoing              */

+  HAL_TIM_STATE_TIMEOUT           = 0x03U,    /*!< Timeout state                               */

+  HAL_TIM_STATE_ERROR             = 0x04U     /*!< Reception process is ongoing                */

+} HAL_TIM_StateTypeDef;

+

+/**

+  * @brief  HAL Active channel structures definition

+  */

+typedef enum

+{

+  HAL_TIM_ACTIVE_CHANNEL_1        = 0x01U,    /*!< The active channel is 1     */

+  HAL_TIM_ACTIVE_CHANNEL_2        = 0x02U,    /*!< The active channel is 2     */

+  HAL_TIM_ACTIVE_CHANNEL_3        = 0x04U,    /*!< The active channel is 3     */

+  HAL_TIM_ACTIVE_CHANNEL_4        = 0x08U,    /*!< The active channel is 4     */

+  HAL_TIM_ACTIVE_CHANNEL_5        = 0x10U,    /*!< The active channel is 5     */

+  HAL_TIM_ACTIVE_CHANNEL_6        = 0x20U,    /*!< The active channel is 6     */

+  HAL_TIM_ACTIVE_CHANNEL_CLEARED  = 0x00U     /*!< All active channels cleared */

+} HAL_TIM_ActiveChannel;

+

+/**

+  * @brief  TIM Time Base Handle Structure definition

+  */

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+typedef struct __TIM_HandleTypeDef

+#else

+typedef struct

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+{

+  TIM_TypeDef                 *Instance;     /*!< Register base address             */

+  TIM_Base_InitTypeDef        Init;          /*!< TIM Time Base required parameters */

+  HAL_TIM_ActiveChannel       Channel;       /*!< Active channel                    */

+  DMA_HandleTypeDef           *hdma[7];      /*!< DMA Handlers array

+                                                  This array is accessed by a @ref DMA_Handle_index */

+  HAL_LockTypeDef             Lock;          /*!< Locking object                    */

+  __IO HAL_TIM_StateTypeDef   State;         /*!< TIM operation state               */

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+  void (* Base_MspInitCallback)(struct __TIM_HandleTypeDef *htim);              /*!< TIM Base Msp Init Callback                              */

+  void (* Base_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim);            /*!< TIM Base Msp DeInit Callback                            */

+  void (* IC_MspInitCallback)(struct __TIM_HandleTypeDef *htim);                /*!< TIM IC Msp Init Callback                                */

+  void (* IC_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim);              /*!< TIM IC Msp DeInit Callback                              */

+  void (* OC_MspInitCallback)(struct __TIM_HandleTypeDef *htim);                /*!< TIM OC Msp Init Callback                                */

+  void (* OC_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim);              /*!< TIM OC Msp DeInit Callback                              */

+  void (* PWM_MspInitCallback)(struct __TIM_HandleTypeDef *htim);               /*!< TIM PWM Msp Init Callback                               */

+  void (* PWM_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim);             /*!< TIM PWM Msp DeInit Callback                             */

+  void (* OnePulse_MspInitCallback)(struct __TIM_HandleTypeDef *htim);          /*!< TIM One Pulse Msp Init Callback                         */

+  void (* OnePulse_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim);        /*!< TIM One Pulse Msp DeInit Callback                       */

+  void (* Encoder_MspInitCallback)(struct __TIM_HandleTypeDef *htim);           /*!< TIM Encoder Msp Init Callback                           */

+  void (* Encoder_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim);         /*!< TIM Encoder Msp DeInit Callback                         */

+  void (* HallSensor_MspInitCallback)(struct __TIM_HandleTypeDef *htim);        /*!< TIM Hall Sensor Msp Init Callback                       */

+  void (* HallSensor_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim);      /*!< TIM Hall Sensor Msp DeInit Callback                     */

+  void (* PeriodElapsedCallback)(struct __TIM_HandleTypeDef *htim);             /*!< TIM Period Elapsed Callback                             */

+  void (* PeriodElapsedHalfCpltCallback)(struct __TIM_HandleTypeDef *htim);     /*!< TIM Period Elapsed half complete Callback               */

+  void (* TriggerCallback)(struct __TIM_HandleTypeDef *htim);                   /*!< TIM Trigger Callback                                    */

+  void (* TriggerHalfCpltCallback)(struct __TIM_HandleTypeDef *htim);           /*!< TIM Trigger half complete Callback                      */

+  void (* IC_CaptureCallback)(struct __TIM_HandleTypeDef *htim);                /*!< TIM Input Capture Callback                              */

+  void (* IC_CaptureHalfCpltCallback)(struct __TIM_HandleTypeDef *htim);        /*!< TIM Input Capture half complete Callback                */

+  void (* OC_DelayElapsedCallback)(struct __TIM_HandleTypeDef *htim);           /*!< TIM Output Compare Delay Elapsed Callback               */

+  void (* PWM_PulseFinishedCallback)(struct __TIM_HandleTypeDef *htim);         /*!< TIM PWM Pulse Finished Callback                         */

+  void (* PWM_PulseFinishedHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Pulse Finished half complete Callback           */

+  void (* ErrorCallback)(struct __TIM_HandleTypeDef *htim);                     /*!< TIM Error Callback                                      */

+  void (* CommutationCallback)(struct __TIM_HandleTypeDef *htim);               /*!< TIM Commutation Callback                                */

+  void (* CommutationHalfCpltCallback)(struct __TIM_HandleTypeDef *htim);       /*!< TIM Commutation half complete Callback                  */

+  void (* BreakCallback)(struct __TIM_HandleTypeDef *htim);                     /*!< TIM Break Callback                                      */

+  void (* Break2Callback)(struct __TIM_HandleTypeDef *htim);                    /*!< TIM Break2 Callback                                     */

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+} TIM_HandleTypeDef;

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+/**

+  * @brief  HAL TIM Callback ID enumeration definition

+  */

+typedef enum

+{

+   HAL_TIM_BASE_MSPINIT_CB_ID            = 0x00U    /*!< TIM Base MspInit Callback ID                              */

+  ,HAL_TIM_BASE_MSPDEINIT_CB_ID          = 0x01U    /*!< TIM Base MspDeInit Callback ID                            */

+  ,HAL_TIM_IC_MSPINIT_CB_ID              = 0x02U    /*!< TIM IC MspInit Callback ID                                */

+  ,HAL_TIM_IC_MSPDEINIT_CB_ID            = 0x03U    /*!< TIM IC MspDeInit Callback ID                              */

+  ,HAL_TIM_OC_MSPINIT_CB_ID              = 0x04U    /*!< TIM OC MspInit Callback ID                                */

+  ,HAL_TIM_OC_MSPDEINIT_CB_ID            = 0x05U    /*!< TIM OC MspDeInit Callback ID                              */

+  ,HAL_TIM_PWM_MSPINIT_CB_ID             = 0x06U    /*!< TIM PWM MspInit Callback ID                               */

+  ,HAL_TIM_PWM_MSPDEINIT_CB_ID           = 0x07U    /*!< TIM PWM MspDeInit Callback ID                             */

+  ,HAL_TIM_ONE_PULSE_MSPINIT_CB_ID       = 0x08U    /*!< TIM One Pulse MspInit Callback ID                         */

+  ,HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID     = 0x09U    /*!< TIM One Pulse MspDeInit Callback ID                       */

+  ,HAL_TIM_ENCODER_MSPINIT_CB_ID         = 0x0AU    /*!< TIM Encoder MspInit Callback ID                           */

+  ,HAL_TIM_ENCODER_MSPDEINIT_CB_ID       = 0x0BU    /*!< TIM Encoder MspDeInit Callback ID                         */

+  ,HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID     = 0x0CU    /*!< TIM Hall Sensor MspDeInit Callback ID                     */

+  ,HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID   = 0x0DU    /*!< TIM Hall Sensor MspDeInit Callback ID                     */

+  ,HAL_TIM_PERIOD_ELAPSED_CB_ID          = 0x0EU    /*!< TIM Period Elapsed Callback ID                             */

+  ,HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID     = 0x0FU    /*!< TIM Period Elapsed half complete Callback ID               */

+  ,HAL_TIM_TRIGGER_CB_ID                 = 0x10U    /*!< TIM Trigger Callback ID                                    */

+  ,HAL_TIM_TRIGGER_HALF_CB_ID            = 0x11U    /*!< TIM Trigger half complete Callback ID                      */

+

+  ,HAL_TIM_IC_CAPTURE_CB_ID              = 0x12U    /*!< TIM Input Capture Callback ID                              */

+  ,HAL_TIM_IC_CAPTURE_HALF_CB_ID         = 0x13U    /*!< TIM Input Capture half complete Callback ID                */

+  ,HAL_TIM_OC_DELAY_ELAPSED_CB_ID        = 0x14U    /*!< TIM Output Compare Delay Elapsed Callback ID               */

+  ,HAL_TIM_PWM_PULSE_FINISHED_CB_ID      = 0x15U    /*!< TIM PWM Pulse Finished Callback ID           */

+  ,HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID = 0x16U    /*!< TIM PWM Pulse Finished half complete Callback ID           */

+  ,HAL_TIM_ERROR_CB_ID                   = 0x17U    /*!< TIM Error Callback ID                                      */

+  ,HAL_TIM_COMMUTATION_CB_ID             = 0x18U    /*!< TIM Commutation Callback ID                                */

+  ,HAL_TIM_COMMUTATION_HALF_CB_ID        = 0x19U    /*!< TIM Commutation half complete Callback ID                  */

+  ,HAL_TIM_BREAK_CB_ID                   = 0x1AU    /*!< TIM Break Callback ID                                      */

+  ,HAL_TIM_BREAK2_CB_ID                  = 0x1BU    /*!< TIM Break2 Callback ID                                     */

+} HAL_TIM_CallbackIDTypeDef;

+

+/**

+  * @brief  HAL TIM Callback pointer definition

+  */

+typedef  void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim);  /*!< pointer to the TIM callback function */

+

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+

+/**

+  * @}

+  */

+/* End of exported types -----------------------------------------------------*/

+

+/* Exported constants --------------------------------------------------------*/

+/** @defgroup TIM_Exported_Constants TIM Exported Constants

+  * @{

+  */

+

+/** @defgroup TIM_ClearInput_Source TIM Clear Input Source

+  * @{

+  */

+#define TIM_CLEARINPUTSOURCE_NONE           0x00000000U   /*!< OCREF_CLR is disabled */

+#define TIM_CLEARINPUTSOURCE_ETR            0x00000001U   /*!< OCREF_CLR is connected to ETRF input */

+#define TIM_CLEARINPUTSOURCE_OCREFCLR       0x00000002U   /*!< OCREF_CLR is connected to OCREF_CLR_INT */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_DMA_Base_address TIM DMA Base Address

+  * @{

+  */

+#define TIM_DMABASE_CR1                    0x00000000U

+#define TIM_DMABASE_CR2                    0x00000001U

+#define TIM_DMABASE_SMCR                   0x00000002U

+#define TIM_DMABASE_DIER                   0x00000003U

+#define TIM_DMABASE_SR                     0x00000004U

+#define TIM_DMABASE_EGR                    0x00000005U

+#define TIM_DMABASE_CCMR1                  0x00000006U

+#define TIM_DMABASE_CCMR2                  0x00000007U

+#define TIM_DMABASE_CCER                   0x00000008U

+#define TIM_DMABASE_CNT                    0x00000009U

+#define TIM_DMABASE_PSC                    0x0000000AU

+#define TIM_DMABASE_ARR                    0x0000000BU

+#define TIM_DMABASE_RCR                    0x0000000CU

+#define TIM_DMABASE_CCR1                   0x0000000DU

+#define TIM_DMABASE_CCR2                   0x0000000EU

+#define TIM_DMABASE_CCR3                   0x0000000FU

+#define TIM_DMABASE_CCR4                   0x00000010U

+#define TIM_DMABASE_BDTR                   0x00000011U

+#define TIM_DMABASE_DCR                    0x00000012U

+#define TIM_DMABASE_DMAR                   0x00000013U

+#define TIM_DMABASE_OR1                    0x00000014U

+#define TIM_DMABASE_CCMR3                  0x00000015U

+#define TIM_DMABASE_CCR5                   0x00000016U

+#define TIM_DMABASE_CCR6                   0x00000017U

+#define TIM_DMABASE_OR2                    0x00000018U

+#define TIM_DMABASE_OR3                    0x00000019U

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Event_Source TIM Event Source

+  * @{

+  */

+#define TIM_EVENTSOURCE_UPDATE              TIM_EGR_UG     /*!< Reinitialize the counter and generates an update of the registers */

+#define TIM_EVENTSOURCE_CC1                 TIM_EGR_CC1G   /*!< A capture/compare event is generated on channel 1 */

+#define TIM_EVENTSOURCE_CC2                 TIM_EGR_CC2G   /*!< A capture/compare event is generated on channel 2 */

+#define TIM_EVENTSOURCE_CC3                 TIM_EGR_CC3G   /*!< A capture/compare event is generated on channel 3 */

+#define TIM_EVENTSOURCE_CC4                 TIM_EGR_CC4G   /*!< A capture/compare event is generated on channel 4 */

+#define TIM_EVENTSOURCE_COM                 TIM_EGR_COMG   /*!< A commutation event is generated */

+#define TIM_EVENTSOURCE_TRIGGER             TIM_EGR_TG     /*!< A trigger event is generated */

+#define TIM_EVENTSOURCE_BREAK               TIM_EGR_BG     /*!< A break event is generated */

+#define TIM_EVENTSOURCE_BREAK2              TIM_EGR_B2G    /*!< A break 2 event is generated */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Input_Channel_Polarity TIM Input Channel polarity

+  * @{

+  */

+#define  TIM_INPUTCHANNELPOLARITY_RISING      0x00000000U                       /*!< Polarity for TIx source */

+#define  TIM_INPUTCHANNELPOLARITY_FALLING     TIM_CCER_CC1P                     /*!< Polarity for TIx source */

+#define  TIM_INPUTCHANNELPOLARITY_BOTHEDGE    (TIM_CCER_CC1P | TIM_CCER_CC1NP)  /*!< Polarity for TIx source */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_ETR_Polarity TIM ETR Polarity

+  * @{

+  */

+#define TIM_ETRPOLARITY_INVERTED              TIM_SMCR_ETP                      /*!< Polarity for ETR source */

+#define TIM_ETRPOLARITY_NONINVERTED           0x00000000U                       /*!< Polarity for ETR source */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_ETR_Prescaler TIM ETR Prescaler

+  * @{

+  */

+#define TIM_ETRPRESCALER_DIV1                 0x00000000U                       /*!< No prescaler is used */

+#define TIM_ETRPRESCALER_DIV2                 TIM_SMCR_ETPS_0                   /*!< ETR input source is divided by 2 */

+#define TIM_ETRPRESCALER_DIV4                 TIM_SMCR_ETPS_1                   /*!< ETR input source is divided by 4 */

+#define TIM_ETRPRESCALER_DIV8                 TIM_SMCR_ETPS                     /*!< ETR input source is divided by 8 */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Counter_Mode TIM Counter Mode

+  * @{

+  */

+#define TIM_COUNTERMODE_UP                 0x00000000U                          /*!< Counter used as up-counter   */

+#define TIM_COUNTERMODE_DOWN               TIM_CR1_DIR                          /*!< Counter used as down-counter */

+#define TIM_COUNTERMODE_CENTERALIGNED1     TIM_CR1_CMS_0                        /*!< Center-aligned mode 1        */

+#define TIM_COUNTERMODE_CENTERALIGNED2     TIM_CR1_CMS_1                        /*!< Center-aligned mode 2        */

+#define TIM_COUNTERMODE_CENTERALIGNED3     TIM_CR1_CMS                          /*!< Center-aligned mode 3        */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_ClockDivision TIM Clock Division

+  * @{

+  */

+#define TIM_CLOCKDIVISION_DIV1             0x00000000U                          /*!< Clock division: tDTS=tCK_INT   */

+#define TIM_CLOCKDIVISION_DIV2             TIM_CR1_CKD_0                        /*!< Clock division: tDTS=2*tCK_INT */

+#define TIM_CLOCKDIVISION_DIV4             TIM_CR1_CKD_1                        /*!< Clock division: tDTS=4*tCK_INT */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Output_Compare_State TIM Output Compare State

+  * @{

+  */

+#define TIM_OUTPUTSTATE_DISABLE            0x00000000U                          /*!< Capture/Compare 1 output disabled */

+#define TIM_OUTPUTSTATE_ENABLE             TIM_CCER_CC1E                        /*!< Capture/Compare 1 output enabled */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_AutoReloadPreload TIM Auto-Reload Preload

+  * @{

+  */

+#define TIM_AUTORELOAD_PRELOAD_DISABLE                0x00000000U               /*!< TIMx_ARR register is not buffered */

+#define TIM_AUTORELOAD_PRELOAD_ENABLE                 TIM_CR1_ARPE              /*!< TIMx_ARR register is buffered */

+

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Output_Fast_State TIM Output Fast State

+  * @{

+  */

+#define TIM_OCFAST_DISABLE                 0x00000000U                          /*!< Output Compare fast disable */

+#define TIM_OCFAST_ENABLE                  TIM_CCMR1_OC1FE                      /*!< Output Compare fast enable  */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Output_Compare_N_State TIM Complementary Output Compare State

+  * @{

+  */

+#define TIM_OUTPUTNSTATE_DISABLE           0x00000000U                          /*!< OCxN is disabled  */

+#define TIM_OUTPUTNSTATE_ENABLE            TIM_CCER_CC1NE                       /*!< OCxN is enabled   */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Output_Compare_Polarity TIM Output Compare Polarity

+  * @{

+  */

+#define TIM_OCPOLARITY_HIGH                0x00000000U                          /*!< Capture/Compare output polarity  */

+#define TIM_OCPOLARITY_LOW                 TIM_CCER_CC1P                        /*!< Capture/Compare output polarity  */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Output_Compare_N_Polarity TIM Complementary Output Compare Polarity

+  * @{

+  */

+#define TIM_OCNPOLARITY_HIGH               0x00000000U                          /*!< Capture/Compare complementary output polarity */

+#define TIM_OCNPOLARITY_LOW                TIM_CCER_CC1NP                       /*!< Capture/Compare complementary output polarity */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Output_Compare_Idle_State TIM Output Compare Idle State

+  * @{

+  */

+#define TIM_OCIDLESTATE_SET                TIM_CR2_OIS1                         /*!< Output Idle state: OCx=1 when MOE=0 */

+#define TIM_OCIDLESTATE_RESET              0x00000000U                          /*!< Output Idle state: OCx=0 when MOE=0 */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Output_Compare_N_Idle_State TIM Complementary Output Compare Idle State

+  * @{

+  */

+#define TIM_OCNIDLESTATE_SET               TIM_CR2_OIS1N                        /*!< Complementary output Idle state: OCxN=1 when MOE=0 */

+#define TIM_OCNIDLESTATE_RESET             0x00000000U                          /*!< Complementary output Idle state: OCxN=0 when MOE=0 */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Input_Capture_Polarity TIM Input Capture Polarity

+  * @{

+  */

+#define  TIM_ICPOLARITY_RISING             TIM_INPUTCHANNELPOLARITY_RISING      /*!< Capture triggered by rising edge on timer input                  */

+#define  TIM_ICPOLARITY_FALLING            TIM_INPUTCHANNELPOLARITY_FALLING     /*!< Capture triggered by falling edge on timer input                 */

+#define  TIM_ICPOLARITY_BOTHEDGE           TIM_INPUTCHANNELPOLARITY_BOTHEDGE    /*!< Capture triggered by both rising and falling edges on timer input*/

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection

+  * @{

+  */

+#define TIM_ICSELECTION_DIRECTTI           TIM_CCMR1_CC1S_0                     /*!< TIM Input 1, 2, 3 or 4 is selected to be

+                                                                                     connected to IC1, IC2, IC3 or IC4, respectively */

+#define TIM_ICSELECTION_INDIRECTTI         TIM_CCMR1_CC1S_1                     /*!< TIM Input 1, 2, 3 or 4 is selected to be

+                                                                                     connected to IC2, IC1, IC4 or IC3, respectively */

+#define TIM_ICSELECTION_TRC                TIM_CCMR1_CC1S                       /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to TRC */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Input_Capture_Prescaler TIM Input Capture Prescaler

+  * @{

+  */

+#define TIM_ICPSC_DIV1                     0x00000000U                          /*!< Capture performed each time an edge is detected on the capture input */

+#define TIM_ICPSC_DIV2                     TIM_CCMR1_IC1PSC_0                   /*!< Capture performed once every 2 events                                */

+#define TIM_ICPSC_DIV4                     TIM_CCMR1_IC1PSC_1                   /*!< Capture performed once every 4 events                                */

+#define TIM_ICPSC_DIV8                     TIM_CCMR1_IC1PSC                     /*!< Capture performed once every 8 events                                */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_One_Pulse_Mode TIM One Pulse Mode

+  * @{

+  */

+#define TIM_OPMODE_SINGLE                  TIM_CR1_OPM                          /*!< Counter stops counting at the next update event */

+#define TIM_OPMODE_REPETITIVE              0x00000000U                          /*!< Counter is not stopped at update event          */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Encoder_Mode TIM Encoder Mode

+  * @{

+  */

+#define TIM_ENCODERMODE_TI1                      TIM_SMCR_SMS_0                                                      /*!< Quadrature encoder mode 1, x2 mode, counts up/down on TI1FP1 edge depending on TI2FP2 level  */

+#define TIM_ENCODERMODE_TI2                      TIM_SMCR_SMS_1                                                      /*!< Quadrature encoder mode 2, x2 mode, counts up/down on TI2FP2 edge depending on TI1FP1 level. */

+#define TIM_ENCODERMODE_TI12                     (TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0)                                   /*!< Quadrature encoder mode 3, x4 mode, counts up/down on both TI1FP1 and TI2FP2 edges depending on the level of the other input. */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Interrupt_definition TIM interrupt Definition

+  * @{

+  */

+#define TIM_IT_UPDATE                      TIM_DIER_UIE                         /*!< Update interrupt            */

+#define TIM_IT_CC1                         TIM_DIER_CC1IE                       /*!< Capture/Compare 1 interrupt */

+#define TIM_IT_CC2                         TIM_DIER_CC2IE                       /*!< Capture/Compare 2 interrupt */

+#define TIM_IT_CC3                         TIM_DIER_CC3IE                       /*!< Capture/Compare 3 interrupt */

+#define TIM_IT_CC4                         TIM_DIER_CC4IE                       /*!< Capture/Compare 4 interrupt */

+#define TIM_IT_COM                         TIM_DIER_COMIE                       /*!< Commutation interrupt       */

+#define TIM_IT_TRIGGER                     TIM_DIER_TIE                         /*!< Trigger interrupt           */

+#define TIM_IT_BREAK                       TIM_DIER_BIE                         /*!< Break interrupt             */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Commutation_Source  TIM Commutation Source

+  * @{

+  */

+#define TIM_COMMUTATION_TRGI              TIM_CR2_CCUS                          /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit or when an rising edge occurs on trigger input */

+#define TIM_COMMUTATION_SOFTWARE          0x00000000U                           /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_DMA_sources TIM DMA Sources

+  * @{

+  */

+#define TIM_DMA_UPDATE                     TIM_DIER_UDE                         /*!< DMA request is triggered by the update event */

+#define TIM_DMA_CC1                        TIM_DIER_CC1DE                       /*!< DMA request is triggered by the capture/compare macth 1 event */

+#define TIM_DMA_CC2                        TIM_DIER_CC2DE                       /*!< DMA request is triggered by the capture/compare macth 2 event event */

+#define TIM_DMA_CC3                        TIM_DIER_CC3DE                       /*!< DMA request is triggered by the capture/compare macth 3 event event */

+#define TIM_DMA_CC4                        TIM_DIER_CC4DE                       /*!< DMA request is triggered by the capture/compare macth 4 event event */

+#define TIM_DMA_COM                        TIM_DIER_COMDE                       /*!< DMA request is triggered by the commutation event */

+#define TIM_DMA_TRIGGER                    TIM_DIER_TDE                         /*!< DMA request is triggered by the trigger event */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Flag_definition TIM Flag Definition

+  * @{

+  */

+#define TIM_FLAG_UPDATE                    TIM_SR_UIF                           /*!< Update interrupt flag         */

+#define TIM_FLAG_CC1                       TIM_SR_CC1IF                         /*!< Capture/Compare 1 interrupt flag */

+#define TIM_FLAG_CC2                       TIM_SR_CC2IF                         /*!< Capture/Compare 2 interrupt flag */

+#define TIM_FLAG_CC3                       TIM_SR_CC3IF                         /*!< Capture/Compare 3 interrupt flag */

+#define TIM_FLAG_CC4                       TIM_SR_CC4IF                         /*!< Capture/Compare 4 interrupt flag */

+#define TIM_FLAG_CC5                       TIM_SR_CC5IF                         /*!< Capture/Compare 5 interrupt flag */

+#define TIM_FLAG_CC6                       TIM_SR_CC6IF                         /*!< Capture/Compare 6 interrupt flag */

+#define TIM_FLAG_COM                       TIM_SR_COMIF                         /*!< Commutation interrupt flag    */

+#define TIM_FLAG_TRIGGER                   TIM_SR_TIF                           /*!< Trigger interrupt flag        */

+#define TIM_FLAG_BREAK                     TIM_SR_BIF                           /*!< Break interrupt flag          */

+#define TIM_FLAG_BREAK2                    TIM_SR_B2IF                          /*!< Break 2 interrupt flag        */

+#define TIM_FLAG_SYSTEM_BREAK              TIM_SR_SBIF                          /*!< System Break interrupt flag   */

+#define TIM_FLAG_CC1OF                     TIM_SR_CC1OF                         /*!< Capture 1 overcapture flag    */

+#define TIM_FLAG_CC2OF                     TIM_SR_CC2OF                         /*!< Capture 2 overcapture flag    */

+#define TIM_FLAG_CC3OF                     TIM_SR_CC3OF                         /*!< Capture 3 overcapture flag    */

+#define TIM_FLAG_CC4OF                     TIM_SR_CC4OF                         /*!< Capture 4 overcapture flag    */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Channel TIM Channel

+  * @{

+  */

+#define TIM_CHANNEL_1                      0x00000000U                          /*!< Capture/compare channel 1 identifier      */

+#define TIM_CHANNEL_2                      0x00000004U                          /*!< Capture/compare channel 2 identifier      */

+#define TIM_CHANNEL_3                      0x00000008U                          /*!< Capture/compare channel 3 identifier      */

+#define TIM_CHANNEL_4                      0x0000000CU                          /*!< Capture/compare channel 4 identifier      */

+#define TIM_CHANNEL_5                      0x00000010U                          /*!< Compare channel 5 identifier              */

+#define TIM_CHANNEL_6                      0x00000014U                          /*!< Compare channel 6 identifier              */

+#define TIM_CHANNEL_ALL                    0x0000003CU                          /*!< Global Capture/compare channel identifier  */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Clock_Source TIM Clock Source

+  * @{

+  */

+#define TIM_CLOCKSOURCE_ETRMODE2    TIM_SMCR_ETPS_1      /*!< External clock source mode 2                          */

+#define TIM_CLOCKSOURCE_INTERNAL    TIM_SMCR_ETPS_0      /*!< Internal clock source                                 */

+#define TIM_CLOCKSOURCE_ITR0        TIM_TS_ITR0          /*!< External clock source mode 1 (ITR0)                   */

+#define TIM_CLOCKSOURCE_ITR1        TIM_TS_ITR1          /*!< External clock source mode 1 (ITR1)                   */

+#define TIM_CLOCKSOURCE_ITR2        TIM_TS_ITR2          /*!< External clock source mode 1 (ITR2)                   */

+#define TIM_CLOCKSOURCE_ITR3        TIM_TS_ITR3          /*!< External clock source mode 1 (ITR3)                   */

+#define TIM_CLOCKSOURCE_TI1ED       TIM_TS_TI1F_ED       /*!< External clock source mode 1 (TTI1FP1 + edge detect.) */

+#define TIM_CLOCKSOURCE_TI1         TIM_TS_TI1FP1        /*!< External clock source mode 1 (TTI1FP1)                */

+#define TIM_CLOCKSOURCE_TI2         TIM_TS_TI2FP2        /*!< External clock source mode 1 (TTI2FP2)                */

+#define TIM_CLOCKSOURCE_ETRMODE1    TIM_TS_ETRF          /*!< External clock source mode 1 (ETRF)                   */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Clock_Polarity TIM Clock Polarity

+  * @{

+  */

+#define TIM_CLOCKPOLARITY_INVERTED           TIM_ETRPOLARITY_INVERTED           /*!< Polarity for ETRx clock sources */

+#define TIM_CLOCKPOLARITY_NONINVERTED        TIM_ETRPOLARITY_NONINVERTED        /*!< Polarity for ETRx clock sources */

+#define TIM_CLOCKPOLARITY_RISING             TIM_INPUTCHANNELPOLARITY_RISING    /*!< Polarity for TIx clock sources */

+#define TIM_CLOCKPOLARITY_FALLING            TIM_INPUTCHANNELPOLARITY_FALLING   /*!< Polarity for TIx clock sources */

+#define TIM_CLOCKPOLARITY_BOTHEDGE           TIM_INPUTCHANNELPOLARITY_BOTHEDGE  /*!< Polarity for TIx clock sources */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Clock_Prescaler TIM Clock Prescaler

+  * @{

+  */

+#define TIM_CLOCKPRESCALER_DIV1                 TIM_ETRPRESCALER_DIV1           /*!< No prescaler is used                                                     */

+#define TIM_CLOCKPRESCALER_DIV2                 TIM_ETRPRESCALER_DIV2           /*!< Prescaler for External ETR Clock: Capture performed once every 2 events. */

+#define TIM_CLOCKPRESCALER_DIV4                 TIM_ETRPRESCALER_DIV4           /*!< Prescaler for External ETR Clock: Capture performed once every 4 events. */

+#define TIM_CLOCKPRESCALER_DIV8                 TIM_ETRPRESCALER_DIV8           /*!< Prescaler for External ETR Clock: Capture performed once every 8 events. */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_ClearInput_Polarity TIM Clear Input Polarity

+  * @{

+  */

+#define TIM_CLEARINPUTPOLARITY_INVERTED           TIM_ETRPOLARITY_INVERTED      /*!< Polarity for ETRx pin */

+#define TIM_CLEARINPUTPOLARITY_NONINVERTED        TIM_ETRPOLARITY_NONINVERTED   /*!< Polarity for ETRx pin */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_ClearInput_Prescaler TIM Clear Input Prescaler

+  * @{

+  */

+#define TIM_CLEARINPUTPRESCALER_DIV1              TIM_ETRPRESCALER_DIV1         /*!< No prescaler is used                                                   */

+#define TIM_CLEARINPUTPRESCALER_DIV2              TIM_ETRPRESCALER_DIV2         /*!< Prescaler for External ETR pin: Capture performed once every 2 events. */

+#define TIM_CLEARINPUTPRESCALER_DIV4              TIM_ETRPRESCALER_DIV4         /*!< Prescaler for External ETR pin: Capture performed once every 4 events. */

+#define TIM_CLEARINPUTPRESCALER_DIV8              TIM_ETRPRESCALER_DIV8         /*!< Prescaler for External ETR pin: Capture performed once every 8 events. */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_OSSR_Off_State_Selection_for_Run_mode_state TIM OSSR OffState Selection for Run mode state

+  * @{

+  */

+#define TIM_OSSR_ENABLE                          TIM_BDTR_OSSR                  /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer)           */

+#define TIM_OSSR_DISABLE                         0x00000000U                    /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_OSSI_Off_State_Selection_for_Idle_mode_state TIM OSSI OffState Selection for Idle mode state

+  * @{

+  */

+#define TIM_OSSI_ENABLE                          TIM_BDTR_OSSI                  /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer)           */

+#define TIM_OSSI_DISABLE                         0x00000000U                    /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */

+/**

+  * @}

+  */

+/** @defgroup TIM_Lock_level  TIM Lock level

+  * @{

+  */

+#define TIM_LOCKLEVEL_OFF                  0x00000000U                          /*!< LOCK OFF     */

+#define TIM_LOCKLEVEL_1                    TIM_BDTR_LOCK_0                      /*!< LOCK Level 1 */

+#define TIM_LOCKLEVEL_2                    TIM_BDTR_LOCK_1                      /*!< LOCK Level 2 */

+#define TIM_LOCKLEVEL_3                    TIM_BDTR_LOCK                        /*!< LOCK Level 3 */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Break_Input_enable_disable TIM Break Input Enable

+  * @{

+  */

+#define TIM_BREAK_ENABLE                   TIM_BDTR_BKE                         /*!< Break input BRK is enabled  */

+#define TIM_BREAK_DISABLE                  0x00000000U                          /*!< Break input BRK is disabled */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Break_Polarity TIM Break Input Polarity

+  * @{

+  */

+#define TIM_BREAKPOLARITY_LOW              0x00000000U                          /*!< Break input BRK is active low  */

+#define TIM_BREAKPOLARITY_HIGH             TIM_BDTR_BKP                         /*!< Break input BRK is active high */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Break2_Input_enable_disable TIM Break input 2 Enable

+  * @{

+  */

+#define TIM_BREAK2_DISABLE                 0x00000000U                          /*!< Break input BRK2 is disabled  */

+#define TIM_BREAK2_ENABLE                  TIM_BDTR_BK2E                        /*!< Break input BRK2 is enabled  */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Break2_Polarity TIM Break Input 2 Polarity

+  * @{

+  */

+#define TIM_BREAK2POLARITY_LOW             0x00000000U                          /*!< Break input BRK2 is active low   */

+#define TIM_BREAK2POLARITY_HIGH            TIM_BDTR_BK2P                        /*!< Break input BRK2 is active high  */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_AOE_Bit_Set_Reset TIM Automatic Output Enable

+  * @{

+  */

+#define TIM_AUTOMATICOUTPUT_DISABLE        0x00000000U                          /*!< MOE can be set only by software */

+#define TIM_AUTOMATICOUTPUT_ENABLE         TIM_BDTR_AOE                         /*!< MOE can be set by software or automatically at the next update event 

+                                                                                    (if none of the break inputs BRK and BRK2 is active) */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Group_Channel5 Group Channel 5 and Channel 1, 2 or 3

+  * @{

+  */

+#define TIM_GROUPCH5_NONE                  0x00000000U                          /* !< No effect of OC5REF on OC1REFC, OC2REFC and OC3REFC */

+#define TIM_GROUPCH5_OC1REFC               TIM_CCR5_GC5C1                       /* !< OC1REFC is the logical AND of OC1REFC and OC5REF    */

+#define TIM_GROUPCH5_OC2REFC               TIM_CCR5_GC5C2                       /* !< OC2REFC is the logical AND of OC2REFC and OC5REF    */

+#define TIM_GROUPCH5_OC3REFC               TIM_CCR5_GC5C3                       /* !< OC3REFC is the logical AND of OC3REFC and OC5REF    */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Master_Mode_Selection TIM Master Mode Selection

+  * @{

+  */

+#define TIM_TRGO_RESET            0x00000000U                                      /*!< TIMx_EGR.UG bit is used as trigger output (TRGO)              */

+#define TIM_TRGO_ENABLE           TIM_CR2_MMS_0                                    /*!< TIMx_CR1.CEN bit is used as trigger output (TRGO)             */

+#define TIM_TRGO_UPDATE           TIM_CR2_MMS_1                                    /*!< Update event is used as trigger output (TRGO)                 */

+#define TIM_TRGO_OC1              (TIM_CR2_MMS_1 | TIM_CR2_MMS_0)                  /*!< Capture or a compare match 1 is used as trigger output (TRGO) */

+#define TIM_TRGO_OC1REF           TIM_CR2_MMS_2                                    /*!< OC1REF signal is used as trigger output (TRGO)                */

+#define TIM_TRGO_OC2REF           (TIM_CR2_MMS_2 | TIM_CR2_MMS_0)                  /*!< OC2REF signal is used as trigger output(TRGO)                 */

+#define TIM_TRGO_OC3REF           (TIM_CR2_MMS_2 | TIM_CR2_MMS_1)                  /*!< OC3REF signal is used as trigger output(TRGO)                 */

+#define TIM_TRGO_OC4REF           (TIM_CR2_MMS_2 | TIM_CR2_MMS_1 | TIM_CR2_MMS_0)  /*!< OC4REF signal is used as trigger output(TRGO)                 */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Master_Mode_Selection_2 TIM Master Mode Selection 2 (TRGO2)

+  * @{

+  */

+#define TIM_TRGO2_RESET                          0x00000000U                                                         /*!< TIMx_EGR.UG bit is used as trigger output (TRGO2)              */

+#define TIM_TRGO2_ENABLE                         TIM_CR2_MMS2_0                                                      /*!< TIMx_CR1.CEN bit is used as trigger output (TRGO2)             */

+#define TIM_TRGO2_UPDATE                         TIM_CR2_MMS2_1                                                      /*!< Update event is used as trigger output (TRGO2)                 */

+#define TIM_TRGO2_OC1                            (TIM_CR2_MMS2_1 | TIM_CR2_MMS2_0)                                   /*!< Capture or a compare match 1 is used as trigger output (TRGO2) */

+#define TIM_TRGO2_OC1REF                         TIM_CR2_MMS2_2                                                      /*!< OC1REF signal is used as trigger output (TRGO2)                */

+#define TIM_TRGO2_OC2REF                         (TIM_CR2_MMS2_2 | TIM_CR2_MMS2_0)                                   /*!< OC2REF signal is used as trigger output (TRGO2)                */

+#define TIM_TRGO2_OC3REF                         (TIM_CR2_MMS2_2 | TIM_CR2_MMS2_1)                                   /*!< OC3REF signal is used as trigger output (TRGO2)                */

+#define TIM_TRGO2_OC4REF                         (TIM_CR2_MMS2_2 | TIM_CR2_MMS2_1 | TIM_CR2_MMS2_0)                  /*!< OC4REF signal is used as trigger output (TRGO2)                */

+#define TIM_TRGO2_OC5REF                         TIM_CR2_MMS2_3                                                      /*!< OC5REF signal is used as trigger output (TRGO2)                */

+#define TIM_TRGO2_OC6REF                         (TIM_CR2_MMS2_3 | TIM_CR2_MMS2_0)                                   /*!< OC6REF signal is used as trigger output (TRGO2)                */

+#define TIM_TRGO2_OC4REF_RISINGFALLING           (TIM_CR2_MMS2_3 | TIM_CR2_MMS2_1)                                   /*!< OC4REF rising or falling edges generate pulses on TRGO2        */

+#define TIM_TRGO2_OC6REF_RISINGFALLING           (TIM_CR2_MMS2_3 | TIM_CR2_MMS2_1 | TIM_CR2_MMS2_0)                  /*!< OC6REF rising or falling edges generate pulses on TRGO2        */

+#define TIM_TRGO2_OC4REF_RISING_OC6REF_RISING    (TIM_CR2_MMS2_3 | TIM_CR2_MMS2_2)                                   /*!< OC4REF or OC6REF rising edges generate pulses on TRGO2         */

+#define TIM_TRGO2_OC4REF_RISING_OC6REF_FALLING   (TIM_CR2_MMS2_3 | TIM_CR2_MMS2_2 | TIM_CR2_MMS2_0)                  /*!< OC4REF rising or OC6REF falling edges generate pulses on TRGO2 */

+#define TIM_TRGO2_OC5REF_RISING_OC6REF_RISING    (TIM_CR2_MMS2_3 | TIM_CR2_MMS2_2 |TIM_CR2_MMS2_1)                   /*!< OC5REF or OC6REF rising edges generate pulses on TRGO2         */

+#define TIM_TRGO2_OC5REF_RISING_OC6REF_FALLING   (TIM_CR2_MMS2_3 | TIM_CR2_MMS2_2 | TIM_CR2_MMS2_1 | TIM_CR2_MMS2_0) /*!< OC5REF or OC6REF rising edges generate pulses on TRGO2         */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Master_Slave_Mode TIM Master/Slave Mode

+  * @{

+  */

+#define TIM_MASTERSLAVEMODE_ENABLE         TIM_SMCR_MSM                         /*!< No action */

+#define TIM_MASTERSLAVEMODE_DISABLE        0x00000000U                          /*!< Master/slave mode is selected */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Slave_Mode TIM Slave mode

+  * @{

+  */

+#define TIM_SLAVEMODE_DISABLE                0x00000000U                                        /*!< Slave mode disabled           */

+#define TIM_SLAVEMODE_RESET                  TIM_SMCR_SMS_2                                     /*!< Reset Mode                    */

+#define TIM_SLAVEMODE_GATED                  (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_0)                  /*!< Gated Mode                    */

+#define TIM_SLAVEMODE_TRIGGER                (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1)                  /*!< Trigger Mode                  */

+#define TIM_SLAVEMODE_EXTERNAL1              (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) /*!< External Clock Mode 1         */

+#define TIM_SLAVEMODE_COMBINED_RESETTRIGGER  TIM_SMCR_SMS_3                                     /*!< Combined reset + trigger mode */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Output_Compare_and_PWM_modes TIM Output Compare and PWM Modes

+  * @{

+  */

+#define TIM_OCMODE_TIMING                   0x00000000U                                              /*!< Frozen                                 */

+#define TIM_OCMODE_ACTIVE                   TIM_CCMR1_OC1M_0                                         /*!< Set channel to active level on match   */

+#define TIM_OCMODE_INACTIVE                 TIM_CCMR1_OC1M_1                                         /*!< Set channel to inactive level on match */

+#define TIM_OCMODE_TOGGLE                   (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0)                    /*!< Toggle                                 */

+#define TIM_OCMODE_PWM1                     (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1)                    /*!< PWM mode 1                             */

+#define TIM_OCMODE_PWM2                     (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!< PWM mode 2                             */

+#define TIM_OCMODE_FORCED_ACTIVE            (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0)                    /*!< Force active level                     */

+#define TIM_OCMODE_FORCED_INACTIVE          TIM_CCMR1_OC1M_2                                         /*!< Force inactive level                   */

+#define TIM_OCMODE_RETRIGERRABLE_OPM1      TIM_CCMR1_OC1M_3                                          /*!< Retrigerrable OPM mode 1               */

+#define TIM_OCMODE_RETRIGERRABLE_OPM2      (TIM_CCMR1_OC1M_3 | TIM_CCMR1_OC1M_0)                     /*!< Retrigerrable OPM mode 2               */

+#define TIM_OCMODE_COMBINED_PWM1           (TIM_CCMR1_OC1M_3 | TIM_CCMR1_OC1M_2)                     /*!< Combined PWM mode 1                    */

+#define TIM_OCMODE_COMBINED_PWM2           (TIM_CCMR1_OC1M_3 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1M_2)  /*!< Combined PWM mode 2                    */

+#define TIM_OCMODE_ASSYMETRIC_PWM1         (TIM_CCMR1_OC1M_3 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2)  /*!< Asymmetric PWM mode 1                  */

+#define TIM_OCMODE_ASSYMETRIC_PWM2         TIM_CCMR1_OC1M                                            /*!< Asymmetric PWM mode 2                  */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Trigger_Selection TIM Trigger Selection

+  * @{

+  */

+#define TIM_TS_ITR0          0x00000000U                                                       /*!< Internal Trigger 0 (ITR0)              */

+#define TIM_TS_ITR1          TIM_SMCR_TS_0                                                     /*!< Internal Trigger 1 (ITR1)              */

+#define TIM_TS_ITR2          TIM_SMCR_TS_1                                                     /*!< Internal Trigger 2 (ITR2)              */

+#define TIM_TS_ITR3          (TIM_SMCR_TS_0 | TIM_SMCR_TS_1)                                   /*!< Internal Trigger 3 (ITR3)              */

+#define TIM_TS_TI1F_ED       TIM_SMCR_TS_2                                                     /*!< TI1 Edge Detector (TI1F_ED)            */

+#define TIM_TS_TI1FP1        (TIM_SMCR_TS_0 | TIM_SMCR_TS_2)                                   /*!< Filtered Timer Input 1 (TI1FP1)        */

+#define TIM_TS_TI2FP2        (TIM_SMCR_TS_1 | TIM_SMCR_TS_2)                                   /*!< Filtered Timer Input 2 (TI2FP2)        */

+#define TIM_TS_ETRF          (TIM_SMCR_TS_0 | TIM_SMCR_TS_1 | TIM_SMCR_TS_2)                   /*!< Filtered External Trigger input (ETRF) */

+#define TIM_TS_NONE          0x0000FFFFU                                                       /*!< No trigger selected                    */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Trigger_Polarity TIM Trigger Polarity

+  * @{

+  */

+#define TIM_TRIGGERPOLARITY_INVERTED           TIM_ETRPOLARITY_INVERTED               /*!< Polarity for ETRx trigger sources             */

+#define TIM_TRIGGERPOLARITY_NONINVERTED        TIM_ETRPOLARITY_NONINVERTED            /*!< Polarity for ETRx trigger sources             */

+#define TIM_TRIGGERPOLARITY_RISING             TIM_INPUTCHANNELPOLARITY_RISING        /*!< Polarity for TIxFPx or TI1_ED trigger sources */

+#define TIM_TRIGGERPOLARITY_FALLING            TIM_INPUTCHANNELPOLARITY_FALLING       /*!< Polarity for TIxFPx or TI1_ED trigger sources */

+#define TIM_TRIGGERPOLARITY_BOTHEDGE           TIM_INPUTCHANNELPOLARITY_BOTHEDGE      /*!< Polarity for TIxFPx or TI1_ED trigger sources */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Trigger_Prescaler TIM Trigger Prescaler

+  * @{

+  */

+#define TIM_TRIGGERPRESCALER_DIV1             TIM_ETRPRESCALER_DIV1             /*!< No prescaler is used                                                       */

+#define TIM_TRIGGERPRESCALER_DIV2             TIM_ETRPRESCALER_DIV2             /*!< Prescaler for External ETR Trigger: Capture performed once every 2 events. */

+#define TIM_TRIGGERPRESCALER_DIV4             TIM_ETRPRESCALER_DIV4             /*!< Prescaler for External ETR Trigger: Capture performed once every 4 events. */

+#define TIM_TRIGGERPRESCALER_DIV8             TIM_ETRPRESCALER_DIV8             /*!< Prescaler for External ETR Trigger: Capture performed once every 8 events. */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_TI1_Selection TIM TI1 Input Selection

+  * @{

+  */

+#define TIM_TI1SELECTION_CH1               0x00000000U                          /*!< The TIMx_CH1 pin is connected to TI1 input */

+#define TIM_TI1SELECTION_XORCOMBINATION    TIM_CR2_TI1S                         /*!< The TIMx_CH1, CH2 and CH3 pins are connected to the TI1 input (XOR combination) */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_DMA_Burst_Length TIM DMA Burst Length

+  * @{

+  */

+#define TIM_DMABURSTLENGTH_1TRANSFER       0x00000000U                          /*!< The transfer is done to 1 register starting trom TIMx_CR1 + TIMx_DCR.DBA   */

+#define TIM_DMABURSTLENGTH_2TRANSFERS      0x00000100U                          /*!< The transfer is done to 2 registers starting trom TIMx_CR1 + TIMx_DCR.DBA  */

+#define TIM_DMABURSTLENGTH_3TRANSFERS      0x00000200U                          /*!< The transfer is done to 3 registers starting trom TIMx_CR1 + TIMx_DCR.DBA  */

+#define TIM_DMABURSTLENGTH_4TRANSFERS      0x00000300U                          /*!< The transfer is done to 4 registers starting trom TIMx_CR1 + TIMx_DCR.DBA  */

+#define TIM_DMABURSTLENGTH_5TRANSFERS      0x00000400U                          /*!< The transfer is done to 5 registers starting trom TIMx_CR1 + TIMx_DCR.DBA  */

+#define TIM_DMABURSTLENGTH_6TRANSFERS      0x00000500U                          /*!< The transfer is done to 6 registers starting trom TIMx_CR1 + TIMx_DCR.DBA  */

+#define TIM_DMABURSTLENGTH_7TRANSFERS      0x00000600U                          /*!< The transfer is done to 7 registers starting trom TIMx_CR1 + TIMx_DCR.DBA  */

+#define TIM_DMABURSTLENGTH_8TRANSFERS      0x00000700U                          /*!< The transfer is done to 8 registers starting trom TIMx_CR1 + TIMx_DCR.DBA  */

+#define TIM_DMABURSTLENGTH_9TRANSFERS      0x00000800U                          /*!< The transfer is done to 9 registers starting trom TIMx_CR1 + TIMx_DCR.DBA  */

+#define TIM_DMABURSTLENGTH_10TRANSFERS     0x00000900U                          /*!< The transfer is done to 10 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */

+#define TIM_DMABURSTLENGTH_11TRANSFERS     0x00000A00U                          /*!< The transfer is done to 11 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */

+#define TIM_DMABURSTLENGTH_12TRANSFERS     0x00000B00U                          /*!< The transfer is done to 12 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */

+#define TIM_DMABURSTLENGTH_13TRANSFERS     0x00000C00U                          /*!< The transfer is done to 13 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */

+#define TIM_DMABURSTLENGTH_14TRANSFERS     0x00000D00U                          /*!< The transfer is done to 14 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */

+#define TIM_DMABURSTLENGTH_15TRANSFERS     0x00000E00U                          /*!< The transfer is done to 15 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */

+#define TIM_DMABURSTLENGTH_16TRANSFERS     0x00000F00U                          /*!< The transfer is done to 16 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */

+#define TIM_DMABURSTLENGTH_17TRANSFERS     0x00001000U                          /*!< The transfer is done to 17 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */

+#define TIM_DMABURSTLENGTH_18TRANSFERS     0x00001100U                          /*!< The transfer is done to 18 registers starting trom TIMx_CR1 + TIMx_DCR.DBA */

+/**

+  * @}

+  */

+

+/** @defgroup DMA_Handle_index TIM DMA Handle Index

+  * @{

+  */

+#define TIM_DMA_ID_UPDATE                ((uint16_t) 0x0000)       /*!< Index of the DMA handle used for Update DMA requests */

+#define TIM_DMA_ID_CC1                   ((uint16_t) 0x0001)       /*!< Index of the DMA handle used for Capture/Compare 1 DMA requests */

+#define TIM_DMA_ID_CC2                   ((uint16_t) 0x0002)       /*!< Index of the DMA handle used for Capture/Compare 2 DMA requests */

+#define TIM_DMA_ID_CC3                   ((uint16_t) 0x0003)       /*!< Index of the DMA handle used for Capture/Compare 3 DMA requests */

+#define TIM_DMA_ID_CC4                   ((uint16_t) 0x0004)       /*!< Index of the DMA handle used for Capture/Compare 4 DMA requests */

+#define TIM_DMA_ID_COMMUTATION           ((uint16_t) 0x0005)       /*!< Index of the DMA handle used for Commutation DMA requests */

+#define TIM_DMA_ID_TRIGGER               ((uint16_t) 0x0006)       /*!< Index of the DMA handle used for Trigger DMA requests */

+/**

+  * @}

+  */

+

+/** @defgroup Channel_CC_State TIM Capture/Compare Channel State

+  * @{

+  */

+#define TIM_CCx_ENABLE                   0x00000001U                            /*!< Input or output channel is enabled */

+#define TIM_CCx_DISABLE                  0x00000000U                            /*!< Input or output channel is disabled */

+#define TIM_CCxN_ENABLE                  0x00000004U                            /*!< Complementary output channel is enabled */

+#define TIM_CCxN_DISABLE                 0x00000000U                            /*!< Complementary output channel is enabled */

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Break_System TIM Break System

+  * @{

+  */

+#define TIM_BREAK_SYSTEM_ECC                 SYSCFG_CFGR2_ECCL   /*!< Enables and locks the ECC error signal with Break Input of TIM1/8/15/16/17 */

+#define TIM_BREAK_SYSTEM_PVD                 SYSCFG_CFGR2_PVDL   /*!< Enables and locks the PVD connection with TIM1/8/15/16/17 Break Input and also the PVDE and PLS bits of the Power Control Interface */

+#define TIM_BREAK_SYSTEM_SRAM2_PARITY_ERROR  SYSCFG_CFGR2_SPL    /*!< Enables and locks the SRAM2_PARITY error signal with Break Input of TIM1/8/15/16/17 */

+#define TIM_BREAK_SYSTEM_LOCKUP              SYSCFG_CFGR2_CLL    /*!< Enables and locks the LOCKUP output of CortexM4 with Break Input of TIM1/8/15/16/17 */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+/* End of exported constants -------------------------------------------------*/

+

+/* Exported macros -----------------------------------------------------------*/

+/** @defgroup TIM_Exported_Macros TIM Exported Macros

+  * @{

+  */

+

+/** @brief  Reset TIM handle state.

+  * @param  __HANDLE__ TIM handle.

+  * @retval None

+  */

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) do {                                                        \

+                                                      (__HANDLE__)->State             = HAL_TIM_STATE_RESET; \

+                                                      (__HANDLE__)->Base_MspInitCallback         = NULL;     \

+                                                      (__HANDLE__)->Base_MspDeInitCallback       = NULL;     \

+                                                      (__HANDLE__)->IC_MspInitCallback           = NULL;     \

+                                                      (__HANDLE__)->IC_MspDeInitCallback         = NULL;     \

+                                                      (__HANDLE__)->OC_MspInitCallback           = NULL;     \

+                                                      (__HANDLE__)->OC_MspDeInitCallback         = NULL;     \

+                                                      (__HANDLE__)->PWM_MspInitCallback          = NULL;     \

+                                                      (__HANDLE__)->PWM_MspDeInitCallback        = NULL;     \

+                                                      (__HANDLE__)->OnePulse_MspInitCallback     = NULL;     \

+                                                      (__HANDLE__)->OnePulse_MspDeInitCallback   = NULL;     \

+                                                      (__HANDLE__)->Encoder_MspInitCallback      = NULL;     \

+                                                      (__HANDLE__)->Encoder_MspDeInitCallback    = NULL;     \

+                                                      (__HANDLE__)->HallSensor_MspInitCallback   = NULL;     \

+                                                      (__HANDLE__)->HallSensor_MspDeInitCallback = NULL;     \

+                                                     } while(0)

+#else

+#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_TIM_STATE_RESET)

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+

+/**

+  * @brief  Enable the TIM peripheral.

+  * @param  __HANDLE__ TIM handle

+  * @retval None

+  */

+#define __HAL_TIM_ENABLE(__HANDLE__)                 ((__HANDLE__)->Instance->CR1|=(TIM_CR1_CEN))

+

+/**

+  * @brief  Enable the TIM main Output.

+  * @param  __HANDLE__ TIM handle

+  * @retval None

+  */

+#define __HAL_TIM_MOE_ENABLE(__HANDLE__)             ((__HANDLE__)->Instance->BDTR|=(TIM_BDTR_MOE))

+

+/**

+  * @brief  Disable the TIM peripheral.

+  * @param  __HANDLE__ TIM handle

+  * @retval None

+  */

+#define __HAL_TIM_DISABLE(__HANDLE__) \

+  do { \

+    if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \

+    { \

+      if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \

+      { \

+        (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \

+      } \

+    } \

+  } while(0)

+

+/**

+  * @brief  Disable the TIM main Output.

+  * @param  __HANDLE__ TIM handle

+  * @retval None

+  * @note The Main Output Enable of a timer instance is disabled only if all the CCx and CCxN channels have been disabled

+  */

+#define __HAL_TIM_MOE_DISABLE(__HANDLE__) \

+  do { \

+    if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \

+    { \

+      if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \

+      { \

+        (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \

+      } \

+    } \

+  } while(0)

+

+/**

+  * @brief  Disable the TIM main Output.

+  * @param  __HANDLE__ TIM handle

+  * @retval None

+  * @note The Main Output Enable of a timer instance is disabled unconditionally

+  */

+#define __HAL_TIM_MOE_DISABLE_UNCONDITIONALLY(__HANDLE__)  (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE)

+

+/** @brief  Enable the specified TIM interrupt.

+  * @param  __HANDLE__ specifies the TIM Handle.

+  * @param  __INTERRUPT__ specifies the TIM interrupt source to enable.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_IT_UPDATE: Update interrupt

+  *            @arg TIM_IT_CC1:   Capture/Compare 1 interrupt

+  *            @arg TIM_IT_CC2:  Capture/Compare 2 interrupt

+  *            @arg TIM_IT_CC3:  Capture/Compare 3 interrupt

+  *            @arg TIM_IT_CC4:  Capture/Compare 4 interrupt

+  *            @arg TIM_IT_COM:   Commutation interrupt

+  *            @arg TIM_IT_TRIGGER: Trigger interrupt

+  *            @arg TIM_IT_BREAK: Break interrupt

+  * @retval None

+  */

+#define __HAL_TIM_ENABLE_IT(__HANDLE__, __INTERRUPT__)    ((__HANDLE__)->Instance->DIER |= (__INTERRUPT__))

+

+/** @brief  Disable the specified TIM interrupt.

+  * @param  __HANDLE__ specifies the TIM Handle.

+  * @param  __INTERRUPT__ specifies the TIM interrupt source to disable.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_IT_UPDATE: Update interrupt

+  *            @arg TIM_IT_CC1:   Capture/Compare 1 interrupt

+  *            @arg TIM_IT_CC2:  Capture/Compare 2 interrupt

+  *            @arg TIM_IT_CC3:  Capture/Compare 3 interrupt

+  *            @arg TIM_IT_CC4:  Capture/Compare 4 interrupt

+  *            @arg TIM_IT_COM:   Commutation interrupt

+  *            @arg TIM_IT_TRIGGER: Trigger interrupt

+  *            @arg TIM_IT_BREAK: Break interrupt

+  * @retval None

+  */

+#define __HAL_TIM_DISABLE_IT(__HANDLE__, __INTERRUPT__)   ((__HANDLE__)->Instance->DIER &= ~(__INTERRUPT__))

+

+/** @brief  Enable the specified DMA request.

+  * @param  __HANDLE__ specifies the TIM Handle.

+  * @param  __DMA__ specifies the TIM DMA request to enable.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_DMA_UPDATE: Update DMA request

+  *            @arg TIM_DMA_CC1:   Capture/Compare 1 DMA request

+  *            @arg TIM_DMA_CC2:  Capture/Compare 2 DMA request

+  *            @arg TIM_DMA_CC3:  Capture/Compare 3 DMA request

+  *            @arg TIM_DMA_CC4:  Capture/Compare 4 DMA request

+  *            @arg TIM_DMA_COM:   Commutation DMA request

+  *            @arg TIM_DMA_TRIGGER: Trigger DMA request

+  * @retval None

+  */

+#define __HAL_TIM_ENABLE_DMA(__HANDLE__, __DMA__)         ((__HANDLE__)->Instance->DIER |= (__DMA__))

+

+/** @brief  Disable the specified DMA request.

+  * @param  __HANDLE__ specifies the TIM Handle.

+  * @param  __DMA__ specifies the TIM DMA request to disable.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_DMA_UPDATE: Update DMA request

+  *            @arg TIM_DMA_CC1:   Capture/Compare 1 DMA request

+  *            @arg TIM_DMA_CC2:  Capture/Compare 2 DMA request

+  *            @arg TIM_DMA_CC3:  Capture/Compare 3 DMA request

+  *            @arg TIM_DMA_CC4:  Capture/Compare 4 DMA request

+  *            @arg TIM_DMA_COM:   Commutation DMA request

+  *            @arg TIM_DMA_TRIGGER: Trigger DMA request

+  * @retval None

+  */

+#define __HAL_TIM_DISABLE_DMA(__HANDLE__, __DMA__)        ((__HANDLE__)->Instance->DIER &= ~(__DMA__))

+

+/** @brief  Check whether the specified TIM interrupt flag is set or not.

+  * @param  __HANDLE__ specifies the TIM Handle.

+  * @param  __FLAG__ specifies the TIM interrupt flag to check.

+  *        This parameter can be one of the following values:

+  *            @arg TIM_FLAG_UPDATE: Update interrupt flag

+  *            @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag

+  *            @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag

+  *            @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag

+  *            @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag

+  *            @arg TIM_FLAG_CC5: Compare 5 interrupt flag

+  *            @arg TIM_FLAG_CC6: Compare 6 interrupt flag

+  *            @arg TIM_FLAG_COM:  Commutation interrupt flag

+  *            @arg TIM_FLAG_TRIGGER: Trigger interrupt flag

+  *            @arg TIM_FLAG_BREAK: Break interrupt flag

+  *            @arg TIM_FLAG_BREAK2: Break 2 interrupt flag

+  *            @arg TIM_FLAG_SYSTEM_BREAK: System Break interrupt flag

+  *            @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag

+  *            @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag

+  *            @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag

+  *            @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag

+  * @retval The new state of __FLAG__ (TRUE or FALSE).

+  */

+#define __HAL_TIM_GET_FLAG(__HANDLE__, __FLAG__)          (((__HANDLE__)->Instance->SR &(__FLAG__)) == (__FLAG__))

+

+/** @brief  Clear the specified TIM interrupt flag.

+  * @param  __HANDLE__ specifies the TIM Handle.

+  * @param  __FLAG__ specifies the TIM interrupt flag to clear.

+  *        This parameter can be one of the following values:

+  *            @arg TIM_FLAG_UPDATE: Update interrupt flag

+  *            @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag

+  *            @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag

+  *            @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag

+  *            @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag

+  *            @arg TIM_FLAG_CC5: Compare 5 interrupt flag

+  *            @arg TIM_FLAG_CC6: Compare 6 interrupt flag

+  *            @arg TIM_FLAG_COM:  Commutation interrupt flag

+  *            @arg TIM_FLAG_TRIGGER: Trigger interrupt flag

+  *            @arg TIM_FLAG_BREAK: Break interrupt flag

+  *            @arg TIM_FLAG_BREAK2: Break 2 interrupt flag

+  *            @arg TIM_FLAG_SYSTEM_BREAK: System Break interrupt flag

+  *            @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag

+  *            @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag

+  *            @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag

+  *            @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag

+  * @retval The new state of __FLAG__ (TRUE or FALSE).

+  */

+#define __HAL_TIM_CLEAR_FLAG(__HANDLE__, __FLAG__)        ((__HANDLE__)->Instance->SR = ~(__FLAG__))

+

+/**

+  * @brief  Check whether the specified TIM interrupt source is enabled or not.

+  * @param  __HANDLE__ TIM handle

+  * @param  __INTERRUPT__ specifies the TIM interrupt source to check.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_IT_UPDATE: Update interrupt

+  *            @arg TIM_IT_CC1:   Capture/Compare 1 interrupt

+  *            @arg TIM_IT_CC2:  Capture/Compare 2 interrupt

+  *            @arg TIM_IT_CC3:  Capture/Compare 3 interrupt

+  *            @arg TIM_IT_CC4:  Capture/Compare 4 interrupt

+  *            @arg TIM_IT_COM:   Commutation interrupt

+  *            @arg TIM_IT_TRIGGER: Trigger interrupt

+  *            @arg TIM_IT_BREAK: Break interrupt

+  * @retval The state of TIM_IT (SET or RESET).

+  */

+#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) \

+                                                             == (__INTERRUPT__)) ? SET : RESET)

+

+/** @brief Clear the TIM interrupt pending bits.

+  * @param  __HANDLE__ TIM handle

+  * @param  __INTERRUPT__ specifies the interrupt pending bit to clear.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_IT_UPDATE: Update interrupt

+  *            @arg TIM_IT_CC1:   Capture/Compare 1 interrupt

+  *            @arg TIM_IT_CC2:  Capture/Compare 2 interrupt

+  *            @arg TIM_IT_CC3:  Capture/Compare 3 interrupt

+  *            @arg TIM_IT_CC4:  Capture/Compare 4 interrupt

+  *            @arg TIM_IT_COM:   Commutation interrupt

+  *            @arg TIM_IT_TRIGGER: Trigger interrupt

+  *            @arg TIM_IT_BREAK: Break interrupt

+  * @retval None

+  */

+#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__)      ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__))

+

+/**

+  * @brief  Indicates whether or not the TIM Counter is used as downcounter.

+  * @param  __HANDLE__ TIM handle.

+  * @retval False (Counter used as upcounter) or True (Counter used as downcounter)

+  * @note This macro is particularly useful to get the counting mode when the timer operates in Center-aligned mode or Encoder

+mode.

+  */

+#define __HAL_TIM_IS_TIM_COUNTING_DOWN(__HANDLE__)    (((__HANDLE__)->Instance->CR1 &(TIM_CR1_DIR)) == (TIM_CR1_DIR))

+

+/**

+  * @brief  Set the TIM Prescaler on runtime.

+  * @param  __HANDLE__ TIM handle.

+  * @param  __PRESC__ specifies the Prescaler new value.

+  * @retval None

+  */

+#define __HAL_TIM_SET_PRESCALER(__HANDLE__, __PRESC__)       ((__HANDLE__)->Instance->PSC = (__PRESC__))

+

+/**

+  * @brief  Set the TIM Counter Register value on runtime.

+  * @param  __HANDLE__ TIM handle.

+  * @param  __COUNTER__ specifies the Counter register new value.

+  * @retval None

+  */

+#define __HAL_TIM_SET_COUNTER(__HANDLE__, __COUNTER__)  ((__HANDLE__)->Instance->CNT = (__COUNTER__))

+

+/**

+  * @brief  Get the TIM Counter Register value on runtime.

+  * @param  __HANDLE__ TIM handle.

+  * @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT)

+  */

+#define __HAL_TIM_GET_COUNTER(__HANDLE__)  ((__HANDLE__)->Instance->CNT)

+

+/**

+  * @brief  Set the TIM Autoreload Register value on runtime without calling another time any Init function.

+  * @param  __HANDLE__ TIM handle.

+  * @param  __AUTORELOAD__ specifies the Counter register new value.

+  * @retval None

+  */

+#define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \

+  do{                                                    \

+    (__HANDLE__)->Instance->ARR = (__AUTORELOAD__);  \

+    (__HANDLE__)->Init.Period = (__AUTORELOAD__);    \

+  } while(0)

+

+/**

+  * @brief  Get the TIM Autoreload Register value on runtime.

+  * @param  __HANDLE__ TIM handle.

+  * @retval 16-bit or 32-bit value of the timer auto-reload register(TIMx_ARR)

+  */

+#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__)  ((__HANDLE__)->Instance->ARR)

+

+/**

+  * @brief  Set the TIM Clock Division value on runtime without calling another time any Init function.

+  * @param  __HANDLE__ TIM handle.

+  * @param  __CKD__ specifies the clock division value.

+  *          This parameter can be one of the following value:

+  *            @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT

+  *            @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT

+  *            @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT

+  * @retval None

+  */

+#define __HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__) \

+  do{                                                   \

+    (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD);  \

+    (__HANDLE__)->Instance->CR1 |= (__CKD__);       \

+    (__HANDLE__)->Init.ClockDivision = (__CKD__);   \

+  } while(0)

+

+/**

+  * @brief  Get the TIM Clock Division value on runtime.

+  * @param  __HANDLE__ TIM handle.

+  * @retval The clock division can be one of the following values:

+  *            @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT

+  *            @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT

+  *            @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT

+  */

+#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__)  ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD)

+

+/**

+  * @brief  Set the TIM Input Capture prescaler on runtime without calling another time HAL_TIM_IC_ConfigChannel() function.

+  * @param  __HANDLE__ TIM handle.

+  * @param  __CHANNEL__ TIM Channels to be configured.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  * @param  __ICPSC__ specifies the Input Capture4 prescaler new value.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_ICPSC_DIV1: no prescaler

+  *            @arg TIM_ICPSC_DIV2: capture is done once every 2 events

+  *            @arg TIM_ICPSC_DIV4: capture is done once every 4 events

+  *            @arg TIM_ICPSC_DIV8: capture is done once every 8 events

+  * @retval None

+  */

+#define __HAL_TIM_SET_ICPRESCALER(__HANDLE__, __CHANNEL__, __ICPSC__) \

+  do{                                                    \

+    TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__));  \

+    TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \

+  } while(0)

+

+/**

+  * @brief  Get the TIM Input Capture prescaler on runtime.

+  * @param  __HANDLE__ TIM handle.

+  * @param  __CHANNEL__ TIM Channels to be configured.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: get input capture 1 prescaler value

+  *            @arg TIM_CHANNEL_2: get input capture 2 prescaler value

+  *            @arg TIM_CHANNEL_3: get input capture 3 prescaler value

+  *            @arg TIM_CHANNEL_4: get input capture 4 prescaler value

+  * @retval The input capture prescaler can be one of the following values:

+  *            @arg TIM_ICPSC_DIV1: no prescaler

+  *            @arg TIM_ICPSC_DIV2: capture is done once every 2 events

+  *            @arg TIM_ICPSC_DIV4: capture is done once every 4 events

+  *            @arg TIM_ICPSC_DIV8: capture is done once every 8 events

+  */

+#define __HAL_TIM_GET_ICPRESCALER(__HANDLE__, __CHANNEL__)  \

+  (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC1PSC) :\

+   ((__CHANNEL__) == TIM_CHANNEL_2) ? (((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC2PSC) >> 8U) :\

+   ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC3PSC) :\

+   (((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC4PSC)) >> 8U)

+

+/**

+  * @brief  Set the TIM Capture Compare Register value on runtime without calling another time ConfigChannel function.

+  * @param  __HANDLE__ TIM handle.

+  * @param  __CHANNEL__ TIM Channels to be configured.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  *            @arg TIM_CHANNEL_5: TIM Channel 5 selected

+  *            @arg TIM_CHANNEL_6: TIM Channel 6 selected

+  * @param  __COMPARE__ specifies the Capture Compare register new value.

+  * @retval None

+  */

+#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \

+  (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\

+   ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\

+   ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\

+   ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)) :\

+   ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5 = (__COMPARE__)) :\

+   ((__HANDLE__)->Instance->CCR6 = (__COMPARE__)))

+

+/**

+  * @brief  Get the TIM Capture Compare Register value on runtime.

+  * @param  __HANDLE__ TIM handle.

+  * @param  __CHANNEL__ TIM Channel associated with the capture compare register

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: get capture/compare 1 register value

+  *            @arg TIM_CHANNEL_2: get capture/compare 2 register value

+  *            @arg TIM_CHANNEL_3: get capture/compare 3 register value

+  *            @arg TIM_CHANNEL_4: get capture/compare 4 register value

+  *            @arg TIM_CHANNEL_5: get capture/compare 5 register value

+  *            @arg TIM_CHANNEL_6: get capture/compare 6 register value

+  * @retval 16-bit or 32-bit value of the capture/compare register (TIMx_CCRy)

+  */

+#define __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) \

+  (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\

+   ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\

+   ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\

+   ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4) :\

+   ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5) :\

+   ((__HANDLE__)->Instance->CCR6))

+

+/**

+  * @brief  Set the TIM Output compare preload.

+  * @param  __HANDLE__ TIM handle.

+  * @param  __CHANNEL__ TIM Channels to be configured.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  *            @arg TIM_CHANNEL_5: TIM Channel 5 selected

+  *            @arg TIM_CHANNEL_6: TIM Channel 6 selected

+  * @retval None

+  */

+#define __HAL_TIM_ENABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__)    \

+  (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\

+   ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\

+   ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\

+   ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE) :\

+   ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5PE) :\

+   ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6PE))

+

+/**

+  * @brief  Reset the TIM Output compare preload.

+  * @param  __HANDLE__ TIM handle.

+  * @param  __CHANNEL__ TIM Channels to be configured.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  *            @arg TIM_CHANNEL_5: TIM Channel 5 selected

+  *            @arg TIM_CHANNEL_6: TIM Channel 6 selected

+  * @retval None

+  */

+#define __HAL_TIM_DISABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__)    \

+  (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_OC1PE) :\

+   ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_OC2PE) :\

+   ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_OC3PE) :\

+   ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_OC4PE) :\

+   ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= (uint16_t)~TIM_CCMR3_OC5PE) :\

+   ((__HANDLE__)->Instance->CCMR3 &= (uint16_t)~TIM_CCMR3_OC6PE))

+

+/**

+  * @brief  Set the Update Request Source (URS) bit of the TIMx_CR1 register.

+  * @param  __HANDLE__ TIM handle.

+  * @note  When the URS bit of the TIMx_CR1 register is set, only counter

+  *        overflow/underflow generates an update interrupt or DMA request (if

+  *        enabled)

+  * @retval None

+  */

+#define __HAL_TIM_URS_ENABLE(__HANDLE__)  ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS)

+

+/**

+  * @brief  Reset the Update Request Source (URS) bit of the TIMx_CR1 register.

+  * @param  __HANDLE__ TIM handle.

+  * @note  When the URS bit of the TIMx_CR1 register is reset, any of the

+  *        following events generate an update interrupt or DMA request (if

+  *        enabled):

+  *           _ Counter overflow underflow

+  *           _ Setting the UG bit

+  *           _ Update generation through the slave mode controller

+  * @retval None

+  */

+#define __HAL_TIM_URS_DISABLE(__HANDLE__)  ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS)

+

+/**

+  * @brief  Set the TIM Capture x input polarity on runtime.

+  * @param  __HANDLE__ TIM handle.

+  * @param  __CHANNEL__ TIM Channels to be configured.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  * @param  __POLARITY__ Polarity for TIx source

+  *            @arg TIM_INPUTCHANNELPOLARITY_RISING: Rising Edge

+  *            @arg TIM_INPUTCHANNELPOLARITY_FALLING: Falling Edge

+  *            @arg TIM_INPUTCHANNELPOLARITY_BOTHEDGE: Rising and Falling Edge

+  * @retval None

+  */

+#define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__)    \

+  do{                                                                     \

+    TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__));               \

+    TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \

+  }while(0)

+

+/**

+  * @}

+  */

+/* End of exported macros ----------------------------------------------------*/

+

+/* Private constants ---------------------------------------------------------*/

+/** @defgroup TIM_Private_Constants TIM Private Constants

+  * @{

+  */

+/* The counter of a timer instance is disabled only if all the CCx and CCxN

+   channels have been disabled */

+#define TIM_CCER_CCxE_MASK  ((uint32_t)(TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E))

+#define TIM_CCER_CCxNE_MASK ((uint32_t)(TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE))

+/**

+  * @}

+  */

+/* End of private constants --------------------------------------------------*/

+

+/* Private macros ------------------------------------------------------------*/

+/** @defgroup TIM_Private_Macros TIM Private Macros

+  * @{

+  */

+#define IS_TIM_CLEARINPUT_SOURCE(__MODE__)  (((__MODE__) == TIM_CLEARINPUTSOURCE_ETR)      || \

+                                             ((__MODE__) == TIM_CLEARINPUTSOURCE_OCREFCLR) || \

+                                             ((__MODE__) == TIM_CLEARINPUTSOURCE_NONE))

+

+#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1)   || \

+                                   ((__BASE__) == TIM_DMABASE_CR2)   || \

+                                   ((__BASE__) == TIM_DMABASE_SMCR)  || \

+                                   ((__BASE__) == TIM_DMABASE_DIER)  || \

+                                   ((__BASE__) == TIM_DMABASE_SR)    || \

+                                   ((__BASE__) == TIM_DMABASE_EGR)   || \

+                                   ((__BASE__) == TIM_DMABASE_CCMR1) || \

+                                   ((__BASE__) == TIM_DMABASE_CCMR2) || \

+                                   ((__BASE__) == TIM_DMABASE_CCER)  || \

+                                   ((__BASE__) == TIM_DMABASE_CNT)   || \

+                                   ((__BASE__) == TIM_DMABASE_PSC)   || \

+                                   ((__BASE__) == TIM_DMABASE_ARR)   || \

+                                   ((__BASE__) == TIM_DMABASE_RCR)   || \

+                                   ((__BASE__) == TIM_DMABASE_CCR1)  || \

+                                   ((__BASE__) == TIM_DMABASE_CCR2)  || \

+                                   ((__BASE__) == TIM_DMABASE_CCR3)  || \

+                                   ((__BASE__) == TIM_DMABASE_CCR4)  || \

+                                   ((__BASE__) == TIM_DMABASE_BDTR)  || \

+                                   ((__BASE__) == TIM_DMABASE_OR1)    || \

+                                   ((__BASE__) == TIM_DMABASE_CCMR3) || \

+                                   ((__BASE__) == TIM_DMABASE_CCR5)  || \

+                                   ((__BASE__) == TIM_DMABASE_CCR6)  || \

+                                   ((__BASE__) == TIM_DMABASE_OR2)   || \

+                                   ((__BASE__) == TIM_DMABASE_OR3))

+

+#define IS_TIM_EVENT_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFFFE00U) == 0x00000000U) && ((__SOURCE__) != 0x00000000U))

+

+#define IS_TIM_COUNTER_MODE(__MODE__)      (((__MODE__) == TIM_COUNTERMODE_UP)              || \

+                                            ((__MODE__) == TIM_COUNTERMODE_DOWN)            || \

+                                            ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED1)  || \

+                                            ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED2)  || \

+                                            ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED3))

+

+#define IS_TIM_CLOCKDIVISION_DIV(__DIV__)  (((__DIV__) == TIM_CLOCKDIVISION_DIV1) || \

+                                            ((__DIV__) == TIM_CLOCKDIVISION_DIV2) || \

+                                            ((__DIV__) == TIM_CLOCKDIVISION_DIV4))

+

+#define IS_TIM_AUTORELOAD_PRELOAD(PRELOAD) (((PRELOAD) == TIM_AUTORELOAD_PRELOAD_DISABLE) || \

+                                            ((PRELOAD) == TIM_AUTORELOAD_PRELOAD_ENABLE))

+

+#define IS_TIM_FAST_STATE(__STATE__)       (((__STATE__) == TIM_OCFAST_DISABLE) || \

+                                            ((__STATE__) == TIM_OCFAST_ENABLE))

+

+#define IS_TIM_OC_POLARITY(__POLARITY__)   (((__POLARITY__) == TIM_OCPOLARITY_HIGH) || \

+                                            ((__POLARITY__) == TIM_OCPOLARITY_LOW))

+

+#define IS_TIM_OCN_POLARITY(__POLARITY__)  (((__POLARITY__) == TIM_OCNPOLARITY_HIGH) || \

+                                            ((__POLARITY__) == TIM_OCNPOLARITY_LOW))

+

+#define IS_TIM_OCIDLE_STATE(__STATE__)     (((__STATE__) == TIM_OCIDLESTATE_SET) || \

+                                            ((__STATE__) == TIM_OCIDLESTATE_RESET))

+

+#define IS_TIM_OCNIDLE_STATE(__STATE__)    (((__STATE__) == TIM_OCNIDLESTATE_SET) || \

+                                            ((__STATE__) == TIM_OCNIDLESTATE_RESET))

+

+#define IS_TIM_IC_POLARITY(__POLARITY__)   (((__POLARITY__) == TIM_ICPOLARITY_RISING)   || \

+                                            ((__POLARITY__) == TIM_ICPOLARITY_FALLING)  || \

+                                            ((__POLARITY__) == TIM_ICPOLARITY_BOTHEDGE))

+

+#define IS_TIM_IC_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_ICSELECTION_DIRECTTI) || \

+                                            ((__SELECTION__) == TIM_ICSELECTION_INDIRECTTI) || \

+                                            ((__SELECTION__) == TIM_ICSELECTION_TRC))

+

+#define IS_TIM_IC_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_ICPSC_DIV1) || \

+                                            ((__PRESCALER__) == TIM_ICPSC_DIV2) || \

+                                            ((__PRESCALER__) == TIM_ICPSC_DIV4) || \

+                                            ((__PRESCALER__) == TIM_ICPSC_DIV8))

+

+#define IS_TIM_OPM_MODE(__MODE__)          (((__MODE__) == TIM_OPMODE_SINGLE) || \

+                                            ((__MODE__) == TIM_OPMODE_REPETITIVE))

+

+#define IS_TIM_ENCODER_MODE(__MODE__)      (((__MODE__) == TIM_ENCODERMODE_TI1) || \

+                                            ((__MODE__) == TIM_ENCODERMODE_TI2) || \

+                                            ((__MODE__) == TIM_ENCODERMODE_TI12))

+

+#define IS_TIM_DMA_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFF80FFU) == 0x00000000U) && ((__SOURCE__) != 0x00000000U))

+

+#define IS_TIM_CHANNELS(__CHANNEL__)       (((__CHANNEL__) == TIM_CHANNEL_1) || \

+                                            ((__CHANNEL__) == TIM_CHANNEL_2) || \

+                                            ((__CHANNEL__) == TIM_CHANNEL_3) || \

+                                            ((__CHANNEL__) == TIM_CHANNEL_4) || \

+                                            ((__CHANNEL__) == TIM_CHANNEL_5) || \

+                                            ((__CHANNEL__) == TIM_CHANNEL_6) || \

+                                            ((__CHANNEL__) == TIM_CHANNEL_ALL))

+

+#define IS_TIM_OPM_CHANNELS(__CHANNEL__)   (((__CHANNEL__) == TIM_CHANNEL_1) || \

+                                            ((__CHANNEL__) == TIM_CHANNEL_2))

+

+#define IS_TIM_COMPLEMENTARY_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \

+                                                    ((__CHANNEL__) == TIM_CHANNEL_2) || \

+                                                    ((__CHANNEL__) == TIM_CHANNEL_3))

+

+#define IS_TIM_CLOCKSOURCE(__CLOCK__) (((__CLOCK__) == TIM_CLOCKSOURCE_INTERNAL) || \

+                                       ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE2) || \

+                                       ((__CLOCK__) == TIM_CLOCKSOURCE_ITR0)     || \

+                                       ((__CLOCK__) == TIM_CLOCKSOURCE_ITR1)     || \

+                                       ((__CLOCK__) == TIM_CLOCKSOURCE_ITR2)     || \

+                                       ((__CLOCK__) == TIM_CLOCKSOURCE_ITR3)     || \

+                                       ((__CLOCK__) == TIM_CLOCKSOURCE_TI1ED)    || \

+                                       ((__CLOCK__) == TIM_CLOCKSOURCE_TI1)      || \

+                                       ((__CLOCK__) == TIM_CLOCKSOURCE_TI2)      || \

+                                       ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE1))

+

+#define IS_TIM_CLOCKPOLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLOCKPOLARITY_INVERTED)    || \

+                                            ((__POLARITY__) == TIM_CLOCKPOLARITY_NONINVERTED) || \

+                                            ((__POLARITY__) == TIM_CLOCKPOLARITY_RISING)      || \

+                                            ((__POLARITY__) == TIM_CLOCKPOLARITY_FALLING)     || \

+                                            ((__POLARITY__) == TIM_CLOCKPOLARITY_BOTHEDGE))

+

+#define IS_TIM_CLOCKPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV1) || \

+                                              ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV2) || \

+                                              ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV4) || \

+                                              ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV8))

+

+#define IS_TIM_CLOCKFILTER(__ICFILTER__)      ((__ICFILTER__) <= 0xFU)

+

+#define IS_TIM_CLEARINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLEARINPUTPOLARITY_INVERTED) || \

+                                                  ((__POLARITY__) == TIM_CLEARINPUTPOLARITY_NONINVERTED))

+

+#define IS_TIM_CLEARINPUT_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV1) || \

+                                                    ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV2) || \

+                                                    ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV4) || \

+                                                    ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV8))

+

+#define IS_TIM_CLEARINPUT_FILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU)

+

+#define IS_TIM_OSSR_STATE(__STATE__)       (((__STATE__) == TIM_OSSR_ENABLE) || \

+                                            ((__STATE__) == TIM_OSSR_DISABLE))

+

+#define IS_TIM_OSSI_STATE(__STATE__)       (((__STATE__) == TIM_OSSI_ENABLE) || \

+                                            ((__STATE__) == TIM_OSSI_DISABLE))

+

+#define IS_TIM_LOCK_LEVEL(__LEVEL__)       (((__LEVEL__) == TIM_LOCKLEVEL_OFF) || \

+                                            ((__LEVEL__) == TIM_LOCKLEVEL_1)   || \

+                                            ((__LEVEL__) == TIM_LOCKLEVEL_2)   || \

+                                            ((__LEVEL__) == TIM_LOCKLEVEL_3))

+

+#define IS_TIM_BREAK_FILTER(__BRKFILTER__) ((__BRKFILTER__) <= 0xFUL)

+

+

+#define IS_TIM_BREAK_STATE(__STATE__)      (((__STATE__) == TIM_BREAK_ENABLE) || \

+                                            ((__STATE__) == TIM_BREAK_DISABLE))

+

+#define IS_TIM_BREAK_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_BREAKPOLARITY_LOW) || \

+                                             ((__POLARITY__) == TIM_BREAKPOLARITY_HIGH))

+

+#define IS_TIM_BREAK2_STATE(__STATE__)     (((__STATE__) == TIM_BREAK2_ENABLE) || \

+                                            ((__STATE__) == TIM_BREAK2_DISABLE))

+

+#define IS_TIM_BREAK2_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_BREAK2POLARITY_LOW) || \

+                                              ((__POLARITY__) == TIM_BREAK2POLARITY_HIGH))

+

+#define IS_TIM_AUTOMATIC_OUTPUT_STATE(__STATE__) (((__STATE__) == TIM_AUTOMATICOUTPUT_ENABLE) || \

+                                                  ((__STATE__) == TIM_AUTOMATICOUTPUT_DISABLE))

+

+#define IS_TIM_GROUPCH5(__OCREF__) ((((__OCREF__) & 0x1FFFFFFFU) == 0x00000000U))

+

+#define IS_TIM_TRGO_SOURCE(__SOURCE__) (((__SOURCE__) == TIM_TRGO_RESET)  || \

+                                        ((__SOURCE__) == TIM_TRGO_ENABLE) || \

+                                        ((__SOURCE__) == TIM_TRGO_UPDATE) || \

+                                        ((__SOURCE__) == TIM_TRGO_OC1)    || \

+                                        ((__SOURCE__) == TIM_TRGO_OC1REF) || \

+                                        ((__SOURCE__) == TIM_TRGO_OC2REF) || \

+                                        ((__SOURCE__) == TIM_TRGO_OC3REF) || \

+                                        ((__SOURCE__) == TIM_TRGO_OC4REF))

+

+#define IS_TIM_TRGO2_SOURCE(__SOURCE__) (((__SOURCE__) == TIM_TRGO2_RESET)                        || \

+                                         ((__SOURCE__) == TIM_TRGO2_ENABLE)                       || \

+                                         ((__SOURCE__) == TIM_TRGO2_UPDATE)                       || \

+                                         ((__SOURCE__) == TIM_TRGO2_OC1)                          || \

+                                         ((__SOURCE__) == TIM_TRGO2_OC1REF)                       || \

+                                         ((__SOURCE__) == TIM_TRGO2_OC2REF)                       || \

+                                         ((__SOURCE__) == TIM_TRGO2_OC3REF)                       || \

+                                         ((__SOURCE__) == TIM_TRGO2_OC3REF)                       || \

+                                         ((__SOURCE__) == TIM_TRGO2_OC4REF)                       || \

+                                         ((__SOURCE__) == TIM_TRGO2_OC5REF)                       || \

+                                         ((__SOURCE__) == TIM_TRGO2_OC6REF)                       || \

+                                         ((__SOURCE__) == TIM_TRGO2_OC4REF_RISINGFALLING)         || \

+                                         ((__SOURCE__) == TIM_TRGO2_OC6REF_RISINGFALLING)         || \

+                                         ((__SOURCE__) == TIM_TRGO2_OC4REF_RISING_OC6REF_RISING)  || \

+                                         ((__SOURCE__) == TIM_TRGO2_OC4REF_RISING_OC6REF_FALLING) || \

+                                         ((__SOURCE__) == TIM_TRGO2_OC5REF_RISING_OC6REF_RISING)  || \

+                                         ((__SOURCE__) == TIM_TRGO2_OC5REF_RISING_OC6REF_FALLING))

+

+#define IS_TIM_MSM_STATE(__STATE__)      (((__STATE__) == TIM_MASTERSLAVEMODE_ENABLE) || \

+                                          ((__STATE__) == TIM_MASTERSLAVEMODE_DISABLE))

+

+#define IS_TIM_SLAVE_MODE(__MODE__) (((__MODE__) == TIM_SLAVEMODE_DISABLE)   || \

+                                     ((__MODE__) == TIM_SLAVEMODE_RESET)     || \

+                                     ((__MODE__) == TIM_SLAVEMODE_GATED)     || \

+                                     ((__MODE__) == TIM_SLAVEMODE_TRIGGER)   || \

+                                     ((__MODE__) == TIM_SLAVEMODE_EXTERNAL1) || \

+                                     ((__MODE__) == TIM_SLAVEMODE_COMBINED_RESETTRIGGER))

+

+#define IS_TIM_PWM_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_PWM1)               || \

+                                   ((__MODE__) == TIM_OCMODE_PWM2)               || \

+                                   ((__MODE__) == TIM_OCMODE_COMBINED_PWM1)      || \

+                                   ((__MODE__) == TIM_OCMODE_COMBINED_PWM2)      || \

+                                   ((__MODE__) == TIM_OCMODE_ASSYMETRIC_PWM1)    || \

+                                   ((__MODE__) == TIM_OCMODE_ASSYMETRIC_PWM2))

+

+#define IS_TIM_OC_MODE(__MODE__)  (((__MODE__) == TIM_OCMODE_TIMING)             || \

+                                   ((__MODE__) == TIM_OCMODE_ACTIVE)             || \

+                                   ((__MODE__) == TIM_OCMODE_INACTIVE)           || \

+                                   ((__MODE__) == TIM_OCMODE_TOGGLE)             || \

+                                   ((__MODE__) == TIM_OCMODE_FORCED_ACTIVE)      || \

+                                   ((__MODE__) == TIM_OCMODE_FORCED_INACTIVE)    || \

+                                   ((__MODE__) == TIM_OCMODE_RETRIGERRABLE_OPM1) || \

+                                   ((__MODE__) == TIM_OCMODE_RETRIGERRABLE_OPM2))

+

+#define IS_TIM_TRIGGER_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_TS_ITR0) || \

+                                                 ((__SELECTION__) == TIM_TS_ITR1) || \

+                                                 ((__SELECTION__) == TIM_TS_ITR2) || \

+                                                 ((__SELECTION__) == TIM_TS_ITR3) || \

+                                                 ((__SELECTION__) == TIM_TS_TI1F_ED) || \

+                                                 ((__SELECTION__) == TIM_TS_TI1FP1) || \

+                                                 ((__SELECTION__) == TIM_TS_TI2FP2) || \

+                                                 ((__SELECTION__) == TIM_TS_ETRF))

+

+#define IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_TS_ITR0) || \

+                                                               ((__SELECTION__) == TIM_TS_ITR1) || \

+                                                               ((__SELECTION__) == TIM_TS_ITR2) || \

+                                                               ((__SELECTION__) == TIM_TS_ITR3) || \

+                                                               ((__SELECTION__) == TIM_TS_NONE))

+

+#define IS_TIM_TRIGGERPOLARITY(__POLARITY__)   (((__POLARITY__) == TIM_TRIGGERPOLARITY_INVERTED   ) || \

+                                                ((__POLARITY__) == TIM_TRIGGERPOLARITY_NONINVERTED) || \

+                                                ((__POLARITY__) == TIM_TRIGGERPOLARITY_RISING     ) || \

+                                                ((__POLARITY__) == TIM_TRIGGERPOLARITY_FALLING    ) || \

+                                                ((__POLARITY__) == TIM_TRIGGERPOLARITY_BOTHEDGE   ))

+

+#define IS_TIM_TRIGGERPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV1) || \

+                                                ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV2) || \

+                                                ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV4) || \

+                                                ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV8))

+

+#define IS_TIM_TRIGGERFILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU)

+

+#define IS_TIM_TI1SELECTION(__TI1SELECTION__)  (((__TI1SELECTION__) == TIM_TI1SELECTION_CH1) || \

+                                                ((__TI1SELECTION__) == TIM_TI1SELECTION_XORCOMBINATION))

+

+#define IS_TIM_DMA_LENGTH(__LENGTH__)      (((__LENGTH__) == TIM_DMABURSTLENGTH_1TRANSFER) || \

+                                            ((__LENGTH__) == TIM_DMABURSTLENGTH_2TRANSFERS) || \

+                                            ((__LENGTH__) == TIM_DMABURSTLENGTH_3TRANSFERS) || \

+                                            ((__LENGTH__) == TIM_DMABURSTLENGTH_4TRANSFERS) || \

+                                            ((__LENGTH__) == TIM_DMABURSTLENGTH_5TRANSFERS) || \

+                                            ((__LENGTH__) == TIM_DMABURSTLENGTH_6TRANSFERS) || \

+                                            ((__LENGTH__) == TIM_DMABURSTLENGTH_7TRANSFERS) || \

+                                            ((__LENGTH__) == TIM_DMABURSTLENGTH_8TRANSFERS) || \

+                                            ((__LENGTH__) == TIM_DMABURSTLENGTH_9TRANSFERS) || \

+                                            ((__LENGTH__) == TIM_DMABURSTLENGTH_10TRANSFERS) || \

+                                            ((__LENGTH__) == TIM_DMABURSTLENGTH_11TRANSFERS) || \

+                                            ((__LENGTH__) == TIM_DMABURSTLENGTH_12TRANSFERS) || \

+                                            ((__LENGTH__) == TIM_DMABURSTLENGTH_13TRANSFERS) || \

+                                            ((__LENGTH__) == TIM_DMABURSTLENGTH_14TRANSFERS) || \

+                                            ((__LENGTH__) == TIM_DMABURSTLENGTH_15TRANSFERS) || \

+                                            ((__LENGTH__) == TIM_DMABURSTLENGTH_16TRANSFERS) || \

+                                            ((__LENGTH__) == TIM_DMABURSTLENGTH_17TRANSFERS) || \

+                                            ((__LENGTH__) == TIM_DMABURSTLENGTH_18TRANSFERS))

+

+#define IS_TIM_IC_FILTER(__ICFILTER__)   ((__ICFILTER__) <= 0xFU)

+

+#define IS_TIM_DEADTIME(__DEADTIME__)    ((__DEADTIME__) <= 0xFFU)

+

+#define IS_TIM_BREAK_SYSTEM(__CONFIG__)    (((__CONFIG__) == TIM_BREAK_SYSTEM_ECC)                  || \

+                                            ((__CONFIG__) == TIM_BREAK_SYSTEM_PVD)                  || \

+                                            ((__CONFIG__) == TIM_BREAK_SYSTEM_SRAM2_PARITY_ERROR)   || \

+                                            ((__CONFIG__) == TIM_BREAK_SYSTEM_LOCKUP))

+

+#define IS_TIM_SLAVEMODE_TRIGGER_ENABLED(__TRIGGER__) (((__TRIGGER__) == TIM_SLAVEMODE_TRIGGER) || \

+                                                       ((__TRIGGER__) == TIM_SLAVEMODE_COMBINED_RESETTRIGGER))

+

+#define TIM_SET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__, __ICPSC__) \

+  (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\

+   ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\

+   ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\

+   ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U)))

+

+#define TIM_RESET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__) \

+  (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_IC1PSC) :\

+   ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_IC2PSC) :\

+   ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_IC3PSC) :\

+   ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_IC4PSC))

+

+#define TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \

+  (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\

+   ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\

+   ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\

+   ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U))))

+

+#define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \

+  (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\

+   ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\

+   ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\

+   ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC4P | TIM_CCER_CC4NP)))

+

+/**

+  * @}

+  */

+/* End of private macros -----------------------------------------------------*/

+

+/* Include TIM HAL Extended module */

+#include "stm32l4xx_hal_tim_ex.h"

+

+/* Exported functions --------------------------------------------------------*/

+/** @addtogroup TIM_Exported_Functions TIM Exported Functions

+  * @{

+  */

+

+/** @addtogroup TIM_Exported_Functions_Group1 TIM Time Base functions

+  *  @brief   Time Base functions

+  * @{

+  */

+/* Time Base functions ********************************************************/

+HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim);

+HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim);

+void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim);

+void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim);

+/* Blocking mode: Polling */

+HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim);

+HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim);

+/* Non-Blocking mode: Interrupt */

+HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);

+HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim);

+/* Non-Blocking mode: DMA */

+HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length);

+HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim);

+/**

+  * @}

+  */

+

+/** @addtogroup TIM_Exported_Functions_Group2 TIM Output Compare functions

+  *  @brief   TIM Output Compare functions

+  * @{

+  */

+/* Timer Output Compare functions *********************************************/

+HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim);

+HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim);

+void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim);

+void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim);

+/* Blocking mode: Polling */

+HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel);

+HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);

+/* Non-Blocking mode: Interrupt */

+HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);

+HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);

+/* Non-Blocking mode: DMA */

+HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length);

+HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel);

+/**

+  * @}

+  */

+

+/** @addtogroup TIM_Exported_Functions_Group3 TIM PWM functions

+  *  @brief   TIM PWM functions

+  * @{

+  */

+/* Timer PWM functions ********************************************************/

+HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim);

+HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim);

+void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim);

+void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim);

+/* Blocking mode: Polling */

+HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);

+HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);

+/* Non-Blocking mode: Interrupt */

+HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);

+HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);

+/* Non-Blocking mode: DMA */

+HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length);

+HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel);

+/**

+  * @}

+  */

+

+/** @addtogroup TIM_Exported_Functions_Group4 TIM Input Capture functions

+  *  @brief   TIM Input Capture functions

+  * @{

+  */

+/* Timer Input Capture functions **********************************************/

+HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim);

+HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim);

+void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim);

+void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim);

+/* Blocking mode: Polling */

+HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel);

+HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);

+/* Non-Blocking mode: Interrupt */

+HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);

+HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);

+/* Non-Blocking mode: DMA */

+HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length);

+HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel);

+/**

+  * @}

+  */

+

+/** @addtogroup TIM_Exported_Functions_Group5 TIM One Pulse functions

+  *  @brief   TIM One Pulse functions

+  * @{

+  */

+/* Timer One Pulse functions **************************************************/

+HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode);

+HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim);

+void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim);

+void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim);

+/* Blocking mode: Polling */

+HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel);

+HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel);

+/* Non-Blocking mode: Interrupt */

+HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel);

+HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel);

+/**

+  * @}

+  */

+

+/** @addtogroup TIM_Exported_Functions_Group6 TIM Encoder functions

+  *  @brief   TIM Encoder functions

+  * @{

+  */

+/* Timer Encoder functions ****************************************************/

+HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim,  TIM_Encoder_InitTypeDef *sConfig);

+HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim);

+void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim);

+void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim);

+/* Blocking mode: Polling */

+HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel);

+HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);

+/* Non-Blocking mode: Interrupt */

+HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);

+HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);

+/* Non-Blocking mode: DMA */

+HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1,

+                                            uint32_t *pData2, uint16_t Length);

+HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel);

+/**

+  * @}

+  */

+

+/** @addtogroup TIM_Exported_Functions_Group7 TIM IRQ handler management

+  *  @brief   IRQ handler management

+  * @{

+  */

+/* Interrupt Handler functions  ***********************************************/

+void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim);

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions

+  *  @brief   Peripheral Control functions

+  * @{

+  */

+/* Control functions  *********************************************************/

+HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel);

+HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel);

+HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel);

+HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig,

+                                                 uint32_t OutputChannel,  uint32_t InputChannel);

+HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig,

+                                           uint32_t Channel);

+HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef *sClockSourceConfig);

+HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection);

+HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig);

+HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig);

+HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress,

+                                              uint32_t BurstRequestSrc, uint32_t  *BurstBuffer, uint32_t  BurstLength);

+HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc);

+HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress,

+                                             uint32_t BurstRequestSrc, uint32_t  *BurstBuffer, uint32_t  BurstLength);

+HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc);

+HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource);

+uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel);

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions

+  *  @brief   TIM Callbacks functions

+  * @{

+  */

+/* Callback in non blocking modes (Interrupt and DMA) *************************/

+void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);

+void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim);

+void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim);

+void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);

+void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim);

+void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim);

+void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim);

+void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim);

+void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim);

+void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim);

+

+/* Callbacks Register/UnRegister functions  ***********************************/

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID,

+                                           pTIM_CallbackTypeDef pCallback);

+HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions

+  *  @brief  Peripheral State functions

+  * @{

+  */

+/* Peripheral State functions  ************************************************/

+HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(TIM_HandleTypeDef *htim);

+HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(TIM_HandleTypeDef *htim);

+HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(TIM_HandleTypeDef *htim);

+HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(TIM_HandleTypeDef *htim);

+HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(TIM_HandleTypeDef *htim);

+HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim);

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+/* End of exported functions -------------------------------------------------*/

+

+/* Private functions----------------------------------------------------------*/

+/** @defgroup TIM_Private_Functions TIM Private Functions

+  * @{

+  */

+void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure);

+void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t TIM_ICFilter);

+void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config);

+void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler,

+                       uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter);

+

+void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma);

+void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma);

+void TIM_DMAError(DMA_HandleTypeDef *hdma);

+void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma);

+void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma);

+void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState);

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+void TIM_ResetCallback(TIM_HandleTypeDef *htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+

+/**

+  * @}

+  */

+/* End of private functions --------------------------------------------------*/

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* STM32L4xx_HAL_TIM_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h
new file mode 100644
index 0000000..52d7a46
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h
@@ -0,0 +1,440 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_tim_ex.h

+  * @author  MCD Application Team

+  * @brief   Header file of TIM HAL Extended module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef STM32L4xx_HAL_TIM_EX_H

+#define STM32L4xx_HAL_TIM_EX_H

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup TIMEx

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+/** @defgroup TIMEx_Exported_Types TIM Extended Exported Types

+  * @{

+  */

+

+/**

+  * @brief  TIM Hall sensor Configuration Structure definition

+  */

+

+typedef struct

+{

+  uint32_t IC1Polarity;         /*!< Specifies the active edge of the input signal.

+                                     This parameter can be a value of @ref TIM_Input_Capture_Polarity */

+

+  uint32_t IC1Prescaler;        /*!< Specifies the Input Capture Prescaler.

+                                     This parameter can be a value of @ref TIM_Input_Capture_Prescaler */

+

+  uint32_t IC1Filter;           /*!< Specifies the input capture filter.

+                                     This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */

+

+  uint32_t Commutation_Delay;   /*!< Specifies the pulse value to be loaded into the Capture Compare Register.

+                                     This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */

+} TIM_HallSensor_InitTypeDef;

+

+/**

+  * @brief  TIM Break/Break2 input configuration

+  */

+typedef struct

+{

+  uint32_t Source;         /*!< Specifies the source of the timer break input.

+                                This parameter can be a value of @ref TIMEx_Break_Input_Source */

+  uint32_t Enable;         /*!< Specifies whether or not the break input source is enabled.

+                                This parameter can be a value of @ref TIMEx_Break_Input_Source_Enable */

+  uint32_t Polarity;       /*!< Specifies the break input source polarity.

+                                This parameter can be a value of @ref TIMEx_Break_Input_Source_Polarity

+                                Not relevant when analog watchdog output of the DFSDM1 used as break input source */

+}

+TIMEx_BreakInputConfigTypeDef;

+

+/**

+  * @}

+  */

+/* End of exported types -----------------------------------------------------*/

+

+/* Exported constants --------------------------------------------------------*/

+/** @defgroup TIMEx_Exported_Constants TIM Extended Exported Constants

+  * @{

+  */

+

+/** @defgroup TIMEx_Remap TIM Extended Remapping

+  * @{

+  */

+#define TIM_TIM1_ETR_ADC1_NONE      0x00000000U                                           /* !< TIM1_ETR is not connected to any AWD (analog watchdog)*/

+#define TIM_TIM1_ETR_ADC1_AWD1      TIM1_OR1_ETR_ADC1_RMP_0                               /* !< TIM1_ETR is connected to ADC1 AWD1 */

+#define TIM_TIM1_ETR_ADC1_AWD2      TIM1_OR1_ETR_ADC1_RMP_1                               /* !< TIM1_ETR is connected to ADC1 AWD2 */

+#define TIM_TIM1_ETR_ADC1_AWD3      (TIM1_OR1_ETR_ADC1_RMP_1 | TIM1_OR1_ETR_ADC1_RMP_0)   /* !< TIM1_ETR is connected to ADC1 AWD3 */

+#if defined (ADC3)

+#define TIM_TIM1_ETR_ADC3_NONE      0x00000000U                                           /* !< TIM1_ETR is not connected to any AWD (analog watchdog)*/

+#define TIM_TIM1_ETR_ADC3_AWD1      TIM1_OR1_ETR_ADC3_RMP_0                               /* !< TIM1_ETR is connected to ADC3 AWD1 */

+#define TIM_TIM1_ETR_ADC3_AWD2      TIM1_OR1_ETR_ADC3_RMP_1                               /* !< TIM1_ETR is connected to ADC3 AWD2 */

+#define TIM_TIM1_ETR_ADC3_AWD3      (TIM1_OR1_ETR_ADC3_RMP_1 | TIM1_OR1_ETR_ADC3_RMP_0)   /* !< TIM1_ETR is connected to ADC3 AWD3 */

+#endif /* ADC3 */

+#define TIM_TIM1_TI1_GPIO           0x00000000U                                           /* !< TIM1 TI1 is connected to GPIO */

+#define TIM_TIM1_TI1_COMP1          TIM1_OR1_TI1_RMP                                      /* !< TIM1 TI1 is connected to COMP1 */

+#define TIM_TIM1_ETR_GPIO           0x00000000U                                           /* !< TIM1_ETR is connected to GPIO */

+#define TIM_TIM1_ETR_COMP1          TIM1_OR2_ETRSEL_0                                     /* !< TIM1_ETR is connected to COMP1 output */

+#if defined(COMP2)

+#define TIM_TIM1_ETR_COMP2          TIM1_OR2_ETRSEL_1                                     /* !< TIM1_ETR is connected to COMP2 output */

+#endif /* COMP2 */

+

+#if defined (USB_OTG_FS)

+#define TIM_TIM2_ITR1_TIM8_TRGO     0x00000000U                                           /* !< TIM2_ITR1 is connected to TIM8_TRGO */

+#define TIM_TIM2_ITR1_OTG_FS_SOF    TIM2_OR1_ITR1_RMP                                     /* !< TIM2_ITR1 is connected to OTG_FS SOF */

+#else

+#if defined(STM32L471xx)

+#define TIM_TIM2_ITR1_TIM8_TRGO     0x00000000U                                           /* !< TIM2_ITR1 is connected to TIM8_TRGO */

+#define TIM_TIM2_ITR1_NONE          TIM2_OR1_ITR1_RMP                                     /* !< No internal trigger on TIM2_ITR1 */

+#else

+#define TIM_TIM2_ITR1_NONE          0x00000000U                                           /* !< No internal trigger on TIM2_ITR1 */

+#define TIM_TIM2_ITR1_USB_SOF       TIM2_OR1_ITR1_RMP                                     /* !< TIM2_ITR1 is connected to USB SOF */

+#endif /* STM32L471xx */

+#endif /* USB_OTG_FS */

+#define TIM_TIM2_ETR_GPIO           0x00000000U                                           /* !< TIM2_ETR is connected to GPIO */

+#define TIM_TIM2_ETR_LSE            TIM2_OR1_ETR1_RMP                                     /* !< TIM2_ETR is connected to LSE */

+#define TIM_TIM2_ETR_COMP1          TIM2_OR2_ETRSEL_0                                     /* !< TIM2_ETR is connected to COMP1 output */

+#if defined(COMP2)

+#define TIM_TIM2_ETR_COMP2          TIM2_OR2_ETRSEL_1                                     /* !< TIM2_ETR is connected to COMP2 output */

+#endif /* COMP2 */

+#define TIM_TIM2_TI4_GPIO           0x00000000U                                           /* !< TIM2 TI4 is connected to GPIO */

+#define TIM_TIM2_TI4_COMP1          TIM2_OR1_TI4_RMP_0                                    /* !< TIM2 TI4 is connected to COMP1 output */

+#if defined(COMP2)

+#define TIM_TIM2_TI4_COMP2          TIM2_OR1_TI4_RMP_1                                    /* !< TIM2 TI4 is connected to COMP2 output */

+#define TIM_TIM2_TI4_COMP1_COMP2    (TIM2_OR1_TI4_RMP_1| TIM2_OR1_TI4_RMP_0)              /* !< TIM2 TI4 is connected to logical OR between COMP1 and COMP2 output2 */

+#endif /* COMP2 */

+

+#if defined (TIM3)

+#define TIM_TIM3_TI1_GPIO           0x00000000U                                           /* !< TIM3 TI1 is connected to GPIO */

+#define TIM_TIM3_TI1_COMP1          TIM3_OR1_TI1_RMP_0                                    /* !< TIM3 TI1 is connected to COMP1 output */

+#define TIM_TIM3_TI1_COMP2          TIM3_OR1_TI1_RMP_1                                    /* !< TIM3 TI1 is connected to COMP2 output */

+#define TIM_TIM3_TI1_COMP1_COMP2    (TIM3_OR1_TI1_RMP_1 | TIM3_OR1_TI1_RMP_0)             /* !< TIM3 TI1 is connected to logical OR between COMP1 and COMP2 output2 */

+#define TIM_TIM3_ETR_GPIO           0x00000000U                                           /* !< TIM3_ETR is connected to GPIO */

+#define TIM_TIM3_ETR_COMP1          TIM3_OR2_ETRSEL_0                                     /* !< TIM3_ETR is connected to COMP1 output */

+#endif /* TIM3 */

+

+#if defined (TIM8)

+#if defined(ADC2) && defined(ADC3)

+#define TIM_TIM8_ETR_ADC2_NONE      0x00000000U                                           /* !< TIM8_ETR is not connected to any AWD (analog watchdog)*/

+#define TIM_TIM8_ETR_ADC2_AWD1      TIM8_OR1_ETR_ADC2_RMP_0                               /* !< TIM8_ETR is connected to ADC2 AWD1 */

+#define TIM_TIM8_ETR_ADC2_AWD2      TIM8_OR1_ETR_ADC2_RMP_1                               /* !< TIM8_ETR is connected to ADC2 AWD2 */

+#define TIM_TIM8_ETR_ADC2_AWD3      (TIM8_OR1_ETR_ADC2_RMP_1 | TIM8_OR1_ETR_ADC2_RMP_0)   /* !< TIM8_ETR is connected to ADC2 AWD3 */

+#define TIM_TIM8_ETR_ADC3_NONE      0x00000000U                                           /* !< TIM8_ETR is not connected to any AWD (analog watchdog)*/

+#define TIM_TIM8_ETR_ADC3_AWD1      TIM8_OR1_ETR_ADC3_RMP_0                               /* !< TIM8_ETR is connected to ADC3 AWD1 */

+#define TIM_TIM8_ETR_ADC3_AWD2      TIM8_OR1_ETR_ADC3_RMP_1                               /* !< TIM8_ETR is connected to ADC3 AWD2 */

+#define TIM_TIM8_ETR_ADC3_AWD3      (TIM8_OR1_ETR_ADC3_RMP_1 | TIM8_OR1_ETR_ADC3_RMP_0)   /* !< TIM8_ETR is connected to ADC3 AWD3 */

+#endif /* ADC2 && ADC3 */

+

+#define TIM_TIM8_TI1_GPIO           0x00000000U                                           /* !< TIM8 TI1 is connected to GPIO */

+#define TIM_TIM8_TI1_COMP2          TIM8_OR1_TI1_RMP                                      /* !< TIM8 TI1 is connected to COMP1 */

+#define TIM_TIM8_ETR_GPIO           0x00000000U                                           /* !< TIM8_ETR is connected to GPIO */

+#define TIM_TIM8_ETR_COMP1          TIM8_OR2_ETRSEL_0                                     /* !< TIM8_ETR is connected to COMP1 output */

+#define TIM_TIM8_ETR_COMP2          TIM8_OR2_ETRSEL_1                                     /* !< TIM8_ETR is connected to COMP2 output */

+#endif /* TIM8 */

+

+#define TIM_TIM15_TI1_GPIO          0x00000000U                                           /* !< TIM15 TI1 is connected to GPIO */

+#define TIM_TIM15_TI1_LSE           TIM15_OR1_TI1_RMP                                     /* !< TIM15 TI1 is connected to LSE */

+#define TIM_TIM15_ENCODERMODE_NONE  0x00000000U                                           /* !< No redirection */

+#define TIM_TIM15_ENCODERMODE_TIM2  TIM15_OR1_ENCODER_MODE_0                              /* !< TIM2 IC1 and TIM2 IC2 are connected to TIM15 IC1 and TIM15 IC2 respectively */

+#if defined (TIM3)

+#define TIM_TIM15_ENCODERMODE_TIM3  TIM15_OR1_ENCODER_MODE_1                              /* !< TIM3 IC1 and TIM3 IC2 are connected to TIM15 IC1 and TIM15 IC2 respectively */

+#endif /* TIM3 */

+#if defined (TIM4)

+#define TIM_TIM15_ENCODERMODE_TIM4  (TIM15_OR1_ENCODER_MODE_1 | TIM15_OR1_ENCODER_MODE_0) /* !< TIM4 IC1 and TIM4 IC2 are connected to TIM15 IC1 and TIM15 IC2 respectively */

+#endif /* TIM4 */

+

+#define TIM_TIM16_TI1_GPIO          0x00000000U                                           /* !< TIM16 TI1 is connected to GPIO */

+#define TIM_TIM16_TI1_LSI           TIM16_OR1_TI1_RMP_0                                   /* !< TIM16 TI1 is connected to LSI */

+#define TIM_TIM16_TI1_LSE           TIM16_OR1_TI1_RMP_1                                   /* !< TIM16 TI1 is connected to LSE */

+#define TIM_TIM16_TI1_RTC           (TIM16_OR1_TI1_RMP_1 | TIM16_OR1_TI1_RMP_0)           /* !< TIM16 TI1 is connected to RTC wakeup interrupt */

+#if defined (TIM16_OR1_TI1_RMP_2)

+#define TIM_TIM16_TI1_MSI           TIM16_OR1_TI1_RMP_2                                   /* !< TIM16 TI1 is connected to MSI */

+#define TIM_TIM16_TI1_HSE_32        (TIM16_OR1_TI1_RMP_2 | TIM16_OR1_TI1_RMP_0)           /* !< TIM16 TI1 is connected to HSE div 32 */

+#define TIM_TIM16_TI1_MCO           (TIM16_OR1_TI1_RMP_2 | TIM16_OR1_TI1_RMP_1)           /* !< TIM16 TI1 is connected to MCO */

+#endif /* TIM16_OR1_TI1_RMP_2 */

+

+#if defined (TIM17)

+#define TIM_TIM17_TI1_GPIO          0x00000000U                                           /* !< TIM17 TI1 is connected to GPIO */

+#define TIM_TIM17_TI1_MSI           TIM17_OR1_TI1_RMP_0                                   /* !< TIM17 TI1 is connected to MSI */

+#define TIM_TIM17_TI1_HSE_32        TIM17_OR1_TI1_RMP_1                                   /* !< TIM17 TI1 is connected to HSE div 32 */

+#define TIM_TIM17_TI1_MCO           (TIM17_OR1_TI1_RMP_1 | TIM17_OR1_TI1_RMP_0)           /* !< TIM17 TI1 is connected to MCO */

+#endif /* TIM17 */

+/**

+  * @}

+  */

+

+/** @defgroup TIMEx_Break_Input TIM Extended Break input

+  * @{

+  */

+#define TIM_BREAKINPUT_BRK     0x00000001U                                      /* !< Timer break input  */

+#define TIM_BREAKINPUT_BRK2    0x00000002U                                      /* !< Timer break2 input */

+/**

+  * @}

+  */

+

+/** @defgroup TIMEx_Break_Input_Source TIM Extended Break input source

+  * @{

+  */

+#define TIM_BREAKINPUTSOURCE_BKIN     0x00000001U                               /* !< An external source (GPIO) is connected to the BKIN pin  */

+#define TIM_BREAKINPUTSOURCE_COMP1    0x00000002U                               /* !< The COMP1 output is connected to the break input */

+#define TIM_BREAKINPUTSOURCE_COMP2    0x00000004U                               /* !< The COMP2 output is connected to the break input */

+#if defined (DFSDM1_Channel0)

+#define TIM_BREAKINPUTSOURCE_DFSDM1   0x00000008U                               /* !< The analog watchdog output of the DFSDM1 peripheral is connected to the break input */

+#endif /* DFSDM1_Channel0 */

+/**

+  * @}

+  */

+

+/** @defgroup TIMEx_Break_Input_Source_Enable TIM Extended Break input source enabling

+  * @{

+  */

+#define TIM_BREAKINPUTSOURCE_DISABLE     0x00000000U                            /* !< Break input source is disabled */

+#define TIM_BREAKINPUTSOURCE_ENABLE      0x00000001U                            /* !< Break input source is enabled */

+/**

+  * @}

+  */

+

+/** @defgroup TIMEx_Break_Input_Source_Polarity TIM Extended Break input polarity

+  * @{

+  */

+#define TIM_BREAKINPUTSOURCE_POLARITY_LOW     0x00000001U                       /* !< Break input source is active low */

+#define TIM_BREAKINPUTSOURCE_POLARITY_HIGH    0x00000000U                       /* !< Break input source is active_high */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+/* End of exported constants -------------------------------------------------*/

+

+/* Exported macro ------------------------------------------------------------*/

+/** @defgroup TIMEx_Exported_Macros TIM Extended Exported Macros

+  * @{

+  */

+

+/**

+  * @}

+  */

+/* End of exported macro -----------------------------------------------------*/

+

+/* Private macro -------------------------------------------------------------*/

+/** @defgroup TIMEx_Private_Macros TIM Extended Private Macros

+  * @{

+  */

+#define IS_TIM_REMAP(__REMAP__)    (((__REMAP__) <= (uint32_t)0x0001C01F))

+

+#define IS_TIM_BREAKINPUT(__BREAKINPUT__)  (((__BREAKINPUT__) == TIM_BREAKINPUT_BRK)  || \

+                                            ((__BREAKINPUT__) == TIM_BREAKINPUT_BRK2))

+

+#if defined (DFSDM1_Channel0)

+#define IS_TIM_BREAKINPUTSOURCE(__SOURCE__)  (((__SOURCE__) == TIM_BREAKINPUTSOURCE_BKIN)  || \

+                                              ((__SOURCE__) == TIM_BREAKINPUTSOURCE_COMP1) || \

+                                              ((__SOURCE__) == TIM_BREAKINPUTSOURCE_COMP2) || \

+                                              ((__SOURCE__) == TIM_BREAKINPUTSOURCE_DFSDM1))

+#else

+#define IS_TIM_BREAKINPUTSOURCE(__SOURCE__)  (((__SOURCE__) == TIM_BREAKINPUTSOURCE_BKIN)  || \

+                                              ((__SOURCE__) == TIM_BREAKINPUTSOURCE_COMP1) || \

+                                              ((__SOURCE__) == TIM_BREAKINPUTSOURCE_COMP2))

+#endif /* DFSDM1_Channel0 */

+

+#define IS_TIM_BREAKINPUTSOURCE_STATE(__STATE__)  (((__STATE__) == TIM_BREAKINPUTSOURCE_DISABLE)  || \

+                                                   ((__STATE__) == TIM_BREAKINPUTSOURCE_ENABLE))

+

+#define IS_TIM_BREAKINPUTSOURCE_POLARITY(__POLARITY__)  (((__POLARITY__) == TIM_BREAKINPUTSOURCE_POLARITY_LOW)  || \

+                                                         ((__POLARITY__) == TIM_BREAKINPUTSOURCE_POLARITY_HIGH))

+

+/**

+  * @}

+  */

+/* End of private macro ------------------------------------------------------*/

+

+/* Exported functions --------------------------------------------------------*/

+/** @addtogroup TIMEx_Exported_Functions TIM Extended Exported Functions

+  * @{

+  */

+

+/** @addtogroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions

+  *  @brief    Timer Hall Sensor functions

+  * @{

+  */

+/*  Timer Hall Sensor functions  **********************************************/

+HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig);

+HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim);

+

+void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim);

+void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim);

+

+/* Blocking mode: Polling */

+HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim);

+HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim);

+/* Non-Blocking mode: Interrupt */

+HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim);

+HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim);

+/* Non-Blocking mode: DMA */

+HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length);

+HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim);

+/**

+  * @}

+  */

+

+/** @addtogroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions

+  *  @brief   Timer Complementary Output Compare functions

+  * @{

+  */

+/*  Timer Complementary Output Compare functions  *****************************/

+/* Blocking mode: Polling */

+HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel);

+HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);

+

+/* Non-Blocking mode: Interrupt */

+HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);

+HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);

+

+/* Non-Blocking mode: DMA */

+HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length);

+HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel);

+/**

+  * @}

+  */

+

+/** @addtogroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions

+  *  @brief    Timer Complementary PWM functions

+  * @{

+  */

+/*  Timer Complementary PWM functions  ****************************************/

+/* Blocking mode: Polling */

+HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel);

+HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel);

+

+/* Non-Blocking mode: Interrupt */

+HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);

+HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel);

+/* Non-Blocking mode: DMA */

+HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length);

+HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel);

+/**

+  * @}

+  */

+

+/** @addtogroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions

+  *  @brief    Timer Complementary One Pulse functions

+  * @{

+  */

+/*  Timer Complementary One Pulse functions  **********************************/

+/* Blocking mode: Polling */

+HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel);

+HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel);

+

+/* Non-Blocking mode: Interrupt */

+HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel);

+HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel);

+/**

+  * @}

+  */

+

+/** @addtogroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions

+  *  @brief    Peripheral Control functions

+  * @{

+  */

+/* Extended Control functions  ************************************************/

+HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t  InputTrigger,

+                                              uint32_t  CommutationSource);

+HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t  InputTrigger,

+                                                 uint32_t  CommutationSource);

+HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t  InputTrigger,

+                                                  uint32_t  CommutationSource);

+HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim,

+                                                        TIM_MasterConfigTypeDef *sMasterConfig);

+HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim,

+                                                TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig);

+HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, uint32_t BreakInput,

+                                             TIMEx_BreakInputConfigTypeDef *sBreakInputConfig);

+HAL_StatusTypeDef HAL_TIMEx_GroupChannel5(TIM_HandleTypeDef *htim, uint32_t Channels);

+HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap);

+/**

+  * @}

+  */

+

+/** @addtogroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions

+  * @brief    Extended Callbacks functions

+  * @{

+  */

+/* Extended Callback **********************************************************/

+void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim);

+void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim);

+void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim);

+void HAL_TIMEx_Break2Callback(TIM_HandleTypeDef *htim);

+/**

+  * @}

+  */

+

+/** @addtogroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions

+  * @brief    Extended Peripheral State functions

+  * @{

+  */

+/* Extended Peripheral State functions  ***************************************/

+HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim);

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+/* End of exported functions -------------------------------------------------*/

+

+/* Private functions----------------------------------------------------------*/

+/** @addtogroup TIMEx_Private_Functions TIMEx Private Functions

+  * @{

+  */

+void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma);

+void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma);

+/**

+  * @}

+  */

+/* End of private functions --------------------------------------------------*/

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+

+#endif /* STM32L4xx_HAL_TIM_EX_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h
new file mode 100644
index 0000000..723130c
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h
@@ -0,0 +1,1686 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_uart.h

+  * @author  MCD Application Team

+  * @brief   Header file of UART HAL module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef STM32L4xx_HAL_UART_H

+#define STM32L4xx_HAL_UART_H

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup UART

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+/** @defgroup UART_Exported_Types UART Exported Types

+  * @{

+  */

+

+/**

+  * @brief UART Init Structure definition

+  */

+typedef struct

+{

+  uint32_t BaudRate;                  /*!< This member configures the UART communication baud rate.

+                                           The baud rate register is computed using the following formula:

+                                           LPUART:

+                                           =======

+                                              Baud Rate Register = ((256 * lpuart_ker_ckpres) / ((huart->Init.BaudRate)))

+                                           where lpuart_ker_ck_pres is the UART input clock (divided by a prescaler if applicable)

+                                           UART:

+                                           =====

+                                           - If oversampling is 16 or in LIN mode,

+                                              Baud Rate Register = ((uart_ker_ckpres) / ((huart->Init.BaudRate)))

+                                           - If oversampling is 8,

+                                              Baud Rate Register[15:4] = ((2 * uart_ker_ckpres) / ((huart->Init.BaudRate)))[15:4]

+                                              Baud Rate Register[3] =  0

+                                              Baud Rate Register[2:0] =  (((2 * uart_ker_ckpres) / ((huart->Init.BaudRate)))[3:0]) >> 1

+                                           where uart_ker_ck_pres is the UART input clock (divided by a prescaler if applicable) */

+

+  uint32_t WordLength;                /*!< Specifies the number of data bits transmitted or received in a frame.

+                                           This parameter can be a value of @ref UARTEx_Word_Length. */

+

+  uint32_t StopBits;                  /*!< Specifies the number of stop bits transmitted.

+                                           This parameter can be a value of @ref UART_Stop_Bits. */

+

+  uint32_t Parity;                    /*!< Specifies the parity mode.

+                                           This parameter can be a value of @ref UART_Parity

+                                           @note When parity is enabled, the computed parity is inserted

+                                                 at the MSB position of the transmitted data (9th bit when

+                                                 the word length is set to 9 data bits; 8th bit when the

+                                                 word length is set to 8 data bits). */

+

+  uint32_t Mode;                      /*!< Specifies whether the Receive or Transmit mode is enabled or disabled.

+                                           This parameter can be a value of @ref UART_Mode. */

+

+  uint32_t HwFlowCtl;                 /*!< Specifies whether the hardware flow control mode is enabled

+                                           or disabled.

+                                           This parameter can be a value of @ref UART_Hardware_Flow_Control. */

+

+  uint32_t OverSampling;              /*!< Specifies whether the Over sampling 8 is enabled or disabled, to achieve higher speed (up to f_PCLK/8).

+                                           This parameter can be a value of @ref UART_Over_Sampling. */

+

+  uint32_t OneBitSampling;            /*!< Specifies whether a single sample or three samples' majority vote is selected.

+                                           Selecting the single sample method increases the receiver tolerance to clock

+                                           deviations. This parameter can be a value of @ref UART_OneBit_Sampling. */

+

+#if defined(USART_PRESC_PRESCALER)

+  uint32_t ClockPrescaler;            /*!< Specifies the prescaler value used to divide the UART clock source.

+                                           This parameter can be a value of @ref UART_ClockPrescaler. */

+#endif /* USART_PRESC_PRESCALER */

+

+} UART_InitTypeDef;

+

+/**

+  * @brief  UART Advanced Features initialization structure definition

+  */

+typedef struct

+{

+  uint32_t AdvFeatureInit;        /*!< Specifies which advanced UART features is initialized. Several

+                                       Advanced Features may be initialized at the same time .

+                                       This parameter can be a value of @ref UART_Advanced_Features_Initialization_Type. */

+

+  uint32_t TxPinLevelInvert;      /*!< Specifies whether the TX pin active level is inverted.

+                                       This parameter can be a value of @ref UART_Tx_Inv. */

+

+  uint32_t RxPinLevelInvert;      /*!< Specifies whether the RX pin active level is inverted.

+                                       This parameter can be a value of @ref UART_Rx_Inv. */

+

+  uint32_t DataInvert;            /*!< Specifies whether data are inverted (positive/direct logic

+                                       vs negative/inverted logic).

+                                       This parameter can be a value of @ref UART_Data_Inv. */

+

+  uint32_t Swap;                  /*!< Specifies whether TX and RX pins are swapped.

+                                       This parameter can be a value of @ref UART_Rx_Tx_Swap. */

+

+  uint32_t OverrunDisable;        /*!< Specifies whether the reception overrun detection is disabled.

+                                       This parameter can be a value of @ref UART_Overrun_Disable. */

+

+  uint32_t DMADisableonRxError;   /*!< Specifies whether the DMA is disabled in case of reception error.

+                                       This parameter can be a value of @ref UART_DMA_Disable_on_Rx_Error. */

+

+  uint32_t AutoBaudRateEnable;    /*!< Specifies whether auto Baud rate detection is enabled.

+                                       This parameter can be a value of @ref UART_AutoBaudRate_Enable. */

+

+  uint32_t AutoBaudRateMode;      /*!< If auto Baud rate detection is enabled, specifies how the rate

+                                       detection is carried out.

+                                       This parameter can be a value of @ref UART_AutoBaud_Rate_Mode. */

+

+  uint32_t MSBFirst;              /*!< Specifies whether MSB is sent first on UART line.

+                                       This parameter can be a value of @ref UART_MSB_First. */

+} UART_AdvFeatureInitTypeDef;

+

+

+

+/**

+  * @brief HAL UART State definition

+  * @note  HAL UART State value is a combination of 2 different substates: gState and RxState (see @ref UART_State_Definition).

+  *        - gState contains UART state information related to global Handle management

+  *          and also information related to Tx operations.

+  *          gState value coding follow below described bitmap :

+  *          b7-b6  Error information

+  *             00 : No Error

+  *             01 : (Not Used)

+  *             10 : Timeout

+  *             11 : Error

+  *          b5     Peripheral initialization status

+  *             0  : Reset (Peripheral not initialized)

+  *             1  : Init done (Peripheral not initialized. HAL UART Init function already called)

+  *          b4-b3  (not used)

+  *             xx : Should be set to 00

+  *          b2     Intrinsic process state

+  *             0  : Ready

+  *             1  : Busy (Peripheral busy with some configuration or internal operations)

+  *          b1     (not used)

+  *             x  : Should be set to 0

+  *          b0     Tx state

+  *             0  : Ready (no Tx operation ongoing)

+  *             1  : Busy (Tx operation ongoing)

+  *        - RxState contains information related to Rx operations.

+  *          RxState value coding follow below described bitmap :

+  *          b7-b6  (not used)

+  *             xx : Should be set to 00

+  *          b5     Peripheral initialization status

+  *             0  : Reset (Peripheral not initialized)

+  *             1  : Init done (Peripheral not initialized)

+  *          b4-b2  (not used)

+  *            xxx : Should be set to 000

+  *          b1     Rx state

+  *             0  : Ready (no Rx operation ongoing)

+  *             1  : Busy (Rx operation ongoing)

+  *          b0     (not used)

+  *             x  : Should be set to 0.

+  */

+typedef uint32_t HAL_UART_StateTypeDef;

+

+/**

+  * @brief UART clock sources definition

+  */

+typedef enum

+{

+  UART_CLOCKSOURCE_PCLK1      = 0x00U,    /*!< PCLK1 clock source  */

+  UART_CLOCKSOURCE_PCLK2      = 0x01U,    /*!< PCLK2 clock source  */

+  UART_CLOCKSOURCE_HSI        = 0x02U,    /*!< HSI clock source    */

+  UART_CLOCKSOURCE_SYSCLK     = 0x04U,    /*!< SYSCLK clock source */

+  UART_CLOCKSOURCE_LSE        = 0x08U,    /*!< LSE clock source       */

+  UART_CLOCKSOURCE_UNDEFINED  = 0x10U     /*!< Undefined clock source */

+} UART_ClockSourceTypeDef;

+

+/**

+  * @brief  UART handle Structure definition

+  */

+typedef struct __UART_HandleTypeDef

+{

+  USART_TypeDef            *Instance;                /*!< UART registers base address        */

+

+  UART_InitTypeDef         Init;                     /*!< UART communication parameters      */

+

+  UART_AdvFeatureInitTypeDef AdvancedInit;           /*!< UART Advanced Features initialization parameters */

+

+  uint8_t                  *pTxBuffPtr;              /*!< Pointer to UART Tx transfer Buffer */

+

+  uint16_t                 TxXferSize;               /*!< UART Tx Transfer size              */

+

+  __IO uint16_t            TxXferCount;              /*!< UART Tx Transfer Counter           */

+

+  uint8_t                  *pRxBuffPtr;              /*!< Pointer to UART Rx transfer Buffer */

+

+  uint16_t                 RxXferSize;               /*!< UART Rx Transfer size              */

+

+  __IO uint16_t            RxXferCount;              /*!< UART Rx Transfer Counter           */

+

+  uint16_t                 Mask;                     /*!< UART Rx RDR register mask          */

+

+#if defined(USART_CR1_FIFOEN)

+  uint32_t                 FifoMode;                 /*!< Specifies if the FIFO mode is being used.

+                                                          This parameter can be a value of @ref UARTEx_FIFO_mode. */

+

+  uint16_t                 NbRxDataToProcess;        /*!< Number of data to process during RX ISR execution */

+

+  uint16_t                 NbTxDataToProcess;        /*!< Number of data to process during TX ISR execution */

+#endif /*USART_CR1_FIFOEN */

+

+  void (*RxISR)(struct __UART_HandleTypeDef *huart); /*!< Function pointer on Rx IRQ handler   */

+

+  void (*TxISR)(struct __UART_HandleTypeDef *huart); /*!< Function pointer on Tx IRQ handler   */

+

+  DMA_HandleTypeDef        *hdmatx;                  /*!< UART Tx DMA Handle parameters      */

+

+  DMA_HandleTypeDef        *hdmarx;                  /*!< UART Rx DMA Handle parameters      */

+

+  HAL_LockTypeDef           Lock;                    /*!< Locking object                     */

+

+  __IO HAL_UART_StateTypeDef    gState;              /*!< UART state information related to global Handle management

+                                                          and also related to Tx operations.

+                                                          This parameter can be a value of @ref HAL_UART_StateTypeDef */

+

+  __IO HAL_UART_StateTypeDef    RxState;             /*!< UART state information related to Rx operations.

+                                                          This parameter can be a value of @ref HAL_UART_StateTypeDef */

+

+  __IO uint32_t                 ErrorCode;           /*!< UART Error code                    */

+

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+  void (* TxHalfCpltCallback)(struct __UART_HandleTypeDef *huart);        /*!< UART Tx Half Complete Callback        */

+  void (* TxCpltCallback)(struct __UART_HandleTypeDef *huart);            /*!< UART Tx Complete Callback             */

+  void (* RxHalfCpltCallback)(struct __UART_HandleTypeDef *huart);        /*!< UART Rx Half Complete Callback        */

+  void (* RxCpltCallback)(struct __UART_HandleTypeDef *huart);            /*!< UART Rx Complete Callback             */

+  void (* ErrorCallback)(struct __UART_HandleTypeDef *huart);             /*!< UART Error Callback                   */

+  void (* AbortCpltCallback)(struct __UART_HandleTypeDef *huart);         /*!< UART Abort Complete Callback          */

+  void (* AbortTransmitCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Abort Transmit Complete Callback */

+  void (* AbortReceiveCpltCallback)(struct __UART_HandleTypeDef *huart);  /*!< UART Abort Receive Complete Callback  */

+  void (* WakeupCallback)(struct __UART_HandleTypeDef *huart);            /*!< UART Wakeup Callback                  */

+#if defined(USART_CR1_FIFOEN)

+  void (* RxFifoFullCallback)(struct __UART_HandleTypeDef *huart);        /*!< UART Rx Fifo Full Callback            */

+  void (* TxFifoEmptyCallback)(struct __UART_HandleTypeDef *huart);       /*!< UART Tx Fifo Empty Callback           */

+#endif /* USART_CR1_FIFOEN */

+

+  void (* MspInitCallback)(struct __UART_HandleTypeDef *huart);           /*!< UART Msp Init callback                */

+  void (* MspDeInitCallback)(struct __UART_HandleTypeDef *huart);         /*!< UART Msp DeInit callback              */

+#endif  /* USE_HAL_UART_REGISTER_CALLBACKS */

+

+} UART_HandleTypeDef;

+

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+/**

+  * @brief  HAL UART Callback ID enumeration definition

+  */

+typedef enum

+{

+  HAL_UART_TX_HALFCOMPLETE_CB_ID         = 0x00U,    /*!< UART Tx Half Complete Callback ID        */

+  HAL_UART_TX_COMPLETE_CB_ID             = 0x01U,    /*!< UART Tx Complete Callback ID             */

+  HAL_UART_RX_HALFCOMPLETE_CB_ID         = 0x02U,    /*!< UART Rx Half Complete Callback ID        */

+  HAL_UART_RX_COMPLETE_CB_ID             = 0x03U,    /*!< UART Rx Complete Callback ID             */

+  HAL_UART_ERROR_CB_ID                   = 0x04U,    /*!< UART Error Callback ID                   */

+  HAL_UART_ABORT_COMPLETE_CB_ID          = 0x05U,    /*!< UART Abort Complete Callback ID          */

+  HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID = 0x06U,    /*!< UART Abort Transmit Complete Callback ID */

+  HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID  = 0x07U,    /*!< UART Abort Receive Complete Callback ID  */

+  HAL_UART_WAKEUP_CB_ID                  = 0x08U,    /*!< UART Wakeup Callback ID                  */

+#if defined(USART_CR1_FIFOEN)

+  HAL_UART_RX_FIFO_FULL_CB_ID            = 0x09U,    /*!< UART Rx Fifo Full Callback ID            */

+  HAL_UART_TX_FIFO_EMPTY_CB_ID           = 0x0AU,    /*!< UART Tx Fifo Empty Callback ID           */

+#endif /* USART_CR1_FIFOEN */

+

+  HAL_UART_MSPINIT_CB_ID                 = 0x0BU,    /*!< UART MspInit callback ID                 */

+  HAL_UART_MSPDEINIT_CB_ID               = 0x0CU     /*!< UART MspDeInit callback ID               */

+

+} HAL_UART_CallbackIDTypeDef;

+

+/**

+  * @brief  HAL UART Callback pointer definition

+  */

+typedef  void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart);  /*!< pointer to an UART callback function */

+

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+

+/**

+  * @}

+  */

+

+/* Exported constants --------------------------------------------------------*/

+/** @defgroup UART_Exported_Constants UART Exported Constants

+  * @{

+  */

+

+/** @defgroup UART_State_Definition UART State Code Definition

+  * @{

+  */

+#define  HAL_UART_STATE_RESET         0x00000000U    /*!< Peripheral is not initialized

+                                                          Value is allowed for gState and RxState */

+#define  HAL_UART_STATE_READY         0x00000020U    /*!< Peripheral Initialized and ready for use

+                                                          Value is allowed for gState and RxState */

+#define  HAL_UART_STATE_BUSY          0x00000024U    /*!< an internal process is ongoing

+                                                          Value is allowed for gState only */

+#define  HAL_UART_STATE_BUSY_TX       0x00000021U    /*!< Data Transmission process is ongoing

+                                                          Value is allowed for gState only */

+#define  HAL_UART_STATE_BUSY_RX       0x00000022U    /*!< Data Reception process is ongoing

+                                                          Value is allowed for RxState only */

+#define  HAL_UART_STATE_BUSY_TX_RX    0x00000023U    /*!< Data Transmission and Reception process is ongoing

+                                                          Not to be used for neither gState nor RxState.

+                                                          Value is result of combination (Or) between gState and RxState values */

+#define  HAL_UART_STATE_TIMEOUT       0x000000A0U    /*!< Timeout state

+                                                          Value is allowed for gState only */

+#define  HAL_UART_STATE_ERROR         0x000000E0U    /*!< Error

+                                                          Value is allowed for gState only */

+/**

+  * @}

+  */

+

+/** @defgroup UART_Error_Definition   UART Error Definition

+  * @{

+  */

+#define  HAL_UART_ERROR_NONE             ((uint32_t)0x00000000U)    /*!< No error                */

+#define  HAL_UART_ERROR_PE               ((uint32_t)0x00000001U)    /*!< Parity error            */

+#define  HAL_UART_ERROR_NE               ((uint32_t)0x00000002U)    /*!< Noise error             */

+#define  HAL_UART_ERROR_FE               ((uint32_t)0x00000004U)    /*!< Frame error             */

+#define  HAL_UART_ERROR_ORE              ((uint32_t)0x00000008U)    /*!< Overrun error           */

+#define  HAL_UART_ERROR_DMA              ((uint32_t)0x00000010U)    /*!< DMA transfer error      */

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+#define  HAL_UART_ERROR_INVALID_CALLBACK ((uint32_t)0x00000020U)    /*!< Invalid Callback error  */

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+/**

+  * @}

+  */

+

+/** @defgroup UART_Stop_Bits   UART Number of Stop Bits

+  * @{

+  */

+#define UART_STOPBITS_0_5                    USART_CR2_STOP_0                     /*!< UART frame with 0.5 stop bit  */

+#define UART_STOPBITS_1                     0x00000000U                           /*!< UART frame with 1 stop bit    */

+#define UART_STOPBITS_1_5                   (USART_CR2_STOP_0 | USART_CR2_STOP_1) /*!< UART frame with 1.5 stop bits */

+#define UART_STOPBITS_2                      USART_CR2_STOP_1                     /*!< UART frame with 2 stop bits   */

+/**

+  * @}

+  */

+

+/** @defgroup UART_Parity  UART Parity

+  * @{

+  */

+#define UART_PARITY_NONE                    0x00000000U                        /*!< No parity   */

+#define UART_PARITY_EVEN                    USART_CR1_PCE                      /*!< Even parity */

+#define UART_PARITY_ODD                     (USART_CR1_PCE | USART_CR1_PS)     /*!< Odd parity  */

+/**

+  * @}

+  */

+

+/** @defgroup UART_Hardware_Flow_Control UART Hardware Flow Control

+  * @{

+  */

+#define UART_HWCONTROL_NONE                  0x00000000U                          /*!< No hardware control       */

+#define UART_HWCONTROL_RTS                   USART_CR3_RTSE                       /*!< Request To Send           */

+#define UART_HWCONTROL_CTS                   USART_CR3_CTSE                       /*!< Clear To Send             */

+#define UART_HWCONTROL_RTS_CTS               (USART_CR3_RTSE | USART_CR3_CTSE)    /*!< Request and Clear To Send */

+/**

+  * @}

+  */

+

+/** @defgroup UART_Mode UART Transfer Mode

+  * @{

+  */

+#define UART_MODE_RX                        USART_CR1_RE                    /*!< RX mode        */

+#define UART_MODE_TX                        USART_CR1_TE                    /*!< TX mode        */

+#define UART_MODE_TX_RX                     (USART_CR1_TE |USART_CR1_RE)    /*!< RX and TX mode */

+/**

+  * @}

+  */

+

+/** @defgroup UART_State  UART State

+  * @{

+  */

+#define UART_STATE_DISABLE                  0x00000000U         /*!< UART disabled  */

+#define UART_STATE_ENABLE                   USART_CR1_UE        /*!< UART enabled   */

+/**

+  * @}

+  */

+

+/** @defgroup UART_Over_Sampling UART Over Sampling

+  * @{

+  */

+#define UART_OVERSAMPLING_16                0x00000000U         /*!< Oversampling by 16 */

+#define UART_OVERSAMPLING_8                 USART_CR1_OVER8     /*!< Oversampling by 8  */

+/**

+  * @}

+  */

+

+/** @defgroup UART_OneBit_Sampling UART One Bit Sampling Method

+  * @{

+  */

+#define UART_ONE_BIT_SAMPLE_DISABLE         0x00000000U         /*!< One-bit sampling disable */

+#define UART_ONE_BIT_SAMPLE_ENABLE          USART_CR3_ONEBIT    /*!< One-bit sampling enable  */

+/**

+  * @}

+  */

+

+#if defined(USART_PRESC_PRESCALER)

+/** @defgroup UART_ClockPrescaler  UART Clock Prescaler

+  * @{

+  */

+#define UART_PRESCALER_DIV1    0x00000000U  /*!< fclk_pres = fclk     */

+#define UART_PRESCALER_DIV2    0x00000001U  /*!< fclk_pres = fclk/2   */

+#define UART_PRESCALER_DIV4    0x00000002U  /*!< fclk_pres = fclk/4   */

+#define UART_PRESCALER_DIV6    0x00000003U  /*!< fclk_pres = fclk/6   */

+#define UART_PRESCALER_DIV8    0x00000004U  /*!< fclk_pres = fclk/8   */

+#define UART_PRESCALER_DIV10   0x00000005U  /*!< fclk_pres = fclk/10  */

+#define UART_PRESCALER_DIV12   0x00000006U  /*!< fclk_pres = fclk/12  */

+#define UART_PRESCALER_DIV16   0x00000007U  /*!< fclk_pres = fclk/16  */

+#define UART_PRESCALER_DIV32   0x00000008U  /*!< fclk_pres = fclk/32  */

+#define UART_PRESCALER_DIV64   0x00000009U  /*!< fclk_pres = fclk/64  */

+#define UART_PRESCALER_DIV128  0x0000000AU  /*!< fclk_pres = fclk/128 */

+#define UART_PRESCALER_DIV256  0x0000000BU  /*!< fclk_pres = fclk/256 */

+/**

+  * @}

+  */

+

+#endif /* USART_PRESC_PRESCALER */

+/** @defgroup UART_AutoBaud_Rate_Mode    UART Advanced Feature AutoBaud Rate Mode

+  * @{

+  */

+#define UART_ADVFEATURE_AUTOBAUDRATE_ONSTARTBIT    0x00000000U           /*!< Auto Baud rate detection on start bit            */

+#define UART_ADVFEATURE_AUTOBAUDRATE_ONFALLINGEDGE USART_CR2_ABRMODE_0   /*!< Auto Baud rate detection on falling edge         */

+#define UART_ADVFEATURE_AUTOBAUDRATE_ON0X7FFRAME   USART_CR2_ABRMODE_1   /*!< Auto Baud rate detection on 0x7F frame detection */

+#define UART_ADVFEATURE_AUTOBAUDRATE_ON0X55FRAME   USART_CR2_ABRMODE     /*!< Auto Baud rate detection on 0x55 frame detection */

+/**

+  * @}

+  */

+

+/** @defgroup UART_Receiver_TimeOut UART Receiver TimeOut

+  * @{

+  */

+#define UART_RECEIVER_TIMEOUT_DISABLE       0x00000000U                 /*!< UART receiver timeout disable */

+#define UART_RECEIVER_TIMEOUT_ENABLE        USART_CR2_RTOEN             /*!< UART receiver timeout enable  */

+/**

+  * @}

+  */

+

+/** @defgroup UART_LIN    UART Local Interconnection Network mode

+  * @{

+  */

+#define UART_LIN_DISABLE                    0x00000000U                /*!< Local Interconnect Network disable */

+#define UART_LIN_ENABLE                     USART_CR2_LINEN            /*!< Local Interconnect Network enable  */

+/**

+  * @}

+  */

+

+/** @defgroup UART_LIN_Break_Detection  UART LIN Break Detection

+  * @{

+  */

+#define UART_LINBREAKDETECTLENGTH_10B       0x00000000U                /*!< LIN 10-bit break detection length */

+#define UART_LINBREAKDETECTLENGTH_11B       USART_CR2_LBDL             /*!< LIN 11-bit break detection length  */

+/**

+  * @}

+  */

+

+/** @defgroup UART_DMA_Tx    UART DMA Tx

+  * @{

+  */

+#define UART_DMA_TX_DISABLE                 0x00000000U                /*!< UART DMA TX disabled */

+#define UART_DMA_TX_ENABLE                  USART_CR3_DMAT             /*!< UART DMA TX enabled  */

+/**

+  * @}

+  */

+

+/** @defgroup UART_DMA_Rx   UART DMA Rx

+  * @{

+  */

+#define UART_DMA_RX_DISABLE                 0x00000000U                 /*!< UART DMA RX disabled */

+#define UART_DMA_RX_ENABLE                  USART_CR3_DMAR              /*!< UART DMA RX enabled  */

+/**

+  * @}

+  */

+

+/** @defgroup UART_Half_Duplex_Selection  UART Half Duplex Selection

+  * @{

+  */

+#define UART_HALF_DUPLEX_DISABLE            0x00000000U                 /*!< UART half-duplex disabled */

+#define UART_HALF_DUPLEX_ENABLE             USART_CR3_HDSEL             /*!< UART half-duplex enabled  */

+/**

+  * @}

+  */

+

+/** @defgroup UART_WakeUp_Methods   UART WakeUp Methods

+  * @{

+  */

+#define UART_WAKEUPMETHOD_IDLELINE          0x00000000U                 /*!< UART wake-up on idle line    */

+#define UART_WAKEUPMETHOD_ADDRESSMARK       USART_CR1_WAKE              /*!< UART wake-up on address mark */

+/**

+  * @}

+  */

+

+/** @defgroup UART_Request_Parameters UART Request Parameters

+  * @{

+  */

+#define UART_AUTOBAUD_REQUEST               USART_RQR_ABRRQ        /*!< Auto-Baud Rate Request      */

+#define UART_SENDBREAK_REQUEST              USART_RQR_SBKRQ        /*!< Send Break Request          */

+#define UART_MUTE_MODE_REQUEST              USART_RQR_MMRQ         /*!< Mute Mode Request           */

+#define UART_RXDATA_FLUSH_REQUEST           USART_RQR_RXFRQ        /*!< Receive Data flush Request  */

+#define UART_TXDATA_FLUSH_REQUEST           USART_RQR_TXFRQ        /*!< Transmit data flush Request */

+/**

+  * @}

+  */

+

+/** @defgroup UART_Advanced_Features_Initialization_Type  UART Advanced Feature Initialization Type

+  * @{

+  */

+#define UART_ADVFEATURE_NO_INIT                 0x00000000U          /*!< No advanced feature initialization       */

+#define UART_ADVFEATURE_TXINVERT_INIT           0x00000001U          /*!< TX pin active level inversion            */

+#define UART_ADVFEATURE_RXINVERT_INIT           0x00000002U          /*!< RX pin active level inversion            */

+#define UART_ADVFEATURE_DATAINVERT_INIT         0x00000004U          /*!< Binary data inversion                    */

+#define UART_ADVFEATURE_SWAP_INIT               0x00000008U          /*!< TX/RX pins swap                          */

+#define UART_ADVFEATURE_RXOVERRUNDISABLE_INIT   0x00000010U          /*!< RX overrun disable                       */

+#define UART_ADVFEATURE_DMADISABLEONERROR_INIT  0x00000020U          /*!< DMA disable on Reception Error           */

+#define UART_ADVFEATURE_AUTOBAUDRATE_INIT       0x00000040U          /*!< Auto Baud rate detection initialization  */

+#define UART_ADVFEATURE_MSBFIRST_INIT           0x00000080U          /*!< Most significant bit sent/received first */

+/**

+  * @}

+  */

+

+/** @defgroup UART_Tx_Inv UART Advanced Feature TX Pin Active Level Inversion

+  * @{

+  */

+#define UART_ADVFEATURE_TXINV_DISABLE       0x00000000U             /*!< TX pin active level inversion disable */

+#define UART_ADVFEATURE_TXINV_ENABLE        USART_CR2_TXINV         /*!< TX pin active level inversion enable  */

+/**

+  * @}

+  */

+

+/** @defgroup UART_Rx_Inv UART Advanced Feature RX Pin Active Level Inversion

+  * @{

+  */

+#define UART_ADVFEATURE_RXINV_DISABLE       0x00000000U             /*!< RX pin active level inversion disable */

+#define UART_ADVFEATURE_RXINV_ENABLE        USART_CR2_RXINV         /*!< RX pin active level inversion enable  */

+/**

+  * @}

+  */

+

+/** @defgroup UART_Data_Inv  UART Advanced Feature Binary Data Inversion

+  * @{

+  */

+#define UART_ADVFEATURE_DATAINV_DISABLE     0x00000000U             /*!< Binary data inversion disable */

+#define UART_ADVFEATURE_DATAINV_ENABLE      USART_CR2_DATAINV       /*!< Binary data inversion enable  */

+/**

+  * @}

+  */

+

+/** @defgroup UART_Rx_Tx_Swap UART Advanced Feature RX TX Pins Swap

+  * @{

+  */

+#define UART_ADVFEATURE_SWAP_DISABLE        0x00000000U             /*!< TX/RX pins swap disable */

+#define UART_ADVFEATURE_SWAP_ENABLE         USART_CR2_SWAP          /*!< TX/RX pins swap enable  */

+/**

+  * @}

+  */

+

+/** @defgroup UART_Overrun_Disable  UART Advanced Feature Overrun Disable

+  * @{

+  */

+#define UART_ADVFEATURE_OVERRUN_ENABLE      0x00000000U             /*!< RX overrun enable  */

+#define UART_ADVFEATURE_OVERRUN_DISABLE     USART_CR3_OVRDIS        /*!< RX overrun disable */

+/**

+  * @}

+  */

+

+/** @defgroup UART_AutoBaudRate_Enable  UART Advanced Feature Auto BaudRate Enable

+  * @{

+  */

+#define UART_ADVFEATURE_AUTOBAUDRATE_DISABLE   0x00000000U          /*!< RX Auto Baud rate detection enable  */

+#define UART_ADVFEATURE_AUTOBAUDRATE_ENABLE    USART_CR2_ABREN      /*!< RX Auto Baud rate detection disable */

+/**

+  * @}

+  */

+

+/** @defgroup UART_DMA_Disable_on_Rx_Error   UART Advanced Feature DMA Disable On Rx Error

+  * @{

+  */

+#define UART_ADVFEATURE_DMA_ENABLEONRXERROR    0x00000000U          /*!< DMA enable on Reception Error  */

+#define UART_ADVFEATURE_DMA_DISABLEONRXERROR   USART_CR3_DDRE       /*!< DMA disable on Reception Error */

+/**

+  * @}

+  */

+

+/** @defgroup UART_MSB_First   UART Advanced Feature MSB First

+  * @{

+  */

+#define UART_ADVFEATURE_MSBFIRST_DISABLE    0x00000000U             /*!< Most significant bit sent/received first disable */

+#define UART_ADVFEATURE_MSBFIRST_ENABLE     USART_CR2_MSBFIRST      /*!< Most significant bit sent/received first enable  */

+/**

+  * @}

+  */

+

+/** @defgroup UART_Stop_Mode_Enable   UART Advanced Feature Stop Mode Enable

+  * @{

+  */

+#define UART_ADVFEATURE_STOPMODE_DISABLE    0x00000000U             /*!< UART stop mode disable */

+#define UART_ADVFEATURE_STOPMODE_ENABLE     USART_CR1_UESM          /*!< UART stop mode enable  */

+/**

+  * @}

+  */

+

+/** @defgroup UART_Mute_Mode   UART Advanced Feature Mute Mode Enable

+  * @{

+  */

+#define UART_ADVFEATURE_MUTEMODE_DISABLE    0x00000000U             /*!< UART mute mode disable */

+#define UART_ADVFEATURE_MUTEMODE_ENABLE     USART_CR1_MME           /*!< UART mute mode enable  */

+/**

+  * @}

+  */

+

+/** @defgroup UART_CR2_ADDRESS_LSB_POS    UART Address-matching LSB Position In CR2 Register

+  * @{

+  */

+#define UART_CR2_ADDRESS_LSB_POS             24U                                /*!< UART address-matching LSB position in CR2 register */

+/**

+  * @}

+  */

+

+/** @defgroup UART_WakeUp_from_Stop_Selection   UART WakeUp From Stop Selection

+  * @{

+  */

+#define UART_WAKEUP_ON_ADDRESS              0x00000000U             /*!< UART wake-up on address                         */

+#define UART_WAKEUP_ON_STARTBIT             USART_CR3_WUS_1         /*!< UART wake-up on start bit                       */

+#define UART_WAKEUP_ON_READDATA_NONEMPTY    USART_CR3_WUS           /*!< UART wake-up on receive data register not empty or RXFIFO is not empty */

+/**

+  * @}

+  */

+

+/** @defgroup UART_DriverEnable_Polarity      UART DriverEnable Polarity

+  * @{

+  */

+#define UART_DE_POLARITY_HIGH               0x00000000U             /*!< Driver enable signal is active high */

+#define UART_DE_POLARITY_LOW                USART_CR3_DEP           /*!< Driver enable signal is active low  */

+/**

+  * @}

+  */

+

+/** @defgroup UART_CR1_DEAT_ADDRESS_LSB_POS    UART Driver Enable Assertion Time LSB Position In CR1 Register

+  * @{

+  */

+#define UART_CR1_DEAT_ADDRESS_LSB_POS       21U      /*!< UART Driver Enable assertion time LSB position in CR1 register */

+/**

+  * @}

+  */

+

+/** @defgroup UART_CR1_DEDT_ADDRESS_LSB_POS    UART Driver Enable DeAssertion Time LSB Position In CR1 Register

+  * @{

+  */

+#define UART_CR1_DEDT_ADDRESS_LSB_POS       16U      /*!< UART Driver Enable de-assertion time LSB position in CR1 register */

+/**

+  * @}

+  */

+

+/** @defgroup UART_Interruption_Mask    UART Interruptions Flag Mask

+  * @{

+  */

+#define UART_IT_MASK                        0x001FU  /*!< UART interruptions flags mask */

+/**

+  * @}

+  */

+

+/** @defgroup UART_TimeOut_Value    UART polling-based communications time-out value

+  * @{

+  */

+#define HAL_UART_TIMEOUT_VALUE              0x1FFFFFFU  /*!< UART polling-based communications time-out value */

+/**

+  * @}

+  */

+

+/** @defgroup UART_Flags     UART Status Flags

+  *        Elements values convention: 0xXXXX

+  *           - 0xXXXX  : Flag mask in the ISR register

+  * @{

+  */

+#if defined(USART_CR1_FIFOEN)

+#define UART_FLAG_TXFT                      USART_ISR_TXFT          /*!< UART TXFIFO threshold flag                */

+#define UART_FLAG_RXFT                      USART_ISR_RXFT          /*!< UART RXFIFO threshold flag                */

+#define UART_FLAG_RXFF                      USART_ISR_RXFF          /*!< UART RXFIFO Full flag                     */

+#define UART_FLAG_TXFE                      USART_ISR_TXFE          /*!< UART TXFIFO Empty flag                    */

+#endif /* USART_CR1_FIFOEN */

+#define UART_FLAG_REACK                     USART_ISR_REACK         /*!< UART receive enable acknowledge flag      */

+#define UART_FLAG_TEACK                     USART_ISR_TEACK         /*!< UART transmit enable acknowledge flag     */

+#define UART_FLAG_WUF                       USART_ISR_WUF           /*!< UART wake-up from stop mode flag          */

+#define UART_FLAG_RWU                       USART_ISR_RWU           /*!< UART receiver wake-up from mute mode flag */

+#define UART_FLAG_SBKF                      USART_ISR_SBKF          /*!< UART send break flag                      */

+#define UART_FLAG_CMF                       USART_ISR_CMF           /*!< UART character match flag                 */

+#define UART_FLAG_BUSY                      USART_ISR_BUSY          /*!< UART busy flag                            */

+#define UART_FLAG_ABRF                      USART_ISR_ABRF          /*!< UART auto Baud rate flag                  */

+#define UART_FLAG_ABRE                      USART_ISR_ABRE          /*!< UART auto Baud rate error                 */

+#define UART_FLAG_CTS                       USART_ISR_CTS           /*!< UART clear to send flag                   */

+#define UART_FLAG_CTSIF                     USART_ISR_CTSIF         /*!< UART clear to send interrupt flag         */

+#define UART_FLAG_LBDF                      USART_ISR_LBDF          /*!< UART LIN break detection flag             */

+#if defined(USART_CR1_FIFOEN)

+#define UART_FLAG_TXE                       USART_ISR_TXE_TXFNF     /*!< UART transmit data register empty         */

+#define UART_FLAG_TXFNF                     USART_ISR_TXE_TXFNF     /*!< UART TXFIFO not full                      */

+#else

+#define UART_FLAG_TXE                       USART_ISR_TXE           /*!< UART transmit data register empty         */

+#endif /* USART_CR1_FIFOEN */

+#define UART_FLAG_TC                        USART_ISR_TC            /*!< UART transmission complete                */

+#if defined(USART_CR1_FIFOEN)

+#define UART_FLAG_RXNE                      USART_ISR_RXNE_RXFNE    /*!< UART read data register not empty         */

+#define UART_FLAG_RXFNE                     USART_ISR_RXNE_RXFNE    /*!< UART RXFIFO not empty                     */

+#else

+#define UART_FLAG_RXNE                      USART_ISR_RXNE          /*!< UART read data register not empty         */

+#endif /* USART_CR1_FIFOEN */

+#define UART_FLAG_IDLE                      USART_ISR_IDLE          /*!< UART idle flag                            */

+#define UART_FLAG_ORE                       USART_ISR_ORE           /*!< UART overrun error                        */

+#define UART_FLAG_NE                        USART_ISR_NE            /*!< UART noise error                          */

+#define UART_FLAG_FE                        USART_ISR_FE            /*!< UART frame error                          */

+#define UART_FLAG_PE                        USART_ISR_PE            /*!< UART parity error                         */

+/**

+  * @}

+  */

+

+/** @defgroup UART_Interrupt_definition   UART Interrupts Definition

+  *        Elements values convention: 000ZZZZZ0XXYYYYYb

+  *           - YYYYY  : Interrupt source position in the XX register (5bits)

+  *           - XX  : Interrupt source register (2bits)

+  *                 - 01: CR1 register

+  *                 - 10: CR2 register

+  *                 - 11: CR3 register

+  *           - ZZZZZ  : Flag position in the ISR register(5bits)

+  *        Elements values convention: 000000000XXYYYYYb

+  *           - YYYYY  : Interrupt source position in the XX register (5bits)

+  *           - XX  : Interrupt source register (2bits)

+  *                 - 01: CR1 register

+  *                 - 10: CR2 register

+  *                 - 11: CR3 register

+  *        Elements values convention: 0000ZZZZ00000000b

+  *           - ZZZZ  : Flag position in the ISR register(4bits)

+  * @{

+  */

+#define UART_IT_PE                          0x0028U                  /*!< UART parity error interruption                 */

+#define UART_IT_TXE                         0x0727U                  /*!< UART transmit data register empty interruption */

+#if defined(USART_CR1_FIFOEN)

+#define UART_IT_TXFNF                       0x0727U                  /*!< UART TX FIFO not full interruption             */

+#endif /* USART_CR1_FIFOEN */

+#define UART_IT_TC                          0x0626U                  /*!< UART transmission complete interruption        */

+#define UART_IT_RXNE                        0x0525U                  /*!< UART read data register not empty interruption */

+#if defined(USART_CR1_FIFOEN)

+#define UART_IT_RXFNE                       0x0525U                  /*!< UART RXFIFO not empty interruption             */

+#endif /* USART_CR1_FIFOEN */

+#define UART_IT_IDLE                        0x0424U                  /*!< UART idle interruption                         */

+#define UART_IT_LBD                         0x0846U                  /*!< UART LIN break detection interruption          */

+#define UART_IT_CTS                         0x096AU                  /*!< UART CTS interruption                          */

+#define UART_IT_CM                          0x112EU                  /*!< UART character match interruption              */

+#define UART_IT_WUF                         0x1476U                  /*!< UART wake-up from stop mode interruption       */

+#if defined(USART_CR1_FIFOEN)

+#define UART_IT_RXFF                        0x183FU                  /*!< UART RXFIFO full interruption                  */

+#define UART_IT_TXFE                        0x173EU                  /*!< UART TXFIFO empty interruption                 */

+#define UART_IT_RXFT                        0x1A7CU                  /*!< UART RXFIFO threshold reached interruption     */

+#define UART_IT_TXFT                        0x1B77U                  /*!< UART TXFIFO threshold reached interruption     */

+#endif /* USART_CR1_FIFOEN */

+

+#define UART_IT_ERR                         0x0060U                  /*!< UART error interruption         */

+

+#define UART_IT_ORE                         0x0300U                  /*!< UART overrun error interruption */

+#define UART_IT_NE                          0x0200U                  /*!< UART noise error interruption   */

+#define UART_IT_FE                          0x0100U                  /*!< UART frame error interruption   */

+/**

+  * @}

+  */

+

+/** @defgroup UART_IT_CLEAR_Flags  UART Interruption Clear Flags

+  * @{

+  */

+#define UART_CLEAR_PEF                       USART_ICR_PECF            /*!< Parity Error Clear Flag           */

+#define UART_CLEAR_FEF                       USART_ICR_FECF            /*!< Framing Error Clear Flag          */

+#define UART_CLEAR_NEF                       USART_ICR_NECF            /*!< Noise Error detected Clear Flag   */

+#define UART_CLEAR_OREF                      USART_ICR_ORECF           /*!< Overrun Error Clear Flag          */

+#define UART_CLEAR_IDLEF                     USART_ICR_IDLECF          /*!< IDLE line detected Clear Flag     */

+#if defined(USART_CR1_FIFOEN)

+#define UART_CLEAR_TXFECF                    USART_ICR_TXFECF          /*!< TXFIFO empty clear flag           */

+#endif /* USART_CR1_FIFOEN */

+#define UART_CLEAR_TCF                       USART_ICR_TCCF            /*!< Transmission Complete Clear Flag  */

+#define UART_CLEAR_LBDF                      USART_ICR_LBDCF           /*!< LIN Break Detection Clear Flag    */

+#define UART_CLEAR_CTSF                      USART_ICR_CTSCF           /*!< CTS Interrupt Clear Flag          */

+#define UART_CLEAR_CMF                       USART_ICR_CMCF            /*!< Character Match Clear Flag        */

+#define UART_CLEAR_WUF                       USART_ICR_WUCF            /*!< Wake Up from stop mode Clear Flag */

+/**

+  * @}

+  */

+

+

+/**

+  * @}

+  */

+

+/* Exported macros -----------------------------------------------------------*/

+/** @defgroup UART_Exported_Macros UART Exported Macros

+  * @{

+  */

+

+/** @brief  Reset UART handle states.

+  * @param  __HANDLE__ UART handle.

+  * @retval None

+  */

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+#define __HAL_UART_RESET_HANDLE_STATE(__HANDLE__)  do{                                                   \

+                                                       (__HANDLE__)->gState = HAL_UART_STATE_RESET;      \

+                                                       (__HANDLE__)->RxState = HAL_UART_STATE_RESET;     \

+                                                       (__HANDLE__)->MspInitCallback = NULL;             \

+                                                       (__HANDLE__)->MspDeInitCallback = NULL;           \

+                                                     } while(0U)

+#else

+#define __HAL_UART_RESET_HANDLE_STATE(__HANDLE__)  do{                                                   \

+                                                       (__HANDLE__)->gState = HAL_UART_STATE_RESET;      \

+                                                       (__HANDLE__)->RxState = HAL_UART_STATE_RESET;     \

+                                                     } while(0U)

+#endif /*USE_HAL_UART_REGISTER_CALLBACKS */

+

+/** @brief  Flush the UART Data registers.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @retval None

+  */

+#define __HAL_UART_FLUSH_DRREGISTER(__HANDLE__)  \

+  do{                \

+    SET_BIT((__HANDLE__)->Instance->RQR, UART_RXDATA_FLUSH_REQUEST); \

+    SET_BIT((__HANDLE__)->Instance->RQR, UART_TXDATA_FLUSH_REQUEST); \

+  }  while(0U)

+

+/** @brief  Clear the specified UART pending flag.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @param  __FLAG__ specifies the flag to check.

+  *          This parameter can be any combination of the following values:

+  *            @arg @ref UART_CLEAR_PEF      Parity Error Clear Flag

+  *            @arg @ref UART_CLEAR_FEF      Framing Error Clear Flag

+  *            @arg @ref UART_CLEAR_NEF      Noise detected Clear Flag

+  *            @arg @ref UART_CLEAR_OREF     Overrun Error Clear Flag

+  *            @arg @ref UART_CLEAR_IDLEF    IDLE line detected Clear Flag

+  *            @arg @ref UART_CLEAR_TXFECF   TXFIFO empty clear Flag

+  *            @arg @ref UART_CLEAR_TCF      Transmission Complete Clear Flag

+  *            @arg @ref UART_CLEAR_LBDF     LIN Break Detection Clear Flag

+  *            @arg @ref UART_CLEAR_CTSF     CTS Interrupt Clear Flag

+  *            @arg @ref UART_CLEAR_CMF      Character Match Clear Flag

+  *            @arg @ref UART_CLEAR_WUF      Wake Up from stop mode Clear Flag

+  * @retval None

+  */

+#define __HAL_UART_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->ICR = (__FLAG__))

+

+/** @brief  Clear the UART PE pending flag.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @retval None

+  */

+#define __HAL_UART_CLEAR_PEFLAG(__HANDLE__)   __HAL_UART_CLEAR_FLAG((__HANDLE__), UART_CLEAR_PEF)

+

+/** @brief  Clear the UART FE pending flag.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @retval None

+  */

+#define __HAL_UART_CLEAR_FEFLAG(__HANDLE__)   __HAL_UART_CLEAR_FLAG((__HANDLE__), UART_CLEAR_FEF)

+

+/** @brief  Clear the UART NE pending flag.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @retval None

+  */

+#define __HAL_UART_CLEAR_NEFLAG(__HANDLE__)  __HAL_UART_CLEAR_FLAG((__HANDLE__), UART_CLEAR_NEF)

+

+/** @brief  Clear the UART ORE pending flag.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @retval None

+  */

+#define __HAL_UART_CLEAR_OREFLAG(__HANDLE__)   __HAL_UART_CLEAR_FLAG((__HANDLE__), UART_CLEAR_OREF)

+

+/** @brief  Clear the UART IDLE pending flag.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @retval None

+  */

+#define __HAL_UART_CLEAR_IDLEFLAG(__HANDLE__)   __HAL_UART_CLEAR_FLAG((__HANDLE__), UART_CLEAR_IDLEF)

+

+#if defined(USART_CR1_FIFOEN)

+/** @brief  Clear the UART TX FIFO empty clear flag.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @retval None

+  */

+#define __HAL_UART_CLEAR_TXFECF(__HANDLE__)   __HAL_UART_CLEAR_FLAG((__HANDLE__), UART_CLEAR_TXFECF)

+#endif /* USART_CR1_FIFOEN */

+

+/** @brief  Check whether the specified UART flag is set or not.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @param  __FLAG__ specifies the flag to check.

+  *        This parameter can be one of the following values:

+  *            @arg @ref UART_FLAG_TXFT  TXFIFO threshold flag

+  *            @arg @ref UART_FLAG_RXFT  RXFIFO threshold flag

+  *            @arg @ref UART_FLAG_RXFF  RXFIFO Full flag

+  *            @arg @ref UART_FLAG_TXFE  TXFIFO Empty flag

+  *            @arg @ref UART_FLAG_REACK Receive enable acknowledge flag

+  *            @arg @ref UART_FLAG_TEACK Transmit enable acknowledge flag

+  *            @arg @ref UART_FLAG_WUF   Wake up from stop mode flag

+  *            @arg @ref UART_FLAG_RWU   Receiver wake up flag (if the UART in mute mode)

+  *            @arg @ref UART_FLAG_SBKF  Send Break flag

+  *            @arg @ref UART_FLAG_CMF   Character match flag

+  *            @arg @ref UART_FLAG_BUSY  Busy flag

+  *            @arg @ref UART_FLAG_ABRF  Auto Baud rate detection flag

+  *            @arg @ref UART_FLAG_ABRE  Auto Baud rate detection error flag

+  *            @arg @ref UART_FLAG_CTS   CTS Change flag

+  *            @arg @ref UART_FLAG_LBDF  LIN Break detection flag

+  *            @arg @ref UART_FLAG_TXE   Transmit data register empty flag

+  *            @arg @ref UART_FLAG_TXFNF UART TXFIFO not full flag

+  *            @arg @ref UART_FLAG_TC    Transmission Complete flag

+  *            @arg @ref UART_FLAG_RXNE  Receive data register not empty flag

+  *            @arg @ref UART_FLAG_RXFNE UART RXFIFO not empty flag

+  *            @arg @ref UART_FLAG_IDLE  Idle Line detection flag

+  *            @arg @ref UART_FLAG_ORE   Overrun Error flag

+  *            @arg @ref UART_FLAG_NE    Noise Error flag

+  *            @arg @ref UART_FLAG_FE    Framing Error flag

+  *            @arg @ref UART_FLAG_PE    Parity Error flag

+  * @retval The new state of __FLAG__ (TRUE or FALSE).

+  */

+#define __HAL_UART_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->ISR & (__FLAG__)) == (__FLAG__))

+

+/** @brief  Enable the specified UART interrupt.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @param  __INTERRUPT__ specifies the UART interrupt source to enable.

+  *          This parameter can be one of the following values:

+  *            @arg @ref UART_IT_RXFF  RXFIFO Full interrupt

+  *            @arg @ref UART_IT_TXFE  TXFIFO Empty interrupt

+  *            @arg @ref UART_IT_RXFT  RXFIFO threshold interrupt

+  *            @arg @ref UART_IT_TXFT  TXFIFO threshold interrupt

+  *            @arg @ref UART_IT_WUF   Wakeup from stop mode interrupt

+  *            @arg @ref UART_IT_CM    Character match interrupt

+  *            @arg @ref UART_IT_CTS   CTS change interrupt

+  *            @arg @ref UART_IT_LBD   LIN Break detection interrupt

+  *            @arg @ref UART_IT_TXE   Transmit Data Register empty interrupt

+  *            @arg @ref UART_IT_TXFNF TX FIFO not full interrupt

+  *            @arg @ref UART_IT_TC    Transmission complete interrupt

+  *            @arg @ref UART_IT_RXNE  Receive Data register not empty interrupt

+  *            @arg @ref UART_IT_RXFNE RXFIFO not empty interrupt

+  *            @arg @ref UART_IT_IDLE  Idle line detection interrupt

+  *            @arg @ref UART_IT_PE    Parity Error interrupt

+  *            @arg @ref UART_IT_ERR   Error interrupt (frame error, noise error, overrun error)

+  * @retval None

+  */

+#define __HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__)   (((((uint8_t)(__INTERRUPT__)) >> 5U) == 1U)? ((__HANDLE__)->Instance->CR1 |= (1U << ((__INTERRUPT__) & UART_IT_MASK))): \

+                                                           ((((uint8_t)(__INTERRUPT__)) >> 5U) == 2U)? ((__HANDLE__)->Instance->CR2 |= (1U << ((__INTERRUPT__) & UART_IT_MASK))): \

+                                                           ((__HANDLE__)->Instance->CR3 |= (1U << ((__INTERRUPT__) & UART_IT_MASK))))

+

+

+/** @brief  Disable the specified UART interrupt.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @param  __INTERRUPT__ specifies the UART interrupt source to disable.

+  *          This parameter can be one of the following values:

+  *            @arg @ref UART_IT_RXFF  RXFIFO Full interrupt

+  *            @arg @ref UART_IT_TXFE  TXFIFO Empty interrupt

+  *            @arg @ref UART_IT_RXFT  RXFIFO threshold interrupt

+  *            @arg @ref UART_IT_TXFT  TXFIFO threshold interrupt

+  *            @arg @ref UART_IT_WUF   Wakeup from stop mode interrupt

+  *            @arg @ref UART_IT_CM    Character match interrupt

+  *            @arg @ref UART_IT_CTS   CTS change interrupt

+  *            @arg @ref UART_IT_LBD   LIN Break detection interrupt

+  *            @arg @ref UART_IT_TXE   Transmit Data Register empty interrupt

+  *            @arg @ref UART_IT_TXFNF TX FIFO not full interrupt

+  *            @arg @ref UART_IT_TC    Transmission complete interrupt

+  *            @arg @ref UART_IT_RXNE  Receive Data register not empty interrupt

+  *            @arg @ref UART_IT_RXFNE RXFIFO not empty interrupt

+  *            @arg @ref UART_IT_IDLE  Idle line detection interrupt

+  *            @arg @ref UART_IT_PE    Parity Error interrupt

+  *            @arg @ref UART_IT_ERR   Error interrupt (Frame error, noise error, overrun error)

+  * @retval None

+  */

+#define __HAL_UART_DISABLE_IT(__HANDLE__, __INTERRUPT__)  (((((uint8_t)(__INTERRUPT__)) >> 5U) == 1U)? ((__HANDLE__)->Instance->CR1 &= ~ (1U << ((__INTERRUPT__) & UART_IT_MASK))): \

+                                                           ((((uint8_t)(__INTERRUPT__)) >> 5U) == 2U)? ((__HANDLE__)->Instance->CR2 &= ~ (1U << ((__INTERRUPT__) & UART_IT_MASK))): \

+                                                           ((__HANDLE__)->Instance->CR3 &= ~ (1U << ((__INTERRUPT__) & UART_IT_MASK))))

+

+/** @brief  Check whether the specified UART interrupt has occurred or not.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @param  __INTERRUPT__ specifies the UART interrupt to check.

+  *          This parameter can be one of the following values:

+  *            @arg @ref UART_IT_RXFF  RXFIFO Full interrupt

+  *            @arg @ref UART_IT_TXFE  TXFIFO Empty interrupt

+  *            @arg @ref UART_IT_RXFT  RXFIFO threshold interrupt

+  *            @arg @ref UART_IT_TXFT  TXFIFO threshold interrupt

+  *            @arg @ref UART_IT_WUF   Wakeup from stop mode interrupt

+  *            @arg @ref UART_IT_CM    Character match interrupt

+  *            @arg @ref UART_IT_CTS   CTS change interrupt

+  *            @arg @ref UART_IT_LBD   LIN Break detection interrupt

+  *            @arg @ref UART_IT_TXE   Transmit Data Register empty interrupt

+  *            @arg @ref UART_IT_TXFNF TX FIFO not full interrupt

+  *            @arg @ref UART_IT_TC    Transmission complete interrupt

+  *            @arg @ref UART_IT_RXNE  Receive Data register not empty interrupt

+  *            @arg @ref UART_IT_RXFNE RXFIFO not empty interrupt

+  *            @arg @ref UART_IT_IDLE  Idle line detection interrupt

+  *            @arg @ref UART_IT_PE    Parity Error interrupt

+  *            @arg @ref UART_IT_ERR   Error interrupt (Frame error, noise error, overrun error)

+  * @retval The new state of __INTERRUPT__ (SET or RESET).

+  */

+#define __HAL_UART_GET_IT(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->ISR\

+                                                        & (1U << ((__INTERRUPT__)>> 8U))) != RESET) ? SET : RESET)

+

+/** @brief  Check whether the specified UART interrupt source is enabled or not.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @param  __INTERRUPT__ specifies the UART interrupt source to check.

+  *          This parameter can be one of the following values:

+  *            @arg @ref UART_IT_RXFF  RXFIFO Full interrupt

+  *            @arg @ref UART_IT_TXFE  TXFIFO Empty interrupt

+  *            @arg @ref UART_IT_RXFT  RXFIFO threshold interrupt

+  *            @arg @ref UART_IT_TXFT  TXFIFO threshold interrupt

+  *            @arg @ref UART_IT_WUF   Wakeup from stop mode interrupt

+  *            @arg @ref UART_IT_CM    Character match interrupt

+  *            @arg @ref UART_IT_CTS   CTS change interrupt

+  *            @arg @ref UART_IT_LBD   LIN Break detection interrupt

+  *            @arg @ref UART_IT_TXE   Transmit Data Register empty interrupt

+  *            @arg @ref UART_IT_TXFNF TX FIFO not full interrupt

+  *            @arg @ref UART_IT_TC    Transmission complete interrupt

+  *            @arg @ref UART_IT_RXNE  Receive Data register not empty interrupt

+  *            @arg @ref UART_IT_RXFNE RXFIFO not empty interrupt

+  *            @arg @ref UART_IT_IDLE  Idle line detection interrupt

+  *            @arg @ref UART_IT_PE    Parity Error interrupt

+  *            @arg @ref UART_IT_ERR   Error interrupt (Frame error, noise error, overrun error)

+  * @retval The new state of __INTERRUPT__ (SET or RESET).

+  */

+#define __HAL_UART_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((((((uint8_t)(__INTERRUPT__)) >> 5U) == 1U) ? (__HANDLE__)->Instance->CR1 : \

+                                                                (((((uint8_t)(__INTERRUPT__)) >> 5U) == 2U) ? (__HANDLE__)->Instance->CR2 : \

+                                                                 (__HANDLE__)->Instance->CR3)) & (1U << (((uint16_t)(__INTERRUPT__)) & UART_IT_MASK)))  != RESET) ? SET : RESET)

+

+/** @brief  Clear the specified UART ISR flag, in setting the proper ICR register flag.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @param  __IT_CLEAR__ specifies the interrupt clear register flag that needs to be set

+  *                       to clear the corresponding interrupt

+  *          This parameter can be one of the following values:

+  *            @arg @ref UART_CLEAR_PEF    Parity Error Clear Flag

+  *            @arg @ref UART_CLEAR_FEF    Framing Error Clear Flag

+  *            @arg @ref UART_CLEAR_NEF    Noise detected Clear Flag

+  *            @arg @ref UART_CLEAR_OREF   Overrun Error Clear Flag

+  *            @arg @ref UART_CLEAR_IDLEF  IDLE line detected Clear Flag

+  *            @arg @ref UART_CLEAR_TXFECF TXFIFO empty Clear Flag

+  *            @arg @ref UART_CLEAR_TCF    Transmission Complete Clear Flag

+  *            @arg @ref UART_CLEAR_LBDF   LIN Break Detection Clear Flag

+  *            @arg @ref UART_CLEAR_CTSF   CTS Interrupt Clear Flag

+  *            @arg @ref UART_CLEAR_CMF    Character Match Clear Flag

+  *            @arg @ref UART_CLEAR_WUF    Wake Up from stop mode Clear Flag

+  * @retval None

+  */

+#define __HAL_UART_CLEAR_IT(__HANDLE__, __IT_CLEAR__) ((__HANDLE__)->Instance->ICR = (uint32_t)(__IT_CLEAR__))

+

+/** @brief  Set a specific UART request flag.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @param  __REQ__ specifies the request flag to set

+  *          This parameter can be one of the following values:

+  *            @arg @ref UART_AUTOBAUD_REQUEST Auto-Baud Rate Request

+  *            @arg @ref UART_SENDBREAK_REQUEST Send Break Request

+  *            @arg @ref UART_MUTE_MODE_REQUEST Mute Mode Request

+  *            @arg @ref UART_RXDATA_FLUSH_REQUEST Receive Data flush Request

+  *            @arg @ref UART_TXDATA_FLUSH_REQUEST Transmit data flush Request

+  * @retval None

+  */

+#define __HAL_UART_SEND_REQ(__HANDLE__, __REQ__) ((__HANDLE__)->Instance->RQR |= (uint16_t)(__REQ__))

+

+/** @brief  Enable the UART one bit sample method.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @retval None

+  */

+#define __HAL_UART_ONE_BIT_SAMPLE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3|= USART_CR3_ONEBIT)

+

+/** @brief  Disable the UART one bit sample method.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @retval None

+  */

+#define __HAL_UART_ONE_BIT_SAMPLE_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3 &= ~USART_CR3_ONEBIT)

+

+/** @brief  Enable UART.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @retval None

+  */

+#define __HAL_UART_ENABLE(__HANDLE__)                   ((__HANDLE__)->Instance->CR1 |= USART_CR1_UE)

+

+/** @brief  Disable UART.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @retval None

+  */

+#define __HAL_UART_DISABLE(__HANDLE__)                  ((__HANDLE__)->Instance->CR1 &= ~USART_CR1_UE)

+

+/** @brief  Enable CTS flow control.

+  * @note   This macro allows to enable CTS hardware flow control for a given UART instance,

+  *         without need to call HAL_UART_Init() function.

+  *         As involving direct access to UART registers, usage of this macro should be fully endorsed by user.

+  * @note   As macro is expected to be used for modifying CTS Hw flow control feature activation, without need

+  *         for USART instance Deinit/Init, following conditions for macro call should be fulfilled :

+  *           - UART instance should have already been initialised (through call of HAL_UART_Init() )

+  *           - macro could only be called when corresponding UART instance is disabled (i.e. __HAL_UART_DISABLE(__HANDLE__))

+  *             and should be followed by an Enable macro (i.e. __HAL_UART_ENABLE(__HANDLE__)).

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @retval None

+  */

+#define __HAL_UART_HWCONTROL_CTS_ENABLE(__HANDLE__)        \

+  do{                                                      \

+    SET_BIT((__HANDLE__)->Instance->CR3, USART_CR3_CTSE);  \

+    (__HANDLE__)->Init.HwFlowCtl |= USART_CR3_CTSE;        \

+  } while(0U)

+

+/** @brief  Disable CTS flow control.

+  * @note   This macro allows to disable CTS hardware flow control for a given UART instance,

+  *         without need to call HAL_UART_Init() function.

+  *         As involving direct access to UART registers, usage of this macro should be fully endorsed by user.

+  * @note   As macro is expected to be used for modifying CTS Hw flow control feature activation, without need

+  *         for USART instance Deinit/Init, following conditions for macro call should be fulfilled :

+  *           - UART instance should have already been initialised (through call of HAL_UART_Init() )

+  *           - macro could only be called when corresponding UART instance is disabled (i.e. __HAL_UART_DISABLE(__HANDLE__))

+  *             and should be followed by an Enable macro (i.e. __HAL_UART_ENABLE(__HANDLE__)).

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @retval None

+  */

+#define __HAL_UART_HWCONTROL_CTS_DISABLE(__HANDLE__)        \

+  do{                                                       \

+    CLEAR_BIT((__HANDLE__)->Instance->CR3, USART_CR3_CTSE); \

+    (__HANDLE__)->Init.HwFlowCtl &= ~(USART_CR3_CTSE);      \

+  } while(0U)

+

+/** @brief  Enable RTS flow control.

+  * @note   This macro allows to enable RTS hardware flow control for a given UART instance,

+  *         without need to call HAL_UART_Init() function.

+  *         As involving direct access to UART registers, usage of this macro should be fully endorsed by user.

+  * @note   As macro is expected to be used for modifying RTS Hw flow control feature activation, without need

+  *         for USART instance Deinit/Init, following conditions for macro call should be fulfilled :

+  *           - UART instance should have already been initialised (through call of HAL_UART_Init() )

+  *           - macro could only be called when corresponding UART instance is disabled (i.e. __HAL_UART_DISABLE(__HANDLE__))

+  *             and should be followed by an Enable macro (i.e. __HAL_UART_ENABLE(__HANDLE__)).

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @retval None

+  */

+#define __HAL_UART_HWCONTROL_RTS_ENABLE(__HANDLE__)       \

+  do{                                                     \

+    SET_BIT((__HANDLE__)->Instance->CR3, USART_CR3_RTSE); \

+    (__HANDLE__)->Init.HwFlowCtl |= USART_CR3_RTSE;       \

+  } while(0U)

+

+/** @brief  Disable RTS flow control.

+  * @note   This macro allows to disable RTS hardware flow control for a given UART instance,

+  *         without need to call HAL_UART_Init() function.

+  *         As involving direct access to UART registers, usage of this macro should be fully endorsed by user.

+  * @note   As macro is expected to be used for modifying RTS Hw flow control feature activation, without need

+  *         for USART instance Deinit/Init, following conditions for macro call should be fulfilled :

+  *           - UART instance should have already been initialised (through call of HAL_UART_Init() )

+  *           - macro could only be called when corresponding UART instance is disabled (i.e. __HAL_UART_DISABLE(__HANDLE__))

+  *             and should be followed by an Enable macro (i.e. __HAL_UART_ENABLE(__HANDLE__)).

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @retval None

+  */

+#define __HAL_UART_HWCONTROL_RTS_DISABLE(__HANDLE__)       \

+  do{                                                      \

+    CLEAR_BIT((__HANDLE__)->Instance->CR3, USART_CR3_RTSE);\

+    (__HANDLE__)->Init.HwFlowCtl &= ~(USART_CR3_RTSE);     \

+  } while(0U)

+/**

+  * @}

+  */

+

+/* Private macros --------------------------------------------------------*/

+/** @defgroup UART_Private_Macros   UART Private Macros

+  * @{

+  */

+#if defined(USART_PRESC_PRESCALER)

+/** @brief  Get UART clok division factor from clock prescaler value.

+  * @param  __CLOCKPRESCALER__ UART prescaler value.

+  * @retval UART clock division factor

+  */

+#define UART_GET_DIV_FACTOR(__CLOCKPRESCALER__) \

+  (((__CLOCKPRESCALER__) == UART_PRESCALER_DIV1)   ? 1U :       \

+   ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV2)   ? 2U :       \

+   ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV4)   ? 4U :       \

+   ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV6)   ? 6U :       \

+   ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV8)   ? 8U :       \

+   ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV10)  ? 10U :      \

+   ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV12)  ? 12U :      \

+   ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV16)  ? 16U :      \

+   ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV32)  ? 32U :      \

+   ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV64)  ? 64U :      \

+   ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV128) ? 128U :     \

+   ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV256) ? 256U : 1U)

+

+/** @brief  BRR division operation to set BRR register with LPUART.

+  * @param  __PCLK__ LPUART clock.

+  * @param  __BAUD__ Baud rate set by the user.

+  * @param  __CLOCKPRESCALER__ UART prescaler value.

+  * @retval Division result

+  */

+#define UART_DIV_LPUART(__PCLK__, __BAUD__, __CLOCKPRESCALER__)      ((uint32_t)(((((uint64_t)(__PCLK__)/UART_GET_DIV_FACTOR((__CLOCKPRESCALER__)))*256U)\

+                                                                      + (uint32_t)((__BAUD__)/2U)) / (__BAUD__)))

+

+/** @brief  BRR division operation to set BRR register in 8-bit oversampling mode.

+  * @param  __PCLK__ UART clock.

+  * @param  __BAUD__ Baud rate set by the user.

+  * @param  __CLOCKPRESCALER__ UART prescaler value.

+  * @retval Division result

+  */

+#define UART_DIV_SAMPLING8(__PCLK__, __BAUD__, __CLOCKPRESCALER__)   (((((__PCLK__)/UART_GET_DIV_FACTOR((__CLOCKPRESCALER__)))*2U)\

+                                                                       + ((__BAUD__)/2U)) / (__BAUD__))

+

+/** @brief  BRR division operation to set BRR register in 16-bit oversampling mode.

+  * @param  __PCLK__ UART clock.

+  * @param  __BAUD__ Baud rate set by the user.

+  * @param  __CLOCKPRESCALER__ UART prescaler value.

+  * @retval Division result

+  */

+#define UART_DIV_SAMPLING16(__PCLK__, __BAUD__, __CLOCKPRESCALER__)  ((((__PCLK__)/UART_GET_DIV_FACTOR((__CLOCKPRESCALER__)))\

+                                                                       + ((__BAUD__)/2U)) / (__BAUD__))

+#else

+

+/** @brief  BRR division operation to set BRR register with LPUART.

+  * @param  __PCLK__ LPUART clock.

+  * @param  __BAUD__ Baud rate set by the user.

+  * @retval Division result

+  */

+#define UART_DIV_LPUART(__PCLK__, __BAUD__)      (((((uint64_t)(__PCLK__)*256U)) + ((__BAUD__)/2U)) / (__BAUD__))

+

+/** @brief  BRR division operation to set BRR register in 8-bit oversampling mode.

+  * @param  __PCLK__ UART clock.

+  * @param  __BAUD__ Baud rate set by the user.

+  * @retval Division result

+  */

+#define UART_DIV_SAMPLING8(__PCLK__, __BAUD__)   ((((__PCLK__)*2U) + ((__BAUD__)/2U)) / (__BAUD__))

+

+/** @brief  BRR division operation to set BRR register in 16-bit oversampling mode.

+  * @param  __PCLK__ UART clock.

+  * @param  __BAUD__ Baud rate set by the user.

+  * @retval Division result

+  */

+#define UART_DIV_SAMPLING16(__PCLK__, __BAUD__)  (((__PCLK__) + ((__BAUD__)/2U)) / (__BAUD__))

+#endif /* USART_PRESC_PRESCALER */

+

+/** @brief  Check whether or not UART instance is Low Power UART.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @retval SET (instance is LPUART) or RESET (instance isn't LPUART)

+  */

+#define UART_INSTANCE_LOWPOWER(__HANDLE__) (IS_LPUART_INSTANCE((__HANDLE__)->Instance))

+

+/** @brief  Check UART Baud rate.

+  * @param  __BAUDRATE__ Baudrate specified by the user.

+  *         The maximum Baud Rate is derived from the maximum clock on L4

+  *         divided by the smallest oversampling used on the USART (i.e. 8)

+  *          (i.e. 120 MHz on STM32L4Rx/L4Sx, 80 Mhz otherwise)

+  * @retval SET (__BAUDRATE__ is valid) or RESET (__BAUDRATE__ is invalid)

+  */

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+#define IS_UART_BAUDRATE(__BAUDRATE__) ((__BAUDRATE__) < 15000001U)

+#else

+#define IS_UART_BAUDRATE(__BAUDRATE__) ((__BAUDRATE__) < 10000001U)

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+/** @brief  Check UART assertion time.

+  * @param  __TIME__ 5-bit value assertion time.

+  * @retval Test result (TRUE or FALSE).

+  */

+#define IS_UART_ASSERTIONTIME(__TIME__)    ((__TIME__) <= 0x1FU)

+

+/** @brief  Check UART deassertion time.

+  * @param  __TIME__ 5-bit value deassertion time.

+  * @retval Test result (TRUE or FALSE).

+  */

+#define IS_UART_DEASSERTIONTIME(__TIME__) ((__TIME__) <= 0x1FU)

+

+/**

+  * @brief Ensure that UART frame number of stop bits is valid.

+  * @param __STOPBITS__ UART frame number of stop bits.

+  * @retval SET (__STOPBITS__ is valid) or RESET (__STOPBITS__ is invalid)

+  */

+#define IS_UART_STOPBITS(__STOPBITS__) (((__STOPBITS__) == UART_STOPBITS_0_5) || \

+                                        ((__STOPBITS__) == UART_STOPBITS_1)   || \

+                                        ((__STOPBITS__) == UART_STOPBITS_1_5) || \

+                                        ((__STOPBITS__) == UART_STOPBITS_2))

+

+/**

+  * @brief Ensure that LPUART frame number of stop bits is valid.

+  * @param __STOPBITS__ LPUART frame number of stop bits.

+  * @retval SET (__STOPBITS__ is valid) or RESET (__STOPBITS__ is invalid)

+  */

+#define IS_LPUART_STOPBITS(__STOPBITS__) (((__STOPBITS__) == UART_STOPBITS_1) || \

+                                          ((__STOPBITS__) == UART_STOPBITS_2))

+

+/**

+  * @brief Ensure that UART frame parity is valid.

+  * @param __PARITY__ UART frame parity.

+  * @retval SET (__PARITY__ is valid) or RESET (__PARITY__ is invalid)

+  */

+#define IS_UART_PARITY(__PARITY__) (((__PARITY__) == UART_PARITY_NONE) || \

+                                    ((__PARITY__) == UART_PARITY_EVEN) || \

+                                    ((__PARITY__) == UART_PARITY_ODD))

+

+/**

+  * @brief Ensure that UART hardware flow control is valid.

+  * @param __CONTROL__ UART hardware flow control.

+  * @retval SET (__CONTROL__ is valid) or RESET (__CONTROL__ is invalid)

+  */

+#define IS_UART_HARDWARE_FLOW_CONTROL(__CONTROL__)\

+  (((__CONTROL__) == UART_HWCONTROL_NONE) || \

+   ((__CONTROL__) == UART_HWCONTROL_RTS)  || \

+   ((__CONTROL__) == UART_HWCONTROL_CTS)  || \

+   ((__CONTROL__) == UART_HWCONTROL_RTS_CTS))

+

+/**

+  * @brief Ensure that UART communication mode is valid.

+  * @param __MODE__ UART communication mode.

+  * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid)

+  */

+#define IS_UART_MODE(__MODE__) ((((__MODE__) & (~((uint32_t)(UART_MODE_TX_RX)))) == 0x00U) && ((__MODE__) != 0x00U))

+

+/**

+  * @brief Ensure that UART state is valid.

+  * @param __STATE__ UART state.

+  * @retval SET (__STATE__ is valid) or RESET (__STATE__ is invalid)

+  */

+#define IS_UART_STATE(__STATE__) (((__STATE__) == UART_STATE_DISABLE) || \

+                                  ((__STATE__) == UART_STATE_ENABLE))

+

+/**

+  * @brief Ensure that UART oversampling is valid.

+  * @param __SAMPLING__ UART oversampling.

+  * @retval SET (__SAMPLING__ is valid) or RESET (__SAMPLING__ is invalid)

+  */

+#define IS_UART_OVERSAMPLING(__SAMPLING__) (((__SAMPLING__) == UART_OVERSAMPLING_16) || \

+                                            ((__SAMPLING__) == UART_OVERSAMPLING_8))

+

+/**

+  * @brief Ensure that UART frame sampling is valid.

+  * @param __ONEBIT__ UART frame sampling.

+  * @retval SET (__ONEBIT__ is valid) or RESET (__ONEBIT__ is invalid)

+  */

+#define IS_UART_ONE_BIT_SAMPLE(__ONEBIT__) (((__ONEBIT__) == UART_ONE_BIT_SAMPLE_DISABLE) || \

+                                            ((__ONEBIT__) == UART_ONE_BIT_SAMPLE_ENABLE))

+

+/**

+  * @brief Ensure that UART auto Baud rate detection mode is valid.

+  * @param __MODE__ UART auto Baud rate detection mode.

+  * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid)

+  */

+#define IS_UART_ADVFEATURE_AUTOBAUDRATEMODE(__MODE__)  (((__MODE__) == UART_ADVFEATURE_AUTOBAUDRATE_ONSTARTBIT)    || \

+                                                        ((__MODE__) == UART_ADVFEATURE_AUTOBAUDRATE_ONFALLINGEDGE) || \

+                                                        ((__MODE__) == UART_ADVFEATURE_AUTOBAUDRATE_ON0X7FFRAME)   || \

+                                                        ((__MODE__) == UART_ADVFEATURE_AUTOBAUDRATE_ON0X55FRAME))

+

+/**

+  * @brief Ensure that UART receiver timeout setting is valid.

+  * @param __TIMEOUT__ UART receiver timeout setting.

+  * @retval SET (__TIMEOUT__ is valid) or RESET (__TIMEOUT__ is invalid)

+  */

+#define IS_UART_RECEIVER_TIMEOUT(__TIMEOUT__) (((__TIMEOUT__) == UART_RECEIVER_TIMEOUT_DISABLE) || \

+                                               ((__TIMEOUT__) == UART_RECEIVER_TIMEOUT_ENABLE))

+

+/**

+  * @brief Ensure that UART LIN state is valid.

+  * @param __LIN__ UART LIN state.

+  * @retval SET (__LIN__ is valid) or RESET (__LIN__ is invalid)

+  */

+#define IS_UART_LIN(__LIN__)        (((__LIN__) == UART_LIN_DISABLE) || \

+                                     ((__LIN__) == UART_LIN_ENABLE))

+

+/**

+  * @brief Ensure that UART LIN break detection length is valid.

+  * @param __LENGTH__ UART LIN break detection length.

+  * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid)

+  */

+#define IS_UART_LIN_BREAK_DETECT_LENGTH(__LENGTH__) (((__LENGTH__) == UART_LINBREAKDETECTLENGTH_10B) || \

+                                                     ((__LENGTH__) == UART_LINBREAKDETECTLENGTH_11B))

+

+/**

+  * @brief Ensure that UART DMA TX state is valid.

+  * @param __DMATX__ UART DMA TX state.

+  * @retval SET (__DMATX__ is valid) or RESET (__DMATX__ is invalid)

+  */

+#define IS_UART_DMA_TX(__DMATX__)     (((__DMATX__) == UART_DMA_TX_DISABLE) || \

+                                       ((__DMATX__) == UART_DMA_TX_ENABLE))

+

+/**

+  * @brief Ensure that UART DMA RX state is valid.

+  * @param __DMARX__ UART DMA RX state.

+  * @retval SET (__DMARX__ is valid) or RESET (__DMARX__ is invalid)

+  */

+#define IS_UART_DMA_RX(__DMARX__)     (((__DMARX__) == UART_DMA_RX_DISABLE) || \

+                                       ((__DMARX__) == UART_DMA_RX_ENABLE))

+

+/**

+  * @brief Ensure that UART half-duplex state is valid.

+  * @param __HDSEL__ UART half-duplex state.

+  * @retval SET (__HDSEL__ is valid) or RESET (__HDSEL__ is invalid)

+  */

+#define IS_UART_HALF_DUPLEX(__HDSEL__)     (((__HDSEL__) == UART_HALF_DUPLEX_DISABLE) || \

+                                            ((__HDSEL__) == UART_HALF_DUPLEX_ENABLE))

+

+/**

+  * @brief Ensure that UART wake-up method is valid.

+  * @param __WAKEUP__ UART wake-up method .

+  * @retval SET (__WAKEUP__ is valid) or RESET (__WAKEUP__ is invalid)

+  */

+#define IS_UART_WAKEUPMETHOD(__WAKEUP__) (((__WAKEUP__) == UART_WAKEUPMETHOD_IDLELINE) || \

+                                          ((__WAKEUP__) == UART_WAKEUPMETHOD_ADDRESSMARK))

+

+/**

+  * @brief Ensure that UART request parameter is valid.

+  * @param __PARAM__ UART request parameter.

+  * @retval SET (__PARAM__ is valid) or RESET (__PARAM__ is invalid)

+  */

+#define IS_UART_REQUEST_PARAMETER(__PARAM__) (((__PARAM__) == UART_AUTOBAUD_REQUEST)     || \

+                                              ((__PARAM__) == UART_SENDBREAK_REQUEST)    || \

+                                              ((__PARAM__) == UART_MUTE_MODE_REQUEST)    || \

+                                              ((__PARAM__) == UART_RXDATA_FLUSH_REQUEST) || \

+                                              ((__PARAM__) == UART_TXDATA_FLUSH_REQUEST))

+

+/**

+  * @brief Ensure that UART advanced features initialization is valid.

+  * @param __INIT__ UART advanced features initialization.

+  * @retval SET (__INIT__ is valid) or RESET (__INIT__ is invalid)

+  */

+#define IS_UART_ADVFEATURE_INIT(__INIT__)   ((__INIT__) <= (UART_ADVFEATURE_NO_INIT                | \

+                                                            UART_ADVFEATURE_TXINVERT_INIT          | \

+                                                            UART_ADVFEATURE_RXINVERT_INIT          | \

+                                                            UART_ADVFEATURE_DATAINVERT_INIT        | \

+                                                            UART_ADVFEATURE_SWAP_INIT              | \

+                                                            UART_ADVFEATURE_RXOVERRUNDISABLE_INIT  | \

+                                                            UART_ADVFEATURE_DMADISABLEONERROR_INIT | \

+                                                            UART_ADVFEATURE_AUTOBAUDRATE_INIT      | \

+                                                            UART_ADVFEATURE_MSBFIRST_INIT))

+

+/**

+  * @brief Ensure that UART frame TX inversion setting is valid.

+  * @param __TXINV__ UART frame TX inversion setting.

+  * @retval SET (__TXINV__ is valid) or RESET (__TXINV__ is invalid)

+  */

+#define IS_UART_ADVFEATURE_TXINV(__TXINV__) (((__TXINV__) == UART_ADVFEATURE_TXINV_DISABLE) || \

+                                             ((__TXINV__) == UART_ADVFEATURE_TXINV_ENABLE))

+

+/**

+  * @brief Ensure that UART frame RX inversion setting is valid.

+  * @param __RXINV__ UART frame RX inversion setting.

+  * @retval SET (__RXINV__ is valid) or RESET (__RXINV__ is invalid)

+  */

+#define IS_UART_ADVFEATURE_RXINV(__RXINV__) (((__RXINV__) == UART_ADVFEATURE_RXINV_DISABLE) || \

+                                             ((__RXINV__) == UART_ADVFEATURE_RXINV_ENABLE))

+

+/**

+  * @brief Ensure that UART frame data inversion setting is valid.

+  * @param __DATAINV__ UART frame data inversion setting.

+  * @retval SET (__DATAINV__ is valid) or RESET (__DATAINV__ is invalid)

+  */

+#define IS_UART_ADVFEATURE_DATAINV(__DATAINV__) (((__DATAINV__) == UART_ADVFEATURE_DATAINV_DISABLE) || \

+                                                 ((__DATAINV__) == UART_ADVFEATURE_DATAINV_ENABLE))

+

+/**

+  * @brief Ensure that UART frame RX/TX pins swap setting is valid.

+  * @param __SWAP__ UART frame RX/TX pins swap setting.

+  * @retval SET (__SWAP__ is valid) or RESET (__SWAP__ is invalid)

+  */

+#define IS_UART_ADVFEATURE_SWAP(__SWAP__) (((__SWAP__) == UART_ADVFEATURE_SWAP_DISABLE) || \

+                                           ((__SWAP__) == UART_ADVFEATURE_SWAP_ENABLE))

+

+/**

+  * @brief Ensure that UART frame overrun setting is valid.

+  * @param __OVERRUN__ UART frame overrun setting.

+  * @retval SET (__OVERRUN__ is valid) or RESET (__OVERRUN__ is invalid)

+  */

+#define IS_UART_OVERRUN(__OVERRUN__)     (((__OVERRUN__) == UART_ADVFEATURE_OVERRUN_ENABLE) || \

+                                          ((__OVERRUN__) == UART_ADVFEATURE_OVERRUN_DISABLE))

+

+/**

+  * @brief Ensure that UART auto Baud rate state is valid.

+  * @param __AUTOBAUDRATE__ UART auto Baud rate state.

+  * @retval SET (__AUTOBAUDRATE__ is valid) or RESET (__AUTOBAUDRATE__ is invalid)

+  */

+#define IS_UART_ADVFEATURE_AUTOBAUDRATE(__AUTOBAUDRATE__)  (((__AUTOBAUDRATE__) == UART_ADVFEATURE_AUTOBAUDRATE_DISABLE) || \

+                                                            ((__AUTOBAUDRATE__) == UART_ADVFEATURE_AUTOBAUDRATE_ENABLE))

+

+/**

+  * @brief Ensure that UART DMA enabling or disabling on error setting is valid.

+  * @param __DMA__ UART DMA enabling or disabling on error setting.

+  * @retval SET (__DMA__ is valid) or RESET (__DMA__ is invalid)

+  */

+#define IS_UART_ADVFEATURE_DMAONRXERROR(__DMA__)  (((__DMA__) == UART_ADVFEATURE_DMA_ENABLEONRXERROR) || \

+                                                   ((__DMA__) == UART_ADVFEATURE_DMA_DISABLEONRXERROR))

+

+/**

+  * @brief Ensure that UART frame MSB first setting is valid.

+  * @param __MSBFIRST__ UART frame MSB first setting.

+  * @retval SET (__MSBFIRST__ is valid) or RESET (__MSBFIRST__ is invalid)

+  */

+#define IS_UART_ADVFEATURE_MSBFIRST(__MSBFIRST__) (((__MSBFIRST__) == UART_ADVFEATURE_MSBFIRST_DISABLE) || \

+                                                   ((__MSBFIRST__) == UART_ADVFEATURE_MSBFIRST_ENABLE))

+

+/**

+  * @brief Ensure that UART stop mode state is valid.

+  * @param __STOPMODE__ UART stop mode state.

+  * @retval SET (__STOPMODE__ is valid) or RESET (__STOPMODE__ is invalid)

+  */

+#define IS_UART_ADVFEATURE_STOPMODE(__STOPMODE__) (((__STOPMODE__) == UART_ADVFEATURE_STOPMODE_DISABLE) || \

+                                                   ((__STOPMODE__) == UART_ADVFEATURE_STOPMODE_ENABLE))

+

+/**

+  * @brief Ensure that UART mute mode state is valid.

+  * @param __MUTE__ UART mute mode state.

+  * @retval SET (__MUTE__ is valid) or RESET (__MUTE__ is invalid)

+  */

+#define IS_UART_MUTE_MODE(__MUTE__)       (((__MUTE__) == UART_ADVFEATURE_MUTEMODE_DISABLE) || \

+                                           ((__MUTE__) == UART_ADVFEATURE_MUTEMODE_ENABLE))

+

+/**

+  * @brief Ensure that UART wake-up selection is valid.

+  * @param __WAKE__ UART wake-up selection.

+  * @retval SET (__WAKE__ is valid) or RESET (__WAKE__ is invalid)

+  */

+#define IS_UART_WAKEUP_SELECTION(__WAKE__) (((__WAKE__) == UART_WAKEUP_ON_ADDRESS)           || \

+                                            ((__WAKE__) == UART_WAKEUP_ON_STARTBIT)          || \

+                                            ((__WAKE__) == UART_WAKEUP_ON_READDATA_NONEMPTY))

+

+/**

+  * @brief Ensure that UART driver enable polarity is valid.

+  * @param __POLARITY__ UART driver enable polarity.

+  * @retval SET (__POLARITY__ is valid) or RESET (__POLARITY__ is invalid)

+  */

+#define IS_UART_DE_POLARITY(__POLARITY__)    (((__POLARITY__) == UART_DE_POLARITY_HIGH) || \

+                                              ((__POLARITY__) == UART_DE_POLARITY_LOW))

+

+#if defined(USART_PRESC_PRESCALER)

+/**

+  * @brief Ensure that UART Prescaler is valid.

+  * @param __CLOCKPRESCALER__ UART Prescaler value.

+  * @retval SET (__CLOCKPRESCALER__ is valid) or RESET (__CLOCKPRESCALER__ is invalid)

+  */

+#define IS_UART_PRESCALER(__CLOCKPRESCALER__) (((__CLOCKPRESCALER__) == UART_PRESCALER_DIV1)   || \

+                                               ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV2)   || \

+                                               ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV4)   || \

+                                               ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV6)   || \

+                                               ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV8)   || \

+                                               ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV10)  || \

+                                               ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV12)  || \

+                                               ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV16)  || \

+                                               ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV32)  || \

+                                               ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV64)  || \

+                                               ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV128) || \

+                                               ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV256))

+#endif /* USART_PRESC_PRESCALER */

+

+/**

+  * @}

+  */

+

+/* Include UART HAL Extended module */

+#include "stm32l4xx_hal_uart_ex.h"

+

+

+/* Exported functions --------------------------------------------------------*/

+/** @addtogroup UART_Exported_Functions UART Exported Functions

+  * @{

+  */

+

+/** @addtogroup UART_Exported_Functions_Group1 Initialization and de-initialization functions

+  * @{

+  */

+

+/* Initialization and de-initialization functions  ****************************/

+HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart);

+HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart);

+HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength);

+HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod);

+HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart);

+void HAL_UART_MspInit(UART_HandleTypeDef *huart);

+void HAL_UART_MspDeInit(UART_HandleTypeDef *huart);

+

+/* Callbacks Register/UnRegister functions  ***********************************/

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID,

+                                            pUART_CallbackTypeDef pCallback);

+HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+

+/**

+  * @}

+  */

+

+/** @addtogroup UART_Exported_Functions_Group2 IO operation functions

+  * @{

+  */

+

+/* IO operation functions *****************************************************/

+HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);

+HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);

+HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

+HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

+HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

+HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

+HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart);

+HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart);

+HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart);

+/* Transfer Abort functions */

+HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart);

+HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart);

+HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart);

+HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart);

+HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart);

+HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart);

+

+void HAL_UART_IRQHandler(UART_HandleTypeDef *huart);

+void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);

+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);

+void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);

+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);

+void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart);

+void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart);

+void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart);

+void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart);

+

+/**

+  * @}

+  */

+

+/** @addtogroup UART_Exported_Functions_Group3 Peripheral Control functions

+  * @{

+  */

+

+/* Peripheral Control functions  ************************************************/

+HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart);

+HAL_StatusTypeDef HAL_MultiProcessor_EnableMuteMode(UART_HandleTypeDef *huart);

+HAL_StatusTypeDef HAL_MultiProcessor_DisableMuteMode(UART_HandleTypeDef *huart);

+void HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart);

+HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart);

+HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart);

+

+/**

+  * @}

+  */

+

+/** @addtogroup UART_Exported_Functions_Group4 Peripheral State and Error functions

+  * @{

+  */

+

+/* Peripheral State and Errors functions  **************************************************/

+HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart);

+uint32_t              HAL_UART_GetError(UART_HandleTypeDef *huart);

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Private functions -----------------------------------------------------------*/

+/** @addtogroup UART_Private_Functions UART Private Functions

+  * @{

+  */

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+void UART_InitCallbacksToDefault(UART_HandleTypeDef *huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart);

+HAL_StatusTypeDef UART_CheckIdleState(UART_HandleTypeDef *huart);

+HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status,

+                                              uint32_t Tickstart, uint32_t Timeout);

+void UART_AdvFeatureConfig(UART_HandleTypeDef *huart);

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* STM32L4xx_HAL_UART_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h
new file mode 100644
index 0000000..b9835b5
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h
@@ -0,0 +1,734 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_uart_ex.h

+  * @author  MCD Application Team

+  * @brief   Header file of UART HAL Extended module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef STM32L4xx_HAL_UART_EX_H

+#define STM32L4xx_HAL_UART_EX_H

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup UARTEx

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+/** @defgroup UARTEx_Exported_Types UARTEx Exported Types

+  * @{

+  */

+

+/**

+  * @brief  UART wake up from stop mode parameters

+  */

+typedef struct

+{

+  uint32_t WakeUpEvent;        /*!< Specifies which event will activate the Wakeup from Stop mode flag (WUF).

+                                    This parameter can be a value of @ref UART_WakeUp_from_Stop_Selection.

+                                    If set to UART_WAKEUP_ON_ADDRESS, the two other fields below must

+                                    be filled up. */

+

+  uint16_t AddressLength;      /*!< Specifies whether the address is 4 or 7-bit long.

+                                    This parameter can be a value of @ref UARTEx_WakeUp_Address_Length.  */

+

+  uint8_t Address;             /*!< UART/USART node address (7-bit long max). */

+} UART_WakeUpTypeDef;

+

+/**

+  * @}

+  */

+

+/* Exported constants --------------------------------------------------------*/

+/** @defgroup UARTEx_Exported_Constants UARTEx Exported Constants

+  * @{

+  */

+

+/** @defgroup UARTEx_Word_Length UARTEx Word Length

+  * @{

+  */

+#define UART_WORDLENGTH_7B                  USART_CR1_M1   /*!< 7-bit long UART frame */

+#define UART_WORDLENGTH_8B                  0x00000000U    /*!< 8-bit long UART frame */

+#define UART_WORDLENGTH_9B                  USART_CR1_M0   /*!< 9-bit long UART frame */

+/**

+  * @}

+  */

+

+/** @defgroup UARTEx_WakeUp_Address_Length UARTEx WakeUp Address Length

+  * @{

+  */

+#define UART_ADDRESS_DETECT_4B              0x00000000U      /*!< 4-bit long wake-up address */

+#define UART_ADDRESS_DETECT_7B              USART_CR2_ADDM7  /*!< 7-bit long wake-up address */

+/**

+  * @}

+  */

+

+#if defined(USART_CR1_FIFOEN)

+/** @defgroup UARTEx_FIFO_mode UARTEx FIFO mode

+  * @brief    UART FIFO mode

+  * @{

+  */

+#define UART_FIFOMODE_DISABLE        0x00000000U       /*!< FIFO mode disable */

+#define UART_FIFOMODE_ENABLE         USART_CR1_FIFOEN  /*!< FIFO mode enable  */

+/**

+  * @}

+  */

+

+/** @defgroup UARTEx_TXFIFO_threshold_level UARTEx TXFIFO threshold level

+  * @brief    UART TXFIFO threshold level

+  * @{

+  */

+#define UART_TXFIFO_THRESHOLD_1_8   0x00000000U                               /*!< TXFIFO reaches 1/8 of its depth */

+#define UART_TXFIFO_THRESHOLD_1_4   USART_CR3_TXFTCFG_0                       /*!< TXFIFO reaches 1/4 of its depth */

+#define UART_TXFIFO_THRESHOLD_1_2   USART_CR3_TXFTCFG_1                       /*!< TXFIFO reaches 1/2 of its depth */

+#define UART_TXFIFO_THRESHOLD_3_4   (USART_CR3_TXFTCFG_0|USART_CR3_TXFTCFG_1) /*!< TXFIFO reaches 3/4 of its depth */

+#define UART_TXFIFO_THRESHOLD_7_8   USART_CR3_TXFTCFG_2                       /*!< TXFIFO reaches 7/8 of its depth */

+#define UART_TXFIFO_THRESHOLD_8_8   (USART_CR3_TXFTCFG_2|USART_CR3_TXFTCFG_0) /*!< TXFIFO becomes empty            */

+/**

+  * @}

+  */

+

+/** @defgroup UARTEx_RXFIFO_threshold_level UARTEx RXFIFO threshold level

+  * @brief    UART RXFIFO threshold level

+  * @{

+  */

+#define UART_RXFIFO_THRESHOLD_1_8   0x00000000U                               /*!< RXFIFO FIFO reaches 1/8 of its depth */

+#define UART_RXFIFO_THRESHOLD_1_4   USART_CR3_RXFTCFG_0                       /*!< RXFIFO FIFO reaches 1/4 of its depth */

+#define UART_RXFIFO_THRESHOLD_1_2   USART_CR3_RXFTCFG_1                       /*!< RXFIFO FIFO reaches 1/2 of its depth */

+#define UART_RXFIFO_THRESHOLD_3_4   (USART_CR3_RXFTCFG_0|USART_CR3_RXFTCFG_1) /*!< RXFIFO FIFO reaches 3/4 of its depth */

+#define UART_RXFIFO_THRESHOLD_7_8   USART_CR3_RXFTCFG_2                       /*!< RXFIFO FIFO reaches 7/8 of its depth */

+#define UART_RXFIFO_THRESHOLD_8_8   (USART_CR3_RXFTCFG_2|USART_CR3_RXFTCFG_0) /*!< RXFIFO FIFO becomes full             */

+/**

+  * @}

+  */

+#endif /* USART_CR1_FIFOEN */

+

+/**

+  * @}

+  */

+

+/* Exported macros -----------------------------------------------------------*/

+/* Exported functions --------------------------------------------------------*/

+/** @addtogroup UARTEx_Exported_Functions

+  * @{

+  */

+

+/** @addtogroup UARTEx_Exported_Functions_Group1

+  * @{

+  */

+

+/* Initialization and de-initialization functions  ****************************/

+HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime,

+                                   uint32_t DeassertionTime);

+

+/**

+  * @}

+  */

+

+/** @addtogroup UARTEx_Exported_Functions_Group2

+  * @{

+  */

+

+void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart);

+

+#if defined(USART_CR1_FIFOEN)

+void HAL_UARTEx_RxFifoFullCallback(UART_HandleTypeDef *huart);

+void HAL_UARTEx_TxFifoEmptyCallback(UART_HandleTypeDef *huart);

+#endif /* USART_CR1_FIFOEN */

+

+/**

+  * @}

+  */

+

+/** @addtogroup UARTEx_Exported_Functions_Group3

+  * @{

+  */

+

+/* Peripheral Control functions  **********************************************/

+HAL_StatusTypeDef HAL_UARTEx_StopModeWakeUpSourceConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection);

+HAL_StatusTypeDef HAL_UARTEx_EnableStopMode(UART_HandleTypeDef *huart);

+HAL_StatusTypeDef HAL_UARTEx_DisableStopMode(UART_HandleTypeDef *huart);

+#if defined(USART_CR3_UCESM)

+HAL_StatusTypeDef HAL_UARTEx_EnableClockStopMode(UART_HandleTypeDef *huart);

+HAL_StatusTypeDef HAL_UARTEx_DisableClockStopMode(UART_HandleTypeDef *huart);

+#endif /* USART_CR3_UCESM */

+HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *huart, uint32_t AddressLength);

+#if defined(USART_CR1_FIFOEN)

+HAL_StatusTypeDef HAL_UARTEx_EnableFifoMode(UART_HandleTypeDef *huart);

+HAL_StatusTypeDef HAL_UARTEx_DisableFifoMode(UART_HandleTypeDef *huart);

+HAL_StatusTypeDef HAL_UARTEx_SetTxFifoThreshold(UART_HandleTypeDef *huart, uint32_t Threshold);

+HAL_StatusTypeDef HAL_UARTEx_SetRxFifoThreshold(UART_HandleTypeDef *huart, uint32_t Threshold);

+#endif /* USART_CR1_FIFOEN */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Private macros ------------------------------------------------------------*/

+/** @defgroup UARTEx_Private_Macros UARTEx Private Macros

+  * @{

+  */

+

+/** @brief  Report the UART clock source.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @param  __CLOCKSOURCE__ output variable.

+  * @retval UART clocking source, written in __CLOCKSOURCE__.

+  */

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) \

+    || defined (STM32L496xx) || defined (STM32L4A6xx) \

+    || defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__)       \

+  do {                                                        \

+    if((__HANDLE__)->Instance == USART1)                      \

+    {                                                         \

+      switch(__HAL_RCC_GET_USART1_SOURCE())                   \

+      {                                                       \

+        case RCC_USART1CLKSOURCE_PCLK2:                       \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2;         \

+          break;                                              \

+        case RCC_USART1CLKSOURCE_HSI:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \

+          break;                                              \

+        case RCC_USART1CLKSOURCE_SYSCLK:                      \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \

+          break;                                              \

+        case RCC_USART1CLKSOURCE_LSE:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \

+          break;                                              \

+        default:                                              \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \

+          break;                                              \

+      }                                                       \

+    }                                                         \

+    else if((__HANDLE__)->Instance == USART2)                 \

+    {                                                         \

+      switch(__HAL_RCC_GET_USART2_SOURCE())                   \

+      {                                                       \

+        case RCC_USART2CLKSOURCE_PCLK1:                       \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1;         \

+          break;                                              \

+        case RCC_USART2CLKSOURCE_HSI:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \

+          break;                                              \

+        case RCC_USART2CLKSOURCE_SYSCLK:                      \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \

+          break;                                              \

+        case RCC_USART2CLKSOURCE_LSE:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \

+          break;                                              \

+        default:                                              \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \

+          break;                                              \

+      }                                                       \

+    }                                                         \

+    else if((__HANDLE__)->Instance == USART3)                 \

+    {                                                         \

+      switch(__HAL_RCC_GET_USART3_SOURCE())                   \

+      {                                                       \

+        case RCC_USART3CLKSOURCE_PCLK1:                       \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1;         \

+          break;                                              \

+        case RCC_USART3CLKSOURCE_HSI:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \

+          break;                                              \

+        case RCC_USART3CLKSOURCE_SYSCLK:                      \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \

+          break;                                              \

+        case RCC_USART3CLKSOURCE_LSE:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \

+          break;                                              \

+        default:                                              \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \

+          break;                                              \

+      }                                                       \

+    }                                                         \

+    else if((__HANDLE__)->Instance == UART4)                  \

+    {                                                         \

+      switch(__HAL_RCC_GET_UART4_SOURCE())                    \

+      {                                                       \

+        case RCC_UART4CLKSOURCE_PCLK1:                        \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1;         \

+          break;                                              \

+        case RCC_UART4CLKSOURCE_HSI:                          \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \

+          break;                                              \

+        case RCC_UART4CLKSOURCE_SYSCLK:                       \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \

+          break;                                              \

+        case RCC_UART4CLKSOURCE_LSE:                          \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \

+          break;                                              \

+        default:                                              \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \

+          break;                                              \

+      }                                                       \

+    }                                                         \

+    else if((__HANDLE__)->Instance == UART5)                  \

+    {                                                         \

+      switch(__HAL_RCC_GET_UART5_SOURCE())                    \

+      {                                                       \

+        case RCC_UART5CLKSOURCE_PCLK1:                        \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1;         \

+          break;                                              \

+        case RCC_UART5CLKSOURCE_HSI:                          \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \

+          break;                                              \

+        case RCC_UART5CLKSOURCE_SYSCLK:                       \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \

+          break;                                              \

+        case RCC_UART5CLKSOURCE_LSE:                          \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \

+          break;                                              \

+        default:                                              \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \

+          break;                                              \

+      }                                                       \

+    }                                                         \

+    else if((__HANDLE__)->Instance == LPUART1)                \

+    {                                                         \

+      switch(__HAL_RCC_GET_LPUART1_SOURCE())                  \

+      {                                                       \

+        case RCC_LPUART1CLKSOURCE_PCLK1:                      \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1;         \

+          break;                                              \

+        case RCC_LPUART1CLKSOURCE_HSI:                        \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \

+          break;                                              \

+        case RCC_LPUART1CLKSOURCE_SYSCLK:                     \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \

+          break;                                              \

+        case RCC_LPUART1CLKSOURCE_LSE:                        \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \

+          break;                                              \

+        default:                                              \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \

+          break;                                              \

+      }                                                       \

+    }                                                         \

+    else                                                      \

+    {                                                         \

+      (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;         \

+    }                                                         \

+  } while(0U)

+#elif defined (STM32L412xx) || defined (STM32L422xx) \

+   || defined (STM32L431xx) || defined (STM32L433xx) || defined (STM32L443xx)

+#define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__)       \

+  do {                                                        \

+    if((__HANDLE__)->Instance == USART1)                      \

+    {                                                         \

+      switch(__HAL_RCC_GET_USART1_SOURCE())                   \

+      {                                                       \

+        case RCC_USART1CLKSOURCE_PCLK2:                       \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2;         \

+          break;                                              \

+        case RCC_USART1CLKSOURCE_HSI:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \

+          break;                                              \

+        case RCC_USART1CLKSOURCE_SYSCLK:                      \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \

+          break;                                              \

+        case RCC_USART1CLKSOURCE_LSE:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \

+          break;                                              \

+        default:                                              \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \

+          break;                                              \

+      }                                                       \

+    }                                                         \

+    else if((__HANDLE__)->Instance == USART2)                 \

+    {                                                         \

+      switch(__HAL_RCC_GET_USART2_SOURCE())                   \

+      {                                                       \

+        case RCC_USART2CLKSOURCE_PCLK1:                       \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1;         \

+          break;                                              \

+        case RCC_USART2CLKSOURCE_HSI:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \

+          break;                                              \

+        case RCC_USART2CLKSOURCE_SYSCLK:                      \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \

+          break;                                              \

+        case RCC_USART2CLKSOURCE_LSE:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \

+          break;                                              \

+        default:                                              \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \

+          break;                                              \

+      }                                                       \

+    }                                                         \

+    else if((__HANDLE__)->Instance == USART3)                 \

+    {                                                         \

+      switch(__HAL_RCC_GET_USART3_SOURCE())                   \

+      {                                                       \

+        case RCC_USART3CLKSOURCE_PCLK1:                       \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1;         \

+          break;                                              \

+        case RCC_USART3CLKSOURCE_HSI:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \

+          break;                                              \

+        case RCC_USART3CLKSOURCE_SYSCLK:                      \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \

+          break;                                              \

+        case RCC_USART3CLKSOURCE_LSE:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \

+          break;                                              \

+        default:                                              \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \

+          break;                                              \

+      }                                                       \

+    }                                                         \

+    else if((__HANDLE__)->Instance == LPUART1)                \

+    {                                                         \

+      switch(__HAL_RCC_GET_LPUART1_SOURCE())                  \

+      {                                                       \

+        case RCC_LPUART1CLKSOURCE_PCLK1:                      \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1;         \

+          break;                                              \

+        case RCC_LPUART1CLKSOURCE_HSI:                        \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \

+          break;                                              \

+        case RCC_LPUART1CLKSOURCE_SYSCLK:                     \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \

+          break;                                              \

+        case RCC_LPUART1CLKSOURCE_LSE:                        \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \

+          break;                                              \

+        default:                                              \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \

+          break;                                              \

+      }                                                       \

+    }                                                         \

+    else                                                      \

+    {                                                         \

+      (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;         \

+    }                                                         \

+  } while(0U)

+#elif defined (STM32L432xx) || defined (STM32L442xx)

+#define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__)       \

+  do {                                                        \

+    if((__HANDLE__)->Instance == USART1)                      \

+    {                                                         \

+      switch(__HAL_RCC_GET_USART1_SOURCE())                   \

+      {                                                       \

+        case RCC_USART1CLKSOURCE_PCLK2:                       \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2;         \

+          break;                                              \

+        case RCC_USART1CLKSOURCE_HSI:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \

+          break;                                              \

+        case RCC_USART1CLKSOURCE_SYSCLK:                      \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \

+          break;                                              \

+        case RCC_USART1CLKSOURCE_LSE:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \

+          break;                                              \

+        default:                                              \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \

+          break;                                              \

+      }                                                       \

+    }                                                         \

+    else if((__HANDLE__)->Instance == USART2)                 \

+    {                                                         \

+      switch(__HAL_RCC_GET_USART2_SOURCE())                   \

+      {                                                       \

+        case RCC_USART2CLKSOURCE_PCLK1:                       \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1;         \

+          break;                                              \

+        case RCC_USART2CLKSOURCE_HSI:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \

+          break;                                              \

+        case RCC_USART2CLKSOURCE_SYSCLK:                      \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \

+          break;                                              \

+        case RCC_USART2CLKSOURCE_LSE:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \

+          break;                                              \

+        default:                                              \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \

+          break;                                              \

+      }                                                       \

+    }                                                         \

+    else if((__HANDLE__)->Instance == LPUART1)                \

+    {                                                         \

+      switch(__HAL_RCC_GET_LPUART1_SOURCE())                  \

+      {                                                       \

+        case RCC_LPUART1CLKSOURCE_PCLK1:                      \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1;         \

+          break;                                              \

+        case RCC_LPUART1CLKSOURCE_HSI:                        \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \

+          break;                                              \

+        case RCC_LPUART1CLKSOURCE_SYSCLK:                     \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \

+          break;                                              \

+        case RCC_LPUART1CLKSOURCE_LSE:                        \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \

+          break;                                              \

+        default:                                              \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \

+          break;                                              \

+      }                                                       \

+    }                                                         \

+    else                                                      \

+    {                                                         \

+      (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;         \

+    }                                                         \

+  } while(0U)

+#elif defined (STM32L451xx) || defined (STM32L452xx) || defined (STM32L462xx)

+#define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__)       \

+  do {                                                        \

+    if((__HANDLE__)->Instance == USART1)                      \

+    {                                                         \

+      switch(__HAL_RCC_GET_USART1_SOURCE())                   \

+      {                                                       \

+        case RCC_USART1CLKSOURCE_PCLK2:                       \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2;         \

+          break;                                              \

+        case RCC_USART1CLKSOURCE_HSI:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \

+          break;                                              \

+        case RCC_USART1CLKSOURCE_SYSCLK:                      \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \

+          break;                                              \

+        case RCC_USART1CLKSOURCE_LSE:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \

+          break;                                              \

+        default:                                              \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \

+          break;                                              \

+      }                                                       \

+    }                                                         \

+    else if((__HANDLE__)->Instance == USART2)                 \

+    {                                                         \

+      switch(__HAL_RCC_GET_USART2_SOURCE())                   \

+      {                                                       \

+        case RCC_USART2CLKSOURCE_PCLK1:                       \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1;         \

+          break;                                              \

+        case RCC_USART2CLKSOURCE_HSI:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \

+          break;                                              \

+        case RCC_USART2CLKSOURCE_SYSCLK:                      \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \

+          break;                                              \

+        case RCC_USART2CLKSOURCE_LSE:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \

+          break;                                              \

+        default:                                              \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \

+          break;                                              \

+      }                                                       \

+    }                                                         \

+    else if((__HANDLE__)->Instance == USART3)                 \

+    {                                                         \

+      switch(__HAL_RCC_GET_USART3_SOURCE())                   \

+      {                                                       \

+        case RCC_USART3CLKSOURCE_PCLK1:                       \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1;         \

+          break;                                              \

+        case RCC_USART3CLKSOURCE_HSI:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \

+          break;                                              \

+        case RCC_USART3CLKSOURCE_SYSCLK:                      \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \

+          break;                                              \

+        case RCC_USART3CLKSOURCE_LSE:                         \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \

+          break;                                              \

+        default:                                              \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \

+          break;                                              \

+      }                                                       \

+    }                                                         \

+    else if((__HANDLE__)->Instance == UART4)                  \

+    {                                                         \

+      switch(__HAL_RCC_GET_UART4_SOURCE())                    \

+      {                                                       \

+        case RCC_UART4CLKSOURCE_PCLK1:                        \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1;         \

+          break;                                              \

+        case RCC_UART4CLKSOURCE_HSI:                          \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \

+          break;                                              \

+        case RCC_UART4CLKSOURCE_SYSCLK:                       \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \

+          break;                                              \

+        case RCC_UART4CLKSOURCE_LSE:                          \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \

+          break;                                              \

+        default:                                              \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \

+          break;                                              \

+      }                                                       \

+    }                                                         \

+    else if((__HANDLE__)->Instance == LPUART1)                \

+    {                                                         \

+      switch(__HAL_RCC_GET_LPUART1_SOURCE())                  \

+      {                                                       \

+        case RCC_LPUART1CLKSOURCE_PCLK1:                      \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1;         \

+          break;                                              \

+        case RCC_LPUART1CLKSOURCE_HSI:                        \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_HSI;           \

+          break;                                              \

+        case RCC_LPUART1CLKSOURCE_SYSCLK:                     \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_SYSCLK;        \

+          break;                                              \

+        case RCC_LPUART1CLKSOURCE_LSE:                        \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_LSE;           \

+          break;                                              \

+        default:                                              \

+          (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;     \

+          break;                                              \

+      }                                                       \

+    }                                                         \

+    else                                                      \

+    {                                                         \

+      (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED;         \

+    }                                                         \

+  } while(0U)

+#endif /* STM32L471xx ||  STM32L475xx ||  STM32L476xx ||  STM32L485xx ||  STM32L486xx ||

+        * STM32L496xx ||  STM32L4A6xx ||

+        * STM32L4R5xx ||  STM32L4R7xx ||  STM32L4R9xx ||  STM32L4S5xx ||  STM32L4S7xx ||  STM32L4S9xx

+        */

+

+/** @brief  Report the UART mask to apply to retrieve the received data

+  *         according to the word length and to the parity bits activation.

+  * @note   If PCE = 1, the parity bit is not included in the data extracted

+  *         by the reception API().

+  *         This masking operation is not carried out in the case of

+  *         DMA transfers.

+  * @param  __HANDLE__ specifies the UART Handle.

+  * @retval None, the mask to apply to UART RDR register is stored in (__HANDLE__)->Mask field.

+  */

+#define UART_MASK_COMPUTATION(__HANDLE__)                             \

+  do {                                                                \

+    if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_9B)          \

+    {                                                                 \

+      if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE)              \

+      {                                                               \

+        (__HANDLE__)->Mask = 0x01FFU ;                                \

+      }                                                               \

+      else                                                            \

+      {                                                               \

+        (__HANDLE__)->Mask = 0x00FFU ;                                \

+      }                                                               \

+    }                                                                 \

+    else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_8B)     \

+    {                                                                 \

+      if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE)              \

+      {                                                               \

+        (__HANDLE__)->Mask = 0x00FFU ;                                \

+      }                                                               \

+      else                                                            \

+      {                                                               \

+        (__HANDLE__)->Mask = 0x007FU ;                                \

+      }                                                               \

+    }                                                                 \

+    else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_7B)     \

+    {                                                                 \

+      if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE)              \

+      {                                                               \

+        (__HANDLE__)->Mask = 0x007FU ;                                \

+      }                                                               \

+      else                                                            \

+      {                                                               \

+        (__HANDLE__)->Mask = 0x003FU ;                                \

+      }                                                               \

+    }                                                                 \

+    else                                                              \

+    {                                                                 \

+      (__HANDLE__)->Mask = 0x0000U;                                   \

+    }                                                                 \

+  } while(0U)

+

+/**

+  * @brief Ensure that UART frame length is valid.

+  * @param __LENGTH__ UART frame length.

+  * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid)

+  */

+#define IS_UART_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == UART_WORDLENGTH_7B) || \

+                                         ((__LENGTH__) == UART_WORDLENGTH_8B) || \

+                                         ((__LENGTH__) == UART_WORDLENGTH_9B))

+

+/**

+  * @brief Ensure that UART wake-up address length is valid.

+  * @param __ADDRESS__ UART wake-up address length.

+  * @retval SET (__ADDRESS__ is valid) or RESET (__ADDRESS__ is invalid)

+  */

+#define IS_UART_ADDRESSLENGTH_DETECT(__ADDRESS__) (((__ADDRESS__) == UART_ADDRESS_DETECT_4B) || \

+                                                   ((__ADDRESS__) == UART_ADDRESS_DETECT_7B))

+

+#if defined(USART_CR1_FIFOEN)

+/**

+  * @brief Ensure that UART TXFIFO threshold level is valid.

+  * @param __THRESHOLD__ UART TXFIFO threshold level.

+  * @retval SET (__THRESHOLD__ is valid) or RESET (__THRESHOLD__ is invalid)

+  */

+#define IS_UART_TXFIFO_THRESHOLD(__THRESHOLD__) (((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_1_8) || \

+                                                 ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_1_4) || \

+                                                 ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_1_2) || \

+                                                 ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_3_4) || \

+                                                 ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_7_8) || \

+                                                 ((__THRESHOLD__) == UART_TXFIFO_THRESHOLD_8_8))

+

+/**

+  * @brief Ensure that UART RXFIFO threshold level is valid.

+  * @param __THRESHOLD__ UART RXFIFO threshold level.

+  * @retval SET (__THRESHOLD__ is valid) or RESET (__THRESHOLD__ is invalid)

+  */

+#define IS_UART_RXFIFO_THRESHOLD(__THRESHOLD__) (((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_1_8) || \

+                                                 ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_1_4) || \

+                                                 ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_1_2) || \

+                                                 ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_3_4) || \

+                                                 ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_7_8) || \

+                                                 ((__THRESHOLD__) == UART_RXFIFO_THRESHOLD_8_8))

+#endif /* USART_CR1_FIFOEN */

+

+/**

+  * @}

+  */

+

+/* Private functions ---------------------------------------------------------*/

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* STM32L4xx_HAL_UART_EX_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_usb.h b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_usb.h
new file mode 100644
index 0000000..ac9c7bd
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_usb.h
@@ -0,0 +1,652 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_ll_usb.h

+  * @author  MCD Application Team

+  * @brief   Header file of USB Low Layer HAL module.

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Define to prevent recursive inclusion -------------------------------------*/

+#ifndef STM32L4xx_LL_USB_H

+#define STM32L4xx_LL_USB_H

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal_def.h"

+

+#if defined (USB) || defined (USB_OTG_FS)

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup USB_LL

+  * @{

+  */

+

+/* Exported types ------------------------------------------------------------*/

+

+/**

+  * @brief  USB Mode definition

+  */

+#if defined (USB_OTG_FS)

+

+typedef enum

+{

+  USB_DEVICE_MODE  = 0,

+  USB_HOST_MODE    = 1,

+  USB_DRD_MODE     = 2

+} USB_ModeTypeDef;

+

+/**

+  * @brief  URB States definition

+  */

+typedef enum

+{

+  URB_IDLE = 0,

+  URB_DONE,

+  URB_NOTREADY,

+  URB_NYET,

+  URB_ERROR,

+  URB_STALL

+} USB_OTG_URBStateTypeDef;

+

+/**

+  * @brief  Host channel States  definition

+  */

+typedef enum

+{

+  HC_IDLE = 0,

+  HC_XFRC,

+  HC_HALTED,

+  HC_NAK,

+  HC_NYET,

+  HC_STALL,

+  HC_XACTERR,

+  HC_BBLERR,

+  HC_DATATGLERR

+} USB_OTG_HCStateTypeDef;

+

+/**

+  * @brief  USB OTG Initialization Structure definition

+  */

+typedef struct

+{

+  uint32_t dev_endpoints;           /*!< Device Endpoints number.

+                                         This parameter depends on the used USB core.

+                                         This parameter must be a number between Min_Data = 1 and Max_Data = 15 */

+

+  uint32_t Host_channels;           /*!< Host Channels number.

+                                         This parameter Depends on the used USB core.

+                                         This parameter must be a number between Min_Data = 1 and Max_Data = 15 */

+

+  uint32_t speed;                   /*!< USB Core speed.

+                                         This parameter can be any value of @ref USB_Core_Speed_                */

+

+  uint32_t dma_enable;              /*!< Enable or disable of the USB embedded DMA used only for OTG HS.        */

+

+  uint32_t ep0_mps;                 /*!< Set the Endpoint 0 Max Packet size.                                    */

+

+  uint32_t phy_itface;              /*!< Select the used PHY interface.

+                                         This parameter can be any value of @ref USB_Core_PHY_                  */

+

+  uint32_t Sof_enable;              /*!< Enable or disable the output of the SOF signal.                        */

+

+  uint32_t low_power_enable;        /*!< Enable or disable the low power mode.                                  */

+

+  uint32_t lpm_enable;              /*!< Enable or disable Link Power Management.                               */

+

+  uint32_t battery_charging_enable; /*!< Enable or disable Battery charging.                                    */

+

+  uint32_t vbus_sensing_enable;     /*!< Enable or disable the VBUS Sensing feature.                            */

+

+  uint32_t use_dedicated_ep1;       /*!< Enable or disable the use of the dedicated EP1 interrupt.              */

+

+  uint32_t use_external_vbus;       /*!< Enable or disable the use of the external VBUS.                        */

+} USB_OTG_CfgTypeDef;

+

+typedef struct

+{

+  uint8_t   num;                  /*!< Endpoint number

+                                       This parameter must be a number between Min_Data = 1 and Max_Data = 15   */

+

+  uint8_t   is_in;                /*!< Endpoint direction

+                                       This parameter must be a number between Min_Data = 0 and Max_Data = 1    */

+

+  uint8_t   is_stall;             /*!< Endpoint stall condition

+                                       This parameter must be a number between Min_Data = 0 and Max_Data = 1    */

+

+  uint8_t   type;                 /*!< Endpoint type

+                                       This parameter can be any value of @ref USB_EP_Type_                     */

+

+  uint8_t   data_pid_start;       /*!< Initial data PID

+                                       This parameter must be a number between Min_Data = 0 and Max_Data = 1    */

+

+  uint8_t   even_odd_frame;       /*!< IFrame parity

+                                       This parameter must be a number between Min_Data = 0 and Max_Data = 1    */

+

+  uint16_t  tx_fifo_num;          /*!< Transmission FIFO number

+                                       This parameter must be a number between Min_Data = 1 and Max_Data = 15   */

+

+  uint32_t  maxpacket;            /*!< Endpoint Max packet size

+                                       This parameter must be a number between Min_Data = 0 and Max_Data = 64KB */

+

+  uint8_t   *xfer_buff;           /*!< Pointer to transfer buffer                                               */

+

+  uint32_t  dma_addr;             /*!< 32 bits aligned transfer buffer address                                  */

+

+  uint32_t  xfer_len;             /*!< Current transfer length                                                  */

+

+  uint32_t  xfer_count;           /*!< Partial transfer length in case of multi packet transfer                 */

+} USB_OTG_EPTypeDef;

+

+typedef struct

+{

+  uint8_t   dev_addr ;          /*!< USB device address.

+                                     This parameter must be a number between Min_Data = 1 and Max_Data = 255    */

+

+  uint8_t   ch_num;             /*!< Host channel number.

+                                     This parameter must be a number between Min_Data = 1 and Max_Data = 15     */

+

+  uint8_t   ep_num;             /*!< Endpoint number.

+                                     This parameter must be a number between Min_Data = 1 and Max_Data = 15     */

+

+  uint8_t   ep_is_in;           /*!< Endpoint direction

+                                     This parameter must be a number between Min_Data = 0 and Max_Data = 1      */

+

+  uint8_t   speed;              /*!< USB Host speed.

+                                     This parameter can be any value of @ref USB_Core_Speed_                    */

+

+  uint8_t   do_ping;            /*!< Enable or disable the use of the PING protocol for HS mode.                */

+

+  uint8_t   process_ping;       /*!< Execute the PING protocol for HS mode.                                     */

+

+  uint8_t   ep_type;            /*!< Endpoint Type.

+                                     This parameter can be any value of @ref USB_EP_Type_                       */

+

+  uint16_t  max_packet;         /*!< Endpoint Max packet size.

+                                     This parameter must be a number between Min_Data = 0 and Max_Data = 64KB   */

+

+  uint8_t   data_pid;           /*!< Initial data PID.

+                                     This parameter must be a number between Min_Data = 0 and Max_Data = 1      */

+

+  uint8_t   *xfer_buff;         /*!< Pointer to transfer buffer.                                                */

+

+  uint32_t  xfer_len;           /*!< Current transfer length.                                                   */

+

+  uint32_t  xfer_count;         /*!< Partial transfer length in case of multi packet transfer.                  */

+

+  uint8_t   toggle_in;          /*!< IN transfer current toggle flag.

+                                     This parameter must be a number between Min_Data = 0 and Max_Data = 1      */

+

+  uint8_t   toggle_out;         /*!< OUT transfer current toggle flag

+                                     This parameter must be a number between Min_Data = 0 and Max_Data = 1      */

+

+  uint32_t  dma_addr;           /*!< 32 bits aligned transfer buffer address.                                   */

+

+  uint32_t  ErrCnt;             /*!< Host channel error count.*/

+

+  USB_OTG_URBStateTypeDef  urb_state;  /*!< URB state.

+                                            This parameter can be any value of @ref USB_OTG_URBStateTypeDef */

+

+  USB_OTG_HCStateTypeDef   state;     /*!< Host Channel state.

+                                           This parameter can be any value of @ref USB_OTG_HCStateTypeDef   */

+} USB_OTG_HCTypeDef;

+#endif /* defined (USB_OTG_FS) */

+

+#if defined (USB)

+

+typedef enum

+{

+  USB_DEVICE_MODE  = 0

+} USB_ModeTypeDef;

+

+/**

+  * @brief  USB Initialization Structure definition

+  */

+typedef struct

+{

+  uint32_t dev_endpoints;           /*!< Device Endpoints number.

+                                         This parameter depends on the used USB core.

+                                         This parameter must be a number between Min_Data = 1 and Max_Data = 15 */

+

+  uint32_t speed;                   /*!< USB Core speed.

+                                         This parameter can be any value of @ref USB_Core_Speed                 */

+

+  uint32_t ep0_mps;                 /*!< Set the Endpoint 0 Max Packet size.                                    */

+

+  uint32_t phy_itface;              /*!< Select the used PHY interface.

+                                         This parameter can be any value of @ref USB_Core_PHY                   */

+

+  uint32_t Sof_enable;              /*!< Enable or disable the output of the SOF signal.                        */

+

+  uint32_t low_power_enable;        /*!< Enable or disable Low Power mode                                       */

+

+  uint32_t lpm_enable;              /*!< Enable or disable Battery charging.                                    */

+

+  uint32_t battery_charging_enable; /*!< Enable or disable Battery charging.                                    */

+} USB_CfgTypeDef;

+

+typedef struct

+{

+  uint8_t   num;             /*!< Endpoint number

+                                  This parameter must be a number between Min_Data = 1 and Max_Data = 15    */

+

+  uint8_t   is_in;           /*!< Endpoint direction

+                                  This parameter must be a number between Min_Data = 0 and Max_Data = 1     */

+

+  uint8_t   is_stall;        /*!< Endpoint stall condition

+                                  This parameter must be a number between Min_Data = 0 and Max_Data = 1     */

+

+  uint8_t   type;            /*!< Endpoint type

+                                  This parameter can be any value of @ref USB_EP_Type                       */

+

+  uint8_t   data_pid_start;  /*!< Initial data PID

+                                  This parameter must be a number between Min_Data = 0 and Max_Data = 1     */

+

+  uint16_t  pmaadress;       /*!< PMA Address

+                                  This parameter can be any value between Min_addr = 0 and Max_addr = 1K    */

+

+  uint16_t  pmaaddr0;        /*!< PMA Address0

+                                  This parameter can be any value between Min_addr = 0 and Max_addr = 1K    */

+

+  uint16_t  pmaaddr1;        /*!< PMA Address1

+                                  This parameter can be any value between Min_addr = 0 and Max_addr = 1K    */

+

+  uint8_t   doublebuffer;    /*!< Double buffer enable

+                                  This parameter can be 0 or 1                                              */

+

+  uint16_t  tx_fifo_num;     /*!< This parameter is not required by USB Device FS peripheral, it is used

+                                  only by USB OTG FS peripheral

+                                  This parameter is added to ensure compatibility across USB peripherals    */

+

+  uint32_t  maxpacket;       /*!< Endpoint Max packet size

+                                  This parameter must be a number between Min_Data = 0 and Max_Data = 64KB  */

+

+  uint8_t   *xfer_buff;      /*!< Pointer to transfer buffer                                                */

+

+  uint32_t  xfer_len;        /*!< Current transfer length                                                   */

+

+  uint32_t  xfer_count;      /*!< Partial transfer length in case of multi packet transfer                  */

+

+} USB_EPTypeDef;

+#endif /* defined (USB) */

+

+/* Exported constants --------------------------------------------------------*/

+

+/** @defgroup PCD_Exported_Constants PCD Exported Constants

+  * @{

+  */

+

+#if defined (USB_OTG_FS)

+/** @defgroup USB_OTG_CORE VERSION ID

+  * @{

+  */

+#define USB_OTG_CORE_ID_300A          0x4F54300AU

+#define USB_OTG_CORE_ID_310A          0x4F54310AU

+/**

+  * @}

+  */

+

+/** @defgroup USB_Core_Mode_ USB Core Mode

+  * @{

+  */

+#define USB_OTG_MODE_DEVICE                    0U

+#define USB_OTG_MODE_HOST                      1U

+#define USB_OTG_MODE_DRD                       2U

+/**

+  * @}

+  */

+

+/** @defgroup USB_LL Device Speed

+  * @{

+  */

+#define USBD_FS_SPEED               2U

+#define USBH_FS_SPEED               1U

+/**

+  * @}

+  */

+

+/** @defgroup USB_LL_Core_Speed USB Low Layer Core Speed

+  * @{

+  */

+#define USB_OTG_SPEED_FULL                     3U

+/**

+  * @}

+  */

+

+/** @defgroup USB_LL_Core_PHY USB Low Layer Core PHY

+  * @{

+  */

+#define USB_OTG_ULPI_PHY                       1U

+#define USB_OTG_EMBEDDED_PHY                   2U

+/**

+  * @}

+  */

+

+/** @defgroup USB_LL_Turnaround_Timeout Turnaround Timeout Value

+  * @{

+  */

+#ifndef USBD_FS_TRDT_VALUE

+#define USBD_FS_TRDT_VALUE           5U

+#define USBD_DEFAULT_TRDT_VALUE      9U

+#endif /* USBD_HS_TRDT_VALUE */

+/**

+  * @}

+  */

+

+/** @defgroup USB_LL_Core_MPS USB Low Layer Core MPS

+  * @{

+  */

+#define USB_OTG_FS_MAX_PACKET_SIZE             64U

+#define USB_OTG_MAX_EP0_SIZE                   64U

+/**

+  * @}

+  */

+

+/** @defgroup USB_LL_Core_PHY_Frequency USB Low Layer Core PHY Frequency

+  * @{

+  */

+#define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ     (0U << 1)

+#define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ     (1U << 1)

+#define DSTS_ENUMSPD_LS_PHY_6MHZ               (2U << 1)

+#define DSTS_ENUMSPD_FS_PHY_48MHZ              (3U << 1)

+/**

+  * @}

+  */

+

+/** @defgroup USB_LL_CORE_Frame_Interval USB Low Layer Core Frame Interval

+  * @{

+  */

+#define DCFG_FRAME_INTERVAL_80                 0U

+#define DCFG_FRAME_INTERVAL_85                 1U

+#define DCFG_FRAME_INTERVAL_90                 2U

+#define DCFG_FRAME_INTERVAL_95                 3U

+/**

+  * @}

+  */

+

+/** @defgroup USB_LL_EP0_MPS USB Low Layer EP0 MPS

+  * @{

+  */

+#define DEP0CTL_MPS_64                         0U

+#define DEP0CTL_MPS_32                         1U

+#define DEP0CTL_MPS_16                         2U

+#define DEP0CTL_MPS_8                          3U

+/**

+  * @}

+  */

+

+/** @defgroup USB_LL_EP_Speed USB Low Layer EP Speed

+  * @{

+  */

+#define EP_SPEED_LOW                           0U

+#define EP_SPEED_FULL                          1U

+#define EP_SPEED_HIGH                          2U

+/**

+  * @}

+  */

+

+/** @defgroup USB_LL_EP_Type USB Low Layer EP Type

+  * @{

+  */

+#define EP_TYPE_CTRL                           0U

+#define EP_TYPE_ISOC                           1U

+#define EP_TYPE_BULK                           2U

+#define EP_TYPE_INTR                           3U

+#define EP_TYPE_MSK                            3U

+/**

+  * @}

+  */

+

+/** @defgroup USB_LL_STS_Defines USB Low Layer STS Defines

+  * @{

+  */

+#define STS_GOUT_NAK                           1U

+#define STS_DATA_UPDT                          2U

+#define STS_XFER_COMP                          3U

+#define STS_SETUP_COMP                         4U

+#define STS_SETUP_UPDT                         6U

+/**

+  * @}

+  */

+

+/** @defgroup USB_LL_HCFG_SPEED_Defines USB Low Layer HCFG Speed Defines

+  * @{

+  */

+#define HCFG_30_60_MHZ                         0U

+#define HCFG_48_MHZ                            1U

+#define HCFG_6_MHZ                             2U

+/**

+  * @}

+  */

+

+/** @defgroup USB_LL_HPRT0_PRTSPD_SPEED_Defines USB Low Layer HPRT0 PRTSPD Speed Defines

+  * @{

+  */

+#define HPRT0_PRTSPD_HIGH_SPEED                0U

+#define HPRT0_PRTSPD_FULL_SPEED                1U

+#define HPRT0_PRTSPD_LOW_SPEED                 2U

+/**

+  * @}

+  */

+

+#define HCCHAR_CTRL                            0U

+#define HCCHAR_ISOC                            1U

+#define HCCHAR_BULK                            2U

+#define HCCHAR_INTR                            3U

+

+#define HC_PID_DATA0                           0U

+#define HC_PID_DATA2                           1U

+#define HC_PID_DATA1                           2U

+#define HC_PID_SETUP                           3U

+

+#define GRXSTS_PKTSTS_IN                       2U

+#define GRXSTS_PKTSTS_IN_XFER_COMP             3U

+#define GRXSTS_PKTSTS_DATA_TOGGLE_ERR          5U

+#define GRXSTS_PKTSTS_CH_HALTED                7U

+

+#define USBx_PCGCCTL    *(__IO uint32_t *)((uint32_t)USBx_BASE + USB_OTG_PCGCCTL_BASE)

+#define USBx_HPRT0      *(__IO uint32_t *)((uint32_t)USBx_BASE + USB_OTG_HOST_PORT_BASE)

+

+#define USBx_DEVICE     ((USB_OTG_DeviceTypeDef *)(USBx_BASE + USB_OTG_DEVICE_BASE))

+#define USBx_INEP(i)    ((USB_OTG_INEndpointTypeDef *)(USBx_BASE + USB_OTG_IN_ENDPOINT_BASE + ((i) * USB_OTG_EP_REG_SIZE)))

+#define USBx_OUTEP(i)   ((USB_OTG_OUTEndpointTypeDef *)(USBx_BASE + USB_OTG_OUT_ENDPOINT_BASE + ((i) * USB_OTG_EP_REG_SIZE)))

+#define USBx_DFIFO(i)   *(__IO uint32_t *)(USBx_BASE + USB_OTG_FIFO_BASE + ((i) * USB_OTG_FIFO_SIZE))

+

+#define USBx_HOST       ((USB_OTG_HostTypeDef *)(USBx_BASE + USB_OTG_HOST_BASE))

+#define USBx_HC(i)      ((USB_OTG_HostChannelTypeDef *)(USBx_BASE + USB_OTG_HOST_CHANNEL_BASE + ((i) * USB_OTG_HOST_CHANNEL_SIZE)))

+#endif /* defined (USB_OTG_FS) */

+

+#if defined (USB)

+/** @defgroup USB_LL_EP0_MPS USB Low Layer EP0 MPS

+  * @{

+  */

+#define DEP0CTL_MPS_64                         0U

+#define DEP0CTL_MPS_32                         1U

+#define DEP0CTL_MPS_16                         2U

+#define DEP0CTL_MPS_8                          3U

+/**

+  * @}

+  */

+

+/** @defgroup USB_LL_EP_Type USB Low Layer EP Type

+  * @{

+  */

+#define EP_TYPE_CTRL                           0U

+#define EP_TYPE_ISOC                           1U

+#define EP_TYPE_BULK                           2U

+#define EP_TYPE_INTR                           3U

+#define EP_TYPE_MSK                            3U

+/**

+  * @}

+  */

+

+/** @defgroup USB_LL Device Speed

+  * @{

+  */

+#define USBD_FS_SPEED                          2U

+/**

+  * @}

+  */

+

+#define BTABLE_ADDRESS                         0x000U

+#define PMA_ACCESS                             1U

+#endif /* defined (USB) */

+#if defined (USB_OTG_FS)

+#define EP_ADDR_MSK                            0xFU

+#endif /* defined (USB_OTG_FS) */

+#if defined (USB)

+#define EP_ADDR_MSK                            0x7U

+#endif /* defined (USB) */

+/**

+  * @}

+  */

+

+/* Exported macro ------------------------------------------------------------*/

+/** @defgroup USB_LL_Exported_Macros USB Low Layer Exported Macros

+  * @{

+  */

+#if defined (USB_OTG_FS)

+#define USB_MASK_INTERRUPT(__INSTANCE__, __INTERRUPT__)     ((__INSTANCE__)->GINTMSK &= ~(__INTERRUPT__))

+#define USB_UNMASK_INTERRUPT(__INSTANCE__, __INTERRUPT__)   ((__INSTANCE__)->GINTMSK |= (__INTERRUPT__))

+

+#define CLEAR_IN_EP_INTR(__EPNUM__, __INTERRUPT__)          (USBx_INEP(__EPNUM__)->DIEPINT = (__INTERRUPT__))

+#define CLEAR_OUT_EP_INTR(__EPNUM__, __INTERRUPT__)         (USBx_OUTEP(__EPNUM__)->DOEPINT = (__INTERRUPT__))

+#endif /* defined (USB_OTG_FS) */

+/**

+  * @}

+  */

+

+/* Exported functions --------------------------------------------------------*/

+/** @addtogroup USB_LL_Exported_Functions USB Low Layer Exported Functions

+  * @{

+  */

+#if defined (USB_OTG_FS)

+HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg);

+HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg);

+HAL_StatusTypeDef USB_EnableGlobalInt(USB_OTG_GlobalTypeDef *USBx);

+HAL_StatusTypeDef USB_DisableGlobalInt(USB_OTG_GlobalTypeDef *USBx);

+HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, uint32_t hclk, uint8_t speed);

+HAL_StatusTypeDef USB_SetCurrentMode(USB_OTG_GlobalTypeDef *USBx, USB_ModeTypeDef mode);

+HAL_StatusTypeDef USB_SetDevSpeed(USB_OTG_GlobalTypeDef *USBx, uint8_t speed);

+HAL_StatusTypeDef USB_FlushRxFifo(USB_OTG_GlobalTypeDef *USBx);

+HAL_StatusTypeDef USB_FlushTxFifo(USB_OTG_GlobalTypeDef *USBx, uint32_t num);

+HAL_StatusTypeDef USB_ActivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep);

+HAL_StatusTypeDef USB_DeactivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep);

+HAL_StatusTypeDef USB_ActivateDedicatedEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep);

+HAL_StatusTypeDef USB_DeactivateDedicatedEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep);

+HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep);

+HAL_StatusTypeDef USB_EP0StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep);

+HAL_StatusTypeDef USB_WritePacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *src, uint8_t ch_ep_num, uint16_t len);

+void             *USB_ReadPacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len);

+HAL_StatusTypeDef USB_EPSetStall(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep);

+HAL_StatusTypeDef USB_EPClearStall(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep);

+HAL_StatusTypeDef USB_SetDevAddress(USB_OTG_GlobalTypeDef *USBx, uint8_t address);

+HAL_StatusTypeDef USB_DevConnect(USB_OTG_GlobalTypeDef *USBx);

+HAL_StatusTypeDef USB_DevDisconnect(USB_OTG_GlobalTypeDef *USBx);

+HAL_StatusTypeDef USB_StopDevice(USB_OTG_GlobalTypeDef *USBx);

+HAL_StatusTypeDef USB_ActivateSetup(USB_OTG_GlobalTypeDef *USBx);

+HAL_StatusTypeDef USB_EP0_OutStart(USB_OTG_GlobalTypeDef *USBx, uint8_t *psetup);

+uint8_t           USB_GetDevSpeed(USB_OTG_GlobalTypeDef *USBx);

+uint32_t          USB_GetMode(USB_OTG_GlobalTypeDef *USBx);

+uint32_t          USB_ReadInterrupts(USB_OTG_GlobalTypeDef *USBx);

+uint32_t          USB_ReadDevAllOutEpInterrupt(USB_OTG_GlobalTypeDef *USBx);

+uint32_t          USB_ReadDevOutEPInterrupt(USB_OTG_GlobalTypeDef *USBx, uint8_t epnum);

+uint32_t          USB_ReadDevAllInEpInterrupt(USB_OTG_GlobalTypeDef *USBx);

+uint32_t          USB_ReadDevInEPInterrupt(USB_OTG_GlobalTypeDef *USBx, uint8_t epnum);

+void              USB_ClearInterrupts(USB_OTG_GlobalTypeDef *USBx, uint32_t interrupt);

+

+HAL_StatusTypeDef USB_HostInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg);

+HAL_StatusTypeDef USB_InitFSLSPClkSel(USB_OTG_GlobalTypeDef *USBx, uint8_t freq);

+HAL_StatusTypeDef USB_ResetPort(USB_OTG_GlobalTypeDef *USBx);

+HAL_StatusTypeDef USB_DriveVbus(USB_OTG_GlobalTypeDef *USBx, uint8_t state);

+uint32_t          USB_GetHostSpeed(USB_OTG_GlobalTypeDef *USBx);

+uint32_t          USB_GetCurrentFrame(USB_OTG_GlobalTypeDef *USBx);

+HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx,

+                              uint8_t ch_num,

+                              uint8_t epnum,

+                              uint8_t dev_address,

+                              uint8_t speed,

+                              uint8_t ep_type,

+                              uint16_t mps);

+HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDef *hc);

+uint32_t          USB_HC_ReadInterrupt(USB_OTG_GlobalTypeDef *USBx);

+HAL_StatusTypeDef USB_HC_Halt(USB_OTG_GlobalTypeDef *USBx, uint8_t hc_num);

+HAL_StatusTypeDef USB_DoPing(USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num);

+HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx);

+HAL_StatusTypeDef USB_ActivateRemoteWakeup(USB_OTG_GlobalTypeDef *USBx);

+HAL_StatusTypeDef USB_DeActivateRemoteWakeup(USB_OTG_GlobalTypeDef *USBx);

+#endif /* defined (USB_OTG_FS) */

+

+#if defined (USB)

+HAL_StatusTypeDef USB_CoreInit(USB_TypeDef *USBx, USB_CfgTypeDef cfg);

+HAL_StatusTypeDef USB_DevInit(USB_TypeDef *USBx, USB_CfgTypeDef cfg);

+HAL_StatusTypeDef USB_EnableGlobalInt(USB_TypeDef *USBx);

+HAL_StatusTypeDef USB_DisableGlobalInt(USB_TypeDef *USBx);

+HAL_StatusTypeDef USB_SetCurrentMode(USB_TypeDef *USBx, USB_ModeTypeDef mode);

+HAL_StatusTypeDef USB_SetDevSpeed(USB_TypeDef *USBx, uint8_t speed);

+HAL_StatusTypeDef USB_FlushRxFifo(USB_TypeDef *USBx);

+HAL_StatusTypeDef USB_FlushTxFifo(USB_TypeDef *USBx, uint32_t num);

+HAL_StatusTypeDef USB_ActivateEndpoint(USB_TypeDef *USBx, USB_EPTypeDef *ep);

+HAL_StatusTypeDef USB_DeactivateEndpoint(USB_TypeDef *USBx, USB_EPTypeDef *ep);

+HAL_StatusTypeDef USB_EPStartXfer(USB_TypeDef *USBx, USB_EPTypeDef *ep);

+HAL_StatusTypeDef USB_WritePacket(USB_TypeDef *USBx, uint8_t *src, uint8_t ch_ep_num, uint16_t len);

+void             *USB_ReadPacket(USB_TypeDef *USBx, uint8_t *dest, uint16_t len);

+HAL_StatusTypeDef USB_EPSetStall(USB_TypeDef *USBx, USB_EPTypeDef *ep);

+HAL_StatusTypeDef USB_EPClearStall(USB_TypeDef *USBx, USB_EPTypeDef *ep);

+HAL_StatusTypeDef USB_SetDevAddress(USB_TypeDef *USBx, uint8_t address);

+HAL_StatusTypeDef USB_DevConnect(USB_TypeDef *USBx);

+HAL_StatusTypeDef USB_DevDisconnect(USB_TypeDef *USBx);

+HAL_StatusTypeDef USB_StopDevice(USB_TypeDef *USBx);

+HAL_StatusTypeDef USB_EP0_OutStart(USB_TypeDef *USBx, uint8_t *psetup);

+uint32_t          USB_ReadInterrupts(USB_TypeDef *USBx);

+uint32_t          USB_ReadDevAllOutEpInterrupt(USB_TypeDef *USBx);

+uint32_t          USB_ReadDevOutEPInterrupt(USB_TypeDef *USBx, uint8_t epnum);

+uint32_t          USB_ReadDevAllInEpInterrupt(USB_TypeDef *USBx);

+uint32_t          USB_ReadDevInEPInterrupt(USB_TypeDef *USBx, uint8_t epnum);

+void              USB_ClearInterrupts(USB_TypeDef *USBx, uint32_t interrupt);

+

+HAL_StatusTypeDef USB_ActivateRemoteWakeup(USB_TypeDef *USBx);

+HAL_StatusTypeDef USB_DeActivateRemoteWakeup(USB_TypeDef *USBx);

+void USB_WritePMA(USB_TypeDef  *USBx, uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes);

+void USB_ReadPMA(USB_TypeDef  *USBx, uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes);

+#endif /* defined (USB) */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+#endif /* defined (USB) || defined (USB_OTG_FS) */

+

+#ifdef __cplusplus

+}

+#endif

+

+

+#endif /* STM32L4xx_LL_USB_H */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c
new file mode 100644
index 0000000..1f8e5c5
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c
@@ -0,0 +1,758 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal.c

+  * @author  MCD Application Team

+  * @brief   HAL module driver.

+  *          This is the common part of the HAL initialization

+  *

+  @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

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup HAL HAL

+  * @brief HAL module driver

+  * @{

+  */

+

+#ifdef HAL_MODULE_ENABLED

+

+/* Private typedef -----------------------------------------------------------*/

+/* Private define ------------------------------------------------------------*/

+/**

+ * @brief STM32L4xx HAL Driver version number

+   */

+#define STM32L4XX_HAL_VERSION_MAIN   (0x01U) /*!< [31:24] main version */

+#define STM32L4XX_HAL_VERSION_SUB1   (0x0AU) /*!< [23:16] sub1 version */

+#define STM32L4XX_HAL_VERSION_SUB2   (0x00U) /*!< [15:8]  sub2 version */

+#define STM32L4XX_HAL_VERSION_RC     (0x00U) /*!< [7:0]  release candidate */

+#define STM32L4XX_HAL_VERSION        ((STM32L4XX_HAL_VERSION_MAIN  << 24U)\

+                                      |(STM32L4XX_HAL_VERSION_SUB1 << 16U)\

+                                      |(STM32L4XX_HAL_VERSION_SUB2 << 8U)\

+                                      |(STM32L4XX_HAL_VERSION_RC))

+

+#if defined(VREFBUF)

+#define VREFBUF_TIMEOUT_VALUE     10U   /* 10 ms (to be confirmed) */

+#endif /* VREFBUF */

+

+/* ------------ SYSCFG registers bit address in the alias region ------------ */

+#define SYSCFG_OFFSET             (SYSCFG_BASE - PERIPH_BASE)

+/* ---  MEMRMP Register ---*/

+/* Alias word address of FB_MODE bit */

+#define MEMRMP_OFFSET             SYSCFG_OFFSET

+#define FB_MODE_BitNumber         8U

+#define FB_MODE_BB                (PERIPH_BB_BASE + (MEMRMP_OFFSET * 32U) + (FB_MODE_BitNumber * 4U))

+

+/* --- SCSR Register ---*/

+/* Alias word address of SRAM2ER bit */

+#define SCSR_OFFSET               (SYSCFG_OFFSET + 0x18U)

+#define BRER_BitNumber            0U

+#define SCSR_SRAM2ER_BB           (PERIPH_BB_BASE + (SCSR_OFFSET * 32U) + (BRER_BitNumber * 4U))

+

+/* Private macro -------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/* Private function prototypes -----------------------------------------------*/

+

+/* Exported variables --------------------------------------------------------*/

+

+/** @defgroup HAL_Exported_Variables HAL Exported Variables

+  * @{

+  */

+__IO uint32_t uwTick;

+uint32_t uwTickPrio = (1UL << __NVIC_PRIO_BITS); /* Invalid priority */

+uint32_t uwTickFreq = HAL_TICK_FREQ_DEFAULT;  /* 1KHz */

+/**

+  * @}

+  */

+

+/* Exported 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 de-initialization functions #####

+ ===============================================================================

+    [..]  This section provides functions allowing to:

+      (+) Initialize the Flash interface, the NVIC allocation and initial time base

+          clock configuration.

+      (+) De-initialize 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  Configure the Flash prefetch, the Instruction and Data caches,

+  *         the time base source, NVIC and any required global low level hardware

+  *         by calling the HAL_MspInit() callback function to be optionally defined in user file

+  *         stm32l4xx_hal_msp.c.

+  *

+  * @note   HAL_Init() function is called at the beginning of program after reset and before

+  *         the clock configuration.

+  *

+  * @note   In the default implementation the System Timer (Systick) is used as source of time base.

+  *         The Systick configuration is based on MSI clock, as MSI is the clock

+  *         used after a system Reset and the NVIC configuration is set to Priority group 4.

+  *         Once done, time base tick starts incrementing: the tick variable counter is incremented

+  *         each 1ms in the SysTick_Handler() interrupt handler.

+  *

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_Init(void)

+{

+  HAL_StatusTypeDef  status = HAL_OK;

+

+  /* Configure Flash prefetch, Instruction cache, Data cache */

+  /* Default configuration at reset is:                      */

+  /* - Prefetch disabled                                     */

+  /* - Instruction cache enabled                             */

+  /* - Data cache enabled                                    */

+#if (INSTRUCTION_CACHE_ENABLE == 0)

+   __HAL_FLASH_INSTRUCTION_CACHE_DISABLE();

+#endif /* INSTRUCTION_CACHE_ENABLE */

+

+#if (DATA_CACHE_ENABLE == 0)

+   __HAL_FLASH_DATA_CACHE_DISABLE();

+#endif /* DATA_CACHE_ENABLE */

+

+#if (PREFETCH_ENABLE != 0)

+  __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 MSI) */

+  if (HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK)

+  {

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Init the low level hardware */

+    HAL_MspInit();

+  }

+

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief De-initialize common part of the HAL and stop the source of time base.

+  * @note 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  DeInitialize 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)

+{

+  HAL_StatusTypeDef  status = HAL_OK;

+

+  if (uwTickFreq != 0U)

+  {

+    /*Configure the SysTick to have interrupt in 1ms time basis*/

+    if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) == 0U)

+    {

+      /* Configure the SysTick IRQ priority */

+      if (TickPriority < (1UL << __NVIC_PRIO_BITS))

+      {

+        HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);

+        uwTickPrio = TickPriority;

+      }

+      else

+      {

+        status = HAL_ERROR;

+      }

+    }

+    else

+    {

+      status = HAL_ERROR;

+    }

+  }

+  else

+  {

+    status = HAL_ERROR;

+  }

+

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @}

+  */

+

+/** @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

+

+@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 Provide 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.

+  * @param Freq tick frequency

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_SetTickFreq(uint32_t Freq)

+{

+  HAL_StatusTypeDef status  = HAL_OK;

+  assert_param(IS_TICKFREQ(Freq));

+

+  if (uwTickFreq != Freq)

+  {

+    /* Apply the new tick Freq  */

+    status = HAL_InitTick(uwTickPrio);

+    if (status == HAL_OK)

+    {

+      uwTickFreq = Freq;

+    }

+  }

+

+  return status;

+}

+

+/**

+  * @brief Return tick frequency.

+  * @retval tick period in Hz

+  */

+uint32_t 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 period to guaranty 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  Return the HAL revision.

+  * @retval version : 0xXYZR (8bits for each decimal, R for RC)

+  */

+uint32_t HAL_GetHalVersion(void)

+{

+  return STM32L4XX_HAL_VERSION;

+}

+

+/**

+  * @brief  Return the device revision identifier.

+  * @retval Device revision identifier

+  */

+uint32_t HAL_GetREVID(void)

+{

+  return((DBGMCU->IDCODE & DBGMCU_IDCODE_REV_ID) >> 16);

+}

+

+/**

+  * @brief  Return the device identifier.

+  * @retval Device identifier

+  */

+uint32_t HAL_GetDEVID(void)

+{

+  return(DBGMCU->IDCODE & DBGMCU_IDCODE_DEV_ID);

+}

+

+/**

+  * @brief  Return the 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  Return the 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  Return the 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))));

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_Exported_Functions_Group3 HAL Debug functions

+ *  @brief    HAL Debug functions

+ *

+@verbatim

+ ===============================================================================

+                      ##### HAL Debug functions #####

+ ===============================================================================

+    [..]  This section provides functions allowing to:

+      (+) Enable/Disable Debug module during SLEEP mode

+      (+) Enable/Disable Debug module during STOP0/STOP1/STOP2 modes

+      (+) Enable/Disable Debug module during STANDBY mode

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @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 STOP0/STOP1/STOP2 modes.

+  * @retval None

+  */

+void HAL_DBGMCU_EnableDBGStopMode(void)

+{

+  SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP);

+}

+

+/**

+  * @brief  Disable the Debug Module during STOP0/STOP1/STOP2 modes.

+  * @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);

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup HAL_Exported_Functions_Group4 HAL SYSCFG configuration functions

+ *  @brief    HAL SYSCFG configuration functions

+ *

+@verbatim

+ ===============================================================================

+                      ##### HAL SYSCFG configuration functions #####

+ ===============================================================================

+    [..]  This section provides functions allowing to:

+      (+) Start a hardware SRAM2 erase operation

+      (+) Enable/Disable the Internal FLASH Bank Swapping

+      (+) Configure the Voltage reference buffer

+      (+) Enable/Disable the Voltage reference buffer

+      (+) Enable/Disable the I/O analog switch voltage booster

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Start a hardware SRAM2 erase operation.

+  * @note   As long as SRAM2 is not erased the SRAM2ER bit will be set.

+  *         This bit is automatically reset at the end of the SRAM2 erase operation.

+  * @retval None

+  */

+void HAL_SYSCFG_SRAM2Erase(void)

+{

+  /* unlock the write protection of the SRAM2ER bit */

+  SYSCFG->SKR = 0xCA;

+  SYSCFG->SKR = 0x53;

+  /* Starts a hardware SRAM2 erase operation*/

+  *(__IO uint32_t *) SCSR_SRAM2ER_BB = 0x00000001UL;

+}

+

+/**

+  * @brief  Enable the Internal FLASH Bank Swapping.

+  *

+  * @note   This function can be used only for STM32L4xx devices.

+  *

+  * @note   Flash Bank2 mapped at 0x08000000 (and aliased @0x00000000)

+  *         and Flash Bank1 mapped at 0x08100000 (and aliased at 0x00100000)

+  *

+  * @retval None

+  */

+void HAL_SYSCFG_EnableMemorySwappingBank(void)

+{

+  *(__IO uint32_t *)FB_MODE_BB = 0x00000001UL;

+}

+

+/**

+  * @brief  Disable the Internal FLASH Bank Swapping.

+  *

+  * @note   This function can be used only for STM32L4xx devices.

+  *

+  * @note   The default state : Flash Bank1 mapped at 0x08000000 (and aliased @0x0000 0000)

+  *         and Flash Bank2 mapped at 0x08100000 (and aliased at 0x00100000)

+  *

+  * @retval None

+  */

+void HAL_SYSCFG_DisableMemorySwappingBank(void)

+{

+

+  *(__IO uint32_t *)FB_MODE_BB = 0x00000000UL;

+}

+

+#if defined(VREFBUF)

+/**

+  * @brief Configure the internal voltage reference buffer voltage scale.

+  * @param VoltageScaling  specifies the output voltage to achieve

+  *          This parameter can be one of the following values:

+  *            @arg SYSCFG_VREFBUF_VOLTAGE_SCALE0: VREF_OUT1 around 2.048 V.

+  *                                                This requires VDDA equal to or higher than 2.4 V.

+  *            @arg SYSCFG_VREFBUF_VOLTAGE_SCALE1: VREF_OUT2 around 2.5 V.

+  *                                                This requires VDDA equal to or higher than 2.8 V.

+  * @retval None

+  */

+void HAL_SYSCFG_VREFBUF_VoltageScalingConfig(uint32_t VoltageScaling)

+{

+  /* Check the parameters */

+  assert_param(IS_SYSCFG_VREFBUF_VOLTAGE_SCALE(VoltageScaling));

+

+  MODIFY_REG(VREFBUF->CSR, VREFBUF_CSR_VRS, VoltageScaling);

+}

+

+/**

+  * @brief Configure the internal voltage reference buffer high impedance mode.

+  * @param Mode  specifies the high impedance mode

+  *          This parameter can be one of the following values:

+  *            @arg SYSCFG_VREFBUF_HIGH_IMPEDANCE_DISABLE: VREF+ pin is internally connect to VREFINT output.

+  *            @arg SYSCFG_VREFBUF_HIGH_IMPEDANCE_ENABLE: VREF+ pin is high impedance.

+  * @retval None

+  */

+void HAL_SYSCFG_VREFBUF_HighImpedanceConfig(uint32_t Mode)

+{

+  /* Check the parameters */

+  assert_param(IS_SYSCFG_VREFBUF_HIGH_IMPEDANCE(Mode));

+

+  MODIFY_REG(VREFBUF->CSR, VREFBUF_CSR_HIZ, Mode);

+}

+

+/**

+  * @brief  Tune the Internal Voltage Reference buffer (VREFBUF).

+  * @retval None

+  */

+void HAL_SYSCFG_VREFBUF_TrimmingConfig(uint32_t TrimmingValue)

+{

+  /* Check the parameters */

+  assert_param(IS_SYSCFG_VREFBUF_TRIMMING(TrimmingValue));

+

+  MODIFY_REG(VREFBUF->CCR, VREFBUF_CCR_TRIM, TrimmingValue);

+}

+

+/**

+  * @brief  Enable the Internal Voltage Reference buffer (VREFBUF).

+  * @retval HAL_OK/HAL_TIMEOUT

+  */

+HAL_StatusTypeDef HAL_SYSCFG_EnableVREFBUF(void)

+{

+  uint32_t  tickstart;

+

+  SET_BIT(VREFBUF->CSR, VREFBUF_CSR_ENVR);

+

+  /* Get Start Tick*/

+  tickstart = HAL_GetTick();

+

+  /* Wait for VRR bit  */

+  while(READ_BIT(VREFBUF->CSR, VREFBUF_CSR_VRR) == 0U)

+  {

+    if((HAL_GetTick() - tickstart) > VREFBUF_TIMEOUT_VALUE)

+    {

+      return HAL_TIMEOUT;

+    }

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Disable the Internal Voltage Reference buffer (VREFBUF).

+  *

+  * @retval None

+  */

+void HAL_SYSCFG_DisableVREFBUF(void)

+{

+  CLEAR_BIT(VREFBUF->CSR, VREFBUF_CSR_ENVR);

+}

+#endif /* VREFBUF */

+

+/**

+  * @brief  Enable the I/O analog switch voltage booster

+  *

+  * @retval None

+  */

+void HAL_SYSCFG_EnableIOAnalogSwitchBooster(void)

+{

+  SET_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_BOOSTEN);

+}

+

+/**

+  * @brief  Disable the I/O analog switch voltage booster

+  *

+  * @retval None

+  */

+void HAL_SYSCFG_DisableIOAnalogSwitchBooster(void)

+{

+  CLEAR_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_BOOSTEN);

+}

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#endif /* HAL_MODULE_ENABLED */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c
new file mode 100644
index 0000000..8080ad0
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c
@@ -0,0 +1,523 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_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 Configuration 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.

+    (#) Configure the priority of the selected IRQ Channels using HAL_NVIC_SetPriority().

+    (#) Enable the selected IRQ Channels using HAL_NVIC_EnableIRQ().

+

+     -@- When the NVIC_PRIORITYGROUP_0 is selected, IRQ pre-emption 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 pre-emption 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 stm32l4xx_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

+  ******************************************************************************

+

+  The table below gives the allowed values of the pre-emption priority and subpriority according

+  to the Priority Grouping configuration performed by HAL_NVIC_SetPriorityGrouping() function.

+

+    ==========================================================================================================================

+      NVIC_PriorityGroup   | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority  |       Description

+    ==========================================================================================================================

+     NVIC_PRIORITYGROUP_0  |                0                  |            0-15             | 0 bit for pre-emption priority

+                           |                                   |                             | 4 bits for subpriority

+    --------------------------------------------------------------------------------------------------------------------------

+     NVIC_PRIORITYGROUP_1  |                0-1                |            0-7              | 1 bit for pre-emption priority

+                           |                                   |                             | 3 bits for subpriority

+    --------------------------------------------------------------------------------------------------------------------------

+     NVIC_PRIORITYGROUP_2  |                0-3                |            0-3              | 2 bits for pre-emption priority

+                           |                                   |                             | 2 bits for subpriority

+    --------------------------------------------------------------------------------------------------------------------------

+     NVIC_PRIORITYGROUP_3  |                0-7                |            0-1              | 3 bits for pre-emption priority

+                           |                                   |                             | 1 bit for subpriority

+    --------------------------------------------------------------------------------------------------------------------------

+     NVIC_PRIORITYGROUP_4  |                0-15               |            0                | 4 bits for pre-emption priority

+                           |                                   |                             | 0 bit for subpriority

+    ==========================================================================================================================

+

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @addtogroup CORTEX

+  * @{

+  */

+

+#ifdef HAL_CORTEX_MODULE_ENABLED

+

+/* Private types -------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/* Private constants ---------------------------------------------------------*/

+/* Private macros ------------------------------------------------------------*/

+/* Private functions ---------------------------------------------------------*/

+/* Exported functions --------------------------------------------------------*/

+

+/** @addtogroup CORTEX_Exported_Functions

+  * @{

+  */

+

+

+/** @addtogroup CORTEX_Exported_Functions_Group1

+ *  @brief    Initialization and Configuration functions

+ *

+@verbatim

+  ==============================================================================

+              ##### Initialization and Configuration functions #####

+  ==============================================================================

+    [..]

+      This section provides the CORTEX HAL driver functions allowing to configure Interrupts

+      SysTick functionalities

+

+@endverbatim

+  * @{

+  */

+

+

+/**

+  * @brief  Set the priority grouping field (pre-emption 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 bit  for pre-emption priority,

+  *                                    4 bits for subpriority

+  *         @arg NVIC_PRIORITYGROUP_1: 1 bit  for pre-emption priority,

+  *                                    3 bits for subpriority

+  *         @arg NVIC_PRIORITYGROUP_2: 2 bits for pre-emption priority,

+  *                                    2 bits for subpriority

+  *         @arg NVIC_PRIORITYGROUP_3: 3 bits for pre-emption priority,

+  *                                    1 bit  for subpriority

+  *         @arg NVIC_PRIORITYGROUP_4: 4 bits for pre-emption priority,

+  *                                    0 bit  for subpriority

+  * @note   When the NVIC_PriorityGroup_0 is selected, IRQ pre-emption 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  Set 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 (stm32l4xxxx.h))

+  * @param  PreemptPriority: The pre-emption 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  Enable 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 (stm32l4xxxx.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  Disable 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 (stm32l4xxxx.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  Initiate a system reset request to reset the MCU.

+  * @retval None

+  */

+void HAL_NVIC_SystemReset(void)

+{

+  /* System Reset */

+  NVIC_SystemReset();

+}

+

+/**

+  * @brief  Initialize the System Timer with interrupt enabled and start the System Tick Timer (SysTick):

+  *         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);

+}

+/**

+  * @}

+  */

+

+/** @addtogroup CORTEX_Exported_Functions_Group2

+ *  @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

+  * @{

+  */

+

+/**

+  * @brief  Get 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  Get 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 (stm32l4xxxx.h))

+  * @param   PriorityGroup: the priority grouping bits length.

+  *         This parameter can be one of the following values:

+  *           @arg NVIC_PRIORITYGROUP_0: 0 bit for pre-emption priority,

+  *                                      4 bits for subpriority

+  *           @arg NVIC_PRIORITYGROUP_1: 1 bit for pre-emption priority,

+  *                                      3 bits for subpriority

+  *           @arg NVIC_PRIORITYGROUP_2: 2 bits for pre-emption priority,

+  *                                      2 bits for subpriority

+  *           @arg NVIC_PRIORITYGROUP_3: 3 bits for pre-emption priority,

+  *                                      1 bit for subpriority

+  *           @arg NVIC_PRIORITYGROUP_4: 4 bits for pre-emption priority,

+  *                                      0 bit 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  Set 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 (stm32l4xxxx.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  Get Pending Interrupt (read the pending register in the NVIC

+  *         and return 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 (stm32l4xxxx.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  Clear 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 (stm32l4xxxx.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 Get active interrupt (read the active register in NVIC and return 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 (stm32l4xxxx.h))

+  * @retval status: - 0  Interrupt status is not pending.

+  *                 - 1  Interrupt status is pending.

+  */

+uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn)

+{

+  /* Return 1 if active else 0 */

+  return NVIC_GetActive(IRQn);

+}

+

+/**

+  * @brief  Configure 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  Handle 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

+   */

+}

+

+#if (__MPU_PRESENT == 1)

+/**

+  * @brief  Disable 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 = 0U;

+}

+

+/**

+  * @brief  Enable the MPU.

+  * @param  MPU_Control: Specifies the control mode of the MPU during hard fault,

+  *          NMI, FAULTMASK and privileged accessto 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 settings take effects */

+  __DSB();

+  __ISB();

+}

+

+/**

+  * @brief  Initialize and configure 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 */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#endif /* HAL_CORTEX_MODULE_ENABLED */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dfsdm.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dfsdm.c
new file mode 100644
index 0000000..5675a39
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dfsdm.c
@@ -0,0 +1,3590 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_dfsdm.c

+  * @author  MCD Application Team

+  * @brief   This file provides firmware functions to manage the following

+  *          functionalities of the Digital Filter for Sigma-Delta Modulators

+  *          (DFSDM) peripherals:

+  *           + Initialization and configuration of channels and filters

+  *           + Regular channels configuration

+  *           + Injected channels configuration

+  *           + Regular/Injected Channels DMA Configuration

+  *           + Interrupts and flags management

+  *           + Analog watchdog feature

+  *           + Short-circuit detector feature

+  *           + Extremes detector feature

+  *           + Clock absence detector feature

+  *           + Break generation on analog watchdog or short-circuit event

+  *

+  @verbatim

+  ==============================================================================

+                     ##### How to use this driver #####

+  ==============================================================================

+  [..]

+    *** Channel initialization ***

+    ==============================

+    [..]

+      (#) User has first to initialize channels (before filters initialization).

+      (#) As prerequisite, fill in the HAL_DFSDM_ChannelMspInit() :

+        (++) Enable DFSDMz clock interface with __HAL_RCC_DFSDMz_CLK_ENABLE().

+        (++) Enable the clocks for the DFSDMz GPIOS with __HAL_RCC_GPIOx_CLK_ENABLE().

+        (++) Configure these DFSDMz pins in alternate mode using HAL_GPIO_Init().

+        (++) If interrupt mode is used, enable and configure DFSDMz_FLT0 global

+            interrupt with HAL_NVIC_SetPriority() and HAL_NVIC_EnableIRQ().

+      (#) Configure the output clock, input, serial interface, analog watchdog,

+          offset and data right bit shift parameters for this channel using the

+          HAL_DFSDM_ChannelInit() function.

+

+    *** Channel clock absence detector ***

+    ======================================

+    [..]

+      (#) Start clock absence detector using HAL_DFSDM_ChannelCkabStart() or

+          HAL_DFSDM_ChannelCkabStart_IT().

+      (#) In polling mode, use HAL_DFSDM_ChannelPollForCkab() to detect the clock

+          absence.

+      (#) In interrupt mode, HAL_DFSDM_ChannelCkabCallback() will be called if

+          clock absence is detected.

+      (#) Stop clock absence detector using HAL_DFSDM_ChannelCkabStop() or

+          HAL_DFSDM_ChannelCkabStop_IT().

+      (#) Please note that the same mode (polling or interrupt) has to be used

+          for all channels because the channels are sharing the same interrupt.

+      (#) Please note also that in interrupt mode, if clock absence detector is

+          stopped for one channel, interrupt will be disabled for all channels.

+

+    *** Channel short circuit detector ***

+    ======================================

+    [..]

+      (#) Start short circuit detector using HAL_DFSDM_ChannelScdStart() or

+          or HAL_DFSDM_ChannelScdStart_IT().

+      (#) In polling mode, use HAL_DFSDM_ChannelPollForScd() to detect short

+          circuit.

+      (#) In interrupt mode, HAL_DFSDM_ChannelScdCallback() will be called if

+          short circuit is detected.

+      (#) Stop short circuit detector using HAL_DFSDM_ChannelScdStop() or

+          or HAL_DFSDM_ChannelScdStop_IT().

+      (#) Please note that the same mode (polling or interrupt) has to be used

+          for all channels because the channels are sharing the same interrupt.

+      (#) Please note also that in interrupt mode, if short circuit detector is

+          stopped for one channel, interrupt will be disabled for all channels.

+

+    *** Channel analog watchdog value ***

+    =====================================

+    [..]

+      (#) Get analog watchdog filter value of a channel using

+          HAL_DFSDM_ChannelGetAwdValue().

+

+    *** Channel offset value ***

+    =====================================

+    [..]

+      (#) Modify offset value of a channel using HAL_DFSDM_ChannelModifyOffset().

+

+    *** Filter initialization ***

+    =============================

+    [..]

+      (#) After channel initialization, user has to init filters.

+      (#) As prerequisite, fill in the HAL_DFSDM_FilterMspInit() :

+        (++) If interrupt mode is used , enable and configure DFSDMz_FLTx global

+            interrupt with HAL_NVIC_SetPriority() and HAL_NVIC_EnableIRQ().

+            Please note that DFSDMz_FLT0 global interrupt could be already

+            enabled if interrupt is used for channel.

+        (++) If DMA mode is used, configure DMA with HAL_DMA_Init() and link it

+            with DFSDMz filter handle using __HAL_LINKDMA().

+      (#) Configure the regular conversion, injected conversion and filter

+          parameters for this filter using the HAL_DFSDM_FilterInit() function.

+

+    *** Filter regular channel conversion ***

+    =========================================

+    [..]

+      (#) Select regular channel and enable/disable continuous mode using

+          HAL_DFSDM_FilterConfigRegChannel().

+      (#) Start regular conversion using HAL_DFSDM_FilterRegularStart(),

+          HAL_DFSDM_FilterRegularStart_IT(), HAL_DFSDM_FilterRegularStart_DMA() or

+          HAL_DFSDM_FilterRegularMsbStart_DMA().

+      (#) In polling mode, use HAL_DFSDM_FilterPollForRegConversion() to detect

+          the end of regular conversion.

+      (#) In interrupt mode, HAL_DFSDM_FilterRegConvCpltCallback() will be called

+          at the end of regular conversion.

+      (#) Get value of regular conversion and corresponding channel using

+          HAL_DFSDM_FilterGetRegularValue().

+      (#) In DMA mode, HAL_DFSDM_FilterRegConvHalfCpltCallback() and

+          HAL_DFSDM_FilterRegConvCpltCallback() will be called respectively at the

+          half transfer and at the transfer complete. Please note that

+          HAL_DFSDM_FilterRegConvHalfCpltCallback() will be called only in DMA

+          circular mode.

+      (#) Stop regular conversion using HAL_DFSDM_FilterRegularStop(),

+          HAL_DFSDM_FilterRegularStop_IT() or HAL_DFSDM_FilterRegularStop_DMA().

+

+    *** Filter injected channels conversion ***

+    ===========================================

+    [..]

+      (#) Select injected channels using HAL_DFSDM_FilterConfigInjChannel().

+      (#) Start injected conversion using HAL_DFSDM_FilterInjectedStart(),

+          HAL_DFSDM_FilterInjectedStart_IT(), HAL_DFSDM_FilterInjectedStart_DMA() or

+          HAL_DFSDM_FilterInjectedMsbStart_DMA().

+      (#) In polling mode, use HAL_DFSDM_FilterPollForInjConversion() to detect

+          the end of injected conversion.

+      (#) In interrupt mode, HAL_DFSDM_FilterInjConvCpltCallback() will be called

+          at the end of injected conversion.

+      (#) Get value of injected conversion and corresponding channel using

+          HAL_DFSDM_FilterGetInjectedValue().

+      (#) In DMA mode, HAL_DFSDM_FilterInjConvHalfCpltCallback() and

+          HAL_DFSDM_FilterInjConvCpltCallback() will be called respectively at the

+          half transfer and at the transfer complete. Please note that

+          HAL_DFSDM_FilterInjConvCpltCallback() will be called only in DMA

+          circular mode.

+      (#) Stop injected conversion using HAL_DFSDM_FilterInjectedStop(),

+          HAL_DFSDM_FilterInjectedStop_IT() or HAL_DFSDM_FilterInjectedStop_DMA().

+

+    *** Filter analog watchdog ***

+    ==============================

+    [..]

+      (#) Start filter analog watchdog using HAL_DFSDM_FilterAwdStart_IT().

+      (#) HAL_DFSDM_FilterAwdCallback() will be called if analog watchdog occurs.

+      (#) Stop filter analog watchdog using HAL_DFSDM_FilterAwdStop_IT().

+

+    *** Filter extreme detector ***

+    ===============================

+    [..]

+      (#) Start filter extreme detector using HAL_DFSDM_FilterExdStart().

+      (#) Get extreme detector maximum value using HAL_DFSDM_FilterGetExdMaxValue().

+      (#) Get extreme detector minimum value using HAL_DFSDM_FilterGetExdMinValue().

+      (#) Start filter extreme detector using HAL_DFSDM_FilterExdStop().

+

+    *** Filter conversion time ***

+    ==============================

+    [..]

+      (#) Get conversion time value using HAL_DFSDM_FilterGetConvTimeValue().

+

+    *** Callback registration ***

+    =============================

+    [..]

+    The compilation define USE_HAL_DFSDM_REGISTER_CALLBACKS when set to 1

+    allows the user to configure dynamically the driver callbacks.

+    Use functions HAL_DFSDM_Channel_RegisterCallback(),

+    HAL_DFSDM_Filter_RegisterCallback() or

+    HAL_DFSDM_Filter_RegisterAwdCallback() to register a user callback.

+

+    [..]

+    Function HAL_DFSDM_Channel_RegisterCallback() allows to register

+    following callbacks:

+      (+) CkabCallback      : DFSDM channel clock absence detection callback.

+      (+) ScdCallback       : DFSDM channel short circuit detection callback.

+      (+) MspInitCallback   : DFSDM channel MSP init callback.

+      (+) MspDeInitCallback : DFSDM channel MSP de-init callback.

+    [..]

+    This function takes as parameters the HAL peripheral handle, the Callback ID

+    and a pointer to the user callback function.

+

+    [..]

+    Function HAL_DFSDM_Filter_RegisterCallback() allows to register

+    following callbacks:

+      (+) RegConvCpltCallback     : DFSDM filter regular conversion complete callback.

+      (+) RegConvHalfCpltCallback : DFSDM filter half regular conversion complete callback.

+      (+) InjConvCpltCallback     : DFSDM filter injected conversion complete callback.

+      (+) InjConvHalfCpltCallback : DFSDM filter half injected conversion complete callback.

+      (+) ErrorCallback           : DFSDM filter error callback.

+      (+) MspInitCallback         : DFSDM filter MSP init callback.

+      (+) MspDeInitCallback       : DFSDM filter MSP de-init callback.

+    [..]

+    This function takes as parameters the HAL peripheral handle, the Callback ID

+    and a pointer to the user callback function.

+

+    [..]

+    For specific DFSDM filter analog watchdog callback use dedicated register callback:

+    HAL_DFSDM_Filter_RegisterAwdCallback().

+

+    [..]

+    Use functions HAL_DFSDM_Channel_UnRegisterCallback() or

+    HAL_DFSDM_Filter_UnRegisterCallback() to reset a callback to the default

+    weak function.

+

+    [..]

+    HAL_DFSDM_Channel_UnRegisterCallback() takes as parameters the HAL peripheral handle,

+    and the Callback ID.

+    [..]

+    This function allows to reset following callbacks:

+      (+) CkabCallback      : DFSDM channel clock absence detection callback.

+      (+) ScdCallback       : DFSDM channel short circuit detection callback.

+      (+) MspInitCallback   : DFSDM channel MSP init callback.

+      (+) MspDeInitCallback : DFSDM channel MSP de-init callback.

+

+    [..]

+    HAL_DFSDM_Filter_UnRegisterCallback() takes as parameters the HAL peripheral handle,

+    and the Callback ID.

+    [..]

+    This function allows to reset following callbacks:

+      (+) RegConvCpltCallback     : DFSDM filter regular conversion complete callback.

+      (+) RegConvHalfCpltCallback : DFSDM filter half regular conversion complete callback.

+      (+) InjConvCpltCallback     : DFSDM filter injected conversion complete callback.

+      (+) InjConvHalfCpltCallback : DFSDM filter half injected conversion complete callback.

+      (+) ErrorCallback           : DFSDM filter error callback.

+      (+) MspInitCallback         : DFSDM filter MSP init callback.

+      (+) MspDeInitCallback       : DFSDM filter MSP de-init callback.

+

+    [..]

+    For specific DFSDM filter analog watchdog callback use dedicated unregister callback:

+    HAL_DFSDM_Filter_UnRegisterAwdCallback().

+

+    [..]

+    By default, after the call of init function and if the state is RESET

+    all callbacks are reset to the corresponding legacy weak functions:

+    examples HAL_DFSDM_ChannelScdCallback(), HAL_DFSDM_FilterErrorCallback().

+    Exception done for MspInit and MspDeInit callbacks that are respectively

+    reset to the legacy weak functions in the init and de-init only when these

+    callbacks are null (not registered beforehand).

+    If not, MspInit or MspDeInit are not null, the init and de-init keep and use

+    the user MspInit/MspDeInit callbacks (registered beforehand)

+

+    [..]

+    Callbacks can be registered/unregistered in READY state only.

+    Exception done for MspInit/MspDeInit callbacks that can be registered/unregistered

+    in READY or RESET state, thus registered (user) MspInit/DeInit callbacks can be used

+    during the init/de-init.

+    In that case first register the MspInit/MspDeInit user callbacks using

+    HAL_DFSDM_Channel_RegisterCallback() or

+    HAL_DFSDM_Filter_RegisterCallback() before calling init or de-init function.

+

+    [..]

+    When The compilation define USE_HAL_DFSDM_REGISTER_CALLBACKS is set to 0 or

+    not defined, the callback registering feature is not available

+    and weak callbacks are used.

+

+    @endverbatim

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+#ifdef HAL_DFSDM_MODULE_ENABLED

+

+#if defined(STM32L451xx) || defined(STM32L452xx) || defined(STM32L462xx) || \

+    defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx) || \

+    defined(STM32L496xx) || defined(STM32L4A6xx) || \

+    defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+

+/** @defgroup DFSDM DFSDM

+  * @brief DFSDM HAL driver module

+  * @{

+  */

+

+/* Private typedef -----------------------------------------------------------*/

+/* Private define ------------------------------------------------------------*/

+/** @defgroup DFSDM_Private_Define DFSDM Private Define

+ * @{

+ */

+#define DFSDM_FLTCR1_MSB_RCH_OFFSET     8

+#define DFSDM_MSB_MASK                  0xFFFF0000U

+#define DFSDM_LSB_MASK                  0x0000FFFFU

+#define DFSDM_CKAB_TIMEOUT              5000U

+#if defined(STM32L451xx) || defined(STM32L452xx) || defined(STM32L462xx)

+#define DFSDM1_CHANNEL_NUMBER           4U

+#else /* STM32L451xx || STM32L452xx || STM32L462xx */

+#define DFSDM1_CHANNEL_NUMBER           8U

+#endif /* STM32L451xx || STM32L452xx || STM32L462xx */

+/**

+  * @}

+  */

+

+/* Private macro -------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/** @defgroup DFSDM_Private_Variables DFSDM Private Variables

+  * @{

+  */

+static __IO uint32_t                v_dfsdm1ChannelCounter = 0;

+static DFSDM_Channel_HandleTypeDef *a_dfsdm1ChannelHandle[DFSDM1_CHANNEL_NUMBER] = {NULL};

+/**

+  * @}

+  */

+

+/* Private function prototypes -----------------------------------------------*/

+/** @defgroup DFSDM_Private_Functions DFSDM Private Functions

+  * @{

+  */

+static uint32_t DFSDM_GetInjChannelsNbr(uint32_t Channels);

+static uint32_t DFSDM_GetChannelFromInstance(const DFSDM_Channel_TypeDef *Instance);

+static void     DFSDM_RegConvStart(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+static void     DFSDM_RegConvStop(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+static void     DFSDM_InjConvStart(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+static void     DFSDM_InjConvStop(DFSDM_Filter_HandleTypeDef *hdfsdm_filter);

+static void     DFSDM_DMARegularHalfConvCplt(DMA_HandleTypeDef *hdma);

+static void     DFSDM_DMARegularConvCplt(DMA_HandleTypeDef *hdma);

+static void     DFSDM_DMAInjectedHalfConvCplt(DMA_HandleTypeDef *hdma);

+static void     DFSDM_DMAInjectedConvCplt(DMA_HandleTypeDef *hdma);

+static void     DFSDM_DMAError(DMA_HandleTypeDef *hdma);

+/**

+  * @}

+  */

+

+/* Exported functions --------------------------------------------------------*/

+/** @defgroup DFSDM_Exported_Functions DFSDM Exported Functions

+  * @{

+  */

+

+/** @defgroup DFSDM_Exported_Functions_Group1_Channel Channel initialization and de-initialization functions

+ *  @brief    Channel initialization and de-initialization functions

+ *

+@verbatim

+  ==============================================================================

+        ##### Channel initialization and de-initialization functions #####

+  ==============================================================================

+    [..]  This section provides functions allowing to:

+      (+) Initialize the DFSDM channel.

+      (+) De-initialize the DFSDM channel.

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Initialize the DFSDM channel according to the specified parameters

+  *         in the DFSDM_ChannelInitTypeDef structure and initialize the associated handle.

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @retval HAL status.

+  */

+HAL_StatusTypeDef HAL_DFSDM_ChannelInit(DFSDM_Channel_HandleTypeDef *hdfsdm_channel)

+{

+  /* Check DFSDM Channel handle */

+  if (hdfsdm_channel == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance));

+  assert_param(IS_FUNCTIONAL_STATE(hdfsdm_channel->Init.OutputClock.Activation));

+  assert_param(IS_DFSDM_CHANNEL_INPUT(hdfsdm_channel->Init.Input.Multiplexer));

+  assert_param(IS_DFSDM_CHANNEL_DATA_PACKING(hdfsdm_channel->Init.Input.DataPacking));

+  assert_param(IS_DFSDM_CHANNEL_INPUT_PINS(hdfsdm_channel->Init.Input.Pins));

+  assert_param(IS_DFSDM_CHANNEL_SERIAL_INTERFACE_TYPE(hdfsdm_channel->Init.SerialInterface.Type));

+  assert_param(IS_DFSDM_CHANNEL_SPI_CLOCK(hdfsdm_channel->Init.SerialInterface.SpiClock));

+  assert_param(IS_DFSDM_CHANNEL_FILTER_ORDER(hdfsdm_channel->Init.Awd.FilterOrder));

+  assert_param(IS_DFSDM_CHANNEL_FILTER_OVS_RATIO(hdfsdm_channel->Init.Awd.Oversampling));

+  assert_param(IS_DFSDM_CHANNEL_OFFSET(hdfsdm_channel->Init.Offset));

+  assert_param(IS_DFSDM_CHANNEL_RIGHT_BIT_SHIFT(hdfsdm_channel->Init.RightBitShift));

+

+  /* Check that channel has not been already initialized */

+  if (a_dfsdm1ChannelHandle[DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance)] != NULL)

+  {

+    return HAL_ERROR;

+  }

+

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+  /* Reset callback pointers to the weak predefined callbacks */

+  hdfsdm_channel->CkabCallback = HAL_DFSDM_ChannelCkabCallback;

+  hdfsdm_channel->ScdCallback  = HAL_DFSDM_ChannelScdCallback;

+

+  /* Call MSP init function */

+  if (hdfsdm_channel->MspInitCallback == NULL)

+  {

+    hdfsdm_channel->MspInitCallback = HAL_DFSDM_ChannelMspInit;

+  }

+  hdfsdm_channel->MspInitCallback(hdfsdm_channel);

+#else

+  /* Call MSP init function */

+  HAL_DFSDM_ChannelMspInit(hdfsdm_channel);

+#endif

+

+  /* Update the channel counter */

+  v_dfsdm1ChannelCounter++;

+

+  /* Configure output serial clock and enable global DFSDM interface only for first channel */

+  if (v_dfsdm1ChannelCounter == 1U)

+  {

+    assert_param(IS_DFSDM_CHANNEL_OUTPUT_CLOCK(hdfsdm_channel->Init.OutputClock.Selection));

+    /* Set the output serial clock source */

+    DFSDM1_Channel0->CHCFGR1 &= ~(DFSDM_CHCFGR1_CKOUTSRC);

+    DFSDM1_Channel0->CHCFGR1 |= hdfsdm_channel->Init.OutputClock.Selection;

+

+    /* Reset clock divider */

+    DFSDM1_Channel0->CHCFGR1 &= ~(DFSDM_CHCFGR1_CKOUTDIV);

+    if (hdfsdm_channel->Init.OutputClock.Activation == ENABLE)

+    {

+      assert_param(IS_DFSDM_CHANNEL_OUTPUT_CLOCK_DIVIDER(hdfsdm_channel->Init.OutputClock.Divider));

+      /* Set the output clock divider */

+      DFSDM1_Channel0->CHCFGR1 |= (uint32_t)((hdfsdm_channel->Init.OutputClock.Divider - 1U) <<

+                                             DFSDM_CHCFGR1_CKOUTDIV_Pos);

+    }

+

+    /* enable the DFSDM global interface */

+    DFSDM1_Channel0->CHCFGR1 |= DFSDM_CHCFGR1_DFSDMEN;

+  }

+

+  /* Set channel input parameters */

+  hdfsdm_channel->Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_DATPACK | DFSDM_CHCFGR1_DATMPX |

+                                         DFSDM_CHCFGR1_CHINSEL);

+  hdfsdm_channel->Instance->CHCFGR1 |= (hdfsdm_channel->Init.Input.Multiplexer |

+                                        hdfsdm_channel->Init.Input.DataPacking |

+                                        hdfsdm_channel->Init.Input.Pins);

+

+  /* Set serial interface parameters */

+  hdfsdm_channel->Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_SITP | DFSDM_CHCFGR1_SPICKSEL);

+  hdfsdm_channel->Instance->CHCFGR1 |= (hdfsdm_channel->Init.SerialInterface.Type |

+                                        hdfsdm_channel->Init.SerialInterface.SpiClock);

+

+  /* Set analog watchdog parameters */

+  hdfsdm_channel->Instance->CHAWSCDR &= ~(DFSDM_CHAWSCDR_AWFORD | DFSDM_CHAWSCDR_AWFOSR);

+  hdfsdm_channel->Instance->CHAWSCDR |= (hdfsdm_channel->Init.Awd.FilterOrder |

+                                         ((hdfsdm_channel->Init.Awd.Oversampling - 1U) << DFSDM_CHAWSCDR_AWFOSR_Pos));

+

+  /* Set channel offset and right bit shift */

+  hdfsdm_channel->Instance->CHCFGR2 &= ~(DFSDM_CHCFGR2_OFFSET | DFSDM_CHCFGR2_DTRBS);

+  hdfsdm_channel->Instance->CHCFGR2 |= (((uint32_t) hdfsdm_channel->Init.Offset << DFSDM_CHCFGR2_OFFSET_Pos) |

+                                        (hdfsdm_channel->Init.RightBitShift << DFSDM_CHCFGR2_DTRBS_Pos));

+

+  /* Enable DFSDM channel */

+  hdfsdm_channel->Instance->CHCFGR1 |= DFSDM_CHCFGR1_CHEN;

+

+  /* Set DFSDM Channel to ready state */

+  hdfsdm_channel->State = HAL_DFSDM_CHANNEL_STATE_READY;

+

+  /* Store channel handle in DFSDM channel handle table */

+  a_dfsdm1ChannelHandle[DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance)] = hdfsdm_channel;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  De-initialize the DFSDM channel.

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @retval HAL status.

+  */

+HAL_StatusTypeDef HAL_DFSDM_ChannelDeInit(DFSDM_Channel_HandleTypeDef *hdfsdm_channel)

+{

+  /* Check DFSDM Channel handle */

+  if (hdfsdm_channel == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance));

+

+  /* Check that channel has not been already deinitialized */

+  if (a_dfsdm1ChannelHandle[DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance)] == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Disable the DFSDM channel */

+  hdfsdm_channel->Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_CHEN);

+

+  /* Update the channel counter */

+  v_dfsdm1ChannelCounter--;

+

+  /* Disable global DFSDM at deinit of last channel */

+  if (v_dfsdm1ChannelCounter == 0U)

+  {

+    DFSDM1_Channel0->CHCFGR1 &= ~(DFSDM_CHCFGR1_DFSDMEN);

+  }

+

+  /* Call MSP deinit function */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+  if (hdfsdm_channel->MspDeInitCallback == NULL)

+  {

+    hdfsdm_channel->MspDeInitCallback = HAL_DFSDM_ChannelMspDeInit;

+  }

+  hdfsdm_channel->MspDeInitCallback(hdfsdm_channel);

+#else

+  HAL_DFSDM_ChannelMspDeInit(hdfsdm_channel);

+#endif

+

+  /* Set DFSDM Channel in reset state */

+  hdfsdm_channel->State = HAL_DFSDM_CHANNEL_STATE_RESET;

+

+  /* Reset channel handle in DFSDM channel handle table */

+  a_dfsdm1ChannelHandle[DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance)] = (DFSDM_Channel_HandleTypeDef *) NULL;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Initialize the DFSDM channel MSP.

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @retval None

+  */

+__weak void HAL_DFSDM_ChannelMspInit(DFSDM_Channel_HandleTypeDef *hdfsdm_channel)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hdfsdm_channel);

+

+  /* NOTE : This function should not be modified, when the function is needed,

+            the HAL_DFSDM_ChannelMspInit could be implemented in the user file.

+   */

+}

+

+/**

+  * @brief  De-initialize the DFSDM channel MSP.

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @retval None

+  */

+__weak void HAL_DFSDM_ChannelMspDeInit(DFSDM_Channel_HandleTypeDef *hdfsdm_channel)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hdfsdm_channel);

+

+  /* NOTE : This function should not be modified, when the function is needed,

+            the HAL_DFSDM_ChannelMspDeInit could be implemented in the user file.

+   */

+}

+

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+/**

+  * @brief  Register a user DFSDM channel callback

+  *         to be used instead of the weak predefined callback.

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @param  CallbackID ID of the callback to be registered.

+  *         This parameter can be one of the following values:

+  *           @arg @ref HAL_DFSDM_CHANNEL_CKAB_CB_ID clock absence detection callback ID.

+  *           @arg @ref HAL_DFSDM_CHANNEL_SCD_CB_ID short circuit detection callback ID.

+  *           @arg @ref HAL_DFSDM_CHANNEL_MSPINIT_CB_ID MSP init callback ID.

+  *           @arg @ref HAL_DFSDM_CHANNEL_MSPDEINIT_CB_ID MSP de-init callback ID.

+  * @param  pCallback pointer to the callback function.

+  * @retval HAL status.

+  */

+HAL_StatusTypeDef HAL_DFSDM_Channel_RegisterCallback(DFSDM_Channel_HandleTypeDef        *hdfsdm_channel,

+                                                     HAL_DFSDM_Channel_CallbackIDTypeDef CallbackID,

+                                                     pDFSDM_Channel_CallbackTypeDef      pCallback)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  if (pCallback == NULL)

+  {

+    /* update return status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    if (HAL_DFSDM_CHANNEL_STATE_READY == hdfsdm_channel->State)

+    {

+      switch (CallbackID)

+      {

+        case HAL_DFSDM_CHANNEL_CKAB_CB_ID :

+          hdfsdm_channel->CkabCallback = pCallback;

+          break;

+        case HAL_DFSDM_CHANNEL_SCD_CB_ID :

+          hdfsdm_channel->ScdCallback = pCallback;

+          break;

+        case HAL_DFSDM_CHANNEL_MSPINIT_CB_ID :

+          hdfsdm_channel->MspInitCallback = pCallback;

+          break;

+        case HAL_DFSDM_CHANNEL_MSPDEINIT_CB_ID :

+          hdfsdm_channel->MspDeInitCallback = pCallback;

+          break;

+        default :

+          /* update return status */

+          status = HAL_ERROR;

+          break;

+      }

+    }

+    else if (HAL_DFSDM_CHANNEL_STATE_RESET == hdfsdm_channel->State)

+    {

+      switch (CallbackID)

+      {

+        case HAL_DFSDM_CHANNEL_MSPINIT_CB_ID :

+          hdfsdm_channel->MspInitCallback = pCallback;

+          break;

+        case HAL_DFSDM_CHANNEL_MSPDEINIT_CB_ID :

+          hdfsdm_channel->MspDeInitCallback = pCallback;

+          break;

+        default :

+          /* update return status */

+          status = HAL_ERROR;

+          break;

+      }

+    }

+    else

+    {

+      /* update return status */

+      status = HAL_ERROR;

+    }

+  }

+  return status;

+}

+

+/**

+  * @brief  Unregister a user DFSDM channel callback.

+  *         DFSDM channel callback is redirected to the weak predefined callback.

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @param  CallbackID ID of the callback to be unregistered.

+  *         This parameter can be one of the following values:

+  *           @arg @ref HAL_DFSDM_CHANNEL_CKAB_CB_ID clock absence detection callback ID.

+  *           @arg @ref HAL_DFSDM_CHANNEL_SCD_CB_ID short circuit detection callback ID.

+  *           @arg @ref HAL_DFSDM_CHANNEL_MSPINIT_CB_ID MSP init callback ID.

+  *           @arg @ref HAL_DFSDM_CHANNEL_MSPDEINIT_CB_ID MSP de-init callback ID.

+  * @retval HAL status.

+  */

+HAL_StatusTypeDef HAL_DFSDM_Channel_UnRegisterCallback(DFSDM_Channel_HandleTypeDef        *hdfsdm_channel,

+                                                       HAL_DFSDM_Channel_CallbackIDTypeDef CallbackID)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  if (HAL_DFSDM_CHANNEL_STATE_READY == hdfsdm_channel->State)

+  {

+    switch (CallbackID)

+    {

+      case HAL_DFSDM_CHANNEL_CKAB_CB_ID :

+        hdfsdm_channel->CkabCallback = HAL_DFSDM_ChannelCkabCallback;

+        break;

+      case HAL_DFSDM_CHANNEL_SCD_CB_ID :

+        hdfsdm_channel->ScdCallback = HAL_DFSDM_ChannelScdCallback;

+        break;

+      case HAL_DFSDM_CHANNEL_MSPINIT_CB_ID :

+        hdfsdm_channel->MspInitCallback = HAL_DFSDM_ChannelMspInit;

+        break;

+      case HAL_DFSDM_CHANNEL_MSPDEINIT_CB_ID :

+        hdfsdm_channel->MspDeInitCallback = HAL_DFSDM_ChannelMspDeInit;

+        break;

+      default :

+        /* update return status */

+        status = HAL_ERROR;

+        break;

+    }

+  }

+  else if (HAL_DFSDM_CHANNEL_STATE_RESET == hdfsdm_channel->State)

+  {

+    switch (CallbackID)

+    {

+      case HAL_DFSDM_CHANNEL_MSPINIT_CB_ID :

+        hdfsdm_channel->MspInitCallback = HAL_DFSDM_ChannelMspInit;

+        break;

+      case HAL_DFSDM_CHANNEL_MSPDEINIT_CB_ID :

+        hdfsdm_channel->MspDeInitCallback = HAL_DFSDM_ChannelMspDeInit;

+        break;

+      default :

+        /* update return status */

+        status = HAL_ERROR;

+        break;

+    }

+  }

+  else

+  {

+    /* update return status */

+    status = HAL_ERROR;

+  }

+  return status;

+}

+#endif /* USE_HAL_DFSDM_REGISTER_CALLBACKS */

+

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Exported_Functions_Group2_Channel Channel operation functions

+ *  @brief    Channel operation functions

+ *

+@verbatim

+  ==============================================================================

+                   ##### Channel operation functions #####

+  ==============================================================================

+    [..]  This section provides functions allowing to:

+      (+) Manage clock absence detector feature.

+      (+) Manage short circuit detector feature.

+      (+) Get analog watchdog value.

+      (+) Modify offset value.

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  This function allows to start clock absence detection in polling mode.

+  * @note   Same mode has to be used for all channels.

+  * @note   If clock is not available on this channel during 5 seconds,

+  *         clock absence detection will not be activated and function

+  *         will return HAL_TIMEOUT error.

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_ChannelCkabStart(DFSDM_Channel_HandleTypeDef *hdfsdm_channel)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+  uint32_t channel;

+  uint32_t tickstart;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance));

+

+  /* Check DFSDM channel state */

+  if (hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY)

+  {

+    /* Return error status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Get channel number from channel instance */

+    channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance);

+

+    /* Get timeout */

+    tickstart = HAL_GetTick();

+

+    /* Clear clock absence flag */

+    while ((((DFSDM1_Filter0->FLTISR & DFSDM_FLTISR_CKABF) >> (DFSDM_FLTISR_CKABF_Pos + channel)) & 1U) != 0U)

+    {

+      DFSDM1_Filter0->FLTICR = (1UL << (DFSDM_FLTICR_CLRCKABF_Pos + channel));

+

+      /* Check the Timeout */

+      if ((HAL_GetTick() - tickstart) > DFSDM_CKAB_TIMEOUT)

+      {

+        /* Set timeout status */

+        status = HAL_TIMEOUT;

+        break;

+      }

+    }

+

+    if (status == HAL_OK)

+    {

+      /* Start clock absence detection */

+      hdfsdm_channel->Instance->CHCFGR1 |= DFSDM_CHCFGR1_CKABEN;

+    }

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to poll for the clock absence detection.

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @param  Timeout Timeout value in milliseconds.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_ChannelPollForCkab(DFSDM_Channel_HandleTypeDef *hdfsdm_channel,

+                                               uint32_t Timeout)

+{

+  uint32_t tickstart;

+  uint32_t channel;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance));

+

+  /* Check DFSDM channel state */

+  if (hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY)

+  {

+    /* Return error status */

+    return HAL_ERROR;

+  }

+  else

+  {

+    /* Get channel number from channel instance */

+    channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance);

+

+    /* Get timeout */

+    tickstart = HAL_GetTick();

+

+    /* Wait clock absence detection */

+    while ((((DFSDM1_Filter0->FLTISR & DFSDM_FLTISR_CKABF) >> (DFSDM_FLTISR_CKABF_Pos + channel)) & 1U) == 0U)

+    {

+      /* Check the Timeout */

+      if (Timeout != HAL_MAX_DELAY)

+      {

+        if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))

+        {

+          /* Return timeout status */

+          return HAL_TIMEOUT;

+        }

+      }

+    }

+

+    /* Clear clock absence detection flag */

+    DFSDM1_Filter0->FLTICR = (1UL << (DFSDM_FLTICR_CLRCKABF_Pos + channel));

+

+    /* Return function status */

+    return HAL_OK;

+  }

+}

+

+/**

+  * @brief  This function allows to stop clock absence detection in polling mode.

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_ChannelCkabStop(DFSDM_Channel_HandleTypeDef *hdfsdm_channel)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+  uint32_t channel;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance));

+

+  /* Check DFSDM channel state */

+  if (hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY)

+  {

+    /* Return error status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Stop clock absence detection */

+    hdfsdm_channel->Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_CKABEN);

+

+    /* Clear clock absence flag */

+    channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance);

+    DFSDM1_Filter0->FLTICR = (1UL << (DFSDM_FLTICR_CLRCKABF_Pos + channel));

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to start clock absence detection in interrupt mode.

+  * @note   Same mode has to be used for all channels.

+  * @note   If clock is not available on this channel during 5 seconds,

+  *         clock absence detection will not be activated and function

+  *         will return HAL_TIMEOUT error.

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_ChannelCkabStart_IT(DFSDM_Channel_HandleTypeDef *hdfsdm_channel)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+  uint32_t channel;

+  uint32_t tickstart;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance));

+

+  /* Check DFSDM channel state */

+  if (hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY)

+  {

+    /* Return error status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Get channel number from channel instance */

+    channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance);

+

+    /* Get timeout */

+    tickstart = HAL_GetTick();

+

+    /* Clear clock absence flag */

+    while ((((DFSDM1_Filter0->FLTISR & DFSDM_FLTISR_CKABF) >> (DFSDM_FLTISR_CKABF_Pos + channel)) & 1U) != 0U)

+    {

+      DFSDM1_Filter0->FLTICR = (1UL << (DFSDM_FLTICR_CLRCKABF_Pos + channel));

+

+      /* Check the Timeout */

+      if ((HAL_GetTick() - tickstart) > DFSDM_CKAB_TIMEOUT)

+      {

+        /* Set timeout status */

+        status = HAL_TIMEOUT;

+        break;

+      }

+    }

+

+    if (status == HAL_OK)

+    {

+      /* Activate clock absence detection interrupt */

+      DFSDM1_Filter0->FLTCR2 |= DFSDM_FLTCR2_CKABIE;

+

+      /* Start clock absence detection */

+      hdfsdm_channel->Instance->CHCFGR1 |= DFSDM_CHCFGR1_CKABEN;

+    }

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  Clock absence detection callback.

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @retval None

+  */

+__weak void HAL_DFSDM_ChannelCkabCallback(DFSDM_Channel_HandleTypeDef *hdfsdm_channel)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hdfsdm_channel);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_DFSDM_ChannelCkabCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  This function allows to stop clock absence detection in interrupt mode.

+  * @note   Interrupt will be disabled for all channels

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_ChannelCkabStop_IT(DFSDM_Channel_HandleTypeDef *hdfsdm_channel)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+  uint32_t channel;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance));

+

+  /* Check DFSDM channel state */

+  if (hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY)

+  {

+    /* Return error status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Stop clock absence detection */

+    hdfsdm_channel->Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_CKABEN);

+

+    /* Clear clock absence flag */

+    channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance);

+    DFSDM1_Filter0->FLTICR = (1UL << (DFSDM_FLTICR_CLRCKABF_Pos + channel));

+

+    /* Disable clock absence detection interrupt */

+    DFSDM1_Filter0->FLTCR2 &= ~(DFSDM_FLTCR2_CKABIE);

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to start short circuit detection in polling mode.

+  * @note   Same mode has to be used for all channels

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @param  Threshold Short circuit detector threshold.

+  *         This parameter must be a number between Min_Data = 0 and Max_Data = 255.

+  * @param  BreakSignal Break signals assigned to short circuit event.

+  *         This parameter can be a values combination of @ref DFSDM_BreakSignals.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_ChannelScdStart(DFSDM_Channel_HandleTypeDef *hdfsdm_channel,

+                                            uint32_t Threshold,

+                                            uint32_t BreakSignal)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance));

+  assert_param(IS_DFSDM_CHANNEL_SCD_THRESHOLD(Threshold));

+  assert_param(IS_DFSDM_BREAK_SIGNALS(BreakSignal));

+

+  /* Check DFSDM channel state */

+  if (hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY)

+  {

+    /* Return error status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Configure threshold and break signals */

+    hdfsdm_channel->Instance->CHAWSCDR &= ~(DFSDM_CHAWSCDR_BKSCD | DFSDM_CHAWSCDR_SCDT);

+    hdfsdm_channel->Instance->CHAWSCDR |= ((BreakSignal << DFSDM_CHAWSCDR_BKSCD_Pos) | \

+                                           Threshold);

+

+    /* Start short circuit detection */

+    hdfsdm_channel->Instance->CHCFGR1 |= DFSDM_CHCFGR1_SCDEN;

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to poll for the short circuit detection.

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @param  Timeout Timeout value in milliseconds.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_ChannelPollForScd(DFSDM_Channel_HandleTypeDef *hdfsdm_channel,

+                                              uint32_t Timeout)

+{

+  uint32_t tickstart;

+  uint32_t channel;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance));

+

+  /* Check DFSDM channel state */

+  if (hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY)

+  {

+    /* Return error status */

+    return HAL_ERROR;

+  }

+  else

+  {

+    /* Get channel number from channel instance */

+    channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance);

+

+    /* Get timeout */

+    tickstart = HAL_GetTick();

+

+    /* Wait short circuit detection */

+    while (((DFSDM1_Filter0->FLTISR & DFSDM_FLTISR_SCDF) >> (DFSDM_FLTISR_SCDF_Pos + channel)) == 0U)

+    {

+      /* Check the Timeout */

+      if (Timeout != HAL_MAX_DELAY)

+      {

+        if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))

+        {

+          /* Return timeout status */

+          return HAL_TIMEOUT;

+        }

+      }

+    }

+

+    /* Clear short circuit detection flag */

+    DFSDM1_Filter0->FLTICR = (1UL << (DFSDM_FLTICR_CLRSCDF_Pos + channel));

+

+    /* Return function status */

+    return HAL_OK;

+  }

+}

+

+/**

+  * @brief  This function allows to stop short circuit detection in polling mode.

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_ChannelScdStop(DFSDM_Channel_HandleTypeDef *hdfsdm_channel)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+  uint32_t channel;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance));

+

+  /* Check DFSDM channel state */

+  if (hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY)

+  {

+    /* Return error status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Stop short circuit detection */

+    hdfsdm_channel->Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_SCDEN);

+

+    /* Clear short circuit detection flag */

+    channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance);

+    DFSDM1_Filter0->FLTICR = (1UL << (DFSDM_FLTICR_CLRSCDF_Pos + channel));

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to start short circuit detection in interrupt mode.

+  * @note   Same mode has to be used for all channels

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @param  Threshold Short circuit detector threshold.

+  *         This parameter must be a number between Min_Data = 0 and Max_Data = 255.

+  * @param  BreakSignal Break signals assigned to short circuit event.

+  *         This parameter can be a values combination of @ref DFSDM_BreakSignals.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_ChannelScdStart_IT(DFSDM_Channel_HandleTypeDef *hdfsdm_channel,

+                                               uint32_t Threshold,

+                                               uint32_t BreakSignal)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance));

+  assert_param(IS_DFSDM_CHANNEL_SCD_THRESHOLD(Threshold));

+  assert_param(IS_DFSDM_BREAK_SIGNALS(BreakSignal));

+

+  /* Check DFSDM channel state */

+  if (hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY)

+  {

+    /* Return error status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Activate short circuit detection interrupt */

+    DFSDM1_Filter0->FLTCR2 |= DFSDM_FLTCR2_SCDIE;

+

+    /* Configure threshold and break signals */

+    hdfsdm_channel->Instance->CHAWSCDR &= ~(DFSDM_CHAWSCDR_BKSCD | DFSDM_CHAWSCDR_SCDT);

+    hdfsdm_channel->Instance->CHAWSCDR |= ((BreakSignal << DFSDM_CHAWSCDR_BKSCD_Pos) | \

+                                           Threshold);

+

+    /* Start short circuit detection */

+    hdfsdm_channel->Instance->CHCFGR1 |= DFSDM_CHCFGR1_SCDEN;

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  Short circuit detection callback.

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @retval None

+  */

+__weak void HAL_DFSDM_ChannelScdCallback(DFSDM_Channel_HandleTypeDef *hdfsdm_channel)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hdfsdm_channel);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_DFSDM_ChannelScdCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  This function allows to stop short circuit detection in interrupt mode.

+  * @note   Interrupt will be disabled for all channels

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_ChannelScdStop_IT(DFSDM_Channel_HandleTypeDef *hdfsdm_channel)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+  uint32_t channel;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance));

+

+  /* Check DFSDM channel state */

+  if (hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY)

+  {

+    /* Return error status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Stop short circuit detection */

+    hdfsdm_channel->Instance->CHCFGR1 &= ~(DFSDM_CHCFGR1_SCDEN);

+

+    /* Clear short circuit detection flag */

+    channel = DFSDM_GetChannelFromInstance(hdfsdm_channel->Instance);

+    DFSDM1_Filter0->FLTICR = (1UL << (DFSDM_FLTICR_CLRSCDF_Pos + channel));

+

+    /* Disable short circuit detection interrupt */

+    DFSDM1_Filter0->FLTCR2 &= ~(DFSDM_FLTCR2_SCDIE);

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to get channel analog watchdog value.

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @retval Channel analog watchdog value.

+  */

+int16_t HAL_DFSDM_ChannelGetAwdValue(DFSDM_Channel_HandleTypeDef *hdfsdm_channel)

+{

+  return (int16_t) hdfsdm_channel->Instance->CHWDATAR;

+}

+

+/**

+  * @brief  This function allows to modify channel offset value.

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @param  Offset DFSDM channel offset.

+  *         This parameter must be a number between Min_Data = -8388608 and Max_Data = 8388607.

+  * @retval HAL status.

+  */

+HAL_StatusTypeDef HAL_DFSDM_ChannelModifyOffset(DFSDM_Channel_HandleTypeDef *hdfsdm_channel,

+                                                int32_t Offset)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_CHANNEL_ALL_INSTANCE(hdfsdm_channel->Instance));

+  assert_param(IS_DFSDM_CHANNEL_OFFSET(Offset));

+

+  /* Check DFSDM channel state */

+  if (hdfsdm_channel->State != HAL_DFSDM_CHANNEL_STATE_READY)

+  {

+    /* Return error status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Modify channel offset */

+    hdfsdm_channel->Instance->CHCFGR2 &= ~(DFSDM_CHCFGR2_OFFSET);

+    hdfsdm_channel->Instance->CHCFGR2 |= ((uint32_t) Offset << DFSDM_CHCFGR2_OFFSET_Pos);

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Exported_Functions_Group3_Channel Channel state function

+ *  @brief    Channel state function

+ *

+@verbatim

+  ==============================================================================

+                   ##### Channel state function #####

+  ==============================================================================

+    [..]  This section provides function allowing to:

+      (+) Get channel handle state.

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  This function allows to get the current DFSDM channel handle state.

+  * @param  hdfsdm_channel DFSDM channel handle.

+  * @retval DFSDM channel state.

+  */

+HAL_DFSDM_Channel_StateTypeDef HAL_DFSDM_ChannelGetState(DFSDM_Channel_HandleTypeDef *hdfsdm_channel)

+{

+  /* Return DFSDM channel handle state */

+  return hdfsdm_channel->State;

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Exported_Functions_Group1_Filter Filter initialization and de-initialization functions

+ *  @brief    Filter initialization and de-initialization functions

+ *

+@verbatim

+  ==============================================================================

+        ##### Filter initialization and de-initialization functions #####

+  ==============================================================================

+    [..]  This section provides functions allowing to:

+      (+) Initialize the DFSDM filter.

+      (+) De-initialize the DFSDM filter.

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Initialize the DFSDM filter according to the specified parameters

+  *         in the DFSDM_FilterInitTypeDef structure and initialize the associated handle.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval HAL status.

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterInit(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  /* Check DFSDM Channel handle */

+  if (hdfsdm_filter == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+  assert_param(IS_DFSDM_FILTER_REG_TRIGGER(hdfsdm_filter->Init.RegularParam.Trigger));

+  assert_param(IS_FUNCTIONAL_STATE(hdfsdm_filter->Init.RegularParam.FastMode));

+  assert_param(IS_FUNCTIONAL_STATE(hdfsdm_filter->Init.RegularParam.DmaMode));

+  assert_param(IS_DFSDM_FILTER_INJ_TRIGGER(hdfsdm_filter->Init.InjectedParam.Trigger));

+  assert_param(IS_FUNCTIONAL_STATE(hdfsdm_filter->Init.InjectedParam.ScanMode));

+  assert_param(IS_FUNCTIONAL_STATE(hdfsdm_filter->Init.InjectedParam.DmaMode));

+  assert_param(IS_DFSDM_FILTER_SINC_ORDER(hdfsdm_filter->Init.FilterParam.SincOrder));

+  assert_param(IS_DFSDM_FILTER_OVS_RATIO(hdfsdm_filter->Init.FilterParam.Oversampling));

+  assert_param(IS_DFSDM_FILTER_INTEGRATOR_OVS_RATIO(hdfsdm_filter->Init.FilterParam.IntOversampling));

+

+  /* Check parameters compatibility */

+  if ((hdfsdm_filter->Instance == DFSDM1_Filter0) &&

+      ((hdfsdm_filter->Init.RegularParam.Trigger  == DFSDM_FILTER_SYNC_TRIGGER) ||

+       (hdfsdm_filter->Init.InjectedParam.Trigger == DFSDM_FILTER_SYNC_TRIGGER)))

+  {

+    return HAL_ERROR;

+  }

+

+  /* Initialize DFSDM filter variables with default values */

+  hdfsdm_filter->RegularContMode     = DFSDM_CONTINUOUS_CONV_OFF;

+  hdfsdm_filter->InjectedChannelsNbr = 1;

+  hdfsdm_filter->InjConvRemaining    = 1;

+  hdfsdm_filter->ErrorCode           = DFSDM_FILTER_ERROR_NONE;

+

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+  /* Reset callback pointers to the weak predefined callbacks */

+  hdfsdm_filter->AwdCallback             = HAL_DFSDM_FilterAwdCallback;

+  hdfsdm_filter->RegConvCpltCallback     = HAL_DFSDM_FilterRegConvCpltCallback;

+  hdfsdm_filter->RegConvHalfCpltCallback = HAL_DFSDM_FilterRegConvHalfCpltCallback;

+  hdfsdm_filter->InjConvCpltCallback     = HAL_DFSDM_FilterInjConvCpltCallback;

+  hdfsdm_filter->InjConvHalfCpltCallback = HAL_DFSDM_FilterInjConvHalfCpltCallback;

+  hdfsdm_filter->ErrorCallback           = HAL_DFSDM_FilterErrorCallback;

+

+  /* Call MSP init function */

+  if (hdfsdm_filter->MspInitCallback == NULL)

+  {

+    hdfsdm_filter->MspInitCallback = HAL_DFSDM_FilterMspInit;

+  }

+  hdfsdm_filter->MspInitCallback(hdfsdm_filter);

+#else

+  /* Call MSP init function */

+  HAL_DFSDM_FilterMspInit(hdfsdm_filter);

+#endif

+

+  /* Set regular parameters */

+  hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_RSYNC);

+  if (hdfsdm_filter->Init.RegularParam.FastMode == ENABLE)

+  {

+    hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_FAST;

+  }

+  else

+  {

+    hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_FAST);

+  }

+

+  if (hdfsdm_filter->Init.RegularParam.DmaMode == ENABLE)

+  {

+    hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_RDMAEN;

+  }

+  else

+  {

+    hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_RDMAEN);

+  }

+

+  /* Set injected parameters */

+  hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_JSYNC | DFSDM_FLTCR1_JEXTEN | DFSDM_FLTCR1_JEXTSEL);

+  if (hdfsdm_filter->Init.InjectedParam.Trigger == DFSDM_FILTER_EXT_TRIGGER)

+  {

+    assert_param(IS_DFSDM_FILTER_EXT_TRIG(hdfsdm_filter->Init.InjectedParam.ExtTrigger));

+    assert_param(IS_DFSDM_FILTER_EXT_TRIG_EDGE(hdfsdm_filter->Init.InjectedParam.ExtTriggerEdge));

+    hdfsdm_filter->Instance->FLTCR1 |= (hdfsdm_filter->Init.InjectedParam.ExtTrigger);

+  }

+

+  if (hdfsdm_filter->Init.InjectedParam.ScanMode == ENABLE)

+  {

+    hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_JSCAN;

+  }

+  else

+  {

+    hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_JSCAN);

+  }

+

+  if (hdfsdm_filter->Init.InjectedParam.DmaMode == ENABLE)

+  {

+    hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_JDMAEN;

+  }

+  else

+  {

+    hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_JDMAEN);

+  }

+

+  /* Set filter parameters */

+  hdfsdm_filter->Instance->FLTFCR &= ~(DFSDM_FLTFCR_FORD | DFSDM_FLTFCR_FOSR | DFSDM_FLTFCR_IOSR);

+  hdfsdm_filter->Instance->FLTFCR |= (hdfsdm_filter->Init.FilterParam.SincOrder |

+                                      ((hdfsdm_filter->Init.FilterParam.Oversampling - 1U) << DFSDM_FLTFCR_FOSR_Pos) |

+                                      (hdfsdm_filter->Init.FilterParam.IntOversampling - 1U));

+

+  /* Store regular and injected triggers and injected scan mode*/

+  hdfsdm_filter->RegularTrigger   = hdfsdm_filter->Init.RegularParam.Trigger;

+  hdfsdm_filter->InjectedTrigger  = hdfsdm_filter->Init.InjectedParam.Trigger;

+  hdfsdm_filter->ExtTriggerEdge   = hdfsdm_filter->Init.InjectedParam.ExtTriggerEdge;

+  hdfsdm_filter->InjectedScanMode = hdfsdm_filter->Init.InjectedParam.ScanMode;

+

+  /* Enable DFSDM filter */

+  hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_DFEN;

+

+  /* Set DFSDM filter to ready state */

+  hdfsdm_filter->State = HAL_DFSDM_FILTER_STATE_READY;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  De-initializes the DFSDM filter.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval HAL status.

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterDeInit(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  /* Check DFSDM filter handle */

+  if (hdfsdm_filter == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+

+  /* Disable the DFSDM filter */

+  hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_DFEN);

+

+  /* Call MSP deinit function */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+  if (hdfsdm_filter->MspDeInitCallback == NULL)

+  {

+    hdfsdm_filter->MspDeInitCallback = HAL_DFSDM_FilterMspDeInit;

+  }

+  hdfsdm_filter->MspDeInitCallback(hdfsdm_filter);

+#else

+  HAL_DFSDM_FilterMspDeInit(hdfsdm_filter);

+#endif

+

+  /* Set DFSDM filter in reset state */

+  hdfsdm_filter->State = HAL_DFSDM_FILTER_STATE_RESET;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Initializes the DFSDM filter MSP.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval None

+  */

+__weak void HAL_DFSDM_FilterMspInit(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hdfsdm_filter);

+

+  /* NOTE : This function should not be modified, when the function is needed,

+            the HAL_DFSDM_FilterMspInit could be implemented in the user file.

+   */

+}

+

+/**

+  * @brief  De-initializes the DFSDM filter MSP.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval None

+  */

+__weak void HAL_DFSDM_FilterMspDeInit(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hdfsdm_filter);

+

+  /* NOTE : This function should not be modified, when the function is needed,

+            the HAL_DFSDM_FilterMspDeInit could be implemented in the user file.

+   */

+}

+

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+/**

+  * @brief  Register a user DFSDM filter callback

+  *         to be used instead of the weak predefined callback.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @param  CallbackID ID of the callback to be registered.

+  *         This parameter can be one of the following values:

+  *           @arg @ref HAL_DFSDM_FILTER_REGCONV_COMPLETE_CB_ID regular conversion complete callback ID.

+  *           @arg @ref HAL_DFSDM_FILTER_REGCONV_HALFCOMPLETE_CB_ID half regular conversion complete callback ID.

+  *           @arg @ref HAL_DFSDM_FILTER_INJCONV_COMPLETE_CB_ID injected conversion complete callback ID.

+  *           @arg @ref HAL_DFSDM_FILTER_INJCONV_HALFCOMPLETE_CB_ID half injected conversion complete callback ID.

+  *           @arg @ref HAL_DFSDM_FILTER_ERROR_CB_ID error callback ID.

+  *           @arg @ref HAL_DFSDM_FILTER_MSPINIT_CB_ID MSP init callback ID.

+  *           @arg @ref HAL_DFSDM_FILTER_MSPDEINIT_CB_ID MSP de-init callback ID.

+  * @param  pCallback pointer to the callback function.

+  * @retval HAL status.

+  */

+HAL_StatusTypeDef HAL_DFSDM_Filter_RegisterCallback(DFSDM_Filter_HandleTypeDef        *hdfsdm_filter,

+                                                    HAL_DFSDM_Filter_CallbackIDTypeDef CallbackID,

+                                                    pDFSDM_Filter_CallbackTypeDef      pCallback)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  if (pCallback == NULL)

+  {

+    /* update the error code */

+    hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_INVALID_CALLBACK;

+    /* update return status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    if (HAL_DFSDM_FILTER_STATE_READY == hdfsdm_filter->State)

+    {

+      switch (CallbackID)

+      {

+        case HAL_DFSDM_FILTER_REGCONV_COMPLETE_CB_ID :

+          hdfsdm_filter->RegConvCpltCallback = pCallback;

+          break;

+        case HAL_DFSDM_FILTER_REGCONV_HALFCOMPLETE_CB_ID :

+          hdfsdm_filter->RegConvHalfCpltCallback = pCallback;

+          break;

+        case HAL_DFSDM_FILTER_INJCONV_COMPLETE_CB_ID :

+          hdfsdm_filter->InjConvCpltCallback = pCallback;

+          break;

+        case HAL_DFSDM_FILTER_INJCONV_HALFCOMPLETE_CB_ID :

+          hdfsdm_filter->InjConvHalfCpltCallback = pCallback;

+          break;

+        case HAL_DFSDM_FILTER_ERROR_CB_ID :

+          hdfsdm_filter->ErrorCallback = pCallback;

+          break;

+        case HAL_DFSDM_FILTER_MSPINIT_CB_ID :

+          hdfsdm_filter->MspInitCallback = pCallback;

+          break;

+        case HAL_DFSDM_FILTER_MSPDEINIT_CB_ID :

+          hdfsdm_filter->MspDeInitCallback = pCallback;

+          break;

+        default :

+          /* update the error code */

+          hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_INVALID_CALLBACK;

+          /* update return status */

+          status = HAL_ERROR;

+          break;

+      }

+    }

+    else if (HAL_DFSDM_FILTER_STATE_RESET == hdfsdm_filter->State)

+    {

+      switch (CallbackID)

+      {

+        case HAL_DFSDM_FILTER_MSPINIT_CB_ID :

+          hdfsdm_filter->MspInitCallback = pCallback;

+          break;

+        case HAL_DFSDM_FILTER_MSPDEINIT_CB_ID :

+          hdfsdm_filter->MspDeInitCallback = pCallback;

+          break;

+        default :

+          /* update the error code */

+          hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_INVALID_CALLBACK;

+          /* update return status */

+          status = HAL_ERROR;

+          break;

+      }

+    }

+    else

+    {

+      /* update the error code */

+      hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_INVALID_CALLBACK;

+      /* update return status */

+      status = HAL_ERROR;

+    }

+  }

+  return status;

+}

+

+/**

+  * @brief  Unregister a user DFSDM filter callback.

+  *         DFSDM filter callback is redirected to the weak predefined callback.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @param  CallbackID ID of the callback to be unregistered.

+  *         This parameter can be one of the following values:

+  *           @arg @ref HAL_DFSDM_FILTER_REGCONV_COMPLETE_CB_ID regular conversion complete callback ID.

+  *           @arg @ref HAL_DFSDM_FILTER_REGCONV_HALFCOMPLETE_CB_ID half regular conversion complete callback ID.

+  *           @arg @ref HAL_DFSDM_FILTER_INJCONV_COMPLETE_CB_ID injected conversion complete callback ID.

+  *           @arg @ref HAL_DFSDM_FILTER_INJCONV_HALFCOMPLETE_CB_ID half injected conversion complete callback ID.

+  *           @arg @ref HAL_DFSDM_FILTER_ERROR_CB_ID error callback ID.

+  *           @arg @ref HAL_DFSDM_FILTER_MSPINIT_CB_ID MSP init callback ID.

+  *           @arg @ref HAL_DFSDM_FILTER_MSPDEINIT_CB_ID MSP de-init callback ID.

+  * @retval HAL status.

+  */

+HAL_StatusTypeDef HAL_DFSDM_Filter_UnRegisterCallback(DFSDM_Filter_HandleTypeDef        *hdfsdm_filter,

+                                                      HAL_DFSDM_Filter_CallbackIDTypeDef CallbackID)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  if (HAL_DFSDM_FILTER_STATE_READY == hdfsdm_filter->State)

+  {

+    switch (CallbackID)

+    {

+      case HAL_DFSDM_FILTER_REGCONV_COMPLETE_CB_ID :

+        hdfsdm_filter->RegConvCpltCallback = HAL_DFSDM_FilterRegConvCpltCallback;

+        break;

+      case HAL_DFSDM_FILTER_REGCONV_HALFCOMPLETE_CB_ID :

+        hdfsdm_filter->RegConvHalfCpltCallback = HAL_DFSDM_FilterRegConvHalfCpltCallback;

+        break;

+      case HAL_DFSDM_FILTER_INJCONV_COMPLETE_CB_ID :

+        hdfsdm_filter->InjConvCpltCallback = HAL_DFSDM_FilterInjConvCpltCallback;

+        break;

+      case HAL_DFSDM_FILTER_INJCONV_HALFCOMPLETE_CB_ID :

+        hdfsdm_filter->InjConvHalfCpltCallback = HAL_DFSDM_FilterInjConvHalfCpltCallback;

+        break;

+      case HAL_DFSDM_FILTER_ERROR_CB_ID :

+        hdfsdm_filter->ErrorCallback = HAL_DFSDM_FilterErrorCallback;

+        break;

+      case HAL_DFSDM_FILTER_MSPINIT_CB_ID :

+        hdfsdm_filter->MspInitCallback = HAL_DFSDM_FilterMspInit;

+        break;

+      case HAL_DFSDM_FILTER_MSPDEINIT_CB_ID :

+        hdfsdm_filter->MspDeInitCallback = HAL_DFSDM_FilterMspDeInit;

+        break;

+      default :

+        /* update the error code */

+        hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_INVALID_CALLBACK;

+        /* update return status */

+        status = HAL_ERROR;

+        break;

+    }

+  }

+  else if (HAL_DFSDM_FILTER_STATE_RESET == hdfsdm_filter->State)

+  {

+    switch (CallbackID)

+    {

+      case HAL_DFSDM_FILTER_MSPINIT_CB_ID :

+        hdfsdm_filter->MspInitCallback = HAL_DFSDM_FilterMspInit;

+        break;

+      case HAL_DFSDM_FILTER_MSPDEINIT_CB_ID :

+        hdfsdm_filter->MspDeInitCallback = HAL_DFSDM_FilterMspDeInit;

+        break;

+      default :

+        /* update the error code */

+        hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_INVALID_CALLBACK;

+        /* update return status */

+        status = HAL_ERROR;

+        break;

+    }

+  }

+  else

+  {

+    /* update the error code */

+    hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_INVALID_CALLBACK;

+    /* update return status */

+    status = HAL_ERROR;

+  }

+  return status;

+}

+

+/**

+  * @brief  Register a user DFSDM filter analog watchdog callback

+  *         to be used instead of the weak predefined callback.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @param  pCallback pointer to the DFSDM filter analog watchdog callback function.

+  * @retval HAL status.

+  */

+HAL_StatusTypeDef HAL_DFSDM_Filter_RegisterAwdCallback(DFSDM_Filter_HandleTypeDef      *hdfsdm_filter,

+                                                       pDFSDM_Filter_AwdCallbackTypeDef pCallback)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  if (pCallback == NULL)

+  {

+    /* update the error code */

+    hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_INVALID_CALLBACK;

+    /* update return status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    if (HAL_DFSDM_FILTER_STATE_READY == hdfsdm_filter->State)

+    {

+      hdfsdm_filter->AwdCallback = pCallback;

+    }

+    else

+    {

+      /* update the error code */

+      hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_INVALID_CALLBACK;

+      /* update return status */

+      status = HAL_ERROR;

+    }

+  }

+  return status;

+}

+

+/**

+  * @brief  Unregister a user DFSDM filter analog watchdog callback.

+  *         DFSDM filter AWD callback is redirected to the weak predefined callback.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval HAL status.

+  */

+HAL_StatusTypeDef HAL_DFSDM_Filter_UnRegisterAwdCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  if (HAL_DFSDM_FILTER_STATE_READY == hdfsdm_filter->State)

+  {

+    hdfsdm_filter->AwdCallback = HAL_DFSDM_FilterAwdCallback;

+  }

+  else

+  {

+    /* update the error code */

+    hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_INVALID_CALLBACK;

+    /* update return status */

+    status = HAL_ERROR;

+  }

+  return status;

+}

+#endif /* USE_HAL_DFSDM_REGISTER_CALLBACKS */

+

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Exported_Functions_Group2_Filter Filter control functions

+ *  @brief    Filter control functions

+ *

+@verbatim

+  ==============================================================================

+                    ##### Filter control functions #####

+  ==============================================================================

+    [..]  This section provides functions allowing to:

+      (+) Select channel and enable/disable continuous mode for regular conversion.

+      (+) Select channels for injected conversion.

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  This function allows to select channel and to enable/disable

+  *         continuous mode for regular conversion.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @param  Channel Channel for regular conversion.

+  *         This parameter can be a value of @ref DFSDM_Channel_Selection.

+  * @param  ContinuousMode Enable/disable continuous mode for regular conversion.

+  *         This parameter can be a value of @ref DFSDM_ContinuousMode.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterConfigRegChannel(DFSDM_Filter_HandleTypeDef *hdfsdm_filter,

+                                                   uint32_t                    Channel,

+                                                   uint32_t                    ContinuousMode)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+  assert_param(IS_DFSDM_REGULAR_CHANNEL(Channel));

+  assert_param(IS_DFSDM_CONTINUOUS_MODE(ContinuousMode));

+

+  /* Check DFSDM filter state */

+  if ((hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_RESET) &&

+      (hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_ERROR))

+  {

+    /* Configure channel and continuous mode for regular conversion */

+    hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_RCH | DFSDM_FLTCR1_RCONT);

+    if (ContinuousMode == DFSDM_CONTINUOUS_CONV_ON)

+    {

+      hdfsdm_filter->Instance->FLTCR1 |= (uint32_t)(((Channel & DFSDM_MSB_MASK) << DFSDM_FLTCR1_MSB_RCH_OFFSET) |

+                                                    DFSDM_FLTCR1_RCONT);

+    }

+    else

+    {

+      hdfsdm_filter->Instance->FLTCR1 |= (uint32_t)((Channel & DFSDM_MSB_MASK) << DFSDM_FLTCR1_MSB_RCH_OFFSET);

+    }

+    /* Store continuous mode information */

+    hdfsdm_filter->RegularContMode = ContinuousMode;

+  }

+  else

+  {

+    status = HAL_ERROR;

+  }

+

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to select channels for injected conversion.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @param  Channel Channels for injected conversion.

+  *         This parameter can be a values combination of @ref DFSDM_Channel_Selection.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterConfigInjChannel(DFSDM_Filter_HandleTypeDef *hdfsdm_filter,

+                                                   uint32_t                    Channel)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+  assert_param(IS_DFSDM_INJECTED_CHANNEL(Channel));

+

+  /* Check DFSDM filter state */

+  if ((hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_RESET) &&

+      (hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_ERROR))

+  {

+    /* Configure channel for injected conversion */

+    hdfsdm_filter->Instance->FLTJCHGR = (uint32_t)(Channel & DFSDM_LSB_MASK);

+    /* Store number of injected channels */

+    hdfsdm_filter->InjectedChannelsNbr = DFSDM_GetInjChannelsNbr(Channel);

+    /* Update number of injected channels remaining */

+    hdfsdm_filter->InjConvRemaining = (hdfsdm_filter->InjectedScanMode == ENABLE) ? \

+                                      hdfsdm_filter->InjectedChannelsNbr : 1U;

+  }

+  else

+  {

+    status = HAL_ERROR;

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Exported_Functions_Group3_Filter Filter operation functions

+ *  @brief    Filter operation functions

+ *

+@verbatim

+  ==============================================================================

+                    ##### Filter operation functions #####

+  ==============================================================================

+    [..]  This section provides functions allowing to:

+      (+) Start conversion of regular/injected channel.

+      (+) Poll for the end of regular/injected conversion.

+      (+) Stop conversion of regular/injected channel.

+      (+) Start conversion of regular/injected channel and enable interrupt.

+      (+) Call the callback functions at the end of regular/injected conversions.

+      (+) Stop conversion of regular/injected channel and disable interrupt.

+      (+) Start conversion of regular/injected channel and enable DMA transfer.

+      (+) Stop conversion of regular/injected channel and disable DMA transfer.

+      (+) Start analog watchdog and enable interrupt.

+      (+) Call the callback function when analog watchdog occurs.

+      (+) Stop analog watchdog and disable interrupt.

+      (+) Start extreme detector.

+      (+) Stop extreme detector.

+      (+) Get result of regular channel conversion.

+      (+) Get result of injected channel conversion.

+      (+) Get extreme detector maximum and minimum values.

+      (+) Get conversion time.

+      (+) Handle DFSDM interrupt request.

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  This function allows to start regular conversion in polling mode.

+  * @note   This function should be called only when DFSDM filter instance is

+  *         in idle state or if injected conversion is ongoing.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterRegularStart(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+

+  /* Check DFSDM filter state */

+  if ((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_READY) || \

+      (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_INJ))

+  {

+    /* Start regular conversion */

+    DFSDM_RegConvStart(hdfsdm_filter);

+  }

+  else

+  {

+    status = HAL_ERROR;

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to poll for the end of regular conversion.

+  * @note   This function should be called only if regular conversion is ongoing.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @param  Timeout Timeout value in milliseconds.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterPollForRegConversion(DFSDM_Filter_HandleTypeDef *hdfsdm_filter,

+                                                       uint32_t                    Timeout)

+{

+  uint32_t tickstart;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+

+  /* Check DFSDM filter state */

+  if ((hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG) && \

+      (hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG_INJ))

+  {

+    /* Return error status */

+    return HAL_ERROR;

+  }

+  else

+  {

+    /* Get timeout */

+    tickstart = HAL_GetTick();

+

+    /* Wait end of regular conversion */

+    while ((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_REOCF) != DFSDM_FLTISR_REOCF)

+    {

+      /* Check the Timeout */

+      if (Timeout != HAL_MAX_DELAY)

+      {

+        if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))

+        {

+          /* Return timeout status */

+          return HAL_TIMEOUT;

+        }

+      }

+    }

+    /* Check if overrun occurs */

+    if ((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_ROVRF) == DFSDM_FLTISR_ROVRF)

+    {

+      /* Update error code and call error callback */

+      hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_REGULAR_OVERRUN;

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+      hdfsdm_filter->ErrorCallback(hdfsdm_filter);

+#else

+      HAL_DFSDM_FilterErrorCallback(hdfsdm_filter);

+#endif

+

+      /* Clear regular overrun flag */

+      hdfsdm_filter->Instance->FLTICR = DFSDM_FLTICR_CLRROVRF;

+    }

+    /* Update DFSDM filter state only if not continuous conversion and SW trigger */

+    if ((hdfsdm_filter->RegularContMode == DFSDM_CONTINUOUS_CONV_OFF) && \

+        (hdfsdm_filter->RegularTrigger == DFSDM_FILTER_SW_TRIGGER))

+    {

+      hdfsdm_filter->State = (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_REG) ? \

+                             HAL_DFSDM_FILTER_STATE_READY : HAL_DFSDM_FILTER_STATE_INJ;

+    }

+    /* Return function status */

+    return HAL_OK;

+  }

+}

+

+/**

+  * @brief  This function allows to stop regular conversion in polling mode.

+  * @note   This function should be called only if regular conversion is ongoing.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterRegularStop(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+

+  /* Check DFSDM filter state */

+  if ((hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG) && \

+      (hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG_INJ))

+  {

+    /* Return error status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Stop regular conversion */

+    DFSDM_RegConvStop(hdfsdm_filter);

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to start regular conversion in interrupt mode.

+  * @note   This function should be called only when DFSDM filter instance is

+  *         in idle state or if injected conversion is ongoing.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterRegularStart_IT(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+

+  /* Check DFSDM filter state */

+  if ((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_READY) || \

+      (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_INJ))

+  {

+    /* Enable interrupts for regular conversions */

+    hdfsdm_filter->Instance->FLTCR2 |= (DFSDM_FLTCR2_REOCIE | DFSDM_FLTCR2_ROVRIE);

+

+    /* Start regular conversion */

+    DFSDM_RegConvStart(hdfsdm_filter);

+  }

+  else

+  {

+    status = HAL_ERROR;

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to stop regular conversion in interrupt mode.

+  * @note   This function should be called only if regular conversion is ongoing.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterRegularStop_IT(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+

+  /* Check DFSDM filter state */

+  if ((hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG) && \

+      (hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG_INJ))

+  {

+    /* Return error status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Disable interrupts for regular conversions */

+    hdfsdm_filter->Instance->FLTCR2 &= ~(DFSDM_FLTCR2_REOCIE | DFSDM_FLTCR2_ROVRIE);

+

+    /* Stop regular conversion */

+    DFSDM_RegConvStop(hdfsdm_filter);

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to start regular conversion in DMA mode.

+  * @note   This function should be called only when DFSDM filter instance is

+  *         in idle state or if injected conversion is ongoing.

+  *         Please note that data on buffer will contain signed regular conversion

+  *         value on 24 most significant bits and corresponding channel on 3 least

+  *         significant bits.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @param  pData The destination buffer address.

+  * @param  Length The length of data to be transferred from DFSDM filter to memory.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterRegularStart_DMA(DFSDM_Filter_HandleTypeDef *hdfsdm_filter,

+                                                   int32_t                    *pData,

+                                                   uint32_t                    Length)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+

+  /* Check destination address and length */

+  if ((pData == NULL) || (Length == 0U))

+  {

+    status = HAL_ERROR;

+  }

+  /* Check that DMA is enabled for regular conversion */

+  else if ((hdfsdm_filter->Instance->FLTCR1 & DFSDM_FLTCR1_RDMAEN) != DFSDM_FLTCR1_RDMAEN)

+  {

+    status = HAL_ERROR;

+  }

+  /* Check parameters compatibility */

+  else if ((hdfsdm_filter->RegularTrigger == DFSDM_FILTER_SW_TRIGGER) && \

+           (hdfsdm_filter->RegularContMode == DFSDM_CONTINUOUS_CONV_OFF) && \

+           (hdfsdm_filter->hdmaReg->Init.Mode == DMA_NORMAL) && \

+           (Length != 1U))

+  {

+    status = HAL_ERROR;

+  }

+  else if ((hdfsdm_filter->RegularTrigger == DFSDM_FILTER_SW_TRIGGER) && \

+           (hdfsdm_filter->RegularContMode == DFSDM_CONTINUOUS_CONV_OFF) && \

+           (hdfsdm_filter->hdmaReg->Init.Mode == DMA_CIRCULAR))

+  {

+    status = HAL_ERROR;

+  }

+  /* Check DFSDM filter state */

+  else if ((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_READY) || \

+           (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_INJ))

+  {

+    /* Set callbacks on DMA handler */

+    hdfsdm_filter->hdmaReg->XferCpltCallback = DFSDM_DMARegularConvCplt;

+    hdfsdm_filter->hdmaReg->XferErrorCallback = DFSDM_DMAError;

+    hdfsdm_filter->hdmaReg->XferHalfCpltCallback = (hdfsdm_filter->hdmaReg->Init.Mode == DMA_CIRCULAR) ? \

+                                                   DFSDM_DMARegularHalfConvCplt : NULL;

+

+    /* Start DMA in interrupt mode */

+    if (HAL_DMA_Start_IT(hdfsdm_filter->hdmaReg, (uint32_t)&hdfsdm_filter->Instance->FLTRDATAR, \

+                         (uint32_t) pData, Length) != HAL_OK)

+    {

+      /* Set DFSDM filter in error state */

+      hdfsdm_filter->State = HAL_DFSDM_FILTER_STATE_ERROR;

+      status = HAL_ERROR;

+    }

+    else

+    {

+      /* Start regular conversion */

+      DFSDM_RegConvStart(hdfsdm_filter);

+    }

+  }

+  else

+  {

+    status = HAL_ERROR;

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to start regular conversion in DMA mode and to get

+  *         only the 16 most significant bits of conversion.

+  * @note   This function should be called only when DFSDM filter instance is

+  *         in idle state or if injected conversion is ongoing.

+  *         Please note that data on buffer will contain signed 16 most significant

+  *         bits of regular conversion.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @param  pData The destination buffer address.

+  * @param  Length The length of data to be transferred from DFSDM filter to memory.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterRegularMsbStart_DMA(DFSDM_Filter_HandleTypeDef *hdfsdm_filter,

+                                                      int16_t                    *pData,

+                                                      uint32_t                    Length)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+

+  /* Check destination address and length */

+  if ((pData == NULL) || (Length == 0U))

+  {

+    status = HAL_ERROR;

+  }

+  /* Check that DMA is enabled for regular conversion */

+  else if ((hdfsdm_filter->Instance->FLTCR1 & DFSDM_FLTCR1_RDMAEN) != DFSDM_FLTCR1_RDMAEN)

+  {

+    status = HAL_ERROR;

+  }

+  /* Check parameters compatibility */

+  else if ((hdfsdm_filter->RegularTrigger == DFSDM_FILTER_SW_TRIGGER) && \

+           (hdfsdm_filter->RegularContMode == DFSDM_CONTINUOUS_CONV_OFF) && \

+           (hdfsdm_filter->hdmaReg->Init.Mode == DMA_NORMAL) && \

+           (Length != 1U))

+  {

+    status = HAL_ERROR;

+  }

+  else if ((hdfsdm_filter->RegularTrigger == DFSDM_FILTER_SW_TRIGGER) && \

+           (hdfsdm_filter->RegularContMode == DFSDM_CONTINUOUS_CONV_OFF) && \

+           (hdfsdm_filter->hdmaReg->Init.Mode == DMA_CIRCULAR))

+  {

+    status = HAL_ERROR;

+  }

+  /* Check DFSDM filter state */

+  else if ((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_READY) || \

+           (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_INJ))

+  {

+    /* Set callbacks on DMA handler */

+    hdfsdm_filter->hdmaReg->XferCpltCallback = DFSDM_DMARegularConvCplt;

+    hdfsdm_filter->hdmaReg->XferErrorCallback = DFSDM_DMAError;

+    hdfsdm_filter->hdmaReg->XferHalfCpltCallback = (hdfsdm_filter->hdmaReg->Init.Mode == DMA_CIRCULAR) ? \

+                                                   DFSDM_DMARegularHalfConvCplt : NULL;

+

+    /* Start DMA in interrupt mode */

+    if (HAL_DMA_Start_IT(hdfsdm_filter->hdmaReg, (uint32_t)(&hdfsdm_filter->Instance->FLTRDATAR) + 2U, \

+                         (uint32_t) pData, Length) != HAL_OK)

+    {

+      /* Set DFSDM filter in error state */

+      hdfsdm_filter->State = HAL_DFSDM_FILTER_STATE_ERROR;

+      status = HAL_ERROR;

+    }

+    else

+    {

+      /* Start regular conversion */

+      DFSDM_RegConvStart(hdfsdm_filter);

+    }

+  }

+  else

+  {

+    status = HAL_ERROR;

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to stop regular conversion in DMA mode.

+  * @note   This function should be called only if regular conversion is ongoing.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterRegularStop_DMA(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+

+  /* Check DFSDM filter state */

+  if ((hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG) && \

+      (hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG_INJ))

+  {

+    /* Return error status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Stop current DMA transfer */

+    if (HAL_DMA_Abort(hdfsdm_filter->hdmaReg) != HAL_OK)

+    {

+      /* Set DFSDM filter in error state */

+      hdfsdm_filter->State = HAL_DFSDM_FILTER_STATE_ERROR;

+      status = HAL_ERROR;

+    }

+    else

+    {

+      /* Stop regular conversion */

+      DFSDM_RegConvStop(hdfsdm_filter);

+    }

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to get regular conversion value.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @param  Channel Corresponding channel of regular conversion.

+  * @retval Regular conversion value

+  */

+int32_t HAL_DFSDM_FilterGetRegularValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filter,

+                                        uint32_t                   *Channel)

+{

+  uint32_t reg;

+  int32_t  value;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+  assert_param(Channel != (void *)0);

+

+  /* Get value of data register for regular channel */

+  reg = hdfsdm_filter->Instance->FLTRDATAR;

+

+  /* Extract channel and regular conversion value */

+  *Channel = (reg & DFSDM_FLTRDATAR_RDATACH);

+  /* Regular conversion value is a signed value located on 24 MSB of register */

+  /* So after applying a mask on these bits we have to perform a division by 256 (2 raised to the power of 8) */

+  reg &= DFSDM_FLTRDATAR_RDATA;

+  value = ((int32_t)reg) / 256;

+

+  /* return regular conversion value */

+  return value;

+}

+

+/**

+  * @brief  This function allows to start injected conversion in polling mode.

+  * @note   This function should be called only when DFSDM filter instance is

+  *         in idle state or if regular conversion is ongoing.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterInjectedStart(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+

+  /* Check DFSDM filter state */

+  if ((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_READY) || \

+      (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_REG))

+  {

+    /* Start injected conversion */

+    DFSDM_InjConvStart(hdfsdm_filter);

+  }

+  else

+  {

+    status = HAL_ERROR;

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to poll for the end of injected conversion.

+  * @note   This function should be called only if injected conversion is ongoing.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @param  Timeout Timeout value in milliseconds.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterPollForInjConversion(DFSDM_Filter_HandleTypeDef *hdfsdm_filter,

+                                                       uint32_t                    Timeout)

+{

+  uint32_t tickstart;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+

+  /* Check DFSDM filter state */

+  if ((hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_INJ) && \

+      (hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG_INJ))

+  {

+    /* Return error status */

+    return HAL_ERROR;

+  }

+  else

+  {

+    /* Get timeout */

+    tickstart = HAL_GetTick();

+

+    /* Wait end of injected conversions */

+    while ((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_JEOCF) != DFSDM_FLTISR_JEOCF)

+    {

+      /* Check the Timeout */

+      if (Timeout != HAL_MAX_DELAY)

+      {

+        if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))

+        {

+          /* Return timeout status */

+          return HAL_TIMEOUT;

+        }

+      }

+    }

+    /* Check if overrun occurs */

+    if ((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_JOVRF) == DFSDM_FLTISR_JOVRF)

+    {

+      /* Update error code and call error callback */

+      hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_INJECTED_OVERRUN;

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+      hdfsdm_filter->ErrorCallback(hdfsdm_filter);

+#else

+      HAL_DFSDM_FilterErrorCallback(hdfsdm_filter);

+#endif

+

+      /* Clear injected overrun flag */

+      hdfsdm_filter->Instance->FLTICR = DFSDM_FLTICR_CLRJOVRF;

+    }

+

+    /* Update remaining injected conversions */

+    hdfsdm_filter->InjConvRemaining--;

+    if (hdfsdm_filter->InjConvRemaining == 0U)

+    {

+      /* Update DFSDM filter state only if trigger is software */

+      if (hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SW_TRIGGER)

+      {

+        hdfsdm_filter->State = (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_INJ) ? \

+                               HAL_DFSDM_FILTER_STATE_READY : HAL_DFSDM_FILTER_STATE_REG;

+      }

+

+      /* end of injected sequence, reset the value */

+      hdfsdm_filter->InjConvRemaining = (hdfsdm_filter->InjectedScanMode == ENABLE) ? \

+                                        hdfsdm_filter->InjectedChannelsNbr : 1U;

+    }

+

+    /* Return function status */

+    return HAL_OK;

+  }

+}

+

+/**

+  * @brief  This function allows to stop injected conversion in polling mode.

+  * @note   This function should be called only if injected conversion is ongoing.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterInjectedStop(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+

+  /* Check DFSDM filter state */

+  if ((hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_INJ) && \

+      (hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG_INJ))

+  {

+    /* Return error status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Stop injected conversion */

+    DFSDM_InjConvStop(hdfsdm_filter);

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to start injected conversion in interrupt mode.

+  * @note   This function should be called only when DFSDM filter instance is

+  *         in idle state or if regular conversion is ongoing.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterInjectedStart_IT(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+

+  /* Check DFSDM filter state */

+  if ((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_READY) || \

+      (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_REG))

+  {

+    /* Enable interrupts for injected conversions */

+    hdfsdm_filter->Instance->FLTCR2 |= (DFSDM_FLTCR2_JEOCIE | DFSDM_FLTCR2_JOVRIE);

+

+    /* Start injected conversion */

+    DFSDM_InjConvStart(hdfsdm_filter);

+  }

+  else

+  {

+    status = HAL_ERROR;

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to stop injected conversion in interrupt mode.

+  * @note   This function should be called only if injected conversion is ongoing.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterInjectedStop_IT(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+

+  /* Check DFSDM filter state */

+  if ((hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_INJ) && \

+      (hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG_INJ))

+  {

+    /* Return error status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Disable interrupts for injected conversions */

+    hdfsdm_filter->Instance->FLTCR2 &= ~(DFSDM_FLTCR2_JEOCIE | DFSDM_FLTCR2_JOVRIE);

+

+    /* Stop injected conversion */

+    DFSDM_InjConvStop(hdfsdm_filter);

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to start injected conversion in DMA mode.

+  * @note   This function should be called only when DFSDM filter instance is

+  *         in idle state or if regular conversion is ongoing.

+  *         Please note that data on buffer will contain signed injected conversion

+  *         value on 24 most significant bits and corresponding channel on 3 least

+  *         significant bits.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @param  pData The destination buffer address.

+  * @param  Length The length of data to be transferred from DFSDM filter to memory.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterInjectedStart_DMA(DFSDM_Filter_HandleTypeDef *hdfsdm_filter,

+                                                    int32_t                    *pData,

+                                                    uint32_t                    Length)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+

+  /* Check destination address and length */

+  if ((pData == NULL) || (Length == 0U))

+  {

+    status = HAL_ERROR;

+  }

+  /* Check that DMA is enabled for injected conversion */

+  else if ((hdfsdm_filter->Instance->FLTCR1 & DFSDM_FLTCR1_JDMAEN) != DFSDM_FLTCR1_JDMAEN)

+  {

+    status = HAL_ERROR;

+  }

+  /* Check parameters compatibility */

+  else if ((hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SW_TRIGGER) && \

+           (hdfsdm_filter->hdmaInj->Init.Mode == DMA_NORMAL) && \

+           (Length > hdfsdm_filter->InjConvRemaining))

+  {

+    status = HAL_ERROR;

+  }

+  else if ((hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SW_TRIGGER) && \

+           (hdfsdm_filter->hdmaInj->Init.Mode == DMA_CIRCULAR))

+  {

+    status = HAL_ERROR;

+  }

+  /* Check DFSDM filter state */

+  else if ((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_READY) || \

+           (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_REG))

+  {

+    /* Set callbacks on DMA handler */

+    hdfsdm_filter->hdmaInj->XferCpltCallback = DFSDM_DMAInjectedConvCplt;

+    hdfsdm_filter->hdmaInj->XferErrorCallback = DFSDM_DMAError;

+    hdfsdm_filter->hdmaInj->XferHalfCpltCallback = (hdfsdm_filter->hdmaInj->Init.Mode == DMA_CIRCULAR) ? \

+                                                   DFSDM_DMAInjectedHalfConvCplt : NULL;

+

+    /* Start DMA in interrupt mode */

+    if (HAL_DMA_Start_IT(hdfsdm_filter->hdmaInj, (uint32_t)&hdfsdm_filter->Instance->FLTJDATAR, \

+                         (uint32_t) pData, Length) != HAL_OK)

+    {

+      /* Set DFSDM filter in error state */

+      hdfsdm_filter->State = HAL_DFSDM_FILTER_STATE_ERROR;

+      status = HAL_ERROR;

+    }

+    else

+    {

+      /* Start injected conversion */

+      DFSDM_InjConvStart(hdfsdm_filter);

+    }

+  }

+  else

+  {

+    status = HAL_ERROR;

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to start injected conversion in DMA mode and to get

+  *         only the 16 most significant bits of conversion.

+  * @note   This function should be called only when DFSDM filter instance is

+  *         in idle state or if regular conversion is ongoing.

+  *         Please note that data on buffer will contain signed 16 most significant

+  *         bits of injected conversion.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @param  pData The destination buffer address.

+  * @param  Length The length of data to be transferred from DFSDM filter to memory.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterInjectedMsbStart_DMA(DFSDM_Filter_HandleTypeDef *hdfsdm_filter,

+                                                       int16_t                    *pData,

+                                                       uint32_t                    Length)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+

+  /* Check destination address and length */

+  if ((pData == NULL) || (Length == 0U))

+  {

+    status = HAL_ERROR;

+  }

+  /* Check that DMA is enabled for injected conversion */

+  else if ((hdfsdm_filter->Instance->FLTCR1 & DFSDM_FLTCR1_JDMAEN) != DFSDM_FLTCR1_JDMAEN)

+  {

+    status = HAL_ERROR;

+  }

+  /* Check parameters compatibility */

+  else if ((hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SW_TRIGGER) && \

+           (hdfsdm_filter->hdmaInj->Init.Mode == DMA_NORMAL) && \

+           (Length > hdfsdm_filter->InjConvRemaining))

+  {

+    status = HAL_ERROR;

+  }

+  else if ((hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SW_TRIGGER) && \

+           (hdfsdm_filter->hdmaInj->Init.Mode == DMA_CIRCULAR))

+  {

+    status = HAL_ERROR;

+  }

+  /* Check DFSDM filter state */

+  else if ((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_READY) || \

+           (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_REG))

+  {

+    /* Set callbacks on DMA handler */

+    hdfsdm_filter->hdmaInj->XferCpltCallback = DFSDM_DMAInjectedConvCplt;

+    hdfsdm_filter->hdmaInj->XferErrorCallback = DFSDM_DMAError;

+    hdfsdm_filter->hdmaInj->XferHalfCpltCallback = (hdfsdm_filter->hdmaInj->Init.Mode == DMA_CIRCULAR) ? \

+                                                   DFSDM_DMAInjectedHalfConvCplt : NULL;

+

+    /* Start DMA in interrupt mode */

+    if (HAL_DMA_Start_IT(hdfsdm_filter->hdmaInj, (uint32_t)(&hdfsdm_filter->Instance->FLTJDATAR) + 2U, \

+                         (uint32_t) pData, Length) != HAL_OK)

+    {

+      /* Set DFSDM filter in error state */

+      hdfsdm_filter->State = HAL_DFSDM_FILTER_STATE_ERROR;

+      status = HAL_ERROR;

+    }

+    else

+    {

+      /* Start injected conversion */

+      DFSDM_InjConvStart(hdfsdm_filter);

+    }

+  }

+  else

+  {

+    status = HAL_ERROR;

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to stop injected conversion in DMA mode.

+  * @note   This function should be called only if injected conversion is ongoing.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterInjectedStop_DMA(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+

+  /* Check DFSDM filter state */

+  if ((hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_INJ) && \

+      (hdfsdm_filter->State != HAL_DFSDM_FILTER_STATE_REG_INJ))

+  {

+    /* Return error status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Stop current DMA transfer */

+    if (HAL_DMA_Abort(hdfsdm_filter->hdmaInj) != HAL_OK)

+    {

+      /* Set DFSDM filter in error state */

+      hdfsdm_filter->State = HAL_DFSDM_FILTER_STATE_ERROR;

+      status = HAL_ERROR;

+    }

+    else

+    {

+      /* Stop regular conversion */

+      DFSDM_InjConvStop(hdfsdm_filter);

+    }

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to get injected conversion value.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @param  Channel Corresponding channel of injected conversion.

+  * @retval Injected conversion value

+  */

+int32_t HAL_DFSDM_FilterGetInjectedValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filter,

+                                         uint32_t                   *Channel)

+{

+  uint32_t reg;

+  int32_t  value;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+  assert_param(Channel != (void *)0);

+

+  /* Get value of data register for injected channel */

+  reg = hdfsdm_filter->Instance->FLTJDATAR;

+

+  /* Extract channel and injected conversion value */

+  *Channel = (reg & DFSDM_FLTJDATAR_JDATACH);

+  /* Injected conversion value is a signed value located on 24 MSB of register */

+  /* So after applying a mask on these bits we have to perform a division by 256 (2 raised to the power of 8) */

+  reg &= DFSDM_FLTJDATAR_JDATA;

+  value = ((int32_t)reg) / 256;

+

+  /* return regular conversion value */

+  return value;

+}

+

+/**

+  * @brief  This function allows to start filter analog watchdog in interrupt mode.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @param  awdParam DFSDM filter analog watchdog parameters.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterAwdStart_IT(DFSDM_Filter_HandleTypeDef   *hdfsdm_filter,

+                                              DFSDM_Filter_AwdParamTypeDef *awdParam)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+  assert_param(IS_DFSDM_FILTER_AWD_DATA_SOURCE(awdParam->DataSource));

+  assert_param(IS_DFSDM_INJECTED_CHANNEL(awdParam->Channel));

+  assert_param(IS_DFSDM_FILTER_AWD_THRESHOLD(awdParam->HighThreshold));

+  assert_param(IS_DFSDM_FILTER_AWD_THRESHOLD(awdParam->LowThreshold));

+  assert_param(IS_DFSDM_BREAK_SIGNALS(awdParam->HighBreakSignal));

+  assert_param(IS_DFSDM_BREAK_SIGNALS(awdParam->LowBreakSignal));

+

+  /* Check DFSDM filter state */

+  if ((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_RESET) || \

+      (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_ERROR))

+  {

+    /* Return error status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Set analog watchdog data source */

+    hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_AWFSEL);

+    hdfsdm_filter->Instance->FLTCR1 |= awdParam->DataSource;

+

+    /* Set thresholds and break signals */

+    hdfsdm_filter->Instance->FLTAWHTR &= ~(DFSDM_FLTAWHTR_AWHT | DFSDM_FLTAWHTR_BKAWH);

+    hdfsdm_filter->Instance->FLTAWHTR |= (((uint32_t) awdParam->HighThreshold << DFSDM_FLTAWHTR_AWHT_Pos) | \

+                                          awdParam->HighBreakSignal);

+    hdfsdm_filter->Instance->FLTAWLTR &= ~(DFSDM_FLTAWLTR_AWLT | DFSDM_FLTAWLTR_BKAWL);

+    hdfsdm_filter->Instance->FLTAWLTR |= (((uint32_t) awdParam->LowThreshold << DFSDM_FLTAWLTR_AWLT_Pos) | \

+                                          awdParam->LowBreakSignal);

+

+    /* Set channels and interrupt for analog watchdog */

+    hdfsdm_filter->Instance->FLTCR2 &= ~(DFSDM_FLTCR2_AWDCH);

+    hdfsdm_filter->Instance->FLTCR2 |= (((awdParam->Channel & DFSDM_LSB_MASK) << DFSDM_FLTCR2_AWDCH_Pos) | \

+                                        DFSDM_FLTCR2_AWDIE);

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to stop filter analog watchdog in interrupt mode.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterAwdStop_IT(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+

+  /* Check DFSDM filter state */

+  if ((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_RESET) || \

+      (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_ERROR))

+  {

+    /* Return error status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Reset channels for analog watchdog and deactivate interrupt */

+    hdfsdm_filter->Instance->FLTCR2 &= ~(DFSDM_FLTCR2_AWDCH | DFSDM_FLTCR2_AWDIE);

+

+    /* Clear all analog watchdog flags */

+    hdfsdm_filter->Instance->FLTAWCFR = (DFSDM_FLTAWCFR_CLRAWHTF | DFSDM_FLTAWCFR_CLRAWLTF);

+

+    /* Reset thresholds and break signals */

+    hdfsdm_filter->Instance->FLTAWHTR &= ~(DFSDM_FLTAWHTR_AWHT | DFSDM_FLTAWHTR_BKAWH);

+    hdfsdm_filter->Instance->FLTAWLTR &= ~(DFSDM_FLTAWLTR_AWLT | DFSDM_FLTAWLTR_BKAWL);

+

+    /* Reset analog watchdog data source */

+    hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_AWFSEL);

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to start extreme detector feature.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @param  Channel Channels where extreme detector is enabled.

+  *         This parameter can be a values combination of @ref DFSDM_Channel_Selection.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterExdStart(DFSDM_Filter_HandleTypeDef *hdfsdm_filter,

+                                           uint32_t                    Channel)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+  assert_param(IS_DFSDM_INJECTED_CHANNEL(Channel));

+

+  /* Check DFSDM filter state */

+  if ((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_RESET) || \

+      (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_ERROR))

+  {

+    /* Return error status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Set channels for extreme detector */

+    hdfsdm_filter->Instance->FLTCR2 &= ~(DFSDM_FLTCR2_EXCH);

+    hdfsdm_filter->Instance->FLTCR2 |= ((Channel & DFSDM_LSB_MASK) << DFSDM_FLTCR2_EXCH_Pos);

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to stop extreme detector feature.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DFSDM_FilterExdStop(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+  __IO uint32_t     reg1;

+  __IO uint32_t     reg2;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+

+  /* Check DFSDM filter state */

+  if ((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_RESET) || \

+      (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_ERROR))

+  {

+    /* Return error status */

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Reset channels for extreme detector */

+    hdfsdm_filter->Instance->FLTCR2 &= ~(DFSDM_FLTCR2_EXCH);

+

+    /* Clear extreme detector values */

+    reg1 = hdfsdm_filter->Instance->FLTEXMAX;

+    reg2 = hdfsdm_filter->Instance->FLTEXMIN;

+    UNUSED(reg1); /* To avoid GCC warning */

+    UNUSED(reg2); /* To avoid GCC warning */

+  }

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  This function allows to get extreme detector maximum value.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @param  Channel Corresponding channel.

+  * @retval Extreme detector maximum value

+  *         This value is between Min_Data = -8388608 and Max_Data = 8388607.

+  */

+int32_t HAL_DFSDM_FilterGetExdMaxValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filter,

+                                       uint32_t                   *Channel)

+{

+  uint32_t reg;

+  int32_t  value;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+  assert_param(Channel != (void *)0);

+

+  /* Get value of extreme detector maximum register */

+  reg = hdfsdm_filter->Instance->FLTEXMAX;

+

+  /* Extract channel and extreme detector maximum value */

+  *Channel = (reg & DFSDM_FLTEXMAX_EXMAXCH);

+  /* Extreme detector maximum value is a signed value located on 24 MSB of register */

+  /* So after applying a mask on these bits we have to perform a division by 256 (2 raised to the power of 8) */

+  reg &= DFSDM_FLTEXMAX_EXMAX;

+  value = ((int32_t)reg) / 256;

+

+  /* return extreme detector maximum value */

+  return value;

+}

+

+/**

+  * @brief  This function allows to get extreme detector minimum value.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @param  Channel Corresponding channel.

+  * @retval Extreme detector minimum value

+  *         This value is between Min_Data = -8388608 and Max_Data = 8388607.

+  */

+int32_t HAL_DFSDM_FilterGetExdMinValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filter,

+                                       uint32_t                   *Channel)

+{

+  uint32_t reg;

+  int32_t  value;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+  assert_param(Channel != (void *)0);

+

+  /* Get value of extreme detector minimum register */

+  reg = hdfsdm_filter->Instance->FLTEXMIN;

+

+  /* Extract channel and extreme detector minimum value */

+  *Channel = (reg & DFSDM_FLTEXMIN_EXMINCH);

+  /* Extreme detector minimum value is a signed value located on 24 MSB of register */

+  /* So after applying a mask on these bits we have to perform a division by 256 (2 raised to the power of 8) */

+  reg &= DFSDM_FLTEXMIN_EXMIN;

+  value = ((int32_t)reg) / 256;

+

+  /* return extreme detector minimum value */

+  return value;

+}

+

+/**

+  * @brief  This function allows to get conversion time value.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval Conversion time value

+  * @note   To get time in second, this value has to be divided by DFSDM clock frequency.

+  */

+uint32_t HAL_DFSDM_FilterGetConvTimeValue(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  uint32_t reg;

+  uint32_t value;

+

+  /* Check parameters */

+  assert_param(IS_DFSDM_FILTER_ALL_INSTANCE(hdfsdm_filter->Instance));

+

+  /* Get value of conversion timer register */

+  reg = hdfsdm_filter->Instance->FLTCNVTIMR;

+

+  /* Extract conversion time value */

+  value = ((reg & DFSDM_FLTCNVTIMR_CNVCNT) >> DFSDM_FLTCNVTIMR_CNVCNT_Pos);

+

+  /* return extreme detector minimum value */

+  return value;

+}

+

+/**

+  * @brief  This function handles the DFSDM interrupts.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval None

+  */

+void HAL_DFSDM_IRQHandler(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  /* Get FTLISR and FLTCR2 register values */

+  const uint32_t temp_fltisr = hdfsdm_filter->Instance->FLTISR;

+  const uint32_t temp_fltcr2 = hdfsdm_filter->Instance->FLTCR2;

+

+  /* Check if overrun occurs during regular conversion */

+  if (((temp_fltisr & DFSDM_FLTISR_ROVRF) != 0U) && \

+      ((temp_fltcr2 & DFSDM_FLTCR2_ROVRIE) != 0U))

+  {

+    /* Clear regular overrun flag */

+    hdfsdm_filter->Instance->FLTICR = DFSDM_FLTICR_CLRROVRF;

+

+    /* Update error code */

+    hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_REGULAR_OVERRUN;

+

+    /* Call error callback */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+    hdfsdm_filter->ErrorCallback(hdfsdm_filter);

+#else

+    HAL_DFSDM_FilterErrorCallback(hdfsdm_filter);

+#endif

+  }

+  /* Check if overrun occurs during injected conversion */

+  else if (((temp_fltisr & DFSDM_FLTISR_JOVRF) != 0U) && \

+           ((temp_fltcr2 & DFSDM_FLTCR2_JOVRIE) != 0U))

+  {

+    /* Clear injected overrun flag */

+    hdfsdm_filter->Instance->FLTICR = DFSDM_FLTICR_CLRJOVRF;

+

+    /* Update error code */

+    hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_INJECTED_OVERRUN;

+

+    /* Call error callback */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+    hdfsdm_filter->ErrorCallback(hdfsdm_filter);

+#else

+    HAL_DFSDM_FilterErrorCallback(hdfsdm_filter);

+#endif

+  }

+  /* Check if end of regular conversion */

+  else if (((temp_fltisr & DFSDM_FLTISR_REOCF) != 0U) && \

+           ((temp_fltcr2 & DFSDM_FLTCR2_REOCIE) != 0U))

+  {

+    /* Call regular conversion complete callback */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+    hdfsdm_filter->RegConvCpltCallback(hdfsdm_filter);

+#else

+    HAL_DFSDM_FilterRegConvCpltCallback(hdfsdm_filter);

+#endif

+

+    /* End of conversion if mode is not continuous and software trigger */

+    if ((hdfsdm_filter->RegularContMode == DFSDM_CONTINUOUS_CONV_OFF) && \

+        (hdfsdm_filter->RegularTrigger == DFSDM_FILTER_SW_TRIGGER))

+    {

+      /* Disable interrupts for regular conversions */

+      hdfsdm_filter->Instance->FLTCR2 &= ~(DFSDM_FLTCR2_REOCIE);

+

+      /* Update DFSDM filter state */

+      hdfsdm_filter->State = (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_REG) ? \

+                             HAL_DFSDM_FILTER_STATE_READY : HAL_DFSDM_FILTER_STATE_INJ;

+    }

+  }

+  /* Check if end of injected conversion */

+  else if (((temp_fltisr & DFSDM_FLTISR_JEOCF) != 0U) && \

+           ((temp_fltcr2 & DFSDM_FLTCR2_JEOCIE) != 0U))

+  {

+    /* Call injected conversion complete callback */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+    hdfsdm_filter->InjConvCpltCallback(hdfsdm_filter);

+#else

+    HAL_DFSDM_FilterInjConvCpltCallback(hdfsdm_filter);

+#endif

+

+    /* Update remaining injected conversions */

+    hdfsdm_filter->InjConvRemaining--;

+    if (hdfsdm_filter->InjConvRemaining == 0U)

+    {

+      /* End of conversion if trigger is software */

+      if (hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SW_TRIGGER)

+      {

+        /* Disable interrupts for injected conversions */

+        hdfsdm_filter->Instance->FLTCR2 &= ~(DFSDM_FLTCR2_JEOCIE);

+

+        /* Update DFSDM filter state */

+        hdfsdm_filter->State = (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_INJ) ? \

+                               HAL_DFSDM_FILTER_STATE_READY : HAL_DFSDM_FILTER_STATE_REG;

+      }

+      /* end of injected sequence, reset the value */

+      hdfsdm_filter->InjConvRemaining = (hdfsdm_filter->InjectedScanMode == ENABLE) ? \

+                                        hdfsdm_filter->InjectedChannelsNbr : 1U;

+    }

+  }

+  /* Check if analog watchdog occurs */

+  else if (((temp_fltisr & DFSDM_FLTISR_AWDF) != 0U) && \

+           ((temp_fltcr2 & DFSDM_FLTCR2_AWDIE) != 0U))

+  {

+    uint32_t reg;

+    uint32_t threshold;

+    uint32_t channel = 0;

+

+    /* Get channel and threshold */

+    reg = hdfsdm_filter->Instance->FLTAWSR;

+    threshold = ((reg & DFSDM_FLTAWSR_AWLTF) != 0U) ? DFSDM_AWD_LOW_THRESHOLD : DFSDM_AWD_HIGH_THRESHOLD;

+    if (threshold == DFSDM_AWD_HIGH_THRESHOLD)

+    {

+      reg = reg >> DFSDM_FLTAWSR_AWHTF_Pos;

+    }

+    while (((reg & 1U) == 0U) && (channel < (DFSDM1_CHANNEL_NUMBER - 1U)))

+    {

+      channel++;

+      reg = reg >> 1;

+    }

+    /* Clear analog watchdog flag */

+    hdfsdm_filter->Instance->FLTAWCFR = (threshold == DFSDM_AWD_HIGH_THRESHOLD) ? \

+                                        (1UL << (DFSDM_FLTAWSR_AWHTF_Pos + channel)) : \

+                                        (1UL << channel);

+

+    /* Call analog watchdog callback */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+    hdfsdm_filter->AwdCallback(hdfsdm_filter, channel, threshold);

+#else

+    HAL_DFSDM_FilterAwdCallback(hdfsdm_filter, channel, threshold);

+#endif

+  }

+  /* Check if clock absence occurs */

+  else if ((hdfsdm_filter->Instance == DFSDM1_Filter0) && \

+           ((temp_fltisr & DFSDM_FLTISR_CKABF) != 0U) && \

+           ((temp_fltcr2 & DFSDM_FLTCR2_CKABIE) != 0U))

+  {

+    uint32_t reg;

+    uint32_t channel = 0;

+

+    reg = ((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_CKABF) >> DFSDM_FLTISR_CKABF_Pos);

+

+    while (channel < DFSDM1_CHANNEL_NUMBER)

+    {

+      /* Check if flag is set and corresponding channel is enabled */

+      if (((reg & 1U) != 0U) && (a_dfsdm1ChannelHandle[channel] != NULL))

+      {

+        /* Check clock absence has been enabled for this channel */

+        if ((a_dfsdm1ChannelHandle[channel]->Instance->CHCFGR1 & DFSDM_CHCFGR1_CKABEN) != 0U)

+        {

+          /* Clear clock absence flag */

+          hdfsdm_filter->Instance->FLTICR = (1UL << (DFSDM_FLTICR_CLRCKABF_Pos + channel));

+

+          /* Call clock absence callback */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+          a_dfsdm1ChannelHandle[channel]->CkabCallback(a_dfsdm1ChannelHandle[channel]);

+#else

+          HAL_DFSDM_ChannelCkabCallback(a_dfsdm1ChannelHandle[channel]);

+#endif

+        }

+      }

+      channel++;

+      reg = reg >> 1;

+    }

+  }

+  /* Check if short circuit detection occurs */

+  else if ((hdfsdm_filter->Instance == DFSDM1_Filter0) && \

+           ((temp_fltisr & DFSDM_FLTISR_SCDF) != 0U) && \

+           ((temp_fltcr2 & DFSDM_FLTCR2_SCDIE) != 0U))

+  {

+    uint32_t reg;

+    uint32_t channel = 0;

+

+    /* Get channel */

+    reg = ((hdfsdm_filter->Instance->FLTISR & DFSDM_FLTISR_SCDF) >> DFSDM_FLTISR_SCDF_Pos);

+    while (((reg & 1U) == 0U) && (channel < (DFSDM1_CHANNEL_NUMBER - 1U)))

+    {

+      channel++;

+      reg = reg >> 1;

+    }

+

+    /* Clear short circuit detection flag */

+    hdfsdm_filter->Instance->FLTICR = (1UL << (DFSDM_FLTICR_CLRSCDF_Pos + channel));

+

+    /* Call short circuit detection callback */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+    a_dfsdm1ChannelHandle[channel]->ScdCallback(a_dfsdm1ChannelHandle[channel]);

+#else

+    HAL_DFSDM_ChannelScdCallback(a_dfsdm1ChannelHandle[channel]);

+#endif

+  }

+}

+

+/**

+  * @brief  Regular conversion complete callback.

+  * @note   In interrupt mode, user has to read conversion value in this function

+  *         using HAL_DFSDM_FilterGetRegularValue.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval None

+  */

+__weak void HAL_DFSDM_FilterRegConvCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hdfsdm_filter);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_DFSDM_FilterRegConvCpltCallback could be implemented in the user file.

+   */

+}

+

+/**

+  * @brief  Half regular conversion complete callback.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval None

+  */

+__weak void HAL_DFSDM_FilterRegConvHalfCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hdfsdm_filter);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_DFSDM_FilterRegConvHalfCpltCallback could be implemented in the user file.

+   */

+}

+

+/**

+  * @brief  Injected conversion complete callback.

+  * @note   In interrupt mode, user has to read conversion value in this function

+  *         using HAL_DFSDM_FilterGetInjectedValue.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval None

+  */

+__weak void HAL_DFSDM_FilterInjConvCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hdfsdm_filter);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_DFSDM_FilterInjConvCpltCallback could be implemented in the user file.

+   */

+}

+

+/**

+  * @brief  Half injected conversion complete callback.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval None

+  */

+__weak void HAL_DFSDM_FilterInjConvHalfCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hdfsdm_filter);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_DFSDM_FilterInjConvHalfCpltCallback could be implemented in the user file.

+   */

+}

+

+/**

+  * @brief  Filter analog watchdog callback.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @param  Channel Corresponding channel.

+  * @param  Threshold Low or high threshold has been reached.

+  * @retval None

+  */

+__weak void HAL_DFSDM_FilterAwdCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter,

+                                        uint32_t Channel, uint32_t Threshold)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hdfsdm_filter);

+  UNUSED(Channel);

+  UNUSED(Threshold);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_DFSDM_FilterAwdCallback could be implemented in the user file.

+   */

+}

+

+/**

+  * @brief  Error callback.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval None

+  */

+__weak void HAL_DFSDM_FilterErrorCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hdfsdm_filter);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_DFSDM_FilterErrorCallback could be implemented in the user file.

+   */

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup DFSDM_Exported_Functions_Group4_Filter Filter state functions

+ *  @brief    Filter state functions

+ *

+@verbatim

+  ==============================================================================

+                     ##### Filter state functions #####

+  ==============================================================================

+    [..]  This section provides functions allowing to:

+      (+) Get the DFSDM filter state.

+      (+) Get the DFSDM filter error.

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  This function allows to get the current DFSDM filter handle state.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval DFSDM filter state.

+  */

+HAL_DFSDM_Filter_StateTypeDef HAL_DFSDM_FilterGetState(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  /* Return DFSDM filter handle state */

+  return hdfsdm_filter->State;

+}

+

+/**

+  * @brief  This function allows to get the current DFSDM filter error.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval DFSDM filter error code.

+  */

+uint32_t HAL_DFSDM_FilterGetError(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  return hdfsdm_filter->ErrorCode;

+}

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+/* End of exported functions -------------------------------------------------*/

+

+/* Private functions ---------------------------------------------------------*/

+/** @addtogroup DFSDM_Private_Functions DFSDM Private Functions

+  * @{

+  */

+

+/**

+  * @brief  DMA half transfer complete callback for regular conversion.

+  * @param  hdma DMA handle.

+  * @retval None

+  */

+static void DFSDM_DMARegularHalfConvCplt(DMA_HandleTypeDef *hdma)

+{

+  /* Get DFSDM filter handle */

+  DFSDM_Filter_HandleTypeDef *hdfsdm_filter = (DFSDM_Filter_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;

+

+  /* Call regular half conversion complete callback */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+  hdfsdm_filter->RegConvHalfCpltCallback(hdfsdm_filter);

+#else

+  HAL_DFSDM_FilterRegConvHalfCpltCallback(hdfsdm_filter);

+#endif

+}

+

+/**

+  * @brief  DMA transfer complete callback for regular conversion.

+  * @param  hdma DMA handle.

+  * @retval None

+  */

+static void DFSDM_DMARegularConvCplt(DMA_HandleTypeDef *hdma)

+{

+  /* Get DFSDM filter handle */

+  DFSDM_Filter_HandleTypeDef *hdfsdm_filter = (DFSDM_Filter_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;

+

+  /* Call regular conversion complete callback */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+  hdfsdm_filter->RegConvCpltCallback(hdfsdm_filter);

+#else

+  HAL_DFSDM_FilterRegConvCpltCallback(hdfsdm_filter);

+#endif

+}

+

+/**

+  * @brief  DMA half transfer complete callback for injected conversion.

+  * @param  hdma DMA handle.

+  * @retval None

+  */

+static void DFSDM_DMAInjectedHalfConvCplt(DMA_HandleTypeDef *hdma)

+{

+  /* Get DFSDM filter handle */

+  DFSDM_Filter_HandleTypeDef *hdfsdm_filter = (DFSDM_Filter_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;

+

+  /* Call injected half conversion complete callback */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+  hdfsdm_filter->InjConvHalfCpltCallback(hdfsdm_filter);

+#else

+  HAL_DFSDM_FilterInjConvHalfCpltCallback(hdfsdm_filter);

+#endif

+}

+

+/**

+  * @brief  DMA transfer complete callback for injected conversion.

+  * @param  hdma DMA handle.

+  * @retval None

+  */

+static void DFSDM_DMAInjectedConvCplt(DMA_HandleTypeDef *hdma)

+{

+  /* Get DFSDM filter handle */

+  DFSDM_Filter_HandleTypeDef *hdfsdm_filter = (DFSDM_Filter_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;

+

+  /* Call injected conversion complete callback */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+  hdfsdm_filter->InjConvCpltCallback(hdfsdm_filter);

+#else

+  HAL_DFSDM_FilterInjConvCpltCallback(hdfsdm_filter);

+#endif

+}

+

+/**

+  * @brief  DMA error callback.

+  * @param  hdma DMA handle.

+  * @retval None

+  */

+static void DFSDM_DMAError(DMA_HandleTypeDef *hdma)

+{

+  /* Get DFSDM filter handle */

+  DFSDM_Filter_HandleTypeDef *hdfsdm_filter = (DFSDM_Filter_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;

+

+  /* Update error code */

+  hdfsdm_filter->ErrorCode = DFSDM_FILTER_ERROR_DMA;

+

+  /* Call error callback */

+#if (USE_HAL_DFSDM_REGISTER_CALLBACKS == 1)

+  hdfsdm_filter->ErrorCallback(hdfsdm_filter);

+#else

+  HAL_DFSDM_FilterErrorCallback(hdfsdm_filter);

+#endif

+}

+

+/**

+  * @brief  This function allows to get the number of injected channels.

+  * @param  Channels bitfield of injected channels.

+  * @retval Number of injected channels.

+  */

+static uint32_t DFSDM_GetInjChannelsNbr(uint32_t Channels)

+{

+  uint32_t nbChannels = 0;

+  uint32_t tmp;

+

+  /* Get the number of channels from bitfield */

+  tmp = (uint32_t)(Channels & DFSDM_LSB_MASK);

+  while (tmp != 0U)

+  {

+    if ((tmp & 1U) != 0U)

+    {

+      nbChannels++;

+    }

+    tmp = (uint32_t)(tmp >> 1);

+  }

+  return nbChannels;

+}

+

+/**

+  * @brief  This function allows to get the channel number from channel instance.

+  * @param  Instance DFSDM channel instance.

+  * @retval Channel number.

+  */

+static uint32_t DFSDM_GetChannelFromInstance(const DFSDM_Channel_TypeDef *Instance)

+{

+  uint32_t channel;

+

+  /* Get channel from instance */

+  if (Instance == DFSDM1_Channel0)

+  {

+    channel = 0;

+  }

+  else if (Instance == DFSDM1_Channel1)

+  {

+    channel = 1;

+  }

+  else if (Instance == DFSDM1_Channel2)

+  {

+    channel = 2;

+  }

+  else if (Instance == DFSDM1_Channel3)

+  {

+    channel = 3;

+  }

+#if defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx) || \

+    defined(STM32L496xx) || defined(STM32L4A6xx) || \

+    defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+  else if (Instance == DFSDM1_Channel4)

+  {

+    channel = 4;

+  }

+  else if (Instance == DFSDM1_Channel5)

+  {

+    channel = 5;

+  }

+  else if (Instance == DFSDM1_Channel6)

+  {

+    channel = 6;

+  }

+  else if (Instance == DFSDM1_Channel7)

+  {

+    channel = 7;

+  }

+#endif /* STM32L471xx || STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx || STM32L496xx || STM32L4A6xx || STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+  else

+  {

+    channel = 0;

+  }

+

+  return channel;

+}

+

+/**

+  * @brief  This function allows to really start regular conversion.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval None

+  */

+static void DFSDM_RegConvStart(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  /* Check regular trigger */

+  if (hdfsdm_filter->RegularTrigger == DFSDM_FILTER_SW_TRIGGER)

+  {

+    /* Software start of regular conversion */

+    hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_RSWSTART;

+  }

+  else /* synchronous trigger */

+  {

+    /* Disable DFSDM filter */

+    hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_DFEN);

+

+    /* Set RSYNC bit in DFSDM_FLTCR1 register */

+    hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_RSYNC;

+

+    /* Enable DFSDM  filter */

+    hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_DFEN;

+

+    /* If injected conversion was in progress, restart it */

+    if (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_INJ)

+    {

+      if (hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SW_TRIGGER)

+      {

+        hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_JSWSTART;

+      }

+      /* Update remaining injected conversions */

+      hdfsdm_filter->InjConvRemaining = (hdfsdm_filter->InjectedScanMode == ENABLE) ? \

+                                        hdfsdm_filter->InjectedChannelsNbr : 1U;

+    }

+  }

+  /* Update DFSDM filter state */

+  hdfsdm_filter->State = (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_READY) ? \

+                         HAL_DFSDM_FILTER_STATE_REG : HAL_DFSDM_FILTER_STATE_REG_INJ;

+}

+

+/**

+  * @brief  This function allows to really stop regular conversion.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval None

+  */

+static void DFSDM_RegConvStop(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  /* Disable DFSDM filter */

+  hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_DFEN);

+

+  /* If regular trigger was synchronous, reset RSYNC bit in DFSDM_FLTCR1 register */

+  if (hdfsdm_filter->RegularTrigger == DFSDM_FILTER_SYNC_TRIGGER)

+  {

+    hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_RSYNC);

+  }

+

+  /* Enable DFSDM filter */

+  hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_DFEN;

+

+  /* If injected conversion was in progress, restart it */

+  if (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_REG_INJ)

+  {

+    if (hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SW_TRIGGER)

+    {

+      hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_JSWSTART;

+    }

+    /* Update remaining injected conversions */

+    hdfsdm_filter->InjConvRemaining = (hdfsdm_filter->InjectedScanMode == ENABLE) ? \

+                                      hdfsdm_filter->InjectedChannelsNbr : 1U;

+  }

+

+  /* Update DFSDM filter state */

+  hdfsdm_filter->State = (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_REG) ? \

+                         HAL_DFSDM_FILTER_STATE_READY : HAL_DFSDM_FILTER_STATE_INJ;

+}

+

+/**

+  * @brief  This function allows to really start injected conversion.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval None

+  */

+static void DFSDM_InjConvStart(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  /* Check injected trigger */

+  if (hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SW_TRIGGER)

+  {

+    /* Software start of injected conversion */

+    hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_JSWSTART;

+  }

+  else /* external or synchronous trigger */

+  {

+    /* Disable DFSDM filter */

+    hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_DFEN);

+

+    if (hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SYNC_TRIGGER)

+    {

+      /* Set JSYNC bit in DFSDM_FLTCR1 register */

+      hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_JSYNC;

+    }

+    else /* external trigger */

+    {

+      /* Set JEXTEN[1:0] bits in DFSDM_FLTCR1 register */

+      hdfsdm_filter->Instance->FLTCR1 |= hdfsdm_filter->ExtTriggerEdge;

+    }

+

+    /* Enable DFSDM filter */

+    hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_DFEN;

+

+    /* If regular conversion was in progress, restart it */

+    if ((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_REG) && \

+        (hdfsdm_filter->RegularTrigger == DFSDM_FILTER_SW_TRIGGER))

+    {

+      hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_RSWSTART;

+    }

+  }

+  /* Update DFSDM filter state */

+  hdfsdm_filter->State = (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_READY) ? \

+                         HAL_DFSDM_FILTER_STATE_INJ : HAL_DFSDM_FILTER_STATE_REG_INJ;

+}

+

+/**

+  * @brief  This function allows to really stop injected conversion.

+  * @param  hdfsdm_filter DFSDM filter handle.

+  * @retval None

+  */

+static void DFSDM_InjConvStop(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)

+{

+  /* Disable DFSDM filter */

+  hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_DFEN);

+

+  /* If injected trigger was synchronous, reset JSYNC bit in DFSDM_FLTCR1 register */

+  if (hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_SYNC_TRIGGER)

+  {

+    hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_JSYNC);

+  }

+  else if (hdfsdm_filter->InjectedTrigger == DFSDM_FILTER_EXT_TRIGGER)

+  {

+    /* Reset JEXTEN[1:0] bits in DFSDM_FLTCR1 register */

+    hdfsdm_filter->Instance->FLTCR1 &= ~(DFSDM_FLTCR1_JEXTEN);

+  }

+  else

+  {

+    /* Nothing to do */

+  }

+

+  /* Enable DFSDM filter */

+  hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_DFEN;

+

+  /* If regular conversion was in progress, restart it */

+  if ((hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_REG_INJ) && \

+      (hdfsdm_filter->RegularTrigger == DFSDM_FILTER_SW_TRIGGER))

+  {

+    hdfsdm_filter->Instance->FLTCR1 |= DFSDM_FLTCR1_RSWSTART;

+  }

+

+  /* Update remaining injected conversions */

+  hdfsdm_filter->InjConvRemaining = (hdfsdm_filter->InjectedScanMode == ENABLE) ? \

+                                    hdfsdm_filter->InjectedChannelsNbr : 1U;

+

+  /* Update DFSDM filter state */

+  hdfsdm_filter->State = (hdfsdm_filter->State == HAL_DFSDM_FILTER_STATE_INJ) ? \

+                         HAL_DFSDM_FILTER_STATE_READY : HAL_DFSDM_FILTER_STATE_REG;

+}

+

+/**

+  * @}

+  */

+/* End of private functions --------------------------------------------------*/

+

+/**

+  * @}

+  */

+

+#endif /* STM32L451xx || STM32L452xx || STM32L462xx || STM32L471xx || STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx || STM32L496xx || STM32L4A6xx || STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+#endif /* HAL_DFSDM_MODULE_ENABLED */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c
new file mode 100644
index 0000000..7746d0e
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c
@@ -0,0 +1,1175 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_dma.c

+  * @author  MCD Application Team

+  * @brief   DMA HAL module driver.

+  *          This file provides firmware functions to manage the following

+  *          functionalities of the Direct Memory Access (DMA) peripheral:

+  *           + Initialization and de-initialization functions

+  *           + IO operation functions

+  *           + Peripheral State and errors functions

+  @verbatim

+  ==============================================================================

+                        ##### How to use this driver #####

+  ==============================================================================

+  [..]

+   (#) Enable and configure the peripheral to be connected to the DMA Channel

+       (except for internal SRAM / FLASH memories: no initialization is

+       necessary). Please refer to the Reference manual for connection between peripherals

+       and DMA requests.

+

+   (#) For a given Channel, program the required configuration through the following parameters:

+       Channel request, Transfer Direction, Source and Destination data formats,

+       Circular or Normal mode, Channel Priority level, Source and Destination Increment mode

+       using HAL_DMA_Init() function.

+

+       Prior to HAL_DMA_Init the peripheral clock shall be enabled for both DMA & DMAMUX

+       thanks to:

+      (##) DMA1 or DMA2: __HAL_RCC_DMA1_CLK_ENABLE() or  __HAL_RCC_DMA2_CLK_ENABLE() ;

+      (##) DMAMUX1:      __HAL_RCC_DMAMUX1_CLK_ENABLE();

+

+   (#) Use HAL_DMA_GetState() function to return the DMA state and HAL_DMA_GetError() in case of error

+       detection.

+

+   (#) Use HAL_DMA_Abort() function to abort the current transfer

+

+     -@-   In Memory-to-Memory transfer mode, Circular mode is not allowed.

+

+     *** Polling mode IO operation ***

+     =================================

+     [..]

+       (+) Use HAL_DMA_Start() to start DMA transfer after the configuration of Source

+           address and destination address and the Length of data to be transferred

+       (+) Use HAL_DMA_PollForTransfer() to poll for the end of current transfer, in this

+           case a fixed Timeout can be configured by User depending from his application.

+

+     *** Interrupt mode IO operation ***

+     ===================================

+     [..]

+       (+) Configure the DMA interrupt priority using HAL_NVIC_SetPriority()

+       (+) Enable the DMA IRQ handler using HAL_NVIC_EnableIRQ()

+       (+) Use HAL_DMA_Start_IT() to start DMA transfer after the configuration of

+           Source address and destination address and the Length of data to be transferred.

+           In this case the DMA interrupt is configured

+       (+) Use HAL_DMA_IRQHandler() called under DMA_IRQHandler() Interrupt subroutine

+       (+) At the end of data transfer HAL_DMA_IRQHandler() function is executed and user can

+              add his own function to register callbacks with HAL_DMA_RegisterCallback().

+

+     *** DMA HAL driver macros list ***

+     =============================================

+     [..]

+       Below the list of macros in DMA HAL driver.

+

+       (+) __HAL_DMA_ENABLE: Enable the specified DMA Channel.

+       (+) __HAL_DMA_DISABLE: Disable the specified DMA Channel.

+       (+) __HAL_DMA_GET_FLAG: Get the DMA Channel pending flags.

+       (+) __HAL_DMA_CLEAR_FLAG: Clear the DMA Channel pending flags.

+       (+) __HAL_DMA_ENABLE_IT: Enable the specified DMA Channel interrupts.

+       (+) __HAL_DMA_DISABLE_IT: Disable the specified DMA Channel interrupts.

+       (+) __HAL_DMA_GET_IT_SOURCE: Check whether the specified DMA Channel interrupt is enabled or not.

+

+     [..]

+      (@) You can refer to the DMA HAL driver header file for more useful macros

+

+  @endverbatim

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup DMA DMA

+  * @brief DMA HAL module driver

+  * @{

+  */

+

+#ifdef HAL_DMA_MODULE_ENABLED

+

+/* Private typedef -----------------------------------------------------------*/

+/* Private define ------------------------------------------------------------*/

+/* Private macro -------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/* Private function prototypes -----------------------------------------------*/

+/** @defgroup DMA_Private_Functions DMA Private Functions

+  * @{

+  */

+static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength);

+#if defined(DMAMUX1)

+static void DMA_CalcDMAMUXChannelBaseAndMask(DMA_HandleTypeDef *hdma);

+static void DMA_CalcDMAMUXRequestGenBaseAndMask(DMA_HandleTypeDef *hdma);

+#endif /* DMAMUX1 */

+

+/**

+  * @}

+  */

+

+/* Exported functions ---------------------------------------------------------*/

+

+/** @defgroup DMA_Exported_Functions DMA Exported Functions

+  * @{

+  */

+

+/** @defgroup DMA_Exported_Functions_Group1 Initialization and de-initialization functions

+ *  @brief   Initialization and de-initialization functions

+ *

+@verbatim

+ ===============================================================================

+             ##### Initialization and de-initialization functions  #####

+ ===============================================================================

+    [..]

+    This section provides functions allowing to initialize the DMA Channel source

+    and destination addresses, incrementation and data sizes, transfer direction,

+    circular/normal mode selection, memory-to-memory mode selection and Channel priority value.

+    [..]

+    The HAL_DMA_Init() function follows the DMA configuration procedures as described in

+    reference manual.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Initialize the DMA according to the specified

+  *         parameters in the DMA_InitTypeDef and initialize the associated handle.

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *              the configuration information for the specified DMA Channel.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma)

+{

+  uint32_t tmp;

+

+  /* Check the DMA handle allocation */

+  if(hdma == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check the parameters */

+  assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance));

+  assert_param(IS_DMA_DIRECTION(hdma->Init.Direction));

+  assert_param(IS_DMA_PERIPHERAL_INC_STATE(hdma->Init.PeriphInc));

+  assert_param(IS_DMA_MEMORY_INC_STATE(hdma->Init.MemInc));

+  assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(hdma->Init.PeriphDataAlignment));

+  assert_param(IS_DMA_MEMORY_DATA_SIZE(hdma->Init.MemDataAlignment));

+  assert_param(IS_DMA_MODE(hdma->Init.Mode));

+  assert_param(IS_DMA_PRIORITY(hdma->Init.Priority));

+

+  assert_param(IS_DMA_ALL_REQUEST(hdma->Init.Request));

+

+  /* Compute the channel index */

+  if ((uint32_t)(hdma->Instance) < (uint32_t)(DMA2_Channel1))

+  {

+    /* DMA1 */

+    hdma->ChannelIndex = (((uint32_t)hdma->Instance - (uint32_t)DMA1_Channel1) / ((uint32_t)DMA1_Channel2 - (uint32_t)DMA1_Channel1)) << 2U;

+    hdma->DmaBaseAddress = DMA1;

+  }

+  else

+  {

+    /* DMA2 */

+    hdma->ChannelIndex = (((uint32_t)hdma->Instance - (uint32_t)DMA2_Channel1) / ((uint32_t)DMA2_Channel2 - (uint32_t)DMA2_Channel1)) << 2U;

+    hdma->DmaBaseAddress = DMA2;

+  }

+

+  /* Change DMA peripheral state */

+  hdma->State = HAL_DMA_STATE_BUSY;

+

+  /* Get the CR register value */

+  tmp = hdma->Instance->CCR;

+

+  /* Clear PL, MSIZE, PSIZE, MINC, PINC, CIRC, DIR and MEM2MEM bits */

+  tmp &= ((uint32_t)~(DMA_CCR_PL    | DMA_CCR_MSIZE  | DMA_CCR_PSIZE  |

+                      DMA_CCR_MINC  | DMA_CCR_PINC   | DMA_CCR_CIRC   |

+                      DMA_CCR_DIR   | DMA_CCR_MEM2MEM));

+

+  /* Prepare the DMA Channel configuration */

+  tmp |=  hdma->Init.Direction        |

+          hdma->Init.PeriphInc           | hdma->Init.MemInc           |

+          hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment |

+          hdma->Init.Mode                | hdma->Init.Priority;

+

+  /* Write to DMA Channel CR register */

+  hdma->Instance->CCR = tmp;

+

+#if defined(DMAMUX1)

+  /* Initialize parameters for DMAMUX channel :

+     DMAmuxChannel, DMAmuxChannelStatus and DMAmuxChannelStatusMask

+  */

+  DMA_CalcDMAMUXChannelBaseAndMask(hdma);

+

+  if(hdma->Init.Direction == DMA_MEMORY_TO_MEMORY)

+  {

+    /* if memory to memory force the request to 0*/

+    hdma->Init.Request = DMA_REQUEST_MEM2MEM;

+  }

+

+  /* Set peripheral request  to DMAMUX channel */

+  hdma->DMAmuxChannel->CCR = (hdma->Init.Request & DMAMUX_CxCR_DMAREQ_ID);

+

+  /* Clear the DMAMUX synchro overrun flag */

+  hdma->DMAmuxChannelStatus->CFR = hdma->DMAmuxChannelStatusMask;

+

+  if(((hdma->Init.Request > 0U) && (hdma->Init.Request <= DMA_REQUEST_GENERATOR3)))

+  {

+    /* Initialize parameters for DMAMUX request generator :

+       DMAmuxRequestGen, DMAmuxRequestGenStatus and DMAmuxRequestGenStatusMask

+    */

+    DMA_CalcDMAMUXRequestGenBaseAndMask(hdma);

+

+    /* Reset the DMAMUX request generator register*/

+    hdma->DMAmuxRequestGen->RGCR = 0U;

+

+    /* Clear the DMAMUX request generator overrun flag */

+    hdma->DMAmuxRequestGenStatus->RGCFR = hdma->DMAmuxRequestGenStatusMask;

+  }

+  else

+  {

+    hdma->DMAmuxRequestGen = 0U;

+    hdma->DMAmuxRequestGenStatus = 0U;

+    hdma->DMAmuxRequestGenStatusMask = 0U;

+  }

+#endif /* DMAMUX1 */

+

+#if !defined (DMAMUX1)

+

+  /* Set request selection */

+  if(hdma->Init.Direction != DMA_MEMORY_TO_MEMORY)

+  {

+    /* Write to DMA channel selection register */

+    if (DMA1 == hdma->DmaBaseAddress)

+    {

+      /* Reset request selection for DMA1 Channelx */

+      DMA1_CSELR->CSELR &= ~(DMA_CSELR_C1S << (hdma->ChannelIndex & 0x1cU));

+

+      /* Configure request selection for DMA1 Channelx */

+      DMA1_CSELR->CSELR |= (uint32_t) (hdma->Init.Request << (hdma->ChannelIndex & 0x1cU));

+    }

+    else /* DMA2 */

+    {

+      /* Reset request selection for DMA2 Channelx */

+      DMA2_CSELR->CSELR &= ~(DMA_CSELR_C1S << (hdma->ChannelIndex & 0x1cU));

+

+      /* Configure request selection for DMA2 Channelx */

+      DMA2_CSELR->CSELR |= (uint32_t) (hdma->Init.Request << (hdma->ChannelIndex & 0x1cU));

+    }

+  }

+

+#endif /* STM32L431xx || STM32L432xx || STM32L433xx || STM32L442xx || STM32L443xx */

+       /* STM32L471xx || STM32L475xx || STM32L476xx || STM32L442xx || STM32L486xx */

+       /* STM32L496xx || STM32L4A6xx                                              */

+

+  /* Initialise the error code */

+  hdma->ErrorCode = HAL_DMA_ERROR_NONE;

+

+  /* Initialize the DMA state*/

+  hdma->State = HAL_DMA_STATE_READY;

+

+  /* Allocate lock resource and initialize it */

+  hdma->Lock = HAL_UNLOCKED;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  DeInitialize the DMA peripheral.

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *               the configuration information for the specified DMA Channel.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma)

+{

+

+  /* Check the DMA handle allocation */

+  if (NULL == hdma )

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check the parameters */

+  assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance));

+

+  /* Disable the selected DMA Channelx */

+  __HAL_DMA_DISABLE(hdma);

+

+  /* Compute the channel index */

+  if ((uint32_t)(hdma->Instance) < (uint32_t)(DMA2_Channel1))

+  {

+    /* DMA1 */

+    hdma->ChannelIndex = (((uint32_t)hdma->Instance - (uint32_t)DMA1_Channel1) / ((uint32_t)DMA1_Channel2 - (uint32_t)DMA1_Channel1)) << 2U;

+    hdma->DmaBaseAddress = DMA1;

+  }

+  else

+  {

+    /* DMA2 */

+    hdma->ChannelIndex = (((uint32_t)hdma->Instance - (uint32_t)DMA2_Channel1) / ((uint32_t)DMA2_Channel2 - (uint32_t)DMA2_Channel1)) << 2U;

+    hdma->DmaBaseAddress = DMA2;

+  }

+

+  /* Reset DMA Channel control register */

+  hdma->Instance->CCR = 0U;

+

+  /* Clear all flags */

+  hdma->DmaBaseAddress->IFCR = (DMA_ISR_GIF1 << (hdma->ChannelIndex & 0x1CU));

+

+#if !defined (DMAMUX1)

+

+  /* Reset DMA channel selection register */

+  if (DMA1 == hdma->DmaBaseAddress)

+  {

+    /* DMA1 */

+    DMA1_CSELR->CSELR &= ~(DMA_CSELR_C1S << (hdma->ChannelIndex & 0x1cU));

+  }

+  else

+  {

+    /* DMA2 */

+    DMA2_CSELR->CSELR &= ~(DMA_CSELR_C1S << (hdma->ChannelIndex & 0x1cU));

+  }

+#endif /* STM32L431xx || STM32L432xx || STM32L433xx || STM32L442xx || STM32L443xx */

+       /* STM32L471xx || STM32L475xx || STM32L476xx || STM32L442xx || STM32L486xx */

+       /* STM32L496xx || STM32L4A6xx                                              */

+

+#if defined(DMAMUX1)

+

+  /* Initialize parameters for DMAMUX channel :

+     DMAmuxChannel, DMAmuxChannelStatus and DMAmuxChannelStatusMask */

+

+  DMA_CalcDMAMUXChannelBaseAndMask(hdma);

+

+  /* Reset the DMAMUX channel that corresponds to the DMA channel */

+  hdma->DMAmuxChannel->CCR = 0U;

+

+  /* Clear the DMAMUX synchro overrun flag */

+  hdma->DMAmuxChannelStatus->CFR = hdma->DMAmuxChannelStatusMask;

+

+  /* Reset Request generator parameters if any */

+  if(((hdma->Init.Request >  0U) && (hdma->Init.Request <= DMA_REQUEST_GENERATOR3)))

+  {

+    /* Initialize parameters for DMAMUX request generator :

+       DMAmuxRequestGen, DMAmuxRequestGenStatus and DMAmuxRequestGenStatusMask

+    */

+    DMA_CalcDMAMUXRequestGenBaseAndMask(hdma);

+

+    /* Reset the DMAMUX request generator register*/

+    hdma->DMAmuxRequestGen->RGCR = 0U;

+

+    /* Clear the DMAMUX request generator overrun flag */

+    hdma->DMAmuxRequestGenStatus->RGCFR = hdma->DMAmuxRequestGenStatusMask;

+  }

+

+  hdma->DMAmuxRequestGen = 0U;

+  hdma->DMAmuxRequestGenStatus = 0U;

+  hdma->DMAmuxRequestGenStatusMask = 0U;

+

+#endif /* DMAMUX1 */

+

+  /* Clean callbacks */

+  hdma->XferCpltCallback = NULL;

+  hdma->XferHalfCpltCallback = NULL;

+  hdma->XferErrorCallback = NULL;

+  hdma->XferAbortCallback = NULL;

+

+  /* Initialise the error code */

+  hdma->ErrorCode = HAL_DMA_ERROR_NONE;

+

+  /* Initialize the DMA state */

+  hdma->State = HAL_DMA_STATE_RESET;

+

+  /* Release Lock */

+  __HAL_UNLOCK(hdma);

+

+  return HAL_OK;

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup DMA_Exported_Functions_Group2 Input and Output operation functions

+ *  @brief   Input and Output operation functions

+ *

+@verbatim

+ ===============================================================================

+                      #####  IO operation functions  #####

+ ===============================================================================

+    [..]  This section provides functions allowing to:

+      (+) Configure the source, destination address and data length and Start DMA transfer

+      (+) Configure the source, destination address and data length and

+          Start DMA transfer with interrupt

+      (+) Abort DMA transfer

+      (+) Poll for transfer complete

+      (+) Handle DMA interrupt request

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Start the DMA Transfer.

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *               the configuration information for the specified DMA Channel.

+  * @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

+  */

+HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check the parameters */

+  assert_param(IS_DMA_BUFFER_SIZE(DataLength));

+

+  /* Process locked */

+  __HAL_LOCK(hdma);

+

+  if(HAL_DMA_STATE_READY == hdma->State)

+  {

+    /* Change DMA peripheral state */

+    hdma->State = HAL_DMA_STATE_BUSY;

+    hdma->ErrorCode = HAL_DMA_ERROR_NONE;

+

+    /* Disable the peripheral */

+    __HAL_DMA_DISABLE(hdma);

+

+    /* Configure the source, destination address and the data length & clear flags*/

+    DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength);

+

+    /* Enable the Peripheral */

+    __HAL_DMA_ENABLE(hdma);

+  }

+  else

+  {

+    /* Process Unlocked */

+    __HAL_UNLOCK(hdma);

+    status = HAL_BUSY;

+  }

+  return status;

+}

+

+/**

+  * @brief  Start the DMA Transfer with interrupt enabled.

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *               the configuration information for the specified DMA Channel.

+  * @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

+  */

+HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check the parameters */

+  assert_param(IS_DMA_BUFFER_SIZE(DataLength));

+

+  /* Process locked */

+  __HAL_LOCK(hdma);

+

+  if(HAL_DMA_STATE_READY == hdma->State)

+  {

+    /* Change DMA peripheral state */

+    hdma->State = HAL_DMA_STATE_BUSY;

+    hdma->ErrorCode = HAL_DMA_ERROR_NONE;

+

+    /* Disable the peripheral */

+    __HAL_DMA_DISABLE(hdma);

+

+    /* Configure the source, destination address and the data length & clear flags*/

+    DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength);

+

+    /* Enable the transfer complete interrupt */

+    /* Enable the transfer Error interrupt */

+    if(NULL != hdma->XferHalfCpltCallback )

+    {

+      /* Enable the Half transfer complete interrupt as well */

+      __HAL_DMA_ENABLE_IT(hdma, (DMA_IT_TC | DMA_IT_HT | DMA_IT_TE));

+    }

+    else

+    {

+      __HAL_DMA_DISABLE_IT(hdma, DMA_IT_HT);

+      __HAL_DMA_ENABLE_IT(hdma, (DMA_IT_TC | DMA_IT_TE));

+    }

+

+#ifdef DMAMUX1

+

+    /* Check if DMAMUX Synchronization is enabled*/

+    if((hdma->DMAmuxChannel->CCR & DMAMUX_CxCR_SE) != 0U)

+    {

+      /* Enable DMAMUX sync overrun IT*/

+      hdma->DMAmuxChannel->CCR |= DMAMUX_CxCR_SOIE;

+    }

+

+    if(hdma->DMAmuxRequestGen != 0U)

+    {

+      /* if using DMAMUX request generator, enable the DMAMUX request generator overrun IT*/

+      /* enable the request gen overrun IT*/

+      hdma->DMAmuxRequestGen->RGCR |= DMAMUX_RGxCR_OIE;

+    }

+

+#endif /* DMAMUX1 */

+

+    /* Enable the Peripheral */

+    __HAL_DMA_ENABLE(hdma);

+  }

+  else

+  {

+    /* Process Unlocked */

+    __HAL_UNLOCK(hdma);

+

+    /* Remain BUSY */

+    status = HAL_BUSY;

+  }

+  return status;

+}

+

+/**

+  * @brief  Abort the DMA Transfer.

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *               the configuration information for the specified DMA Channel.

+    * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check the DMA peripheral state */

+  if(hdma->State != HAL_DMA_STATE_BUSY)

+  {

+    hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER;

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hdma);

+

+    return HAL_ERROR;

+  }

+  else

+  {

+    /* Disable DMA IT */

+    __HAL_DMA_DISABLE_IT(hdma, (DMA_IT_TC | DMA_IT_HT | DMA_IT_TE));

+

+#if defined(DMAMUX1)

+    /* disable the DMAMUX sync overrun IT*/

+    hdma->DMAmuxChannel->CCR &= ~DMAMUX_CxCR_SOIE;

+#endif /* DMAMUX1 */

+

+    /* Disable the channel */

+    __HAL_DMA_DISABLE(hdma);

+

+    /* Clear all flags */

+    hdma->DmaBaseAddress->IFCR = (DMA_ISR_GIF1 << (hdma->ChannelIndex & 0x1CU));

+

+#if defined(DMAMUX1)

+    /* Clear the DMAMUX synchro overrun flag */

+    hdma->DMAmuxChannelStatus->CFR = hdma->DMAmuxChannelStatusMask;

+

+    if(hdma->DMAmuxRequestGen != 0U)

+    {

+      /* if using DMAMUX request generator, disable the DMAMUX request generator overrun IT*/

+      /* disable the request gen overrun IT*/

+      hdma->DMAmuxRequestGen->RGCR &= ~DMAMUX_RGxCR_OIE;

+

+      /* Clear the DMAMUX request generator overrun flag */

+      hdma->DMAmuxRequestGenStatus->RGCFR = hdma->DMAmuxRequestGenStatusMask;

+    }

+

+#endif /* DMAMUX1 */

+

+    /* Change the DMA state */

+    hdma->State = HAL_DMA_STATE_READY;

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hdma);

+

+    return status;

+  }

+}

+

+/**

+  * @brief  Aborts the DMA Transfer in Interrupt mode.

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *                 the configuration information for the specified DMA Channel.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  if(HAL_DMA_STATE_BUSY != hdma->State)

+  {

+    /* no transfer ongoing */

+    hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER;

+

+    status = HAL_ERROR;

+  }

+  else

+  {

+    /* Disable DMA IT */

+    __HAL_DMA_DISABLE_IT(hdma, (DMA_IT_TC | DMA_IT_HT | DMA_IT_TE));

+

+    /* Disable the channel */

+    __HAL_DMA_DISABLE(hdma);

+

+#if defined(DMAMUX1)

+    /* disable the DMAMUX sync overrun IT*/

+    hdma->DMAmuxChannel->CCR &= ~DMAMUX_CxCR_SOIE;

+

+    /* Clear all flags */

+    hdma->DmaBaseAddress->IFCR = (DMA_ISR_GIF1 << (hdma->ChannelIndex & 0x1CU));

+

+    /* Clear the DMAMUX synchro overrun flag */

+    hdma->DMAmuxChannelStatus->CFR = hdma->DMAmuxChannelStatusMask;

+

+    if(hdma->DMAmuxRequestGen != 0U)

+    {

+      /* if using DMAMUX request generator, disable the DMAMUX request generator overrun IT*/

+      /* disable the request gen overrun IT*/

+      hdma->DMAmuxRequestGen->RGCR &= ~DMAMUX_RGxCR_OIE;

+

+      /* Clear the DMAMUX request generator overrun flag */

+      hdma->DMAmuxRequestGenStatus->RGCFR = hdma->DMAmuxRequestGenStatusMask;

+    }

+

+#else

+    /* Clear all flags */

+    hdma->DmaBaseAddress->IFCR = (DMA_ISR_GIF1 << (hdma->ChannelIndex & 0x1CU));

+#endif /* DMAMUX1 */

+

+    /* Change the DMA state */

+    hdma->State = HAL_DMA_STATE_READY;

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hdma);

+

+    /* Call User Abort callback */

+    if(hdma->XferAbortCallback != NULL)

+    {

+      hdma->XferAbortCallback(hdma);

+    }

+  }

+  return status;

+}

+

+/**

+  * @brief  Polling for transfer complete.

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *                  the configuration information for the specified DMA Channel.

+  * @param  CompleteLevel Specifies the DMA level complete.

+  * @param  Timeout       Timeout duration.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout)

+{

+  uint32_t temp;

+  uint32_t tickstart;

+

+  if(HAL_DMA_STATE_BUSY != hdma->State)

+  {

+    /* no transfer ongoing */

+    hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER;

+    __HAL_UNLOCK(hdma);

+    return HAL_ERROR;

+  }

+

+  /* Polling mode not supported in circular mode */

+  if ((hdma->Instance->CCR & DMA_CCR_CIRC) != 0U)

+  {

+    hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED;

+    return HAL_ERROR;

+  }

+

+  /* Get the level transfer complete flag */

+  if (HAL_DMA_FULL_TRANSFER == CompleteLevel)

+  {

+    /* Transfer Complete flag */

+    temp = DMA_FLAG_TC1 << (hdma->ChannelIndex & 0x1CU);

+  }

+  else

+  {

+    /* Half Transfer Complete flag */

+    temp = DMA_FLAG_HT1 << (hdma->ChannelIndex & 0x1CU);

+  }

+

+  /* Get tick */

+  tickstart = HAL_GetTick();

+

+  while((hdma->DmaBaseAddress->ISR & temp) == 0U)

+  {

+    if((hdma->DmaBaseAddress->ISR & (DMA_FLAG_TE1 << (hdma->ChannelIndex& 0x1CU))) != 0U)

+    {

+      /* When a DMA transfer error occurs */

+      /* A hardware clear of its EN bits is performed */

+      /* Clear all flags */

+      hdma->DmaBaseAddress->IFCR = (DMA_ISR_GIF1 << (hdma->ChannelIndex & 0x1CU));

+

+      /* Update error code */

+      hdma->ErrorCode = HAL_DMA_ERROR_TE;

+

+      /* Change the DMA state */

+      hdma->State= HAL_DMA_STATE_READY;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hdma);

+

+      return HAL_ERROR;

+    }

+    /* Check for the Timeout */

+    if(Timeout != HAL_MAX_DELAY)

+    {

+      if(((HAL_GetTick() - tickstart) > Timeout) ||  (Timeout == 0U))

+      {

+        /* Update error code */

+        hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT;

+

+        /* Change the DMA state */

+        hdma->State = HAL_DMA_STATE_READY;

+

+        /* Process Unlocked */

+        __HAL_UNLOCK(hdma);

+

+        return HAL_ERROR;

+      }

+    }

+  }

+

+#if defined(DMAMUX1)

+  /*Check for DMAMUX Request generator (if used) overrun status */

+  if(hdma->DMAmuxRequestGen != 0U)

+  {

+    /* if using DMAMUX request generator Check for DMAMUX request generator overrun */

+    if((hdma->DMAmuxRequestGenStatus->RGSR & hdma->DMAmuxRequestGenStatusMask) != 0U)

+    {

+      /* Disable the request gen overrun interrupt */

+      hdma->DMAmuxRequestGen->RGCR |= DMAMUX_RGxCR_OIE;

+

+      /* Clear the DMAMUX request generator overrun flag */

+      hdma->DMAmuxRequestGenStatus->RGCFR = hdma->DMAmuxRequestGenStatusMask;

+

+      /* Update error code */

+      hdma->ErrorCode |= HAL_DMA_ERROR_REQGEN;

+    }

+  }

+

+  /* Check for DMAMUX Synchronization overrun */

+  if((hdma->DMAmuxChannelStatus->CSR & hdma->DMAmuxChannelStatusMask) != 0U)

+  {

+    /* Clear the DMAMUX synchro overrun flag */

+    hdma->DMAmuxChannelStatus->CFR = hdma->DMAmuxChannelStatusMask;

+

+    /* Update error code */

+    hdma->ErrorCode |= HAL_DMA_ERROR_SYNC;

+  }

+#endif /* DMAMUX1 */

+

+  if(HAL_DMA_FULL_TRANSFER == CompleteLevel)

+  {

+    /* Clear the transfer complete flag */

+    hdma->DmaBaseAddress->IFCR = (DMA_FLAG_TC1 << (hdma->ChannelIndex& 0x1CU));

+

+    /* The selected Channelx EN bit is cleared (DMA is disabled and

+    all transfers are complete) */

+    hdma->State = HAL_DMA_STATE_READY;

+  }

+  else

+  {

+    /* Clear the half transfer complete flag */

+    hdma->DmaBaseAddress->IFCR = (DMA_FLAG_HT1 << (hdma->ChannelIndex & 0x1CU));

+  }

+

+  /* Process unlocked */

+  __HAL_UNLOCK(hdma);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Handle DMA interrupt request.

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *               the configuration information for the specified DMA Channel.

+  * @retval None

+  */

+void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma)

+{

+  uint32_t flag_it = hdma->DmaBaseAddress->ISR;

+  uint32_t source_it = hdma->Instance->CCR;

+

+  /* Half Transfer Complete Interrupt management ******************************/

+  if (((flag_it & (DMA_FLAG_HT1 << (hdma->ChannelIndex & 0x1CU))) != 0U) && ((source_it & DMA_IT_HT) != 0U))

+  {

+      /* Disable the half transfer interrupt if the DMA mode is not CIRCULAR */

+      if((hdma->Instance->CCR & DMA_CCR_CIRC) == 0U)

+      {

+        /* Disable the half transfer interrupt */

+        __HAL_DMA_DISABLE_IT(hdma, DMA_IT_HT);

+      }

+      /* Clear the half transfer complete flag */

+      hdma->DmaBaseAddress->IFCR = DMA_ISR_HTIF1 << (hdma->ChannelIndex & 0x1CU);

+

+      /* DMA peripheral state is not updated in Half Transfer */

+      /* but in Transfer Complete case */

+

+      if(hdma->XferHalfCpltCallback != NULL)

+      {

+        /* Half transfer callback */

+        hdma->XferHalfCpltCallback(hdma);

+      }

+  }

+

+  /* Transfer Complete Interrupt management ***********************************/

+  else if (((flag_it & (DMA_FLAG_TC1 << (hdma->ChannelIndex & 0x1CU))) != 0U) && ((source_it & DMA_IT_TC) != 0U))

+  {

+    if((hdma->Instance->CCR & DMA_CCR_CIRC) == 0U)

+    {

+      /* Disable the transfer complete interrupt if the DMA mode is not CIRCULAR */

+      /* Disable the transfer complete and error interrupt */

+      /* if the DMA mode is not CIRCULAR  */

+      __HAL_DMA_DISABLE_IT(hdma, DMA_IT_TE | DMA_IT_TC);

+

+      /* Change the DMA state */

+      hdma->State = HAL_DMA_STATE_READY;

+    }

+    /* Clear the transfer complete flag */

+    hdma->DmaBaseAddress->IFCR = (DMA_ISR_TCIF1 << (hdma->ChannelIndex & 0x1CU));

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hdma);

+

+    if(hdma->XferCpltCallback != NULL)

+    {

+      /* Transfer complete callback */

+      hdma->XferCpltCallback(hdma);

+    }

+  }

+

+  /* Transfer Error Interrupt management **************************************/

+  else if (((flag_it & (DMA_FLAG_TE1 << (hdma->ChannelIndex & 0x1CU))) != 0U) && ((source_it & DMA_IT_TE) !=  0U))

+  {

+    /* When a DMA transfer error occurs */

+    /* A hardware clear of its EN bits is performed */

+    /* Disable ALL DMA IT */

+    __HAL_DMA_DISABLE_IT(hdma, (DMA_IT_TC | DMA_IT_HT | DMA_IT_TE));

+

+    /* Clear all flags */

+    hdma->DmaBaseAddress->IFCR = (DMA_ISR_GIF1 << (hdma->ChannelIndex & 0x1CU));

+

+    /* Update error code */

+    hdma->ErrorCode = HAL_DMA_ERROR_TE;

+

+    /* Change the DMA state */

+    hdma->State = HAL_DMA_STATE_READY;

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hdma);

+

+    if (hdma->XferErrorCallback != NULL)

+    {

+      /* Transfer error callback */

+      hdma->XferErrorCallback(hdma);

+    }

+  }

+  else

+  {

+    /* Nothing To Do */

+  }

+  return;

+}

+

+/**

+  * @brief  Register callbacks

+  * @param  hdma                 pointer to a DMA_HandleTypeDef structure that contains

+  *                               the configuration information for the specified DMA Channel.

+  * @param  CallbackID           User Callback identifer

+  *                               a HAL_DMA_CallbackIDTypeDef ENUM as parameter.

+  * @param  pCallback            pointer to private callbacsk function which has pointer to

+  *                               a DMA_HandleTypeDef structure as parameter.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)( DMA_HandleTypeDef * _hdma))

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Process locked */

+  __HAL_LOCK(hdma);

+

+  if(HAL_DMA_STATE_READY == hdma->State)

+  {

+    switch (CallbackID)

+    {

+     case  HAL_DMA_XFER_CPLT_CB_ID:

+           hdma->XferCpltCallback = pCallback;

+           break;

+

+     case  HAL_DMA_XFER_HALFCPLT_CB_ID:

+           hdma->XferHalfCpltCallback = pCallback;

+           break;

+

+     case  HAL_DMA_XFER_ERROR_CB_ID:

+           hdma->XferErrorCallback = pCallback;

+           break;

+

+     case  HAL_DMA_XFER_ABORT_CB_ID:

+           hdma->XferAbortCallback = pCallback;

+           break;

+

+     default:

+           status = HAL_ERROR;

+           break;

+    }

+  }

+  else

+  {

+    status = HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hdma);

+

+  return status;

+}

+

+/**

+  * @brief  UnRegister callbacks

+  * @param  hdma                 pointer to a DMA_HandleTypeDef structure that contains

+  *                               the configuration information for the specified DMA Channel.

+  * @param  CallbackID           User Callback identifer

+  *                               a HAL_DMA_CallbackIDTypeDef ENUM as parameter.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+    /* Process locked */

+  __HAL_LOCK(hdma);

+

+  if(HAL_DMA_STATE_READY == hdma->State)

+  {

+    switch (CallbackID)

+    {

+     case  HAL_DMA_XFER_CPLT_CB_ID:

+           hdma->XferCpltCallback = NULL;

+           break;

+

+     case  HAL_DMA_XFER_HALFCPLT_CB_ID:

+           hdma->XferHalfCpltCallback = NULL;

+           break;

+

+     case  HAL_DMA_XFER_ERROR_CB_ID:

+           hdma->XferErrorCallback = NULL;

+           break;

+

+     case  HAL_DMA_XFER_ABORT_CB_ID:

+           hdma->XferAbortCallback = NULL;

+           break;

+

+    case   HAL_DMA_XFER_ALL_CB_ID:

+           hdma->XferCpltCallback = NULL;

+           hdma->XferHalfCpltCallback = NULL;

+           hdma->XferErrorCallback = NULL;

+           hdma->XferAbortCallback = NULL;

+           break;

+

+    default:

+           status = HAL_ERROR;

+           break;

+    }

+  }

+  else

+  {

+    status = HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hdma);

+

+  return status;

+}

+

+/**

+  * @}

+  */

+

+

+

+/** @defgroup DMA_Exported_Functions_Group3 Peripheral State and Errors functions

+ *  @brief    Peripheral State and Errors functions

+ *

+@verbatim

+ ===============================================================================

+            ##### Peripheral State and Errors functions #####

+ ===============================================================================

+    [..]

+    This subsection provides functions allowing to

+      (+) Check the DMA state

+      (+) Get error code

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Return the DMA handle state.

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *               the configuration information for the specified DMA Channel.

+  * @retval HAL state

+  */

+HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma)

+{

+  /* Return DMA handle state */

+  return hdma->State;

+}

+

+/**

+  * @brief  Return the DMA error code.

+  * @param  hdma : pointer to a DMA_HandleTypeDef structure that contains

+  *              the configuration information for the specified DMA Channel.

+  * @retval DMA Error Code

+  */

+uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma)

+{

+  return hdma->ErrorCode;

+}

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/** @addtogroup DMA_Private_Functions

+  * @{

+  */

+

+/**

+  * @brief  Sets the DMA Transfer parameter.

+  * @param  hdma       pointer to a DMA_HandleTypeDef structure that contains

+  *                     the configuration information for the specified DMA Channel.

+  * @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_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)

+{

+#if defined(DMAMUX1)

+  /* Clear the DMAMUX synchro overrun flag */

+  hdma->DMAmuxChannelStatus->CFR = hdma->DMAmuxChannelStatusMask;

+

+  if(hdma->DMAmuxRequestGen != 0U)

+  {

+    /* Clear the DMAMUX request generator overrun flag */

+    hdma->DMAmuxRequestGenStatus->RGCFR = hdma->DMAmuxRequestGenStatusMask;

+  }

+#endif

+

+  /* Clear all flags */

+  hdma->DmaBaseAddress->IFCR = (DMA_ISR_GIF1 << (hdma->ChannelIndex & 0x1CU));

+

+  /* Configure DMA Channel data length */

+  hdma->Instance->CNDTR = DataLength;

+

+  /* Memory to Peripheral */

+  if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH)

+  {

+    /* Configure DMA Channel destination address */

+    hdma->Instance->CPAR = DstAddress;

+

+    /* Configure DMA Channel source address */

+    hdma->Instance->CMAR = SrcAddress;

+  }

+  /* Peripheral to Memory */

+  else

+  {

+    /* Configure DMA Channel source address */

+    hdma->Instance->CPAR = SrcAddress;

+

+    /* Configure DMA Channel destination address */

+    hdma->Instance->CMAR = DstAddress;

+  }

+}

+

+#if defined(DMAMUX1)

+

+/**

+  * @brief  Updates the DMA handle with the DMAMUX  channel and status mask depending on channel number

+  * @param  hdma        pointer to a DMA_HandleTypeDef structure that contains

+  *                     the configuration information for the specified DMA Channel.

+  * @retval None

+  */

+static void DMA_CalcDMAMUXChannelBaseAndMask(DMA_HandleTypeDef *hdma)

+{

+  uint32_t channel_number;

+

+  /* check if instance is not outside the DMA channel range */

+  if ((uint32_t)hdma->Instance < (uint32_t)DMA2_Channel1)

+  {

+    /* DMA1 */

+    hdma->DMAmuxChannel = (DMAMUX1_Channel0 + (hdma->ChannelIndex >> 2U));

+  }

+  else

+  {

+    /* DMA2 */

+    hdma->DMAmuxChannel = (DMAMUX1_Channel7 + (hdma->ChannelIndex >> 2U));

+  }

+

+  channel_number = (((uint32_t)hdma->Instance & 0xFFU) - 8U) / 20U;

+  hdma->DMAmuxChannelStatus = DMAMUX1_ChannelStatus;

+  hdma->DMAmuxChannelStatusMask = 1UL << (channel_number & 0x1CU);

+}

+

+/**

+  * @brief  Updates the DMA handle with the DMAMUX  request generator params

+  * @param  hdma        pointer to a DMA_HandleTypeDef structure that contains

+  *                     the configuration information for the specified DMA Channel.

+  * @retval None

+  */

+

+static void DMA_CalcDMAMUXRequestGenBaseAndMask(DMA_HandleTypeDef *hdma)

+{

+  uint32_t request =  hdma->Init.Request & DMAMUX_CxCR_DMAREQ_ID;

+

+  /* DMA Channels are connected to DMAMUX1 request generator blocks*/

+  hdma->DMAmuxRequestGen = (DMAMUX_RequestGen_TypeDef *)((uint32_t)(((uint32_t)DMAMUX1_RequestGenerator0) + ((request - 1U) * 4U)));

+

+  hdma->DMAmuxRequestGenStatus = DMAMUX1_RequestGenStatus;

+

+  /* here "Request" is either DMA_REQUEST_GENERATOR0 to DMA_REQUEST_GENERATOR3, i.e. <= 4*/

+  hdma->DMAmuxRequestGenStatusMask = 1UL << ((request - 1U) & 0x3U);

+}

+

+#endif /* DMAMUX1 */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#endif /* HAL_DMA_MODULE_ENABLED */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c
new file mode 100644
index 0000000..fae98f1
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c
@@ -0,0 +1,309 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_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:

+

+   (+) Configure the DMA_MUX Synchronization Block using HAL_DMAEx_ConfigMuxSync function.

+   (+) Configure the DMA_MUX Request Generator Block using HAL_DMAEx_ConfigMuxRequestGenerator function.

+       Functions HAL_DMAEx_EnableMuxRequestGenerator and HAL_DMAEx_DisableMuxRequestGenerator can then be used

+       to respectively enable/disable the request generator.

+

+   (+) To handle the DMAMUX Interrupts, the function  HAL_DMAEx_MUX_IRQHandler should be called from

+       the DMAMUX IRQ handler i.e DMAMUX1_OVR_IRQHandler.

+       As only one interrupt line is available for all DMAMUX channels and request generators , HAL_DMAEx_MUX_IRQHandler should be

+       called with, as parameter, the appropriate DMA handle as many as used DMAs in the user project

+      (exception done if a given DMA is not using the DMAMUX SYNC block neither a request generator)

+

+     -@-  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_CM0ARx or DMA_CM1ARx) when the channel is enabled.

+

+

+  @endverbatim

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+#if defined(DMAMUX1)

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup DMAEx DMAEx

+  * @brief DMA Extended HAL module driver

+  * @{

+  */

+

+#ifdef HAL_DMA_MODULE_ENABLED

+

+/* Private typedef -----------------------------------------------------------*/

+/* Private define ------------------------------------------------------------*/

+/* Private macro -------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/* Private Constants ---------------------------------------------------------*/

+/* Private function prototypes -----------------------------------------------*/

+/* Private functions ---------------------------------------------------------*/

+

+

+/** @defgroup DMAEx_Exported_Functions DMAEx Exported Functions

+  * @{

+  */

+

+/** @defgroup DMAEx_Exported_Functions_Group1 DMAEx Extended features functions

+ *  @brief   Extended features functions

+ *

+@verbatim

+ ===============================================================================

+                #####  Extended features functions  #####

+ ===============================================================================

+    [..]  This section provides functions allowing to:

+

+    (+) Configure the DMAMUX Synchronization Block using HAL_DMAEx_ConfigMuxSync function.

+    (+) Configure the DMAMUX Request Generator Block using HAL_DMAEx_ConfigMuxRequestGenerator function.

+       Functions HAL_DMAEx_EnableMuxRequestGenerator and HAL_DMAEx_DisableMuxRequestGenerator can then be used

+       to respectively enable/disable the request generator.

+

+@endverbatim

+  * @{

+  */

+

+

+/**

+  * @brief  Configure the DMAMUX synchronization parameters for a given DMA channel (instance).

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *              the configuration information for the specified DMA channel.

+  * @param  pSyncConfig : pointer to HAL_DMA_MuxSyncConfigTypeDef : contains the DMAMUX synchronization parameters

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DMAEx_ConfigMuxSync(DMA_HandleTypeDef *hdma, HAL_DMA_MuxSyncConfigTypeDef *pSyncConfig)

+{

+  /* Check the parameters */

+  assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance));

+

+  assert_param(IS_DMAMUX_SYNC_SIGNAL_ID(pSyncConfig->SyncSignalID));

+

+  assert_param(IS_DMAMUX_SYNC_POLARITY(pSyncConfig-> SyncPolarity));

+  assert_param(IS_DMAMUX_SYNC_STATE(pSyncConfig->SyncEnable));

+  assert_param(IS_DMAMUX_SYNC_EVENT(pSyncConfig->EventEnable));

+  assert_param(IS_DMAMUX_SYNC_REQUEST_NUMBER(pSyncConfig->RequestNumber));

+

+  /*Check if the DMA state is ready */

+  if(hdma->State == HAL_DMA_STATE_READY)

+  {

+    /* Process Locked */

+    __HAL_LOCK(hdma);

+

+    /* Set the new synchronization parameters (and keep the request ID filled during the Init)*/

+    MODIFY_REG( hdma->DMAmuxChannel->CCR, \

+               (~DMAMUX_CxCR_DMAREQ_ID) , \

+               ((pSyncConfig->SyncSignalID) << DMAMUX_CxCR_SYNC_ID_Pos) | ((pSyncConfig->RequestNumber - 1U) << DMAMUX_CxCR_NBREQ_Pos) | \

+               pSyncConfig->SyncPolarity | ((uint32_t)pSyncConfig->SyncEnable << DMAMUX_CxCR_SE_Pos) | \

+                 ((uint32_t)pSyncConfig->EventEnable << DMAMUX_CxCR_EGE_Pos));

+

+    /* Process UnLocked */

+    __HAL_UNLOCK(hdma);

+

+    return HAL_OK;

+  }

+  else

+  {

+    /*DMA State not Ready*/

+    return HAL_ERROR;

+  }

+}

+

+/**

+  * @brief  Configure the DMAMUX request generator block used by the given DMA channel (instance).

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *              the configuration information for the specified DMA channel.

+  * @param  pRequestGeneratorConfig : pointer to HAL_DMA_MuxRequestGeneratorConfigTypeDef :

+  *         contains the request generator parameters.

+  *

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DMAEx_ConfigMuxRequestGenerator (DMA_HandleTypeDef *hdma, HAL_DMA_MuxRequestGeneratorConfigTypeDef *pRequestGeneratorConfig)

+{

+  /* Check the parameters */

+  assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance));

+

+  assert_param(IS_DMAMUX_REQUEST_GEN_SIGNAL_ID(pRequestGeneratorConfig->SignalID));

+

+  assert_param(IS_DMAMUX_REQUEST_GEN_POLARITY(pRequestGeneratorConfig->Polarity));

+  assert_param(IS_DMAMUX_REQUEST_GEN_REQUEST_NUMBER(pRequestGeneratorConfig->RequestNumber));

+

+  /* check if the DMA state is ready

+     and DMA is using a DMAMUX request generator block

+  */

+  if((hdma->State == HAL_DMA_STATE_READY) && (hdma->DMAmuxRequestGen != 0U))

+  {

+    /* Process Locked */

+    __HAL_LOCK(hdma);

+

+    /* Set the request generator new parameters */

+    hdma->DMAmuxRequestGen->RGCR = pRequestGeneratorConfig->SignalID | \

+                                  ((pRequestGeneratorConfig->RequestNumber - 1U) << DMAMUX_RGxCR_GNBREQ_Pos)| \

+                                  pRequestGeneratorConfig->Polarity;

+   /* Process UnLocked */

+   __HAL_UNLOCK(hdma);

+

+   return HAL_OK;

+ }

+ else

+ {

+   return HAL_ERROR;

+ }

+}

+

+/**

+  * @brief  Enable the DMAMUX request generator block used by the given DMA channel (instance).

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *              the configuration information for the specified DMA channel.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DMAEx_EnableMuxRequestGenerator (DMA_HandleTypeDef *hdma)

+{

+  /* Check the parameters */

+  assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance));

+

+  /* check if the DMA state is ready

+     and DMA is using a DMAMUX request generator block

+  */

+  if((hdma->State != HAL_DMA_STATE_RESET) && (hdma->DMAmuxRequestGen != 0))

+  {

+

+    /* Enable the request generator*/

+    hdma->DMAmuxRequestGen->RGCR |= DMAMUX_RGxCR_GE;

+

+   return HAL_OK;

+ }

+ else

+ {

+   return HAL_ERROR;

+ }

+}

+

+/**

+  * @brief  Disable the DMAMUX request generator block used by the given DMA channel (instance).

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *              the configuration information for the specified DMA channel.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_DMAEx_DisableMuxRequestGenerator (DMA_HandleTypeDef *hdma)

+{

+  /* Check the parameters */

+  assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance));

+

+  /* check if the DMA state is ready

+     and DMA is using a DMAMUX request generator block

+  */

+  if((hdma->State != HAL_DMA_STATE_RESET) && (hdma->DMAmuxRequestGen != 0))

+  {

+

+    /* Disable the request generator*/

+    hdma->DMAmuxRequestGen->RGCR &= ~DMAMUX_RGxCR_GE;

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_ERROR;

+  }

+}

+

+/**

+  * @brief  Handles DMAMUX interrupt request.

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *              the configuration information for the specified DMA channel.

+  * @retval None

+  */

+void HAL_DMAEx_MUX_IRQHandler(DMA_HandleTypeDef *hdma)

+{

+  /* Check for DMAMUX Synchronization overrun */

+  if((hdma->DMAmuxChannelStatus->CSR & hdma->DMAmuxChannelStatusMask) != 0U)

+  {

+    /* Disable the synchro overrun interrupt */

+    hdma->DMAmuxChannel->CCR &= ~DMAMUX_CxCR_SOIE;

+

+    /* Clear the DMAMUX synchro overrun flag */

+    hdma->DMAmuxChannelStatus->CFR = hdma->DMAmuxChannelStatusMask;

+

+    /* Update error code */

+    hdma->ErrorCode |= HAL_DMA_ERROR_SYNC;

+

+    if(hdma->XferErrorCallback != NULL)

+    {

+      /* Transfer error callback */

+      hdma->XferErrorCallback(hdma);

+    }

+  }

+

+  if(hdma->DMAmuxRequestGen != 0)

+  {

+   /* if using a DMAMUX request generator block Check for DMAMUX request generator overrun */

+    if((hdma->DMAmuxRequestGenStatus->RGSR & hdma->DMAmuxRequestGenStatusMask) != 0U)

+    {

+      /* Disable the request gen overrun interrupt */

+      hdma->DMAmuxRequestGen->RGCR &= ~DMAMUX_RGxCR_OIE;

+

+      /* Clear the DMAMUX request generator overrun flag */

+      hdma->DMAmuxRequestGenStatus->RGCFR = hdma->DMAmuxRequestGenStatusMask;

+

+      /* Update error code */

+      hdma->ErrorCode |= HAL_DMA_ERROR_REQGEN;

+

+      if(hdma->XferErrorCallback != NULL)

+      {

+        /* Transfer error callback */

+        hdma->XferErrorCallback(hdma);

+      }

+    }

+  }

+}

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#endif /* HAL_DMA_MODULE_ENABLED */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#endif /* DMAMUX1 */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c
new file mode 100644
index 0000000..74405ed
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c
@@ -0,0 +1,643 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_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

+  *

+  @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

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_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

+  * @{

+  */

+#define EXTI_MODE_OFFSET                    0x08u   /* 0x20: offset between MCU IMR/EMR registers */

+#define EXTI_CONFIG_OFFSET                  0x08u   /* 0x20: offset between MCU Rising/Falling configuration registers */

+/**

+  * @}

+  */

+

+/* 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)

+{

+  __IO uint32_t *regaddr;

+  uint32_t regval;

+  uint32_t linepos;

+  uint32_t maskline;

+  uint32_t offset;

+

+  /* 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 register offset and line mask */

+  offset = ((pExtiConfig->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT);

+  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 */

+    regaddr = (&EXTI->RTSR1 + (EXTI_CONFIG_OFFSET * offset));

+    regval = *regaddr;

+

+    /* Mask or set line */

+    if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u)

+    {

+      regval |= maskline;

+    }

+    else

+    {

+      regval &= ~maskline;

+    }

+

+    /* Store rising trigger mode */

+    *regaddr = regval;

+

+    /* Configure falling trigger */

+    regaddr = (&EXTI->FTSR1 + (EXTI_CONFIG_OFFSET * offset));

+    regval = *regaddr;

+

+    /* Mask or set line */

+    if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u)

+    {

+      regval |= maskline;

+    }

+    else

+    {

+      regval &= ~maskline;

+    }

+

+    /* Store falling trigger mode */

+    *regaddr = regval;

+

+    /* 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 */

+  regaddr = (&EXTI->IMR1 + (EXTI_MODE_OFFSET * offset));

+  regval = *regaddr;

+

+  /* Mask or set line */

+  if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u)

+  {

+    regval |= maskline;

+  }

+  else

+  {

+    regval &= ~maskline;

+  }

+

+  /* Store interrupt mode */

+  *regaddr = regval;

+

+  /* The event mode cannot be configured if the line does not support it */

+  assert_param(((pExtiConfig->Line & EXTI_EVENT) == EXTI_EVENT) || ((pExtiConfig->Mode & EXTI_MODE_EVENT) != EXTI_MODE_EVENT));

+

+  /* Configure event mode : read current mode */

+  regaddr = (&EXTI->EMR1 + (EXTI_MODE_OFFSET * offset));

+  regval = *regaddr;

+

+  /* Mask or set line */

+  if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u)

+  {

+    regval |= maskline;

+  }

+  else

+  {

+    regval &= ~maskline;

+  }

+

+  /* Store event mode */

+  *regaddr = regval;

+

+  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)

+{

+  __IO uint32_t *regaddr;

+  uint32_t regval;

+  uint32_t linepos;

+  uint32_t maskline;

+  uint32_t offset;

+

+  /* 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 register offset and line mask */

+  offset = ((pExtiConfig->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT);

+  linepos = (pExtiConfig->Line & EXTI_PIN_MASK);

+  maskline = (1uL << linepos);

+

+  /* 1] Get core mode : interrupt */

+  regaddr = (&EXTI->IMR1 + (EXTI_MODE_OFFSET * offset));

+  regval = *regaddr;

+

+  /* Check if selected line is enable */

+  if ((regval & maskline) != 0x00u)

+  {

+    pExtiConfig->Mode = EXTI_MODE_INTERRUPT;

+  }

+  else

+  {

+    pExtiConfig->Mode = EXTI_MODE_NONE;

+  }

+

+  /* Get event mode */

+  regaddr = (&EXTI->EMR1 + (EXTI_MODE_OFFSET * offset));

+  regval = *regaddr;

+

+  /* Check if selected line is enable */

+  if ((regval & maskline) != 0x00u)

+  {

+    pExtiConfig->Mode |= EXTI_MODE_EVENT;

+  }

+

+  /* 2] Get trigger for configurable lines : rising */

+  if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u)

+  {

+    regaddr = (&EXTI->RTSR1 + (EXTI_CONFIG_OFFSET * offset));

+    regval = *regaddr;

+

+    /* Check if configuration of selected line is enable */

+    if ((regval & maskline) != 0x00u)

+    {

+      pExtiConfig->Trigger = EXTI_TRIGGER_RISING;

+    }

+    else

+    {

+      pExtiConfig->Trigger = EXTI_TRIGGER_NONE;

+    }

+

+    /* Get falling configuration */

+    regaddr = (&EXTI->FTSR1 + (EXTI_CONFIG_OFFSET * offset));

+    regval = *regaddr;

+

+    /* Check if configuration of selected line is enable */

+    if ((regval & 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);

+    }

+    else

+    {

+      pExtiConfig->GPIOSel = 0x00u;

+    }

+  }

+  else

+  {

+    pExtiConfig->Trigger = EXTI_TRIGGER_NONE;

+    pExtiConfig->GPIOSel = 0x00u;

+  }

+

+  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)

+{

+  __IO uint32_t *regaddr;

+  uint32_t regval;

+  uint32_t linepos;

+  uint32_t maskline;

+  uint32_t offset;

+

+  /* Check null pointer */

+  if (hexti == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check the parameter */

+  assert_param(IS_EXTI_LINE(hexti->Line));

+

+  /* compute line register offset and line mask */

+  offset = ((hexti->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT);

+  linepos = (hexti->Line & EXTI_PIN_MASK);

+  maskline = (1uL << linepos);

+

+  /* 1] Clear interrupt mode */

+  regaddr = (&EXTI->IMR1 + (EXTI_MODE_OFFSET * offset));

+  regval = (*regaddr & ~maskline);

+  *regaddr = regval;

+

+  /* 2] Clear event mode */

+  regaddr = (&EXTI->EMR1 + (EXTI_MODE_OFFSET * offset));

+  regval = (*regaddr & ~maskline);

+  *regaddr = regval;

+

+  /* 3] Clear triggers in case of configurable lines */

+  if ((hexti->Line & EXTI_CONFIG) != 0x00u)

+  {

+    regaddr = (&EXTI->RTSR1 + (EXTI_CONFIG_OFFSET * offset));

+    regval = (*regaddr & ~maskline);

+    *regaddr = regval;

+

+    regaddr = (&EXTI->FTSR1 + (EXTI_CONFIG_OFFSET * offset));

+    regval = (*regaddr & ~maskline);

+    *regaddr = regval;

+

+    /* 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)

+{

+  __IO uint32_t *regaddr;

+  uint32_t regval;

+  uint32_t maskline;

+  uint32_t offset;

+

+  /* Compute line register offset and line mask */

+  offset = ((hexti->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT);

+  maskline = (1uL << (hexti->Line & EXTI_PIN_MASK));

+

+  /* Get pending bit  */

+  regaddr = (&EXTI->PR1 + (EXTI_CONFIG_OFFSET * offset));

+  regval = (*regaddr & maskline);

+

+  if (regval != 0x00u)

+  {

+    /* Clear pending bit */

+    *regaddr = 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)

+{

+  __IO uint32_t *regaddr;

+  uint32_t regval;

+  uint32_t linepos;

+  uint32_t maskline;

+  uint32_t offset;

+

+  /* 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 register offset and line mask */

+  offset = ((hexti->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT);

+  linepos = (hexti->Line & EXTI_PIN_MASK);

+  maskline = (1uL << linepos);

+

+  /* Get pending bit */

+  regaddr = (&EXTI->PR1 + (EXTI_CONFIG_OFFSET * offset));

+

+  /* return 1 if bit is set else 0 */

+  regval = ((*regaddr & 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)

+{

+  __IO uint32_t *regaddr;

+  uint32_t maskline;

+  uint32_t offset;

+

+  /* 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 register offset and line mask */

+  offset = ((hexti->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT);

+  maskline = (1uL << (hexti->Line & EXTI_PIN_MASK));

+

+  /* Get pending register address */

+  regaddr = (&EXTI->PR1 + (EXTI_CONFIG_OFFSET * offset));

+

+  /* Clear Pending bit */

+  *regaddr =  maskline;

+}

+

+

+/**

+  * @brief  Generate a software interrupt for a dedicated line.

+  * @param  hexti Exti handle.

+  * @retval None.

+  */

+void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti)

+{

+  __IO uint32_t *regaddr;

+  uint32_t maskline;

+  uint32_t offset;

+

+  /* Check parameters */

+  assert_param(IS_EXTI_LINE(hexti->Line));

+  assert_param(IS_EXTI_CONFIG_LINE(hexti->Line));

+

+  /* compute line register offset and line mask */

+  offset = ((hexti->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT);

+  maskline = (1uL << (hexti->Line & EXTI_PIN_MASK));

+

+  regaddr = (&EXTI->SWIER1 + (EXTI_CONFIG_OFFSET * offset));

+  *regaddr = maskline;

+}

+

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#endif /* HAL_EXTI_MODULE_ENABLED */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c
new file mode 100644
index 0000000..a746962
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c
@@ -0,0 +1,769 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_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

+      (+) Option bytes programming

+      (+) Prefetch on I-Code

+      (+) 32 cache lines of 4*64 bits on I-Code

+      (+) 8 cache lines of 4*64 bits on D-Code

+      (+) Error code correction (ECC) : Data in flash are 72-bits word

+          (8 bits added per double word)

+

+

+                        ##### How to use this driver #####

+ ==============================================================================

+    [..]

+      This driver provides functions and macros to configure and program the FLASH

+      memory of all STM32L4xx devices.

+

+      (#) Flash Memory IO Programming functions:

+           (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and

+                HAL_FLASH_Lock() functions

+           (++) Program functions: double word and fast program (full row programming)

+           (++) 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()

+           (++) Callback functions are called when the flash operations are finished :

+                HAL_FLASH_EndOfOperationCallback() when everything is ok, otherwise

+                HAL_FLASH_OperationErrorCallback()

+           (++) Get error flag status by calling HAL_GetError()

+

+      (#) Option bytes management functions :

+           (++) Lock and Unlock the option bytes using HAL_FLASH_OB_Unlock() and

+                HAL_FLASH_OB_Lock() functions

+           (++) Launch the reload of the option bytes using HAL_FLASH_Launch() function.

+                In this case, a reset is generated

+

+    [..]

+      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 power-down during low-power run and sleep modes

+       (+) Enable/Disable the Flash interrupts

+       (+) Monitor the Flash flags status

+

+ @endverbatim

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                       opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup FLASH FLASH

+  * @brief FLASH HAL module driver

+  * @{

+  */

+

+#ifdef HAL_FLASH_MODULE_ENABLED

+

+/* Private typedef -----------------------------------------------------------*/

+/* Private defines -----------------------------------------------------------*/

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define FLASH_NB_DOUBLE_WORDS_IN_ROW  64

+#else

+#define FLASH_NB_DOUBLE_WORDS_IN_ROW  32

+#endif

+/* Private macros ------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/** @defgroup FLASH_Private_Variables FLASH Private Variables

+ * @{

+ */

+/**

+  * @brief  Variable used for Program/Erase sectors under interruption

+  */

+FLASH_ProcessTypeDef pFlash = {.Lock = HAL_UNLOCKED, \

+                               .ErrorCode = HAL_FLASH_ERROR_NONE, \

+                               .ProcedureOnGoing = FLASH_PROC_NONE, \

+                               .Address = 0U, \

+                               .Bank = FLASH_BANK_1, \

+                               .Page = 0U, \

+                               .NbPagesToErase = 0U, \

+                               .CacheToReactivate = FLASH_CACHE_DISABLED};

+/**

+  * @}

+  */

+

+/* Private function prototypes -----------------------------------------------*/

+/** @defgroup FLASH_Private_Functions FLASH Private Functions

+ * @{

+ */

+static void          FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data);

+static void          FLASH_Program_Fast(uint32_t Address, uint32_t DataAddress);

+/**

+  * @}

+  */

+

+/* 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 double word or fast program of a row 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

+  *                This parameter is the data for the double word program and the address where

+  *                are stored the data for the row fast program

+  *

+  * @retval HAL_StatusTypeDef HAL Status

+  */

+HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data)

+{

+  HAL_StatusTypeDef status;

+  uint32_t prog_bit = 0;

+

+  /* 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)

+  {

+    pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;

+

+    /* Deactivate the data cache if they are activated to avoid data misbehavior */

+    if(READ_BIT(FLASH->ACR, FLASH_ACR_DCEN) != 0U)

+    {

+      /* Disable data cache  */

+      __HAL_FLASH_DATA_CACHE_DISABLE();

+      pFlash.CacheToReactivate = FLASH_CACHE_DCACHE_ENABLED;

+    }

+    else

+    {

+      pFlash.CacheToReactivate = FLASH_CACHE_DISABLED;

+    }

+

+    if(TypeProgram == FLASH_TYPEPROGRAM_DOUBLEWORD)

+    {

+      /* Program double-word (64-bit) at a specified address */

+      FLASH_Program_DoubleWord(Address, Data);

+      prog_bit = FLASH_CR_PG;

+    }

+    else if((TypeProgram == FLASH_TYPEPROGRAM_FAST) || (TypeProgram == FLASH_TYPEPROGRAM_FAST_AND_LAST))

+    {

+      /* Fast program a 32 row double-word (64-bit) at a specified address */

+      FLASH_Program_Fast(Address, (uint32_t)Data);

+

+      /* If it is the last row, the bit will be cleared at the end of the operation */

+      if(TypeProgram == FLASH_TYPEPROGRAM_FAST_AND_LAST)

+      {

+        prog_bit = FLASH_CR_FSTPG;

+      }

+    }

+    else

+    {

+      /* Nothing to do */

+    }

+

+    /* Wait for last operation to be completed */

+    status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);

+

+    /* If the program operation is completed, disable the PG or FSTPG Bit */

+    if (prog_bit != 0U)

+    {

+      CLEAR_BIT(FLASH->CR, prog_bit);

+    }

+

+    /* Flush the caches to be sure of the data consistency */

+    FLASH_FlushCaches();

+  }

+

+  /* Process Unlocked */

+  __HAL_UNLOCK(&pFlash);

+

+  return status;

+}

+

+/**

+  * @brief  Program double word or fast program of a row 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

+  *                This parameter is the data for the double word program and the address where

+  *                are stored the data for the row fast program

+  *

+  * @retval HAL Status

+  */

+HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check the parameters */

+  assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram));

+

+  /* Process Locked */

+  __HAL_LOCK(&pFlash);

+

+  pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;

+

+  /* Deactivate the data cache if they are activated to avoid data misbehavior */

+  if(READ_BIT(FLASH->ACR, FLASH_ACR_DCEN) != 0U)

+  {

+    /* Disable data cache  */

+    __HAL_FLASH_DATA_CACHE_DISABLE();

+    pFlash.CacheToReactivate = FLASH_CACHE_DCACHE_ENABLED;

+  }

+  else

+  {

+    pFlash.CacheToReactivate = FLASH_CACHE_DISABLED;

+  }

+

+  /* Set internal variables used by the IRQ handler */

+  if(TypeProgram == FLASH_TYPEPROGRAM_FAST_AND_LAST)

+  {

+    pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAM_LAST;

+  }

+  else

+  {

+    pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAM;

+  }

+  pFlash.Address = Address;

+

+  /* Enable End of Operation and Error interrupts */

+  __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP | FLASH_IT_OPERR);

+

+  if(TypeProgram == FLASH_TYPEPROGRAM_DOUBLEWORD)

+  {

+    /* Program double-word (64-bit) at a specified address */

+    FLASH_Program_DoubleWord(Address, Data);

+  }

+  else if((TypeProgram == FLASH_TYPEPROGRAM_FAST) || (TypeProgram == FLASH_TYPEPROGRAM_FAST_AND_LAST))

+  {

+    /* Fast program a 32 row double-word (64-bit) at a specified address */

+    FLASH_Program_Fast(Address, (uint32_t)Data);

+  }

+  else

+  {

+    /* Nothing to do */

+  }

+

+  return status;

+}

+

+/**

+  * @brief Handle FLASH interrupt request.

+  * @retval None

+  */

+void HAL_FLASH_IRQHandler(void)

+{

+  uint32_t tmp_page;

+  uint32_t error;

+  FLASH_ProcedureTypeDef procedure;

+

+  /* If the operation is completed, disable the PG, PNB, MER1, MER2 and PER Bit */

+  CLEAR_BIT(FLASH->CR, (FLASH_CR_PG | FLASH_CR_MER1 | FLASH_CR_PER | FLASH_CR_PNB));

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+  CLEAR_BIT(FLASH->CR, FLASH_CR_MER2);

+#endif

+

+  /* Disable the FSTPG Bit only if it is the last row programmed */

+  if(pFlash.ProcedureOnGoing == FLASH_PROC_PROGRAM_LAST)

+  {

+    CLEAR_BIT(FLASH->CR, FLASH_CR_FSTPG);

+  }

+

+  /* Check FLASH operation error flags */

+  error = (FLASH->SR & FLASH_FLAG_SR_ERRORS);

+  error |= (FLASH->ECCR & FLASH_FLAG_ECCC);

+

+  if (error !=0U)

+  {

+    /*Save the error code*/

+    pFlash.ErrorCode |= error;

+

+    /* Clear error programming flags */

+    __HAL_FLASH_CLEAR_FLAG(error);

+

+    /* Flush the caches to be sure of the data consistency */

+    FLASH_FlushCaches() ;

+

+    /* FLASH error interrupt user callback */

+    procedure = pFlash.ProcedureOnGoing;

+    if(procedure == FLASH_PROC_PAGE_ERASE)

+    {

+       HAL_FLASH_OperationErrorCallback(pFlash.Page);

+    }

+    else if(procedure == FLASH_PROC_MASS_ERASE)

+    {

+        HAL_FLASH_OperationErrorCallback(pFlash.Bank);

+    }

+    else if((procedure == FLASH_PROC_PROGRAM) ||

+            (procedure == FLASH_PROC_PROGRAM_LAST))

+    {

+       HAL_FLASH_OperationErrorCallback(pFlash.Address);

+    }

+    else

+    {

+       HAL_FLASH_OperationErrorCallback(0U);

+    }

+

+    /*Stop the procedure ongoing*/

+    pFlash.ProcedureOnGoing = FLASH_PROC_NONE;

+  }

+

+  /* Check FLASH End of Operation flag  */

+  if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP) != 0U)

+  {

+    /* Clear FLASH End of Operation pending bit */

+    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);

+

+    if(pFlash.ProcedureOnGoing == FLASH_PROC_PAGE_ERASE)

+    {

+      /* Nb of pages to erased can be decreased */

+      pFlash.NbPagesToErase--;

+

+      /* Check if there are still pages to erase*/

+      if(pFlash.NbPagesToErase != 0U)

+      {

+        /* Indicate user which page has been erased*/

+        HAL_FLASH_EndOfOperationCallback(pFlash.Page);

+

+        /* Increment page number */

+        pFlash.Page++;

+        tmp_page = pFlash.Page;

+        FLASH_PageErase(tmp_page, pFlash.Bank);

+      }

+      else

+      {

+        /* No more pages to Erase */

+        /* Reset Address and stop Erase pages procedure */

+        pFlash.Page = 0xFFFFFFFFU;

+        pFlash.ProcedureOnGoing = FLASH_PROC_NONE;

+

+        /* Flush the caches to be sure of the data consistency */

+        FLASH_FlushCaches() ;

+

+        /* FLASH EOP interrupt user callback */

+        HAL_FLASH_EndOfOperationCallback(pFlash.Page);

+      }

+    }

+    else

+    {

+      /* Flush the caches to be sure of the data consistency */

+      FLASH_FlushCaches() ;

+

+      procedure = pFlash.ProcedureOnGoing;

+      if(procedure == FLASH_PROC_MASS_ERASE)

+      {

+        /* MassErase ended. Return the selected bank */

+        /* FLASH EOP interrupt user callback */

+        HAL_FLASH_EndOfOperationCallback(pFlash.Bank);

+      }

+      else if((procedure == FLASH_PROC_PROGRAM) ||

+              (procedure == FLASH_PROC_PROGRAM_LAST))

+      {

+        /* Program ended. Return the selected address */

+        /* FLASH EOP interrupt user callback */

+        HAL_FLASH_EndOfOperationCallback(pFlash.Address);

+      }

+      else

+      {

+        /* Nothing to do */

+      }

+

+      /*Clear the procedure ongoing*/

+      pFlash.ProcedureOnGoing = FLASH_PROC_NONE;

+    }

+  }

+

+  if(pFlash.ProcedureOnGoing == FLASH_PROC_NONE)

+  {

+    /* Disable End of Operation and Error interrupts */

+    __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP | FLASH_IT_OPERR);

+

+    /* 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

+  *                  Mass Erase: Bank number which has been requested to erase

+  *                  Page Erase: Page which has been erased

+  *                    (if 0xFFFFFFFF, it means that all the selected pages have been erased)

+  *                  Program: Address which was selected for data program

+  * @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

+  *                 Mass Erase: Bank number which has been requested to erase

+  *                 Page Erase: Page number which returned an error

+  *                 Program: Address which was selected for data program

+  * @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) != 0U)

+  {

+    /* 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) != 0U)

+    {

+      status = HAL_ERROR;

+    }

+  }

+

+  return status;

+}

+

+/**

+  * @brief  Lock the FLASH control register access.

+  * @retval HAL Status

+  */

+HAL_StatusTypeDef HAL_FLASH_Lock(void)

+{

+  /* Set the LOCK Bit to lock the FLASH Registers access */

+  SET_BIT(FLASH->CR, FLASH_CR_LOCK);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Unlock the FLASH Option Bytes Registers access.

+  * @retval HAL Status

+  */

+HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void)

+{

+  if(READ_BIT(FLASH->CR, FLASH_CR_OPTLOCK) != 0U)

+  {

+    /* Authorizes the Option Byte register programming */

+    WRITE_REG(FLASH->OPTKEYR, FLASH_OPTKEY1);

+    WRITE_REG(FLASH->OPTKEYR, FLASH_OPTKEY2);

+  }

+  else

+  {

+    return HAL_ERROR;

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Lock the FLASH Option Bytes Registers access.

+  * @retval HAL Status

+  */

+HAL_StatusTypeDef HAL_FLASH_OB_Lock(void)

+{

+  /* Set the OPTLOCK Bit to lock the FLASH Option Byte Registers access */

+  SET_BIT(FLASH->CR, FLASH_CR_OPTLOCK);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Launch the option byte loading.

+  * @retval HAL Status

+  */

+HAL_StatusTypeDef HAL_FLASH_OB_Launch(void)

+{

+  /* Set the bit to force the option byte reloading */

+  SET_BIT(FLASH->CR, FLASH_CR_OBL_LAUNCH);

+

+  /* 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 HAL_FLASH_ERROR_RD: FLASH Read Protection error flag (PCROP)

+  *            @arg HAL_FLASH_ERROR_PGS: FLASH Programming Sequence error flag

+  *            @arg HAL_FLASH_ERROR_PGP: FLASH Programming Parallelism error flag

+  *            @arg HAL_FLASH_ERROR_PGA: FLASH Programming Alignment error flag

+  *            @arg HAL_FLASH_ERROR_WRP: FLASH Write protected error flag

+  *            @arg HAL_FLASH_ERROR_OPERATION: FLASH operation Error flag

+  *            @arg HAL_FLASH_ERROR_NONE: No error set

+  *            @arg HAL_FLASH_ERROR_OP: FLASH Operation error

+  *            @arg HAL_FLASH_ERROR_PROG: FLASH Programming error

+  *            @arg HAL_FLASH_ERROR_WRP: FLASH Write protection error

+  *            @arg HAL_FLASH_ERROR_PGA: FLASH Programming alignment error

+  *            @arg HAL_FLASH_ERROR_SIZ: FLASH Size error

+  *            @arg HAL_FLASH_ERROR_PGS: FLASH Programming sequence error

+  *            @arg HAL_FLASH_ERROR_MIS: FLASH Fast programming data miss error

+  *            @arg HAL_FLASH_ERROR_FAST: FLASH Fast programming error

+  *            @arg HAL_FLASH_ERROR_RD: FLASH PCROP read error

+  *            @arg HAL_FLASH_ERROR_OPTV: FLASH Option validity error

+  *            @arg FLASH_FLAG_PEMPTY : FLASH Boot from not programmed flash (apply only for STM32L43x/STM32L44x devices)

+  *            @arg HAL_FLASH_ERROR_ECCD: FLASH two ECC errors have been detected

+  */

+uint32_t HAL_FLASH_GetError(void)

+{

+   return pFlash.ErrorCode;

+}

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Private functions ---------------------------------------------------------*/

+

+/** @addtogroup FLASH_Private_Functions

+  * @{

+  */

+

+/**

+  * @brief  Wait for a FLASH operation to complete.

+  * @param  Timeout: maximum flash operation timeout

+  * @retval HAL_StatusTypeDef HAL Status

+  */

+HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout)

+{

+  /* 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 */

+

+  uint32_t tickstart = HAL_GetTick();

+  uint32_t error;

+

+  while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY))

+  {

+    if(Timeout != HAL_MAX_DELAY)

+    {

+      if((HAL_GetTick() - tickstart) >= Timeout)

+      {

+        return HAL_TIMEOUT;

+      }

+    }

+  }

+

+  error = (FLASH->SR & FLASH_FLAG_SR_ERRORS);

+  error |= (FLASH->ECCR & FLASH_FLAG_ECCD);

+

+  if(error != 0u)

+  {

+    /*Save the error code*/

+    pFlash.ErrorCode |= error;

+

+    /* Clear error programming flags */

+    __HAL_FLASH_CLEAR_FLAG(error);

+

+    return HAL_ERROR;

+  }

+

+  /* Check FLASH End of Operation flag  */

+  if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP))

+  {

+    /* 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 double-word (64-bit) at a specified address.

+  * @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_PROGRAM_ADDRESS(Address));

+

+  /* Set PG bit */

+  SET_BIT(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+4U) = (uint32_t)(Data >> 32);

+}

+

+/**

+  * @brief  Fast program a row double-word (64-bit) at a specified address.

+  * @param  Address: specifies the address to be programmed.

+  * @param  DataAddress: specifies the address where the data are stored.

+  * @retval None

+  */

+static void FLASH_Program_Fast(uint32_t Address, uint32_t DataAddress)

+{

+  uint32_t primask_bit;

+  uint8_t row_index = (2*FLASH_NB_DOUBLE_WORDS_IN_ROW);

+  __IO uint32_t *dest_addr = (__IO uint32_t*)Address;

+  __IO uint32_t *src_addr = (__IO uint32_t*)DataAddress;

+

+  /* Check the parameters */

+  assert_param(IS_FLASH_MAIN_MEM_ADDRESS(Address));

+

+  /* Set FSTPG bit */

+  SET_BIT(FLASH->CR, FLASH_CR_FSTPG);

+

+  /* Disable interrupts to avoid any interruption during the loop */

+  primask_bit = __get_PRIMASK();

+  __disable_irq();

+

+  /* Program the double word of the row */

+  do

+  {

+    *dest_addr = *src_addr;

+    dest_addr++;

+    src_addr++;

+    row_index--;

+  } while (row_index != 0U);

+

+  /* Re-enable the interrupts */

+  __set_PRIMASK(primask_bit);

+}

+

+/**

+  * @}

+  */

+

+#endif /* HAL_FLASH_MODULE_ENABLED */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c
new file mode 100644
index 0000000..5a30708
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c
@@ -0,0 +1,1308 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_flash_ex.c

+  * @author  MCD Application Team

+  * @brief   Extended FLASH HAL module driver.

+  *          This file provides firmware functions to manage the following

+  *          functionalities of the FLASH extended peripheral:

+  *           + Extended programming operations functions

+  *

+ @verbatim

+ ==============================================================================

+                   ##### Flash Extended features #####

+  ==============================================================================

+

+  [..] Comparing to other previous devices, the FLASH interface for STM32L4xx

+       devices contains the following additional features

+

+       (+) Capacity up to 2 Mbyte with dual bank architecture supporting read-while-write

+           capability (RWW)

+       (+) Dual bank memory organization

+       (+) PCROP protection for all banks

+

+                        ##### How to use this driver #####

+ ==============================================================================

+  [..] This driver provides functions to configure and program the FLASH memory

+       of all STM32L4xx devices. It includes

+      (#) Flash Memory Erase functions:

+           (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and

+                HAL_FLASH_Lock() functions

+           (++) Erase function: Erase page, erase all sectors

+           (++) There are two modes of erase :

+             (+++) Polling Mode using HAL_FLASHEx_Erase()

+             (+++) Interrupt Mode using HAL_FLASHEx_Erase_IT()

+

+      (#) Option Bytes Programming function: Use HAL_FLASHEx_OBProgram() to :

+        (++) Set/Reset the write protection

+        (++) Set the Read protection Level

+        (++) Program the user Option Bytes

+        (++) Configure the PCROP protection

+

+      (#) Get Option Bytes Configuration function: Use HAL_FLASHEx_OBGetConfig() to :

+        (++) Get the value of a write protection area

+        (++) Know if the read protection is activated

+        (++) Get the value of the user Option Bytes

+        (++) Get the value of a PCROP area

+

+ @endverbatim

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                       opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup FLASHEx FLASHEx

+  * @brief FLASH Extended HAL module driver

+  * @{

+  */

+

+#ifdef HAL_FLASH_MODULE_ENABLED

+

+/* Private typedef -----------------------------------------------------------*/

+/* Private define ------------------------------------------------------------*/

+/* Private macro -------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/* Private function prototypes -----------------------------------------------*/

+/** @defgroup FLASHEx_Private_Functions FLASHEx Private Functions

+ * @{

+ */

+static void              FLASH_MassErase(uint32_t Banks);

+static HAL_StatusTypeDef FLASH_OB_WRPConfig(uint32_t WRPArea, uint32_t WRPStartOffset, uint32_t WRDPEndOffset);

+static HAL_StatusTypeDef FLASH_OB_RDPConfig(uint32_t RDPLevel);

+static HAL_StatusTypeDef FLASH_OB_UserConfig(uint32_t UserType, uint32_t UserConfig);

+static HAL_StatusTypeDef FLASH_OB_PCROPConfig(uint32_t PCROPConfig, uint32_t PCROPStartAddr, uint32_t PCROPEndAddr);

+static void              FLASH_OB_GetWRP(uint32_t WRPArea, uint32_t * WRPStartOffset, uint32_t * WRDPEndOffset);

+static uint32_t          FLASH_OB_GetRDP(void);

+static uint32_t          FLASH_OB_GetUser(void);

+static void              FLASH_OB_GetPCROP(uint32_t * PCROPConfig, uint32_t * PCROPStartAddr, uint32_t * PCROPEndAddr);

+/**

+  * @}

+  */

+

+/* Exported functions -------------------------------------------------------*/

+/** @defgroup FLASHEx_Exported_Functions FLASHEx Exported Functions

+  * @{

+  */

+

+/** @defgroup FLASHEx_Exported_Functions_Group1 Extended IO operation functions

+ *  @brief   Extended IO operation functions

+ *

+@verbatim

+ ===============================================================================

+                ##### Extended programming operation functions #####

+ ===============================================================================

+    [..]

+    This subsection provides a set of functions allowing to manage the Extended FLASH

+    programming operations Operations.

+

+@endverbatim

+  * @{

+  */

+/**

+  * @brief  Perform a mass erase or erase the specified FLASH memory pages.

+  * @param[in]  pEraseInit: pointer to an FLASH_EraseInitTypeDef structure that

+  *         contains the configuration information for the erasing.

+  *

+  * @param[out]  PageError  : pointer to variable that contains the configuration

+  *         information on faulty page in case of error (0xFFFFFFFF means that all

+  *         the pages have been correctly erased)

+  *

+  * @retval HAL Status

+  */

+HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError)

+{

+  HAL_StatusTypeDef status;

+  uint32_t page_index;

+

+  /* Process Locked */

+  __HAL_LOCK(&pFlash);

+

+  /* Check the parameters */

+  assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase));

+

+  /* Wait for last operation to be completed */

+  status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);

+

+  if (status == HAL_OK)

+  {

+    pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;

+

+    /* Deactivate the cache if they are activated to avoid data misbehavior */

+    if(READ_BIT(FLASH->ACR, FLASH_ACR_ICEN) != 0U)

+    {

+      /* Disable instruction cache  */

+      __HAL_FLASH_INSTRUCTION_CACHE_DISABLE();

+

+      if(READ_BIT(FLASH->ACR, FLASH_ACR_DCEN) != 0U)

+      {

+        /* Disable data cache  */

+        __HAL_FLASH_DATA_CACHE_DISABLE();

+        pFlash.CacheToReactivate = FLASH_CACHE_ICACHE_DCACHE_ENABLED;

+      }

+      else

+      {

+        pFlash.CacheToReactivate = FLASH_CACHE_ICACHE_ENABLED;

+      }

+    }

+    else if(READ_BIT(FLASH->ACR, FLASH_ACR_DCEN) != 0U)

+    {

+      /* Disable data cache  */

+      __HAL_FLASH_DATA_CACHE_DISABLE();

+      pFlash.CacheToReactivate = FLASH_CACHE_DCACHE_ENABLED;

+    }

+    else

+    {

+      pFlash.CacheToReactivate = FLASH_CACHE_DISABLED;

+    }

+

+    if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE)

+    {

+      /* Mass erase to be done */

+      FLASH_MassErase(pEraseInit->Banks);

+

+      /* Wait for last operation to be completed */

+      status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);

+

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+      /* If the erase operation is completed, disable the MER1 and MER2 Bits */

+      CLEAR_BIT(FLASH->CR, (FLASH_CR_MER1 | FLASH_CR_MER2));

+#else

+      /* If the erase operation is completed, disable the MER1 Bit */

+      CLEAR_BIT(FLASH->CR, (FLASH_CR_MER1));

+#endif

+    }

+    else

+    {

+      /*Initialization of PageError variable*/

+      *PageError = 0xFFFFFFFFU;

+

+      for(page_index = pEraseInit->Page; page_index < (pEraseInit->Page + pEraseInit->NbPages); page_index++)

+      {

+        FLASH_PageErase(page_index, pEraseInit->Banks);

+

+        /* Wait for last operation to be completed */

+        status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);

+

+        /* If the erase operation is completed, disable the PER Bit */

+        CLEAR_BIT(FLASH->CR, (FLASH_CR_PER | FLASH_CR_PNB));

+

+        if (status != HAL_OK)

+        {

+          /* In case of error, stop erase procedure and return the faulty address */

+          *PageError = page_index;

+          break;

+        }

+      }

+    }

+

+    /* Flush the caches to be sure of the data consistency */

+    FLASH_FlushCaches();

+  }

+

+  /* Process Unlocked */

+  __HAL_UNLOCK(&pFlash);

+

+  return status;

+}

+

+/**

+  * @brief  Perform a mass erase or erase the specified FLASH memory pages with interrupt enabled.

+  * @param  pEraseInit: pointer to an FLASH_EraseInitTypeDef structure that

+  *         contains the configuration information for the erasing.

+  *

+  * @retval HAL Status

+  */

+HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Process Locked */

+  __HAL_LOCK(&pFlash);

+

+  /* Check the parameters */

+  assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase));

+

+  pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;

+

+  /* Deactivate the cache if they are activated to avoid data misbehavior */

+  if(READ_BIT(FLASH->ACR, FLASH_ACR_ICEN) != 0U)

+  {

+    /* Disable instruction cache  */

+    __HAL_FLASH_INSTRUCTION_CACHE_DISABLE();

+

+    if(READ_BIT(FLASH->ACR, FLASH_ACR_DCEN) != 0U)

+    {

+      /* Disable data cache  */

+      __HAL_FLASH_DATA_CACHE_DISABLE();

+      pFlash.CacheToReactivate = FLASH_CACHE_ICACHE_DCACHE_ENABLED;

+    }

+    else

+    {

+      pFlash.CacheToReactivate = FLASH_CACHE_ICACHE_ENABLED;

+    }

+  }

+  else if(READ_BIT(FLASH->ACR, FLASH_ACR_DCEN) != 0U)

+  {

+    /* Disable data cache  */

+    __HAL_FLASH_DATA_CACHE_DISABLE();

+    pFlash.CacheToReactivate = FLASH_CACHE_DCACHE_ENABLED;

+  }

+  else

+  {

+    pFlash.CacheToReactivate = FLASH_CACHE_DISABLED;

+  }

+

+  /* Enable End of Operation and Error interrupts */

+  __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP | FLASH_IT_OPERR);

+

+  pFlash.Bank = pEraseInit->Banks;

+

+  if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE)

+  {

+    /* Mass erase to be done */

+    pFlash.ProcedureOnGoing = FLASH_PROC_MASS_ERASE;

+    FLASH_MassErase(pEraseInit->Banks);

+  }

+  else

+  {

+    /* Erase by page to be done */

+    pFlash.ProcedureOnGoing = FLASH_PROC_PAGE_ERASE;

+    pFlash.NbPagesToErase = pEraseInit->NbPages;

+    pFlash.Page = pEraseInit->Page;

+

+    /*Erase 1st page and wait for IT */

+    FLASH_PageErase(pEraseInit->Page, pEraseInit->Banks);

+  }

+

+  return status;

+}

+

+/**

+  * @brief  Program Option bytes.

+  * @param  pOBInit: pointer to an FLASH_OBInitStruct structure that

+  *         contains the configuration information for the programming.

+  *

+  * @retval HAL Status

+  */

+HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Process Locked */

+  __HAL_LOCK(&pFlash);

+

+  /* Check the parameters */

+  assert_param(IS_OPTIONBYTE(pOBInit->OptionType));

+

+  pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;

+

+  /* Write protection configuration */

+  if((pOBInit->OptionType & OPTIONBYTE_WRP) != 0U)

+  {

+    /* Configure of Write protection on the selected area */

+    if(FLASH_OB_WRPConfig(pOBInit->WRPArea, pOBInit->WRPStartOffset, pOBInit->WRPEndOffset) != HAL_OK)

+    {

+      status = HAL_ERROR;

+    }

+

+  }

+

+  /* Read protection configuration */

+  if((pOBInit->OptionType & OPTIONBYTE_RDP) != 0U)

+  {

+    /* Configure the Read protection level */

+    if(FLASH_OB_RDPConfig(pOBInit->RDPLevel) != HAL_OK)

+    {

+      status = HAL_ERROR;

+    }

+  }

+

+  /* User Configuration */

+  if((pOBInit->OptionType & OPTIONBYTE_USER) != 0U)

+  {

+    /* Configure the user option bytes */

+    if(FLASH_OB_UserConfig(pOBInit->USERType, pOBInit->USERConfig) != HAL_OK)

+    {

+      status = HAL_ERROR;

+    }

+  }

+

+  /* PCROP Configuration */

+  if((pOBInit->OptionType & OPTIONBYTE_PCROP) != 0U)

+  {

+    if (pOBInit->PCROPStartAddr != pOBInit->PCROPEndAddr)

+    {

+      /* Configure the Proprietary code readout protection */

+      if(FLASH_OB_PCROPConfig(pOBInit->PCROPConfig, pOBInit->PCROPStartAddr, pOBInit->PCROPEndAddr) != HAL_OK)

+      {

+        status = HAL_ERROR;

+      }

+    }

+  }

+

+  /* Process Unlocked */

+  __HAL_UNLOCK(&pFlash);

+

+  return status;

+}

+

+/**

+  * @brief  Get the Option bytes configuration.

+  * @param  pOBInit: pointer to an FLASH_OBInitStruct structure that contains the

+  *                  configuration information.

+  * @note   The fields pOBInit->WRPArea and pOBInit->PCROPConfig should indicate

+  *         which area is requested for the WRP and PCROP, else no information will be returned

+  *

+  * @retval None

+  */

+void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit)

+{

+  pOBInit->OptionType = (OPTIONBYTE_RDP | OPTIONBYTE_USER);

+

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+  if((pOBInit->WRPArea == OB_WRPAREA_BANK1_AREAA) || (pOBInit->WRPArea == OB_WRPAREA_BANK1_AREAB) ||

+     (pOBInit->WRPArea == OB_WRPAREA_BANK2_AREAA) || (pOBInit->WRPArea == OB_WRPAREA_BANK2_AREAB))

+#else

+  if((pOBInit->WRPArea == OB_WRPAREA_BANK1_AREAA) || (pOBInit->WRPArea == OB_WRPAREA_BANK1_AREAB))

+#endif

+  {

+    pOBInit->OptionType |= OPTIONBYTE_WRP;

+    /* Get write protection on the selected area */

+    FLASH_OB_GetWRP(pOBInit->WRPArea, &(pOBInit->WRPStartOffset), &(pOBInit->WRPEndOffset));

+  }

+

+  /* Get Read protection level */

+  pOBInit->RDPLevel = FLASH_OB_GetRDP();

+

+  /* Get the user option bytes */

+  pOBInit->USERConfig = FLASH_OB_GetUser();

+

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+  if((pOBInit->PCROPConfig == FLASH_BANK_1) || (pOBInit->PCROPConfig == FLASH_BANK_2))

+#else

+  if(pOBInit->PCROPConfig == FLASH_BANK_1)

+#endif

+  {

+    pOBInit->OptionType |= OPTIONBYTE_PCROP;

+    /* Get the Proprietary code readout protection */

+    FLASH_OB_GetPCROP(&(pOBInit->PCROPConfig), &(pOBInit->PCROPStartAddr), &(pOBInit->PCROPEndAddr));

+  }

+}

+

+/**

+  * @}

+  */

+

+#if defined (FLASH_CFGR_LVEN)

+/** @defgroup FLASHEx_Exported_Functions_Group2 Extended specific configuration functions

+ *  @brief   Extended specific configuration functions

+ *

+@verbatim

+ ===============================================================================

+                ##### Extended specific configuration functions #####

+ ===============================================================================

+    [..]

+    This subsection provides a set of functions allowing to manage the Extended FLASH

+    specific configurations.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Configuration of the LVE pin of the Flash (managed by power controller

+  *         or forced to low in order to use an external SMPS)

+  * @param  ConfigLVE: Configuration of the LVE pin,

+  *              This parameter can be one of the following values:

+  *                @arg FLASH_LVE_PIN_CTRL: LVE FLASH pin controlled by power controller

+  *                @arg FLASH_LVE_PIN_FORCED: LVE FLASH pin enforced to low (external SMPS used)

+  *

+  * @note   Before enforcing the LVE pin to low, the SOC should be in low voltage

+  *         range 2 and the voltage VDD12 should be higher than 1.08V and SMPS is ON.

+  *

+  * @retval HAL Status

+  */

+HAL_StatusTypeDef HAL_FLASHEx_ConfigLVEPin(uint32_t ConfigLVE)

+{

+  HAL_StatusTypeDef status;

+

+  /* Process Locked */

+  __HAL_LOCK(&pFlash);

+

+  /* Check the parameters */

+  assert_param(IS_FLASH_LVE_PIN(ConfigLVE));

+

+  /* Wait for last operation to be completed */

+  status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);

+

+  if (status == HAL_OK)

+  {

+    /* Check that the voltage scaling is range 2 */

+    if (HAL_PWREx_GetVoltageRange() == PWR_REGULATOR_VOLTAGE_SCALE2)

+    {

+      /* Configure the LVEN bit */

+      MODIFY_REG(FLASH->CFGR, FLASH_CFGR_LVEN, ConfigLVE);

+

+      /* Check that the bit has been correctly configured */

+      if (READ_BIT(FLASH->CFGR, FLASH_CFGR_LVEN) != ConfigLVE)

+      {

+        status = HAL_ERROR;

+      }

+    }

+    else

+    {

+      /* Not allow to force Flash LVE pin if not in voltage range 2 */

+      status = HAL_ERROR;

+    }

+  }

+

+  /* Process Unlocked */

+  __HAL_UNLOCK(&pFlash);

+

+  return status;

+}

+

+/**

+  * @}

+  */

+#endif /* FLASH_CFGR_LVEN */

+

+/**

+  * @}

+  */

+

+/* Private functions ---------------------------------------------------------*/

+

+/** @addtogroup FLASHEx_Private_Functions

+  * @{

+  */

+/**

+  * @brief  Mass erase of FLASH memory.

+  * @param  Banks: Banks to be erased

+  *          This parameter can be one of the following values:

+  *            @arg FLASH_BANK_1: Bank1 to be erased

+  *            @arg FLASH_BANK_2: Bank2 to be erased

+  *            @arg FLASH_BANK_BOTH: Bank1 and Bank2 to be erased

+  * @retval None

+  */

+static void FLASH_MassErase(uint32_t Banks)

+{

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+  if (READ_BIT(FLASH->OPTR, FLASH_OPTR_DBANK) != 0U)

+#endif

+  {

+    /* Check the parameters */

+    assert_param(IS_FLASH_BANK(Banks));

+

+    /* Set the Mass Erase Bit for the bank 1 if requested */

+    if((Banks & FLASH_BANK_1) != 0U)

+    {

+      SET_BIT(FLASH->CR, FLASH_CR_MER1);

+    }

+

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+    /* Set the Mass Erase Bit for the bank 2 if requested */

+    if((Banks & FLASH_BANK_2) != 0U)

+    {

+      SET_BIT(FLASH->CR, FLASH_CR_MER2);

+    }

+#endif

+  }

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+  else

+  {

+    SET_BIT(FLASH->CR, (FLASH_CR_MER1 | FLASH_CR_MER2));

+  }

+#endif

+

+  /* Proceed to erase all sectors */

+  SET_BIT(FLASH->CR, FLASH_CR_STRT);

+}

+

+/**

+  * @brief  Erase the specified FLASH memory page.

+  * @param  Page: FLASH page to erase

+  *         This parameter must be a value between 0 and (max number of pages in the bank - 1)

+  * @param  Banks: Bank(s) where the page will be erased

+  *          This parameter can be one of the following values:

+  *            @arg FLASH_BANK_1: Page in bank 1 to be erased

+  *            @arg FLASH_BANK_2: Page in bank 2 to be erased

+  * @retval None

+  */

+void FLASH_PageErase(uint32_t Page, uint32_t Banks)

+{

+  /* Check the parameters */

+  assert_param(IS_FLASH_PAGE(Page));

+

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+  if(READ_BIT(FLASH->OPTR, FLASH_OPTR_DBANK) == 0U)

+  {

+    CLEAR_BIT(FLASH->CR, FLASH_CR_BKER);

+  }

+  else

+#endif

+  {

+    assert_param(IS_FLASH_BANK_EXCLUSIVE(Banks));

+

+    if((Banks & FLASH_BANK_1) != 0U)

+    {

+      CLEAR_BIT(FLASH->CR, FLASH_CR_BKER);

+    }

+    else

+    {

+      SET_BIT(FLASH->CR, FLASH_CR_BKER);

+    }

+  }

+#else

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(Banks);

+#endif

+

+  /* Proceed to erase the page */

+  MODIFY_REG(FLASH->CR, FLASH_CR_PNB, ((Page & 0xFFU) << FLASH_CR_PNB_Pos));

+  SET_BIT(FLASH->CR, FLASH_CR_PER);

+  SET_BIT(FLASH->CR, FLASH_CR_STRT);

+}

+

+/**

+  * @brief  Flush the instruction and data caches.

+  * @retval None

+  */

+void FLASH_FlushCaches(void)

+{

+  FLASH_CacheTypeDef cache = pFlash.CacheToReactivate;

+

+  /* Flush instruction cache  */

+  if((cache == FLASH_CACHE_ICACHE_ENABLED) ||

+     (cache == FLASH_CACHE_ICACHE_DCACHE_ENABLED))

+  {

+    /* Reset instruction cache */

+    __HAL_FLASH_INSTRUCTION_CACHE_RESET();

+    /* Enable instruction cache */

+    __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();

+  }

+

+  /* Flush data cache */

+  if((cache == FLASH_CACHE_DCACHE_ENABLED) ||

+     (cache == FLASH_CACHE_ICACHE_DCACHE_ENABLED))

+  {

+    /* Reset data cache */

+    __HAL_FLASH_DATA_CACHE_RESET();

+    /* Enable data cache */

+    __HAL_FLASH_DATA_CACHE_ENABLE();

+  }

+

+  /* Reset internal variable */

+  pFlash.CacheToReactivate = FLASH_CACHE_DISABLED;

+}

+

+/**

+  * @brief  Configure the write protection of the desired pages.

+  *

+  * @note   When the memory read protection level is selected (RDP level = 1),

+  *         it is not possible to program or erase Flash memory if the CPU debug

+  *         features are connected (JTAG or single wire) or boot code is being

+  *         executed from RAM or System flash, even if WRP is not activated.

+  * @note   To configure the WRP options, the option lock bit OPTLOCK must be

+  *         cleared with the call of the HAL_FLASH_OB_Unlock() function.

+  * @note   To validate the WRP options, the option bytes must be reloaded

+  *         through the call of the HAL_FLASH_OB_Launch() function.

+  *

+  * @param  WRPArea: specifies the area to be configured.

+  *          This parameter can be one of the following values:

+  *            @arg OB_WRPAREA_BANK1_AREAA: Flash Bank 1 Area A

+  *            @arg OB_WRPAREA_BANK1_AREAB: Flash Bank 1 Area B

+  *            @arg OB_WRPAREA_BANK2_AREAA: Flash Bank 2 Area A  (don't apply for STM32L43x/STM32L44x devices)

+  *            @arg OB_WRPAREA_BANK2_AREAB: Flash Bank 2 Area B  (don't apply for STM32L43x/STM32L44x devices)

+  *

+  * @param  WRPStartOffset: specifies the start page of the write protected area

+  *          This parameter can be page number between 0 and (max number of pages in the bank - 1)

+  *

+  * @param  WRDPEndOffset: specifies the end page of the write protected area

+  *          This parameter can be page number between WRPStartOffset and (max number of pages in the bank - 1)

+  *

+  * @retval HAL Status

+  */

+static HAL_StatusTypeDef FLASH_OB_WRPConfig(uint32_t WRPArea, uint32_t WRPStartOffset, uint32_t WRDPEndOffset)

+{

+  HAL_StatusTypeDef status;

+

+  /* Check the parameters */

+  assert_param(IS_OB_WRPAREA(WRPArea));

+  assert_param(IS_FLASH_PAGE(WRPStartOffset));

+  assert_param(IS_FLASH_PAGE(WRDPEndOffset));

+

+  /* Wait for last operation to be completed */

+  status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);

+

+  if(status == HAL_OK)

+  {

+    /* Configure the write protected area */

+    if(WRPArea == OB_WRPAREA_BANK1_AREAA)

+    {

+      MODIFY_REG(FLASH->WRP1AR, (FLASH_WRP1AR_WRP1A_STRT | FLASH_WRP1AR_WRP1A_END),

+                 (WRPStartOffset | (WRDPEndOffset << 16)));

+    }

+    else if(WRPArea == OB_WRPAREA_BANK1_AREAB)

+    {

+      MODIFY_REG(FLASH->WRP1BR, (FLASH_WRP1BR_WRP1B_STRT | FLASH_WRP1BR_WRP1B_END),

+                 (WRPStartOffset | (WRDPEndOffset << 16)));

+    }

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+    else if(WRPArea == OB_WRPAREA_BANK2_AREAA)

+    {

+      MODIFY_REG(FLASH->WRP2AR, (FLASH_WRP2AR_WRP2A_STRT | FLASH_WRP2AR_WRP2A_END),

+                 (WRPStartOffset | (WRDPEndOffset << 16)));

+    }

+    else if(WRPArea == OB_WRPAREA_BANK2_AREAB)

+    {

+      MODIFY_REG(FLASH->WRP2BR, (FLASH_WRP2BR_WRP2B_STRT | FLASH_WRP2BR_WRP2B_END),

+                 (WRPStartOffset | (WRDPEndOffset << 16)));

+    }

+#endif

+    else

+    {

+      /* Nothing to do */

+    }

+

+    /* Set OPTSTRT Bit */

+    SET_BIT(FLASH->CR, FLASH_CR_OPTSTRT);

+

+    /* Wait for last operation to be completed */

+    status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);

+

+    /* If the option byte program operation is completed, disable the OPTSTRT Bit */

+    CLEAR_BIT(FLASH->CR, FLASH_CR_OPTSTRT);

+  }

+

+  return status;

+}

+

+/**

+  * @brief  Set the read protection level.

+  *

+  * @note   To configure the RDP level, the option lock bit OPTLOCK must be

+  *         cleared with the call of the HAL_FLASH_OB_Unlock() function.

+  * @note   To validate the RDP level, the option bytes must be reloaded

+  *         through the call of the HAL_FLASH_OB_Launch() function.

+  * @note   !!! Warning : When enabling OB_RDP level 2 it's no more possible

+  *         to go back to level 1 or 0 !!!

+  *

+  * @param  RDPLevel: specifies the read protection level.

+  *         This parameter can be one of the following values:

+  *            @arg OB_RDP_LEVEL_0: No protection

+  *            @arg OB_RDP_LEVEL_1: Read protection of the memory

+  *            @arg OB_RDP_LEVEL_2: Full chip protection

+  *

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef FLASH_OB_RDPConfig(uint32_t RDPLevel)

+{

+  HAL_StatusTypeDef status;

+

+  /* Check the parameters */

+  assert_param(IS_OB_RDP_LEVEL(RDPLevel));

+

+  /* Wait for last operation to be completed */

+  status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);

+

+  if(status == HAL_OK)

+  {

+    /* Configure the RDP level in the option bytes register */

+    MODIFY_REG(FLASH->OPTR, FLASH_OPTR_RDP, RDPLevel);

+

+    /* Set OPTSTRT Bit */

+    SET_BIT(FLASH->CR, FLASH_CR_OPTSTRT);

+

+    /* Wait for last operation to be completed */

+    status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);

+

+    /* If the option byte program operation is completed, disable the OPTSTRT Bit */

+    CLEAR_BIT(FLASH->CR, FLASH_CR_OPTSTRT);

+  }

+

+  return status;

+}

+

+/**

+  * @brief  Program the FLASH User Option Byte.

+  *

+  * @note   To configure the user option bytes, the option lock bit OPTLOCK must

+  *         be cleared with the call of the HAL_FLASH_OB_Unlock() function.

+  * @note   To validate the user option bytes, the option bytes must be reloaded

+  *         through the call of the HAL_FLASH_OB_Launch() function.

+  *

+  * @param  UserType: The FLASH User Option Bytes to be modified

+  * @param  UserConfig: The FLASH User Option Bytes values:

+  *         BOR_LEV(Bit8-10), nRST_STOP(Bit12), nRST_STDBY(Bit13), IWDG_SW(Bit16),

+  *         IWDG_STOP(Bit17), IWDG_STDBY(Bit18), WWDG_SW(Bit19), BFB2(Bit20),

+  *         DUALBANK(Bit21), nBOOT1(Bit23), SRAM2_PE(Bit24) and SRAM2_RST(Bit25).

+  *

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef FLASH_OB_UserConfig(uint32_t UserType, uint32_t UserConfig)

+{

+  uint32_t optr_reg_val = 0;

+  uint32_t optr_reg_mask = 0;

+  HAL_StatusTypeDef status;

+

+  /* Check the parameters */

+  assert_param(IS_OB_USER_TYPE(UserType));

+

+  /* Wait for last operation to be completed */

+  status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);

+

+  if(status == HAL_OK)

+  {

+    if((UserType & OB_USER_BOR_LEV) != 0U)

+    {

+      /* BOR level option byte should be modified */

+      assert_param(IS_OB_USER_BOR_LEVEL(UserConfig & FLASH_OPTR_BOR_LEV));

+

+      /* Set value and mask for BOR level option byte */

+      optr_reg_val |= (UserConfig & FLASH_OPTR_BOR_LEV);

+      optr_reg_mask |= FLASH_OPTR_BOR_LEV;

+    }

+

+    if((UserType & OB_USER_nRST_STOP) != 0U)

+    {

+      /* nRST_STOP option byte should be modified */

+      assert_param(IS_OB_USER_STOP(UserConfig & FLASH_OPTR_nRST_STOP));

+

+      /* Set value and mask for nRST_STOP option byte */

+      optr_reg_val |= (UserConfig & FLASH_OPTR_nRST_STOP);

+      optr_reg_mask |= FLASH_OPTR_nRST_STOP;

+    }

+

+    if((UserType & OB_USER_nRST_STDBY) != 0U)

+    {

+      /* nRST_STDBY option byte should be modified */

+      assert_param(IS_OB_USER_STANDBY(UserConfig & FLASH_OPTR_nRST_STDBY));

+

+      /* Set value and mask for nRST_STDBY option byte */

+      optr_reg_val |= (UserConfig & FLASH_OPTR_nRST_STDBY);

+      optr_reg_mask |= FLASH_OPTR_nRST_STDBY;

+    }

+

+    if((UserType & OB_USER_nRST_SHDW) != 0U)

+    {

+      /* nRST_SHDW option byte should be modified */

+      assert_param(IS_OB_USER_SHUTDOWN(UserConfig & FLASH_OPTR_nRST_SHDW));

+

+      /* Set value and mask for nRST_SHDW option byte */

+      optr_reg_val |= (UserConfig & FLASH_OPTR_nRST_SHDW);

+      optr_reg_mask |= FLASH_OPTR_nRST_SHDW;

+    }

+

+    if((UserType & OB_USER_IWDG_SW) != 0U)

+    {

+      /* IWDG_SW option byte should be modified */

+      assert_param(IS_OB_USER_IWDG(UserConfig & FLASH_OPTR_IWDG_SW));

+

+      /* Set value and mask for IWDG_SW option byte */

+      optr_reg_val |= (UserConfig & FLASH_OPTR_IWDG_SW);

+      optr_reg_mask |= FLASH_OPTR_IWDG_SW;

+    }

+

+    if((UserType & OB_USER_IWDG_STOP) != 0U)

+    {

+      /* IWDG_STOP option byte should be modified */

+      assert_param(IS_OB_USER_IWDG_STOP(UserConfig & FLASH_OPTR_IWDG_STOP));

+

+      /* Set value and mask for IWDG_STOP option byte */

+      optr_reg_val |= (UserConfig & FLASH_OPTR_IWDG_STOP);

+      optr_reg_mask |= FLASH_OPTR_IWDG_STOP;

+    }

+

+    if((UserType & OB_USER_IWDG_STDBY) != 0U)

+    {

+      /* IWDG_STDBY option byte should be modified */

+      assert_param(IS_OB_USER_IWDG_STDBY(UserConfig & FLASH_OPTR_IWDG_STDBY));

+

+      /* Set value and mask for IWDG_STDBY option byte */

+      optr_reg_val |= (UserConfig & FLASH_OPTR_IWDG_STDBY);

+      optr_reg_mask |= FLASH_OPTR_IWDG_STDBY;

+    }

+

+    if((UserType & OB_USER_WWDG_SW) != 0U)

+    {

+      /* WWDG_SW option byte should be modified */

+      assert_param(IS_OB_USER_WWDG(UserConfig & FLASH_OPTR_WWDG_SW));

+

+      /* Set value and mask for WWDG_SW option byte */

+      optr_reg_val |= (UserConfig & FLASH_OPTR_WWDG_SW);

+      optr_reg_mask |= FLASH_OPTR_WWDG_SW;

+    }

+

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+    if((UserType & OB_USER_BFB2) != 0U)

+    {

+      /* BFB2 option byte should be modified */

+      assert_param(IS_OB_USER_BFB2(UserConfig & FLASH_OPTR_BFB2));

+

+      /* Set value and mask for BFB2 option byte */

+      optr_reg_val |= (UserConfig & FLASH_OPTR_BFB2);

+      optr_reg_mask |= FLASH_OPTR_BFB2;

+    }

+

+    if((UserType & OB_USER_DUALBANK) != 0U)

+    {

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+      /* DUALBANK option byte should be modified */

+      assert_param(IS_OB_USER_DUALBANK(UserConfig & FLASH_OPTR_DB1M));

+

+      /* Set value and mask for DUALBANK option byte */

+      optr_reg_val |= (UserConfig & FLASH_OPTR_DB1M);

+      optr_reg_mask |= FLASH_OPTR_DB1M;

+#else

+      /* DUALBANK option byte should be modified */

+      assert_param(IS_OB_USER_DUALBANK(UserConfig & FLASH_OPTR_DUALBANK));

+

+      /* Set value and mask for DUALBANK option byte */

+      optr_reg_val |= (UserConfig & FLASH_OPTR_DUALBANK);

+      optr_reg_mask |= FLASH_OPTR_DUALBANK;

+#endif

+    }

+#endif

+

+    if((UserType & OB_USER_nBOOT1) != 0U)

+    {

+      /* nBOOT1 option byte should be modified */

+      assert_param(IS_OB_USER_BOOT1(UserConfig & FLASH_OPTR_nBOOT1));

+

+      /* Set value and mask for nBOOT1 option byte */

+      optr_reg_val |= (UserConfig & FLASH_OPTR_nBOOT1);

+      optr_reg_mask |= FLASH_OPTR_nBOOT1;

+    }

+

+    if((UserType & OB_USER_SRAM2_PE) != 0U)

+    {

+      /* SRAM2_PE option byte should be modified */

+      assert_param(IS_OB_USER_SRAM2_PARITY(UserConfig & FLASH_OPTR_SRAM2_PE));

+

+      /* Set value and mask for SRAM2_PE option byte */

+      optr_reg_val |= (UserConfig & FLASH_OPTR_SRAM2_PE);

+      optr_reg_mask |= FLASH_OPTR_SRAM2_PE;

+    }

+

+    if((UserType & OB_USER_SRAM2_RST) != 0U)

+    {

+      /* SRAM2_RST option byte should be modified */

+      assert_param(IS_OB_USER_SRAM2_RST(UserConfig & FLASH_OPTR_SRAM2_RST));

+

+      /* Set value and mask for SRAM2_RST option byte */

+      optr_reg_val |= (UserConfig & FLASH_OPTR_SRAM2_RST);

+      optr_reg_mask |= FLASH_OPTR_SRAM2_RST;

+    }

+

+#if defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L431xx) || defined (STM32L432xx) || defined (STM32L433xx) || \

+    defined (STM32L442xx) || defined (STM32L443xx) || defined (STM32L451xx) || defined (STM32L452xx) || defined (STM32L462xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+    if((UserType & OB_USER_nSWBOOT0) != 0U)

+    {

+      /* nSWBOOT0 option byte should be modified */

+      assert_param(IS_OB_USER_SWBOOT0(UserConfig & FLASH_OPTR_nSWBOOT0));

+

+      /* Set value and mask for nSWBOOT0 option byte */

+      optr_reg_val |= (UserConfig & FLASH_OPTR_nSWBOOT0);

+      optr_reg_mask |= FLASH_OPTR_nSWBOOT0;

+    }

+

+    if((UserType & OB_USER_nBOOT0) != 0U)

+    {

+      /* nBOOT0 option byte should be modified */

+      assert_param(IS_OB_USER_BOOT0(UserConfig & FLASH_OPTR_nBOOT0));

+

+      /* Set value and mask for nBOOT0 option byte */

+      optr_reg_val |= (UserConfig & FLASH_OPTR_nBOOT0);

+      optr_reg_mask |= FLASH_OPTR_nBOOT0;

+    }

+#endif

+

+    /* Configure the option bytes register */

+    MODIFY_REG(FLASH->OPTR, optr_reg_mask, optr_reg_val);

+

+    /* Set OPTSTRT Bit */

+    SET_BIT(FLASH->CR, FLASH_CR_OPTSTRT);

+

+    /* Wait for last operation to be completed */

+    status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);

+

+    /* If the option byte program operation is completed, disable the OPTSTRT Bit */

+    CLEAR_BIT(FLASH->CR, FLASH_CR_OPTSTRT);

+  }

+

+  return status;

+}

+

+/**

+  * @brief  Configure the Proprietary code readout protection of the desired addresses.

+  *

+  * @note   To configure the PCROP options, the option lock bit OPTLOCK must be

+  *         cleared with the call of the HAL_FLASH_OB_Unlock() function.

+  * @note   To validate the PCROP options, the option bytes must be reloaded

+  *         through the call of the HAL_FLASH_OB_Launch() function.

+  *

+  * @param  PCROPConfig: specifies the configuration (Bank to be configured and PCROP_RDP option).

+  *          This parameter must be a combination of FLASH_BANK_1 or FLASH_BANK_2

+  *          with OB_PCROP_RDP_NOT_ERASE or OB_PCROP_RDP_ERASE

+  *

+  * @param  PCROPStartAddr: specifies the start address of the Proprietary code readout protection

+  *          This parameter can be an address between begin and end of the bank

+  *

+  * @param  PCROPEndAddr: specifies the end address of the Proprietary code readout protection

+  *          This parameter can be an address between PCROPStartAddr and end of the bank

+  *

+  * @retval HAL Status

+  */

+static HAL_StatusTypeDef FLASH_OB_PCROPConfig(uint32_t PCROPConfig, uint32_t PCROPStartAddr, uint32_t PCROPEndAddr)

+{

+  HAL_StatusTypeDef status;

+  uint32_t reg_value;

+  uint32_t bank1_addr;

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+  uint32_t bank2_addr;

+#endif

+

+  /* Check the parameters */

+  assert_param(IS_FLASH_BANK_EXCLUSIVE(PCROPConfig & FLASH_BANK_BOTH));

+  assert_param(IS_OB_PCROP_RDP(PCROPConfig & FLASH_PCROP1ER_PCROP_RDP));

+  assert_param(IS_FLASH_MAIN_MEM_ADDRESS(PCROPStartAddr));

+  assert_param(IS_FLASH_MAIN_MEM_ADDRESS(PCROPEndAddr));

+

+  /* Wait for last operation to be completed */

+  status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);

+

+  if(status == HAL_OK)

+  {

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+    /* Get the information about the bank swapping */

+    if (READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_FB_MODE) == 0U)

+    {

+      bank1_addr = FLASH_BASE;

+      bank2_addr = FLASH_BASE + FLASH_BANK_SIZE;

+    }

+    else

+    {

+      bank1_addr = FLASH_BASE + FLASH_BANK_SIZE;

+      bank2_addr = FLASH_BASE;

+    }

+#else

+    bank1_addr = FLASH_BASE;

+#endif

+

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+    if (READ_BIT(FLASH->OPTR, FLASH_OPTR_DBANK) == 0U)

+    {

+      /* Configure the Proprietary code readout protection */

+      if((PCROPConfig & FLASH_BANK_BOTH) == FLASH_BANK_1)

+      {

+        reg_value = ((PCROPStartAddr - FLASH_BASE) >> 4);

+        MODIFY_REG(FLASH->PCROP1SR, FLASH_PCROP1SR_PCROP1_STRT, reg_value);

+

+        reg_value = ((PCROPEndAddr - FLASH_BASE) >> 4);

+        MODIFY_REG(FLASH->PCROP1ER, FLASH_PCROP1ER_PCROP1_END, reg_value);

+      }

+      else if((PCROPConfig & FLASH_BANK_BOTH) == FLASH_BANK_2)

+      {

+        reg_value = ((PCROPStartAddr - FLASH_BASE) >> 4);

+        MODIFY_REG(FLASH->PCROP2SR, FLASH_PCROP2SR_PCROP2_STRT, reg_value);

+

+        reg_value = ((PCROPEndAddr - FLASH_BASE) >> 4);

+        MODIFY_REG(FLASH->PCROP2ER, FLASH_PCROP2ER_PCROP2_END, reg_value);

+      }

+      else

+      {

+        /* Nothing to do */

+      }

+    }

+    else

+#endif

+    {

+      /* Configure the Proprietary code readout protection */

+      if((PCROPConfig & FLASH_BANK_BOTH) == FLASH_BANK_1)

+      {

+        reg_value = ((PCROPStartAddr - bank1_addr) >> 3);

+        MODIFY_REG(FLASH->PCROP1SR, FLASH_PCROP1SR_PCROP1_STRT, reg_value);

+

+        reg_value = ((PCROPEndAddr - bank1_addr) >> 3);

+        MODIFY_REG(FLASH->PCROP1ER, FLASH_PCROP1ER_PCROP1_END, reg_value);

+      }

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+      else if((PCROPConfig & FLASH_BANK_BOTH) == FLASH_BANK_2)

+      {

+        reg_value = ((PCROPStartAddr - bank2_addr) >> 3);

+        MODIFY_REG(FLASH->PCROP2SR, FLASH_PCROP2SR_PCROP2_STRT, reg_value);

+

+        reg_value = ((PCROPEndAddr - bank2_addr) >> 3);

+        MODIFY_REG(FLASH->PCROP2ER, FLASH_PCROP2ER_PCROP2_END, reg_value);

+      }

+#endif

+      else

+      {

+        /* Nothing to do */

+      }

+    }

+

+    MODIFY_REG(FLASH->PCROP1ER, FLASH_PCROP1ER_PCROP_RDP, (PCROPConfig & FLASH_PCROP1ER_PCROP_RDP));

+

+    /* Set OPTSTRT Bit */

+    SET_BIT(FLASH->CR, FLASH_CR_OPTSTRT);

+

+    /* Wait for last operation to be completed */

+    status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE);

+

+    /* If the option byte program operation is completed, disable the OPTSTRT Bit */

+    CLEAR_BIT(FLASH->CR, FLASH_CR_OPTSTRT);

+  }

+

+  return status;

+}

+

+/**

+  * @brief  Return the FLASH Write Protection Option Bytes value.

+  *

+  * @param[in]  WRPArea: specifies the area to be returned.

+  *          This parameter can be one of the following values:

+  *            @arg OB_WRPAREA_BANK1_AREAA: Flash Bank 1 Area A

+  *            @arg OB_WRPAREA_BANK1_AREAB: Flash Bank 1 Area B

+  *            @arg OB_WRPAREA_BANK2_AREAA: Flash Bank 2 Area A (don't apply to STM32L43x/STM32L44x devices)

+  *            @arg OB_WRPAREA_BANK2_AREAB: Flash Bank 2 Area B (don't apply to STM32L43x/STM32L44x devices)

+  *

+  * @param[out]  WRPStartOffset: specifies the address where to copied the start page

+  *                         of the write protected area

+  *

+  * @param[out]  WRDPEndOffset: specifies the address where to copied the end page of

+  *                        the write protected area

+  *

+  * @retval None

+  */

+static void FLASH_OB_GetWRP(uint32_t WRPArea, uint32_t * WRPStartOffset, uint32_t * WRDPEndOffset)

+{

+  /* Get the configuration of the write protected area */

+  if(WRPArea == OB_WRPAREA_BANK1_AREAA)

+  {

+    *WRPStartOffset = READ_BIT(FLASH->WRP1AR, FLASH_WRP1AR_WRP1A_STRT);

+    *WRDPEndOffset = (READ_BIT(FLASH->WRP1AR, FLASH_WRP1AR_WRP1A_END) >> 16);

+  }

+  else if(WRPArea == OB_WRPAREA_BANK1_AREAB)

+  {

+    *WRPStartOffset = READ_BIT(FLASH->WRP1BR, FLASH_WRP1BR_WRP1B_STRT);

+    *WRDPEndOffset = (READ_BIT(FLASH->WRP1BR, FLASH_WRP1BR_WRP1B_END) >> 16);

+  }

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+  else if(WRPArea == OB_WRPAREA_BANK2_AREAA)

+  {

+    *WRPStartOffset = READ_BIT(FLASH->WRP2AR, FLASH_WRP2AR_WRP2A_STRT);

+    *WRDPEndOffset = (READ_BIT(FLASH->WRP2AR, FLASH_WRP2AR_WRP2A_END) >> 16);

+  }

+  else if(WRPArea == OB_WRPAREA_BANK2_AREAB)

+  {

+    *WRPStartOffset = READ_BIT(FLASH->WRP2BR, FLASH_WRP2BR_WRP2B_STRT);

+    *WRDPEndOffset = (READ_BIT(FLASH->WRP2BR, FLASH_WRP2BR_WRP2B_END) >> 16);

+  }

+#endif

+  else

+  {

+    /* Nothing to do */

+  }

+}

+

+/**

+  * @brief  Return the FLASH Read Protection level.

+  * @retval FLASH ReadOut Protection Status:

+  *         This return value can be one of the following values:

+  *            @arg OB_RDP_LEVEL_0: No protection

+  *            @arg OB_RDP_LEVEL_1: Read protection of the memory

+  *            @arg OB_RDP_LEVEL_2: Full chip protection

+  */

+static uint32_t FLASH_OB_GetRDP(void)

+{

+  uint32_t rdp_level = READ_BIT(FLASH->OPTR, FLASH_OPTR_RDP);

+

+  if ((rdp_level != OB_RDP_LEVEL_0) && (rdp_level != OB_RDP_LEVEL_2))

+  {

+    return (OB_RDP_LEVEL_1);

+  }

+  else

+  {

+    return (READ_BIT(FLASH->OPTR, FLASH_OPTR_RDP));

+  }

+}

+

+/**

+  * @brief  Return the FLASH User Option Byte value.

+  * @retval The FLASH User Option Bytes values:

+  *      For STM32L47x/STM32L48x devices :

+  *         BOR_LEV(Bit8-10), nRST_STOP(Bit12), nRST_STDBY(Bit13), nRST_SHDW(Bit14),

+  *         IWDG_SW(Bit16), IWDG_STOP(Bit17), IWDG_STDBY(Bit18), WWDG_SW(Bit19),

+  *         BFB2(Bit20), DUALBANK(Bit21), nBOOT1(Bit23), SRAM2_PE(Bit24) and SRAM2_RST(Bit25).

+  *      For STM32L43x/STM32L44x devices :

+  *         BOR_LEV(Bit8-10), nRST_STOP(Bit12), nRST_STDBY(Bit13), nRST_SHDW(Bit14),

+  *         IWDG_SW(Bit16), IWDG_STOP(Bit17), IWDG_STDBY(Bit18), WWDG_SW(Bit19),

+  *         nBOOT1(Bit23), SRAM2_PE(Bit24), SRAM2_RST(Bit25), nSWBOOT0(Bit26) and nBOOT0(Bit27).

+  */

+static uint32_t FLASH_OB_GetUser(void)

+{

+  uint32_t user_config = READ_REG(FLASH->OPTR);

+  CLEAR_BIT(user_config, FLASH_OPTR_RDP);

+

+  return user_config;

+}

+

+/**

+  * @brief  Return the FLASH Write Protection Option Bytes value.

+  *

+  * @param PCROPConfig [inout]: specifies the configuration (Bank to be configured and PCROP_RDP option).

+  *          This parameter must be a combination of FLASH_BANK_1 or FLASH_BANK_2

+  *          with OB_PCROP_RDP_NOT_ERASE or OB_PCROP_RDP_ERASE

+  *

+  * @param PCROPStartAddr [out]: specifies the address where to copied the start address

+  *                         of the Proprietary code readout protection

+  *

+  * @param PCROPEndAddr [out]: specifies the address where to copied the end address of

+  *                       the Proprietary code readout protection

+  *

+  * @retval None

+  */

+static void FLASH_OB_GetPCROP(uint32_t * PCROPConfig, uint32_t * PCROPStartAddr, uint32_t * PCROPEndAddr)

+{

+  uint32_t reg_value;

+  uint32_t bank1_addr;

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+  uint32_t bank2_addr;

+#endif

+

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+  /* Get the information about the bank swapping */

+  if (READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_FB_MODE) == 0U)

+  {

+    bank1_addr = FLASH_BASE;

+    bank2_addr = FLASH_BASE + FLASH_BANK_SIZE;

+  }

+  else

+  {

+    bank1_addr = FLASH_BASE + FLASH_BANK_SIZE;

+    bank2_addr = FLASH_BASE;

+  }

+#else

+  bank1_addr = FLASH_BASE;

+#endif

+

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+  if (READ_BIT(FLASH->OPTR, FLASH_OPTR_DBANK) == 0U)

+  {

+    if(((*PCROPConfig) & FLASH_BANK_BOTH) == FLASH_BANK_1)

+    {

+      reg_value       = (READ_REG(FLASH->PCROP1SR) & FLASH_PCROP1SR_PCROP1_STRT);

+      *PCROPStartAddr = (reg_value << 4) + FLASH_BASE;

+

+      reg_value     = (READ_REG(FLASH->PCROP1ER) & FLASH_PCROP1ER_PCROP1_END);

+      *PCROPEndAddr = (reg_value << 4) + FLASH_BASE + 0xFU;

+    }

+    else if(((*PCROPConfig) & FLASH_BANK_BOTH) == FLASH_BANK_2)

+    {

+      reg_value       = (READ_REG(FLASH->PCROP2SR) & FLASH_PCROP2SR_PCROP2_STRT);

+      *PCROPStartAddr = (reg_value << 4) + FLASH_BASE;

+

+      reg_value     = (READ_REG(FLASH->PCROP2ER) & FLASH_PCROP2ER_PCROP2_END);

+      *PCROPEndAddr = (reg_value << 4) + FLASH_BASE + 0xFU;;

+    }

+    else

+    {

+      /* Nothing to do */

+    }

+  }

+  else

+#endif

+  {

+    if(((*PCROPConfig) & FLASH_BANK_BOTH) == FLASH_BANK_1)

+    {

+      reg_value       = (READ_REG(FLASH->PCROP1SR) & FLASH_PCROP1SR_PCROP1_STRT);

+      *PCROPStartAddr = (reg_value << 3) + bank1_addr;

+

+      reg_value     = (READ_REG(FLASH->PCROP1ER) & FLASH_PCROP1ER_PCROP1_END);

+      *PCROPEndAddr = (reg_value << 3) + bank1_addr + 0x7U;

+    }

+#if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \

+    defined (STM32L496xx) || defined (STM32L4A6xx) || \

+    defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+    else if(((*PCROPConfig) & FLASH_BANK_BOTH) == FLASH_BANK_2)

+    {

+      reg_value       = (READ_REG(FLASH->PCROP2SR) & FLASH_PCROP2SR_PCROP2_STRT);

+      *PCROPStartAddr = (reg_value << 3) + bank2_addr;

+

+      reg_value     = (READ_REG(FLASH->PCROP2ER) & FLASH_PCROP2ER_PCROP2_END);

+      *PCROPEndAddr = (reg_value << 3) + bank2_addr + 0x7U;

+    }

+#endif

+    else

+    {

+      /* Nothing to do */

+    }

+  }

+

+  *PCROPConfig |= (READ_REG(FLASH->PCROP1ER) & FLASH_PCROP1ER_PCROP_RDP);

+}

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#endif /* HAL_FLASH_MODULE_ENABLED */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c
new file mode 100644
index 0000000..7d32ef7
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c
@@ -0,0 +1,256 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_flash_ramfunc.c

+  * @author  MCD Application Team

+  * @brief   FLASH RAMFUNC driver.

+  *          This file provides a Flash firmware functions which should be

+  *          executed from internal SRAM

+  *            + FLASH HalfPage Programming

+  *            + FLASH Power Down in Run mode

+  *

+  *  @verbatim

+  ==============================================================================

+                   ##### Flash RAM functions #####

+  ==============================================================================

+

+    *** ARM Compiler ***

+    --------------------

+    [..] RAM functions are defined using the toolchain options.

+         Functions that are executed in RAM should reside in a separate

+         source module. Using the 'Options for File' dialog you can simply change

+         the 'Code / Const' area of a module to a memory space in physical RAM.

+         Available memory areas are declared in the 'Target' tab of the

+         Options for Target' dialog.

+

+    *** ICCARM Compiler ***

+    -----------------------

+    [..] RAM functions are defined using a specific toolchain keyword "__ramfunc".

+

+    *** GNU Compiler ***

+    --------------------

+    [..] RAM functions are defined using a specific toolchain attribute

+         "__attribute__((section(".RamFunc")))".

+

+  @endverbatim

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                       opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup FLASH_RAMFUNC FLASH_RAMFUNC

+  * @brief FLASH functions executed from RAM

+  * @{

+  */

+

+#ifdef HAL_FLASH_MODULE_ENABLED

+

+/* Private typedef -----------------------------------------------------------*/

+/* Private define ------------------------------------------------------------*/

+/* Private macro -------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+extern FLASH_ProcessTypeDef pFlash;

+

+/* Private function prototypes -----------------------------------------------*/

+/* Exported functions -------------------------------------------------------*/

+

+/** @defgroup FLASH_RAMFUNC_Exported_Functions FLASH in RAM function Exported Functions

+  * @{

+  */

+

+/** @defgroup FLASH_RAMFUNC_Exported_Functions_Group1 Peripheral features functions

+ *  @brief   Data transfers functions

+ *

+@verbatim

+ ===============================================================================

+                      ##### ramfunc functions #####

+ ===============================================================================

+    [..]

+    This subsection provides a set of functions that should be executed from RAM.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief   Enable the Power down in Run Mode

+  * @note    This function should be called and executed from SRAM memory

+  * @retval None

+  */

+__RAM_FUNC HAL_FLASHEx_EnableRunPowerDown(void)

+{

+  /* Enable the Power Down in Run mode*/

+  __HAL_FLASH_POWER_DOWN_ENABLE();

+

+  return HAL_OK;

+

+}

+

+/**

+  * @brief   Disable the Power down in Run Mode

+  * @note    This function should be called and executed from SRAM memory

+  * @retval None

+  */

+__RAM_FUNC HAL_FLASHEx_DisableRunPowerDown(void)

+{

+  /* Disable the Power Down in Run mode*/

+  __HAL_FLASH_POWER_DOWN_DISABLE();

+

+  return HAL_OK;

+}

+

+#if defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+/**

+  * @brief  Program the FLASH DBANK User Option Byte.

+  *

+  * @note   To configure the user option bytes, the option lock bit OPTLOCK must

+  *         be cleared with the call of the HAL_FLASH_OB_Unlock() function.

+  * @note   To modify the DBANK option byte, no PCROP region should be defined.

+  *         To deactivate PCROP, user should perform RDP changing

+  *

+  * @param  DBankConfig: The FLASH DBANK User Option Byte value.

+  *          This parameter  can be one of the following values:

+  *            @arg OB_DBANK_128_BITS: Single-bank with 128-bits data

+  *            @arg OB_DBANK_64_BITS: Dual-bank with 64-bits data

+  *

+  * @retval HAL status

+  */

+__RAM_FUNC HAL_FLASHEx_OB_DBankConfig(uint32_t DBankConfig)

+{

+  register uint32_t count, reg;

+  HAL_StatusTypeDef status = HAL_ERROR;

+

+  /* Process Locked */

+  __HAL_LOCK(&pFlash);

+

+  /* Check if the PCROP is disabled */

+  reg = FLASH->PCROP1SR;

+  if (reg > FLASH->PCROP1ER)

+  {

+    reg = FLASH->PCROP2SR;

+    if (reg > FLASH->PCROP2ER)

+    {

+      /* Disable Flash prefetch */

+      __HAL_FLASH_PREFETCH_BUFFER_DISABLE();

+

+      if (READ_BIT(FLASH->ACR, FLASH_ACR_ICEN) != 0U)

+      {

+        /* Disable Flash instruction cache */

+        __HAL_FLASH_INSTRUCTION_CACHE_DISABLE();

+

+        /* Flush Flash instruction cache */

+        __HAL_FLASH_INSTRUCTION_CACHE_RESET();

+      }

+

+      if (READ_BIT(FLASH->ACR, FLASH_ACR_DCEN) != 0U)

+      {

+        /* Disable Flash data cache */

+        __HAL_FLASH_DATA_CACHE_DISABLE();

+

+        /* Flush Flash data cache */

+        __HAL_FLASH_DATA_CACHE_RESET();

+      }

+

+      /* Disable WRP zone 1 of 1st bank if needed */

+      reg = FLASH->WRP1AR;

+      if (((reg & FLASH_WRP1AR_WRP1A_STRT) >> FLASH_WRP1AR_WRP1A_STRT_Pos) <=

+          ((reg & FLASH_WRP1AR_WRP1A_END) >> FLASH_WRP1AR_WRP1A_END_Pos))

+      {

+        MODIFY_REG(FLASH->WRP1AR, (FLASH_WRP1AR_WRP1A_STRT | FLASH_WRP1AR_WRP1A_END), FLASH_WRP1AR_WRP1A_STRT);

+      }

+

+      /* Disable WRP zone 2 of 1st bank if needed */

+      reg = FLASH->WRP1BR;

+      if (((reg & FLASH_WRP1BR_WRP1B_STRT) >> FLASH_WRP1BR_WRP1B_STRT_Pos) <=

+          ((reg & FLASH_WRP1BR_WRP1B_END) >> FLASH_WRP1BR_WRP1B_END_Pos))

+      {

+        MODIFY_REG(FLASH->WRP1BR, (FLASH_WRP1BR_WRP1B_STRT | FLASH_WRP1BR_WRP1B_END), FLASH_WRP1BR_WRP1B_STRT);

+      }

+

+      /* Disable WRP zone 1 of 2nd bank if needed */

+      reg = FLASH->WRP2AR;

+      if (((reg & FLASH_WRP2AR_WRP2A_STRT) >> FLASH_WRP2AR_WRP2A_STRT_Pos) <=

+          ((reg & FLASH_WRP2AR_WRP2A_END) >> FLASH_WRP2AR_WRP2A_END_Pos))

+      {

+        MODIFY_REG(FLASH->WRP2AR, (FLASH_WRP2AR_WRP2A_STRT | FLASH_WRP2AR_WRP2A_END), FLASH_WRP2AR_WRP2A_STRT);

+      }

+

+      /* Disable WRP zone 2 of 2nd bank if needed */

+      reg = FLASH->WRP2BR;

+      if (((reg & FLASH_WRP2BR_WRP2B_STRT) >> FLASH_WRP2BR_WRP2B_STRT_Pos) <=

+          ((reg & FLASH_WRP2BR_WRP2B_END) >> FLASH_WRP2BR_WRP2B_END_Pos))

+      {

+        MODIFY_REG(FLASH->WRP2BR, (FLASH_WRP2BR_WRP2B_STRT | FLASH_WRP2BR_WRP2B_END), FLASH_WRP2BR_WRP2B_STRT);

+      }

+

+      /* Modify the DBANK user option byte */

+      MODIFY_REG(FLASH->OPTR, FLASH_OPTR_DBANK, DBankConfig);

+

+      /* Set OPTSTRT Bit */

+      SET_BIT(FLASH->CR, FLASH_CR_OPTSTRT);

+

+      /* Wait for last operation to be completed */

+      /* 8 is the number of required instruction cycles for the below loop statement (timeout expressed in ms) */

+      count = FLASH_TIMEOUT_VALUE * (SystemCoreClock / 8U / 1000U);

+      do

+      {

+        if (count == 0U)

+        {

+          break;

+        }

+        count--;

+      } while (__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) != RESET);

+

+      /* If the option byte program operation is completed, disable the OPTSTRT Bit */

+      CLEAR_BIT(FLASH->CR, FLASH_CR_OPTSTRT);

+

+      /* Set the bit to force the option byte reloading */

+      SET_BIT(FLASH->CR, FLASH_CR_OBL_LAUNCH);

+    }

+  }

+

+  /* Process Unlocked */

+  __HAL_UNLOCK(&pFlash);

+

+  return status;

+}

+#endif

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+#endif /* HAL_FLASH_MODULE_ENABLED */

+

+

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+

+

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c
new file mode 100644
index 0000000..851121a
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c
@@ -0,0 +1,557 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_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

+  *

+  @verbatim

+  ==============================================================================

+                    ##### GPIO Peripheral features #####

+  ==============================================================================

+  [..]

+    (+) Each port bit of the general-purpose I/O (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.

+

+    (+) The microcontroller IO pins are connected to onboard peripherals/modules through a

+        multiplexer that allows only one peripheral alternate function (AF) connected

+       to an IO pin at a time. In this way, there can be no conflict between peripherals

+       sharing the same IO pin.

+

+    (+) 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 39 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

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup GPIO GPIO

+  * @brief GPIO HAL module driver

+  * @{

+  */

+/** MISRA C:2012 deviation rule has been granted for following rules:

+  * Rule-12.2 - Medium: RHS argument is in interval [0,INF] which is out of

+  * range of the shift operator in following API :

+  * HAL_GPIO_Init

+  * HAL_GPIO_DeInit

+  */

+

+#ifdef HAL_GPIO_MODULE_ENABLED

+

+/* Private typedef -----------------------------------------------------------*/

+/* Private defines -----------------------------------------------------------*/

+/** @defgroup GPIO_Private_Defines GPIO Private Defines

+  * @{

+  */

+#define GPIO_MODE             (0x00000003u)

+#define ANALOG_MODE           (0x00000008u)

+#define EXTI_MODE             (0x10000000u)

+#define GPIO_MODE_IT          (0x00010000u)

+#define GPIO_MODE_EVT         (0x00020000u)

+#define RISING_EDGE           (0x00100000u)

+#define FALLING_EDGE          (0x00200000u)

+#define GPIO_OUTPUT_TYPE      (0x00000010u)

+

+#define GPIO_NUMBER           (16u)

+/**

+  * @}

+  */

+

+/* Private macros ------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/* Private function prototypes -----------------------------------------------*/

+/* Exported functions --------------------------------------------------------*/

+

+/** @defgroup GPIO_Exported_Functions GPIO Exported Functions

+  * @{

+  */

+

+/** @defgroup GPIO_Exported_Functions_Group1 Initialization/de-initialization functions

+ *  @brief    Initialization and Configuration functions

+ *

+@verbatim

+ ===============================================================================

+              ##### Initialization and de-initialization functions #####

+ ===============================================================================

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Initialize the GPIOx peripheral according to the specified parameters in the GPIO_Init.

+  * @param  GPIOx: where x can be (A..H) to select the GPIO peripheral for STM32L4 family

+  * @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 = 0x00u;

+  uint32_t iocurrent;

+  uint32_t temp;

+

+  /* 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));

+  assert_param(IS_GPIO_PULL(GPIO_Init->Pull));

+

+  /* Configure the port pins */

+  while (((GPIO_Init->Pin) >> position) != 0x00u)

+  {

+    /* Get current io position */

+    iocurrent = (GPIO_Init->Pin) & (1uL << position);

+

+    if (iocurrent != 0x00u)

+    {

+      /*--------------------- GPIO Mode Configuration ------------------------*/

+      /* In case of Alternate function mode selection */

+      if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD))

+      {

+        /* Check the Alternate function parameters */

+        assert_param(IS_GPIO_AF_INSTANCE(GPIOx));

+        assert_param(IS_GPIO_AF(GPIO_Init->Alternate));

+

+        /* Configure Alternate function mapped with the current IO */

+        temp = GPIOx->AFR[position >> 3u];

+        temp &= ~(0xFu << ((position & 0x07u) * 4u));

+        temp |= ((GPIO_Init->Alternate) << ((position & 0x07u) * 4u));

+        GPIOx->AFR[position >> 3u] = temp;

+      }

+

+      /* Configure IO Direction mode (Input, Output, Alternate or Analog) */

+      temp = GPIOx->MODER;

+      temp &= ~(GPIO_MODER_MODE0 << (position * 2u));

+      temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2u));

+      GPIOx->MODER = temp;

+

+      /* In case of Output or Alternate function mode selection */

+      if((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) ||

+         (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD))

+      {

+        /* Check the Speed parameter */

+        assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));

+        /* Configure the IO Speed */

+        temp = GPIOx->OSPEEDR;

+        temp &= ~(GPIO_OSPEEDR_OSPEED0 << (position * 2u));

+        temp |= (GPIO_Init->Speed << (position * 2u));

+        GPIOx->OSPEEDR = temp;

+

+        /* Configure the IO Output Type */

+        temp = GPIOx->OTYPER;

+        temp &= ~(GPIO_OTYPER_OT0 << position) ;

+        temp |= (((GPIO_Init->Mode & GPIO_OUTPUT_TYPE) >> 4u) << position);

+        GPIOx->OTYPER = temp;

+      }

+

+#if defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx)

+

+      /* In case of Analog mode, check if ADC control mode is selected */

+      if((GPIO_Init->Mode & GPIO_MODE_ANALOG) == GPIO_MODE_ANALOG)

+      {

+        /* Configure the IO Output Type */

+        temp = GPIOx->ASCR;

+        temp &= ~(GPIO_ASCR_ASC0 << position) ;

+        temp |= (((GPIO_Init->Mode & ANALOG_MODE) >> 3) << position);

+        GPIOx->ASCR = temp;

+      }

+

+#endif /* STM32L471xx || STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx */

+

+      /* Activate the Pull-up or Pull down resistor for the current IO */

+      temp = GPIOx->PUPDR;

+      temp &= ~(GPIO_PUPDR_PUPD0 << (position * 2u));

+      temp |= ((GPIO_Init->Pull) << (position * 2u));

+      GPIOx->PUPDR = temp;

+

+      /*--------------------- EXTI Mode Configuration ------------------------*/

+      /* Configure the External Interrupt or event for the current IO */

+      if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE)

+      {

+        /* Enable SYSCFG Clock */

+        __HAL_RCC_SYSCFG_CLK_ENABLE();

+

+        temp = SYSCFG->EXTICR[position >> 2u];

+        temp &= ~(0x0FuL << (4u * (position & 0x03u)));

+        temp |= (GPIO_GET_INDEX(GPIOx) << (4u * (position & 0x03u)));

+        SYSCFG->EXTICR[position >> 2u] = temp;

+

+        /* Clear EXTI line configuration */

+        temp = EXTI->IMR1;

+        temp &= ~(iocurrent);

+        if((GPIO_Init->Mode & GPIO_MODE_IT) == GPIO_MODE_IT)

+        {

+          temp |= iocurrent;

+        }

+        EXTI->IMR1 = temp;

+

+        temp = EXTI->EMR1;

+        temp &= ~(iocurrent);

+        if((GPIO_Init->Mode & GPIO_MODE_EVT) == GPIO_MODE_EVT)

+        {

+          temp |= iocurrent;

+        }

+        EXTI->EMR1 = temp;

+

+        /* Clear Rising Falling edge configuration */

+        temp = EXTI->RTSR1;

+        temp &= ~(iocurrent);

+        if((GPIO_Init->Mode & RISING_EDGE) == RISING_EDGE)

+        {

+          temp |= iocurrent;

+        }

+        EXTI->RTSR1 = temp;

+

+        temp = EXTI->FTSR1;

+        temp &= ~(iocurrent);

+        if((GPIO_Init->Mode & FALLING_EDGE) == FALLING_EDGE)

+        {

+          temp |= iocurrent;

+        }

+        EXTI->FTSR1 = temp;

+      }

+    }

+

+    position++;

+  }

+}

+

+/**

+  * @brief  De-initialize the GPIOx peripheral registers to their default reset values.

+  * @param  GPIOx: where x can be (A..H) to select the GPIO peripheral for STM32L4 family

+  * @param  GPIO_Pin: specifies the port bit to be written.

+  *         This parameter can be any combination 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 = 0x00u;

+  uint32_t iocurrent;

+  uint32_t tmp;

+

+  /* Check the parameters */

+  assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));

+  assert_param(IS_GPIO_PIN(GPIO_Pin));

+

+  /* Configure the port pins */

+  while ((GPIO_Pin >> position) != 0x00u)

+  {

+    /* Get current io position */

+    iocurrent = (GPIO_Pin) & (1uL << position);

+

+    if (iocurrent != 0x00u)

+    {

+      /*------------------------- EXTI Mode Configuration --------------------*/

+      /* Clear the External Interrupt or Event for the current IO */

+

+      tmp = SYSCFG->EXTICR[position >> 2u];

+      tmp &= (0x0FuL << (4u * (position & 0x03u)));

+      if (tmp == (GPIO_GET_INDEX(GPIOx) << (4u * (position & 0x03u))))

+      {

+        /* Clear EXTI line configuration */

+        EXTI->IMR1 &= ~(iocurrent);

+        EXTI->EMR1 &= ~(iocurrent);

+

+        /* Clear Rising Falling edge configuration */

+        EXTI->RTSR1 &= ~(iocurrent);

+        EXTI->FTSR1 &= ~(iocurrent);

+

+        tmp = 0x0FuL << (4u * (position & 0x03u));

+        SYSCFG->EXTICR[position >> 2u] &= ~tmp;

+      }

+

+      /*------------------------- GPIO Mode Configuration --------------------*/

+      /* Configure IO in Analog Mode */

+      GPIOx->MODER |= (GPIO_MODER_MODE0 << (position * 2u));

+

+      /* Configure the default Alternate Function in current IO */

+      GPIOx->AFR[position >> 3u] &= ~(0xFu << ((position & 0x07u) * 4u)) ;

+

+      /* Configure the default value for IO Speed */

+      GPIOx->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEED0 << (position * 2u));

+

+      /* Configure the default value IO Output Type */

+      GPIOx->OTYPER  &= ~(GPIO_OTYPER_OT0 << position) ;

+

+      /* Deactivate the Pull-up and Pull-down resistor for the current IO */

+      GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPD0 << (position * 2u));

+

+#if defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx)

+      /* Deactivate the Control bit of Analog mode for the current IO */

+      GPIOx->ASCR &= ~(GPIO_ASCR_ASC0<< position);

+#endif /* STM32L471xx || STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx */

+    }

+

+    position++;

+  }

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup GPIO_Exported_Functions_Group2 IO operation functions

+ *  @brief GPIO Read, Write, Toggle, Lock and EXTI management functions.

+ *

+@verbatim

+ ===============================================================================

+                       ##### IO operation functions #####

+ ===============================================================================

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Read the specified input port pin.

+  * @param  GPIOx: where x can be (A..H) to select the GPIO peripheral for STM32L4 family

+  * @param  GPIO_Pin: specifies the port bit to read.

+  *         This parameter can be any combination of 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) != 0x00u)

+  {

+    bitstatus = GPIO_PIN_SET;

+  }

+  else

+  {

+    bitstatus = GPIO_PIN_RESET;

+  }

+  return bitstatus;

+}

+

+/**

+  * @brief  Set or clear the selected data port bit.

+  *

+  * @note   This function uses GPIOx_BSRR and GPIOx_BRR registers 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..H) to select the GPIO peripheral for STM32L4 family

+  * @param  GPIO_Pin specifies the port bit to be written.

+  *         This parameter can be any combination 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 = (uint32_t)GPIO_Pin;

+  }

+  else

+  {

+    GPIOx->BRR = (uint32_t)GPIO_Pin;

+  }

+}

+

+/**

+  * @brief  Toggle the specified GPIO pin.

+  * @param  GPIOx where x can be (A..H) to select the GPIO peripheral for STM32L4 family

+  * @param  GPIO_Pin specifies the pin to be toggled.

+  * @retval None

+  */

+void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

+{

+  /* Check the parameters */

+  assert_param(IS_GPIO_PIN(GPIO_Pin));

+

+  if ((GPIOx->ODR & GPIO_Pin) != 0x00u)

+  {

+    GPIOx->BRR = (uint32_t)GPIO_Pin;

+  }

+  else

+  {

+    GPIOx->BSRR = (uint32_t)GPIO_Pin;

+  }

+}

+

+/**

+* @brief  Lock 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..H) to select the GPIO peripheral for STM32L4 family

+  * @param  GPIO_Pin specifies the port bits 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_LOCK_INSTANCE(GPIOx));

+  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 LCKK 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) != 0x00u)

+  {

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_ERROR;

+  }

+}

+

+/**

+  * @brief  Handle EXTI interrupt request.

+  * @param  GPIO_Pin Specifies the port pin connected to corresponding 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) != 0x00u)

+  {

+    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);

+    HAL_GPIO_EXTI_Callback(GPIO_Pin);

+  }

+}

+

+/**

+  * @brief  EXTI line detection callback.

+  * @param  GPIO_Pin: Specifies the port pin connected to corresponding 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 */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c
new file mode 100644
index 0000000..75be2ea
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c
@@ -0,0 +1,6502 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_i2c.c

+  * @author  MCD Application Team

+  * @brief   I2C HAL module driver.

+  *          This file provides firmware functions to manage the following

+  *          functionalities of the Inter Integrated Circuit (I2C) peripheral:

+  *           + Initialization and de-initialization functions

+  *           + IO operation functions

+  *           + Peripheral State and Errors functions

+  *

+  @verbatim

+  ==============================================================================

+                        ##### How to use this driver #####

+  ==============================================================================

+    [..]

+    The I2C HAL driver can be used as follows:

+

+    (#) Declare a I2C_HandleTypeDef handle structure, for example:

+        I2C_HandleTypeDef  hi2c;

+

+    (#)Initialize the I2C low level resources by implementing the @ref HAL_I2C_MspInit() API:

+        (##) Enable the I2Cx interface clock

+        (##) I2C pins configuration

+            (+++) Enable the clock for the I2C GPIOs

+            (+++) Configure I2C pins as alternate function open-drain

+        (##) NVIC configuration if you need to use interrupt process

+            (+++) Configure the I2Cx interrupt priority

+            (+++) Enable the NVIC I2C IRQ Channel

+        (##) DMA Configuration if you need to use DMA process

+            (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive channel

+            (+++) Enable the DMAx interface clock using

+            (+++) Configure the DMA handle parameters

+            (+++) Configure the DMA Tx or Rx channel

+            (+++) Associate the initialized DMA handle to the hi2c DMA Tx or Rx handle

+            (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on

+                  the DMA Tx or Rx channel

+

+    (#) Configure the Communication Clock Timing, Own Address1, Master Addressing mode, Dual Addressing mode,

+        Own Address2, Own Address2 Mask, General call and Nostretch mode in the hi2c Init structure.

+

+    (#) Initialize the I2C registers by calling the @ref HAL_I2C_Init(), configures also the low level Hardware

+        (GPIO, CLOCK, NVIC...etc) by calling the customized @ref HAL_I2C_MspInit(&hi2c) API.

+

+    (#) To check if target device is ready for communication, use the function @ref HAL_I2C_IsDeviceReady()

+

+    (#) For I2C IO and IO MEM operations, three operation modes are available within this driver :

+

+    *** Polling mode IO operation ***

+    =================================

+    [..]

+      (+) Transmit in master mode an amount of data in blocking mode using @ref HAL_I2C_Master_Transmit()

+      (+) Receive in master mode an amount of data in blocking mode using @ref HAL_I2C_Master_Receive()

+      (+) Transmit in slave mode an amount of data in blocking mode using @ref HAL_I2C_Slave_Transmit()

+      (+) Receive in slave mode an amount of data in blocking mode using @ref HAL_I2C_Slave_Receive()

+

+    *** Polling mode IO MEM operation ***

+    =====================================

+    [..]

+      (+) Write an amount of data in blocking mode to a specific memory address using @ref HAL_I2C_Mem_Write()

+      (+) Read an amount of data in blocking mode from a specific memory address using @ref HAL_I2C_Mem_Read()

+

+

+    *** Interrupt mode IO operation ***

+    ===================================

+    [..]

+      (+) Transmit in master mode an amount of data in non-blocking mode using @ref HAL_I2C_Master_Transmit_IT()

+      (+) At transmission end of transfer, @ref HAL_I2C_MasterTxCpltCallback() is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_MasterTxCpltCallback()

+      (+) Receive in master mode an amount of data in non-blocking mode using @ref HAL_I2C_Master_Receive_IT()

+      (+) At reception end of transfer, @ref HAL_I2C_MasterRxCpltCallback() is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_MasterRxCpltCallback()

+      (+) Transmit in slave mode an amount of data in non-blocking mode using @ref HAL_I2C_Slave_Transmit_IT()

+      (+) At transmission end of transfer, @ref HAL_I2C_SlaveTxCpltCallback() is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_SlaveTxCpltCallback()

+      (+) Receive in slave mode an amount of data in non-blocking mode using @ref HAL_I2C_Slave_Receive_IT()

+      (+) At reception end of transfer, @ref HAL_I2C_SlaveRxCpltCallback() is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_SlaveRxCpltCallback()

+      (+) In case of transfer Error, @ref HAL_I2C_ErrorCallback() function is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_ErrorCallback()

+      (+) Abort a master I2C process communication with Interrupt using @ref HAL_I2C_Master_Abort_IT()

+      (+) End of abort process, @ref HAL_I2C_AbortCpltCallback() is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_AbortCpltCallback()

+      (+) Discard a slave I2C process communication using @ref __HAL_I2C_GENERATE_NACK() macro.

+           This action will inform Master to generate a Stop condition to discard the communication.

+

+

+    *** Interrupt mode or DMA mode IO sequential operation ***

+    ==========================================================

+    [..]

+      (@) These interfaces allow to manage a sequential transfer with a repeated start condition

+          when a direction change during transfer

+    [..]

+      (+) A specific option field manage the different steps of a sequential transfer

+      (+) Option field values are defined through @ref I2C_XFEROPTIONS and are listed below:

+      (++) I2C_FIRST_AND_LAST_FRAME: No sequential usage, functionnal is same as associated interfaces in no sequential mode

+      (++) I2C_FIRST_FRAME: Sequential usage, this option allow to manage a sequence with start condition, address

+                            and data to transfer without a final stop condition

+      (++) I2C_FIRST_AND_NEXT_FRAME: Sequential usage (Master only), this option allow to manage a sequence with start condition, address

+                            and data to transfer without a final stop condition, an then permit a call the same master sequential interface

+                            several times (like @ref HAL_I2C_Master_Seq_Transmit_IT() then @ref HAL_I2C_Master_Seq_Transmit_IT()

+                            or @ref HAL_I2C_Master_Seq_Transmit_DMA() then @ref HAL_I2C_Master_Seq_Transmit_DMA())

+      (++) I2C_NEXT_FRAME: Sequential usage, this option allow to manage a sequence with a restart condition, address

+                            and with new data to transfer if the direction change or manage only the new data to transfer

+                            if no direction change and without a final stop condition in both cases

+      (++) I2C_LAST_FRAME: Sequential usage, this option allow to manage a sequance with a restart condition, address

+                            and with new data to transfer if the direction change or manage only the new data to transfer

+                            if no direction change and with a final stop condition in both cases

+      (++) I2C_LAST_FRAME_NO_STOP: Sequential usage (Master only), this option allow to manage a restart condition after several call of the same master sequential

+                            interface several times (link with option I2C_FIRST_AND_NEXT_FRAME).

+                            Usage can, transfer several bytes one by one using HAL_I2C_Master_Seq_Transmit_IT(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME)

+                              or HAL_I2C_Master_Seq_Receive_IT(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME)

+                              or HAL_I2C_Master_Seq_Transmit_DMA(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME)

+                              or HAL_I2C_Master_Seq_Receive_DMA(option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME).

+                            Then usage of this option I2C_LAST_FRAME_NO_STOP at the last Transmit or Receive sequence permit to call the oposite interface Receive or Transmit

+                              without stopping the communication and so generate a restart condition.

+      (++) I2C_OTHER_FRAME: Sequential usage (Master only), this option allow to manage a restart condition after each call of the same master sequential

+                            interface.

+                            Usage can, transfer several bytes one by one with a restart with slave address between each bytes using HAL_I2C_Master_Seq_Transmit_IT(option I2C_FIRST_FRAME then I2C_OTHER_FRAME)

+                              or HAL_I2C_Master_Seq_Receive_IT(option I2C_FIRST_FRAME then I2C_OTHER_FRAME)

+                              or HAL_I2C_Master_Seq_Transmit_DMA(option I2C_FIRST_FRAME then I2C_OTHER_FRAME)

+                              or HAL_I2C_Master_Seq_Receive_DMA(option I2C_FIRST_FRAME then I2C_OTHER_FRAME).

+                            Then usage of this option I2C_OTHER_AND_LAST_FRAME at the last frame to help automatic generation of STOP condition.

+

+      (+) Differents sequential I2C interfaces are listed below:

+      (++) Sequential transmit in master I2C mode an amount of data in non-blocking mode using @ref HAL_I2C_Master_Seq_Transmit_IT()

+            or using @ref HAL_I2C_Master_Seq_Transmit_DMA()

+      (+++) At transmission end of current frame transfer, @ref HAL_I2C_MasterTxCpltCallback() is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_MasterTxCpltCallback()

+      (++) Sequential receive in master I2C mode an amount of data in non-blocking mode using @ref HAL_I2C_Master_Seq_Receive_IT()

+            or using @ref HAL_I2C_Master_Seq_Receive_DMA()

+      (+++) At reception end of current frame transfer, @ref HAL_I2C_MasterRxCpltCallback() is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_MasterRxCpltCallback()

+      (++) Abort a master IT or DMA I2C process communication with Interrupt using @ref HAL_I2C_Master_Abort_IT()

+      (+++) End of abort process, @ref HAL_I2C_AbortCpltCallback() is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_AbortCpltCallback()

+      (++) Enable/disable the Address listen mode in slave I2C mode using @ref HAL_I2C_EnableListen_IT() @ref HAL_I2C_DisableListen_IT()

+      (+++) When address slave I2C match, @ref HAL_I2C_AddrCallback() is executed and user can

+           add his own code to check the Address Match Code and the transmission direction request by master (Write/Read).

+      (+++) At Listen mode end @ref HAL_I2C_ListenCpltCallback() is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_ListenCpltCallback()

+      (++) Sequential transmit in slave I2C mode an amount of data in non-blocking mode using @ref HAL_I2C_Slave_Seq_Transmit_IT()

+            or using @ref HAL_I2C_Slave_Seq_Transmit_DMA()

+      (+++) At transmission end of current frame transfer, @ref HAL_I2C_SlaveTxCpltCallback() is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_SlaveTxCpltCallback()

+      (++) Sequential receive in slave I2C mode an amount of data in non-blocking mode using @ref HAL_I2C_Slave_Seq_Receive_IT()

+            or using @ref HAL_I2C_Slave_Seq_Receive_DMA()

+      (+++) At reception end of current frame transfer, @ref HAL_I2C_SlaveRxCpltCallback() is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_SlaveRxCpltCallback()

+      (++) In case of transfer Error, @ref HAL_I2C_ErrorCallback() function is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_ErrorCallback()

+      (++) Discard a slave I2C process communication using @ref __HAL_I2C_GENERATE_NACK() macro.

+           This action will inform Master to generate a Stop condition to discard the communication.

+

+    *** Interrupt mode IO MEM operation ***

+    =======================================

+    [..]

+      (+) Write an amount of data in non-blocking mode with Interrupt to a specific memory address using

+          @ref HAL_I2C_Mem_Write_IT()

+      (+) At Memory end of write transfer, @ref HAL_I2C_MemTxCpltCallback() is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_MemTxCpltCallback()

+      (+) Read an amount of data in non-blocking mode with Interrupt from a specific memory address using

+          @ref HAL_I2C_Mem_Read_IT()

+      (+) At Memory end of read transfer, @ref HAL_I2C_MemRxCpltCallback() is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_MemRxCpltCallback()

+      (+) In case of transfer Error, @ref HAL_I2C_ErrorCallback() function is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_ErrorCallback()

+

+    *** DMA mode IO operation ***

+    ==============================

+    [..]

+      (+) Transmit in master mode an amount of data in non-blocking mode (DMA) using

+          @ref HAL_I2C_Master_Transmit_DMA()

+      (+) At transmission end of transfer, @ref HAL_I2C_MasterTxCpltCallback() is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_MasterTxCpltCallback()

+      (+) Receive in master mode an amount of data in non-blocking mode (DMA) using

+          @ref HAL_I2C_Master_Receive_DMA()

+      (+) At reception end of transfer, @ref HAL_I2C_MasterRxCpltCallback() is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_MasterRxCpltCallback()

+      (+) Transmit in slave mode an amount of data in non-blocking mode (DMA) using

+          @ref HAL_I2C_Slave_Transmit_DMA()

+      (+) At transmission end of transfer, @ref HAL_I2C_SlaveTxCpltCallback() is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_SlaveTxCpltCallback()

+      (+) Receive in slave mode an amount of data in non-blocking mode (DMA) using

+          @ref HAL_I2C_Slave_Receive_DMA()

+      (+) At reception end of transfer, @ref HAL_I2C_SlaveRxCpltCallback() is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_SlaveRxCpltCallback()

+      (+) In case of transfer Error, @ref HAL_I2C_ErrorCallback() function is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_ErrorCallback()

+      (+) Abort a master I2C process communication with Interrupt using @ref HAL_I2C_Master_Abort_IT()

+      (+) End of abort process, @ref HAL_I2C_AbortCpltCallback() is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_AbortCpltCallback()

+      (+) Discard a slave I2C process communication using @ref __HAL_I2C_GENERATE_NACK() macro.

+           This action will inform Master to generate a Stop condition to discard the communication.

+

+    *** DMA mode IO MEM operation ***

+    =================================

+    [..]

+      (+) Write an amount of data in non-blocking mode with DMA to a specific memory address using

+          @ref HAL_I2C_Mem_Write_DMA()

+      (+) At Memory end of write transfer, @ref HAL_I2C_MemTxCpltCallback() is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_MemTxCpltCallback()

+      (+) Read an amount of data in non-blocking mode with DMA from a specific memory address using

+          @ref HAL_I2C_Mem_Read_DMA()

+      (+) At Memory end of read transfer, @ref HAL_I2C_MemRxCpltCallback() is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_MemRxCpltCallback()

+      (+) In case of transfer Error, @ref HAL_I2C_ErrorCallback() function is executed and user can

+           add his own code by customization of function pointer @ref HAL_I2C_ErrorCallback()

+

+

+     *** I2C HAL driver macros list ***

+     ==================================

+     [..]

+       Below the list of most used macros in I2C HAL driver.

+

+      (+) @ref __HAL_I2C_ENABLE: Enable the I2C peripheral

+      (+) @ref __HAL_I2C_DISABLE: Disable the I2C peripheral

+      (+) @ref __HAL_I2C_GENERATE_NACK: Generate a Non-Acknowledge I2C peripheral in Slave mode

+      (+) @ref __HAL_I2C_GET_FLAG: Check whether the specified I2C flag is set or not

+      (+) @ref __HAL_I2C_CLEAR_FLAG: Clear the specified I2C pending flag

+      (+) @ref __HAL_I2C_ENABLE_IT: Enable the specified I2C interrupt

+      (+) @ref __HAL_I2C_DISABLE_IT: Disable the specified I2C interrupt

+

+     *** Callback registration ***

+     =============================================

+    [..]

+     The compilation flag USE_HAL_I2C_REGISTER_CALLBACKS when set to 1

+     allows the user to configure dynamically the driver callbacks.

+     Use Functions @ref HAL_I2C_RegisterCallback() or @ref HAL_I2C_RegisterAddrCallback()

+     to register an interrupt callback.

+    [..]

+     Function @ref HAL_I2C_RegisterCallback() allows to register following callbacks:

+       (+) MasterTxCpltCallback : callback for Master transmission end of transfer.

+       (+) MasterRxCpltCallback : callback for Master reception end of transfer.

+       (+) SlaveTxCpltCallback  : callback for Slave transmission end of transfer.

+       (+) SlaveRxCpltCallback  : callback for Slave reception end of transfer.

+       (+) ListenCpltCallback   : callback for end of listen mode.

+       (+) MemTxCpltCallback    : callback for Memory transmission end of transfer.

+       (+) MemRxCpltCallback    : callback for Memory reception end of transfer.

+       (+) ErrorCallback        : callback for error detection.

+       (+) AbortCpltCallback    : callback for abort completion process.

+       (+) MspInitCallback      : callback for Msp Init.

+       (+) MspDeInitCallback    : callback for Msp DeInit.

+     This function takes as parameters the HAL peripheral handle, the Callback ID

+     and a pointer to the user callback function.

+    [..]

+     For specific callback AddrCallback use dedicated register callbacks : @ref HAL_I2C_RegisterAddrCallback().

+    [..]

+     Use function @ref HAL_I2C_UnRegisterCallback to reset a callback to the default

+     weak function.

+     @ref HAL_I2C_UnRegisterCallback takes as parameters the HAL peripheral handle,

+     and the Callback ID.

+     This function allows to reset following callbacks:

+       (+) MasterTxCpltCallback : callback for Master transmission end of transfer.

+       (+) MasterRxCpltCallback : callback for Master reception end of transfer.

+       (+) SlaveTxCpltCallback  : callback for Slave transmission end of transfer.

+       (+) SlaveRxCpltCallback  : callback for Slave reception end of transfer.

+       (+) ListenCpltCallback   : callback for end of listen mode.

+       (+) MemTxCpltCallback    : callback for Memory transmission end of transfer.

+       (+) MemRxCpltCallback    : callback for Memory reception end of transfer.

+       (+) ErrorCallback        : callback for error detection.

+       (+) AbortCpltCallback    : callback for abort completion process.

+       (+) MspInitCallback      : callback for Msp Init.

+       (+) MspDeInitCallback    : callback for Msp DeInit.

+    [..]

+     For callback AddrCallback use dedicated register callbacks : @ref HAL_I2C_UnRegisterAddrCallback().

+    [..]

+     By default, after the @ref HAL_I2C_Init() and when the state is @ref HAL_I2C_STATE_RESET

+     all callbacks are set to the corresponding weak functions:

+     examples @ref HAL_I2C_MasterTxCpltCallback(), @ref HAL_I2C_MasterRxCpltCallback().

+     Exception done for MspInit and MspDeInit functions that are

+     reset to the legacy weak functions in the @ref HAL_I2C_Init()/ @ref HAL_I2C_DeInit() only when

+     these callbacks are null (not registered beforehand).

+     If MspInit or MspDeInit are not null, the @ref HAL_I2C_Init()/ @ref HAL_I2C_DeInit()

+     keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state.

+    [..]

+     Callbacks can be registered/unregistered in @ref HAL_I2C_STATE_READY state only.

+     Exception done MspInit/MspDeInit functions that can be registered/unregistered

+     in @ref HAL_I2C_STATE_READY or @ref HAL_I2C_STATE_RESET state,

+     thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit.

+     Then, the user first registers the MspInit/MspDeInit user callbacks

+     using @ref HAL_I2C_RegisterCallback() before calling @ref HAL_I2C_DeInit()

+     or @ref HAL_I2C_Init() function.

+    [..]

+     When the compilation flag USE_HAL_I2C_REGISTER_CALLBACKS is set to 0 or

+     not defined, the callback registration feature is not available and all callbacks

+     are set to the corresponding weak functions.

+

+     [..]

+       (@) You can refer to the I2C HAL driver header file for more useful macros

+

+  @endverbatim

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup I2C I2C

+  * @brief I2C HAL module driver

+  * @{

+  */

+

+#ifdef HAL_I2C_MODULE_ENABLED

+

+/* Private typedef -----------------------------------------------------------*/

+/* Private define ------------------------------------------------------------*/

+

+/** @defgroup I2C_Private_Define I2C Private Define

+  * @{

+  */

+#define TIMING_CLEAR_MASK   (0xF0FFFFFFU)  /*!< I2C TIMING clear register Mask */

+#define I2C_TIMEOUT_ADDR    (10000U)       /*!< 10 s  */

+#define I2C_TIMEOUT_BUSY    (25U)          /*!< 25 ms */

+#define I2C_TIMEOUT_DIR     (25U)          /*!< 25 ms */

+#define I2C_TIMEOUT_RXNE    (25U)          /*!< 25 ms */

+#define I2C_TIMEOUT_STOPF   (25U)          /*!< 25 ms */

+#define I2C_TIMEOUT_TC      (25U)          /*!< 25 ms */

+#define I2C_TIMEOUT_TCR     (25U)          /*!< 25 ms */

+#define I2C_TIMEOUT_TXIS    (25U)          /*!< 25 ms */

+#define I2C_TIMEOUT_FLAG    (25U)          /*!< 25 ms */

+

+#define MAX_NBYTE_SIZE      255U

+#define SlaveAddr_SHIFT     7U

+#define SlaveAddr_MSK       0x06U

+

+/* Private define for @ref PreviousState usage */

+#define I2C_STATE_MSK             ((uint32_t)((uint32_t)((uint32_t)HAL_I2C_STATE_BUSY_TX | (uint32_t)HAL_I2C_STATE_BUSY_RX) & (uint32_t)(~((uint32_t)HAL_I2C_STATE_READY)))) /*!< Mask State define, keep only RX and TX bits            */

+#define I2C_STATE_NONE            ((uint32_t)(HAL_I2C_MODE_NONE))                                                        /*!< Default Value                                          */

+#define I2C_STATE_MASTER_BUSY_TX  ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_MASTER))            /*!< Master Busy TX, combinaison of State LSB and Mode enum */

+#define I2C_STATE_MASTER_BUSY_RX  ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_MASTER))            /*!< Master Busy RX, combinaison of State LSB and Mode enum */

+#define I2C_STATE_SLAVE_BUSY_TX   ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_SLAVE))             /*!< Slave Busy TX, combinaison of State LSB and Mode enum  */

+#define I2C_STATE_SLAVE_BUSY_RX   ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_SLAVE))             /*!< Slave Busy RX, combinaison of State LSB and Mode enum  */

+#define I2C_STATE_MEM_BUSY_TX     ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_MEM))               /*!< Memory Busy TX, combinaison of State LSB and Mode enum */

+#define I2C_STATE_MEM_BUSY_RX     ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | (uint32_t)HAL_I2C_MODE_MEM))               /*!< Memory Busy RX, combinaison of State LSB and Mode enum */

+

+

+/* Private define to centralize the enable/disable of Interrupts */

+#define I2C_XFER_TX_IT          (0x00000001U)

+#define I2C_XFER_RX_IT          (0x00000002U)

+#define I2C_XFER_LISTEN_IT      (0x00000004U)

+

+#define I2C_XFER_ERROR_IT       (0x00000011U)

+#define I2C_XFER_CPLT_IT        (0x00000012U)

+#define I2C_XFER_RELOAD_IT      (0x00000012U)

+

+/* Private define Sequential Transfer Options default/reset value */

+#define I2C_NO_OPTION_FRAME     (0xFFFF0000U)

+/**

+  * @}

+  */

+

+/* Private macro -------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/* Private function prototypes -----------------------------------------------*/

+

+/** @defgroup I2C_Private_Functions I2C Private Functions

+  * @{

+  */

+/* Private functions to handle DMA transfer */

+static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma);

+static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma);

+static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma);

+static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma);

+static void I2C_DMAError(DMA_HandleTypeDef *hdma);

+static void I2C_DMAAbort(DMA_HandleTypeDef *hdma);

+

+/* Private functions to handle IT transfer */

+static void I2C_ITAddrCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags);

+static void I2C_ITMasterSeqCplt(I2C_HandleTypeDef *hi2c);

+static void I2C_ITSlaveSeqCplt(I2C_HandleTypeDef *hi2c);

+static void I2C_ITMasterCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags);

+static void I2C_ITSlaveCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags);

+static void I2C_ITListenCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags);

+static void I2C_ITError(I2C_HandleTypeDef *hi2c, uint32_t ErrorCode);

+

+/* Private functions to handle IT transfer */

+static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart);

+static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart);

+

+/* Private functions for I2C transfer IRQ handler */

+static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources);

+static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources);

+static HAL_StatusTypeDef I2C_Master_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources);

+static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources);

+

+/* Private functions to handle flags during polling transfer */

+static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart);

+static HAL_StatusTypeDef I2C_WaitOnTXISFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart);

+static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart);

+static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart);

+static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart);

+

+/* Private functions to centralize the enable/disable of Interrupts */

+static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest);

+static void I2C_Disable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest);

+

+/* Private function to flush TXDR register */

+static void I2C_Flush_TXDR(I2C_HandleTypeDef *hi2c);

+

+/* Private function to handle  start, restart or stop a transfer */

+static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request);

+

+/* Private function to Convert Specific options */

+static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c);

+/**

+  * @}

+  */

+

+/* Exported functions --------------------------------------------------------*/

+

+/** @defgroup I2C_Exported_Functions I2C Exported Functions

+  * @{

+  */

+

+/** @defgroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions

+ *  @brief    Initialization and Configuration functions

+ *

+@verbatim

+ ===============================================================================

+              ##### Initialization and de-initialization functions #####

+ ===============================================================================

+    [..]  This subsection provides a set of functions allowing to initialize and

+          deinitialize the I2Cx peripheral:

+

+      (+) User must Implement HAL_I2C_MspInit() function in which he configures

+          all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ).

+

+      (+) Call the function HAL_I2C_Init() to configure the selected device with

+          the selected configuration:

+        (++) Clock Timing

+        (++) Own Address 1

+        (++) Addressing mode (Master, Slave)

+        (++) Dual Addressing mode

+        (++) Own Address 2

+        (++) Own Address 2 Mask

+        (++) General call mode

+        (++) Nostretch mode

+

+      (+) Call the function HAL_I2C_DeInit() to restore the default configuration

+          of the selected I2Cx peripheral.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Initializes the I2C according to the specified parameters

+  *         in the I2C_InitTypeDef and initialize the associated handle.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c)

+{

+  /* Check the I2C handle allocation */

+  if (hi2c == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check the parameters */

+  assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));

+  assert_param(IS_I2C_OWN_ADDRESS1(hi2c->Init.OwnAddress1));

+  assert_param(IS_I2C_ADDRESSING_MODE(hi2c->Init.AddressingMode));

+  assert_param(IS_I2C_DUAL_ADDRESS(hi2c->Init.DualAddressMode));

+  assert_param(IS_I2C_OWN_ADDRESS2(hi2c->Init.OwnAddress2));

+  assert_param(IS_I2C_OWN_ADDRESS2_MASK(hi2c->Init.OwnAddress2Masks));

+  assert_param(IS_I2C_GENERAL_CALL(hi2c->Init.GeneralCallMode));

+  assert_param(IS_I2C_NO_STRETCH(hi2c->Init.NoStretchMode));

+

+  if (hi2c->State == HAL_I2C_STATE_RESET)

+  {

+    /* Allocate lock resource and initialize it */

+    hi2c->Lock = HAL_UNLOCKED;

+

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+    /* Init the I2C Callback settings */

+    hi2c->MasterTxCpltCallback = HAL_I2C_MasterTxCpltCallback; /* Legacy weak MasterTxCpltCallback */

+    hi2c->MasterRxCpltCallback = HAL_I2C_MasterRxCpltCallback; /* Legacy weak MasterRxCpltCallback */

+    hi2c->SlaveTxCpltCallback  = HAL_I2C_SlaveTxCpltCallback;  /* Legacy weak SlaveTxCpltCallback  */

+    hi2c->SlaveRxCpltCallback  = HAL_I2C_SlaveRxCpltCallback;  /* Legacy weak SlaveRxCpltCallback  */

+    hi2c->ListenCpltCallback   = HAL_I2C_ListenCpltCallback;   /* Legacy weak ListenCpltCallback   */

+    hi2c->MemTxCpltCallback    = HAL_I2C_MemTxCpltCallback;    /* Legacy weak MemTxCpltCallback    */

+    hi2c->MemRxCpltCallback    = HAL_I2C_MemRxCpltCallback;    /* Legacy weak MemRxCpltCallback    */

+    hi2c->ErrorCallback        = HAL_I2C_ErrorCallback;        /* Legacy weak ErrorCallback        */

+    hi2c->AbortCpltCallback    = HAL_I2C_AbortCpltCallback;    /* Legacy weak AbortCpltCallback    */

+    hi2c->AddrCallback         = HAL_I2C_AddrCallback;         /* Legacy weak AddrCallback         */

+

+    if (hi2c->MspInitCallback == NULL)

+    {

+      hi2c->MspInitCallback = HAL_I2C_MspInit; /* Legacy weak MspInit  */

+    }

+

+    /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */

+    hi2c->MspInitCallback(hi2c);

+#else

+    /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */

+    HAL_I2C_MspInit(hi2c);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+  }

+

+  hi2c->State = HAL_I2C_STATE_BUSY;

+

+  /* Disable the selected I2C peripheral */

+  __HAL_I2C_DISABLE(hi2c);

+

+  /*---------------------------- I2Cx TIMINGR Configuration ------------------*/

+  /* Configure I2Cx: Frequency range */

+  hi2c->Instance->TIMINGR = hi2c->Init.Timing & TIMING_CLEAR_MASK;

+

+  /*---------------------------- I2Cx OAR1 Configuration ---------------------*/

+  /* Disable Own Address1 before set the Own Address1 configuration */

+  hi2c->Instance->OAR1 &= ~I2C_OAR1_OA1EN;

+

+  /* Configure I2Cx: Own Address1 and ack own address1 mode */

+  if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)

+  {

+    hi2c->Instance->OAR1 = (I2C_OAR1_OA1EN | hi2c->Init.OwnAddress1);

+  }

+  else /* I2C_ADDRESSINGMODE_10BIT */

+  {

+    hi2c->Instance->OAR1 = (I2C_OAR1_OA1EN | I2C_OAR1_OA1MODE | hi2c->Init.OwnAddress1);

+  }

+

+  /*---------------------------- I2Cx CR2 Configuration ----------------------*/

+  /* Configure I2Cx: Addressing Master mode */

+  if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)

+  {

+    hi2c->Instance->CR2 = (I2C_CR2_ADD10);

+  }

+  /* Enable the AUTOEND by default, and enable NACK (should be disable only during Slave process */

+  hi2c->Instance->CR2 |= (I2C_CR2_AUTOEND | I2C_CR2_NACK);

+

+  /*---------------------------- I2Cx OAR2 Configuration ---------------------*/

+  /* Disable Own Address2 before set the Own Address2 configuration */

+  hi2c->Instance->OAR2 &= ~I2C_DUALADDRESS_ENABLE;

+

+  /* Configure I2Cx: Dual mode and Own Address2 */

+  hi2c->Instance->OAR2 = (hi2c->Init.DualAddressMode | hi2c->Init.OwnAddress2 | (hi2c->Init.OwnAddress2Masks << 8));

+

+  /*---------------------------- I2Cx CR1 Configuration ----------------------*/

+  /* Configure I2Cx: Generalcall and NoStretch mode */

+  hi2c->Instance->CR1 = (hi2c->Init.GeneralCallMode | hi2c->Init.NoStretchMode);

+

+  /* Enable the selected I2C peripheral */

+  __HAL_I2C_ENABLE(hi2c);

+

+  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

+  hi2c->State = HAL_I2C_STATE_READY;

+  hi2c->PreviousState = I2C_STATE_NONE;

+  hi2c->Mode = HAL_I2C_MODE_NONE;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  DeInitialize the I2C peripheral.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c)

+{

+  /* Check the I2C handle allocation */

+  if (hi2c == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check the parameters */

+  assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));

+

+  hi2c->State = HAL_I2C_STATE_BUSY;

+

+  /* Disable the I2C Peripheral Clock */

+  __HAL_I2C_DISABLE(hi2c);

+

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+  if (hi2c->MspDeInitCallback == NULL)

+  {

+    hi2c->MspDeInitCallback = HAL_I2C_MspDeInit; /* Legacy weak MspDeInit  */

+  }

+

+  /* DeInit the low level hardware: GPIO, CLOCK, NVIC */

+  hi2c->MspDeInitCallback(hi2c);

+#else

+  /* DeInit the low level hardware: GPIO, CLOCK, NVIC */

+  HAL_I2C_MspDeInit(hi2c);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+

+  hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

+  hi2c->State = HAL_I2C_STATE_RESET;

+  hi2c->PreviousState = I2C_STATE_NONE;

+  hi2c->Mode = HAL_I2C_MODE_NONE;

+

+  /* Release Lock */

+  __HAL_UNLOCK(hi2c);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief Initialize the I2C MSP.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @retval None

+  */

+__weak void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hi2c);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_I2C_MspInit could be implemented in the user file

+   */

+}

+

+/**

+  * @brief DeInitialize the I2C MSP.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @retval None

+  */

+__weak void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hi2c);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_I2C_MspDeInit could be implemented in the user file

+   */

+}

+

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+/**

+  * @brief  Register a User I2C Callback

+  *         To be used instead of the weak predefined callback

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  CallbackID ID of the callback to be registered

+  *         This parameter can be one of the following values:

+  *          @arg @ref HAL_I2C_MASTER_TX_COMPLETE_CB_ID Master Tx Transfer completed callback ID

+  *          @arg @ref HAL_I2C_MASTER_RX_COMPLETE_CB_ID Master Rx Transfer completed callback ID

+  *          @arg @ref HAL_I2C_SLAVE_TX_COMPLETE_CB_ID Slave Tx Transfer completed callback ID

+  *          @arg @ref HAL_I2C_SLAVE_RX_COMPLETE_CB_ID Slave Rx Transfer completed callback ID

+  *          @arg @ref HAL_I2C_LISTEN_COMPLETE_CB_ID Listen Complete callback ID

+  *          @arg @ref HAL_I2C_MEM_TX_COMPLETE_CB_ID Memory Tx Transfer callback ID

+  *          @arg @ref HAL_I2C_MEM_RX_COMPLETE_CB_ID Memory Rx Transfer completed callback ID

+  *          @arg @ref HAL_I2C_ERROR_CB_ID Error callback ID

+  *          @arg @ref HAL_I2C_ABORT_CB_ID Abort callback ID

+  *          @arg @ref HAL_I2C_MSPINIT_CB_ID MspInit callback ID

+  *          @arg @ref HAL_I2C_MSPDEINIT_CB_ID MspDeInit callback ID

+  * @param  pCallback pointer to the Callback function

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID, pI2C_CallbackTypeDef pCallback)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  if (pCallback == NULL)

+  {

+    /* Update the error code */

+    hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;

+

+    return HAL_ERROR;

+  }

+  /* Process locked */

+  __HAL_LOCK(hi2c);

+

+  if (HAL_I2C_STATE_READY == hi2c->State)

+  {

+    switch (CallbackID)

+    {

+      case HAL_I2C_MASTER_TX_COMPLETE_CB_ID :

+        hi2c->MasterTxCpltCallback = pCallback;

+        break;

+

+      case HAL_I2C_MASTER_RX_COMPLETE_CB_ID :

+        hi2c->MasterRxCpltCallback = pCallback;

+        break;

+

+      case HAL_I2C_SLAVE_TX_COMPLETE_CB_ID :

+        hi2c->SlaveTxCpltCallback = pCallback;

+        break;

+

+      case HAL_I2C_SLAVE_RX_COMPLETE_CB_ID :

+        hi2c->SlaveRxCpltCallback = pCallback;

+        break;

+

+      case HAL_I2C_LISTEN_COMPLETE_CB_ID :

+        hi2c->ListenCpltCallback = pCallback;

+        break;

+

+      case HAL_I2C_MEM_TX_COMPLETE_CB_ID :

+        hi2c->MemTxCpltCallback = pCallback;

+        break;

+

+      case HAL_I2C_MEM_RX_COMPLETE_CB_ID :

+        hi2c->MemRxCpltCallback = pCallback;

+        break;

+

+      case HAL_I2C_ERROR_CB_ID :

+        hi2c->ErrorCallback = pCallback;

+        break;

+

+      case HAL_I2C_ABORT_CB_ID :

+        hi2c->AbortCpltCallback = pCallback;

+        break;

+

+      case HAL_I2C_MSPINIT_CB_ID :

+        hi2c->MspInitCallback = pCallback;

+        break;

+

+      case HAL_I2C_MSPDEINIT_CB_ID :

+        hi2c->MspDeInitCallback = pCallback;

+        break;

+

+      default :

+        /* Update the error code */

+        hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;

+

+        /* Return error status */

+        status =  HAL_ERROR;

+        break;

+    }

+  }

+  else if (HAL_I2C_STATE_RESET == hi2c->State)

+  {

+    switch (CallbackID)

+    {

+      case HAL_I2C_MSPINIT_CB_ID :

+        hi2c->MspInitCallback = pCallback;

+        break;

+

+      case HAL_I2C_MSPDEINIT_CB_ID :

+        hi2c->MspDeInitCallback = pCallback;

+        break;

+

+      default :

+        /* Update the error code */

+        hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;

+

+        /* Return error status */

+        status =  HAL_ERROR;

+        break;

+    }

+  }

+  else

+  {

+    /* Update the error code */

+    hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;

+

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hi2c);

+  return status;

+}

+

+/**

+  * @brief  Unregister an I2C Callback

+  *         I2C callback is redirected to the weak predefined callback

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  CallbackID ID of the callback to be unregistered

+  *         This parameter can be one of the following values:

+  *         This parameter can be one of the following values:

+  *          @arg @ref HAL_I2C_MASTER_TX_COMPLETE_CB_ID Master Tx Transfer completed callback ID

+  *          @arg @ref HAL_I2C_MASTER_RX_COMPLETE_CB_ID Master Rx Transfer completed callback ID

+  *          @arg @ref HAL_I2C_SLAVE_TX_COMPLETE_CB_ID Slave Tx Transfer completed callback ID

+  *          @arg @ref HAL_I2C_SLAVE_RX_COMPLETE_CB_ID Slave Rx Transfer completed callback ID

+  *          @arg @ref HAL_I2C_LISTEN_COMPLETE_CB_ID Listen Complete callback ID

+  *          @arg @ref HAL_I2C_MEM_TX_COMPLETE_CB_ID Memory Tx Transfer callback ID

+  *          @arg @ref HAL_I2C_MEM_RX_COMPLETE_CB_ID Memory Rx Transfer completed callback ID

+  *          @arg @ref HAL_I2C_ERROR_CB_ID Error callback ID

+  *          @arg @ref HAL_I2C_ABORT_CB_ID Abort callback ID

+  *          @arg @ref HAL_I2C_MSPINIT_CB_ID MspInit callback ID

+  *          @arg @ref HAL_I2C_MSPDEINIT_CB_ID MspDeInit callback ID

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Process locked */

+  __HAL_LOCK(hi2c);

+

+  if (HAL_I2C_STATE_READY == hi2c->State)

+  {

+    switch (CallbackID)

+    {

+      case HAL_I2C_MASTER_TX_COMPLETE_CB_ID :

+        hi2c->MasterTxCpltCallback = HAL_I2C_MasterTxCpltCallback; /* Legacy weak MasterTxCpltCallback */

+        break;

+

+      case HAL_I2C_MASTER_RX_COMPLETE_CB_ID :

+        hi2c->MasterRxCpltCallback = HAL_I2C_MasterRxCpltCallback; /* Legacy weak MasterRxCpltCallback */

+        break;

+

+      case HAL_I2C_SLAVE_TX_COMPLETE_CB_ID :

+        hi2c->SlaveTxCpltCallback = HAL_I2C_SlaveTxCpltCallback;   /* Legacy weak SlaveTxCpltCallback  */

+        break;

+

+      case HAL_I2C_SLAVE_RX_COMPLETE_CB_ID :

+        hi2c->SlaveRxCpltCallback = HAL_I2C_SlaveRxCpltCallback;   /* Legacy weak SlaveRxCpltCallback  */

+        break;

+

+      case HAL_I2C_LISTEN_COMPLETE_CB_ID :

+        hi2c->ListenCpltCallback = HAL_I2C_ListenCpltCallback;     /* Legacy weak ListenCpltCallback   */

+        break;

+

+      case HAL_I2C_MEM_TX_COMPLETE_CB_ID :

+        hi2c->MemTxCpltCallback = HAL_I2C_MemTxCpltCallback;       /* Legacy weak MemTxCpltCallback    */

+        break;

+

+      case HAL_I2C_MEM_RX_COMPLETE_CB_ID :

+        hi2c->MemRxCpltCallback = HAL_I2C_MemRxCpltCallback;       /* Legacy weak MemRxCpltCallback    */

+        break;

+

+      case HAL_I2C_ERROR_CB_ID :

+        hi2c->ErrorCallback = HAL_I2C_ErrorCallback;               /* Legacy weak ErrorCallback        */

+        break;

+

+      case HAL_I2C_ABORT_CB_ID :

+        hi2c->AbortCpltCallback = HAL_I2C_AbortCpltCallback;       /* Legacy weak AbortCpltCallback    */

+        break;

+

+      case HAL_I2C_MSPINIT_CB_ID :

+        hi2c->MspInitCallback = HAL_I2C_MspInit;                   /* Legacy weak MspInit              */

+        break;

+

+      case HAL_I2C_MSPDEINIT_CB_ID :

+        hi2c->MspDeInitCallback = HAL_I2C_MspDeInit;               /* Legacy weak MspDeInit            */

+        break;

+

+      default :

+        /* Update the error code */

+        hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;

+

+        /* Return error status */

+        status =  HAL_ERROR;

+        break;

+    }

+  }

+  else if (HAL_I2C_STATE_RESET == hi2c->State)

+  {

+    switch (CallbackID)

+    {

+      case HAL_I2C_MSPINIT_CB_ID :

+        hi2c->MspInitCallback = HAL_I2C_MspInit;                   /* Legacy weak MspInit              */

+        break;

+

+      case HAL_I2C_MSPDEINIT_CB_ID :

+        hi2c->MspDeInitCallback = HAL_I2C_MspDeInit;               /* Legacy weak MspDeInit            */

+        break;

+

+      default :

+        /* Update the error code */

+        hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;

+

+        /* Return error status */

+        status =  HAL_ERROR;

+        break;

+    }

+  }

+  else

+  {

+    /* Update the error code */

+    hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;

+

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hi2c);

+  return status;

+}

+

+/**

+  * @brief  Register the Slave Address Match I2C Callback

+  *         To be used instead of the weak HAL_I2C_AddrCallback() predefined callback

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  pCallback pointer to the Address Match Callback function

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pCallback)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  if (pCallback == NULL)

+  {

+    /* Update the error code */

+    hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;

+

+    return HAL_ERROR;

+  }

+  /* Process locked */

+  __HAL_LOCK(hi2c);

+

+  if (HAL_I2C_STATE_READY == hi2c->State)

+  {

+    hi2c->AddrCallback = pCallback;

+  }

+  else

+  {

+    /* Update the error code */

+    hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;

+

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hi2c);

+  return status;

+}

+

+/**

+  * @brief  UnRegister the Slave Address Match I2C Callback

+  *         Info Ready I2C Callback is redirected to the weak HAL_I2C_AddrCallback() predefined callback

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Process locked */

+  __HAL_LOCK(hi2c);

+

+  if (HAL_I2C_STATE_READY == hi2c->State)

+  {

+    hi2c->AddrCallback = HAL_I2C_AddrCallback; /* Legacy weak AddrCallback  */

+  }

+  else

+  {

+    /* Update the error code */

+    hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;

+

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hi2c);

+  return status;

+}

+

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+

+/**

+  * @}

+  */

+

+/** @defgroup I2C_Exported_Functions_Group2 Input and Output operation functions

+ *  @brief   Data transfers functions

+ *

+@verbatim

+ ===============================================================================

+                      ##### IO operation functions #####

+ ===============================================================================

+    [..]

+    This subsection provides a set of functions allowing to manage the I2C data

+    transfers.

+

+    (#) There are two modes of transfer:

+       (++) Blocking mode : The communication is performed in the polling mode.

+            The status of all data processing is returned by the same function

+            after finishing transfer.

+       (++) No-Blocking mode : The communication is performed using Interrupts

+            or DMA. These functions return the status of the transfer startup.

+            The end of the data processing will be indicated through the

+            dedicated I2C IRQ when using Interrupt mode or the DMA IRQ when

+            using DMA mode.

+

+    (#) Blocking mode functions are :

+        (++) HAL_I2C_Master_Transmit()

+        (++) HAL_I2C_Master_Receive()

+        (++) HAL_I2C_Slave_Transmit()

+        (++) HAL_I2C_Slave_Receive()

+        (++) HAL_I2C_Mem_Write()

+        (++) HAL_I2C_Mem_Read()

+        (++) HAL_I2C_IsDeviceReady()

+

+    (#) No-Blocking mode functions with Interrupt are :

+        (++) HAL_I2C_Master_Transmit_IT()

+        (++) HAL_I2C_Master_Receive_IT()

+        (++) HAL_I2C_Slave_Transmit_IT()

+        (++) HAL_I2C_Slave_Receive_IT()

+        (++) HAL_I2C_Mem_Write_IT()

+        (++) HAL_I2C_Mem_Read_IT()

+        (++) HAL_I2C_Master_Seq_Transmit_IT()

+        (++) HAL_I2C_Master_Seq_Receive_IT()

+        (++) HAL_I2C_Slave_Seq_Transmit_IT()

+        (++) HAL_I2C_Slave_Seq_Receive_IT()

+        (++) HAL_I2C_EnableListen_IT()

+        (++) HAL_I2C_DisableListen_IT()

+        (++) HAL_I2C_Master_Abort_IT()

+

+    (#) No-Blocking mode functions with DMA are :

+        (++) HAL_I2C_Master_Transmit_DMA()

+        (++) HAL_I2C_Master_Receive_DMA()

+        (++) HAL_I2C_Slave_Transmit_DMA()

+        (++) HAL_I2C_Slave_Receive_DMA()

+        (++) HAL_I2C_Mem_Write_DMA()

+        (++) HAL_I2C_Mem_Read_DMA()

+        (++) HAL_I2C_Master_Seq_Transmit_DMA()

+        (++) HAL_I2C_Master_Seq_Receive_DMA()

+        (++) HAL_I2C_Slave_Seq_Transmit_DMA()

+        (++) HAL_I2C_Slave_Seq_Receive_DMA()

+

+    (#) A set of Transfer Complete Callbacks are provided in non Blocking mode:

+        (++) HAL_I2C_MasterTxCpltCallback()

+        (++) HAL_I2C_MasterRxCpltCallback()

+        (++) HAL_I2C_SlaveTxCpltCallback()

+        (++) HAL_I2C_SlaveRxCpltCallback()

+        (++) HAL_I2C_MemTxCpltCallback()

+        (++) HAL_I2C_MemRxCpltCallback()

+        (++) HAL_I2C_AddrCallback()

+        (++) HAL_I2C_ListenCpltCallback()

+        (++) HAL_I2C_ErrorCallback()

+        (++) HAL_I2C_AbortCpltCallback()

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Transmits in master mode an amount of data in blocking mode.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  DevAddress Target device address: The device 7 bits address value

+  *         in datasheet must be shifted to the left before calling the interface

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @param  Timeout Timeout duration

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

+{

+  uint32_t tickstart;

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    /* Init tickstart for timeout management*/

+    tickstart = HAL_GetTick();

+

+    if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK)

+    {

+      return HAL_ERROR;

+    }

+

+    hi2c->State     = HAL_I2C_STATE_BUSY_TX;

+    hi2c->Mode      = HAL_I2C_MODE_MASTER;

+    hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr  = pData;

+    hi2c->XferCount = Size;

+    hi2c->XferISR   = NULL;

+

+    /* Send Slave Address */

+    /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */

+    if (hi2c->XferCount > MAX_NBYTE_SIZE)

+    {

+      hi2c->XferSize = MAX_NBYTE_SIZE;

+      I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_GENERATE_START_WRITE);

+    }

+    else

+    {

+      hi2c->XferSize = hi2c->XferCount;

+      I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_WRITE);

+    }

+

+    while (hi2c->XferCount > 0U)

+    {

+      /* Wait until TXIS flag is set */

+      if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      /* Write data to TXDR */

+      hi2c->Instance->TXDR = *hi2c->pBuffPtr;

+

+      /* Increment Buffer pointer */

+      hi2c->pBuffPtr++;

+

+      hi2c->XferCount--;

+      hi2c->XferSize--;

+

+      if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U))

+      {

+        /* Wait until TCR flag is set */

+        if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK)

+        {

+          return HAL_ERROR;

+        }

+

+        if (hi2c->XferCount > MAX_NBYTE_SIZE)

+        {

+          hi2c->XferSize = MAX_NBYTE_SIZE;

+          I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);

+        }

+        else

+        {

+          hi2c->XferSize = hi2c->XferCount;

+          I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);

+        }

+      }

+    }

+

+    /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */

+    /* Wait until STOPF flag is set */

+    if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)

+    {

+      return HAL_ERROR;

+    }

+

+    /* Clear STOP Flag */

+    __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);

+

+    /* Clear Configuration Register 2 */

+    I2C_RESET_CR2(hi2c);

+

+    hi2c->State = HAL_I2C_STATE_READY;

+    hi2c->Mode  = HAL_I2C_MODE_NONE;

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Receives in master mode an amount of data in blocking mode.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  DevAddress Target device address: The device 7 bits address value

+  *         in datasheet must be shifted to the left before calling the interface

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @param  Timeout Timeout duration

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

+{

+  uint32_t tickstart;

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    /* Init tickstart for timeout management*/

+    tickstart = HAL_GetTick();

+

+    if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK)

+    {

+      return HAL_ERROR;

+    }

+

+    hi2c->State     = HAL_I2C_STATE_BUSY_RX;

+    hi2c->Mode      = HAL_I2C_MODE_MASTER;

+    hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr  = pData;

+    hi2c->XferCount = Size;

+    hi2c->XferISR   = NULL;

+

+    /* Send Slave Address */

+    /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */

+    if (hi2c->XferCount > MAX_NBYTE_SIZE)

+    {

+      hi2c->XferSize = MAX_NBYTE_SIZE;

+      I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_GENERATE_START_READ);

+    }

+    else

+    {

+      hi2c->XferSize = hi2c->XferCount;

+      I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_READ);

+    }

+

+    while (hi2c->XferCount > 0U)

+    {

+      /* Wait until RXNE flag is set */

+      if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+

+      /* Read data from RXDR */

+      *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;

+

+      /* Increment Buffer pointer */

+      hi2c->pBuffPtr++;

+

+      hi2c->XferSize--;

+      hi2c->XferCount--;

+

+      if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U))

+      {

+        /* Wait until TCR flag is set */

+        if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK)

+        {

+          return HAL_ERROR;

+        }

+

+        if (hi2c->XferCount > MAX_NBYTE_SIZE)

+        {

+          hi2c->XferSize = MAX_NBYTE_SIZE;

+          I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);

+        }

+        else

+        {

+          hi2c->XferSize = hi2c->XferCount;

+          I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);

+        }

+      }

+    }

+

+    /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */

+    /* Wait until STOPF flag is set */

+    if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)

+    {

+      return HAL_ERROR;

+    }

+

+    /* Clear STOP Flag */

+    __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);

+

+    /* Clear Configuration Register 2 */

+    I2C_RESET_CR2(hi2c);

+

+    hi2c->State = HAL_I2C_STATE_READY;

+    hi2c->Mode  = HAL_I2C_MODE_NONE;

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Transmits in slave mode an amount of data in blocking mode.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @param  Timeout Timeout duration

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)

+{

+  uint32_t tickstart;

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    if ((pData == NULL) || (Size == 0U))

+    {

+      hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;

+      return  HAL_ERROR;

+    }

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    /* Init tickstart for timeout management*/

+    tickstart = HAL_GetTick();

+

+    hi2c->State     = HAL_I2C_STATE_BUSY_TX;

+    hi2c->Mode      = HAL_I2C_MODE_SLAVE;

+    hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr  = pData;

+    hi2c->XferCount = Size;

+    hi2c->XferISR   = NULL;

+

+    /* Enable Address Acknowledge */

+    hi2c->Instance->CR2 &= ~I2C_CR2_NACK;

+

+    /* Wait until ADDR flag is set */

+    if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)

+    {

+      /* Disable Address Acknowledge */

+      hi2c->Instance->CR2 |= I2C_CR2_NACK;

+      return HAL_ERROR;

+    }

+

+    /* Clear ADDR flag */

+    __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);

+

+    /* If 10bit addressing mode is selected */

+    if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)

+    {

+      /* Wait until ADDR flag is set */

+      if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)

+      {

+        /* Disable Address Acknowledge */

+        hi2c->Instance->CR2 |= I2C_CR2_NACK;

+        return HAL_ERROR;

+      }

+

+      /* Clear ADDR flag */

+      __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);

+    }

+

+    /* Wait until DIR flag is set Transmitter mode */

+    if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_DIR, RESET, Timeout, tickstart) != HAL_OK)

+    {

+      /* Disable Address Acknowledge */

+      hi2c->Instance->CR2 |= I2C_CR2_NACK;

+      return HAL_ERROR;

+    }

+

+    while (hi2c->XferCount > 0U)

+    {

+      /* Wait until TXIS flag is set */

+      if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)

+      {

+        /* Disable Address Acknowledge */

+        hi2c->Instance->CR2 |= I2C_CR2_NACK;

+        return HAL_ERROR;

+      }

+

+      /* Write data to TXDR */

+      hi2c->Instance->TXDR = *hi2c->pBuffPtr;

+

+      /* Increment Buffer pointer */

+      hi2c->pBuffPtr++;

+

+      hi2c->XferCount--;

+    }

+

+    /* Wait until STOP flag is set */

+    if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)

+    {

+      /* Disable Address Acknowledge */

+      hi2c->Instance->CR2 |= I2C_CR2_NACK;

+

+      if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)

+      {

+        /* Normal use case for Transmitter mode */

+        /* A NACK is generated to confirm the end of transfer */

+        hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

+      }

+      else

+      {

+        return HAL_ERROR;

+      }

+    }

+

+    /* Clear STOP flag */

+    __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);

+

+    /* Wait until BUSY flag is reset */

+    if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout, tickstart) != HAL_OK)

+    {

+      /* Disable Address Acknowledge */

+      hi2c->Instance->CR2 |= I2C_CR2_NACK;

+      return HAL_ERROR;

+    }

+

+    /* Disable Address Acknowledge */

+    hi2c->Instance->CR2 |= I2C_CR2_NACK;

+

+    hi2c->State = HAL_I2C_STATE_READY;

+    hi2c->Mode  = HAL_I2C_MODE_NONE;

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Receive in slave mode an amount of data in blocking mode

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @param  Timeout Timeout duration

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout)

+{

+  uint32_t tickstart;

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    if ((pData == NULL) || (Size == 0U))

+    {

+      hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;

+      return  HAL_ERROR;

+    }

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    /* Init tickstart for timeout management*/

+    tickstart = HAL_GetTick();

+

+    hi2c->State     = HAL_I2C_STATE_BUSY_RX;

+    hi2c->Mode      = HAL_I2C_MODE_SLAVE;

+    hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr  = pData;

+    hi2c->XferCount = Size;

+    hi2c->XferISR   = NULL;

+

+    /* Enable Address Acknowledge */

+    hi2c->Instance->CR2 &= ~I2C_CR2_NACK;

+

+    /* Wait until ADDR flag is set */

+    if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)

+    {

+      /* Disable Address Acknowledge */

+      hi2c->Instance->CR2 |= I2C_CR2_NACK;

+      return HAL_ERROR;

+    }

+

+    /* Clear ADDR flag */

+    __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);

+

+    /* Wait until DIR flag is reset Receiver mode */

+    if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_DIR, SET, Timeout, tickstart) != HAL_OK)

+    {

+      /* Disable Address Acknowledge */

+      hi2c->Instance->CR2 |= I2C_CR2_NACK;

+      return HAL_ERROR;

+    }

+

+    while (hi2c->XferCount > 0U)

+    {

+      /* Wait until RXNE flag is set */

+      if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)

+      {

+        /* Disable Address Acknowledge */

+        hi2c->Instance->CR2 |= I2C_CR2_NACK;

+

+        /* Store Last receive data if any */

+        if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)

+        {

+          /* Read data from RXDR */

+          *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;

+

+          /* Increment Buffer pointer */

+          hi2c->pBuffPtr++;

+

+          hi2c->XferCount--;

+        }

+

+        return HAL_ERROR;

+      }

+

+      /* Read data from RXDR */

+      *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;

+

+      /* Increment Buffer pointer */

+      hi2c->pBuffPtr++;

+

+      hi2c->XferCount--;

+    }

+

+    /* Wait until STOP flag is set */

+    if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)

+    {

+      /* Disable Address Acknowledge */

+      hi2c->Instance->CR2 |= I2C_CR2_NACK;

+      return HAL_ERROR;

+    }

+

+    /* Clear STOP flag */

+    __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);

+

+    /* Wait until BUSY flag is reset */

+    if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout, tickstart) != HAL_OK)

+    {

+      /* Disable Address Acknowledge */

+      hi2c->Instance->CR2 |= I2C_CR2_NACK;

+      return HAL_ERROR;

+    }

+

+    /* Disable Address Acknowledge */

+    hi2c->Instance->CR2 |= I2C_CR2_NACK;

+

+    hi2c->State = HAL_I2C_STATE_READY;

+    hi2c->Mode  = HAL_I2C_MODE_NONE;

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Transmit in master mode an amount of data in non-blocking mode with Interrupt

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  DevAddress Target device address: The device 7 bits address value

+  *         in datasheet must be shifted to the left before calling the interface

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)

+{

+  uint32_t xfermode;

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)

+    {

+      return HAL_BUSY;

+    }

+

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    hi2c->State       = HAL_I2C_STATE_BUSY_TX;

+    hi2c->Mode        = HAL_I2C_MODE_MASTER;

+    hi2c->ErrorCode   = HAL_I2C_ERROR_NONE;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr    = pData;

+    hi2c->XferCount   = Size;

+    hi2c->XferOptions = I2C_NO_OPTION_FRAME;

+    hi2c->XferISR     = I2C_Master_ISR_IT;

+

+    if (hi2c->XferCount > MAX_NBYTE_SIZE)

+    {

+      hi2c->XferSize = MAX_NBYTE_SIZE;

+      xfermode = I2C_RELOAD_MODE;

+    }

+    else

+    {

+      hi2c->XferSize = hi2c->XferCount;

+      xfermode = I2C_AUTOEND_MODE;

+    }

+

+    /* Send Slave Address */

+    /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE */

+    I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_WRITE);

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Note : The I2C interrupts must be enabled after unlocking current process

+              to avoid the risk of I2C interrupt handle execution before current

+              process unlock */

+

+    /* Enable ERR, TC, STOP, NACK, TXI interrupt */

+    /* possible to enable all of these */

+    /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */

+    I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Receive in master mode an amount of data in non-blocking mode with Interrupt

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  DevAddress Target device address: The device 7 bits address value

+  *         in datasheet must be shifted to the left before calling the interface

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)

+{

+  uint32_t xfermode;

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)

+    {

+      return HAL_BUSY;

+    }

+

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    hi2c->State       = HAL_I2C_STATE_BUSY_RX;

+    hi2c->Mode        = HAL_I2C_MODE_MASTER;

+    hi2c->ErrorCode   = HAL_I2C_ERROR_NONE;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr    = pData;

+    hi2c->XferCount   = Size;

+    hi2c->XferOptions = I2C_NO_OPTION_FRAME;

+    hi2c->XferISR     = I2C_Master_ISR_IT;

+

+    if (hi2c->XferCount > MAX_NBYTE_SIZE)

+    {

+      hi2c->XferSize = MAX_NBYTE_SIZE;

+      xfermode = I2C_RELOAD_MODE;

+    }

+    else

+    {

+      hi2c->XferSize = hi2c->XferCount;

+      xfermode = I2C_AUTOEND_MODE;

+    }

+

+    /* Send Slave Address */

+    /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE */

+    I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_READ);

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Note : The I2C interrupts must be enabled after unlocking current process

+              to avoid the risk of I2C interrupt handle execution before current

+              process unlock */

+

+    /* Enable ERR, TC, STOP, NACK, RXI interrupt */

+    /* possible to enable all of these */

+    /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */

+    I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Transmit in slave mode an amount of data in non-blocking mode with Interrupt

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)

+{

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    hi2c->State       = HAL_I2C_STATE_BUSY_TX;

+    hi2c->Mode        = HAL_I2C_MODE_SLAVE;

+    hi2c->ErrorCode   = HAL_I2C_ERROR_NONE;

+

+    /* Enable Address Acknowledge */

+    hi2c->Instance->CR2 &= ~I2C_CR2_NACK;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr    = pData;

+    hi2c->XferCount   = Size;

+    hi2c->XferSize    = hi2c->XferCount;

+    hi2c->XferOptions = I2C_NO_OPTION_FRAME;

+    hi2c->XferISR     = I2C_Slave_ISR_IT;

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Note : The I2C interrupts must be enabled after unlocking current process

+              to avoid the risk of I2C interrupt handle execution before current

+              process unlock */

+

+    /* Enable ERR, TC, STOP, NACK, TXI interrupt */

+    /* possible to enable all of these */

+    /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */

+    I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT | I2C_XFER_LISTEN_IT);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Receive in slave mode an amount of data in non-blocking mode with Interrupt

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)

+{

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    hi2c->State       = HAL_I2C_STATE_BUSY_RX;

+    hi2c->Mode        = HAL_I2C_MODE_SLAVE;

+    hi2c->ErrorCode   = HAL_I2C_ERROR_NONE;

+

+    /* Enable Address Acknowledge */

+    hi2c->Instance->CR2 &= ~I2C_CR2_NACK;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr    = pData;

+    hi2c->XferCount   = Size;

+    hi2c->XferSize    = hi2c->XferCount;

+    hi2c->XferOptions = I2C_NO_OPTION_FRAME;

+    hi2c->XferISR     = I2C_Slave_ISR_IT;

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Note : The I2C interrupts must be enabled after unlocking current process

+              to avoid the risk of I2C interrupt handle execution before current

+              process unlock */

+

+    /* Enable ERR, TC, STOP, NACK, RXI interrupt */

+    /* possible to enable all of these */

+    /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */

+    I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_LISTEN_IT);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Transmit in master mode an amount of data in non-blocking mode with DMA

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  DevAddress Target device address: The device 7 bits address value

+  *         in datasheet must be shifted to the left before calling the interface

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)

+{

+  uint32_t xfermode;

+  HAL_StatusTypeDef dmaxferstatus;

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)

+    {

+      return HAL_BUSY;

+    }

+

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    hi2c->State       = HAL_I2C_STATE_BUSY_TX;

+    hi2c->Mode        = HAL_I2C_MODE_MASTER;

+    hi2c->ErrorCode   = HAL_I2C_ERROR_NONE;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr    = pData;

+    hi2c->XferCount   = Size;

+    hi2c->XferOptions = I2C_NO_OPTION_FRAME;

+    hi2c->XferISR     = I2C_Master_ISR_DMA;

+

+    if (hi2c->XferCount > MAX_NBYTE_SIZE)

+    {

+      hi2c->XferSize = MAX_NBYTE_SIZE;

+      xfermode = I2C_RELOAD_MODE;

+    }

+    else

+    {

+      hi2c->XferSize = hi2c->XferCount;

+      xfermode = I2C_AUTOEND_MODE;

+    }

+

+    if (hi2c->XferSize > 0U)

+    {

+      if (hi2c->hdmatx != NULL)

+      {

+        /* Set the I2C DMA transfer complete callback */

+        hi2c->hdmatx->XferCpltCallback = I2C_DMAMasterTransmitCplt;

+

+        /* Set the DMA error callback */

+        hi2c->hdmatx->XferErrorCallback = I2C_DMAError;

+

+        /* Set the unused DMA callbacks to NULL */

+        hi2c->hdmatx->XferHalfCpltCallback = NULL;

+        hi2c->hdmatx->XferAbortCallback = NULL;

+

+        /* Enable the DMA channel */

+        dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);

+      }

+      else

+      {

+        /* Update I2C state */

+        hi2c->State     = HAL_I2C_STATE_READY;

+        hi2c->Mode      = HAL_I2C_MODE_NONE;

+

+        /* Update I2C error code */

+        hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;

+

+        /* Process Unlocked */

+        __HAL_UNLOCK(hi2c);

+

+        return HAL_ERROR;

+      }

+

+      if (dmaxferstatus == HAL_OK)

+      {

+        /* Send Slave Address */

+        /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */

+        I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_WRITE);

+

+        /* Update XferCount value */

+        hi2c->XferCount -= hi2c->XferSize;

+

+        /* Process Unlocked */

+        __HAL_UNLOCK(hi2c);

+

+        /* Note : The I2C interrupts must be enabled after unlocking current process

+                  to avoid the risk of I2C interrupt handle execution before current

+                  process unlock */

+        /* Enable ERR and NACK interrupts */

+        I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);

+

+        /* Enable DMA Request */

+        hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;

+      }

+      else

+      {

+        /* Update I2C state */

+        hi2c->State     = HAL_I2C_STATE_READY;

+        hi2c->Mode      = HAL_I2C_MODE_NONE;

+

+        /* Update I2C error code */

+        hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;

+

+        /* Process Unlocked */

+        __HAL_UNLOCK(hi2c);

+

+        return HAL_ERROR;

+      }

+    }

+    else

+    {

+      /* Update Transfer ISR function pointer */

+      hi2c->XferISR = I2C_Master_ISR_IT;

+

+      /* Send Slave Address */

+      /* Set NBYTES to write and generate START condition */

+      I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_WRITE);

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      /* Note : The I2C interrupts must be enabled after unlocking current process

+                to avoid the risk of I2C interrupt handle execution before current

+                process unlock */

+      /* Enable ERR, TC, STOP, NACK, TXI interrupt */

+      /* possible to enable all of these */

+      /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */

+      I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);

+    }

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Receive in master mode an amount of data in non-blocking mode with DMA

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  DevAddress Target device address: The device 7 bits address value

+  *         in datasheet must be shifted to the left before calling the interface

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)

+{

+  uint32_t xfermode;

+  HAL_StatusTypeDef dmaxferstatus;

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)

+    {

+      return HAL_BUSY;

+    }

+

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    hi2c->State       = HAL_I2C_STATE_BUSY_RX;

+    hi2c->Mode        = HAL_I2C_MODE_MASTER;

+    hi2c->ErrorCode   = HAL_I2C_ERROR_NONE;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr    = pData;

+    hi2c->XferCount   = Size;

+    hi2c->XferOptions = I2C_NO_OPTION_FRAME;

+    hi2c->XferISR     = I2C_Master_ISR_DMA;

+

+    if (hi2c->XferCount > MAX_NBYTE_SIZE)

+    {

+      hi2c->XferSize = MAX_NBYTE_SIZE;

+      xfermode = I2C_RELOAD_MODE;

+    }

+    else

+    {

+      hi2c->XferSize = hi2c->XferCount;

+      xfermode = I2C_AUTOEND_MODE;

+    }

+

+    if (hi2c->XferSize > 0U)

+    {

+      if (hi2c->hdmarx != NULL)

+      {

+        /* Set the I2C DMA transfer complete callback */

+        hi2c->hdmarx->XferCpltCallback = I2C_DMAMasterReceiveCplt;

+

+        /* Set the DMA error callback */

+        hi2c->hdmarx->XferErrorCallback = I2C_DMAError;

+

+        /* Set the unused DMA callbacks to NULL */

+        hi2c->hdmarx->XferHalfCpltCallback = NULL;

+        hi2c->hdmarx->XferAbortCallback = NULL;

+

+        /* Enable the DMA channel */

+        dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData, hi2c->XferSize);

+      }

+      else

+      {

+        /* Update I2C state */

+        hi2c->State     = HAL_I2C_STATE_READY;

+        hi2c->Mode      = HAL_I2C_MODE_NONE;

+

+        /* Update I2C error code */

+        hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;

+

+        /* Process Unlocked */

+        __HAL_UNLOCK(hi2c);

+

+        return HAL_ERROR;

+      }

+

+      if (dmaxferstatus == HAL_OK)

+      {

+        /* Send Slave Address */

+        /* Set NBYTES to read and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */

+        I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_READ);

+

+        /* Update XferCount value */

+        hi2c->XferCount -= hi2c->XferSize;

+

+        /* Process Unlocked */

+        __HAL_UNLOCK(hi2c);

+

+        /* Note : The I2C interrupts must be enabled after unlocking current process

+                  to avoid the risk of I2C interrupt handle execution before current

+                  process unlock */

+        /* Enable ERR and NACK interrupts */

+        I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);

+

+        /* Enable DMA Request */

+        hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;

+      }

+      else

+      {

+        /* Update I2C state */

+        hi2c->State     = HAL_I2C_STATE_READY;

+        hi2c->Mode      = HAL_I2C_MODE_NONE;

+

+        /* Update I2C error code */

+        hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;

+

+        /* Process Unlocked */

+        __HAL_UNLOCK(hi2c);

+

+        return HAL_ERROR;

+      }

+    }

+    else

+    {

+      /* Update Transfer ISR function pointer */

+      hi2c->XferISR = I2C_Master_ISR_IT;

+

+      /* Send Slave Address */

+      /* Set NBYTES to read and generate START condition */

+      I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_READ);

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      /* Note : The I2C interrupts must be enabled after unlocking current process

+                to avoid the risk of I2C interrupt handle execution before current

+                process unlock */

+      /* Enable ERR, TC, STOP, NACK, TXI interrupt */

+      /* possible to enable all of these */

+      /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */

+      I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);

+    }

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Transmit in slave mode an amount of data in non-blocking mode with DMA

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)

+{

+  HAL_StatusTypeDef dmaxferstatus;

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    if ((pData == NULL) || (Size == 0U))

+    {

+      hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;

+      return  HAL_ERROR;

+    }

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    hi2c->State       = HAL_I2C_STATE_BUSY_TX;

+    hi2c->Mode        = HAL_I2C_MODE_SLAVE;

+    hi2c->ErrorCode   = HAL_I2C_ERROR_NONE;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr    = pData;

+    hi2c->XferCount   = Size;

+    hi2c->XferSize    = hi2c->XferCount;

+    hi2c->XferOptions = I2C_NO_OPTION_FRAME;

+    hi2c->XferISR     = I2C_Slave_ISR_DMA;

+

+    if (hi2c->hdmatx != NULL)

+    {

+      /* Set the I2C DMA transfer complete callback */

+      hi2c->hdmatx->XferCpltCallback = I2C_DMASlaveTransmitCplt;

+

+      /* Set the DMA error callback */

+      hi2c->hdmatx->XferErrorCallback = I2C_DMAError;

+

+      /* Set the unused DMA callbacks to NULL */

+      hi2c->hdmatx->XferHalfCpltCallback = NULL;

+      hi2c->hdmatx->XferAbortCallback = NULL;

+

+      /* Enable the DMA channel */

+      dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);

+    }

+    else

+    {

+      /* Update I2C state */

+      hi2c->State     = HAL_I2C_STATE_LISTEN;

+      hi2c->Mode      = HAL_I2C_MODE_NONE;

+

+      /* Update I2C error code */

+      hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      return HAL_ERROR;

+    }

+

+    if (dmaxferstatus == HAL_OK)

+    {

+      /* Enable Address Acknowledge */

+      hi2c->Instance->CR2 &= ~I2C_CR2_NACK;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      /* Note : The I2C interrupts must be enabled after unlocking current process

+                to avoid the risk of I2C interrupt handle execution before current

+                process unlock */

+      /* Enable ERR, STOP, NACK, ADDR interrupts */

+      I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT);

+

+      /* Enable DMA Request */

+      hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;

+    }

+    else

+    {

+      /* Update I2C state */

+      hi2c->State     = HAL_I2C_STATE_LISTEN;

+      hi2c->Mode      = HAL_I2C_MODE_NONE;

+

+      /* Update I2C error code */

+      hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      return HAL_ERROR;

+    }

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Receive in slave mode an amount of data in non-blocking mode with DMA

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)

+{

+  HAL_StatusTypeDef dmaxferstatus;

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    if ((pData == NULL) || (Size == 0U))

+    {

+      hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;

+      return  HAL_ERROR;

+    }

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    hi2c->State       = HAL_I2C_STATE_BUSY_RX;

+    hi2c->Mode        = HAL_I2C_MODE_SLAVE;

+    hi2c->ErrorCode   = HAL_I2C_ERROR_NONE;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr    = pData;

+    hi2c->XferCount   = Size;

+    hi2c->XferSize    = hi2c->XferCount;

+    hi2c->XferOptions = I2C_NO_OPTION_FRAME;

+    hi2c->XferISR     = I2C_Slave_ISR_DMA;

+

+    if (hi2c->hdmarx != NULL)

+    {

+      /* Set the I2C DMA transfer complete callback */

+      hi2c->hdmarx->XferCpltCallback = I2C_DMASlaveReceiveCplt;

+

+      /* Set the DMA error callback */

+      hi2c->hdmarx->XferErrorCallback = I2C_DMAError;

+

+      /* Set the unused DMA callbacks to NULL */

+      hi2c->hdmarx->XferHalfCpltCallback = NULL;

+      hi2c->hdmarx->XferAbortCallback = NULL;

+

+      /* Enable the DMA channel */

+      dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData, hi2c->XferSize);

+    }

+    else

+    {

+      /* Update I2C state */

+      hi2c->State     = HAL_I2C_STATE_LISTEN;

+      hi2c->Mode      = HAL_I2C_MODE_NONE;

+

+      /* Update I2C error code */

+      hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      return HAL_ERROR;

+    }

+

+    if (dmaxferstatus == HAL_OK)

+    {

+      /* Enable Address Acknowledge */

+      hi2c->Instance->CR2 &= ~I2C_CR2_NACK;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      /* Note : The I2C interrupts must be enabled after unlocking current process

+                to avoid the risk of I2C interrupt handle execution before current

+                process unlock */

+      /* Enable ERR, STOP, NACK, ADDR interrupts */

+      I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT);

+

+      /* Enable DMA Request */

+      hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;

+    }

+    else

+    {

+      /* Update I2C state */

+      hi2c->State     = HAL_I2C_STATE_LISTEN;

+      hi2c->Mode      = HAL_I2C_MODE_NONE;

+

+      /* Update I2C error code */

+      hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      return HAL_ERROR;

+    }

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+/**

+  * @brief  Write an amount of data in blocking mode to a specific memory address

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  DevAddress Target device address: The device 7 bits address value

+  *         in datasheet must be shifted to the left before calling the interface

+  * @param  MemAddress Internal memory address

+  * @param  MemAddSize Size of internal memory address

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @param  Timeout Timeout duration

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

+{

+  uint32_t tickstart;

+

+  /* Check the parameters */

+  assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    if ((pData == NULL) || (Size == 0U))

+    {

+      hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;

+      return  HAL_ERROR;

+    }

+

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    /* Init tickstart for timeout management*/

+    tickstart = HAL_GetTick();

+

+    if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK)

+    {

+      return HAL_ERROR;

+    }

+

+    hi2c->State     = HAL_I2C_STATE_BUSY_TX;

+    hi2c->Mode      = HAL_I2C_MODE_MEM;

+    hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr  = pData;

+    hi2c->XferCount = Size;

+    hi2c->XferISR   = NULL;

+

+    /* Send Slave Address and Memory Address */

+    if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK)

+    {

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+      return HAL_ERROR;

+    }

+

+    /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE */

+    if (hi2c->XferCount > MAX_NBYTE_SIZE)

+    {

+      hi2c->XferSize = MAX_NBYTE_SIZE;

+      I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);

+    }

+    else

+    {

+      hi2c->XferSize = hi2c->XferCount;

+      I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);

+    }

+

+    do

+    {

+      /* Wait until TXIS flag is set */

+      if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+

+      /* Write data to TXDR */

+      hi2c->Instance->TXDR = *hi2c->pBuffPtr;

+

+      /* Increment Buffer pointer */

+      hi2c->pBuffPtr++;

+

+      hi2c->XferCount--;

+      hi2c->XferSize--;

+

+      if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U))

+      {

+        /* Wait until TCR flag is set */

+        if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK)

+        {

+          return HAL_ERROR;

+        }

+

+        if (hi2c->XferCount > MAX_NBYTE_SIZE)

+        {

+          hi2c->XferSize = MAX_NBYTE_SIZE;

+          I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);

+        }

+        else

+        {

+          hi2c->XferSize = hi2c->XferCount;

+          I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);

+        }

+      }

+

+    }

+    while (hi2c->XferCount > 0U);

+

+    /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */

+    /* Wait until STOPF flag is reset */

+    if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)

+    {

+      return HAL_ERROR;

+    }

+

+    /* Clear STOP Flag */

+    __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);

+

+    /* Clear Configuration Register 2 */

+    I2C_RESET_CR2(hi2c);

+

+    hi2c->State = HAL_I2C_STATE_READY;

+    hi2c->Mode  = HAL_I2C_MODE_NONE;

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Read an amount of data in blocking mode from a specific memory address

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  DevAddress Target device address: The device 7 bits address value

+  *         in datasheet must be shifted to the left before calling the interface

+  * @param  MemAddress Internal memory address

+  * @param  MemAddSize Size of internal memory address

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @param  Timeout Timeout duration

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

+{

+  uint32_t tickstart;

+

+  /* Check the parameters */

+  assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    if ((pData == NULL) || (Size == 0U))

+    {

+      hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;

+      return  HAL_ERROR;

+    }

+

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    /* Init tickstart for timeout management*/

+    tickstart = HAL_GetTick();

+

+    if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK)

+    {

+      return HAL_ERROR;

+    }

+

+    hi2c->State     = HAL_I2C_STATE_BUSY_RX;

+    hi2c->Mode      = HAL_I2C_MODE_MEM;

+    hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr  = pData;

+    hi2c->XferCount = Size;

+    hi2c->XferISR   = NULL;

+

+    /* Send Slave Address and Memory Address */

+    if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK)

+    {

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+      return HAL_ERROR;

+    }

+

+    /* Send Slave Address */

+    /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */

+    if (hi2c->XferCount > MAX_NBYTE_SIZE)

+    {

+      hi2c->XferSize = MAX_NBYTE_SIZE;

+      I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_GENERATE_START_READ);

+    }

+    else

+    {

+      hi2c->XferSize = hi2c->XferCount;

+      I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_READ);

+    }

+

+    do

+    {

+      /* Wait until RXNE flag is set */

+      if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout, tickstart) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+

+      /* Read data from RXDR */

+      *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;

+

+      /* Increment Buffer pointer */

+      hi2c->pBuffPtr++;

+

+      hi2c->XferSize--;

+      hi2c->XferCount--;

+

+      if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U))

+      {

+        /* Wait until TCR flag is set */

+        if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK)

+        {

+          return HAL_ERROR;

+        }

+

+        if (hi2c->XferCount > MAX_NBYTE_SIZE)

+        {

+          hi2c->XferSize = MAX_NBYTE_SIZE;

+          I2C_TransferConfig(hi2c, DevAddress, (uint8_t) hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);

+        }

+        else

+        {

+          hi2c->XferSize = hi2c->XferCount;

+          I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);

+        }

+      }

+    }

+    while (hi2c->XferCount > 0U);

+

+    /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */

+    /* Wait until STOPF flag is reset */

+    if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)

+    {

+      return HAL_ERROR;

+    }

+

+    /* Clear STOP Flag */

+    __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);

+

+    /* Clear Configuration Register 2 */

+    I2C_RESET_CR2(hi2c);

+

+    hi2c->State = HAL_I2C_STATE_READY;

+    hi2c->Mode  = HAL_I2C_MODE_NONE;

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+/**

+  * @brief  Write an amount of data in non-blocking mode with Interrupt to a specific memory address

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  DevAddress Target device address: The device 7 bits address value

+  *         in datasheet must be shifted to the left before calling the interface

+  * @param  MemAddress Internal memory address

+  * @param  MemAddSize Size of internal memory address

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)

+{

+  uint32_t tickstart;

+  uint32_t xfermode;

+

+  /* Check the parameters */

+  assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    if ((pData == NULL) || (Size == 0U))

+    {

+      hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;

+      return  HAL_ERROR;

+    }

+

+    if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)

+    {

+      return HAL_BUSY;

+    }

+

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    /* Init tickstart for timeout management*/

+    tickstart = HAL_GetTick();

+

+    hi2c->State       = HAL_I2C_STATE_BUSY_TX;

+    hi2c->Mode        = HAL_I2C_MODE_MEM;

+    hi2c->ErrorCode   = HAL_I2C_ERROR_NONE;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr    = pData;

+    hi2c->XferCount   = Size;

+    hi2c->XferOptions = I2C_NO_OPTION_FRAME;

+    hi2c->XferISR     = I2C_Master_ISR_IT;

+

+    if (hi2c->XferCount > MAX_NBYTE_SIZE)

+    {

+      hi2c->XferSize = MAX_NBYTE_SIZE;

+      xfermode = I2C_RELOAD_MODE;

+    }

+    else

+    {

+      hi2c->XferSize = hi2c->XferCount;

+      xfermode = I2C_AUTOEND_MODE;

+    }

+

+    /* Send Slave Address and Memory Address */

+    if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)

+    {

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+      return HAL_ERROR;

+    }

+

+    /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */

+    I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_NO_STARTSTOP);

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Note : The I2C interrupts must be enabled after unlocking current process

+              to avoid the risk of I2C interrupt handle execution before current

+              process unlock */

+

+    /* Enable ERR, TC, STOP, NACK, TXI interrupt */

+    /* possible to enable all of these */

+    /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */

+    I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Read an amount of data in non-blocking mode with Interrupt from a specific memory address

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  DevAddress Target device address: The device 7 bits address value

+  *         in datasheet must be shifted to the left before calling the interface

+  * @param  MemAddress Internal memory address

+  * @param  MemAddSize Size of internal memory address

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)

+{

+  uint32_t tickstart;

+  uint32_t xfermode;

+

+  /* Check the parameters */

+  assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    if ((pData == NULL) || (Size == 0U))

+    {

+      hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;

+      return  HAL_ERROR;

+    }

+

+    if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)

+    {

+      return HAL_BUSY;

+    }

+

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    /* Init tickstart for timeout management*/

+    tickstart = HAL_GetTick();

+

+    hi2c->State       = HAL_I2C_STATE_BUSY_RX;

+    hi2c->Mode        = HAL_I2C_MODE_MEM;

+    hi2c->ErrorCode   = HAL_I2C_ERROR_NONE;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr    = pData;

+    hi2c->XferCount   = Size;

+    hi2c->XferOptions = I2C_NO_OPTION_FRAME;

+    hi2c->XferISR     = I2C_Master_ISR_IT;

+

+    if (hi2c->XferCount > MAX_NBYTE_SIZE)

+    {

+      hi2c->XferSize = MAX_NBYTE_SIZE;

+      xfermode = I2C_RELOAD_MODE;

+    }

+    else

+    {

+      hi2c->XferSize = hi2c->XferCount;

+      xfermode = I2C_AUTOEND_MODE;

+    }

+

+    /* Send Slave Address and Memory Address */

+    if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)

+    {

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+      return HAL_ERROR;

+    }

+

+    /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */

+    I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_READ);

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Note : The I2C interrupts must be enabled after unlocking current process

+              to avoid the risk of I2C interrupt handle execution before current

+              process unlock */

+

+    /* Enable ERR, TC, STOP, NACK, RXI interrupt */

+    /* possible to enable all of these */

+    /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */

+    I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+/**

+  * @brief  Write an amount of data in non-blocking mode with DMA to a specific memory address

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  DevAddress Target device address: The device 7 bits address value

+  *         in datasheet must be shifted to the left before calling the interface

+  * @param  MemAddress Internal memory address

+  * @param  MemAddSize Size of internal memory address

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)

+{

+  uint32_t tickstart;

+  uint32_t xfermode;

+  HAL_StatusTypeDef dmaxferstatus;

+

+  /* Check the parameters */

+  assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    if ((pData == NULL) || (Size == 0U))

+    {

+      hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;

+      return  HAL_ERROR;

+    }

+

+    if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)

+    {

+      return HAL_BUSY;

+    }

+

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    /* Init tickstart for timeout management*/

+    tickstart = HAL_GetTick();

+

+    hi2c->State       = HAL_I2C_STATE_BUSY_TX;

+    hi2c->Mode        = HAL_I2C_MODE_MEM;

+    hi2c->ErrorCode   = HAL_I2C_ERROR_NONE;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr    = pData;

+    hi2c->XferCount   = Size;

+    hi2c->XferOptions = I2C_NO_OPTION_FRAME;

+    hi2c->XferISR     = I2C_Master_ISR_DMA;

+

+    if (hi2c->XferCount > MAX_NBYTE_SIZE)

+    {

+      hi2c->XferSize = MAX_NBYTE_SIZE;

+      xfermode = I2C_RELOAD_MODE;

+    }

+    else

+    {

+      hi2c->XferSize = hi2c->XferCount;

+      xfermode = I2C_AUTOEND_MODE;

+    }

+

+    /* Send Slave Address and Memory Address */

+    if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)

+    {

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+      return HAL_ERROR;

+    }

+

+

+    if (hi2c->hdmatx != NULL)

+    {

+      /* Set the I2C DMA transfer complete callback */

+      hi2c->hdmatx->XferCpltCallback = I2C_DMAMasterTransmitCplt;

+

+      /* Set the DMA error callback */

+      hi2c->hdmatx->XferErrorCallback = I2C_DMAError;

+

+      /* Set the unused DMA callbacks to NULL */

+      hi2c->hdmatx->XferHalfCpltCallback = NULL;

+      hi2c->hdmatx->XferAbortCallback = NULL;

+

+      /* Enable the DMA channel */

+      dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);

+    }

+    else

+    {

+      /* Update I2C state */

+      hi2c->State     = HAL_I2C_STATE_READY;

+      hi2c->Mode      = HAL_I2C_MODE_NONE;

+

+      /* Update I2C error code */

+      hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      return HAL_ERROR;

+    }

+

+    if (dmaxferstatus == HAL_OK)

+    {

+      /* Send Slave Address */

+      /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */

+      I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_NO_STARTSTOP);

+

+      /* Update XferCount value */

+      hi2c->XferCount -= hi2c->XferSize;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      /* Note : The I2C interrupts must be enabled after unlocking current process

+                to avoid the risk of I2C interrupt handle execution before current

+                process unlock */

+      /* Enable ERR and NACK interrupts */

+      I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);

+

+      /* Enable DMA Request */

+      hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;

+    }

+    else

+    {

+      /* Update I2C state */

+      hi2c->State     = HAL_I2C_STATE_READY;

+      hi2c->Mode      = HAL_I2C_MODE_NONE;

+

+      /* Update I2C error code */

+      hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      return HAL_ERROR;

+    }

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Reads an amount of data in non-blocking mode with DMA from a specific memory address.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  DevAddress Target device address: The device 7 bits address value

+  *         in datasheet must be shifted to the left before calling the interface

+  * @param  MemAddress Internal memory address

+  * @param  MemAddSize Size of internal memory address

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be read

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size)

+{

+  uint32_t tickstart;

+  uint32_t xfermode;

+  HAL_StatusTypeDef dmaxferstatus;

+

+  /* Check the parameters */

+  assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    if ((pData == NULL) || (Size == 0U))

+    {

+      hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;

+      return  HAL_ERROR;

+    }

+

+    if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)

+    {

+      return HAL_BUSY;

+    }

+

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    /* Init tickstart for timeout management*/

+    tickstart = HAL_GetTick();

+

+    hi2c->State       = HAL_I2C_STATE_BUSY_RX;

+    hi2c->Mode        = HAL_I2C_MODE_MEM;

+    hi2c->ErrorCode   = HAL_I2C_ERROR_NONE;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr    = pData;

+    hi2c->XferCount   = Size;

+    hi2c->XferOptions = I2C_NO_OPTION_FRAME;

+    hi2c->XferISR     = I2C_Master_ISR_DMA;

+

+    if (hi2c->XferCount > MAX_NBYTE_SIZE)

+    {

+      hi2c->XferSize = MAX_NBYTE_SIZE;

+      xfermode = I2C_RELOAD_MODE;

+    }

+    else

+    {

+      hi2c->XferSize = hi2c->XferCount;

+      xfermode = I2C_AUTOEND_MODE;

+    }

+

+    /* Send Slave Address and Memory Address */

+    if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK)

+    {

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+      return HAL_ERROR;

+    }

+

+    if (hi2c->hdmarx != NULL)

+    {

+      /* Set the I2C DMA transfer complete callback */

+      hi2c->hdmarx->XferCpltCallback = I2C_DMAMasterReceiveCplt;

+

+      /* Set the DMA error callback */

+      hi2c->hdmarx->XferErrorCallback = I2C_DMAError;

+

+      /* Set the unused DMA callbacks to NULL */

+      hi2c->hdmarx->XferHalfCpltCallback = NULL;

+      hi2c->hdmarx->XferAbortCallback = NULL;

+

+      /* Enable the DMA channel */

+      dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData, hi2c->XferSize);

+    }

+    else

+    {

+      /* Update I2C state */

+      hi2c->State     = HAL_I2C_STATE_READY;

+      hi2c->Mode      = HAL_I2C_MODE_NONE;

+

+      /* Update I2C error code */

+      hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      return HAL_ERROR;

+    }

+

+    if (dmaxferstatus == HAL_OK)

+    {

+      /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */

+      I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_READ);

+

+      /* Update XferCount value */

+      hi2c->XferCount -= hi2c->XferSize;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      /* Note : The I2C interrupts must be enabled after unlocking current process

+                to avoid the risk of I2C interrupt handle execution before current

+                process unlock */

+      /* Enable ERR and NACK interrupts */

+      I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);

+

+      /* Enable DMA Request */

+      hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;

+    }

+    else

+    {

+      /* Update I2C state */

+      hi2c->State     = HAL_I2C_STATE_READY;

+      hi2c->Mode      = HAL_I2C_MODE_NONE;

+

+      /* Update I2C error code */

+      hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      return HAL_ERROR;

+    }

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Checks if target device is ready for communication.

+  * @note   This function is used with Memory devices

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  DevAddress Target device address: The device 7 bits address value

+  *         in datasheet must be shifted to the left before calling the interface

+  * @param  Trials Number of trials

+  * @param  Timeout Timeout duration

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout)

+{

+  uint32_t tickstart;

+

+  __IO uint32_t I2C_Trials = 0UL;

+

+  FlagStatus tmp1;

+  FlagStatus tmp2;

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)

+    {

+      return HAL_BUSY;

+    }

+

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    hi2c->State = HAL_I2C_STATE_BUSY;

+    hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

+

+    do

+    {

+      /* Generate Start */

+      hi2c->Instance->CR2 = I2C_GENERATE_START(hi2c->Init.AddressingMode, DevAddress);

+

+      /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */

+      /* Wait until STOPF flag is set or a NACK flag is set*/

+      tickstart = HAL_GetTick();

+

+      tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF);

+      tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);

+

+      while ((tmp1 == RESET) && (tmp2 == RESET))

+      {

+        if (Timeout != HAL_MAX_DELAY)

+        {

+          if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))

+          {

+            /* Update I2C state */

+            hi2c->State = HAL_I2C_STATE_READY;

+

+            /* Update I2C error code */

+            hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;

+

+            /* Process Unlocked */

+            __HAL_UNLOCK(hi2c);

+

+            return HAL_ERROR;

+          }

+        }

+

+        tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF);

+        tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);

+      }

+

+      /* Check if the NACKF flag has not been set */

+      if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == RESET)

+      {

+        /* Wait until STOPF flag is reset */

+        if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout, tickstart) != HAL_OK)

+        {

+          return HAL_ERROR;

+        }

+

+        /* Clear STOP Flag */

+        __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);

+

+        /* Device is ready */

+        hi2c->State = HAL_I2C_STATE_READY;

+

+        /* Process Unlocked */

+        __HAL_UNLOCK(hi2c);

+

+        return HAL_OK;

+      }

+      else

+      {

+        /* Wait until STOPF flag is reset */

+        if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout, tickstart) != HAL_OK)

+        {

+          return HAL_ERROR;

+        }

+

+        /* Clear NACK Flag */

+        __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);

+

+        /* Clear STOP Flag, auto generated with autoend*/

+        __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);

+      }

+

+      /* Check if the maximum allowed number of trials has been reached */

+      if (I2C_Trials == Trials)

+      {

+        /* Generate Stop */

+        hi2c->Instance->CR2 |= I2C_CR2_STOP;

+

+        /* Wait until STOPF flag is reset */

+        if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout, tickstart) != HAL_OK)

+        {

+          return HAL_ERROR;

+        }

+

+        /* Clear STOP Flag */

+        __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);

+      }

+

+      /* Increment Trials */

+      I2C_Trials++;

+    }

+    while (I2C_Trials < Trials);

+

+    /* Update I2C state */

+    hi2c->State = HAL_I2C_STATE_READY;

+

+    /* Update I2C error code */

+    hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    return HAL_ERROR;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Sequential transmit in master I2C mode an amount of data in non-blocking mode with Interrupt.

+  * @note   This interface allow to manage repeated start condition when a direction change during transfer

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  DevAddress Target device address: The device 7 bits address value

+  *         in datasheet must be shifted to the left before calling the interface

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @param  XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)

+{

+  uint32_t xfermode;

+  uint32_t xferrequest = I2C_GENERATE_START_WRITE;

+

+  /* Check the parameters */

+  assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    hi2c->State     = HAL_I2C_STATE_BUSY_TX;

+    hi2c->Mode      = HAL_I2C_MODE_MASTER;

+    hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr    = pData;

+    hi2c->XferCount   = Size;

+    hi2c->XferOptions = XferOptions;

+    hi2c->XferISR     = I2C_Master_ISR_IT;

+

+    /* If hi2c->XferCount > MAX_NBYTE_SIZE, use reload mode */

+    if (hi2c->XferCount > MAX_NBYTE_SIZE)

+    {

+      hi2c->XferSize = MAX_NBYTE_SIZE;

+      xfermode = I2C_RELOAD_MODE;

+    }

+    else

+    {

+      hi2c->XferSize = hi2c->XferCount;

+      xfermode = hi2c->XferOptions;

+    }

+

+    /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */

+    /* Mean Previous state is same as current state */

+    if ((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) && (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0))

+    {

+      xferrequest = I2C_NO_STARTSTOP;

+    }

+    else

+    {

+      /* Convert OTHER_xxx XferOptions if any */

+      I2C_ConvertOtherXferOptions(hi2c);

+

+      /* Update xfermode accordingly if no reload is necessary */

+      if (hi2c->XferCount < MAX_NBYTE_SIZE)

+      {

+        xfermode = hi2c->XferOptions;

+      }

+    }

+

+    /* Send Slave Address and set NBYTES to write */

+    I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest);

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Note : The I2C interrupts must be enabled after unlocking current process

+              to avoid the risk of I2C interrupt handle execution before current

+              process unlock */

+    I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Sequential transmit in master I2C mode an amount of data in non-blocking mode with DMA.

+  * @note   This interface allow to manage repeated start condition when a direction change during transfer

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  DevAddress Target device address: The device 7 bits address value

+  *         in datasheet must be shifted to the left before calling the interface

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @param  XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)

+{

+  uint32_t xfermode;

+  uint32_t xferrequest = I2C_GENERATE_START_WRITE;

+  HAL_StatusTypeDef dmaxferstatus;

+

+  /* Check the parameters */

+  assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    hi2c->State     = HAL_I2C_STATE_BUSY_TX;

+    hi2c->Mode      = HAL_I2C_MODE_MASTER;

+    hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr    = pData;

+    hi2c->XferCount   = Size;

+    hi2c->XferOptions = XferOptions;

+    hi2c->XferISR     = I2C_Master_ISR_DMA;

+

+    /* If hi2c->XferCount > MAX_NBYTE_SIZE, use reload mode */

+    if (hi2c->XferCount > MAX_NBYTE_SIZE)

+    {

+      hi2c->XferSize = MAX_NBYTE_SIZE;

+      xfermode = I2C_RELOAD_MODE;

+    }

+    else

+    {

+      hi2c->XferSize = hi2c->XferCount;

+      xfermode = hi2c->XferOptions;

+    }

+

+    /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */

+    /* Mean Previous state is same as current state */

+    if ((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) && (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0))

+    {

+      xferrequest = I2C_NO_STARTSTOP;

+    }

+    else

+    {

+      /* Convert OTHER_xxx XferOptions if any */

+      I2C_ConvertOtherXferOptions(hi2c);

+

+      /* Update xfermode accordingly if no reload is necessary */

+      if (hi2c->XferCount < MAX_NBYTE_SIZE)

+      {

+        xfermode = hi2c->XferOptions;

+      }

+    }

+

+    if (hi2c->XferSize > 0U)

+    {

+      if (hi2c->hdmatx != NULL)

+      {

+        /* Set the I2C DMA transfer complete callback */

+        hi2c->hdmatx->XferCpltCallback = I2C_DMAMasterTransmitCplt;

+

+        /* Set the DMA error callback */

+        hi2c->hdmatx->XferErrorCallback = I2C_DMAError;

+

+        /* Set the unused DMA callbacks to NULL */

+        hi2c->hdmatx->XferHalfCpltCallback = NULL;

+        hi2c->hdmatx->XferAbortCallback = NULL;

+

+        /* Enable the DMA channel */

+        dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);

+      }

+      else

+      {

+        /* Update I2C state */

+        hi2c->State     = HAL_I2C_STATE_READY;

+        hi2c->Mode      = HAL_I2C_MODE_NONE;

+

+        /* Update I2C error code */

+        hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;

+

+        /* Process Unlocked */

+        __HAL_UNLOCK(hi2c);

+

+        return HAL_ERROR;

+      }

+

+      if (dmaxferstatus == HAL_OK)

+      {

+        /* Send Slave Address and set NBYTES to write */

+        I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest);

+

+        /* Update XferCount value */

+        hi2c->XferCount -= hi2c->XferSize;

+

+        /* Process Unlocked */

+        __HAL_UNLOCK(hi2c);

+

+        /* Note : The I2C interrupts must be enabled after unlocking current process

+                  to avoid the risk of I2C interrupt handle execution before current

+                  process unlock */

+        /* Enable ERR and NACK interrupts */

+        I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);

+

+        /* Enable DMA Request */

+        hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;

+      }

+      else

+      {

+        /* Update I2C state */

+        hi2c->State     = HAL_I2C_STATE_READY;

+        hi2c->Mode      = HAL_I2C_MODE_NONE;

+

+        /* Update I2C error code */

+        hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;

+

+        /* Process Unlocked */

+        __HAL_UNLOCK(hi2c);

+

+        return HAL_ERROR;

+      }

+    }

+    else

+    {

+      /* Update Transfer ISR function pointer */

+      hi2c->XferISR = I2C_Master_ISR_IT;

+

+      /* Send Slave Address */

+      /* Set NBYTES to write and generate START condition */

+      I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_WRITE);

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      /* Note : The I2C interrupts must be enabled after unlocking current process

+                to avoid the risk of I2C interrupt handle execution before current

+                process unlock */

+      /* Enable ERR, TC, STOP, NACK, TXI interrupt */

+      /* possible to enable all of these */

+      /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */

+      I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);

+    }

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Sequential receive in master I2C mode an amount of data in non-blocking mode with Interrupt

+  * @note   This interface allow to manage repeated start condition when a direction change during transfer

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  DevAddress Target device address: The device 7 bits address value

+  *         in datasheet must be shifted to the left before calling the interface

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @param  XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)

+{

+  uint32_t xfermode;

+  uint32_t xferrequest = I2C_GENERATE_START_READ;

+

+  /* Check the parameters */

+  assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    hi2c->State     = HAL_I2C_STATE_BUSY_RX;

+    hi2c->Mode      = HAL_I2C_MODE_MASTER;

+    hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr    = pData;

+    hi2c->XferCount   = Size;

+    hi2c->XferOptions = XferOptions;

+    hi2c->XferISR     = I2C_Master_ISR_IT;

+

+    /* If hi2c->XferCount > MAX_NBYTE_SIZE, use reload mode */

+    if (hi2c->XferCount > MAX_NBYTE_SIZE)

+    {

+      hi2c->XferSize = MAX_NBYTE_SIZE;

+      xfermode = I2C_RELOAD_MODE;

+    }

+    else

+    {

+      hi2c->XferSize = hi2c->XferCount;

+      xfermode = hi2c->XferOptions;

+    }

+

+    /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */

+    /* Mean Previous state is same as current state */

+    if ((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX) && (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0))

+    {

+      xferrequest = I2C_NO_STARTSTOP;

+    }

+    else

+    {

+      /* Convert OTHER_xxx XferOptions if any */

+      I2C_ConvertOtherXferOptions(hi2c);

+

+      /* Update xfermode accordingly if no reload is necessary */

+      if (hi2c->XferCount < MAX_NBYTE_SIZE)

+      {

+        xfermode = hi2c->XferOptions;

+      }

+    }

+

+    /* Send Slave Address and set NBYTES to read */

+    I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest);

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Note : The I2C interrupts must be enabled after unlocking current process

+              to avoid the risk of I2C interrupt handle execution before current

+              process unlock */

+    I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Sequential receive in master I2C mode an amount of data in non-blocking mode with DMA

+  * @note   This interface allow to manage repeated start condition when a direction change during transfer

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  DevAddress Target device address: The device 7 bits address value

+  *         in datasheet must be shifted to the left before calling the interface

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @param  XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)

+{

+  uint32_t xfermode;

+  uint32_t xferrequest = I2C_GENERATE_START_READ;

+  HAL_StatusTypeDef dmaxferstatus;

+

+  /* Check the parameters */

+  assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));

+

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    hi2c->State     = HAL_I2C_STATE_BUSY_RX;

+    hi2c->Mode      = HAL_I2C_MODE_MASTER;

+    hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr    = pData;

+    hi2c->XferCount   = Size;

+    hi2c->XferOptions = XferOptions;

+    hi2c->XferISR     = I2C_Master_ISR_DMA;

+

+    /* If hi2c->XferCount > MAX_NBYTE_SIZE, use reload mode */

+    if (hi2c->XferCount > MAX_NBYTE_SIZE)

+    {

+      hi2c->XferSize = MAX_NBYTE_SIZE;

+      xfermode = I2C_RELOAD_MODE;

+    }

+    else

+    {

+      hi2c->XferSize = hi2c->XferCount;

+      xfermode = hi2c->XferOptions;

+    }

+

+    /* If transfer direction not change and there is no request to start another frame, do not generate Restart Condition */

+    /* Mean Previous state is same as current state */

+    if ((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX) && (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0))

+    {

+      xferrequest = I2C_NO_STARTSTOP;

+    }

+    else

+    {

+      /* Convert OTHER_xxx XferOptions if any */

+      I2C_ConvertOtherXferOptions(hi2c);

+

+      /* Update xfermode accordingly if no reload is necessary */

+      if (hi2c->XferCount < MAX_NBYTE_SIZE)

+      {

+        xfermode = hi2c->XferOptions;

+      }

+    }

+

+    if (hi2c->XferSize > 0U)

+    {

+      if (hi2c->hdmarx != NULL)

+      {

+        /* Set the I2C DMA transfer complete callback */

+        hi2c->hdmarx->XferCpltCallback = I2C_DMAMasterReceiveCplt;

+

+        /* Set the DMA error callback */

+        hi2c->hdmarx->XferErrorCallback = I2C_DMAError;

+

+        /* Set the unused DMA callbacks to NULL */

+        hi2c->hdmarx->XferHalfCpltCallback = NULL;

+        hi2c->hdmarx->XferAbortCallback = NULL;

+

+        /* Enable the DMA channel */

+        dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData, hi2c->XferSize);

+      }

+      else

+      {

+        /* Update I2C state */

+        hi2c->State     = HAL_I2C_STATE_READY;

+        hi2c->Mode      = HAL_I2C_MODE_NONE;

+

+        /* Update I2C error code */

+        hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;

+

+        /* Process Unlocked */

+        __HAL_UNLOCK(hi2c);

+

+        return HAL_ERROR;

+      }

+

+      if (dmaxferstatus == HAL_OK)

+      {

+        /* Send Slave Address and set NBYTES to read */

+        I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest);

+

+        /* Update XferCount value */

+        hi2c->XferCount -= hi2c->XferSize;

+

+        /* Process Unlocked */

+        __HAL_UNLOCK(hi2c);

+

+        /* Note : The I2C interrupts must be enabled after unlocking current process

+                  to avoid the risk of I2C interrupt handle execution before current

+                  process unlock */

+        /* Enable ERR and NACK interrupts */

+        I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);

+

+        /* Enable DMA Request */

+        hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;

+      }

+      else

+      {

+        /* Update I2C state */

+        hi2c->State     = HAL_I2C_STATE_READY;

+        hi2c->Mode      = HAL_I2C_MODE_NONE;

+

+        /* Update I2C error code */

+        hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;

+

+        /* Process Unlocked */

+        __HAL_UNLOCK(hi2c);

+

+        return HAL_ERROR;

+      }

+    }

+    else

+    {

+      /* Update Transfer ISR function pointer */

+      hi2c->XferISR = I2C_Master_ISR_IT;

+

+      /* Send Slave Address */

+      /* Set NBYTES to read and generate START condition */

+      I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_GENERATE_START_READ);

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      /* Note : The I2C interrupts must be enabled after unlocking current process

+                to avoid the risk of I2C interrupt handle execution before current

+                process unlock */

+      /* Enable ERR, TC, STOP, NACK, TXI interrupt */

+      /* possible to enable all of these */

+      /* I2C_IT_ERRI | I2C_IT_TCI| I2C_IT_STOPI| I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */

+      I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);

+    }

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Sequential transmit in slave/device I2C mode an amount of data in non-blocking mode with Interrupt

+  * @note   This interface allow to manage repeated start condition when a direction change during transfer

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @param  XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions)

+{

+  /* Check the parameters */

+  assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));

+

+  if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)

+  {

+    if ((pData == NULL) || (Size == 0U))

+    {

+      hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;

+      return  HAL_ERROR;

+    }

+

+    /* Disable Interrupts, to prevent preemption during treatment in case of multicall */

+    I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_TX_IT);

+

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */

+    /* and then toggle the HAL slave RX state to TX state */

+    if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN)

+    {

+      /* Disable associated Interrupts */

+      I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT);

+

+      /* Abort DMA Xfer if any */

+      if ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN)

+      {

+        hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;

+

+        if (hi2c->hdmarx != NULL)

+        {

+          /* Set the I2C DMA Abort callback :

+           will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */

+          hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort;

+

+          /* Abort DMA RX */

+          if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK)

+          {

+            /* Call Directly XferAbortCallback function in case of error */

+            hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);

+          }

+        }

+      }

+    }

+

+    hi2c->State     = HAL_I2C_STATE_BUSY_TX_LISTEN;

+    hi2c->Mode      = HAL_I2C_MODE_SLAVE;

+    hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

+

+    /* Enable Address Acknowledge */

+    hi2c->Instance->CR2 &= ~I2C_CR2_NACK;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr    = pData;

+    hi2c->XferCount   = Size;

+    hi2c->XferSize    = hi2c->XferCount;

+    hi2c->XferOptions = XferOptions;

+    hi2c->XferISR     = I2C_Slave_ISR_IT;

+

+    if (I2C_GET_DIR(hi2c) == I2C_DIRECTION_RECEIVE)

+    {

+      /* Clear ADDR flag after prepare the transfer parameters */

+      /* This action will generate an acknowledge to the Master */

+      __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);

+    }

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Note : The I2C interrupts must be enabled after unlocking current process

+    to avoid the risk of I2C interrupt handle execution before current

+    process unlock */

+    /* REnable ADDR interrupt */

+    I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT | I2C_XFER_LISTEN_IT);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_ERROR;

+  }

+}

+

+/**

+  * @brief  Sequential transmit in slave/device I2C mode an amount of data in non-blocking mode with DMA

+  * @note   This interface allow to manage repeated start condition when a direction change during transfer

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @param  XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions)

+{

+  HAL_StatusTypeDef dmaxferstatus;

+

+  /* Check the parameters */

+  assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));

+

+  if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)

+  {

+    if ((pData == NULL) || (Size == 0U))

+    {

+      hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;

+      return  HAL_ERROR;

+    }

+

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    /* Disable Interrupts, to prevent preemption during treatment in case of multicall */

+    I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_TX_IT);

+

+    /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */

+    /* and then toggle the HAL slave RX state to TX state */

+    if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN)

+    {

+      /* Disable associated Interrupts */

+      I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT);

+

+      if ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN)

+      {

+        /* Abort DMA Xfer if any */

+        if (hi2c->hdmarx != NULL)

+        {

+          hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;

+

+          /* Set the I2C DMA Abort callback :

+           will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */

+          hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort;

+

+          /* Abort DMA RX */

+          if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK)

+          {

+            /* Call Directly XferAbortCallback function in case of error */

+            hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);

+          }

+        }

+      }

+    }

+    else if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN)

+    {

+      if ((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN)

+      {

+        hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;

+

+        /* Abort DMA Xfer if any */

+        if (hi2c->hdmatx != NULL)

+        {

+          /* Set the I2C DMA Abort callback :

+           will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */

+          hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort;

+

+          /* Abort DMA TX */

+          if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK)

+          {

+            /* Call Directly XferAbortCallback function in case of error */

+            hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);

+          }

+        }

+      }

+    }

+    else

+    {

+      /* Nothing to do */

+    }

+

+    hi2c->State     = HAL_I2C_STATE_BUSY_TX_LISTEN;

+    hi2c->Mode      = HAL_I2C_MODE_SLAVE;

+    hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

+

+    /* Enable Address Acknowledge */

+    hi2c->Instance->CR2 &= ~I2C_CR2_NACK;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr    = pData;

+    hi2c->XferCount   = Size;

+    hi2c->XferSize    = hi2c->XferCount;

+    hi2c->XferOptions = XferOptions;

+    hi2c->XferISR     = I2C_Slave_ISR_DMA;

+

+    if (hi2c->hdmatx != NULL)

+    {

+      /* Set the I2C DMA transfer complete callback */

+      hi2c->hdmatx->XferCpltCallback = I2C_DMASlaveTransmitCplt;

+

+      /* Set the DMA error callback */

+      hi2c->hdmatx->XferErrorCallback = I2C_DMAError;

+

+      /* Set the unused DMA callbacks to NULL */

+      hi2c->hdmatx->XferHalfCpltCallback = NULL;

+      hi2c->hdmatx->XferAbortCallback = NULL;

+

+      /* Enable the DMA channel */

+      dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);

+    }

+    else

+    {

+      /* Update I2C state */

+      hi2c->State     = HAL_I2C_STATE_LISTEN;

+      hi2c->Mode      = HAL_I2C_MODE_NONE;

+

+      /* Update I2C error code */

+      hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      return HAL_ERROR;

+    }

+

+    if (dmaxferstatus == HAL_OK)

+    {

+      /* Update XferCount value */

+      hi2c->XferCount -= hi2c->XferSize;

+

+      /* Reset XferSize */

+      hi2c->XferSize = 0;

+    }

+    else

+    {

+      /* Update I2C state */

+      hi2c->State     = HAL_I2C_STATE_LISTEN;

+      hi2c->Mode      = HAL_I2C_MODE_NONE;

+

+      /* Update I2C error code */

+      hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      return HAL_ERROR;

+    }

+

+    if (I2C_GET_DIR(hi2c) == I2C_DIRECTION_RECEIVE)

+    {

+      /* Clear ADDR flag after prepare the transfer parameters */

+      /* This action will generate an acknowledge to the Master */

+      __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);

+    }

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Note : The I2C interrupts must be enabled after unlocking current process

+    to avoid the risk of I2C interrupt handle execution before current

+    process unlock */

+    /* Enable ERR, STOP, NACK, ADDR interrupts */

+    I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT);

+

+    /* Enable DMA Request */

+    hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_ERROR;

+  }

+}

+

+/**

+  * @brief  Sequential receive in slave/device I2C mode an amount of data in non-blocking mode with Interrupt

+  * @note   This interface allow to manage repeated start condition when a direction change during transfer

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @param  XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions)

+{

+  /* Check the parameters */

+  assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));

+

+  if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)

+  {

+    if ((pData == NULL) || (Size == 0U))

+    {

+      hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;

+      return  HAL_ERROR;

+    }

+

+    /* Disable Interrupts, to prevent preemption during treatment in case of multicall */

+    I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT);

+

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */

+    /* and then toggle the HAL slave TX state to RX state */

+    if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN)

+    {

+      /* Disable associated Interrupts */

+      I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);

+

+      if ((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN)

+      {

+        hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;

+

+        /* Abort DMA Xfer if any */

+        if (hi2c->hdmatx != NULL)

+        {

+          /* Set the I2C DMA Abort callback :

+           will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */

+          hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort;

+

+          /* Abort DMA TX */

+          if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK)

+          {

+            /* Call Directly XferAbortCallback function in case of error */

+            hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);

+          }

+        }

+      }

+    }

+

+    hi2c->State     = HAL_I2C_STATE_BUSY_RX_LISTEN;

+    hi2c->Mode      = HAL_I2C_MODE_SLAVE;

+    hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

+

+    /* Enable Address Acknowledge */

+    hi2c->Instance->CR2 &= ~I2C_CR2_NACK;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr    = pData;

+    hi2c->XferCount   = Size;

+    hi2c->XferSize    = hi2c->XferCount;

+    hi2c->XferOptions = XferOptions;

+    hi2c->XferISR     = I2C_Slave_ISR_IT;

+

+    if (I2C_GET_DIR(hi2c) == I2C_DIRECTION_TRANSMIT)

+    {

+      /* Clear ADDR flag after prepare the transfer parameters */

+      /* This action will generate an acknowledge to the Master */

+      __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);

+    }

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Note : The I2C interrupts must be enabled after unlocking current process

+    to avoid the risk of I2C interrupt handle execution before current

+    process unlock */

+    /* REnable ADDR interrupt */

+    I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_LISTEN_IT);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_ERROR;

+  }

+}

+

+/**

+  * @brief  Sequential receive in slave/device I2C mode an amount of data in non-blocking mode with DMA

+  * @note   This interface allow to manage repeated start condition when a direction change during transfer

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  pData Pointer to data buffer

+  * @param  Size Amount of data to be sent

+  * @param  XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions)

+{

+  HAL_StatusTypeDef dmaxferstatus;

+

+  /* Check the parameters */

+  assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));

+

+  if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)

+  {

+    if ((pData == NULL) || (Size == 0U))

+    {

+      hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;

+      return  HAL_ERROR;

+    }

+

+    /* Disable Interrupts, to prevent preemption during treatment in case of multicall */

+    I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT);

+

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */

+    /* and then toggle the HAL slave TX state to RX state */

+    if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN)

+    {

+      /* Disable associated Interrupts */

+      I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);

+

+      if ((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN)

+      {

+        /* Abort DMA Xfer if any */

+        if (hi2c->hdmatx != NULL)

+        {

+          hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;

+

+          /* Set the I2C DMA Abort callback :

+           will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */

+          hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort;

+

+          /* Abort DMA TX */

+          if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK)

+          {

+            /* Call Directly XferAbortCallback function in case of error */

+            hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);

+          }

+        }

+      }

+    }

+    else if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN)

+    {

+      if ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN)

+      {

+        hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;

+

+        /* Abort DMA Xfer if any */

+        if (hi2c->hdmarx != NULL)

+        {

+          /* Set the I2C DMA Abort callback :

+           will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */

+          hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort;

+

+          /* Abort DMA RX */

+          if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK)

+          {

+            /* Call Directly XferAbortCallback function in case of error */

+            hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);

+          }

+        }

+      }

+    }

+    else

+    {

+      /* Nothing to do */

+    }

+

+    hi2c->State     = HAL_I2C_STATE_BUSY_RX_LISTEN;

+    hi2c->Mode      = HAL_I2C_MODE_SLAVE;

+    hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

+

+    /* Enable Address Acknowledge */

+    hi2c->Instance->CR2 &= ~I2C_CR2_NACK;

+

+    /* Prepare transfer parameters */

+    hi2c->pBuffPtr    = pData;

+    hi2c->XferCount   = Size;

+    hi2c->XferSize    = hi2c->XferCount;

+    hi2c->XferOptions = XferOptions;

+    hi2c->XferISR     = I2C_Slave_ISR_DMA;

+

+    if (hi2c->hdmarx != NULL)

+    {

+      /* Set the I2C DMA transfer complete callback */

+      hi2c->hdmarx->XferCpltCallback = I2C_DMASlaveReceiveCplt;

+

+      /* Set the DMA error callback */

+      hi2c->hdmarx->XferErrorCallback = I2C_DMAError;

+

+      /* Set the unused DMA callbacks to NULL */

+      hi2c->hdmarx->XferHalfCpltCallback = NULL;

+      hi2c->hdmarx->XferAbortCallback = NULL;

+

+      /* Enable the DMA channel */

+      dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData, hi2c->XferSize);

+    }

+    else

+    {

+      /* Update I2C state */

+      hi2c->State     = HAL_I2C_STATE_LISTEN;

+      hi2c->Mode      = HAL_I2C_MODE_NONE;

+

+      /* Update I2C error code */

+      hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      return HAL_ERROR;

+    }

+

+    if (dmaxferstatus == HAL_OK)

+    {

+      /* Update XferCount value */

+      hi2c->XferCount -= hi2c->XferSize;

+

+      /* Reset XferSize */

+      hi2c->XferSize = 0;

+    }

+    else

+    {

+      /* Update I2C state */

+      hi2c->State     = HAL_I2C_STATE_LISTEN;

+      hi2c->Mode      = HAL_I2C_MODE_NONE;

+

+      /* Update I2C error code */

+      hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      return HAL_ERROR;

+    }

+

+    if (I2C_GET_DIR(hi2c) == I2C_DIRECTION_TRANSMIT)

+    {

+      /* Clear ADDR flag after prepare the transfer parameters */

+      /* This action will generate an acknowledge to the Master */

+      __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);

+    }

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Note : The I2C interrupts must be enabled after unlocking current process

+    to avoid the risk of I2C interrupt handle execution before current

+    process unlock */

+    /* REnable ADDR interrupt */

+    I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_LISTEN_IT);

+

+    /* Enable DMA Request */

+    hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_ERROR;

+  }

+}

+

+/**

+  * @brief  Enable the Address listen mode with Interrupt.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c)

+{

+  if (hi2c->State == HAL_I2C_STATE_READY)

+  {

+    hi2c->State = HAL_I2C_STATE_LISTEN;

+    hi2c->XferISR = I2C_Slave_ISR_IT;

+

+    /* Enable the Address Match interrupt */

+    I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Disable the Address listen mode with Interrupt.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c)

+{

+  /* Declaration of tmp to prevent undefined behavior of volatile usage */

+  uint32_t tmp;

+

+  /* Disable Address listen mode only if a transfer is not ongoing */

+  if (hi2c->State == HAL_I2C_STATE_LISTEN)

+  {

+    tmp = (uint32_t)(hi2c->State) & I2C_STATE_MSK;

+    hi2c->PreviousState = tmp | (uint32_t)(hi2c->Mode);

+    hi2c->State = HAL_I2C_STATE_READY;

+    hi2c->Mode = HAL_I2C_MODE_NONE;

+    hi2c->XferISR = NULL;

+

+    /* Disable the Address Match interrupt */

+    I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Abort a master I2C IT or DMA process communication with Interrupt.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  DevAddress Target device address: The device 7 bits address value

+  *         in datasheet must be shifted to the left before calling the interface

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress)

+{

+  if (hi2c->Mode == HAL_I2C_MODE_MASTER)

+  {

+    /* Process Locked */

+    __HAL_LOCK(hi2c);

+

+    /* Disable Interrupts */

+    I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT);

+    I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);

+

+    /* Set State at HAL_I2C_STATE_ABORT */

+    hi2c->State = HAL_I2C_STATE_ABORT;

+

+    /* Set NBYTES to 1 to generate a dummy read on I2C peripheral */

+    /* Set AUTOEND mode, this will generate a NACK then STOP condition to abort the current transfer */

+    I2C_TransferConfig(hi2c, DevAddress, 1, I2C_AUTOEND_MODE, I2C_GENERATE_STOP);

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Note : The I2C interrupts must be enabled after unlocking current process

+              to avoid the risk of I2C interrupt handle execution before current

+              process unlock */

+    I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT);

+

+    return HAL_OK;

+  }

+  else

+  {

+    /* Wrong usage of abort function */

+    /* This function should be used only in case of abort monitored by master device */

+    return HAL_ERROR;

+  }

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup I2C_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks

+ * @{

+ */

+

+/**

+  * @brief  This function handles I2C event interrupt request.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @retval None

+  */

+void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c)

+{

+  /* Get current IT Flags and IT sources value */

+  uint32_t itflags   = READ_REG(hi2c->Instance->ISR);

+  uint32_t itsources = READ_REG(hi2c->Instance->CR1);

+

+  /* I2C events treatment -------------------------------------*/

+  if (hi2c->XferISR != NULL)

+  {

+    hi2c->XferISR(hi2c, itflags, itsources);

+  }

+}

+

+/**

+  * @brief  This function handles I2C error interrupt request.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @retval None

+  */

+void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c)

+{

+  uint32_t itflags   = READ_REG(hi2c->Instance->ISR);

+  uint32_t itsources = READ_REG(hi2c->Instance->CR1);

+  uint32_t tmperror;

+

+  /* I2C Bus error interrupt occurred ------------------------------------*/

+  if ((I2C_CHECK_FLAG(itflags, I2C_FLAG_BERR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET))

+  {

+    hi2c->ErrorCode |= HAL_I2C_ERROR_BERR;

+

+    /* Clear BERR flag */

+    __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR);

+  }

+

+  /* I2C Over-Run/Under-Run interrupt occurred ----------------------------------------*/

+  if ((I2C_CHECK_FLAG(itflags, I2C_FLAG_OVR) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET))

+  {

+    hi2c->ErrorCode |= HAL_I2C_ERROR_OVR;

+

+    /* Clear OVR flag */

+    __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR);

+  }

+

+  /* I2C Arbitration Loss error interrupt occurred -------------------------------------*/

+  if ((I2C_CHECK_FLAG(itflags, I2C_FLAG_ARLO) != RESET) && (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET))

+  {

+    hi2c->ErrorCode |= HAL_I2C_ERROR_ARLO;

+

+    /* Clear ARLO flag */

+    __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO);

+  }

+

+  /* Store current volatile hi2c->ErrorCode, misra rule */

+  tmperror = hi2c->ErrorCode;

+

+  /* Call the Error Callback in case of Error detected */

+  if ((tmperror & (HAL_I2C_ERROR_BERR | HAL_I2C_ERROR_OVR | HAL_I2C_ERROR_ARLO)) !=  HAL_I2C_ERROR_NONE)

+  {

+    I2C_ITError(hi2c, tmperror);

+  }

+}

+

+/**

+  * @brief  Master Tx Transfer completed callback.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @retval None

+  */

+__weak void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hi2c);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_I2C_MasterTxCpltCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Master Rx Transfer completed callback.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @retval None

+  */

+__weak void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hi2c);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_I2C_MasterRxCpltCallback could be implemented in the user file

+   */

+}

+

+/** @brief  Slave Tx Transfer completed callback.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @retval None

+  */

+__weak void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hi2c);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_I2C_SlaveTxCpltCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Slave Rx Transfer completed callback.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @retval None

+  */

+__weak void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hi2c);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_I2C_SlaveRxCpltCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Slave Address Match callback.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  TransferDirection Master request Transfer Direction (Write/Read), value of @ref I2C_XFERDIRECTION

+  * @param  AddrMatchCode Address Match Code

+  * @retval None

+  */

+__weak void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hi2c);

+  UNUSED(TransferDirection);

+  UNUSED(AddrMatchCode);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_I2C_AddrCallback() could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Listen Complete callback.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @retval None

+  */

+__weak void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hi2c);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_I2C_ListenCpltCallback() could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Memory Tx Transfer completed callback.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @retval None

+  */

+__weak void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hi2c);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_I2C_MemTxCpltCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Memory Rx Transfer completed callback.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @retval None

+  */

+__weak void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hi2c);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_I2C_MemRxCpltCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  I2C error callback.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @retval None

+  */

+__weak void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hi2c);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_I2C_ErrorCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  I2C abort callback.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @retval None

+  */

+__weak void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hi2c);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_I2C_AbortCpltCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup I2C_Exported_Functions_Group3 Peripheral State, Mode and Error functions

+ *  @brief   Peripheral State, Mode and Error functions

+ *

+@verbatim

+ ===============================================================================

+            ##### Peripheral State, Mode and Error functions #####

+ ===============================================================================

+    [..]

+    This subsection permit to get in run-time the status of the peripheral

+    and the data flow.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Return the I2C handle state.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @retval HAL state

+  */

+HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c)

+{

+  /* Return I2C handle state */

+  return hi2c->State;

+}

+

+/**

+  * @brief  Returns the I2C Master, Slave, Memory or no mode.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *         the configuration information for I2C module

+  * @retval HAL mode

+  */

+HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c)

+{

+  return hi2c->Mode;

+}

+

+/**

+* @brief  Return the I2C error code.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *              the configuration information for the specified I2C.

+* @retval I2C Error Code

+*/

+uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c)

+{

+  return hi2c->ErrorCode;

+}

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/** @addtogroup I2C_Private_Functions

+  * @{

+  */

+

+/**

+  * @brief  Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with Interrupt.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  ITFlags Interrupt flags to handle.

+  * @param  ITSources Interrupt sources enabled.

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)

+{

+  uint16_t devaddress;

+  uint32_t tmpITFlags = ITFlags;

+

+  /* Process Locked */

+  __HAL_LOCK(hi2c);

+

+  if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET))

+  {

+    /* Clear NACK Flag */

+    __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);

+

+    /* Set corresponding Error Code */

+    /* No need to generate STOP, it is automatically done */

+    /* Error callback will be send during stop flag treatment */

+    hi2c->ErrorCode |= HAL_I2C_ERROR_AF;

+

+    /* Flush TX register */

+    I2C_Flush_TXDR(hi2c);

+  }

+  else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_RXNE) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_RXI) != RESET))

+  {

+    /* Remove RXNE flag on temporary variable as read done */

+    tmpITFlags &= ~I2C_FLAG_RXNE;

+

+    /* Read data from RXDR */

+    *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;

+

+    /* Increment Buffer pointer */

+    hi2c->pBuffPtr++;

+

+    hi2c->XferSize--;

+    hi2c->XferCount--;

+  }

+  else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TXIS) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TXI) != RESET))

+  {

+    /* Write data to TXDR */

+    hi2c->Instance->TXDR = *hi2c->pBuffPtr;

+

+    /* Increment Buffer pointer */

+    hi2c->pBuffPtr++;

+

+    hi2c->XferSize--;

+    hi2c->XferCount--;

+  }

+  else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TCR) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET))

+  {

+    if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U))

+    {

+      devaddress = (uint16_t)(hi2c->Instance->CR2 & I2C_CR2_SADD);

+

+      if (hi2c->XferCount > MAX_NBYTE_SIZE)

+      {

+        hi2c->XferSize = MAX_NBYTE_SIZE;

+        I2C_TransferConfig(hi2c, devaddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);

+      }

+      else

+      {

+        hi2c->XferSize = hi2c->XferCount;

+        if (hi2c->XferOptions != I2C_NO_OPTION_FRAME)

+        {

+          I2C_TransferConfig(hi2c, devaddress, (uint8_t)hi2c->XferSize, hi2c->XferOptions, I2C_NO_STARTSTOP);

+        }

+        else

+        {

+          I2C_TransferConfig(hi2c, devaddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);

+        }

+      }

+    }

+    else

+    {

+      /* Call TxCpltCallback() if no stop mode is set */

+      if (I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE)

+      {

+        /* Call I2C Master Sequential complete process */

+        I2C_ITMasterSeqCplt(hi2c);

+      }

+      else

+      {

+        /* Wrong size Status regarding TCR flag event */

+        /* Call the corresponding callback to inform upper layer of End of Transfer */

+        I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE);

+      }

+    }

+  }

+  else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TC) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET))

+  {

+    if (hi2c->XferCount == 0U)

+    {

+      if (I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE)

+      {

+        /* Generate a stop condition in case of no transfer option */

+        if (hi2c->XferOptions == I2C_NO_OPTION_FRAME)

+        {

+          /* Generate Stop */

+          hi2c->Instance->CR2 |= I2C_CR2_STOP;

+        }

+        else

+        {

+          /* Call I2C Master Sequential complete process */

+          I2C_ITMasterSeqCplt(hi2c);

+        }

+      }

+    }

+    else

+    {

+      /* Wrong size Status regarding TC flag event */

+      /* Call the corresponding callback to inform upper layer of End of Transfer */

+      I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE);

+    }

+  }

+  else

+  {

+    /* Nothing to do */

+  }

+

+  if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET))

+  {

+    /* Call I2C Master complete process */

+    I2C_ITMasterCplt(hi2c, tmpITFlags);

+  }

+

+  /* Process Unlocked */

+  __HAL_UNLOCK(hi2c);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Interrupt Sub-Routine which handle the Interrupt Flags Slave Mode with Interrupt.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  ITFlags Interrupt flags to handle.

+  * @param  ITSources Interrupt sources enabled.

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)

+{

+  uint32_t tmpoptions = hi2c->XferOptions;

+  uint32_t tmpITFlags = ITFlags;

+

+  /* Process locked */

+  __HAL_LOCK(hi2c);

+

+  if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET))

+  {

+    /* Check that I2C transfer finished */

+    /* if yes, normal use case, a NACK is sent by the MASTER when Transfer is finished */

+    /* Mean XferCount == 0*/

+    /* So clear Flag NACKF only */

+    if (hi2c->XferCount == 0U)

+    {

+      if ((hi2c->State == HAL_I2C_STATE_LISTEN) && (tmpoptions == I2C_FIRST_AND_LAST_FRAME)) /* Same action must be done for (tmpoptions == I2C_LAST_FRAME) which removed for Warning[Pa134]: left and right operands are identical */

+      {

+        /* Call I2C Listen complete process */

+        I2C_ITListenCplt(hi2c, tmpITFlags);

+      }

+      else if ((hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) && (tmpoptions != I2C_NO_OPTION_FRAME))

+      {

+        /* Clear NACK Flag */

+        __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);

+

+        /* Flush TX register */

+        I2C_Flush_TXDR(hi2c);

+

+        /* Last Byte is Transmitted */

+        /* Call I2C Slave Sequential complete process */

+        I2C_ITSlaveSeqCplt(hi2c);

+      }

+      else

+      {

+        /* Clear NACK Flag */

+        __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);

+      }

+    }

+    else

+    {

+      /* if no, error use case, a Non-Acknowledge of last Data is generated by the MASTER*/

+      /* Clear NACK Flag */

+      __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);

+

+      /* Set ErrorCode corresponding to a Non-Acknowledge */

+      hi2c->ErrorCode |= HAL_I2C_ERROR_AF;

+

+      if ((tmpoptions == I2C_FIRST_FRAME) || (tmpoptions == I2C_NEXT_FRAME))

+      {

+        /* Call the corresponding callback to inform upper layer of End of Transfer */

+        I2C_ITError(hi2c, hi2c->ErrorCode);

+      }

+    }

+  }

+  else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_RXNE) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_RXI) != RESET))

+  {

+    if (hi2c->XferCount > 0U)

+    {

+      /* Remove RXNE flag on temporary variable as read done */

+      tmpITFlags &= ~I2C_FLAG_RXNE;

+

+      /* Read data from RXDR */

+      *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;

+

+      /* Increment Buffer pointer */

+      hi2c->pBuffPtr++;

+

+      hi2c->XferSize--;

+      hi2c->XferCount--;

+    }

+

+    if ((hi2c->XferCount == 0U) && \

+        (tmpoptions != I2C_NO_OPTION_FRAME))

+    {

+      /* Call I2C Slave Sequential complete process */

+      I2C_ITSlaveSeqCplt(hi2c);

+    }

+  }

+  else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_ADDR) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_ADDRI) != RESET))

+  {

+    I2C_ITAddrCplt(hi2c, tmpITFlags);

+  }

+  else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TXIS) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TXI) != RESET))

+  {

+    /* Write data to TXDR only if XferCount not reach "0" */

+    /* A TXIS flag can be set, during STOP treatment      */

+    /* Check if all Datas have already been sent */

+    /* If it is the case, this last write in TXDR is not sent, correspond to a dummy TXIS event */

+    if (hi2c->XferCount > 0U)

+    {

+      /* Write data to TXDR */

+      hi2c->Instance->TXDR = *hi2c->pBuffPtr;

+

+      /* Increment Buffer pointer */

+      hi2c->pBuffPtr++;

+

+      hi2c->XferCount--;

+      hi2c->XferSize--;

+    }

+    else

+    {

+      if ((tmpoptions == I2C_NEXT_FRAME) || (tmpoptions == I2C_FIRST_FRAME))

+      {

+        /* Last Byte is Transmitted */

+        /* Call I2C Slave Sequential complete process */

+        I2C_ITSlaveSeqCplt(hi2c);

+      }

+    }

+  }

+  else

+  {

+    /* Nothing to do */

+  }

+

+  /* Check if STOPF is set */

+  if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET))

+  {

+    /* Call I2C Slave complete process */

+    I2C_ITSlaveCplt(hi2c, tmpITFlags);

+  }

+

+  /* Process Unlocked */

+  __HAL_UNLOCK(hi2c);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with DMA.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  ITFlags Interrupt flags to handle.

+  * @param  ITSources Interrupt sources enabled.

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef I2C_Master_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)

+{

+  uint16_t devaddress;

+  uint32_t xfermode;

+

+  /* Process Locked */

+  __HAL_LOCK(hi2c);

+

+  if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET))

+  {

+    /* Clear NACK Flag */

+    __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);

+

+    /* Set corresponding Error Code */

+    hi2c->ErrorCode |= HAL_I2C_ERROR_AF;

+

+    /* No need to generate STOP, it is automatically done */

+    /* But enable STOP interrupt, to treat it */

+    /* Error callback will be send during stop flag treatment */

+    I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT);

+

+    /* Flush TX register */

+    I2C_Flush_TXDR(hi2c);

+  }

+  else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_TCR) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET))

+  {

+    /* Disable TC interrupt */

+    __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_TCI);

+

+    if (hi2c->XferCount != 0U)

+    {

+      /* Recover Slave address */

+      devaddress = (uint16_t)(hi2c->Instance->CR2 & I2C_CR2_SADD);

+

+      /* Prepare the new XferSize to transfer */

+      if (hi2c->XferCount > MAX_NBYTE_SIZE)

+      {

+        hi2c->XferSize = MAX_NBYTE_SIZE;

+        xfermode = I2C_RELOAD_MODE;

+      }

+      else

+      {

+        hi2c->XferSize = hi2c->XferCount;

+        if (hi2c->XferOptions != I2C_NO_OPTION_FRAME)

+        {

+          xfermode = hi2c->XferOptions;

+        }

+        else

+        {

+          xfermode = I2C_AUTOEND_MODE;

+        }

+      }

+

+      /* Set the new XferSize in Nbytes register */

+      I2C_TransferConfig(hi2c, devaddress, (uint8_t)hi2c->XferSize, xfermode, I2C_NO_STARTSTOP);

+

+      /* Update XferCount value */

+      hi2c->XferCount -= hi2c->XferSize;

+

+      /* Enable DMA Request */

+      if (hi2c->State == HAL_I2C_STATE_BUSY_RX)

+      {

+        hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;

+      }

+      else

+      {

+        hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;

+      }

+    }

+    else

+    {

+      /* Call TxCpltCallback() if no stop mode is set */

+      if (I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE)

+      {

+        /* Call I2C Master Sequential complete process */

+        I2C_ITMasterSeqCplt(hi2c);

+      }

+      else

+      {

+        /* Wrong size Status regarding TCR flag event */

+        /* Call the corresponding callback to inform upper layer of End of Transfer */

+        I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE);

+      }

+    }

+  }

+  else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_TC) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET))

+  {

+    if (hi2c->XferCount == 0U)

+    {

+      if (I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE)

+      {

+        /* Generate a stop condition in case of no transfer option */

+        if (hi2c->XferOptions == I2C_NO_OPTION_FRAME)

+        {

+          /* Generate Stop */

+          hi2c->Instance->CR2 |= I2C_CR2_STOP;

+        }

+        else

+        {

+          /* Call I2C Master Sequential complete process */

+          I2C_ITMasterSeqCplt(hi2c);

+        }

+      }

+    }

+    else

+    {

+      /* Wrong size Status regarding TC flag event */

+      /* Call the corresponding callback to inform upper layer of End of Transfer */

+      I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE);

+    }

+  }

+  else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET))

+  {

+    /* Call I2C Master complete process */

+    I2C_ITMasterCplt(hi2c, ITFlags);

+  }

+  else

+  {

+    /* Nothing to do */

+  }

+

+  /* Process Unlocked */

+  __HAL_UNLOCK(hi2c);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Interrupt Sub-Routine which handle the Interrupt Flags Slave Mode with DMA.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  ITFlags Interrupt flags to handle.

+  * @param  ITSources Interrupt sources enabled.

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources)

+{

+  uint32_t tmpoptions = hi2c->XferOptions;

+  uint32_t treatdmanack = 0U;

+

+  /* Process locked */

+  __HAL_LOCK(hi2c);

+

+  if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET))

+  {

+    /* Check that I2C transfer finished */

+    /* if yes, normal use case, a NACK is sent by the MASTER when Transfer is finished */

+    /* Mean XferCount == 0 */

+    /* So clear Flag NACKF only */

+    if ((I2C_CHECK_IT_SOURCE(ITSources, I2C_CR1_TXDMAEN) != RESET) ||

+        (I2C_CHECK_IT_SOURCE(ITSources, I2C_CR1_RXDMAEN) != RESET))

+    {

+      /* Split check of hdmarx, for MISRA compliance */

+      if (hi2c->hdmarx != NULL)

+      {

+        if (I2C_CHECK_IT_SOURCE(ITSources, I2C_CR1_RXDMAEN) != RESET)

+        {

+          if (__HAL_DMA_GET_COUNTER(hi2c->hdmarx) == 0U)

+          {

+            treatdmanack = 1U;

+          }

+        }

+      }

+

+      /* Split check of hdmatx, for MISRA compliance  */

+      if (hi2c->hdmatx != NULL)

+      {

+        if (I2C_CHECK_IT_SOURCE(ITSources, I2C_CR1_TXDMAEN) != RESET)

+        {

+          if (__HAL_DMA_GET_COUNTER(hi2c->hdmatx) == 0U)

+          {

+            treatdmanack = 1U;

+          }

+        }

+      }

+

+      if (treatdmanack == 1U)

+      {

+        if ((hi2c->State == HAL_I2C_STATE_LISTEN) && (tmpoptions == I2C_FIRST_AND_LAST_FRAME)) /* Same action must be done for (tmpoptions == I2C_LAST_FRAME) which removed for Warning[Pa134]: left and right operands are identical */

+        {

+          /* Call I2C Listen complete process */

+          I2C_ITListenCplt(hi2c, ITFlags);

+        }

+        else if ((hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) && (tmpoptions != I2C_NO_OPTION_FRAME))

+        {

+          /* Clear NACK Flag */

+          __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);

+

+          /* Flush TX register */

+          I2C_Flush_TXDR(hi2c);

+

+          /* Last Byte is Transmitted */

+          /* Call I2C Slave Sequential complete process */

+          I2C_ITSlaveSeqCplt(hi2c);

+        }

+        else

+        {

+          /* Clear NACK Flag */

+          __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);

+        }

+      }

+      else

+      {

+        /* if no, error use case, a Non-Acknowledge of last Data is generated by the MASTER*/

+        /* Clear NACK Flag */

+        __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);

+

+        /* Set ErrorCode corresponding to a Non-Acknowledge */

+        hi2c->ErrorCode |= HAL_I2C_ERROR_AF;

+

+        if ((tmpoptions == I2C_FIRST_FRAME) || (tmpoptions == I2C_NEXT_FRAME))

+        {

+          /* Call the corresponding callback to inform upper layer of End of Transfer */

+          I2C_ITError(hi2c, hi2c->ErrorCode);

+        }

+      }

+    }

+    else

+    {

+      /* Only Clear NACK Flag, no DMA treatment is pending */

+      __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);

+    }

+  }

+  else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_ADDR) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_ADDRI) != RESET))

+  {

+    I2C_ITAddrCplt(hi2c, ITFlags);

+  }

+  else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET))

+  {

+    /* Call I2C Slave complete process */

+    I2C_ITSlaveCplt(hi2c, ITFlags);

+  }

+  else

+  {

+    /* Nothing to do */

+  }

+

+  /* Process Unlocked */

+  __HAL_UNLOCK(hi2c);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Master sends target device address followed by internal memory address for write request.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  DevAddress Target device address: The device 7 bits address value

+  *         in datasheet must be shifted to the left before calling the interface

+  * @param  MemAddress Internal memory address

+  * @param  MemAddSize Size of internal memory address

+  * @param  Timeout Timeout duration

+  * @param  Tickstart Tick start value

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart)

+{

+  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)MemAddSize, I2C_RELOAD_MODE, I2C_GENERATE_START_WRITE);

+

+  /* Wait until TXIS flag is set */

+  if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)

+  {

+    return HAL_ERROR;

+  }

+

+  /* If Memory address size is 8Bit */

+  if (MemAddSize == I2C_MEMADD_SIZE_8BIT)

+  {

+    /* Send Memory Address */

+    hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress);

+  }

+  /* If Memory address size is 16Bit */

+  else

+  {

+    /* Send MSB of Memory Address */

+    hi2c->Instance->TXDR = I2C_MEM_ADD_MSB(MemAddress);

+

+    /* Wait until TXIS flag is set */

+    if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)

+    {

+      return HAL_ERROR;

+    }

+

+    /* Send LSB of Memory Address */

+    hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress);

+  }

+

+  /* Wait until TCR flag is set */

+  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, Tickstart) != HAL_OK)

+  {

+    return HAL_ERROR;

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Master sends target device address followed by internal memory address for read request.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  DevAddress Target device address: The device 7 bits address value

+  *         in datasheet must be shifted to the left before calling the interface

+  * @param  MemAddress Internal memory address

+  * @param  MemAddSize Size of internal memory address

+  * @param  Timeout Timeout duration

+  * @param  Tickstart Tick start value

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout, uint32_t Tickstart)

+{

+  I2C_TransferConfig(hi2c, DevAddress, (uint8_t)MemAddSize, I2C_SOFTEND_MODE, I2C_GENERATE_START_WRITE);

+

+  /* Wait until TXIS flag is set */

+  if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)

+  {

+    return HAL_ERROR;

+  }

+

+  /* If Memory address size is 8Bit */

+  if (MemAddSize == I2C_MEMADD_SIZE_8BIT)

+  {

+    /* Send Memory Address */

+    hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress);

+  }

+  /* If Memory address size is 16Bit */

+  else

+  {

+    /* Send MSB of Memory Address */

+    hi2c->Instance->TXDR = I2C_MEM_ADD_MSB(MemAddress);

+

+    /* Wait until TXIS flag is set */

+    if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)

+    {

+      return HAL_ERROR;

+    }

+

+    /* Send LSB of Memory Address */

+    hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress);

+  }

+

+  /* Wait until TC flag is set */

+  if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TC, RESET, Timeout, Tickstart) != HAL_OK)

+  {

+    return HAL_ERROR;

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  I2C Address complete process callback.

+  * @param  hi2c I2C handle.

+  * @param  ITFlags Interrupt flags to handle.

+  * @retval None

+  */

+static void I2C_ITAddrCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags)

+{

+  uint8_t transferdirection;

+  uint16_t slaveaddrcode;

+  uint16_t ownadd1code;

+  uint16_t ownadd2code;

+

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(ITFlags);

+

+  /* In case of Listen state, need to inform upper layer of address match code event */

+  if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)

+  {

+    transferdirection = I2C_GET_DIR(hi2c);

+    slaveaddrcode     = I2C_GET_ADDR_MATCH(hi2c);

+    ownadd1code       = I2C_GET_OWN_ADDRESS1(hi2c);

+    ownadd2code       = I2C_GET_OWN_ADDRESS2(hi2c);

+

+    /* If 10bits addressing mode is selected */

+    if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)

+    {

+      if ((slaveaddrcode & SlaveAddr_MSK) == ((ownadd1code >> SlaveAddr_SHIFT) & SlaveAddr_MSK))

+      {

+        slaveaddrcode = ownadd1code;

+        hi2c->AddrEventCount++;

+        if (hi2c->AddrEventCount == 2U)

+        {

+          /* Reset Address Event counter */

+          hi2c->AddrEventCount = 0U;

+

+          /* Clear ADDR flag */

+          __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);

+

+          /* Process Unlocked */

+          __HAL_UNLOCK(hi2c);

+

+          /* Call Slave Addr callback */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+          hi2c->AddrCallback(hi2c, transferdirection, slaveaddrcode);

+#else

+          HAL_I2C_AddrCallback(hi2c, transferdirection, slaveaddrcode);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+        }

+      }

+      else

+      {

+        slaveaddrcode = ownadd2code;

+

+        /* Disable ADDR Interrupts */

+        I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT);

+

+        /* Process Unlocked */

+        __HAL_UNLOCK(hi2c);

+

+        /* Call Slave Addr callback */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+        hi2c->AddrCallback(hi2c, transferdirection, slaveaddrcode);

+#else

+        HAL_I2C_AddrCallback(hi2c, transferdirection, slaveaddrcode);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+      }

+    }

+    /* else 7 bits addressing mode is selected */

+    else

+    {

+      /* Disable ADDR Interrupts */

+      I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT);

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      /* Call Slave Addr callback */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+      hi2c->AddrCallback(hi2c, transferdirection, slaveaddrcode);

+#else

+      HAL_I2C_AddrCallback(hi2c, transferdirection, slaveaddrcode);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+    }

+  }

+  /* Else clear address flag only */

+  else

+  {

+    /* Clear ADDR flag */

+    __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+  }

+}

+

+/**

+  * @brief  I2C Master sequential complete process.

+  * @param  hi2c I2C handle.

+  * @retval None

+  */

+static void I2C_ITMasterSeqCplt(I2C_HandleTypeDef *hi2c)

+{

+  /* Reset I2C handle mode */

+  hi2c->Mode = HAL_I2C_MODE_NONE;

+

+  /* No Generate Stop, to permit restart mode */

+  /* The stop will be done at the end of transfer, when I2C_AUTOEND_MODE enable */

+  if (hi2c->State == HAL_I2C_STATE_BUSY_TX)

+  {

+    hi2c->State         = HAL_I2C_STATE_READY;

+    hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX;

+    hi2c->XferISR       = NULL;

+

+    /* Disable Interrupts */

+    I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Call the corresponding callback to inform upper layer of End of Transfer */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+    hi2c->MasterTxCpltCallback(hi2c);

+#else

+    HAL_I2C_MasterTxCpltCallback(hi2c);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+  }

+  /* hi2c->State == HAL_I2C_STATE_BUSY_RX */

+  else

+  {

+    hi2c->State         = HAL_I2C_STATE_READY;

+    hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX;

+    hi2c->XferISR       = NULL;

+

+    /* Disable Interrupts */

+    I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT);

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Call the corresponding callback to inform upper layer of End of Transfer */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+    hi2c->MasterRxCpltCallback(hi2c);

+#else

+    HAL_I2C_MasterRxCpltCallback(hi2c);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+  }

+}

+

+/**

+  * @brief  I2C Slave sequential complete process.

+  * @param  hi2c I2C handle.

+  * @retval None

+  */

+static void I2C_ITSlaveSeqCplt(I2C_HandleTypeDef *hi2c)

+{

+  /* Reset I2C handle mode */

+  hi2c->Mode = HAL_I2C_MODE_NONE;

+

+  if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN)

+  {

+    /* Remove HAL_I2C_STATE_SLAVE_BUSY_TX, keep only HAL_I2C_STATE_LISTEN */

+    hi2c->State         = HAL_I2C_STATE_LISTEN;

+    hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX;

+

+    /* Disable Interrupts */

+    I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Call the corresponding callback to inform upper layer of End of Transfer */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+    hi2c->SlaveTxCpltCallback(hi2c);

+#else

+    HAL_I2C_SlaveTxCpltCallback(hi2c);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+  }

+

+  else if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN)

+  {

+    /* Remove HAL_I2C_STATE_SLAVE_BUSY_RX, keep only HAL_I2C_STATE_LISTEN */

+    hi2c->State         = HAL_I2C_STATE_LISTEN;

+    hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX;

+

+    /* Disable Interrupts */

+    I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT);

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Call the corresponding callback to inform upper layer of End of Transfer */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+    hi2c->SlaveRxCpltCallback(hi2c);

+#else

+    HAL_I2C_SlaveRxCpltCallback(hi2c);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+  }

+  else

+  {

+    /* Nothing to do */

+  }

+}

+

+/**

+  * @brief  I2C Master complete process.

+  * @param  hi2c I2C handle.

+  * @param  ITFlags Interrupt flags to handle.

+  * @retval None

+  */

+static void I2C_ITMasterCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags)

+{

+  uint32_t tmperror;

+

+  /* Clear STOP Flag */

+  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);

+

+  /* Clear Configuration Register 2 */

+  I2C_RESET_CR2(hi2c);

+

+  /* Reset handle parameters */

+  hi2c->PreviousState = I2C_STATE_NONE;

+  hi2c->XferISR       = NULL;

+  hi2c->XferOptions   = I2C_NO_OPTION_FRAME;

+

+  if (I2C_CHECK_FLAG(ITFlags, I2C_FLAG_AF) != RESET)

+  {

+    /* Clear NACK Flag */

+    __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);

+

+    /* Set acknowledge error code */

+    hi2c->ErrorCode |= HAL_I2C_ERROR_AF;

+  }

+

+  /* Flush TX register */

+  I2C_Flush_TXDR(hi2c);

+

+  /* Disable Interrupts */

+  I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT | I2C_XFER_RX_IT);

+

+  /* Store current volatile hi2c->ErrorCode, misra rule */

+  tmperror = hi2c->ErrorCode;

+

+  /* Call the corresponding callback to inform upper layer of End of Transfer */

+  if ((hi2c->State == HAL_I2C_STATE_ABORT) || (tmperror != HAL_I2C_ERROR_NONE))

+  {

+    /* Call the corresponding callback to inform upper layer of End of Transfer */

+    I2C_ITError(hi2c, hi2c->ErrorCode);

+  }

+  /* hi2c->State == HAL_I2C_STATE_BUSY_TX */

+  else if (hi2c->State == HAL_I2C_STATE_BUSY_TX)

+  {

+    hi2c->State = HAL_I2C_STATE_READY;

+

+    if (hi2c->Mode == HAL_I2C_MODE_MEM)

+    {

+      hi2c->Mode = HAL_I2C_MODE_NONE;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      /* Call the corresponding callback to inform upper layer of End of Transfer */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+      hi2c->MemTxCpltCallback(hi2c);

+#else

+      HAL_I2C_MemTxCpltCallback(hi2c);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+    }

+    else

+    {

+      hi2c->Mode = HAL_I2C_MODE_NONE;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      /* Call the corresponding callback to inform upper layer of End of Transfer */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+      hi2c->MasterTxCpltCallback(hi2c);

+#else

+      HAL_I2C_MasterTxCpltCallback(hi2c);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+    }

+  }

+  /* hi2c->State == HAL_I2C_STATE_BUSY_RX */

+  else if (hi2c->State == HAL_I2C_STATE_BUSY_RX)

+  {

+    hi2c->State = HAL_I2C_STATE_READY;

+

+    if (hi2c->Mode == HAL_I2C_MODE_MEM)

+    {

+      hi2c->Mode = HAL_I2C_MODE_NONE;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      /* Call the corresponding callback to inform upper layer of End of Transfer */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+      hi2c->MemRxCpltCallback(hi2c);

+#else

+      HAL_I2C_MemRxCpltCallback(hi2c);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+    }

+    else

+    {

+      hi2c->Mode = HAL_I2C_MODE_NONE;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      /* Call the corresponding callback to inform upper layer of End of Transfer */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+      hi2c->MasterRxCpltCallback(hi2c);

+#else

+      HAL_I2C_MasterRxCpltCallback(hi2c);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+    }

+  }

+  else

+  {

+    /* Nothing to do */

+  }

+}

+

+/**

+  * @brief  I2C Slave complete process.

+  * @param  hi2c I2C handle.

+  * @param  ITFlags Interrupt flags to handle.

+  * @retval None

+  */

+static void I2C_ITSlaveCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags)

+{

+  uint32_t tmpcr1value = READ_REG(hi2c->Instance->CR1);

+  uint32_t tmpITFlags = ITFlags;

+

+  /* Clear STOP Flag */

+  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);

+

+  /* Disable all interrupts */

+  I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_TX_IT | I2C_XFER_RX_IT);

+

+  /* Disable Address Acknowledge */

+  hi2c->Instance->CR2 |= I2C_CR2_NACK;

+

+  /* Clear Configuration Register 2 */

+  I2C_RESET_CR2(hi2c);

+

+  /* Flush TX register */

+  I2C_Flush_TXDR(hi2c);

+

+  /* If a DMA is ongoing, Update handle size context */

+  if (I2C_CHECK_IT_SOURCE(tmpcr1value, I2C_CR1_TXDMAEN) != RESET)

+  {

+    if (hi2c->hdmatx != NULL)

+    {

+      hi2c->XferCount = (uint16_t)__HAL_DMA_GET_COUNTER(hi2c->hdmatx);

+    }

+  }

+  else if (I2C_CHECK_IT_SOURCE(tmpcr1value, I2C_CR1_RXDMAEN) != RESET)

+  {

+    if (hi2c->hdmarx != NULL)

+    {

+      hi2c->XferCount = (uint16_t)__HAL_DMA_GET_COUNTER(hi2c->hdmarx);

+    }

+  }

+  else

+  {

+    /* Do nothing */

+  }

+

+  /* Store Last receive data if any */

+  if (I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_RXNE) != RESET)

+  {

+    /* Remove RXNE flag on temporary variable as read done */

+    tmpITFlags &= ~I2C_FLAG_RXNE;

+

+    /* Read data from RXDR */

+    *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;

+

+    /* Increment Buffer pointer */

+    hi2c->pBuffPtr++;

+

+    if ((hi2c->XferSize > 0U))

+    {

+      hi2c->XferSize--;

+      hi2c->XferCount--;

+    }

+  }

+

+  /* All data are not transferred, so set error code accordingly */

+  if (hi2c->XferCount != 0U)

+  {

+    /* Set ErrorCode corresponding to a Non-Acknowledge */

+    hi2c->ErrorCode |= HAL_I2C_ERROR_AF;

+  }

+

+  hi2c->PreviousState = I2C_STATE_NONE;

+  hi2c->Mode = HAL_I2C_MODE_NONE;

+  hi2c->XferISR = NULL;

+

+  if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE)

+  {

+    /* Call the corresponding callback to inform upper layer of End of Transfer */

+    I2C_ITError(hi2c, hi2c->ErrorCode);

+

+    /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */

+    if (hi2c->State == HAL_I2C_STATE_LISTEN)

+    {

+      /* Call I2C Listen complete process */

+      I2C_ITListenCplt(hi2c, tmpITFlags);

+    }

+  }

+  else if (hi2c->XferOptions != I2C_NO_OPTION_FRAME)

+  {

+    /* Call the Sequential Complete callback, to inform upper layer of the end of Tranfer */

+    I2C_ITSlaveSeqCplt(hi2c);

+

+    hi2c->XferOptions = I2C_NO_OPTION_FRAME;

+    hi2c->State = HAL_I2C_STATE_READY;

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+    hi2c->ListenCpltCallback(hi2c);

+#else

+    HAL_I2C_ListenCpltCallback(hi2c);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+  }

+  /* Call the corresponding callback to inform upper layer of End of Transfer */

+  else if (hi2c->State == HAL_I2C_STATE_BUSY_RX)

+  {

+    hi2c->State = HAL_I2C_STATE_READY;

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Call the corresponding callback to inform upper layer of End of Transfer */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+    hi2c->SlaveRxCpltCallback(hi2c);

+#else

+    HAL_I2C_SlaveRxCpltCallback(hi2c);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+  }

+  else

+  {

+    hi2c->State = HAL_I2C_STATE_READY;

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Call the corresponding callback to inform upper layer of End of Transfer */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+    hi2c->SlaveTxCpltCallback(hi2c);

+#else

+    HAL_I2C_SlaveTxCpltCallback(hi2c);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+  }

+}

+

+/**

+  * @brief  I2C Listen complete process.

+  * @param  hi2c I2C handle.

+  * @param  ITFlags Interrupt flags to handle.

+  * @retval None

+  */

+static void I2C_ITListenCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags)

+{

+  /* Reset handle parameters */

+  hi2c->XferOptions = I2C_NO_OPTION_FRAME;

+  hi2c->PreviousState = I2C_STATE_NONE;

+  hi2c->State = HAL_I2C_STATE_READY;

+  hi2c->Mode = HAL_I2C_MODE_NONE;

+  hi2c->XferISR = NULL;

+

+  /* Store Last receive data if any */

+  if (I2C_CHECK_FLAG(ITFlags, I2C_FLAG_RXNE) != RESET)

+  {

+    /* Read data from RXDR */

+    *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;

+

+    /* Increment Buffer pointer */

+    hi2c->pBuffPtr++;

+

+    if ((hi2c->XferSize > 0U))

+    {

+      hi2c->XferSize--;

+      hi2c->XferCount--;

+

+      /* Set ErrorCode corresponding to a Non-Acknowledge */

+      hi2c->ErrorCode |= HAL_I2C_ERROR_AF;

+    }

+  }

+

+  /* Disable all Interrupts*/

+  I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT | I2C_XFER_TX_IT);

+

+  /* Clear NACK Flag */

+  __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);

+

+  /* Process Unlocked */

+  __HAL_UNLOCK(hi2c);

+

+  /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+  hi2c->ListenCpltCallback(hi2c);

+#else

+  HAL_I2C_ListenCpltCallback(hi2c);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  I2C interrupts error process.

+  * @param  hi2c I2C handle.

+  * @param  ErrorCode Error code to handle.

+  * @retval None

+  */

+static void I2C_ITError(I2C_HandleTypeDef *hi2c, uint32_t ErrorCode)

+{

+  HAL_I2C_StateTypeDef tmpstate = hi2c->State;

+

+  /* Reset handle parameters */

+  hi2c->Mode          = HAL_I2C_MODE_NONE;

+  hi2c->XferOptions   = I2C_NO_OPTION_FRAME;

+  hi2c->XferCount     = 0U;

+

+  /* Set new error code */

+  hi2c->ErrorCode |= ErrorCode;

+

+  /* Disable Interrupts */

+  if ((tmpstate == HAL_I2C_STATE_LISTEN)         ||

+      (tmpstate == HAL_I2C_STATE_BUSY_TX_LISTEN) ||

+      (tmpstate == HAL_I2C_STATE_BUSY_RX_LISTEN))

+  {

+    /* Disable all interrupts, except interrupts related to LISTEN state */

+    I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_TX_IT);

+

+    /* keep HAL_I2C_STATE_LISTEN if set */

+    hi2c->State         = HAL_I2C_STATE_LISTEN;

+    hi2c->PreviousState = I2C_STATE_NONE;

+    hi2c->XferISR       = I2C_Slave_ISR_IT;

+  }

+  else

+  {

+    /* Disable all interrupts */

+    I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT | I2C_XFER_TX_IT);

+

+    /* If state is an abort treatment on goind, don't change state */

+    /* This change will be do later */

+    if (hi2c->State != HAL_I2C_STATE_ABORT)

+    {

+      /* Set HAL_I2C_STATE_READY */

+      hi2c->State         = HAL_I2C_STATE_READY;

+    }

+    hi2c->PreviousState = I2C_STATE_NONE;

+    hi2c->XferISR       = NULL;

+  }

+

+  /* Abort DMA TX transfer if any */

+  if ((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN)

+  {

+    hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;

+

+    if (hi2c->hdmatx != NULL)

+    {

+      /* Set the I2C DMA Abort callback :

+       will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */

+      hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      /* Abort DMA TX */

+      if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK)

+      {

+        /* Call Directly XferAbortCallback function in case of error */

+        hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);

+      }

+    }

+  }

+  /* Abort DMA RX transfer if any */

+  else if ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN)

+  {

+    hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;

+

+    if (hi2c->hdmarx != NULL)

+    {

+      /* Set the I2C DMA Abort callback :

+        will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */

+      hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      /* Abort DMA RX */

+      if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK)

+      {

+        /* Call Directly hi2c->hdmarx->XferAbortCallback function in case of error */

+        hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);

+      }

+    }

+  }

+  else if (hi2c->State == HAL_I2C_STATE_ABORT)

+  {

+    hi2c->State = HAL_I2C_STATE_READY;

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Call the corresponding callback to inform upper layer of End of Transfer */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+    hi2c->AbortCpltCallback(hi2c);

+#else

+    HAL_I2C_AbortCpltCallback(hi2c);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+  }

+  else

+  {

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    /* Call the corresponding callback to inform upper layer of End of Transfer */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+    hi2c->ErrorCallback(hi2c);

+#else

+    HAL_I2C_ErrorCallback(hi2c);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+  }

+}

+

+/**

+  * @brief  I2C Tx data register flush process.

+  * @param  hi2c I2C handle.

+  * @retval None

+  */

+static void I2C_Flush_TXDR(I2C_HandleTypeDef *hi2c)

+{

+  /* If a pending TXIS flag is set */

+  /* Write a dummy data in TXDR to clear it */

+  if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) != RESET)

+  {

+    hi2c->Instance->TXDR = 0x00U;

+  }

+

+  /* Flush TX register if not empty */

+  if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) == RESET)

+  {

+    __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_TXE);

+  }

+}

+

+/**

+  * @brief  DMA I2C master transmit process complete callback.

+  * @param  hdma DMA handle

+  * @retval None

+  */

+static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma)

+{

+  I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */

+

+  /* Disable DMA Request */

+  hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;

+

+  /* If last transfer, enable STOP interrupt */

+  if (hi2c->XferCount == 0U)

+  {

+    /* Enable STOP interrupt */

+    I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT);

+  }

+  /* else prepare a new DMA transfer and enable TCReload interrupt */

+  else

+  {

+    /* Update Buffer pointer */

+    hi2c->pBuffPtr += hi2c->XferSize;

+

+    /* Set the XferSize to transfer */

+    if (hi2c->XferCount > MAX_NBYTE_SIZE)

+    {

+      hi2c->XferSize = MAX_NBYTE_SIZE;

+    }

+    else

+    {

+      hi2c->XferSize = hi2c->XferCount;

+    }

+

+    /* Enable the DMA channel */

+    if (HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize) != HAL_OK)

+    {

+      /* Call the corresponding callback to inform upper layer of End of Transfer */

+      I2C_ITError(hi2c, HAL_I2C_ERROR_DMA);

+    }

+    else

+    {

+      /* Enable TC interrupts */

+      I2C_Enable_IRQ(hi2c, I2C_XFER_RELOAD_IT);

+    }

+  }

+}

+

+/**

+  * @brief  DMA I2C slave transmit process complete callback.

+  * @param  hdma DMA handle

+  * @retval None

+  */

+static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma)

+{

+  I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */

+  uint32_t tmpoptions = hi2c->XferOptions;

+

+  if ((tmpoptions == I2C_NEXT_FRAME) || (tmpoptions == I2C_FIRST_FRAME))

+  {

+    /* Disable DMA Request */

+    hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;

+

+    /* Last Byte is Transmitted */

+    /* Call I2C Slave Sequential complete process */

+    I2C_ITSlaveSeqCplt(hi2c);

+  }

+  else

+  {

+    /* No specific action, Master fully manage the generation of STOP condition */

+    /* Mean that this generation can arrive at any time, at the end or during DMA process */

+    /* So STOP condition should be manage through Interrupt treatment */

+  }

+}

+

+/**

+  * @brief DMA I2C master receive process complete callback.

+  * @param  hdma DMA handle

+  * @retval None

+  */

+static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma)

+{

+  I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */

+

+  /* Disable DMA Request */

+  hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;

+

+  /* If last transfer, enable STOP interrupt */

+  if (hi2c->XferCount == 0U)

+  {

+    /* Enable STOP interrupt */

+    I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT);

+  }

+  /* else prepare a new DMA transfer and enable TCReload interrupt */

+  else

+  {

+    /* Update Buffer pointer */

+    hi2c->pBuffPtr += hi2c->XferSize;

+

+    /* Set the XferSize to transfer */

+    if (hi2c->XferCount > MAX_NBYTE_SIZE)

+    {

+      hi2c->XferSize = MAX_NBYTE_SIZE;

+    }

+    else

+    {

+      hi2c->XferSize = hi2c->XferCount;

+    }

+

+    /* Enable the DMA channel */

+    if (HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)hi2c->pBuffPtr, hi2c->XferSize) != HAL_OK)

+    {

+      /* Call the corresponding callback to inform upper layer of End of Transfer */

+      I2C_ITError(hi2c, HAL_I2C_ERROR_DMA);

+    }

+    else

+    {

+      /* Enable TC interrupts */

+      I2C_Enable_IRQ(hi2c, I2C_XFER_RELOAD_IT);

+    }

+  }

+}

+

+/**

+  * @brief  DMA I2C slave receive process complete callback.

+  * @param  hdma DMA handle

+  * @retval None

+  */

+static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma)

+{

+  I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */

+  uint32_t tmpoptions = hi2c->XferOptions;

+

+  if ((__HAL_DMA_GET_COUNTER(hi2c->hdmarx) == 0U) && \

+      (tmpoptions != I2C_NO_OPTION_FRAME))

+  {

+    /* Disable DMA Request */

+    hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;

+

+    /* Call I2C Slave Sequential complete process */

+    I2C_ITSlaveSeqCplt(hi2c);

+  }

+  else

+  {

+    /* No specific action, Master fully manage the generation of STOP condition */

+    /* Mean that this generation can arrive at any time, at the end or during DMA process */

+    /* So STOP condition should be manage through Interrupt treatment */

+  }

+}

+

+/**

+  * @brief  DMA I2C communication error callback.

+  * @param hdma DMA handle

+  * @retval None

+  */

+static void I2C_DMAError(DMA_HandleTypeDef *hdma)

+{

+  I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */

+

+  /* Disable Acknowledge */

+  hi2c->Instance->CR2 |= I2C_CR2_NACK;

+

+  /* Call the corresponding callback to inform upper layer of End of Transfer */

+  I2C_ITError(hi2c, HAL_I2C_ERROR_DMA);

+}

+

+/**

+  * @brief DMA I2C communication abort callback

+  *        (To be called at end of DMA Abort procedure).

+  * @param hdma DMA handle.

+  * @retval None

+  */

+static void I2C_DMAAbort(DMA_HandleTypeDef *hdma)

+{

+  I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */

+

+  /* Reset AbortCpltCallback */

+  hi2c->hdmatx->XferAbortCallback = NULL;

+  hi2c->hdmarx->XferAbortCallback = NULL;

+

+  /* Check if come from abort from user */

+  if (hi2c->State == HAL_I2C_STATE_ABORT)

+  {

+    hi2c->State = HAL_I2C_STATE_READY;

+

+    /* Call the corresponding callback to inform upper layer of End of Transfer */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+    hi2c->AbortCpltCallback(hi2c);

+#else

+    HAL_I2C_AbortCpltCallback(hi2c);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+  }

+  else

+  {

+    /* Call the corresponding callback to inform upper layer of End of Transfer */

+#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)

+    hi2c->ErrorCallback(hi2c);

+#else

+    HAL_I2C_ErrorCallback(hi2c);

+#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */

+  }

+}

+

+/**

+  * @brief  This function handles I2C Communication Timeout.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  Flag Specifies the I2C flag to check.

+  * @param  Status The new Flag status (SET or RESET).

+  * @param  Timeout Timeout duration

+  * @param  Tickstart Tick start value

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart)

+{

+  while (__HAL_I2C_GET_FLAG(hi2c, Flag) == Status)

+  {

+    /* Check for the Timeout */

+    if (Timeout != HAL_MAX_DELAY)

+    {

+      if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))

+      {

+        hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;

+        hi2c->State = HAL_I2C_STATE_READY;

+        hi2c->Mode = HAL_I2C_MODE_NONE;

+

+        /* Process Unlocked */

+        __HAL_UNLOCK(hi2c);

+        return HAL_ERROR;

+      }

+    }

+  }

+  return HAL_OK;

+}

+

+/**

+  * @brief  This function handles I2C Communication Timeout for specific usage of TXIS flag.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  Timeout Timeout duration

+  * @param  Tickstart Tick start value

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef I2C_WaitOnTXISFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)

+{

+  while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) == RESET)

+  {

+    /* Check if a NACK is detected */

+    if (I2C_IsAcknowledgeFailed(hi2c, Timeout, Tickstart) != HAL_OK)

+    {

+      return HAL_ERROR;

+    }

+

+    /* Check for the Timeout */

+    if (Timeout != HAL_MAX_DELAY)

+    {

+      if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))

+      {

+        hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;

+        hi2c->State = HAL_I2C_STATE_READY;

+        hi2c->Mode = HAL_I2C_MODE_NONE;

+

+        /* Process Unlocked */

+        __HAL_UNLOCK(hi2c);

+

+        return HAL_ERROR;

+      }

+    }

+  }

+  return HAL_OK;

+}

+

+/**

+  * @brief  This function handles I2C Communication Timeout for specific usage of STOP flag.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  Timeout Timeout duration

+  * @param  Tickstart Tick start value

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)

+{

+  while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET)

+  {

+    /* Check if a NACK is detected */

+    if (I2C_IsAcknowledgeFailed(hi2c, Timeout, Tickstart) != HAL_OK)

+    {

+      return HAL_ERROR;

+    }

+

+    /* Check for the Timeout */

+    if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))

+    {

+      hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;

+      hi2c->State = HAL_I2C_STATE_READY;

+      hi2c->Mode = HAL_I2C_MODE_NONE;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      return HAL_ERROR;

+    }

+  }

+  return HAL_OK;

+}

+

+/**

+  * @brief  This function handles I2C Communication Timeout for specific usage of RXNE flag.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  Timeout Timeout duration

+  * @param  Tickstart Tick start value

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)

+{

+  while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET)

+  {

+    /* Check if a NACK is detected */

+    if (I2C_IsAcknowledgeFailed(hi2c, Timeout, Tickstart) != HAL_OK)

+    {

+      return HAL_ERROR;

+    }

+

+    /* Check if a STOPF is detected */

+    if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET)

+    {

+      /* Check if an RXNE is pending */

+      /* Store Last receive data if any */

+      if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) && (hi2c->XferSize > 0U))

+      {

+        /* Return HAL_OK */

+        /* The Reading of data from RXDR will be done in caller function */

+        return HAL_OK;

+      }

+      else

+      {

+        /* Clear STOP Flag */

+        __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);

+

+        /* Clear Configuration Register 2 */

+        I2C_RESET_CR2(hi2c);

+

+        hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

+        hi2c->State = HAL_I2C_STATE_READY;

+        hi2c->Mode = HAL_I2C_MODE_NONE;

+

+        /* Process Unlocked */

+        __HAL_UNLOCK(hi2c);

+

+        return HAL_ERROR;

+      }

+    }

+

+    /* Check for the Timeout */

+    if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))

+    {

+      hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;

+      hi2c->State = HAL_I2C_STATE_READY;

+

+      /* Process Unlocked */

+      __HAL_UNLOCK(hi2c);

+

+      return HAL_ERROR;

+    }

+  }

+  return HAL_OK;

+}

+

+/**

+  * @brief  This function handles Acknowledge failed detection during an I2C Communication.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  Timeout Timeout duration

+  * @param  Tickstart Tick start value

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)

+{

+  if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)

+  {

+    /* Wait until STOP Flag is reset */

+    /* AutoEnd should be initiate after AF */

+    while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET)

+    {

+      /* Check for the Timeout */

+      if (Timeout != HAL_MAX_DELAY)

+      {

+        if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))

+        {

+          hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;

+          hi2c->State = HAL_I2C_STATE_READY;

+          hi2c->Mode = HAL_I2C_MODE_NONE;

+

+          /* Process Unlocked */

+          __HAL_UNLOCK(hi2c);

+

+          return HAL_ERROR;

+        }

+      }

+    }

+

+    /* Clear NACKF Flag */

+    __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);

+

+    /* Clear STOP Flag */

+    __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);

+

+    /* Flush TX register */

+    I2C_Flush_TXDR(hi2c);

+

+    /* Clear Configuration Register 2 */

+    I2C_RESET_CR2(hi2c);

+

+    hi2c->ErrorCode |= HAL_I2C_ERROR_AF;

+    hi2c->State = HAL_I2C_STATE_READY;

+    hi2c->Mode = HAL_I2C_MODE_NONE;

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    return HAL_ERROR;

+  }

+  return HAL_OK;

+}

+

+/**

+  * @brief  Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set).

+  * @param  hi2c I2C handle.

+  * @param  DevAddress Specifies the slave address to be programmed.

+  * @param  Size Specifies the number of bytes to be programmed.

+  *   This parameter must be a value between 0 and 255.

+  * @param  Mode New state of the I2C START condition generation.

+  *   This parameter can be one of the following values:

+  *     @arg @ref I2C_RELOAD_MODE Enable Reload mode .

+  *     @arg @ref I2C_AUTOEND_MODE Enable Automatic end mode.

+  *     @arg @ref I2C_SOFTEND_MODE Enable Software end mode.

+  * @param  Request New state of the I2C START condition generation.

+  *   This parameter can be one of the following values:

+  *     @arg @ref I2C_NO_STARTSTOP Don't Generate stop and start condition.

+  *     @arg @ref I2C_GENERATE_STOP Generate stop condition (Size should be set to 0).

+  *     @arg @ref I2C_GENERATE_START_READ Generate Restart for read request.

+  *     @arg @ref I2C_GENERATE_START_WRITE Generate Restart for write request.

+  * @retval None

+  */

+static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, uint32_t Request)

+{

+  /* Check the parameters */

+  assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));

+  assert_param(IS_TRANSFER_MODE(Mode));

+  assert_param(IS_TRANSFER_REQUEST(Request));

+

+  /* update CR2 register */

+  MODIFY_REG(hi2c->Instance->CR2, ((I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | (I2C_CR2_RD_WRN & (uint32_t)(Request >> (31U - I2C_CR2_RD_WRN_Pos))) | I2C_CR2_START | I2C_CR2_STOP)), \

+             (uint32_t)(((uint32_t)DevAddress & I2C_CR2_SADD) | (((uint32_t)Size << I2C_CR2_NBYTES_Pos) & I2C_CR2_NBYTES) | (uint32_t)Mode | (uint32_t)Request));

+}

+

+/**

+  * @brief  Manage the enabling of Interrupts.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  InterruptRequest Value of @ref I2C_Interrupt_configuration_definition.

+  * @retval None

+  */

+static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)

+{

+  uint32_t tmpisr = 0U;

+

+  if ((hi2c->XferISR == I2C_Master_ISR_DMA) || \

+      (hi2c->XferISR == I2C_Slave_ISR_DMA))

+  {

+    if ((InterruptRequest & I2C_XFER_LISTEN_IT) == I2C_XFER_LISTEN_IT)

+    {

+      /* Enable ERR, STOP, NACK and ADDR interrupts */

+      tmpisr |= I2C_IT_ADDRI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI;

+    }

+

+    if ((InterruptRequest & I2C_XFER_ERROR_IT) == I2C_XFER_ERROR_IT)

+    {

+      /* Enable ERR and NACK interrupts */

+      tmpisr |= I2C_IT_ERRI | I2C_IT_NACKI;

+    }

+

+    if ((InterruptRequest & I2C_XFER_CPLT_IT) == I2C_XFER_CPLT_IT)

+    {

+      /* Enable STOP interrupts */

+      tmpisr |= I2C_IT_STOPI;

+    }

+

+    if ((InterruptRequest & I2C_XFER_RELOAD_IT) == I2C_XFER_RELOAD_IT)

+    {

+      /* Enable TC interrupts */

+      tmpisr |= I2C_IT_TCI;

+    }

+  }

+  else

+  {

+    if ((InterruptRequest & I2C_XFER_LISTEN_IT) == I2C_XFER_LISTEN_IT)

+    {

+      /* Enable ERR, STOP, NACK, and ADDR interrupts */

+      tmpisr |= I2C_IT_ADDRI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI;

+    }

+

+    if ((InterruptRequest & I2C_XFER_TX_IT) == I2C_XFER_TX_IT)

+    {

+      /* Enable ERR, TC, STOP, NACK and RXI interrupts */

+      tmpisr |= I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_TXI;

+    }

+

+    if ((InterruptRequest & I2C_XFER_RX_IT) == I2C_XFER_RX_IT)

+    {

+      /* Enable ERR, TC, STOP, NACK and TXI interrupts */

+      tmpisr |= I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_RXI;

+    }

+

+    if ((InterruptRequest & I2C_XFER_CPLT_IT) == I2C_XFER_CPLT_IT)

+    {

+      /* Enable STOP interrupts */

+      tmpisr |= I2C_IT_STOPI;

+    }

+  }

+

+  /* Enable interrupts only at the end */

+  /* to avoid the risk of I2C interrupt handle execution before */

+  /* all interrupts requested done */

+  __HAL_I2C_ENABLE_IT(hi2c, tmpisr);

+}

+

+/**

+  * @brief  Manage the disabling of Interrupts.

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2C.

+  * @param  InterruptRequest Value of @ref I2C_Interrupt_configuration_definition.

+  * @retval None

+  */

+static void I2C_Disable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)

+{

+  uint32_t tmpisr = 0U;

+

+  if ((InterruptRequest & I2C_XFER_TX_IT) == I2C_XFER_TX_IT)

+  {

+    /* Disable TC and TXI interrupts */

+    tmpisr |= I2C_IT_TCI | I2C_IT_TXI;

+

+    if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) != (uint32_t)HAL_I2C_STATE_LISTEN)

+    {

+      /* Disable NACK and STOP interrupts */

+      tmpisr |= I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI;

+    }

+  }

+

+  if ((InterruptRequest & I2C_XFER_RX_IT) == I2C_XFER_RX_IT)

+  {

+    /* Disable TC and RXI interrupts */

+    tmpisr |= I2C_IT_TCI | I2C_IT_RXI;

+

+    if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) != (uint32_t)HAL_I2C_STATE_LISTEN)

+    {

+      /* Disable NACK and STOP interrupts */

+      tmpisr |= I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI;

+    }

+  }

+

+  if ((InterruptRequest & I2C_XFER_LISTEN_IT) == I2C_XFER_LISTEN_IT)

+  {

+    /* Disable ADDR, NACK and STOP interrupts */

+    tmpisr |= I2C_IT_ADDRI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI;

+  }

+

+  if ((InterruptRequest & I2C_XFER_ERROR_IT) == I2C_XFER_ERROR_IT)

+  {

+    /* Enable ERR and NACK interrupts */

+    tmpisr |= I2C_IT_ERRI | I2C_IT_NACKI;

+  }

+

+  if ((InterruptRequest & I2C_XFER_CPLT_IT) == I2C_XFER_CPLT_IT)

+  {

+    /* Enable STOP interrupts */

+    tmpisr |= I2C_IT_STOPI;

+  }

+

+  if ((InterruptRequest & I2C_XFER_RELOAD_IT) == I2C_XFER_RELOAD_IT)

+  {

+    /* Enable TC interrupts */

+    tmpisr |= I2C_IT_TCI;

+  }

+

+  /* Disable interrupts only at the end */

+  /* to avoid a breaking situation like at "t" time */

+  /* all disable interrupts request are not done */

+  __HAL_I2C_DISABLE_IT(hi2c, tmpisr);

+}

+

+/**

+  * @brief  Convert I2Cx OTHER_xxx XferOptions to functionnal XferOptions.

+  * @param  hi2c I2C handle.

+  * @retval None

+  */

+static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c)

+{

+  /* if user set XferOptions to I2C_OTHER_FRAME            */

+  /* it request implicitly to generate a restart condition */

+  /* set XferOptions to I2C_FIRST_FRAME                    */

+  if (hi2c->XferOptions == I2C_OTHER_FRAME)

+  {

+    hi2c->XferOptions = I2C_FIRST_FRAME;

+  }

+  /* else if user set XferOptions to I2C_OTHER_AND_LAST_FRAME */

+  /* it request implicitly to generate a restart condition    */

+  /* then generate a stop condition at the end of transfer    */

+  /* set XferOptions to I2C_FIRST_AND_LAST_FRAME              */

+  else if (hi2c->XferOptions == I2C_OTHER_AND_LAST_FRAME)

+  {

+    hi2c->XferOptions = I2C_FIRST_AND_LAST_FRAME;

+  }

+  else

+  {

+    /* Nothing to do */

+  }

+}

+

+/**

+  * @}

+  */

+

+#endif /* HAL_I2C_MODULE_ENABLED */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c
new file mode 100644
index 0000000..54d74c7
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c
@@ -0,0 +1,339 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_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:

+  *           + Extended features functions

+  *

+  @verbatim

+  ==============================================================================

+               ##### I2C peripheral Extended features  #####

+  ==============================================================================

+

+  [..] Comparing to other previous devices, the I2C interface for STM32L4xx

+       devices contains the following additional features

+

+       (+) Possibility to disable or enable Analog Noise Filter

+       (+) Use of a configured Digital Noise Filter

+       (+) Disable or enable wakeup from Stop mode(s)

+       (+) Disable or enable Fast Mode Plus

+

+                     ##### How to use this driver #####

+  ==============================================================================

+  [..] This driver provides functions to configure Noise Filter and Wake Up Feature

+    (#) 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 I2C Wake Up Mode using the functions :

+          (++) HAL_I2CEx_EnableWakeUp()

+          (++) HAL_I2CEx_DisableWakeUp()

+    (#) Configure the enable or disable of fast mode plus driving capability using the functions :

+          (++) HAL_I2CEx_EnableFastModePlus()

+          (++) HAL_I2CEx_DisableFastModePlus()

+  @endverbatim

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_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 Extended features functions

+  * @brief    Extended features functions

+ *

+@verbatim

+ ===============================================================================

+                      ##### Extended features functions #####

+ ===============================================================================

+    [..] This section provides functions allowing to:

+      (+) Configure Noise Filters

+      (+) Configure Wake Up Feature

+      (+) Configure Fast Mode Plus

+

+@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;

+  }

+}

+

+/**

+  * @brief  Enable I2C wakeup from Stop mode(s).

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2Cx peripheral.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2CEx_EnableWakeUp(I2C_HandleTypeDef *hi2c)

+{

+  /* Check the parameters */

+  assert_param(IS_I2C_WAKEUP_FROMSTOP_INSTANCE(hi2c->Instance));

+

+  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);

+

+    /* Enable wakeup from stop mode */

+    hi2c->Instance->CR1 |= I2C_CR1_WUPEN;

+

+    __HAL_I2C_ENABLE(hi2c);

+

+    hi2c->State = HAL_I2C_STATE_READY;

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief  Disable I2C wakeup from Stop mode(s).

+  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains

+  *                the configuration information for the specified I2Cx peripheral.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_I2CEx_DisableWakeUp(I2C_HandleTypeDef *hi2c)

+{

+  /* Check the parameters */

+  assert_param(IS_I2C_WAKEUP_FROMSTOP_INSTANCE(hi2c->Instance));

+

+  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);

+

+    /* Enable wakeup from stop mode */

+    hi2c->Instance->CR1 &= ~(I2C_CR1_WUPEN);

+

+    __HAL_I2C_ENABLE(hi2c);

+

+    hi2c->State = HAL_I2C_STATE_READY;

+

+    /* Process Unlocked */

+    __HAL_UNLOCK(hi2c);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @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->CFGR1, (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->CFGR1, (uint32_t)ConfigFastModePlus);

+}

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#endif /* HAL_I2C_MODULE_ENABLED */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c
new file mode 100644
index 0000000..756b6d4
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c
@@ -0,0 +1,2452 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_pcd.c

+  * @author  MCD Application Team

+  * @brief   PCD HAL module driver.

+  *          This file provides firmware functions to manage the following

+  *          functionalities of the USB Peripheral Controller:

+  *           + Initialization and de-initialization functions

+  *           + IO operation functions

+  *           + Peripheral Control functions

+  *           + Peripheral State functions

+  *

+  @verbatim

+  ==============================================================================

+                    ##### How to use this driver #####

+  ==============================================================================

+    [..]

+      The PCD HAL driver can be used as follows:

+

+     (#) Declare a PCD_HandleTypeDef handle structure, for example:

+         PCD_HandleTypeDef  hpcd;

+

+     (#) Fill parameters of Init structure in HCD handle

+

+     (#) Call HAL_PCD_Init() API to initialize the PCD peripheral (Core, Device core, ...)

+

+     (#) Initialize the PCD low level resources through the HAL_PCD_MspInit() API:

+         (##) Enable the PCD/USB Low Level interface clock using

+              (+++) __HAL_RCC_USB_CLK_ENABLE(); For USB Device only FS peripheral

+

+         (##) Initialize the related GPIO clocks

+         (##) Configure PCD pin-out

+         (##) Configure PCD NVIC interrupt

+

+     (#)Associate the Upper USB device stack to the HAL PCD Driver:

+         (##) hpcd.pData = pdev;

+

+     (#)Enable PCD transmission and reception:

+         (##) HAL_PCD_Start();

+

+  @endverbatim

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup PCD PCD

+  * @brief PCD HAL module driver

+  * @{

+  */

+

+#ifdef HAL_PCD_MODULE_ENABLED

+

+#if defined (USB) || defined (USB_OTG_FS)

+

+/* Private types -------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/* Private constants ---------------------------------------------------------*/

+/* Private macros ------------------------------------------------------------*/

+/** @defgroup PCD_Private_Macros PCD Private Macros

+  * @{

+  */

+#define PCD_MIN(a, b)  (((a) < (b)) ? (a) : (b))

+#define PCD_MAX(a, b)  (((a) > (b)) ? (a) : (b))

+/**

+  * @}

+  */

+

+/* Private functions prototypes ----------------------------------------------*/

+/** @defgroup PCD_Private_Functions PCD Private Functions

+  * @{

+  */

+#if defined (USB_OTG_FS)

+static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum);

+static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint32_t epnum);

+static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint32_t epnum);

+#endif /* defined (USB_OTG_FS) */

+

+#if defined (USB)

+static HAL_StatusTypeDef PCD_EP_ISR_Handler(PCD_HandleTypeDef *hpcd);

+#endif /* defined (USB) */

+/**

+  * @}

+  */

+

+/* Exported functions --------------------------------------------------------*/

+/** @defgroup PCD_Exported_Functions PCD Exported Functions

+  * @{

+  */

+

+/** @defgroup PCD_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:

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Initializes the PCD according to the specified

+  *         parameters in the PCD_InitTypeDef and initialize the associated handle.

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd)

+{

+#if defined (USB_OTG_FS)

+  USB_OTG_GlobalTypeDef *USBx;

+#endif /* defined (USB_OTG_FS) */

+  uint8_t i;

+

+  /* Check the PCD handle allocation */

+  if (hpcd == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check the parameters */

+  assert_param(IS_PCD_ALL_INSTANCE(hpcd->Instance));

+

+#if defined (USB_OTG_FS)

+  USBx = hpcd->Instance;

+#endif /* defined (USB_OTG_FS) */

+

+  if (hpcd->State == HAL_PCD_STATE_RESET)

+  {

+    /* Allocate lock resource and initialize it */

+    hpcd->Lock = HAL_UNLOCKED;

+

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+    hpcd->SOFCallback = HAL_PCD_SOFCallback;

+    hpcd->SetupStageCallback = HAL_PCD_SetupStageCallback;

+    hpcd->ResetCallback = HAL_PCD_ResetCallback;

+    hpcd->SuspendCallback = HAL_PCD_SuspendCallback;

+    hpcd->ResumeCallback = HAL_PCD_ResumeCallback;

+    hpcd->ConnectCallback = HAL_PCD_ConnectCallback;

+    hpcd->DisconnectCallback = HAL_PCD_DisconnectCallback;

+    hpcd->DataOutStageCallback = HAL_PCD_DataOutStageCallback;

+    hpcd->DataInStageCallback = HAL_PCD_DataInStageCallback;

+    hpcd->ISOOUTIncompleteCallback = HAL_PCD_ISOOUTIncompleteCallback;

+    hpcd->ISOINIncompleteCallback = HAL_PCD_ISOINIncompleteCallback;

+    hpcd->LPMCallback = HAL_PCDEx_LPM_Callback;

+    hpcd->BCDCallback = HAL_PCDEx_BCD_Callback;

+

+    if (hpcd->MspInitCallback == NULL)

+    {

+      hpcd->MspInitCallback = HAL_PCD_MspInit;

+    }

+

+    /* Init the low level hardware */

+    hpcd->MspInitCallback(hpcd);

+#else

+    /* Init the low level hardware : GPIO, CLOCK, NVIC... */

+    HAL_PCD_MspInit(hpcd);

+#endif /* (USE_HAL_PCD_REGISTER_CALLBACKS) */

+  }

+

+  hpcd->State = HAL_PCD_STATE_BUSY;

+

+#if defined (USB_OTG_FS)

+  /* Disable DMA mode for FS instance */

+  if ((USBx->CID & (0x1U << 8)) == 0U)

+  {

+    hpcd->Init.dma_enable = 0U;

+  }

+#endif /* defined (USB_OTG_FS) */

+

+  /* Disable the Interrupts */

+  __HAL_PCD_DISABLE(hpcd);

+

+  /*Init the Core (common init.) */

+  if (USB_CoreInit(hpcd->Instance, hpcd->Init) != HAL_OK)

+  {

+    hpcd->State = HAL_PCD_STATE_ERROR;

+    return HAL_ERROR;

+  }

+

+  /* Force Device Mode*/

+  (void)USB_SetCurrentMode(hpcd->Instance, USB_DEVICE_MODE);

+

+  /* Init endpoints structures */

+  for (i = 0U; i < hpcd->Init.dev_endpoints; i++)

+  {

+    /* Init ep structure */

+    hpcd->IN_ep[i].is_in = 1U;

+    hpcd->IN_ep[i].num = i;

+    hpcd->IN_ep[i].tx_fifo_num = i;

+    /* Control until ep is activated */

+    hpcd->IN_ep[i].type = EP_TYPE_CTRL;

+    hpcd->IN_ep[i].maxpacket = 0U;

+    hpcd->IN_ep[i].xfer_buff = 0U;

+    hpcd->IN_ep[i].xfer_len = 0U;

+  }

+

+  for (i = 0U; i < hpcd->Init.dev_endpoints; i++)

+  {

+    hpcd->OUT_ep[i].is_in = 0U;

+    hpcd->OUT_ep[i].num = i;

+    /* Control until ep is activated */

+    hpcd->OUT_ep[i].type = EP_TYPE_CTRL;

+    hpcd->OUT_ep[i].maxpacket = 0U;

+    hpcd->OUT_ep[i].xfer_buff = 0U;

+    hpcd->OUT_ep[i].xfer_len = 0U;

+  }

+

+  /* Init Device */

+  if (USB_DevInit(hpcd->Instance, hpcd->Init) != HAL_OK)

+  {

+    hpcd->State = HAL_PCD_STATE_ERROR;

+    return HAL_ERROR;

+  }

+

+  hpcd->USB_Address = 0U;

+  hpcd->State = HAL_PCD_STATE_READY;

+  

+  /* Activate LPM */

+  if (hpcd->Init.lpm_enable == 1U)

+  {

+    (void)HAL_PCDEx_ActivateLPM(hpcd);

+  }

+  

+  (void)USB_DevDisconnect(hpcd->Instance);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  DeInitializes the PCD peripheral.

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd)

+{

+  /* Check the PCD handle allocation */

+  if (hpcd == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  hpcd->State = HAL_PCD_STATE_BUSY;

+

+  /* Stop Device */

+  (void)HAL_PCD_Stop(hpcd);

+

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+  if (hpcd->MspDeInitCallback == NULL)

+  {

+    hpcd->MspDeInitCallback = HAL_PCD_MspDeInit; /* Legacy weak MspDeInit  */

+  }

+

+  /* DeInit the low level hardware */

+  hpcd->MspDeInitCallback(hpcd);

+#else

+  /* DeInit the low level hardware: CLOCK, NVIC.*/

+  HAL_PCD_MspDeInit(hpcd);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+

+  hpcd->State = HAL_PCD_STATE_RESET;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Initializes the PCD MSP.

+  * @param  hpcd PCD handle

+  * @retval None

+  */

+__weak void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hpcd);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_PCD_MspInit could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  DeInitializes PCD MSP.

+  * @param  hpcd PCD handle

+  * @retval None

+  */

+__weak void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hpcd);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_PCD_MspDeInit could be implemented in the user file

+   */

+}

+

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+/**

+  * @brief  Register a User USB PCD Callback

+  *         To be used instead of the weak predefined callback

+  * @param  hpcd USB PCD handle

+  * @param  CallbackID ID of the callback to be registered

+  *         This parameter can be one of the following values:

+  *          @arg @ref HAL_PCD_SOF_CB_ID USB PCD SOF callback ID

+  *          @arg @ref HAL_PCD_SETUPSTAGE_CB_ID USB PCD Setup callback ID

+  *          @arg @ref HAL_PCD_RESET_CB_ID USB PCD Reset callback ID

+  *          @arg @ref HAL_PCD_SUSPEND_CB_ID USB PCD Suspend callback ID

+  *          @arg @ref HAL_PCD_RESUME_CB_ID USB PCD Resume callback ID

+  *          @arg @ref HAL_PCD_CONNECT_CB_ID USB PCD Connect callback ID

+  *          @arg @ref HAL_PCD_DISCONNECT_CB_ID OTG PCD Disconnect callback ID

+  *          @arg @ref HAL_PCD_MSPINIT_CB_ID MspDeInit callback ID

+  *          @arg @ref HAL_PCD_MSPDEINIT_CB_ID MspDeInit callback ID

+  * @param  pCallback pointer to the Callback function

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_RegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID, pPCD_CallbackTypeDef pCallback)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  if (pCallback == NULL)

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+    return HAL_ERROR;

+  }

+  /* Process locked */

+  __HAL_LOCK(hpcd);

+

+  if (hpcd->State == HAL_PCD_STATE_READY)

+  {

+    switch (CallbackID)

+    {

+      case HAL_PCD_SOF_CB_ID :

+        hpcd->SOFCallback = pCallback;

+        break;

+

+      case HAL_PCD_SETUPSTAGE_CB_ID :

+        hpcd->SetupStageCallback = pCallback;

+        break;

+

+      case HAL_PCD_RESET_CB_ID :

+        hpcd->ResetCallback = pCallback;

+        break;

+

+      case HAL_PCD_SUSPEND_CB_ID :

+        hpcd->SuspendCallback = pCallback;

+        break;

+

+      case HAL_PCD_RESUME_CB_ID :

+        hpcd->ResumeCallback = pCallback;

+        break;

+

+      case HAL_PCD_CONNECT_CB_ID :

+        hpcd->ConnectCallback = pCallback;

+        break;

+

+      case HAL_PCD_DISCONNECT_CB_ID :

+        hpcd->DisconnectCallback = pCallback;

+        break;

+

+      case HAL_PCD_MSPINIT_CB_ID :

+        hpcd->MspInitCallback = pCallback;

+        break;

+

+      case HAL_PCD_MSPDEINIT_CB_ID :

+        hpcd->MspDeInitCallback = pCallback;

+        break;

+

+      default :

+        /* Update the error code */

+        hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+        /* Return error status */

+        status =  HAL_ERROR;

+        break;

+    }

+  }

+  else if (hpcd->State == HAL_PCD_STATE_RESET)

+  {

+    switch (CallbackID)

+    {

+      case HAL_PCD_MSPINIT_CB_ID :

+        hpcd->MspInitCallback = pCallback;

+        break;

+

+      case HAL_PCD_MSPDEINIT_CB_ID :

+        hpcd->MspDeInitCallback = pCallback;

+        break;

+

+      default :

+        /* Update the error code */

+        hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+        /* Return error status */

+        status =  HAL_ERROR;

+        break;

+    }

+  }

+  else

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hpcd);

+  return status;

+}

+

+/**

+  * @brief  Unregister an USB PCD Callback

+  *         USB PCD callabck is redirected to the weak predefined callback

+  * @param  hpcd USB PCD handle

+  * @param  CallbackID ID of the callback to be unregistered

+  *         This parameter can be one of the following values:

+  *          @arg @ref HAL_PCD_SOF_CB_ID USB PCD SOF callback ID

+  *          @arg @ref HAL_PCD_SETUPSTAGE_CB_ID USB PCD Setup callback ID

+  *          @arg @ref HAL_PCD_RESET_CB_ID USB PCD Reset callback ID

+  *          @arg @ref HAL_PCD_SUSPEND_CB_ID USB PCD Suspend callback ID

+  *          @arg @ref HAL_PCD_RESUME_CB_ID USB PCD Resume callback ID

+  *          @arg @ref HAL_PCD_CONNECT_CB_ID USB PCD Connect callback ID

+  *          @arg @ref HAL_PCD_DISCONNECT_CB_ID OTG PCD Disconnect callback ID

+  *          @arg @ref HAL_PCD_MSPINIT_CB_ID MspDeInit callback ID

+  *          @arg @ref HAL_PCD_MSPDEINIT_CB_ID MspDeInit callback ID

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_UnRegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Process locked */

+  __HAL_LOCK(hpcd);

+

+  /* Setup Legacy weak Callbacks  */

+  if (hpcd->State == HAL_PCD_STATE_READY)

+  {

+    switch (CallbackID)

+    {

+      case HAL_PCD_SOF_CB_ID :

+        hpcd->SOFCallback = HAL_PCD_SOFCallback;

+        break;

+

+      case HAL_PCD_SETUPSTAGE_CB_ID :

+        hpcd->SetupStageCallback = HAL_PCD_SetupStageCallback;

+        break;

+

+      case HAL_PCD_RESET_CB_ID :

+        hpcd->ResetCallback = HAL_PCD_ResetCallback;

+        break;

+

+      case HAL_PCD_SUSPEND_CB_ID :

+        hpcd->SuspendCallback = HAL_PCD_SuspendCallback;

+        break;

+

+      case HAL_PCD_RESUME_CB_ID :

+        hpcd->ResumeCallback = HAL_PCD_ResumeCallback;

+        break;

+

+      case HAL_PCD_CONNECT_CB_ID :

+        hpcd->ConnectCallback = HAL_PCD_ConnectCallback;

+        break;

+

+      case HAL_PCD_DISCONNECT_CB_ID :

+        hpcd->DisconnectCallback = HAL_PCD_DisconnectCallback;

+        break;

+

+      case HAL_PCD_MSPINIT_CB_ID :

+        hpcd->MspInitCallback = HAL_PCD_MspInit;

+        break;

+

+      case HAL_PCD_MSPDEINIT_CB_ID :

+        hpcd->MspDeInitCallback = HAL_PCD_MspDeInit;

+        break;

+

+      default :

+        /* Update the error code */

+        hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+        /* Return error status */

+        status =  HAL_ERROR;

+        break;

+    }

+  }

+  else if (hpcd->State == HAL_PCD_STATE_RESET)

+  {

+    switch (CallbackID)

+    {

+      case HAL_PCD_MSPINIT_CB_ID :

+        hpcd->MspInitCallback = HAL_PCD_MspInit;

+        break;

+

+      case HAL_PCD_MSPDEINIT_CB_ID :

+        hpcd->MspDeInitCallback = HAL_PCD_MspDeInit;

+        break;

+

+      default :

+        /* Update the error code */

+        hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+        /* Return error status */

+        status =  HAL_ERROR;

+        break;

+    }

+  }

+  else

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hpcd);

+  return status;

+}

+

+/**

+  * @brief  Register USB PCD Data OUT Stage Callback

+  *         To be used instead of the weak HAL_PCD_DataOutStageCallback() predefined callback

+  * @param  hpcd PCD handle

+  * @param  pCallback pointer to the USB PCD Data OUT Stage Callback function

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_RegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd, pPCD_DataOutStageCallbackTypeDef pCallback)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  if (pCallback == NULL)

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+    return HAL_ERROR;

+  }

+

+  /* Process locked */

+  __HAL_LOCK(hpcd);

+

+  if (hpcd->State == HAL_PCD_STATE_READY)

+  {

+    hpcd->DataOutStageCallback = pCallback;

+  }

+  else

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hpcd);

+

+  return status;

+}

+

+/**

+  * @brief  UnRegister the USB PCD Data OUT Stage Callback

+  *         USB PCD Data OUT Stage Callback is redirected to the weak HAL_PCD_DataOutStageCallback() predefined callback

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_UnRegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Process locked */

+  __HAL_LOCK(hpcd);

+

+  if (hpcd->State == HAL_PCD_STATE_READY)

+  {

+    hpcd->DataOutStageCallback = HAL_PCD_DataOutStageCallback; /* Legacy weak DataOutStageCallback  */

+  }

+  else

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hpcd);

+

+  return status;

+}

+

+/**

+  * @brief  Register USB PCD Data IN Stage Callback

+  *         To be used instead of the weak HAL_PCD_DataInStageCallback() predefined callback

+  * @param  hpcd PCD handle

+  * @param  pCallback pointer to the USB PCD Data IN Stage Callback function

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_RegisterDataInStageCallback(PCD_HandleTypeDef *hpcd, pPCD_DataInStageCallbackTypeDef pCallback)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  if (pCallback == NULL)

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+    return HAL_ERROR;

+  }

+

+  /* Process locked */

+  __HAL_LOCK(hpcd);

+

+  if (hpcd->State == HAL_PCD_STATE_READY)

+  {

+    hpcd->DataInStageCallback = pCallback;

+  }

+  else

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hpcd);

+

+  return status;

+}

+

+/**

+  * @brief  UnRegister the USB PCD Data IN Stage Callback

+  *         USB PCD Data OUT Stage Callback is redirected to the weak HAL_PCD_DataInStageCallback() predefined callback

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_UnRegisterDataInStageCallback(PCD_HandleTypeDef *hpcd)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Process locked */

+  __HAL_LOCK(hpcd);

+

+  if (hpcd->State == HAL_PCD_STATE_READY)

+  {

+    hpcd->DataInStageCallback = HAL_PCD_DataInStageCallback; /* Legacy weak DataInStageCallback  */

+  }

+  else

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hpcd);

+

+  return status;

+}

+

+/**

+  * @brief  Register USB PCD Iso OUT incomplete Callback

+  *         To be used instead of the weak HAL_PCD_ISOOUTIncompleteCallback() predefined callback

+  * @param  hpcd PCD handle

+  * @param  pCallback pointer to the USB PCD Iso OUT incomplete Callback function

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_RegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd, pPCD_IsoOutIncpltCallbackTypeDef pCallback)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  if (pCallback == NULL)

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+    return HAL_ERROR;

+  }

+

+  /* Process locked */

+  __HAL_LOCK(hpcd);

+

+  if (hpcd->State == HAL_PCD_STATE_READY)

+  {

+    hpcd->ISOOUTIncompleteCallback = pCallback;

+  }

+  else

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hpcd);

+

+  return status;

+}

+

+/**

+  * @brief  UnRegister the USB PCD Iso OUT incomplete Callback

+  *         USB PCD Iso OUT incomplete Callback is redirected to the weak HAL_PCD_ISOOUTIncompleteCallback() predefined callback

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_UnRegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Process locked */

+  __HAL_LOCK(hpcd);

+

+  if (hpcd->State == HAL_PCD_STATE_READY)

+  {

+    hpcd->ISOOUTIncompleteCallback = HAL_PCD_ISOOUTIncompleteCallback; /* Legacy weak ISOOUTIncompleteCallback  */

+  }

+  else

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hpcd);

+

+  return status;

+}

+

+/**

+  * @brief  Register USB PCD Iso IN incomplete Callback

+  *         To be used instead of the weak HAL_PCD_ISOINIncompleteCallback() predefined callback

+  * @param  hpcd PCD handle

+  * @param  pCallback pointer to the USB PCD Iso IN incomplete Callback function

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_RegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd, pPCD_IsoInIncpltCallbackTypeDef pCallback)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  if (pCallback == NULL)

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+    return HAL_ERROR;

+  }

+

+  /* Process locked */

+  __HAL_LOCK(hpcd);

+

+  if (hpcd->State == HAL_PCD_STATE_READY)

+  {

+    hpcd->ISOINIncompleteCallback = pCallback;

+  }

+  else

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hpcd);

+

+  return status;

+}

+

+/**

+  * @brief  UnRegister the USB PCD Iso IN incomplete Callback

+  *         USB PCD Iso IN incomplete Callback is redirected to the weak HAL_PCD_ISOINIncompleteCallback() predefined callback

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_UnRegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Process locked */

+  __HAL_LOCK(hpcd);

+

+  if (hpcd->State == HAL_PCD_STATE_READY)

+  {

+    hpcd->ISOINIncompleteCallback = HAL_PCD_ISOINIncompleteCallback; /* Legacy weak ISOINIncompleteCallback  */

+  }

+  else

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hpcd);

+

+  return status;

+}

+

+/**

+  * @brief  Register USB PCD BCD Callback

+  *         To be used instead of the weak HAL_PCDEx_BCD_Callback() predefined callback

+  * @param  hpcd PCD handle

+  * @param  pCallback pointer to the USB PCD BCD Callback function

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_RegisterBcdCallback(PCD_HandleTypeDef *hpcd, pPCD_BcdCallbackTypeDef pCallback)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  if (pCallback == NULL)

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+    return HAL_ERROR;

+  }

+

+  /* Process locked */

+  __HAL_LOCK(hpcd);

+

+  if (hpcd->State == HAL_PCD_STATE_READY)

+  {

+    hpcd->BCDCallback = pCallback;

+  }

+  else

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hpcd);

+

+  return status;

+}

+

+/**

+  * @brief  UnRegister the USB PCD BCD Callback

+  *         USB BCD Callback is redirected to the weak HAL_PCDEx_BCD_Callback() predefined callback

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_UnRegisterBcdCallback(PCD_HandleTypeDef *hpcd)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Process locked */

+  __HAL_LOCK(hpcd);

+

+  if (hpcd->State == HAL_PCD_STATE_READY)

+  {

+    hpcd->BCDCallback = HAL_PCDEx_BCD_Callback; /* Legacy weak HAL_PCDEx_BCD_Callback  */

+  }

+  else

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hpcd);

+

+  return status;

+}

+

+/**

+  * @brief  Register USB PCD LPM Callback

+  *         To be used instead of the weak HAL_PCDEx_LPM_Callback() predefined callback

+  * @param  hpcd PCD handle

+  * @param  pCallback pointer to the USB PCD LPM Callback function

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_RegisterLpmCallback(PCD_HandleTypeDef *hpcd, pPCD_LpmCallbackTypeDef pCallback)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  if (pCallback == NULL)

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+    return HAL_ERROR;

+  }

+

+  /* Process locked */

+  __HAL_LOCK(hpcd);

+

+  if (hpcd->State == HAL_PCD_STATE_READY)

+  {

+    hpcd->LPMCallback = pCallback;

+  }

+  else

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hpcd);

+

+  return status;

+}

+

+/**

+  * @brief  UnRegister the USB PCD LPM Callback

+  *         USB LPM Callback is redirected to the weak HAL_PCDEx_LPM_Callback() predefined callback

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_UnRegisterLpmCallback(PCD_HandleTypeDef *hpcd)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Process locked */

+  __HAL_LOCK(hpcd);

+

+  if (hpcd->State == HAL_PCD_STATE_READY)

+  {

+    hpcd->LPMCallback = HAL_PCDEx_LPM_Callback; /* Legacy weak HAL_PCDEx_LPM_Callback  */

+  }

+  else

+  {

+    /* Update the error code */

+    hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK;

+

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hpcd);

+

+  return status;

+}

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+

+/**

+  * @}

+  */

+

+/** @defgroup PCD_Exported_Functions_Group2 Input and Output operation functions

+ *  @brief   Data transfers functions

+ *

+@verbatim

+ ===============================================================================

+                      ##### IO operation functions #####

+ ===============================================================================

+    [..]

+    This subsection provides a set of functions allowing to manage the PCD data

+    transfers.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Start the USB device

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd)

+{

+#if defined (USB_OTG_FS)

+  USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;

+#endif /* defined (USB_OTG_FS) */

+

+  __HAL_LOCK(hpcd);

+#if defined (USB_OTG_FS)

+  if (hpcd->Init.battery_charging_enable == 1U)

+  {

+    /* Enable USB Transceiver */

+    USBx->GCCFG |= USB_OTG_GCCFG_PWRDWN;

+  }

+#endif /* defined (USB_OTG_FS) */

+  (void)USB_DevConnect(hpcd->Instance);

+  __HAL_PCD_ENABLE(hpcd);

+  __HAL_UNLOCK(hpcd);

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stop the USB device.

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd)

+{

+  __HAL_LOCK(hpcd);

+  __HAL_PCD_DISABLE(hpcd);

+

+  if (USB_StopDevice(hpcd->Instance) != HAL_OK)

+  {

+    __HAL_UNLOCK(hpcd);

+    return HAL_ERROR;

+  }

+

+  (void)USB_DevDisconnect(hpcd->Instance);

+  __HAL_UNLOCK(hpcd);

+

+  return HAL_OK;

+}

+#if defined (USB_OTG_FS)

+/**

+  * @brief  Handles PCD interrupt request.

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)

+{

+  USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t i, ep_intr, epint, epnum = 0U;

+  uint32_t fifoemptymsk, temp;

+  USB_OTG_EPTypeDef *ep;

+

+  /* ensure that we are in device mode */

+  if (USB_GetMode(hpcd->Instance) == USB_OTG_MODE_DEVICE)

+  {

+    /* avoid spurious interrupt */

+    if (__HAL_PCD_IS_INVALID_INTERRUPT(hpcd))

+    {

+      return;

+    }

+

+    if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_MMIS))

+    {

+      /* incorrect mode, acknowledge the interrupt */

+      __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_MMIS);

+    }

+

+    if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OEPINT))

+    {

+      epnum = 0U;

+

+      /* Read in the device interrupt bits */

+      ep_intr = USB_ReadDevAllOutEpInterrupt(hpcd->Instance);

+

+      while (ep_intr != 0U)

+      {

+        if ((ep_intr & 0x1U) != 0U)

+        {

+          epint = USB_ReadDevOutEPInterrupt(hpcd->Instance, (uint8_t)epnum);

+

+          if ((epint & USB_OTG_DOEPINT_XFRC) == USB_OTG_DOEPINT_XFRC)

+          {

+            CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_XFRC);

+            (void)PCD_EP_OutXfrComplete_int(hpcd, epnum);

+          }

+

+          if ((epint & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP)

+          {

+            /* Class B setup phase done for previous decoded setup */

+            (void)PCD_EP_OutSetupPacket_int(hpcd, epnum);

+            CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP);

+          }

+

+          if ((epint & USB_OTG_DOEPINT_OTEPDIS) == USB_OTG_DOEPINT_OTEPDIS)

+          {

+            CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPDIS);

+          }

+

+          /* Clear Status Phase Received interrupt */

+          if ((epint & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR)

+          {

+            CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR);

+          }

+

+          /* Clear OUT NAK interrupt */

+          if ((epint & USB_OTG_DOEPINT_NAK) == USB_OTG_DOEPINT_NAK)

+          {

+            CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_NAK);

+          }

+        }

+        epnum++;

+        ep_intr >>= 1U;

+      }

+    }

+

+    if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IEPINT))

+    {

+      /* Read in the device interrupt bits */

+      ep_intr = USB_ReadDevAllInEpInterrupt(hpcd->Instance);

+

+      epnum = 0U;

+

+      while (ep_intr != 0U)

+      {

+        if ((ep_intr & 0x1U) != 0U) /* In ITR */

+        {

+          epint = USB_ReadDevInEPInterrupt(hpcd->Instance, (uint8_t)epnum);

+

+          if ((epint & USB_OTG_DIEPINT_XFRC) == USB_OTG_DIEPINT_XFRC)

+          {

+            fifoemptymsk = (uint32_t)(0x1UL << (epnum & EP_ADDR_MSK));

+            USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk;

+

+            CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_XFRC);

+

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+            hpcd->DataInStageCallback(hpcd, (uint8_t)epnum);

+#else

+            HAL_PCD_DataInStageCallback(hpcd, (uint8_t)epnum);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+          }

+          if ((epint & USB_OTG_DIEPINT_TOC) == USB_OTG_DIEPINT_TOC)

+          {

+            CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_TOC);

+          }

+          if ((epint & USB_OTG_DIEPINT_ITTXFE) == USB_OTG_DIEPINT_ITTXFE)

+          {

+            CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_ITTXFE);

+          }

+          if ((epint & USB_OTG_DIEPINT_INEPNE) == USB_OTG_DIEPINT_INEPNE)

+          {

+            CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_INEPNE);

+          }

+          if ((epint & USB_OTG_DIEPINT_EPDISD) == USB_OTG_DIEPINT_EPDISD)

+          {

+            CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_EPDISD);

+          }

+          if ((epint & USB_OTG_DIEPINT_TXFE) == USB_OTG_DIEPINT_TXFE)

+          {

+            (void)PCD_WriteEmptyTxFifo(hpcd, epnum);

+          }

+        }

+        epnum++;

+        ep_intr >>= 1U;

+      }

+    }

+

+    /* Handle Resume Interrupt */

+    if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT))

+    {

+      /* Clear the Remote Wake-up Signaling */

+      USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG;

+

+      if (hpcd->LPM_State == LPM_L1)

+      {

+        hpcd->LPM_State = LPM_L0;

+

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+        hpcd->LPMCallback(hpcd, PCD_LPM_L0_ACTIVE);

+#else

+        HAL_PCDEx_LPM_Callback(hpcd, PCD_LPM_L0_ACTIVE);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+      }

+      else

+      {

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+        hpcd->ResumeCallback(hpcd);

+#else

+        HAL_PCD_ResumeCallback(hpcd);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+      }

+

+      __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT);

+    }

+

+    /* Handle Suspend Interrupt */

+    if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP))

+    {

+      if ((USBx_DEVICE->DSTS & USB_OTG_DSTS_SUSPSTS) == USB_OTG_DSTS_SUSPSTS)

+      {

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+        hpcd->SuspendCallback(hpcd);

+#else

+        HAL_PCD_SuspendCallback(hpcd);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+      }

+      __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP);

+    }

+    

+    /* Handle LPM Interrupt */

+    if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_LPMINT))

+    {

+      __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_LPMINT);

+

+      if (hpcd->LPM_State == LPM_L0)

+      {

+        hpcd->LPM_State = LPM_L1;

+        hpcd->BESL = (hpcd->Instance->GLPMCFG & USB_OTG_GLPMCFG_BESL) >> 2U;

+

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+        hpcd->LPMCallback(hpcd, PCD_LPM_L1_ACTIVE);

+#else

+        HAL_PCDEx_LPM_Callback(hpcd, PCD_LPM_L1_ACTIVE);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+      }

+      else

+      {

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+        hpcd->SuspendCallback(hpcd);

+#else

+        HAL_PCD_SuspendCallback(hpcd);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+      }

+    }

+    

+    /* Handle Reset Interrupt */

+    if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBRST))

+    {

+      USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG;

+      (void)USB_FlushTxFifo(hpcd->Instance, 0x10U);

+

+      for (i = 0U; i < hpcd->Init.dev_endpoints; i++)

+      {

+        USBx_INEP(i)->DIEPINT = 0xFB7FU;

+        USBx_INEP(i)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL;

+        USBx_OUTEP(i)->DOEPINT = 0xFB7FU;

+        USBx_OUTEP(i)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL;

+      }

+      USBx_DEVICE->DAINTMSK |= 0x10001U;

+

+      if (hpcd->Init.use_dedicated_ep1 != 0U)

+      {

+        USBx_DEVICE->DOUTEP1MSK |= USB_OTG_DOEPMSK_STUPM |

+                                   USB_OTG_DOEPMSK_XFRCM |

+                                   USB_OTG_DOEPMSK_EPDM;

+

+        USBx_DEVICE->DINEP1MSK |= USB_OTG_DIEPMSK_TOM |

+                                  USB_OTG_DIEPMSK_XFRCM |

+                                  USB_OTG_DIEPMSK_EPDM;

+      }

+      else

+      {

+        USBx_DEVICE->DOEPMSK |= USB_OTG_DOEPMSK_STUPM |

+                                USB_OTG_DOEPMSK_XFRCM |

+                                USB_OTG_DOEPMSK_EPDM |

+                                USB_OTG_DOEPMSK_OTEPSPRM |

+                                USB_OTG_DOEPMSK_NAKM;

+

+        USBx_DEVICE->DIEPMSK |= USB_OTG_DIEPMSK_TOM |

+                                USB_OTG_DIEPMSK_XFRCM |

+                                USB_OTG_DIEPMSK_EPDM;

+      }

+

+      /* Set Default Address to 0 */

+      USBx_DEVICE->DCFG &= ~USB_OTG_DCFG_DAD;

+

+      /* setup EP0 to receive SETUP packets */

+      (void)USB_EP0_OutStart(hpcd->Instance, (uint8_t *)hpcd->Setup);

+

+      __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBRST);

+    }

+

+    /* Handle Enumeration done Interrupt */

+    if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE))

+    {

+      (void)USB_ActivateSetup(hpcd->Instance);

+      hpcd->Init.speed = USB_GetDevSpeed(hpcd->Instance);

+

+      /* Set USB Turnaround time */

+      (void)USB_SetTurnaroundTime(hpcd->Instance,

+                                  HAL_RCC_GetHCLKFreq(),

+                                  (uint8_t)hpcd->Init.speed);

+

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+      hpcd->ResetCallback(hpcd);

+#else

+      HAL_PCD_ResetCallback(hpcd);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+

+      __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE);

+    }

+

+    /* Handle RxQLevel Interrupt */

+    if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_RXFLVL))

+    {

+      USB_MASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL);

+

+      temp = USBx->GRXSTSP;

+

+      ep = &hpcd->OUT_ep[temp & USB_OTG_GRXSTSP_EPNUM];

+

+      if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) ==  STS_DATA_UPDT)

+      {

+        if ((temp & USB_OTG_GRXSTSP_BCNT) != 0U)

+        {

+          (void)USB_ReadPacket(USBx, ep->xfer_buff,

+                               (uint16_t)((temp & USB_OTG_GRXSTSP_BCNT) >> 4));

+

+          ep->xfer_buff += (temp & USB_OTG_GRXSTSP_BCNT) >> 4;

+          ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4;

+        }

+      }

+      else if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) ==  STS_SETUP_UPDT)

+      {

+        (void)USB_ReadPacket(USBx, (uint8_t *)hpcd->Setup, 8U);

+        ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4;

+      }

+      else

+      {

+        /* ... */

+      }

+      USB_UNMASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL);

+    }

+

+    /* Handle SOF Interrupt */

+    if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SOF))

+    {

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+      hpcd->SOFCallback(hpcd);

+#else

+      HAL_PCD_SOFCallback(hpcd);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+

+      __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SOF);

+    }

+

+    /* Handle Incomplete ISO IN Interrupt */

+    if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR))

+    {

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+      hpcd->ISOINIncompleteCallback(hpcd, (uint8_t)epnum);

+#else

+      HAL_PCD_ISOINIncompleteCallback(hpcd, (uint8_t)epnum);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+

+      __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR);

+    }

+

+    /* Handle Incomplete ISO OUT Interrupt */

+    if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT))

+    {

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+      hpcd->ISOOUTIncompleteCallback(hpcd, (uint8_t)epnum);

+#else

+      HAL_PCD_ISOOUTIncompleteCallback(hpcd, (uint8_t)epnum);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+

+      __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT);

+    }

+

+    /* Handle Connection event Interrupt */

+    if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT))

+    {

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+      hpcd->ConnectCallback(hpcd);

+#else

+      HAL_PCD_ConnectCallback(hpcd);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+

+      __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT);

+    }

+

+    /* Handle Disconnection event Interrupt */

+    if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OTGINT))

+    {

+      temp = hpcd->Instance->GOTGINT;

+

+      if ((temp & USB_OTG_GOTGINT_SEDET) == USB_OTG_GOTGINT_SEDET)

+      {

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+        hpcd->DisconnectCallback(hpcd);

+#else

+        HAL_PCD_DisconnectCallback(hpcd);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+      }

+      hpcd->Instance->GOTGINT |= temp;

+    }

+  }

+}

+#endif /* defined (USB_OTG_FS) */

+

+#if defined (USB)

+/**

+  * @brief  This function handles PCD interrupt request.

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)

+{

+  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_CTR))

+  {

+    /* servicing of the endpoint correct transfer interrupt */

+    /* clear of the CTR flag into the sub */

+    (void)PCD_EP_ISR_Handler(hpcd);

+  }

+

+  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_RESET))

+  {

+    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_RESET);

+

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+    hpcd->ResetCallback(hpcd);

+#else

+    HAL_PCD_ResetCallback(hpcd);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+

+    (void)HAL_PCD_SetAddress(hpcd, 0U);

+  }

+

+  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_PMAOVR))

+  {

+    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_PMAOVR);

+  }

+

+  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_ERR))

+  {

+    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_ERR);

+  }

+

+  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_WKUP))

+  {

+    hpcd->Instance->CNTR &= (uint16_t) ~(USB_CNTR_LPMODE);

+    hpcd->Instance->CNTR &= (uint16_t) ~(USB_CNTR_FSUSP);

+

+    if (hpcd->LPM_State == LPM_L1)

+    {

+      hpcd->LPM_State = LPM_L0;

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+      hpcd->LPMCallback(hpcd, PCD_LPM_L0_ACTIVE);

+#else

+      HAL_PCDEx_LPM_Callback(hpcd, PCD_LPM_L0_ACTIVE);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+    }

+

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+    hpcd->ResumeCallback(hpcd);

+#else

+    HAL_PCD_ResumeCallback(hpcd);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+

+    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_WKUP);

+  }

+

+  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_SUSP))

+  {

+    /* Force low-power mode in the macrocell */

+    hpcd->Instance->CNTR |= USB_CNTR_FSUSP;

+

+    /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */

+    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_SUSP);

+

+    hpcd->Instance->CNTR |= USB_CNTR_LPMODE;

+

+    if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_WKUP) == 0U)

+    {

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+      hpcd->SuspendCallback(hpcd);

+#else

+      HAL_PCD_SuspendCallback(hpcd);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+    }

+  }

+

+  /* Handle LPM Interrupt */

+  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_L1REQ))

+  {

+    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_L1REQ);

+    if (hpcd->LPM_State == LPM_L0)

+    {

+      /* Force suspend and low-power mode before going to L1 state*/

+      hpcd->Instance->CNTR |= USB_CNTR_LPMODE;

+      hpcd->Instance->CNTR |= USB_CNTR_FSUSP;

+

+      hpcd->LPM_State = LPM_L1;

+      hpcd->BESL = ((uint32_t)hpcd->Instance->LPMCSR & USB_LPMCSR_BESL) >> 2;

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+      hpcd->LPMCallback(hpcd, PCD_LPM_L1_ACTIVE);

+#else

+      HAL_PCDEx_LPM_Callback(hpcd, PCD_LPM_L1_ACTIVE);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+    }

+    else

+    {

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+      hpcd->SuspendCallback(hpcd);

+#else

+      HAL_PCD_SuspendCallback(hpcd);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+    }

+  }

+

+  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_SOF))

+  {

+    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_SOF);

+

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+    hpcd->SOFCallback(hpcd);

+#else

+    HAL_PCD_SOFCallback(hpcd);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+  }

+

+  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_ESOF))

+  {

+    /* clear ESOF flag in ISTR */

+    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_ESOF);

+  }

+}

+#endif /* defined (USB) */

+

+/**

+  * @brief  Data OUT stage callback.

+  * @param  hpcd PCD handle

+  * @param  epnum endpoint number

+  * @retval None

+  */

+__weak void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hpcd);

+  UNUSED(epnum);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_PCD_DataOutStageCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Data IN stage callback

+  * @param  hpcd PCD handle

+  * @param  epnum endpoint number

+  * @retval None

+  */

+__weak void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hpcd);

+  UNUSED(epnum);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_PCD_DataInStageCallback could be implemented in the user file

+   */

+}

+/**

+  * @brief  Setup stage callback

+  * @param  hpcd PCD handle

+  * @retval None

+  */

+__weak void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hpcd);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_PCD_SetupStageCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  USB Start Of Frame callback.

+  * @param  hpcd PCD handle

+  * @retval None

+  */

+__weak void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hpcd);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_PCD_SOFCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  USB Reset callback.

+  * @param  hpcd PCD handle

+  * @retval None

+  */

+__weak void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hpcd);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_PCD_ResetCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Suspend event callback.

+  * @param  hpcd PCD handle

+  * @retval None

+  */

+__weak void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hpcd);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_PCD_SuspendCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Resume event callback.

+  * @param  hpcd PCD handle

+  * @retval None

+  */

+__weak void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hpcd);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_PCD_ResumeCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Incomplete ISO OUT callback.

+  * @param  hpcd PCD handle

+  * @param  epnum endpoint number

+  * @retval None

+  */

+__weak void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hpcd);

+  UNUSED(epnum);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_PCD_ISOOUTIncompleteCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Incomplete ISO IN callback.

+  * @param  hpcd PCD handle

+  * @param  epnum endpoint number

+  * @retval None

+  */

+__weak void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hpcd);

+  UNUSED(epnum);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_PCD_ISOINIncompleteCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Connection event callback.

+  * @param  hpcd PCD handle

+  * @retval None

+  */

+__weak void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hpcd);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_PCD_ConnectCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Disconnection event callback.

+  * @param  hpcd PCD handle

+  * @retval None

+  */

+__weak void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hpcd);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_PCD_DisconnectCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup PCD_Exported_Functions_Group3 Peripheral Control functions

+ *  @brief   management functions

+ *

+@verbatim

+ ===============================================================================

+                      ##### Peripheral Control functions #####

+ ===============================================================================

+    [..]

+    This subsection provides a set of functions allowing to control the PCD data

+    transfers.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Connect the USB device

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd)

+{

+#if defined (USB_OTG_FS)

+  USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;

+#endif /* defined (USB_OTG_FS) */

+

+  __HAL_LOCK(hpcd);

+#if defined (USB_OTG_FS)

+  if (hpcd->Init.battery_charging_enable == 1U)

+  {

+    /* Enable USB Transceiver */

+    USBx->GCCFG |= USB_OTG_GCCFG_PWRDWN;

+  }

+#endif /* defined (USB_OTG_FS) */

+  (void)USB_DevConnect(hpcd->Instance);

+  __HAL_UNLOCK(hpcd);

+  return HAL_OK;

+}

+

+/**

+  * @brief  Disconnect the USB device.

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd)

+{

+#if defined (USB_OTG_FS)

+  USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;

+

+#endif /* defined (USB_OTG_FS) */

+  __HAL_LOCK(hpcd);

+  (void)USB_DevDisconnect(hpcd->Instance);

+#if defined (USB_OTG_FS)

+  if (hpcd->Init.battery_charging_enable == 1U)

+  {

+    /* Disable USB Transceiver */

+    USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN);

+  }

+#endif /* defined (USB_OTG_FS) */

+  __HAL_UNLOCK(hpcd);

+  return HAL_OK;

+}

+

+/**

+  * @brief  Set the USB Device address.

+  * @param  hpcd PCD handle

+  * @param  address new device address

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address)

+{

+  __HAL_LOCK(hpcd);

+  hpcd->USB_Address = address;

+  (void)USB_SetDevAddress(hpcd->Instance, address);

+  __HAL_UNLOCK(hpcd);

+  return HAL_OK;

+}

+/**

+  * @brief  Open and configure an endpoint.

+  * @param  hpcd PCD handle

+  * @param  ep_addr endpoint address

+  * @param  ep_mps endpoint max packet size

+  * @param  ep_type endpoint type

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type)

+{

+  HAL_StatusTypeDef  ret = HAL_OK;

+  PCD_EPTypeDef *ep;

+

+  if ((ep_addr & 0x80U) == 0x80U)

+  {

+    ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];

+    ep->is_in = 1U;

+  }

+  else

+  {

+    ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK];

+    ep->is_in = 0U;

+  }

+

+  ep->num = ep_addr & EP_ADDR_MSK;

+  ep->maxpacket = ep_mps;

+  ep->type = ep_type;

+

+  if (ep->is_in != 0U)

+  {

+    /* Assign a Tx FIFO */

+    ep->tx_fifo_num = ep->num;

+  }

+  /* Set initial data PID. */

+  if (ep_type == EP_TYPE_BULK)

+  {

+    ep->data_pid_start = 0U;

+  }

+

+  __HAL_LOCK(hpcd);

+  (void)USB_ActivateEndpoint(hpcd->Instance, ep);

+  __HAL_UNLOCK(hpcd);

+

+  return ret;

+}

+

+/**

+  * @brief  Deactivate an endpoint.

+  * @param  hpcd PCD handle

+  * @param  ep_addr endpoint address

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)

+{

+  PCD_EPTypeDef *ep;

+

+  if ((ep_addr & 0x80U) == 0x80U)

+  {

+    ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];

+    ep->is_in = 1U;

+  }

+  else

+  {

+    ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK];

+    ep->is_in = 0U;

+  }

+  ep->num   = ep_addr & EP_ADDR_MSK;

+

+  __HAL_LOCK(hpcd);

+  (void)USB_DeactivateEndpoint(hpcd->Instance, ep);

+  __HAL_UNLOCK(hpcd);

+  return HAL_OK;

+}

+

+

+/**

+  * @brief  Receive an amount of data.

+  * @param  hpcd PCD handle

+  * @param  ep_addr endpoint address

+  * @param  pBuf pointer to the reception buffer

+  * @param  len amount of data to be received

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)

+{

+  PCD_EPTypeDef *ep;

+

+  ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK];

+

+  /*setup and start the Xfer */

+  ep->xfer_buff = pBuf;

+  ep->xfer_len = len;

+  ep->xfer_count = 0U;

+  ep->is_in = 0U;

+  ep->num = ep_addr & EP_ADDR_MSK;

+

+  if ((ep_addr & EP_ADDR_MSK) == 0U)

+  {

+    (void)USB_EP0StartXfer(hpcd->Instance, ep);

+  }

+  else

+  {

+    (void)USB_EPStartXfer(hpcd->Instance, ep);

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Get Received Data Size

+  * @param  hpcd PCD handle

+  * @param  ep_addr endpoint address

+  * @retval Data Size

+  */

+uint32_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)

+{

+  return hpcd->OUT_ep[ep_addr & EP_ADDR_MSK].xfer_count;

+}

+/**

+  * @brief  Send an amount of data

+  * @param  hpcd PCD handle

+  * @param  ep_addr endpoint address

+  * @param  pBuf pointer to the transmission buffer

+  * @param  len amount of data to be sent

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)

+{

+  PCD_EPTypeDef *ep;

+

+  ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];

+

+  /*setup and start the Xfer */

+  ep->xfer_buff = pBuf;

+  ep->xfer_len = len;

+  ep->xfer_count = 0U;

+  ep->is_in = 1U;

+  ep->num = ep_addr & EP_ADDR_MSK;

+

+  if ((ep_addr & EP_ADDR_MSK) == 0U)

+  {

+    (void)USB_EP0StartXfer(hpcd->Instance, ep);

+  }

+  else

+  {

+    (void)USB_EPStartXfer(hpcd->Instance, ep);

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Set a STALL condition over an endpoint

+  * @param  hpcd PCD handle

+  * @param  ep_addr endpoint address

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)

+{

+  PCD_EPTypeDef *ep;

+

+  if (((uint32_t)ep_addr & EP_ADDR_MSK) > hpcd->Init.dev_endpoints)

+  {

+    return HAL_ERROR;

+  }

+

+  if ((0x80U & ep_addr) == 0x80U)

+  {

+    ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];

+    ep->is_in = 1U;

+  }

+  else

+  {

+    ep = &hpcd->OUT_ep[ep_addr];

+    ep->is_in = 0U;

+  }

+

+  ep->is_stall = 1U;

+  ep->num = ep_addr & EP_ADDR_MSK;

+

+  __HAL_LOCK(hpcd);

+

+  (void)USB_EPSetStall(hpcd->Instance, ep);

+  if ((ep_addr & EP_ADDR_MSK) == 0U)

+  {

+    (void)USB_EP0_OutStart(hpcd->Instance, (uint8_t *)hpcd->Setup);

+  }

+  __HAL_UNLOCK(hpcd);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Clear a STALL condition over in an endpoint

+  * @param  hpcd PCD handle

+  * @param  ep_addr endpoint address

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)

+{

+  PCD_EPTypeDef *ep;

+

+  if (((uint32_t)ep_addr & 0x0FU) > hpcd->Init.dev_endpoints)

+  {

+    return HAL_ERROR;

+  }

+

+  if ((0x80U & ep_addr) == 0x80U)

+  {

+    ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];

+    ep->is_in = 1U;

+  }

+  else

+  {

+    ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK];

+    ep->is_in = 0U;

+  }

+

+  ep->is_stall = 0U;

+  ep->num = ep_addr & EP_ADDR_MSK;

+

+  __HAL_LOCK(hpcd);

+  (void)USB_EPClearStall(hpcd->Instance, ep);

+  __HAL_UNLOCK(hpcd);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Flush an endpoint

+  * @param  hpcd PCD handle

+  * @param  ep_addr endpoint address

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)

+{

+  __HAL_LOCK(hpcd);

+

+  if ((ep_addr & 0x80U) == 0x80U)

+  {

+    (void)USB_FlushTxFifo(hpcd->Instance, (uint32_t)ep_addr & EP_ADDR_MSK);

+  }

+  else

+  {

+    (void)USB_FlushRxFifo(hpcd->Instance);

+  }

+

+  __HAL_UNLOCK(hpcd);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Activate remote wakeup signalling

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd)

+{

+  return (USB_ActivateRemoteWakeup(hpcd->Instance));

+}

+

+/**

+  * @brief  De-activate remote wakeup signalling.

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd)

+{

+  return (USB_DeActivateRemoteWakeup(hpcd->Instance));

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup PCD_Exported_Functions_Group4 Peripheral State functions

+ *  @brief   Peripheral State functions

+ *

+@verbatim

+ ===============================================================================

+                      ##### Peripheral State functions #####

+ ===============================================================================

+    [..]

+    This subsection permits to get in run-time the status of the peripheral

+    and the data flow.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Return the PCD handle state.

+  * @param  hpcd PCD handle

+  * @retval HAL state

+  */

+PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef *hpcd)

+{

+  return hpcd->State;

+}

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Private functions ---------------------------------------------------------*/

+/** @addtogroup PCD_Private_Functions

+  * @{

+  */

+#if defined (USB_OTG_FS)

+/**

+  * @brief  Check FIFO for the next packet to be loaded.

+  * @param  hpcd PCD handle

+  * @param  epnum endpoint number

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum)

+{

+  USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  USB_OTG_EPTypeDef *ep;

+  uint32_t len;

+  uint32_t len32b;

+  uint32_t fifoemptymsk;

+

+  ep = &hpcd->IN_ep[epnum];

+

+  if (ep->xfer_count > ep->xfer_len)

+  {

+    return HAL_ERROR;

+  }

+

+  len = ep->xfer_len - ep->xfer_count;

+

+  if (len > ep->maxpacket)

+  {

+    len = ep->maxpacket;

+  }

+

+  len32b = (len + 3U) / 4U;

+

+  while (((USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) >= len32b) &&

+         (ep->xfer_count < ep->xfer_len) && (ep->xfer_len != 0U))

+  {

+    /* Write the FIFO */

+    len = ep->xfer_len - ep->xfer_count;

+

+    if (len > ep->maxpacket)

+    {

+      len = ep->maxpacket;

+    }

+    len32b = (len + 3U) / 4U;

+

+    (void)USB_WritePacket(USBx, ep->xfer_buff, (uint8_t)epnum, (uint16_t)len);

+

+    ep->xfer_buff  += len;

+    ep->xfer_count += len;

+  }

+

+  if (ep->xfer_len <= ep->xfer_count)

+  {

+    fifoemptymsk = (uint32_t)(0x1UL << (epnum & EP_ADDR_MSK));

+    USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk;

+  }

+

+  return HAL_OK;

+}

+

+

+/**

+  * @brief  process EP OUT transfer complete interrupt.

+  * @param  hpcd PCD handle

+  * @param  epnum endpoint number

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint32_t epnum)

+{

+  USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t gSNPSiD = *(__IO uint32_t *)(&USBx->CID + 0x1U);

+  uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT;

+

+  if (gSNPSiD == USB_OTG_CORE_ID_310A)

+  {

+    /* StupPktRcvd = 1 this is a setup packet */

+    if ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)

+    {

+      CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX);

+    }

+    else

+    {

+      if ((DoepintReg & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR)

+      {

+        CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR);

+      }

+

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+      hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum);

+#else

+      HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+    }

+  }

+  else

+  {

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+    hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum);

+#else

+    HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+  }

+

+  return HAL_OK;

+}

+

+

+/**

+  * @brief  process EP OUT setup packet received interrupt.

+  * @param  hpcd PCD handle

+  * @param  epnum endpoint number

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint32_t epnum)

+{

+  USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t gSNPSiD = *(__IO uint32_t *)(&USBx->CID + 0x1U);

+  uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT;

+

+

+  if ((gSNPSiD == USB_OTG_CORE_ID_310A) &&

+      ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX))

+  {

+    CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX);

+  }

+

+  /* Inform the upper layer that a setup packet is available */

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+  hpcd->SetupStageCallback(hpcd);

+#else

+  HAL_PCD_SetupStageCallback(hpcd);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+

+  return HAL_OK;

+}

+#endif /* defined (USB_OTG_FS) */

+

+#if defined (USB)

+/**

+  * @brief  This function handles PCD Endpoint interrupt request.

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef PCD_EP_ISR_Handler(PCD_HandleTypeDef *hpcd)

+{

+  PCD_EPTypeDef *ep;

+  uint16_t count;

+  uint16_t wIstr;

+  uint16_t wEPVal;

+  uint8_t epindex;

+

+  /* stay in loop while pending interrupts */

+  while ((hpcd->Instance->ISTR & USB_ISTR_CTR) != 0U)

+  {

+    wIstr = hpcd->Instance->ISTR;

+    /* extract highest priority endpoint number */

+    epindex = (uint8_t)(wIstr & USB_ISTR_EP_ID);

+

+    if (epindex == 0U)

+    {

+      /* Decode and service control endpoint interrupt */

+

+      /* DIR bit = origin of the interrupt */

+      if ((wIstr & USB_ISTR_DIR) == 0U)

+      {

+        /* DIR = 0 */

+

+        /* DIR = 0      => IN  int */

+        /* DIR = 0 implies that (EP_CTR_TX = 1) always  */

+        PCD_CLEAR_TX_EP_CTR(hpcd->Instance, PCD_ENDP0);

+        ep = &hpcd->IN_ep[0];

+

+        ep->xfer_count = PCD_GET_EP_TX_CNT(hpcd->Instance, ep->num);

+        ep->xfer_buff += ep->xfer_count;

+

+        /* TX COMPLETE */

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+        hpcd->DataInStageCallback(hpcd, 0U);

+#else

+        HAL_PCD_DataInStageCallback(hpcd, 0U);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+

+        if ((hpcd->USB_Address > 0U) && (ep->xfer_len == 0U))

+        {

+          hpcd->Instance->DADDR = ((uint16_t)hpcd->USB_Address | USB_DADDR_EF);

+          hpcd->USB_Address = 0U;

+        }

+      }

+      else

+      {

+        /* DIR = 1 */

+

+        /* DIR = 1 & CTR_RX       => SETUP or OUT int */

+        /* DIR = 1 & (CTR_TX | CTR_RX) => 2 int pending */

+        ep = &hpcd->OUT_ep[0];

+        wEPVal = PCD_GET_ENDPOINT(hpcd->Instance, PCD_ENDP0);

+

+        if ((wEPVal & USB_EP_SETUP) != 0U)

+        {

+          /* Get SETUP Packet*/

+          ep->xfer_count = PCD_GET_EP_RX_CNT(hpcd->Instance, ep->num);

+

+          USB_ReadPMA(hpcd->Instance, (uint8_t *)hpcd->Setup,

+                      ep->pmaadress, (uint16_t)ep->xfer_count);

+

+          /* SETUP bit kept frozen while CTR_RX = 1*/

+          PCD_CLEAR_RX_EP_CTR(hpcd->Instance, PCD_ENDP0);

+

+          /* Process SETUP Packet*/

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+          hpcd->SetupStageCallback(hpcd);

+#else

+          HAL_PCD_SetupStageCallback(hpcd);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+        }

+

+        else if ((wEPVal & USB_EP_CTR_RX) != 0U)

+        {

+          PCD_CLEAR_RX_EP_CTR(hpcd->Instance, PCD_ENDP0);

+

+          /* Get Control Data OUT Packet*/

+          ep->xfer_count = PCD_GET_EP_RX_CNT(hpcd->Instance, ep->num);

+

+          if ((ep->xfer_count != 0U) && (ep->xfer_buff != 0U))

+          {

+            USB_ReadPMA(hpcd->Instance, ep->xfer_buff,

+                        ep->pmaadress, (uint16_t)ep->xfer_count);

+

+            ep->xfer_buff += ep->xfer_count;

+

+            /* Process Control Data OUT Packet*/

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+            hpcd->DataOutStageCallback(hpcd, 0U);

+#else

+            HAL_PCD_DataOutStageCallback(hpcd, 0U);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+          }

+

+          PCD_SET_EP_RX_CNT(hpcd->Instance, PCD_ENDP0, ep->maxpacket);

+          PCD_SET_EP_RX_STATUS(hpcd->Instance, PCD_ENDP0, USB_EP_RX_VALID);

+        }

+      }

+    }

+    else

+    {

+      /* Decode and service non control endpoints interrupt  */

+

+      /* process related endpoint register */

+      wEPVal = PCD_GET_ENDPOINT(hpcd->Instance, epindex);

+      if ((wEPVal & USB_EP_CTR_RX) != 0U)

+      {

+        /* clear int flag */

+        PCD_CLEAR_RX_EP_CTR(hpcd->Instance, epindex);

+        ep = &hpcd->OUT_ep[epindex];

+

+        /* OUT double Buffering*/

+        if (ep->doublebuffer == 0U)

+        {

+          count = (uint16_t)PCD_GET_EP_RX_CNT(hpcd->Instance, ep->num);

+          if (count != 0U)

+          {

+            USB_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaadress, count);

+          }

+        }

+        else

+        {

+          if ((PCD_GET_ENDPOINT(hpcd->Instance, ep->num) & USB_EP_DTOG_RX) != 0U)

+          {

+            /*read from endpoint BUF0Addr buffer*/

+            count = (uint16_t)PCD_GET_EP_DBUF0_CNT(hpcd->Instance, ep->num);

+            if (count != 0U)

+            {

+              USB_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaaddr0, count);

+            }

+          }

+          else

+          {

+            /*read from endpoint BUF1Addr buffer*/

+            count = (uint16_t)PCD_GET_EP_DBUF1_CNT(hpcd->Instance, ep->num);

+            if (count != 0U)

+            {

+              USB_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaaddr1, count);

+            }

+          }

+          /* free EP OUT Buffer */

+          PCD_FreeUserBuffer(hpcd->Instance, ep->num, 0U);

+        }

+        /*multi-packet on the NON control OUT endpoint*/

+        ep->xfer_count += count;

+        ep->xfer_buff += count;

+

+        if ((ep->xfer_len == 0U) || (count < ep->maxpacket))

+        {

+          /* RX COMPLETE */

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+          hpcd->DataOutStageCallback(hpcd, ep->num);

+#else

+          HAL_PCD_DataOutStageCallback(hpcd, ep->num);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+        }

+        else

+        {

+          (void)HAL_PCD_EP_Receive(hpcd, ep->num, ep->xfer_buff, ep->xfer_len);

+        }

+

+      } /* if((wEPVal & EP_CTR_RX) */

+

+      if ((wEPVal & USB_EP_CTR_TX) != 0U)

+      {

+        ep = &hpcd->IN_ep[epindex];

+

+        /* clear int flag */

+        PCD_CLEAR_TX_EP_CTR(hpcd->Instance, epindex);

+

+        /*multi-packet on the NON control IN endpoint*/

+        ep->xfer_count = PCD_GET_EP_TX_CNT(hpcd->Instance, ep->num);

+        ep->xfer_buff += ep->xfer_count;

+

+        /* Zero Length Packet? */

+        if (ep->xfer_len == 0U)

+        {

+          /* TX COMPLETE */

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+          hpcd->DataInStageCallback(hpcd, ep->num);

+#else

+          HAL_PCD_DataInStageCallback(hpcd, ep->num);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+        }

+        else

+        {

+          (void)HAL_PCD_EP_Transmit(hpcd, ep->num, ep->xfer_buff, ep->xfer_len);

+        }

+      }

+    }

+  }

+  return HAL_OK;

+}

+#endif /* defined (USB) */

+

+/**

+  * @}

+  */

+#endif /* defined (USB) || defined (USB_OTG_FS) */

+#endif /* HAL_PCD_MODULE_ENABLED */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd_ex.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd_ex.c
new file mode 100644
index 0000000..b4a4842
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd_ex.c
@@ -0,0 +1,566 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_pcd_ex.c

+  * @author  MCD Application Team

+  * @brief   PCD Extended HAL module driver.

+  *          This file provides firmware functions to manage the following

+  *          functionalities of the USB Peripheral Controller:

+  *           + Extended features functions

+  *

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup PCDEx PCDEx

+  * @brief PCD Extended HAL module driver

+  * @{

+  */

+

+#ifdef HAL_PCD_MODULE_ENABLED

+

+#if defined (USB) || defined (USB_OTG_FS)

+/* Private types -------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/* Private constants ---------------------------------------------------------*/

+/* Private macros ------------------------------------------------------------*/

+/* Private functions ---------------------------------------------------------*/

+/* Exported functions --------------------------------------------------------*/

+

+/** @defgroup PCDEx_Exported_Functions PCDEx Exported Functions

+  * @{

+  */

+

+/** @defgroup PCDEx_Exported_Functions_Group1 Peripheral Control functions

+  * @brief    PCDEx control functions

+ *

+@verbatim

+ ===============================================================================

+                 ##### Extended features functions #####

+ ===============================================================================

+    [..]  This section provides functions allowing to:

+      (+) Update FIFO configuration

+

+@endverbatim

+  * @{

+  */

+#if defined (USB_OTG_FS)

+/**

+  * @brief  Set Tx FIFO

+  * @param  hpcd PCD handle

+  * @param  fifo The number of Tx fifo

+  * @param  size Fifo size

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size)

+{

+  uint8_t i;

+  uint32_t Tx_Offset;

+

+  /*  TXn min size = 16 words. (n  : Transmit FIFO index)

+      When a TxFIFO is not used, the Configuration should be as follows:

+          case 1 :  n > m    and Txn is not used    (n,m  : Transmit FIFO indexes)

+         --> Txm can use the space allocated for Txn.

+         case2  :  n < m    and Txn is not used    (n,m  : Transmit FIFO indexes)

+         --> Txn should be configured with the minimum space of 16 words

+     The FIFO is used optimally when used TxFIFOs are allocated in the top

+         of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones.

+     When DMA is used 3n * FIFO locations should be reserved for internal DMA registers */

+

+  Tx_Offset = hpcd->Instance->GRXFSIZ;

+

+  if (fifo == 0U)

+  {

+    hpcd->Instance->DIEPTXF0_HNPTXFSIZ = ((uint32_t)size << 16) | Tx_Offset;

+  }

+  else

+  {

+    Tx_Offset += (hpcd->Instance->DIEPTXF0_HNPTXFSIZ) >> 16;

+    for (i = 0U; i < (fifo - 1U); i++)

+    {

+      Tx_Offset += (hpcd->Instance->DIEPTXF[i] >> 16);

+    }

+

+    /* Multiply Tx_Size by 2 to get higher performance */

+    hpcd->Instance->DIEPTXF[fifo - 1U] = ((uint32_t)size << 16) | Tx_Offset;

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Set Rx FIFO

+  * @param  hpcd PCD handle

+  * @param  size Size of Rx fifo

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCDEx_SetRxFiFo(PCD_HandleTypeDef *hpcd, uint16_t size)

+{

+  hpcd->Instance->GRXFSIZ = size;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Activate LPM feature.

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCDEx_ActivateLPM(PCD_HandleTypeDef *hpcd)

+{

+  USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;

+

+  hpcd->lpm_active = 1U;

+  hpcd->LPM_State = LPM_L0;

+  USBx->GINTMSK |= USB_OTG_GINTMSK_LPMINTM;

+  USBx->GLPMCFG |= (USB_OTG_GLPMCFG_LPMEN | USB_OTG_GLPMCFG_LPMACK | USB_OTG_GLPMCFG_ENBESL);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Deactivate LPM feature.

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCDEx_DeActivateLPM(PCD_HandleTypeDef *hpcd)

+{

+  USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;

+

+  hpcd->lpm_active = 0U;

+  USBx->GINTMSK &= ~USB_OTG_GINTMSK_LPMINTM;

+  USBx->GLPMCFG &= ~(USB_OTG_GLPMCFG_LPMEN | USB_OTG_GLPMCFG_LPMACK | USB_OTG_GLPMCFG_ENBESL);

+

+  return HAL_OK;

+}

+

+

+/**

+  * @brief  Handle BatteryCharging Process.

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+void HAL_PCDEx_BCD_VBUSDetect(PCD_HandleTypeDef *hpcd)

+{

+  USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;

+  uint32_t tickstart = HAL_GetTick();

+

+  /* Enable DCD : Data Contact Detect */

+  USBx->GCCFG |= USB_OTG_GCCFG_DCDEN;

+

+  /* Wait Detect flag or a timeout is happen*/

+  while ((USBx->GCCFG & USB_OTG_GCCFG_DCDET) == 0U)

+  {

+    /* Check for the Timeout */

+    if ((HAL_GetTick() - tickstart) > 1000U)

+    {

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+      hpcd->BCDCallback(hpcd, PCD_BCD_ERROR);

+#else

+      HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_ERROR);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+

+      return;

+    }

+  }

+

+  /* Right response got */

+  HAL_Delay(200U);

+

+  /* Check Detect flag*/

+  if ((USBx->GCCFG & USB_OTG_GCCFG_DCDET) == USB_OTG_GCCFG_DCDET)

+  {

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+    hpcd->BCDCallback(hpcd, PCD_BCD_CONTACT_DETECTION);

+#else

+    HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_CONTACT_DETECTION);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+  }

+

+  /*Primary detection: checks if connected to Standard Downstream Port

+  (without charging capability) */

+  USBx->GCCFG &= ~ USB_OTG_GCCFG_DCDEN;

+  HAL_Delay(50U);

+  USBx->GCCFG |=  USB_OTG_GCCFG_PDEN;

+  HAL_Delay(50U);

+

+  if ((USBx->GCCFG & USB_OTG_GCCFG_PDET) == 0U)

+  {

+    /* Case of Standard Downstream Port */

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+    hpcd->BCDCallback(hpcd, PCD_BCD_STD_DOWNSTREAM_PORT);

+#else

+    HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_STD_DOWNSTREAM_PORT);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+  }

+  else

+  {

+    /* start secondary detection to check connection to Charging Downstream

+    Port or Dedicated Charging Port */

+    USBx->GCCFG &= ~ USB_OTG_GCCFG_PDEN;

+    HAL_Delay(50U);

+    USBx->GCCFG |=  USB_OTG_GCCFG_SDEN;

+    HAL_Delay(50U);

+

+    if ((USBx->GCCFG & USB_OTG_GCCFG_SDET) == USB_OTG_GCCFG_SDET)

+    {

+      /* case Dedicated Charging Port  */

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+      hpcd->BCDCallback(hpcd, PCD_BCD_DEDICATED_CHARGING_PORT);

+#else

+      HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_DEDICATED_CHARGING_PORT);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+    }

+    else

+    {

+      /* case Charging Downstream Port  */

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+      hpcd->BCDCallback(hpcd, PCD_BCD_CHARGING_DOWNSTREAM_PORT);

+#else

+      HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_CHARGING_DOWNSTREAM_PORT);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+    }

+  }

+

+  /* Battery Charging capability discovery finished */

+  (void)HAL_PCDEx_DeActivateBCD(hpcd);

+

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+  hpcd->BCDCallback(hpcd, PCD_BCD_DISCOVERY_COMPLETED);

+#else

+  HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_DISCOVERY_COMPLETED);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  Activate BatteryCharging feature.

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCDEx_ActivateBCD(PCD_HandleTypeDef *hpcd)

+{

+  USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;

+

+  USBx->GCCFG &= ~(USB_OTG_GCCFG_PDEN);

+  USBx->GCCFG &= ~(USB_OTG_GCCFG_SDEN);

+

+  /* Power Down USB tranceiver  */

+  USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN);

+

+  /* Enable Battery charging */

+  USBx->GCCFG |= USB_OTG_GCCFG_BCDEN;

+

+  hpcd->battery_charging_active = 1U;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Deactivate BatteryCharging feature.

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCDEx_DeActivateBCD(PCD_HandleTypeDef *hpcd)

+{

+  USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;

+

+  USBx->GCCFG &= ~(USB_OTG_GCCFG_SDEN);

+  USBx->GCCFG &= ~(USB_OTG_GCCFG_PDEN);

+

+  /* Disable Battery charging */

+  USBx->GCCFG &= ~(USB_OTG_GCCFG_BCDEN);

+

+  hpcd->battery_charging_active = 0U;

+

+  return HAL_OK;

+}

+

+#endif /* defined (USB_OTG_FS) */

+#if defined (USB)

+/**

+  * @brief  Configure PMA for EP

+  * @param  hpcd  Device instance

+  * @param  ep_addr endpoint address

+  * @param  ep_kind endpoint Kind

+  *                  USB_SNG_BUF: Single Buffer used

+  *                  USB_DBL_BUF: Double Buffer used

+  * @param  pmaadress: EP address in The PMA: In case of single buffer endpoint

+  *                   this parameter is 16-bit value providing the address

+  *                   in PMA allocated to endpoint.

+  *                   In case of double buffer endpoint this parameter

+  *                   is a 32-bit value providing the endpoint buffer 0 address

+  *                   in the LSB part of 32-bit value and endpoint buffer 1 address

+  *                   in the MSB part of 32-bit value.

+  * @retval HAL status

+  */

+

+HAL_StatusTypeDef  HAL_PCDEx_PMAConfig(PCD_HandleTypeDef *hpcd,

+                                       uint16_t ep_addr,

+                                       uint16_t ep_kind,

+                                       uint32_t pmaadress)

+{

+  PCD_EPTypeDef *ep;

+

+  /* initialize ep structure*/

+  if ((0x80U & ep_addr) == 0x80U)

+  {

+    ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];

+  }

+  else

+  {

+    ep = &hpcd->OUT_ep[ep_addr];

+  }

+

+  /* Here we check if the endpoint is single or double Buffer*/

+  if (ep_kind == PCD_SNG_BUF)

+  {

+    /* Single Buffer */

+    ep->doublebuffer = 0U;

+    /* Configure the PMA */

+    ep->pmaadress = (uint16_t)pmaadress;

+  }

+  else /* USB_DBL_BUF */

+  {

+    /* Double Buffer Endpoint */

+    ep->doublebuffer = 1U;

+    /* Configure the PMA */

+    ep->pmaaddr0 = (uint16_t)(pmaadress & 0xFFFFU);

+    ep->pmaaddr1 = (uint16_t)((pmaadress & 0xFFFF0000U) >> 16);

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Activate BatteryCharging feature.

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCDEx_ActivateBCD(PCD_HandleTypeDef *hpcd)

+{

+  USB_TypeDef *USBx = hpcd->Instance;

+  hpcd->battery_charging_active = 1U;

+

+  /* Enable DCD : Data Contact Detect */

+  USBx->BCDR &= ~(USB_BCDR_PDEN);

+  USBx->BCDR &= ~(USB_BCDR_SDEN);

+  USBx->BCDR |= USB_BCDR_DCDEN;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Deactivate BatteryCharging feature.

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCDEx_DeActivateBCD(PCD_HandleTypeDef *hpcd)

+{

+  USB_TypeDef *USBx = hpcd->Instance;

+  hpcd->battery_charging_active = 0U;

+

+  USBx->BCDR &= ~(USB_BCDR_BCDEN);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Handle BatteryCharging Process.

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+void HAL_PCDEx_BCD_VBUSDetect(PCD_HandleTypeDef *hpcd)

+{

+  USB_TypeDef *USBx = hpcd->Instance;

+  uint32_t tickstart = HAL_GetTick();

+

+  /* Wait Detect flag or a timeout is happen*/

+  while ((USBx->BCDR & USB_BCDR_DCDET) == 0U)

+  {

+    /* Check for the Timeout */

+    if ((HAL_GetTick() - tickstart) > 1000U)

+    {

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+      hpcd->BCDCallback(hpcd, PCD_BCD_ERROR);

+#else

+      HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_ERROR);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+

+      return;

+    }

+  }

+

+  HAL_Delay(200U);

+

+  /* Data Pin Contact ? Check Detect flag */

+  if ((USBx->BCDR & USB_BCDR_DCDET) == USB_BCDR_DCDET)

+  {

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+    hpcd->BCDCallback(hpcd, PCD_BCD_CONTACT_DETECTION);

+#else

+    HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_CONTACT_DETECTION);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+  }

+  /* Primary detection: checks if connected to Standard Downstream Port

+  (without charging capability) */

+  USBx->BCDR &= ~(USB_BCDR_DCDEN);

+  HAL_Delay(50U);

+  USBx->BCDR |= (USB_BCDR_PDEN);

+  HAL_Delay(50U);

+

+  /* If Charger detect ? */

+  if ((USBx->BCDR & USB_BCDR_PDET) == USB_BCDR_PDET)

+  {

+    /* Start secondary detection to check connection to Charging Downstream

+    Port or Dedicated Charging Port */

+    USBx->BCDR &= ~(USB_BCDR_PDEN);

+    HAL_Delay(50U);

+    USBx->BCDR |= (USB_BCDR_SDEN);

+    HAL_Delay(50U);

+

+    /* If CDP ? */

+    if ((USBx->BCDR & USB_BCDR_SDET) == USB_BCDR_SDET)

+    {

+      /* Dedicated Downstream Port DCP */

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+      hpcd->BCDCallback(hpcd, PCD_BCD_DEDICATED_CHARGING_PORT);

+#else

+      HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_DEDICATED_CHARGING_PORT);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+    }

+    else

+    {

+      /* Charging Downstream Port CDP */

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+      hpcd->BCDCallback(hpcd, PCD_BCD_CHARGING_DOWNSTREAM_PORT);

+#else

+      HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_CHARGING_DOWNSTREAM_PORT);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+    }

+  }

+  else /* NO */

+  {

+    /* Standard Downstream Port */

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+    hpcd->BCDCallback(hpcd, PCD_BCD_STD_DOWNSTREAM_PORT);

+#else

+    HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_STD_DOWNSTREAM_PORT);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+  }

+

+  /* Battery Charging capability discovery finished Start Enumeration */

+  (void)HAL_PCDEx_DeActivateBCD(hpcd);

+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)

+  hpcd->BCDCallback(hpcd, PCD_BCD_DISCOVERY_COMPLETED);

+#else

+  HAL_PCDEx_BCD_Callback(hpcd, PCD_BCD_DISCOVERY_COMPLETED);

+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

+}

+

+

+/**

+  * @brief  Activate LPM feature.

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCDEx_ActivateLPM(PCD_HandleTypeDef *hpcd)

+{

+

+  USB_TypeDef *USBx = hpcd->Instance;

+  hpcd->lpm_active = 1U;

+  hpcd->LPM_State = LPM_L0;

+

+  USBx->LPMCSR |= USB_LPMCSR_LMPEN;

+  USBx->LPMCSR |= USB_LPMCSR_LPMACK;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Deactivate LPM feature.

+  * @param  hpcd PCD handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PCDEx_DeActivateLPM(PCD_HandleTypeDef *hpcd)

+{

+  USB_TypeDef *USBx = hpcd->Instance;

+

+  hpcd->lpm_active = 0U;

+

+  USBx->LPMCSR &= ~(USB_LPMCSR_LMPEN);

+  USBx->LPMCSR &= ~(USB_LPMCSR_LPMACK);

+

+  return HAL_OK;

+}

+

+#endif /* defined (USB) */

+

+/**

+  * @brief  Send LPM message to user layer callback.

+  * @param  hpcd PCD handle

+  * @param  msg LPM message

+  * @retval HAL status

+  */

+__weak void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hpcd);

+  UNUSED(msg);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_PCDEx_LPM_Callback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Send BatteryCharging message to user layer callback.

+  * @param  hpcd PCD handle

+  * @param  msg LPM message

+  * @retval HAL status

+  */

+__weak void HAL_PCDEx_BCD_Callback(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hpcd);

+  UNUSED(msg);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_PCDEx_BCD_Callback could be implemented in the user file

+   */

+}

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+#endif /* defined (USB) || defined (USB_OTG_FS) */

+#endif /* HAL_PCD_MODULE_ENABLED */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c
new file mode 100644
index 0000000..ba44650
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c
@@ -0,0 +1,661 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_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/de-initialization functions

+  *           + Peripheral Control functions

+  *

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup PWR PWR

+  * @brief PWR HAL module driver

+  * @{

+  */

+

+#ifdef HAL_PWR_MODULE_ENABLED

+

+/* Private typedef -----------------------------------------------------------*/

+/* Private define ------------------------------------------------------------*/

+

+/** @defgroup PWR_Private_Defines PWR Private Defines

+  * @{

+  */

+

+/** @defgroup PWR_PVD_Mode_Mask PWR PVD Mode Mask

+  * @{

+  */

+#define PVD_MODE_IT               ((uint32_t)0x00010000)  /*!< Mask for interruption yielded by PVD threshold crossing */

+#define PVD_MODE_EVT              ((uint32_t)0x00020000)  /*!< Mask for event yielded by PVD threshold crossing        */

+#define PVD_RISING_EDGE           ((uint32_t)0x00000001)  /*!< Mask for rising edge set as PVD trigger                 */

+#define PVD_FALLING_EDGE          ((uint32_t)0x00000002)  /*!< Mask for falling edge set as PVD trigger                */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Private macro -------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/* Private function prototypes -----------------------------------------------*/

+/* Exported 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 #####

+ ===============================================================================

+    [..]

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief Deinitialize 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 Enable access to the backup domain

+  *        (RTC registers, RTC backup data registers).

+  * @note  After reset, the backup domain is protected against

+  *        possible unwanted write accesses.

+  * @note  RTCSEL that sets the RTC clock source selection is in the RTC back-up domain.

+  *        In order to set or modify the RTC clock, the backup domain access must be

+  *        disabled.

+  * @note  LSEON bit that switches on and off the LSE crystal belongs as well to the

+  *        back-up domain.

+  * @retval None

+  */

+void HAL_PWR_EnableBkUpAccess(void)

+{

+  SET_BIT(PWR->CR1, PWR_CR1_DBP);

+}

+

+/**

+  * @brief Disable access to the backup domain

+  *        (RTC registers, RTC backup data registers).

+  * @retval None

+  */

+void HAL_PWR_DisableBkUpAccess(void)

+{

+  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 PWR_CR2 register).

+

+      (+) 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_PVD_EXTI_ENABLE_IT() macro.

+      (+) The PVD is stopped in Standby mode.

+

+

+    *** WakeUp pin configuration ***

+    ================================

+    [..]

+      (+) WakeUp pins are used to wakeup the system from Standby mode or Shutdown mode.

+          The polarity of these pins can be set to configure event detection on high

+          level (rising edge) or low level (falling edge).

+

+

+

+    *** Low Power modes configuration ***

+    =====================================

+    [..]

+      The devices feature 8 low-power modes:

+      (+) Low-power Run mode: core and peripherals are running, main regulator off, low power regulator on.

+      (+) Sleep mode: Cortex-M4 core stopped, peripherals kept running, main and low power regulators on.

+      (+) Low-power Sleep mode: Cortex-M4 core stopped, peripherals kept running, main regulator off, low power regulator on.

+      (+) Stop 0 mode: all clocks are stopped except LSI and LSE, main and low power regulators on.

+      (+) Stop 1 mode: all clocks are stopped except LSI and LSE, main regulator off, low power regulator on.

+      (+) Stop 2 mode: all clocks are stopped except LSI and LSE, main regulator off, low power regulator on, reduced set of waking up IPs compared to Stop 1 mode.

+      (+) Standby mode with SRAM2: all clocks are stopped except LSI and LSE, SRAM2 content preserved, main regulator off, low power regulator on.

+      (+) Standby mode without SRAM2: all clocks are stopped except LSI and LSE, main and low power regulators off.

+      (+) Shutdown mode: all clocks are stopped except LSE, main and low power regulators off.

+

+

+   *** Low-power run mode ***

+   ==========================

+    [..]

+      (+) Entry: (from main run mode)

+        (++) set LPR bit with HAL_PWREx_EnableLowPowerRunMode() API after having decreased the system clock below 2 MHz.

+

+      (+) Exit:

+        (++) clear LPR bit then wait for REGLP bit to be reset with HAL_PWREx_DisableLowPowerRunMode() API. Only

+             then can the system clock frequency be increased above 2 MHz.

+

+

+   *** Sleep mode / Low-power sleep mode ***

+   =========================================

+    [..]

+      (+) Entry:

+          The Sleep mode / Low-power Sleep mode is entered thru HAL_PWR_EnterSLEEPMode() API

+          in specifying whether or not the regulator is forced to low-power mode and if exit is interrupt or event-triggered.

+          (++) PWR_MAINREGULATOR_ON: Sleep mode (regulator in main mode).

+          (++) PWR_LOWPOWERREGULATOR_ON: Low-power sleep (regulator in low power mode).

+          In the latter case, the system clock frequency must have been decreased below 2 MHz beforehand.

+          (++) PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction

+          (++) PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction

+

+      (+) WFI Exit:

+        (++) Any peripheral interrupt acknowledged by the nested vectored interrupt

+             controller (NVIC) or any wake-up event.

+

+      (+) WFE Exit:

+        (++) Any wake-up event such as an EXTI line configured in event mode.

+

+         [..] When exiting the Low-power sleep mode by issuing an interrupt or a wakeup event,

+             the MCU is in Low-power Run mode.

+

+   *** Stop 0, Stop 1 and Stop 2 modes ***

+   ===============================

+    [..]

+      (+) Entry:

+          The Stop 0, Stop 1 or Stop 2 modes are entered thru the following API's:

+          (++) HAL_PWREx_EnterSTOP0Mode() for mode 0 or HAL_PWREx_EnterSTOP1Mode() for mode 1 or for porting reasons HAL_PWR_EnterSTOPMode().

+          (++) HAL_PWREx_EnterSTOP2Mode() for mode 2.

+      (+) Regulator setting (applicable to HAL_PWR_EnterSTOPMode() only):

+          (++) PWR_MAINREGULATOR_ON

+          (++) PWR_LOWPOWERREGULATOR_ON

+      (+) Exit (interrupt or event-triggered, specified when entering STOP mode):

+          (++) PWR_STOPENTRY_WFI: enter Stop mode with WFI instruction

+          (++) PWR_STOPENTRY_WFE: enter Stop mode with WFE instruction

+

+      (+) WFI Exit:

+          (++) Any EXTI Line (Internal or External) configured in Interrupt mode.

+          (++) Some specific communication peripherals (USART, LPUART, I2C) interrupts

+               when programmed in wakeup mode.

+      (+) WFE Exit:

+          (++) Any EXTI Line (Internal or External) configured in Event mode.

+

+       [..]

+          When exiting Stop 0 and Stop 1 modes, the MCU is either in Run mode or in Low-power Run mode

+          depending on the LPR bit setting.

+          When exiting Stop 2 mode, the MCU is in Run mode.

+

+   *** Standby mode ***

+   ====================

+     [..]

+      The Standby mode offers two options:

+      (+) option a) all clocks off except LSI and LSE, RRS bit set (keeps voltage regulator in low power mode).

+        SRAM and registers contents are lost except for the SRAM2 content, the RTC registers, RTC backup registers

+        and Standby circuitry.

+      (+) option b) all clocks off except LSI and LSE, RRS bit cleared (voltage regulator then disabled).

+        SRAM and register contents are lost except for the RTC registers, RTC backup registers

+        and Standby circuitry.

+

+      (++) Entry:

+          (+++) The Standby mode is entered thru HAL_PWR_EnterSTANDBYMode() API.

+                SRAM1 and register contents are lost except for registers in the Backup domain and

+                Standby circuitry. SRAM2 content can be preserved if the bit RRS is set in PWR_CR3 register.

+                To enable this feature, the user can resort to HAL_PWREx_EnableSRAM2ContentRetention() API

+                to set RRS bit.

+

+      (++) Exit:

+          (+++) WKUP pin rising edge, RTC alarm or wakeup, tamper event, time-stamp event,

+                external reset in NRST pin, IWDG reset.

+

+      [..]    After waking up from Standby mode, program execution restarts in the same way as after a Reset.

+

+

+    *** Shutdown mode ***

+   ======================

+     [..]

+      In Shutdown mode,

+        voltage regulator is disabled, all clocks are off except LSE, RRS bit is cleared.

+        SRAM and registers contents are lost except for backup domain registers.

+

+      (+) Entry:

+          The Shutdown mode is entered thru HAL_PWREx_EnterSHUTDOWNMode() API.

+

+      (+) Exit:

+          (++) WKUP pin rising edge, RTC alarm or wakeup, tamper event, time-stamp event,

+               external reset in NRST pin.

+

+         [..] After waking up from Shutdown mode, program execution restarts in the same way as after a 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, Standby and Shutdown 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 Configure the voltage threshold detected by the Power Voltage Detector (PVD).

+  * @param sConfigPVD: pointer to a PWR_PVDTypeDef structure that contains the PVD

+  *        configuration information.

+  * @note Refer to the electrical characteristics of your device datasheet for

+  *         more details about the voltage thresholds corresponding to each

+  *         detection level.

+  * @retval None

+  */

+HAL_StatusTypeDef 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 bits according to PVDLevel value */

+  MODIFY_REG(PWR->CR2, PWR_CR2_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_FALLING_EDGE();

+  __HAL_PWR_PVD_EXTI_DISABLE_RISING_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();

+  }

+

+  return HAL_OK;

+}

+

+

+/**

+  * @brief Enable the Power Voltage Detector (PVD).

+  * @retval None

+  */

+void HAL_PWR_EnablePVD(void)

+{

+  SET_BIT(PWR->CR2, PWR_CR2_PVDE);

+}

+

+/**

+  * @brief Disable the Power Voltage Detector (PVD).

+  * @retval None

+  */

+void HAL_PWR_DisablePVD(void)

+{

+  CLEAR_BIT(PWR->CR2, PWR_CR2_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 set the default polarity

+  *         i.e. detection on high level (rising edge):

+  *           @arg @ref PWR_WAKEUP_PIN1, PWR_WAKEUP_PIN2, PWR_WAKEUP_PIN3, PWR_WAKEUP_PIN4, PWR_WAKEUP_PIN5

+  *

+  *         or one of the following value where the user can explicitly specify the enabled pin and

+  *         the chosen polarity:

+  *           @arg @ref PWR_WAKEUP_PIN1_HIGH or PWR_WAKEUP_PIN1_LOW

+  *           @arg @ref PWR_WAKEUP_PIN2_HIGH or PWR_WAKEUP_PIN2_LOW

+  *           @arg @ref PWR_WAKEUP_PIN3_HIGH or PWR_WAKEUP_PIN3_LOW

+  *           @arg @ref PWR_WAKEUP_PIN4_HIGH or PWR_WAKEUP_PIN4_LOW

+  *           @arg @ref PWR_WAKEUP_PIN5_HIGH or PWR_WAKEUP_PIN5_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));

+

+  /* Specifies the Wake-Up pin polarity for the event detection

+    (rising or falling edge) */

+  MODIFY_REG(PWR->CR4, (PWR_CR3_EWUP & WakeUpPinPolarity), (WakeUpPinPolarity >> PWR_WUP_POLARITY_SHIFT));

+

+  /* Enable wake-up pin */

+  SET_BIT(PWR->CR3, (PWR_CR3_EWUP & WakeUpPinPolarity));

+

+

+}

+

+/**

+  * @brief Disable the WakeUp PINx functionality.

+  * @param WakeUpPinx: Specifies the Power Wake-Up pin to disable.

+  *         This parameter can be one of the following values:

+  *           @arg @ref PWR_WAKEUP_PIN1, PWR_WAKEUP_PIN2, PWR_WAKEUP_PIN3, PWR_WAKEUP_PIN4, PWR_WAKEUP_PIN5

+  * @retval None

+  */

+void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx)

+{

+  assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx));

+

+  CLEAR_BIT(PWR->CR3, (PWR_CR3_EWUP & WakeUpPinx));

+}

+

+

+/**

+  * @brief Enter Sleep or Low-power Sleep mode.

+  * @note  In Sleep/Low-power Sleep mode, all I/O pins keep the same state as in Run mode.

+  * @param Regulator: Specifies the regulator state in Sleep/Low-power Sleep mode.

+  *          This parameter can be one of the following values:

+  *            @arg @ref PWR_MAINREGULATOR_ON Sleep mode (regulator in main mode)

+  *            @arg @ref PWR_LOWPOWERREGULATOR_ON Low-power Sleep mode (regulator in low-power mode)

+  * @note  Low-power Sleep mode is entered from Low-power Run mode. Therefore, if not yet

+  *        in Low-power Run mode before calling HAL_PWR_EnterSLEEPMode() with Regulator set

+  *        to PWR_LOWPOWERREGULATOR_ON, the user can optionally configure the

+  *        Flash in power-down monde in setting the SLEEP_PD bit in FLASH_ACR register.

+  *        Additionally, the clock frequency must be reduced below 2 MHz.

+  *        Setting SLEEP_PD in FLASH_ACR then appropriately reducing the clock frequency must

+  *        be done before calling HAL_PWR_EnterSLEEPMode() API.

+  * @note  When exiting Low-power Sleep mode, the MCU is in Low-power Run mode. To move in

+  *        Run mode, the user must resort to HAL_PWREx_DisableLowPowerRunMode() API.

+  * @param SLEEPEntry: Specifies if Sleep mode is entered with WFI or WFE instruction.

+  *           This parameter can be one of the following values:

+  *            @arg @ref PWR_SLEEPENTRY_WFI enter Sleep or Low-power Sleep mode with WFI instruction

+  *            @arg @ref PWR_SLEEPENTRY_WFE enter Sleep or Low-power Sleep mode with WFE instruction

+  * @note  When WFI entry is used, tick interrupt have to be disabled if not desired as

+  *        the interrupt wake up source.

+  * @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));

+

+  /* Set Regulator parameter */

+  if (Regulator == PWR_MAINREGULATOR_ON)

+  {

+    /* If in low-power run mode at this point, exit it */

+    if (HAL_IS_BIT_SET(PWR->SR2, PWR_SR2_REGLPF))

+    {

+      if (HAL_PWREx_DisableLowPowerRunMode() != HAL_OK)

+      {

+        return ;

+      }

+    }

+    /* Regulator now in main mode. */

+  }

+  else

+  {

+    /* If in run mode, first move to low-power run mode.

+       The system clock frequency must be below 2 MHz at this point. */

+    if (HAL_IS_BIT_SET(PWR->SR2, PWR_SR2_REGLPF) == RESET)

+    {

+      HAL_PWREx_EnableLowPowerRunMode();

+    }

+  }

+

+  /* Clear SLEEPDEEP bit of Cortex System Control Register */

+  CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk));

+

+  /* Select SLEEP mode entry -------------------------------------------------*/

+  if(SLEEPEntry == PWR_SLEEPENTRY_WFI)

+  {

+    /* Request Wait For Interrupt */

+    __WFI();

+  }

+  else

+  {

+    /* Request Wait For Event */

+    __SEV();

+    __WFE();

+    __WFE();

+  }

+

+}

+

+

+/**

+  * @brief Enter Stop mode

+  * @note  This API is named HAL_PWR_EnterSTOPMode to ensure compatibility with legacy code running

+  *        on devices where only "Stop mode" is mentioned with main or low power regulator ON.

+  * @note  In Stop mode, all I/O pins keep the same state as in Run mode.

+  * @note  All clocks in the VCORE domain are stopped; the PLL, the MSI,

+  *        the HSI and the HSE oscillators are disabled. Some peripherals with the wakeup capability

+  *        (I2Cx, USARTx and LPUART) can switch on the HSI to receive a frame, and switch off the HSI

+  *        after receiving the frame if it is not a wakeup frame. In this case, the HSI clock is propagated

+  *        only to the peripheral requesting it.

+  *        SRAM1, SRAM2 and register contents are preserved.

+  *        The BOR is available.

+  *        The voltage regulator can be configured either in normal (Stop 0) or low-power mode (Stop 1).

+  * @note  When exiting Stop 0 or Stop 1 mode by issuing an interrupt or a wakeup event,

+  *         the HSI RC oscillator is selected as system clock if STOPWUCK bit in RCC_CFGR register

+  *         is set; the MSI oscillator is selected if STOPWUCK is cleared.

+  * @note  When the voltage regulator operates in low power mode (Stop 1), an additional

+  *         startup delay is incurred when waking up.

+  *         By keeping the internal regulator ON during Stop mode (Stop 0), 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 @ref PWR_MAINREGULATOR_ON  Stop 0 mode (main regulator ON)

+  *            @arg @ref PWR_LOWPOWERREGULATOR_ON  Stop 1 mode (low power regulator ON)

+  * @param STOPEntry: Specifies Stop 0 or Stop 1 mode is entered with WFI or WFE instruction.

+  *          This parameter can be one of the following values:

+  *            @arg @ref PWR_STOPENTRY_WFI  Enter Stop 0 or Stop 1 mode with WFI instruction.

+  *            @arg @ref PWR_STOPENTRY_WFE  Enter Stop 0 or Stop 1 mode with WFE instruction.

+  * @retval None

+  */

+void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry)

+{

+  /* Check the parameters */

+  assert_param(IS_PWR_REGULATOR(Regulator));

+

+  if(Regulator == PWR_LOWPOWERREGULATOR_ON)

+  {

+    HAL_PWREx_EnterSTOP1Mode(STOPEntry);

+  }

+  else

+  {

+    HAL_PWREx_EnterSTOP0Mode(STOPEntry);

+  }

+}

+

+/**

+  * @brief Enter Standby mode.

+  * @note  In Standby mode, the PLL, the HSI, the MSI and the HSE oscillators are switched

+  *        off. The voltage regulator is disabled, except when SRAM2 content is preserved

+  *        in which case the regulator is in low-power mode.

+  *        SRAM1 and register contents are lost except for registers in the Backup domain and

+  *        Standby circuitry. SRAM2 content can be preserved if the bit RRS is set in PWR_CR3 register.

+  *        To enable this feature, the user can resort to HAL_PWREx_EnableSRAM2ContentRetention() API

+  *        to set RRS bit.

+  *        The BOR is available.

+  * @note  The I/Os can be configured either with a pull-up or pull-down or can be kept in analog state.

+  *        HAL_PWREx_EnableGPIOPullUp() and HAL_PWREx_EnableGPIOPullDown() respectively enable Pull Up and

+  *        Pull Down state, HAL_PWREx_DisableGPIOPullUp() and HAL_PWREx_DisableGPIOPullDown() disable the

+  *        same.

+  *        These states are effective in Standby mode only if APC bit is set through

+  *        HAL_PWREx_EnablePullUpPullDownConfig() API.

+  * @retval None

+  */

+void HAL_PWR_EnterSTANDBYMode(void)

+{

+  /* Set Stand-by mode */

+  MODIFY_REG(PWR->CR1, PWR_CR1_LPMS, PWR_CR1_LPMS_STANDBY);

+

+  /* Set SLEEPDEEP bit of Cortex System Control Register */

+  SET_BIT(SCB->SCR, ((uint32_t)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 Indicate 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 Disable Sleep-On-Exit feature when returning from Handler mode to Thread mode.

+  * @note Clear 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 Enable CORTEX M4 SEVONPEND bit.

+  * @note Set 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 Disable CORTEX M4 SEVONPEND bit.

+  * @note Clear 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));

+}

+

+

+

+

+

+/**

+  * @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 can be implemented in the user file

+   */

+}

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#endif /* HAL_PWR_MODULE_ENABLED */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c
new file mode 100644
index 0000000..9adf448
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c
@@ -0,0 +1,1446 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_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 the Power Controller (PWR) peripheral:

+  *           + Extended Initialization and de-initialization functions

+  *           + Extended Peripheral Control functions

+  *

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup PWREx PWREx

+  * @brief PWR Extended HAL module driver

+  * @{

+  */

+

+#ifdef HAL_PWR_MODULE_ENABLED

+

+/* Private typedef -----------------------------------------------------------*/

+/* Private define ------------------------------------------------------------*/

+

+#if defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L431xx) || defined (STM32L432xx) || defined (STM32L433xx) || defined (STM32L442xx) || defined (STM32L443xx)

+#define PWR_PORTH_AVAILABLE_PINS   ((uint32_t)0x0000000B) /* PH0/PH1/PH3 */

+#elif defined (STM32L451xx) || defined (STM32L452xx) || defined (STM32L462xx)

+#define PWR_PORTH_AVAILABLE_PINS   ((uint32_t)0x0000000B) /* PH0/PH1/PH3 */

+#elif defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx)

+#define PWR_PORTH_AVAILABLE_PINS   ((uint32_t)0x00000003) /* PH0/PH1 */

+#elif defined (STM32L496xx) || defined (STM32L4A6xx) || defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define PWR_PORTH_AVAILABLE_PINS   ((uint32_t)0x0000FFFF) /* PH0..PH15 */

+#endif

+

+#if defined (STM32L496xx) || defined (STM32L4A6xx) || defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)

+#define PWR_PORTI_AVAILABLE_PINS   ((uint32_t)0x00000FFF) /* PI0..PI11 */

+#endif

+

+/** @defgroup PWR_Extended_Private_Defines PWR Extended Private Defines

+  * @{

+  */

+

+/** @defgroup PWREx_PVM_Mode_Mask PWR PVM Mode Mask

+  * @{

+  */

+#define PVM_MODE_IT               ((uint32_t)0x00010000)  /*!< Mask for interruption yielded by PVM threshold crossing */

+#define PVM_MODE_EVT              ((uint32_t)0x00020000)  /*!< Mask for event yielded by PVM threshold crossing        */

+#define PVM_RISING_EDGE           ((uint32_t)0x00000001)  /*!< Mask for rising edge set as PVM trigger                 */

+#define PVM_FALLING_EDGE          ((uint32_t)0x00000002)  /*!< Mask for falling edge set as PVM trigger                */

+/**

+  * @}

+  */

+

+/** @defgroup PWREx_TimeOut_Value PWR Extended Flag Setting Time Out Value

+  * @{

+  */

+#define PWR_FLAG_SETTING_DELAY_US                      50UL   /*!< Time out value for REGLPF and VOSF flags setting */

+/**

+  * @}

+  */

+

+

+

+/**

+  * @}

+  */

+

+

+

+/* Private macro -------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/* Private function prototypes -----------------------------------------------*/

+/* Exported functions --------------------------------------------------------*/

+

+/** @defgroup PWREx_Exported_Functions PWR Extended Exported Functions

+  * @{

+  */

+

+/** @defgroup PWREx_Exported_Functions_Group1 Extended Peripheral Control functions

+  *  @brief   Extended Peripheral Control functions

+  *

+@verbatim

+ ===============================================================================

+              ##### Extended Peripheral Initialization and de-initialization functions #####

+ ===============================================================================

+    [..]

+

+@endverbatim

+  * @{

+  */

+

+

+/**

+  * @brief Return Voltage Scaling Range.

+  * @retval VOS bit field (PWR_REGULATOR_VOLTAGE_RANGE1 or PWR_REGULATOR_VOLTAGE_RANGE2

+  *         or PWR_REGULATOR_VOLTAGE_SCALE1_BOOST when applicable)

+  */

+uint32_t HAL_PWREx_GetVoltageRange(void)

+{

+#if defined(PWR_CR5_R1MODE)

+    if (READ_BIT(PWR->CR1, PWR_CR1_VOS) == PWR_REGULATOR_VOLTAGE_SCALE2)

+    {

+      return PWR_REGULATOR_VOLTAGE_SCALE2;

+    }

+    else if (READ_BIT(PWR->CR5, PWR_CR5_R1MODE) == PWR_CR5_R1MODE)

+    {

+      /* PWR_CR5_R1MODE bit set means that Range 1 Boost is disabled */

+      return PWR_REGULATOR_VOLTAGE_SCALE1;

+    }

+    else

+    {

+      return PWR_REGULATOR_VOLTAGE_SCALE1_BOOST;

+    }

+#else

+  return  (PWR->CR1 & PWR_CR1_VOS);

+#endif

+}

+

+

+

+/**

+  * @brief Configure 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:

+  @if STM32L4S9xx

+  *            @arg @ref PWR_REGULATOR_VOLTAGE_SCALE1_BOOST when available, Regulator voltage output range 1 boost mode,

+  *                                                typical output voltage at 1.2 V,

+  *                                                system frequency up to 120 MHz.

+  @endif

+  *            @arg @ref PWR_REGULATOR_VOLTAGE_SCALE1 Regulator voltage output range 1 mode,

+  *                                                typical output voltage at 1.2 V,

+  *                                                system frequency up to 80 MHz.

+  *            @arg @ref PWR_REGULATOR_VOLTAGE_SCALE2 Regulator voltage output range 2 mode,

+  *                                                typical output voltage at 1.0 V,

+  *                                                system frequency up to 26 MHz.

+  * @note  When moving from Range 1 to Range 2, the system frequency must be decreased to

+  *        a value below 26 MHz before calling HAL_PWREx_ControlVoltageScaling() API.

+  *        When moving from Range 2 to Range 1, the system frequency can be increased to

+  *        a value up to 80 MHz after calling HAL_PWREx_ControlVoltageScaling() API. For

+  *        some devices, the system frequency can be increased up to 120 MHz.

+  * @note  When moving from Range 2 to Range 1, the API waits for VOSF flag to be

+  *        cleared before returning the status. If the flag is not cleared within

+  *        50 microseconds, HAL_TIMEOUT status is reported.

+  * @retval HAL Status

+  */

+HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling)

+{

+  uint32_t wait_loop_index;

+

+  assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(VoltageScaling));

+

+#if defined(PWR_CR5_R1MODE)

+  if (VoltageScaling == PWR_REGULATOR_VOLTAGE_SCALE1_BOOST)

+  {

+    /* If current range is range 2 */

+    if (READ_BIT(PWR->CR1, PWR_CR1_VOS) == PWR_REGULATOR_VOLTAGE_SCALE2)

+    {

+      /* Make sure Range 1 Boost is enabled */

+      CLEAR_BIT(PWR->CR5, PWR_CR5_R1MODE);

+

+      /* Set Range 1 */

+      MODIFY_REG(PWR->CR1, PWR_CR1_VOS, PWR_REGULATOR_VOLTAGE_SCALE1);

+

+      /* Wait until VOSF is cleared */

+      wait_loop_index = ((PWR_FLAG_SETTING_DELAY_US * SystemCoreClock) / 1000000U) + 1;

+      while ((HAL_IS_BIT_SET(PWR->SR2, PWR_SR2_VOSF)) && (wait_loop_index != 0U))

+      {

+        wait_loop_index--;

+      }

+      if (HAL_IS_BIT_SET(PWR->SR2, PWR_SR2_VOSF))

+      {

+        return HAL_TIMEOUT;

+      }

+    }

+    /* If current range is range 1 normal or boost mode */

+    else

+    {

+      /* Enable Range 1 Boost (no issue if bit already reset) */

+      CLEAR_BIT(PWR->CR5, PWR_CR5_R1MODE);

+    }

+  }

+  else if (VoltageScaling == PWR_REGULATOR_VOLTAGE_SCALE1)

+  {

+    /* If current range is range 2 */

+    if (READ_BIT(PWR->CR1, PWR_CR1_VOS) == PWR_REGULATOR_VOLTAGE_SCALE2)

+    {

+      /* Make sure Range 1 Boost is disabled */

+      SET_BIT(PWR->CR5, PWR_CR5_R1MODE);

+

+      /* Set Range 1 */

+      MODIFY_REG(PWR->CR1, PWR_CR1_VOS, PWR_REGULATOR_VOLTAGE_SCALE1);

+

+      /* Wait until VOSF is cleared */

+      wait_loop_index = ((PWR_FLAG_SETTING_DELAY_US * SystemCoreClock) / 1000000U) + 1;

+      while ((HAL_IS_BIT_SET(PWR->SR2, PWR_SR2_VOSF)) && (wait_loop_index != 0U))

+      {

+        wait_loop_index--;

+      }

+      if (HAL_IS_BIT_SET(PWR->SR2, PWR_SR2_VOSF))

+      {

+        return HAL_TIMEOUT;

+      }

+    }

+     /* If current range is range 1 normal or boost mode */

+    else

+    {

+      /* Disable Range 1 Boost (no issue if bit already set) */

+      SET_BIT(PWR->CR5, PWR_CR5_R1MODE);

+    }

+  }

+  else

+  {

+    /* Set Range 2 */

+    MODIFY_REG(PWR->CR1, PWR_CR1_VOS, PWR_REGULATOR_VOLTAGE_SCALE2);

+    /* No need to wait for VOSF to be cleared for this transition */

+    /* PWR_CR5_R1MODE bit setting has no effect in Range 2        */

+  }

+

+#else

+

+  /* If Set Range 1 */

+  if (VoltageScaling == PWR_REGULATOR_VOLTAGE_SCALE1)

+  {

+    if (READ_BIT(PWR->CR1, PWR_CR1_VOS) != PWR_REGULATOR_VOLTAGE_SCALE1)

+    {

+      /* Set Range 1 */

+      MODIFY_REG(PWR->CR1, PWR_CR1_VOS, PWR_REGULATOR_VOLTAGE_SCALE1);

+

+      /* Wait until VOSF is cleared */

+      wait_loop_index = ((PWR_FLAG_SETTING_DELAY_US * SystemCoreClock) / 1000000U) + 1U;

+      while ((HAL_IS_BIT_SET(PWR->SR2, PWR_SR2_VOSF)) && (wait_loop_index != 0U))

+      {

+        wait_loop_index--;

+      }

+      if (HAL_IS_BIT_SET(PWR->SR2, PWR_SR2_VOSF))

+      {

+        return HAL_TIMEOUT;

+      }

+    }

+  }

+  else

+  {

+    if (READ_BIT(PWR->CR1, PWR_CR1_VOS) != PWR_REGULATOR_VOLTAGE_SCALE2)

+    {

+      /* Set Range 2 */

+      MODIFY_REG(PWR->CR1, PWR_CR1_VOS, PWR_REGULATOR_VOLTAGE_SCALE2);

+      /* No need to wait for VOSF to be cleared for this transition */

+    }

+  }

+#endif

+

+  return HAL_OK;

+}

+

+

+/**

+  * @brief Enable battery charging.

+  *        When VDD is present, charge the external battery on VBAT thru an internal resistor.

+  * @param  ResistorSelection: specifies the resistor impedance.

+  *          This parameter can be one of the following values:

+  *            @arg @ref PWR_BATTERY_CHARGING_RESISTOR_5     5 kOhms resistor

+  *            @arg @ref PWR_BATTERY_CHARGING_RESISTOR_1_5 1.5 kOhms resistor

+  * @retval None

+  */

+void HAL_PWREx_EnableBatteryCharging(uint32_t ResistorSelection)

+{

+  assert_param(IS_PWR_BATTERY_RESISTOR_SELECT(ResistorSelection));

+

+  /* Specify resistor selection */

+  MODIFY_REG(PWR->CR4, PWR_CR4_VBRS, ResistorSelection);

+

+  /* Enable battery charging */

+  SET_BIT(PWR->CR4, PWR_CR4_VBE);

+}

+

+

+/**

+  * @brief Disable battery charging.

+  * @retval None

+  */

+void HAL_PWREx_DisableBatteryCharging(void)

+{

+  CLEAR_BIT(PWR->CR4, PWR_CR4_VBE);

+}

+

+

+#if defined(PWR_CR2_USV)

+/**

+  * @brief Enable VDDUSB supply.

+  * @note  Remove VDDUSB electrical and logical isolation, once VDDUSB supply is present.

+  * @retval None

+  */

+void HAL_PWREx_EnableVddUSB(void)

+{

+  SET_BIT(PWR->CR2, PWR_CR2_USV);

+}

+

+

+/**

+  * @brief Disable VDDUSB supply.

+  * @retval None

+  */

+void HAL_PWREx_DisableVddUSB(void)

+{

+  CLEAR_BIT(PWR->CR2, PWR_CR2_USV);

+}

+#endif /* PWR_CR2_USV */

+

+#if defined(PWR_CR2_IOSV)

+/**

+  * @brief Enable VDDIO2 supply.

+  * @note  Remove VDDIO2 electrical and logical isolation, once VDDIO2 supply is present.

+  * @retval None

+  */

+void HAL_PWREx_EnableVddIO2(void)

+{

+  SET_BIT(PWR->CR2, PWR_CR2_IOSV);

+}

+

+

+/**

+  * @brief Disable VDDIO2 supply.

+  * @retval None

+  */

+void HAL_PWREx_DisableVddIO2(void)

+{

+  CLEAR_BIT(PWR->CR2, PWR_CR2_IOSV);

+}

+#endif /* PWR_CR2_IOSV */

+

+

+/**

+  * @brief Enable Internal Wake-up Line.

+  * @retval None

+  */

+void HAL_PWREx_EnableInternalWakeUpLine(void)

+{

+  SET_BIT(PWR->CR3, PWR_CR3_EIWF);

+}

+

+

+/**

+  * @brief Disable Internal Wake-up Line.

+  * @retval None

+  */

+void HAL_PWREx_DisableInternalWakeUpLine(void)

+{

+  CLEAR_BIT(PWR->CR3, PWR_CR3_EIWF);

+}

+

+

+

+/**

+  * @brief Enable GPIO pull-up state in Standby and Shutdown modes.

+  * @note  Set the relevant PUy bits of PWR_PUCRx register to configure the I/O in

+  *        pull-up state in Standby and Shutdown modes.

+  * @note  This state is effective in Standby and Shutdown modes only if APC bit

+  *        is set through HAL_PWREx_EnablePullUpPullDownConfig() API.

+  * @note  The configuration is lost when exiting the Shutdown mode due to the

+  *        power-on reset, maintained when exiting the Standby mode.

+  * @note  To avoid any conflict at Standby and Shutdown modes exits, the corresponding

+  *        PDy bit of PWR_PDCRx register is cleared unless it is reserved.

+  * @note  Even if a PUy bit to set is reserved, the other PUy bits entered as input

+  *        parameter at the same time are set.

+  * @param  GPIO: Specify the IO port. This parameter can be PWR_GPIO_A, ..., PWR_GPIO_H

+  *         (or PWR_GPIO_I depending on the devices) to select the GPIO peripheral.

+  * @param  GPIONumber: Specify the I/O pins numbers.

+  *         This parameter can be one of the following values:

+  *         PWR_GPIO_BIT_0, ..., PWR_GPIO_BIT_15 (except for the port where less

+  *         I/O pins are available) or the logical OR of several of them to set

+  *         several bits for a given port in a single API call.

+  * @retval HAL Status

+  */

+HAL_StatusTypeDef HAL_PWREx_EnableGPIOPullUp(uint32_t GPIO, uint32_t GPIONumber)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  assert_param(IS_PWR_GPIO(GPIO));

+  assert_param(IS_PWR_GPIO_BIT_NUMBER(GPIONumber));

+

+  switch (GPIO)

+  {

+    case PWR_GPIO_A:

+       SET_BIT(PWR->PUCRA, (GPIONumber & (~(PWR_GPIO_BIT_14))));

+       CLEAR_BIT(PWR->PDCRA, (GPIONumber & (~(PWR_GPIO_BIT_13|PWR_GPIO_BIT_15))));

+       break;

+    case PWR_GPIO_B:

+       SET_BIT(PWR->PUCRB, GPIONumber);

+       CLEAR_BIT(PWR->PDCRB, (GPIONumber & (~(PWR_GPIO_BIT_4))));

+       break;

+    case PWR_GPIO_C:

+       SET_BIT(PWR->PUCRC, GPIONumber);

+       CLEAR_BIT(PWR->PDCRC, GPIONumber);

+       break;

+#if defined(GPIOD)

+    case PWR_GPIO_D:

+       SET_BIT(PWR->PUCRD, GPIONumber);

+       CLEAR_BIT(PWR->PDCRD, GPIONumber);

+       break;

+#endif

+#if defined(GPIOE)

+    case PWR_GPIO_E:

+       SET_BIT(PWR->PUCRE, GPIONumber);

+       CLEAR_BIT(PWR->PDCRE, GPIONumber);

+       break;

+#endif

+#if defined(GPIOF)

+    case PWR_GPIO_F:

+       SET_BIT(PWR->PUCRF, GPIONumber);

+       CLEAR_BIT(PWR->PDCRF, GPIONumber);

+       break;

+#endif

+#if defined(GPIOG)

+    case PWR_GPIO_G:

+       SET_BIT(PWR->PUCRG, GPIONumber);

+       CLEAR_BIT(PWR->PDCRG, GPIONumber);

+       break;

+#endif

+    case PWR_GPIO_H:

+       SET_BIT(PWR->PUCRH, (GPIONumber & PWR_PORTH_AVAILABLE_PINS));

+#if defined (STM32L496xx) || defined (STM32L4A6xx)

+       CLEAR_BIT(PWR->PDCRH, ((GPIONumber & PWR_PORTH_AVAILABLE_PINS) & (~(PWR_GPIO_BIT_3))));

+#else

+       CLEAR_BIT(PWR->PDCRH, (GPIONumber & PWR_PORTH_AVAILABLE_PINS));

+#endif

+       break;

+#if defined(GPIOI)

+    case PWR_GPIO_I:

+       SET_BIT(PWR->PUCRI, (GPIONumber & PWR_PORTI_AVAILABLE_PINS));

+       CLEAR_BIT(PWR->PDCRI, (GPIONumber & PWR_PORTI_AVAILABLE_PINS));

+       break;

+#endif

+    default:

+      status = HAL_ERROR;

+      break;

+  }

+

+  return status;

+}

+

+

+/**

+  * @brief Disable GPIO pull-up state in Standby mode and Shutdown modes.

+  * @note  Reset the relevant PUy bits of PWR_PUCRx register used to configure the I/O

+  *        in pull-up state in Standby and Shutdown modes.

+  * @note  Even if a PUy bit to reset is reserved, the other PUy bits entered as input

+  *        parameter at the same time are reset.

+  * @param  GPIO: Specifies the IO port. This parameter can be PWR_GPIO_A, ..., PWR_GPIO_H

+  *          (or PWR_GPIO_I depending on the devices) to select the GPIO peripheral.

+  * @param  GPIONumber: Specify the I/O pins numbers.

+  *         This parameter can be one of the following values:

+  *         PWR_GPIO_BIT_0, ..., PWR_GPIO_BIT_15 (except for the port where less

+  *         I/O pins are available) or the logical OR of several of them to reset

+  *         several bits for a given port in a single API call.

+  * @retval HAL Status

+  */

+HAL_StatusTypeDef HAL_PWREx_DisableGPIOPullUp(uint32_t GPIO, uint32_t GPIONumber)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  assert_param(IS_PWR_GPIO(GPIO));

+  assert_param(IS_PWR_GPIO_BIT_NUMBER(GPIONumber));

+

+  switch (GPIO)

+  {

+    case PWR_GPIO_A:

+       CLEAR_BIT(PWR->PUCRA, (GPIONumber & (~(PWR_GPIO_BIT_14))));

+       break;

+    case PWR_GPIO_B:

+       CLEAR_BIT(PWR->PUCRB, GPIONumber);

+       break;

+    case PWR_GPIO_C:

+       CLEAR_BIT(PWR->PUCRC, GPIONumber);

+       break;

+#if defined(GPIOD)

+    case PWR_GPIO_D:

+       CLEAR_BIT(PWR->PUCRD, GPIONumber);

+       break;

+#endif

+#if defined(GPIOE)

+    case PWR_GPIO_E:

+       CLEAR_BIT(PWR->PUCRE, GPIONumber);

+       break;

+#endif

+#if defined(GPIOF)

+    case PWR_GPIO_F:

+       CLEAR_BIT(PWR->PUCRF, GPIONumber);

+       break;

+#endif

+#if defined(GPIOG)

+    case PWR_GPIO_G:

+       CLEAR_BIT(PWR->PUCRG, GPIONumber);

+       break;

+#endif

+    case PWR_GPIO_H:

+       CLEAR_BIT(PWR->PUCRH, (GPIONumber & PWR_PORTH_AVAILABLE_PINS));

+       break;

+#if defined(GPIOI)

+    case PWR_GPIO_I:

+       CLEAR_BIT(PWR->PUCRI, (GPIONumber & PWR_PORTI_AVAILABLE_PINS));

+       break;

+#endif

+    default:

+       status = HAL_ERROR;

+       break;

+  }

+

+  return status;

+}

+

+

+

+/**

+  * @brief Enable GPIO pull-down state in Standby and Shutdown modes.

+  * @note  Set the relevant PDy bits of PWR_PDCRx register to configure the I/O in

+  *        pull-down state in Standby and Shutdown modes.

+  * @note  This state is effective in Standby and Shutdown modes only if APC bit

+  *        is set through HAL_PWREx_EnablePullUpPullDownConfig() API.

+  * @note  The configuration is lost when exiting the Shutdown mode due to the

+  *        power-on reset, maintained when exiting the Standby mode.

+  * @note  To avoid any conflict at Standby and Shutdown modes exits, the corresponding

+  *        PUy bit of PWR_PUCRx register is cleared unless it is reserved.

+  * @note  Even if a PDy bit to set is reserved, the other PDy bits entered as input

+  *        parameter at the same time are set.

+  * @param  GPIO: Specify the IO port. This parameter can be PWR_GPIO_A..PWR_GPIO_H

+  *         (or PWR_GPIO_I depending on the devices) to select the GPIO peripheral.

+  * @param  GPIONumber: Specify the I/O pins numbers.

+  *         This parameter can be one of the following values:

+  *         PWR_GPIO_BIT_0, ..., PWR_GPIO_BIT_15 (except for the port where less

+  *         I/O pins are available) or the logical OR of several of them to set

+  *         several bits for a given port in a single API call.

+  * @retval HAL Status

+  */

+HAL_StatusTypeDef HAL_PWREx_EnableGPIOPullDown(uint32_t GPIO, uint32_t GPIONumber)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  assert_param(IS_PWR_GPIO(GPIO));

+  assert_param(IS_PWR_GPIO_BIT_NUMBER(GPIONumber));

+

+  switch (GPIO)

+  {

+    case PWR_GPIO_A:

+       SET_BIT(PWR->PDCRA, (GPIONumber & (~(PWR_GPIO_BIT_13|PWR_GPIO_BIT_15))));

+       CLEAR_BIT(PWR->PUCRA, (GPIONumber & (~(PWR_GPIO_BIT_14))));

+       break;

+    case PWR_GPIO_B:

+       SET_BIT(PWR->PDCRB, (GPIONumber & (~(PWR_GPIO_BIT_4))));

+       CLEAR_BIT(PWR->PUCRB, GPIONumber);

+       break;

+    case PWR_GPIO_C:

+       SET_BIT(PWR->PDCRC, GPIONumber);

+       CLEAR_BIT(PWR->PUCRC, GPIONumber);

+       break;

+#if defined(GPIOD)

+    case PWR_GPIO_D:

+       SET_BIT(PWR->PDCRD, GPIONumber);

+       CLEAR_BIT(PWR->PUCRD, GPIONumber);

+       break;

+#endif

+#if defined(GPIOE)

+    case PWR_GPIO_E:

+       SET_BIT(PWR->PDCRE, GPIONumber);

+       CLEAR_BIT(PWR->PUCRE, GPIONumber);

+       break;

+#endif

+#if defined(GPIOF)

+    case PWR_GPIO_F:

+       SET_BIT(PWR->PDCRF, GPIONumber);

+       CLEAR_BIT(PWR->PUCRF, GPIONumber);

+       break;

+#endif

+#if defined(GPIOG)

+    case PWR_GPIO_G:

+       SET_BIT(PWR->PDCRG, GPIONumber);

+       CLEAR_BIT(PWR->PUCRG, GPIONumber);

+       break;

+#endif

+    case PWR_GPIO_H:

+#if defined (STM32L496xx) || defined (STM32L4A6xx)

+       SET_BIT(PWR->PDCRH, ((GPIONumber & PWR_PORTH_AVAILABLE_PINS) & (~(PWR_GPIO_BIT_3))));

+#else

+       SET_BIT(PWR->PDCRH, (GPIONumber & PWR_PORTH_AVAILABLE_PINS));

+#endif

+       CLEAR_BIT(PWR->PUCRH, (GPIONumber & PWR_PORTH_AVAILABLE_PINS));

+       break;

+#if defined(GPIOI)

+    case PWR_GPIO_I:

+       SET_BIT(PWR->PDCRI, (GPIONumber & PWR_PORTI_AVAILABLE_PINS));

+       CLEAR_BIT(PWR->PUCRI, (GPIONumber & PWR_PORTI_AVAILABLE_PINS));

+       break;

+#endif

+    default:

+      status = HAL_ERROR;

+      break;

+  }

+

+  return status;

+}

+

+

+/**

+  * @brief Disable GPIO pull-down state in Standby and Shutdown modes.

+  * @note  Reset the relevant PDy bits of PWR_PDCRx register used to configure the I/O

+  *        in pull-down state in Standby and Shutdown modes.

+  * @note  Even if a PDy bit to reset is reserved, the other PDy bits entered as input

+  *        parameter at the same time are reset.

+  * @param  GPIO: Specifies the IO port. This parameter can be PWR_GPIO_A..PWR_GPIO_H

+  *         (or PWR_GPIO_I depending on the devices) to select the GPIO peripheral.

+  * @param  GPIONumber: Specify the I/O pins numbers.

+  *         This parameter can be one of the following values:

+  *         PWR_GPIO_BIT_0, ..., PWR_GPIO_BIT_15 (except for the port where less

+  *         I/O pins are available) or the logical OR of several of them to reset

+  *         several bits for a given port in a single API call.

+  * @retval HAL Status

+  */

+HAL_StatusTypeDef HAL_PWREx_DisableGPIOPullDown(uint32_t GPIO, uint32_t GPIONumber)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  assert_param(IS_PWR_GPIO(GPIO));

+  assert_param(IS_PWR_GPIO_BIT_NUMBER(GPIONumber));

+

+  switch (GPIO)

+  {

+    case PWR_GPIO_A:

+       CLEAR_BIT(PWR->PDCRA, (GPIONumber & (~(PWR_GPIO_BIT_13|PWR_GPIO_BIT_15))));

+       break;

+    case PWR_GPIO_B:

+       CLEAR_BIT(PWR->PDCRB, (GPIONumber & (~(PWR_GPIO_BIT_4))));

+       break;

+    case PWR_GPIO_C:

+       CLEAR_BIT(PWR->PDCRC, GPIONumber);

+       break;

+#if defined(GPIOD)

+    case PWR_GPIO_D:

+       CLEAR_BIT(PWR->PDCRD, GPIONumber);

+       break;

+#endif

+#if defined(GPIOE)

+    case PWR_GPIO_E:

+       CLEAR_BIT(PWR->PDCRE, GPIONumber);

+       break;

+#endif

+#if defined(GPIOF)

+    case PWR_GPIO_F:

+       CLEAR_BIT(PWR->PDCRF, GPIONumber);

+       break;

+#endif

+#if defined(GPIOG)

+    case PWR_GPIO_G:

+       CLEAR_BIT(PWR->PDCRG, GPIONumber);

+       break;

+#endif

+    case PWR_GPIO_H:

+#if defined (STM32L496xx) || defined (STM32L4A6xx)

+       CLEAR_BIT(PWR->PDCRH, ((GPIONumber & PWR_PORTH_AVAILABLE_PINS) & (~(PWR_GPIO_BIT_3))));

+#else

+       CLEAR_BIT(PWR->PDCRH, (GPIONumber & PWR_PORTH_AVAILABLE_PINS));

+#endif

+       break;

+#if defined(GPIOI)

+    case PWR_GPIO_I:

+       CLEAR_BIT(PWR->PDCRI, (GPIONumber & PWR_PORTI_AVAILABLE_PINS));

+       break;

+#endif

+    default:

+      status = HAL_ERROR;

+      break;

+  }

+

+  return status;

+}

+

+

+

+/**

+  * @brief Enable pull-up and pull-down configuration.

+  * @note  When APC bit is set, the I/O pull-up and pull-down configurations defined in

+  *        PWR_PUCRx and PWR_PDCRx registers are applied in Standby and Shutdown modes.

+  * @note  Pull-up set by PUy bit of PWR_PUCRx register is not activated if the corresponding

+  *        PDy bit of PWR_PDCRx register is also set (pull-down configuration priority is higher).

+  *        HAL_PWREx_EnableGPIOPullUp() and HAL_PWREx_EnableGPIOPullDown() API's ensure there

+  *        is no conflict when setting PUy or PDy bit.

+  * @retval None

+  */

+void HAL_PWREx_EnablePullUpPullDownConfig(void)

+{

+  SET_BIT(PWR->CR3, PWR_CR3_APC);

+}

+

+

+/**

+  * @brief Disable pull-up and pull-down configuration.

+  * @note  When APC bit is cleared, the I/O pull-up and pull-down configurations defined in

+  *        PWR_PUCRx and PWR_PDCRx registers are not applied in Standby and Shutdown modes.

+  * @retval None

+  */

+void HAL_PWREx_DisablePullUpPullDownConfig(void)

+{

+  CLEAR_BIT(PWR->CR3, PWR_CR3_APC);

+}

+

+

+

+/**

+  * @brief Enable SRAM2 content retention in Standby mode.

+  * @note  When RRS bit is set, SRAM2 is powered by the low-power regulator in

+  *         Standby mode and its content is kept.

+  * @retval None

+  */

+void HAL_PWREx_EnableSRAM2ContentRetention(void)

+{

+  SET_BIT(PWR->CR3, PWR_CR3_RRS);

+}

+

+

+/**

+  * @brief Disable SRAM2 content retention in Standby mode.

+  * @note  When RRS bit is reset, SRAM2 is powered off in Standby mode

+  *        and its content is lost.

+  * @retval None

+  */

+void HAL_PWREx_DisableSRAM2ContentRetention(void)

+{

+  CLEAR_BIT(PWR->CR3, PWR_CR3_RRS);

+}

+

+

+#if defined(PWR_CR3_ENULP)

+/**

+  * @brief Enable Ultra Low Power BORL, BORH and PVD for STOP2 and Standby modes.

+  * @note  All the other modes are not affected by this bit.

+  * @retval None

+  */

+void HAL_PWREx_EnableBORPVD_ULP(void)

+{

+  SET_BIT(PWR->CR3, PWR_CR3_ENULP);

+}

+

+

+/**

+  * @brief Disable Ultra Low Power BORL, BORH and PVD for STOP2 and Standby modes.

+  * @note  All the other modes are not affected by this bit

+  * @retval None

+  */

+void HAL_PWREx_DisableBORPVD_ULP(void)

+{

+  CLEAR_BIT(PWR->CR3, PWR_CR3_ENULP);

+}

+#endif /* PWR_CR3_ENULP */

+

+

+#if defined(PWR_CR4_EXT_SMPS_ON)

+/**

+  * @brief Enable the CFLDO working @ 0.95V.

+  * @note  When external SMPS is used & CFLDO operating in Range 2, the regulated voltage of the

+  *        internal CFLDO can be reduced to 0.95V.

+  * @retval None

+  */

+void HAL_PWREx_EnableExtSMPS_0V95(void)

+{

+  SET_BIT(PWR->CR4, PWR_CR4_EXT_SMPS_ON);

+}

+

+/**

+  * @brief Disable the CFLDO working @ 0.95V

+  * @note  Before SMPS is switched off, the regulated voltage of the

+  *        internal CFLDO shall be set to 1.00V.

+  *        1.00V. is also default operating Range 2 voltage.

+  * @retval None

+  */

+void HAL_PWREx_DisableExtSMPS_0V95(void)

+{

+  CLEAR_BIT(PWR->CR4, PWR_CR4_EXT_SMPS_ON);

+}

+#endif /* PWR_CR4_EXT_SMPS_ON */

+

+

+#if defined(PWR_CR1_RRSTP)

+/**

+  * @brief Enable SRAM3 content retention in Stop 2 mode.

+  * @note  When RRSTP bit is set, SRAM3 is powered by the low-power regulator in

+  *        Stop 2 mode and its content is kept.

+  * @retval None

+  */

+void HAL_PWREx_EnableSRAM3ContentRetention(void)

+{

+  SET_BIT(PWR->CR1, PWR_CR1_RRSTP);

+}

+

+

+/**

+  * @brief Disable SRAM3 content retention in Stop 2 mode.

+  * @note  When RRSTP bit is reset, SRAM3 is powered off in Stop 2 mode

+  *        and its content is lost.

+  * @retval None

+  */

+void HAL_PWREx_DisableSRAM3ContentRetention(void)

+{

+  CLEAR_BIT(PWR->CR1, PWR_CR1_RRSTP);

+}

+#endif /* PWR_CR1_RRSTP */

+

+#if defined(PWR_CR3_DSIPDEN)

+/**

+  * @brief Enable pull-down activation on DSI pins.

+  * @retval None

+  */

+void HAL_PWREx_EnableDSIPinsPDActivation(void)

+{

+  SET_BIT(PWR->CR3, PWR_CR3_DSIPDEN);

+}

+

+

+/**

+  * @brief Disable pull-down activation on DSI pins.

+  * @retval None

+  */

+void HAL_PWREx_DisableDSIPinsPDActivation(void)

+{

+  CLEAR_BIT(PWR->CR3, PWR_CR3_DSIPDEN);

+}

+#endif /* PWR_CR3_DSIPDEN */

+

+#if defined(PWR_CR2_PVME1)

+/**

+  * @brief Enable the Power Voltage Monitoring 1: VDDUSB versus 1.2V.

+  * @retval None

+  */

+void HAL_PWREx_EnablePVM1(void)

+{

+  SET_BIT(PWR->CR2, PWR_PVM_1);

+}

+

+/**

+  * @brief Disable the Power Voltage Monitoring 1: VDDUSB versus 1.2V.

+  * @retval None

+  */

+void HAL_PWREx_DisablePVM1(void)

+{

+  CLEAR_BIT(PWR->CR2, PWR_PVM_1);

+}

+#endif /* PWR_CR2_PVME1 */

+

+

+#if defined(PWR_CR2_PVME2)

+/**

+  * @brief Enable the Power Voltage Monitoring 2: VDDIO2 versus 0.9V.

+  * @retval None

+  */

+void HAL_PWREx_EnablePVM2(void)

+{

+  SET_BIT(PWR->CR2, PWR_PVM_2);

+}

+

+/**

+  * @brief Disable the Power Voltage Monitoring 2: VDDIO2 versus 0.9V.

+  * @retval None

+  */

+void HAL_PWREx_DisablePVM2(void)

+{

+  CLEAR_BIT(PWR->CR2, PWR_PVM_2);

+}

+#endif /* PWR_CR2_PVME2 */

+

+

+/**

+  * @brief Enable the Power Voltage Monitoring 3: VDDA versus 1.62V.

+  * @retval None

+  */

+void HAL_PWREx_EnablePVM3(void)

+{

+  SET_BIT(PWR->CR2, PWR_PVM_3);

+}

+

+/**

+  * @brief Disable the Power Voltage Monitoring 3: VDDA versus 1.62V.

+  * @retval None

+  */

+void HAL_PWREx_DisablePVM3(void)

+{

+  CLEAR_BIT(PWR->CR2, PWR_PVM_3);

+}

+

+

+/**

+  * @brief Enable the Power Voltage Monitoring 4:  VDDA versus 2.2V.

+  * @retval None

+  */

+void HAL_PWREx_EnablePVM4(void)

+{

+  SET_BIT(PWR->CR2, PWR_PVM_4);

+}

+

+/**

+  * @brief Disable the Power Voltage Monitoring 4:  VDDA versus 2.2V.

+  * @retval None

+  */

+void HAL_PWREx_DisablePVM4(void)

+{

+  CLEAR_BIT(PWR->CR2, PWR_PVM_4);

+}

+

+

+

+

+/**

+  * @brief Configure the Peripheral Voltage Monitoring (PVM).

+  * @param sConfigPVM: pointer to a PWR_PVMTypeDef structure that contains the

+  *        PVM configuration information.

+  * @note The API configures a single PVM according to the information contained

+  *       in the input structure. To configure several PVMs, the API must be singly

+  *       called for each PVM used.

+  * @note Refer to the electrical characteristics of your device datasheet for

+  *         more details about the voltage thresholds corresponding to each

+  *         detection level and to each monitored supply.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_PWREx_ConfigPVM(PWR_PVMTypeDef *sConfigPVM)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check the parameters */

+  assert_param(IS_PWR_PVM_TYPE(sConfigPVM->PVMType));

+  assert_param(IS_PWR_PVM_MODE(sConfigPVM->Mode));

+

+

+  /* Configure EXTI 35 to 38 interrupts if so required:

+     scan thru PVMType to detect which PVMx is set and

+     configure the corresponding EXTI line accordingly. */

+  switch (sConfigPVM->PVMType)

+  {

+#if defined(PWR_CR2_PVME1)

+    case PWR_PVM_1:

+      /* Clear any previous config. Keep it clear if no event or IT mode is selected */

+      __HAL_PWR_PVM1_EXTI_DISABLE_EVENT();

+      __HAL_PWR_PVM1_EXTI_DISABLE_IT();

+      __HAL_PWR_PVM1_EXTI_DISABLE_FALLING_EDGE();

+      __HAL_PWR_PVM1_EXTI_DISABLE_RISING_EDGE();

+

+      /* Configure interrupt mode */

+      if((sConfigPVM->Mode & PVM_MODE_IT) == PVM_MODE_IT)

+      {

+        __HAL_PWR_PVM1_EXTI_ENABLE_IT();

+      }

+

+      /* Configure event mode */

+      if((sConfigPVM->Mode & PVM_MODE_EVT) == PVM_MODE_EVT)

+      {

+        __HAL_PWR_PVM1_EXTI_ENABLE_EVENT();

+      }

+

+      /* Configure the edge */

+      if((sConfigPVM->Mode & PVM_RISING_EDGE) == PVM_RISING_EDGE)

+      {

+        __HAL_PWR_PVM1_EXTI_ENABLE_RISING_EDGE();

+      }

+

+      if((sConfigPVM->Mode & PVM_FALLING_EDGE) == PVM_FALLING_EDGE)

+      {

+        __HAL_PWR_PVM1_EXTI_ENABLE_FALLING_EDGE();

+      }

+      break;

+#endif /* PWR_CR2_PVME1 */

+

+#if defined(PWR_CR2_PVME2)

+    case PWR_PVM_2:

+      /* Clear any previous config. Keep it clear if no event or IT mode is selected */

+      __HAL_PWR_PVM2_EXTI_DISABLE_EVENT();

+      __HAL_PWR_PVM2_EXTI_DISABLE_IT();

+      __HAL_PWR_PVM2_EXTI_DISABLE_FALLING_EDGE();

+      __HAL_PWR_PVM2_EXTI_DISABLE_RISING_EDGE();

+

+      /* Configure interrupt mode */

+      if((sConfigPVM->Mode & PVM_MODE_IT) == PVM_MODE_IT)

+      {

+        __HAL_PWR_PVM2_EXTI_ENABLE_IT();

+      }

+

+      /* Configure event mode */

+      if((sConfigPVM->Mode & PVM_MODE_EVT) == PVM_MODE_EVT)

+      {

+        __HAL_PWR_PVM2_EXTI_ENABLE_EVENT();

+      }

+

+      /* Configure the edge */

+      if((sConfigPVM->Mode & PVM_RISING_EDGE) == PVM_RISING_EDGE)

+      {

+        __HAL_PWR_PVM2_EXTI_ENABLE_RISING_EDGE();

+      }

+

+      if((sConfigPVM->Mode & PVM_FALLING_EDGE) == PVM_FALLING_EDGE)

+      {

+        __HAL_PWR_PVM2_EXTI_ENABLE_FALLING_EDGE();

+      }

+      break;

+#endif /* PWR_CR2_PVME2 */

+

+    case PWR_PVM_3:

+      /* Clear any previous config. Keep it clear if no event or IT mode is selected */

+      __HAL_PWR_PVM3_EXTI_DISABLE_EVENT();

+      __HAL_PWR_PVM3_EXTI_DISABLE_IT();

+      __HAL_PWR_PVM3_EXTI_DISABLE_FALLING_EDGE();

+      __HAL_PWR_PVM3_EXTI_DISABLE_RISING_EDGE();

+

+      /* Configure interrupt mode */

+      if((sConfigPVM->Mode & PVM_MODE_IT) == PVM_MODE_IT)

+      {

+        __HAL_PWR_PVM3_EXTI_ENABLE_IT();

+      }

+

+      /* Configure event mode */

+      if((sConfigPVM->Mode & PVM_MODE_EVT) == PVM_MODE_EVT)

+      {

+        __HAL_PWR_PVM3_EXTI_ENABLE_EVENT();

+      }

+

+      /* Configure the edge */

+      if((sConfigPVM->Mode & PVM_RISING_EDGE) == PVM_RISING_EDGE)

+      {

+        __HAL_PWR_PVM3_EXTI_ENABLE_RISING_EDGE();

+      }

+

+      if((sConfigPVM->Mode & PVM_FALLING_EDGE) == PVM_FALLING_EDGE)

+      {

+        __HAL_PWR_PVM3_EXTI_ENABLE_FALLING_EDGE();

+      }

+      break;

+

+    case PWR_PVM_4:

+      /* Clear any previous config. Keep it clear if no event or IT mode is selected */

+      __HAL_PWR_PVM4_EXTI_DISABLE_EVENT();

+      __HAL_PWR_PVM4_EXTI_DISABLE_IT();

+      __HAL_PWR_PVM4_EXTI_DISABLE_FALLING_EDGE();

+      __HAL_PWR_PVM4_EXTI_DISABLE_RISING_EDGE();

+

+      /* Configure interrupt mode */

+      if((sConfigPVM->Mode & PVM_MODE_IT) == PVM_MODE_IT)

+      {

+        __HAL_PWR_PVM4_EXTI_ENABLE_IT();

+      }

+

+      /* Configure event mode */

+      if((sConfigPVM->Mode & PVM_MODE_EVT) == PVM_MODE_EVT)

+      {

+        __HAL_PWR_PVM4_EXTI_ENABLE_EVENT();

+      }

+

+      /* Configure the edge */

+      if((sConfigPVM->Mode & PVM_RISING_EDGE) == PVM_RISING_EDGE)

+      {

+        __HAL_PWR_PVM4_EXTI_ENABLE_RISING_EDGE();

+      }

+

+      if((sConfigPVM->Mode & PVM_FALLING_EDGE) == PVM_FALLING_EDGE)

+      {

+        __HAL_PWR_PVM4_EXTI_ENABLE_FALLING_EDGE();

+      }

+      break;

+

+    default:

+      status = HAL_ERROR;

+      break;

+  }

+

+  return status;

+}

+

+

+

+/**

+  * @brief Enter Low-power Run mode

+  * @note  In Low-power Run mode, all I/O pins keep the same state as in Run mode.

+  * @note  When Regulator is set to PWR_LOWPOWERREGULATOR_ON, the user can optionally configure the

+  *        Flash in power-down monde in setting the RUN_PD bit in FLASH_ACR register.

+  *        Additionally, the clock frequency must be reduced below 2 MHz.

+  *        Setting RUN_PD in FLASH_ACR then appropriately reducing the clock frequency must

+  *        be done before calling HAL_PWREx_EnableLowPowerRunMode() API.

+  * @retval None

+  */

+void HAL_PWREx_EnableLowPowerRunMode(void)

+{

+  /* Set Regulator parameter */

+  SET_BIT(PWR->CR1, PWR_CR1_LPR);

+}

+

+

+/**

+  * @brief Exit Low-power Run mode.

+  * @note  Before HAL_PWREx_DisableLowPowerRunMode() completion, the function checks that

+  *        REGLPF has been properly reset (otherwise, HAL_PWREx_DisableLowPowerRunMode

+  *        returns HAL_TIMEOUT status). The system clock frequency can then be

+  *        increased above 2 MHz.

+  * @retval HAL Status

+  */

+HAL_StatusTypeDef HAL_PWREx_DisableLowPowerRunMode(void)

+{

+  uint32_t wait_loop_index;

+

+  /* Clear LPR bit */

+  CLEAR_BIT(PWR->CR1, PWR_CR1_LPR);

+

+  /* Wait until REGLPF is reset */

+  wait_loop_index = ((PWR_FLAG_SETTING_DELAY_US * SystemCoreClock) / 1000000U) + 1U;

+  while ((HAL_IS_BIT_SET(PWR->SR2, PWR_SR2_REGLPF)) && (wait_loop_index != 0U))

+  {

+    wait_loop_index--;

+  }

+  if (HAL_IS_BIT_SET(PWR->SR2, PWR_SR2_REGLPF))

+  {

+    return HAL_TIMEOUT;

+  }

+

+  return HAL_OK;

+}

+

+

+/**

+  * @brief Enter Stop 0 mode.

+  * @note  In Stop 0 mode, main and low voltage regulators are ON.

+  * @note  In Stop 0 mode, all I/O pins keep the same state as in Run mode.

+  * @note  All clocks in the VCORE domain are stopped; the PLL, the MSI,

+  *        the HSI and the HSE oscillators are disabled. Some peripherals with the wakeup capability

+  *        (I2Cx, USARTx and LPUART) can switch on the HSI to receive a frame, and switch off the HSI

+  *        after receiving the frame if it is not a wakeup frame. In this case, the HSI clock is propagated

+  *        only to the peripheral requesting it.

+  *        SRAM1, SRAM2 and register contents are preserved.

+  *        The BOR is available.

+  * @note  When exiting Stop 0 mode by issuing an interrupt or a wakeup event,

+  *         the HSI RC oscillator is selected as system clock if STOPWUCK bit in RCC_CFGR register

+  *         is set; the MSI oscillator is selected if STOPWUCK is cleared.

+  * @note  By keeping the internal regulator ON during Stop 0 mode, the consumption

+  *         is higher although the startup time is reduced.

+  * @param STOPEntry  specifies if Stop mode in entered with WFI or WFE instruction.

+  *          This parameter can be one of the following values:

+  *            @arg @ref PWR_STOPENTRY_WFI  Enter Stop mode with WFI instruction

+  *            @arg @ref PWR_STOPENTRY_WFE  Enter Stop mode with WFE instruction

+  * @retval None

+  */

+void HAL_PWREx_EnterSTOP0Mode(uint8_t STOPEntry)

+{

+  /* Check the parameters */

+  assert_param(IS_PWR_STOP_ENTRY(STOPEntry));

+

+  /* Stop 0 mode with Main Regulator */

+  MODIFY_REG(PWR->CR1, PWR_CR1_LPMS, PWR_CR1_LPMS_STOP0);

+

+  /* Set SLEEPDEEP bit of Cortex System Control Register */

+  SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk));

+

+  /* 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 */

+  CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk));

+}

+

+

+/**

+  * @brief Enter Stop 1 mode.

+  * @note  In Stop 1 mode, only low power voltage regulator is ON.

+  * @note  In Stop 1 mode, all I/O pins keep the same state as in Run mode.

+  * @note  All clocks in the VCORE domain are stopped; the PLL, the MSI,

+  *        the HSI and the HSE oscillators are disabled. Some peripherals with the wakeup capability

+  *        (I2Cx, USARTx and LPUART) can switch on the HSI to receive a frame, and switch off the HSI

+  *        after receiving the frame if it is not a wakeup frame. In this case, the HSI clock is propagated

+  *        only to the peripheral requesting it.

+  *        SRAM1, SRAM2 and register contents are preserved.

+  *        The BOR is available.

+  * @note  When exiting Stop 1 mode by issuing an interrupt or a wakeup event,

+  *         the HSI RC oscillator is selected as system clock if STOPWUCK bit in RCC_CFGR register

+  *         is set; the MSI oscillator is selected if STOPWUCK is cleared.

+  * @note  Due to low power mode, an additional startup delay is incurred when waking up from Stop 1 mode.

+  * @param STOPEntry  specifies if Stop mode in entered with WFI or WFE instruction.

+  *          This parameter can be one of the following values:

+  *            @arg @ref PWR_STOPENTRY_WFI  Enter Stop mode with WFI instruction

+  *            @arg @ref PWR_STOPENTRY_WFE  Enter Stop mode with WFE instruction

+  * @retval None

+  */

+void HAL_PWREx_EnterSTOP1Mode(uint8_t STOPEntry)

+{

+  /* Check the parameters */

+  assert_param(IS_PWR_STOP_ENTRY(STOPEntry));

+

+  /* Stop 1 mode with Low-Power Regulator */

+  MODIFY_REG(PWR->CR1, PWR_CR1_LPMS, PWR_CR1_LPMS_STOP1);

+

+  /* Set SLEEPDEEP bit of Cortex System Control Register */

+  SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk));

+

+  /* 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 */

+  CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk));

+}

+

+

+/**

+  * @brief Enter Stop 2 mode.

+  * @note  In Stop 2 mode, only low power voltage regulator is ON.

+  * @note  In Stop 2 mode, all I/O pins keep the same state as in Run mode.

+  * @note  All clocks in the VCORE domain are stopped, the PLL, the MSI,

+  *        the HSI and the HSE oscillators are disabled. Some peripherals with wakeup capability

+  *        (LCD, LPTIM1, I2C3 and LPUART) can switch on the HSI to receive a frame, and switch off the HSI after

+  *        receiving the frame if it is not a wakeup frame. In this case the HSI clock is propagated only

+  *        to the peripheral requesting it.

+  *        SRAM1, SRAM2 and register contents are preserved.

+  *        The BOR is available.

+  *        The voltage regulator is set in low-power mode but LPR bit must be cleared to enter stop 2 mode.

+  *        Otherwise, Stop 1 mode is entered.

+  * @note  When exiting Stop 2 mode by issuing an interrupt or a wakeup event,

+  *         the HSI RC oscillator is selected as system clock if STOPWUCK bit in RCC_CFGR register

+  *         is set; the MSI oscillator is selected if STOPWUCK is cleared.

+  * @param STOPEntry  specifies if Stop mode in entered with WFI or WFE instruction.

+  *          This parameter can be one of the following values:

+  *            @arg @ref PWR_STOPENTRY_WFI  Enter Stop mode with WFI instruction

+  *            @arg @ref PWR_STOPENTRY_WFE  Enter Stop mode with WFE instruction

+  * @retval None

+  */

+void HAL_PWREx_EnterSTOP2Mode(uint8_t STOPEntry)

+{

+  /* Check the parameter */

+  assert_param(IS_PWR_STOP_ENTRY(STOPEntry));

+

+  /* Set Stop mode 2 */

+  MODIFY_REG(PWR->CR1, PWR_CR1_LPMS, PWR_CR1_LPMS_STOP2);

+

+  /* Set SLEEPDEEP bit of Cortex System Control Register */

+  SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk));

+

+  /* 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 */

+  CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk));

+}

+

+

+

+

+

+/**

+  * @brief Enter Shutdown mode.

+  * @note  In Shutdown mode, the PLL, the HSI, the MSI, the LSI and the HSE oscillators are switched

+  *        off. The voltage regulator is disabled and Vcore domain is powered off.

+  *        SRAM1, SRAM2 and registers contents are lost except for registers in the Backup domain.

+  *        The BOR is not available.

+  * @note  The I/Os can be configured either with a pull-up or pull-down or can be kept in analog state.

+  * @retval None

+  */

+void HAL_PWREx_EnterSHUTDOWNMode(void)

+{

+

+  /* Set Shutdown mode */

+  MODIFY_REG(PWR->CR1, PWR_CR1_LPMS, PWR_CR1_LPMS_SHUTDOWN);

+

+  /* Set SLEEPDEEP bit of Cortex System Control Register */

+  SET_BIT(SCB->SCR, ((uint32_t)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/PVMx interrupt request.

+  * @note This API should be called under the PVD_PVM_IRQHandler().

+  * @retval None

+  */

+void HAL_PWREx_PVD_PVM_IRQHandler(void)

+{

+  /* Check PWR exti flag */

+  if(__HAL_PWR_PVD_EXTI_GET_FLAG() != 0x0U)

+  {

+    /* PWR PVD interrupt user callback */

+    HAL_PWR_PVDCallback();

+

+    /* Clear PVD exti pending bit */

+    __HAL_PWR_PVD_EXTI_CLEAR_FLAG();

+  }

+  /* Next, successively check PVMx exti flags */

+#if defined(PWR_CR2_PVME1)

+  if(__HAL_PWR_PVM1_EXTI_GET_FLAG() != 0x0U)

+  {

+    /* PWR PVM1 interrupt user callback */

+    HAL_PWREx_PVM1Callback();

+

+    /* Clear PVM1 exti pending bit */

+    __HAL_PWR_PVM1_EXTI_CLEAR_FLAG();

+  }

+#endif /* PWR_CR2_PVME1 */

+#if defined(PWR_CR2_PVME2)

+  if(__HAL_PWR_PVM2_EXTI_GET_FLAG() != 0x0U)

+  {

+    /* PWR PVM2 interrupt user callback */

+    HAL_PWREx_PVM2Callback();

+

+    /* Clear PVM2 exti pending bit */

+    __HAL_PWR_PVM2_EXTI_CLEAR_FLAG();

+  }

+#endif /* PWR_CR2_PVME2 */

+  if(__HAL_PWR_PVM3_EXTI_GET_FLAG() != 0x0U)

+  {

+    /* PWR PVM3 interrupt user callback */

+    HAL_PWREx_PVM3Callback();

+

+    /* Clear PVM3 exti pending bit */

+    __HAL_PWR_PVM3_EXTI_CLEAR_FLAG();

+  }

+  if(__HAL_PWR_PVM4_EXTI_GET_FLAG() != 0x0U)

+  {

+    /* PWR PVM4 interrupt user callback */

+    HAL_PWREx_PVM4Callback();

+

+    /* Clear PVM4 exti pending bit */

+    __HAL_PWR_PVM4_EXTI_CLEAR_FLAG();

+  }

+}

+

+

+#if defined(PWR_CR2_PVME1)

+/**

+  * @brief PWR PVM1 interrupt callback

+  * @retval None

+  */

+__weak void HAL_PWREx_PVM1Callback(void)

+{

+  /* NOTE : This function should not be modified; when the callback is needed,

+            HAL_PWREx_PVM1Callback() API can be implemented in the user file

+   */

+}

+#endif /* PWR_CR2_PVME1 */

+

+#if defined(PWR_CR2_PVME2)

+/**

+  * @brief PWR PVM2 interrupt callback

+  * @retval None

+  */

+__weak void HAL_PWREx_PVM2Callback(void)

+{

+  /* NOTE : This function should not be modified; when the callback is needed,

+            HAL_PWREx_PVM2Callback() API can be implemented in the user file

+   */

+}

+#endif /* PWR_CR2_PVME2 */

+

+/**

+  * @brief PWR PVM3 interrupt callback

+  * @retval None

+  */

+__weak void HAL_PWREx_PVM3Callback(void)

+{

+  /* NOTE : This function should not be modified; when the callback is needed,

+            HAL_PWREx_PVM3Callback() API can be implemented in the user file

+   */

+}

+

+/**

+  * @brief PWR PVM4 interrupt callback

+  * @retval None

+  */

+__weak void HAL_PWREx_PVM4Callback(void)

+{

+  /* NOTE : This function should not be modified; when the callback is needed,

+            HAL_PWREx_PVM4Callback() API can be implemented in the user file

+   */

+}

+

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#endif /* HAL_PWR_MODULE_ENABLED */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_qspi.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_qspi.c
new file mode 100644
index 0000000..536d163
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_qspi.c
@@ -0,0 +1,2814 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_qspi.c

+  * @author  MCD Application Team

+  * @brief   QSPI HAL module driver.

+  *          This file provides firmware functions to manage the following

+  *          functionalities of the QuadSPI interface (QSPI).

+  *           + Initialization and de-initialization functions

+  *           + Indirect functional mode management

+  *           + Memory-mapped functional mode management

+  *           + Auto-polling functional mode management

+  *           + Interrupts and flags management

+  *           + DMA channel configuration for indirect functional mode

+  *           + Errors management and abort functionality

+  *

+  *

+  @verbatim

+ ===============================================================================

+                        ##### How to use this driver #####

+ ===============================================================================

+  [..]

+    *** Initialization ***

+    ======================

+    [..]

+      (#) As prerequisite, fill in the HAL_QSPI_MspInit() :

+        (++) Enable QuadSPI clock interface with __HAL_RCC_QSPI_CLK_ENABLE().

+        (++) Reset QuadSPI Peripheral with __HAL_RCC_QSPI_FORCE_RESET() and __HAL_RCC_QSPI_RELEASE_RESET().

+        (++) Enable the clocks for the QuadSPI GPIOS with __HAL_RCC_GPIOx_CLK_ENABLE().

+        (++) Configure these QuadSPI pins in alternate mode using HAL_GPIO_Init().

+        (++) If interrupt mode is used, enable and configure QuadSPI global

+            interrupt with HAL_NVIC_SetPriority() and HAL_NVIC_EnableIRQ().

+        (++) If DMA mode is used, enable the clocks for the QuadSPI DMA channel

+            with __HAL_RCC_DMAx_CLK_ENABLE(), configure DMA with HAL_DMA_Init(),

+            link it with QuadSPI handle using __HAL_LINKDMA(), enable and configure

+            DMA channel global interrupt with HAL_NVIC_SetPriority() and HAL_NVIC_EnableIRQ().

+      (#) Configure the flash size, the clock prescaler, the fifo threshold, the

+          clock mode, the sample shifting and the CS high time using the HAL_QSPI_Init() function.

+

+    *** Indirect functional mode ***

+    ================================

+    [..]

+      (#) Configure the command sequence using the HAL_QSPI_Command() or HAL_QSPI_Command_IT()

+          functions :

+         (++) Instruction phase : the mode used and if present the instruction opcode.

+         (++) Address phase : the mode used and if present the size and the address value.

+         (++) Alternate-bytes phase : the mode used and if present the size and the alternate

+             bytes values.

+         (++) Dummy-cycles phase : the number of dummy cycles (mode used is same as data phase).

+         (++) Data phase : the mode used and if present the number of bytes.

+         (++) Double Data Rate (DDR) mode : the activation (or not) of this mode and the delay

+             if activated.

+         (++) Sending Instruction Only Once (SIOO) mode : the activation (or not) of this mode.

+      (#) If no data is required for the command, it is sent directly to the memory :

+         (++) In polling mode, the output of the function is done when the transfer is complete.

+         (++) In interrupt mode, HAL_QSPI_CmdCpltCallback() will be called when the transfer is complete.

+      (#) For the indirect write mode, use HAL_QSPI_Transmit(), HAL_QSPI_Transmit_DMA() or

+          HAL_QSPI_Transmit_IT() after the command configuration :

+         (++) In polling mode, the output of the function is done when the transfer is complete.

+         (++) In interrupt mode, HAL_QSPI_FifoThresholdCallback() will be called when the fifo threshold

+             is reached and HAL_QSPI_TxCpltCallback() will be called when the transfer is complete.

+         (++) In DMA mode, HAL_QSPI_TxHalfCpltCallback() will be called at the half transfer and

+             HAL_QSPI_TxCpltCallback() will be called when the transfer is complete.

+      (#) For the indirect read mode, use HAL_QSPI_Receive(), HAL_QSPI_Receive_DMA() or

+          HAL_QSPI_Receive_IT() after the command configuration :

+         (++) In polling mode, the output of the function is done when the transfer is complete.

+         (++) In interrupt mode, HAL_QSPI_FifoThresholdCallback() will be called when the fifo threshold

+             is reached and HAL_QSPI_RxCpltCallback() will be called when the transfer is complete.

+         (++) In DMA mode, HAL_QSPI_RxHalfCpltCallback() will be called at the half transfer and

+             HAL_QSPI_RxCpltCallback() will be called when the transfer is complete.

+

+    *** Auto-polling functional mode ***

+    ====================================

+    [..]

+      (#) Configure the command sequence and the auto-polling functional mode using the

+          HAL_QSPI_AutoPolling() or HAL_QSPI_AutoPolling_IT() functions :

+         (++) Instruction phase : the mode used and if present the instruction opcode.

+         (++) Address phase : the mode used and if present the size and the address value.

+         (++) Alternate-bytes phase : the mode used and if present the size and the alternate

+             bytes values.

+         (++) Dummy-cycles phase : the number of dummy cycles (mode used is same as data phase).

+         (++) Data phase : the mode used.

+         (++) Double Data Rate (DDR) mode : the activation (or not) of this mode and the delay

+             if activated.

+         (++) Sending Instruction Only Once (SIOO) mode : the activation (or not) of this mode.

+         (++) The size of the status bytes, the match value, the mask used, the match mode (OR/AND),

+             the polling interval and the automatic stop activation.

+      (#) After the configuration :

+         (++) In polling mode, the output of the function is done when the status match is reached. The

+             automatic stop is activated to avoid an infinite loop.

+         (++) In interrupt mode, HAL_QSPI_StatusMatchCallback() will be called each time the status match is reached.

+

+    *** Memory-mapped functional mode ***

+    =====================================

+    [..]

+      (#) Configure the command sequence and the memory-mapped functional mode using the

+          HAL_QSPI_MemoryMapped() functions :

+         (++) Instruction phase : the mode used and if present the instruction opcode.

+         (++) Address phase : the mode used and the size.

+         (++) Alternate-bytes phase : the mode used and if present the size and the alternate

+             bytes values.

+         (++) Dummy-cycles phase : the number of dummy cycles (mode used is same as data phase).

+         (++) Data phase : the mode used.

+         (++) Double Data Rate (DDR) mode : the activation (or not) of this mode and the delay

+             if activated.

+         (++) Sending Instruction Only Once (SIOO) mode : the activation (or not) of this mode.

+         (++) The timeout activation and the timeout period.

+      (#) After the configuration, the QuadSPI will be used as soon as an access on the AHB is done on

+          the address range. HAL_QSPI_TimeOutCallback() will be called when the timeout expires.

+

+    *** Errors management and abort functionality ***

+    =================================================

+    [..]

+      (#) HAL_QSPI_GetError() function gives the error raised during the last operation.

+      (#) HAL_QSPI_Abort() and HAL_QSPI_AbortIT() functions aborts any on-going operation and

+          flushes the fifo :

+         (++) In polling mode, the output of the function is done when the transfer

+              complete bit is set and the busy bit cleared.

+         (++) In interrupt mode, HAL_QSPI_AbortCpltCallback() will be called when

+              the transfer complete bit is set.

+

+    *** Control functions ***

+    =========================

+    [..]

+      (#) HAL_QSPI_GetState() function gives the current state of the HAL QuadSPI driver.

+      (#) HAL_QSPI_SetTimeout() function configures the timeout value used in the driver.

+      (#) HAL_QSPI_SetFifoThreshold() function configures the threshold on the Fifo of the QSPI IP.

+      (#) HAL_QSPI_GetFifoThreshold() function gives the current of the Fifo's threshold

+      (#) HAL_QSPI_SetFlashID() function configures the index of the flash memory to be accessed.

+

+    *** Callback registration ***

+    =============================================

+    [..]

+      The compilation define  USE_HAL_QSPI_REGISTER_CALLBACKS when set to 1

+      allows the user to configure dynamically the driver callbacks.

+

+      Use Functions @ref HAL_QSPI_RegisterCallback() to register a user callback,

+      it allows to register following callbacks:

+        (+) ErrorCallback : callback when error occurs.

+        (+) AbortCpltCallback : callback when abort is completed.

+        (+) FifoThresholdCallback : callback when the fifo threshold is reached.

+        (+) CmdCpltCallback : callback when a command without data is completed.

+        (+) RxCpltCallback : callback when a reception transfer is completed.

+        (+) TxCpltCallback : callback when a transmission transfer is completed.

+        (+) RxHalfCpltCallback : callback when half of the reception transfer is completed.

+        (+) TxHalfCpltCallback : callback when half of the transmission transfer is completed.

+        (+) StatusMatchCallback : callback when a status match occurs.

+        (+) TimeOutCallback : callback when the timeout perioed expires.

+        (+) MspInitCallback    : QSPI MspInit.

+        (+) MspDeInitCallback  : QSPI MspDeInit.

+      This function takes as parameters the HAL peripheral handle, the Callback ID

+      and a pointer to the user callback function.

+

+      Use function @ref HAL_QSPI_UnRegisterCallback() to reset a callback to the default

+      weak (surcharged) function. It allows to reset following callbacks:

+        (+) ErrorCallback : callback when error occurs.

+        (+) AbortCpltCallback : callback when abort is completed.

+        (+) FifoThresholdCallback : callback when the fifo threshold is reached.

+        (+) CmdCpltCallback : callback when a command without data is completed.

+        (+) RxCpltCallback : callback when a reception transfer is completed.

+        (+) TxCpltCallback : callback when a transmission transfer is completed.

+        (+) RxHalfCpltCallback : callback when half of the reception transfer is completed.

+        (+) TxHalfCpltCallback : callback when half of the transmission transfer is completed.

+        (+) StatusMatchCallback : callback when a status match occurs.

+        (+) TimeOutCallback : callback when the timeout perioed expires.

+        (+) MspInitCallback    : QSPI MspInit.

+        (+) MspDeInitCallback  : QSPI MspDeInit.

+      This function) takes as parameters the HAL peripheral handle and the Callback ID.

+

+      By default, after the @ref HAL_QSPI_Init and if the state is HAL_QSPI_STATE_RESET

+      all callbacks are reset to the corresponding legacy weak (surcharged) functions.

+      Exception done for MspInit and MspDeInit callbacks that are respectively

+      reset to the legacy weak (surcharged) functions in the @ref HAL_QSPI_Init

+      and @ref  HAL_QSPI_DeInit only when these callbacks are null (not registered beforehand).

+      If not, MspInit or MspDeInit are not null, the @ref HAL_QSPI_Init and @ref HAL_QSPI_DeInit

+      keep and use the user MspInit/MspDeInit callbacks (registered beforehand)

+

+      Callbacks can be registered/unregistered in READY state only.

+      Exception done for MspInit/MspDeInit callbacks that can be registered/unregistered

+      in READY or RESET state, thus registered (user) MspInit/DeInit callbacks can be used

+      during the Init/DeInit.

+      In that case first register the MspInit/MspDeInit user callbacks

+      using @ref HAL_QSPI_RegisterCallback before calling @ref HAL_QSPI_DeInit

+      or @ref HAL_QSPI_Init function.

+

+      When The compilation define USE_HAL_QSPI_REGISTER_CALLBACKS is set to 0 or

+      not defined, the callback registering feature is not available

+      and weak (surcharged) callbacks are used.

+

+    *** Workarounds linked to Silicon Limitation ***

+    ====================================================

+    [..]

+      (#) Workarounds Implemented inside HAL Driver

+         (++) Extra data written in the FIFO at the end of a read transfer

+

+  @endverbatim

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                       opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+#if defined(QUADSPI)

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup QSPI QSPI

+  * @brief QSPI HAL module driver

+  * @{

+  */

+#ifdef HAL_QSPI_MODULE_ENABLED

+

+/* Private typedef -----------------------------------------------------------*/

+

+/* Private define ------------------------------------------------------------*/

+/** @defgroup QSPI_Private_Constants QSPI Private Constants

+  * @{

+  */

+#define QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE 0x00000000U                     /*!<Indirect write mode*/

+#define QSPI_FUNCTIONAL_MODE_INDIRECT_READ  ((uint32_t)QUADSPI_CCR_FMODE_0) /*!<Indirect read mode*/

+#define QSPI_FUNCTIONAL_MODE_AUTO_POLLING   ((uint32_t)QUADSPI_CCR_FMODE_1) /*!<Automatic polling mode*/

+#define QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED  ((uint32_t)QUADSPI_CCR_FMODE)   /*!<Memory-mapped mode*/

+/**

+  * @}

+  */

+

+/* Private macro -------------------------------------------------------------*/

+/** @defgroup QSPI_Private_Macros QSPI Private Macros

+  * @{

+  */

+#define IS_QSPI_FUNCTIONAL_MODE(MODE) (((MODE) == QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE) || \

+                                       ((MODE) == QSPI_FUNCTIONAL_MODE_INDIRECT_READ)  || \

+                                       ((MODE) == QSPI_FUNCTIONAL_MODE_AUTO_POLLING)   || \

+                                       ((MODE) == QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED))

+/**

+  * @}

+  */

+

+/* Private variables ---------------------------------------------------------*/

+

+/* Private function prototypes -----------------------------------------------*/

+static void QSPI_DMARxCplt(DMA_HandleTypeDef *hdma);

+static void QSPI_DMATxCplt(DMA_HandleTypeDef *hdma);

+static void QSPI_DMARxHalfCplt(DMA_HandleTypeDef *hdma);

+static void QSPI_DMATxHalfCplt(DMA_HandleTypeDef *hdma);

+static void QSPI_DMAError(DMA_HandleTypeDef *hdma);

+static void QSPI_DMAAbortCplt(DMA_HandleTypeDef *hdma);

+static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Flag, FlagStatus State, uint32_t Tickstart, uint32_t Timeout);

+static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t FunctionalMode);

+

+/* Exported functions --------------------------------------------------------*/

+

+/** @defgroup QSPI_Exported_Functions QSPI Exported Functions

+  * @{

+  */

+

+/** @defgroup QSPI_Exported_Functions_Group1 Initialization/de-initialization functions

+  *  @brief    Initialization and Configuration functions

+  *

+@verbatim

+===============================================================================

+            ##### Initialization and Configuration functions #####

+ ===============================================================================

+    [..]

+    This subsection provides a set of functions allowing to :

+      (+) Initialize the QuadSPI.

+      (+) De-initialize the QuadSPI.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief Initialize the QSPI mode according to the specified parameters

+  *        in the QSPI_InitTypeDef and initialize the associated handle.

+  * @param hqspi : QSPI handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_QSPI_Init(QSPI_HandleTypeDef *hqspi)

+{

+  HAL_StatusTypeDef status;

+  uint32_t tickstart = HAL_GetTick();

+

+  /* Check the QSPI handle allocation */

+  if(hqspi == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check the parameters */

+  assert_param(IS_QSPI_ALL_INSTANCE(hqspi->Instance));

+  assert_param(IS_QSPI_CLOCK_PRESCALER(hqspi->Init.ClockPrescaler));

+  assert_param(IS_QSPI_FIFO_THRESHOLD(hqspi->Init.FifoThreshold));

+  assert_param(IS_QSPI_SSHIFT(hqspi->Init.SampleShifting));

+  assert_param(IS_QSPI_FLASH_SIZE(hqspi->Init.FlashSize));

+  assert_param(IS_QSPI_CS_HIGH_TIME(hqspi->Init.ChipSelectHighTime));

+  assert_param(IS_QSPI_CLOCK_MODE(hqspi->Init.ClockMode));

+#if defined(QUADSPI_CR_DFM)

+  assert_param(IS_QSPI_DUAL_FLASH_MODE(hqspi->Init.DualFlash));

+

+  if (hqspi->Init.DualFlash != QSPI_DUALFLASH_ENABLE )

+  {

+    assert_param(IS_QSPI_FLASH_ID(hqspi->Init.FlashID));

+  }

+#endif

+

+  /* Process locked */

+  __HAL_LOCK(hqspi);

+

+  if(hqspi->State == HAL_QSPI_STATE_RESET)

+  {

+    /* Allocate lock resource and initialize it */

+    hqspi->Lock = HAL_UNLOCKED;

+

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+    /* Reset Callback pointers in HAL_QSPI_STATE_RESET only */

+    hqspi->ErrorCallback         = HAL_QSPI_ErrorCallback;

+    hqspi->AbortCpltCallback     = HAL_QSPI_AbortCpltCallback;

+    hqspi->FifoThresholdCallback = HAL_QSPI_FifoThresholdCallback;

+    hqspi->CmdCpltCallback       = HAL_QSPI_CmdCpltCallback;

+    hqspi->RxCpltCallback        = HAL_QSPI_RxCpltCallback;

+    hqspi->TxCpltCallback        = HAL_QSPI_TxCpltCallback;

+    hqspi->RxHalfCpltCallback    = HAL_QSPI_RxHalfCpltCallback;

+    hqspi->TxHalfCpltCallback    = HAL_QSPI_TxHalfCpltCallback;

+    hqspi->StatusMatchCallback   = HAL_QSPI_StatusMatchCallback;

+    hqspi->TimeOutCallback       = HAL_QSPI_TimeOutCallback;

+

+    if(hqspi->MspInitCallback == NULL)

+    {

+      hqspi->MspInitCallback = HAL_QSPI_MspInit;

+    }

+

+    /* Init the low level hardware */

+    hqspi->MspInitCallback(hqspi);

+#else

+    /* Init the low level hardware : GPIO, CLOCK */

+    HAL_QSPI_MspInit(hqspi);

+#endif

+

+    /* Configure the default timeout for the QSPI memory access */

+    HAL_QSPI_SetTimeout(hqspi, HAL_QSPI_TIMEOUT_DEFAULT_VALUE);

+  }

+

+  /* Configure QSPI FIFO Threshold */

+  MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_FTHRES,

+             ((hqspi->Init.FifoThreshold - 1U) << QUADSPI_CR_FTHRES_Pos));

+

+  /* Wait till BUSY flag reset */

+  status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);

+

+  if(status == HAL_OK)

+  {

+    /* Configure QSPI Clock Prescaler and Sample Shift */

+#if defined(QUADSPI_CR_DFM)

+    MODIFY_REG(hqspi->Instance->CR, (QUADSPI_CR_PRESCALER | QUADSPI_CR_SSHIFT | QUADSPI_CR_FSEL | QUADSPI_CR_DFM),

+               ((hqspi->Init.ClockPrescaler << QUADSPI_CR_PRESCALER_Pos) |

+                hqspi->Init.SampleShifting  | hqspi->Init.FlashID | hqspi->Init.DualFlash));

+#else

+    MODIFY_REG(hqspi->Instance->CR, (QUADSPI_CR_PRESCALER | QUADSPI_CR_SSHIFT),

+               ((hqspi->Init.ClockPrescaler << QUADSPI_CR_PRESCALER_Pos) |

+                hqspi->Init.SampleShifting));

+#endif

+

+    /* Configure QSPI Flash Size, CS High Time and Clock Mode */

+    MODIFY_REG(hqspi->Instance->DCR, (QUADSPI_DCR_FSIZE | QUADSPI_DCR_CSHT | QUADSPI_DCR_CKMODE),

+               ((hqspi->Init.FlashSize << QUADSPI_DCR_FSIZE_Pos) |

+                hqspi->Init.ChipSelectHighTime | hqspi->Init.ClockMode));

+

+    /* Enable the QSPI peripheral */

+    __HAL_QSPI_ENABLE(hqspi);

+

+    /* Set QSPI error code to none */

+    hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;

+

+    /* Initialize the QSPI state */

+    hqspi->State = HAL_QSPI_STATE_READY;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hqspi);

+

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief De-Initialize the QSPI peripheral.

+  * @param hqspi : QSPI handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_QSPI_DeInit(QSPI_HandleTypeDef *hqspi)

+{

+  /* Check the QSPI handle allocation */

+  if(hqspi == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Process locked */

+  __HAL_LOCK(hqspi);

+

+  /* Disable the QSPI Peripheral Clock */

+  __HAL_QSPI_DISABLE(hqspi);

+

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+  if(hqspi->MspDeInitCallback == NULL)

+  {

+    hqspi->MspDeInitCallback = HAL_QSPI_MspDeInit;

+  }

+

+  /* DeInit the low level hardware */

+  hqspi->MspDeInitCallback(hqspi);

+#else

+  /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */

+  HAL_QSPI_MspDeInit(hqspi);

+#endif

+

+  /* Set QSPI error code to none */

+  hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;

+

+  /* Initialize the QSPI state */

+  hqspi->State = HAL_QSPI_STATE_RESET;

+

+  /* Release Lock */

+  __HAL_UNLOCK(hqspi);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief Initialize the QSPI MSP.

+  * @param hqspi : QSPI handle

+  * @retval None

+  */

+__weak void HAL_QSPI_MspInit(QSPI_HandleTypeDef *hqspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hqspi);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_QSPI_MspInit can be implemented in the user file

+   */

+}

+

+/**

+  * @brief DeInitialize the QSPI MSP.

+  * @param hqspi : QSPI handle

+  * @retval None

+  */

+__weak void HAL_QSPI_MspDeInit(QSPI_HandleTypeDef *hqspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hqspi);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_QSPI_MspDeInit can be implemented in the user file

+   */

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup QSPI_Exported_Functions_Group2 Input and Output operation functions

+  *  @brief QSPI Transmit/Receive functions

+  *

+@verbatim

+ ===============================================================================

+                      ##### IO operation functions #####

+ ===============================================================================

+    [..]

+    This subsection provides a set of functions allowing to :

+      (+) Handle the interrupts.

+      (+) Handle the command sequence.

+      (+) Transmit data in blocking, interrupt or DMA mode.

+      (+) Receive data in blocking, interrupt or DMA mode.

+      (+) Manage the auto-polling functional mode.

+      (+) Manage the memory-mapped functional mode.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief Handle QSPI interrupt request.

+  * @param hqspi : QSPI handle

+  * @retval None

+  */

+void HAL_QSPI_IRQHandler(QSPI_HandleTypeDef *hqspi)

+{

+  __IO uint32_t *data_reg;

+  uint32_t flag = READ_REG(hqspi->Instance->SR);

+  uint32_t itsource = READ_REG(hqspi->Instance->CR);

+

+  /* QSPI Fifo Threshold interrupt occurred ----------------------------------*/

+  if(((flag & QSPI_FLAG_FT) != 0U) && ((itsource & QSPI_IT_FT) != 0U))

+  {

+    data_reg = &hqspi->Instance->DR;

+

+    if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_TX)

+    {

+      /* Transmission process */

+      while(__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_FT) != RESET)

+      {

+        if (hqspi->TxXferCount > 0U)

+        {

+          /* Fill the FIFO until the threshold is reached */

+          *((__IO uint8_t *)data_reg) = *hqspi->pTxBuffPtr;

+          hqspi->pTxBuffPtr++;

+          hqspi->TxXferCount--;

+        }

+        else

+        {

+          /* No more data available for the transfer */

+          /* Disable the QSPI FIFO Threshold Interrupt */

+          __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_FT);

+          break;

+        }

+      }

+    }

+    else if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_RX)

+    {

+      /* Receiving Process */

+      while(__HAL_QSPI_GET_FLAG(hqspi, QSPI_FLAG_FT) != RESET)

+      {

+        if (hqspi->RxXferCount > 0U)

+        {

+          /* Read the FIFO until the threshold is reached */

+          *hqspi->pRxBuffPtr = *((__IO uint8_t *)data_reg);

+          hqspi->pRxBuffPtr++;

+          hqspi->RxXferCount--;

+        }

+        else

+        {

+          /* All data have been received for the transfer */

+          /* Disable the QSPI FIFO Threshold Interrupt */

+          __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_FT);

+          break;

+        }

+      }

+    }

+    else

+    {

+      /* Nothing to do */

+    }

+

+    /* FIFO Threshold callback */

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+    hqspi->FifoThresholdCallback(hqspi);

+#else

+    HAL_QSPI_FifoThresholdCallback(hqspi);

+#endif

+  }

+

+  /* QSPI Transfer Complete interrupt occurred -------------------------------*/

+  else if(((flag & QSPI_FLAG_TC) != 0U) && ((itsource & QSPI_IT_TC) != 0U))

+  {

+    /* Clear interrupt */

+    WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_TC);

+

+    /* Disable the QSPI FIFO Threshold, Transfer Error and Transfer complete Interrupts */

+    __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_TC | QSPI_IT_TE | QSPI_IT_FT);

+

+    /* Transfer complete callback */

+    if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_TX)

+    {

+      if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN) != 0U)

+      {

+        /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */

+        CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);

+

+        /* Disable the DMA channel */

+        __HAL_DMA_DISABLE(hqspi->hdma);

+      }

+

+#if  (defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx))

+      /* Clear Busy bit */

+      HAL_QSPI_Abort_IT(hqspi);

+#endif

+

+      /* Change state of QSPI */

+      hqspi->State = HAL_QSPI_STATE_READY;

+

+      /* TX Complete callback */

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+      hqspi->TxCpltCallback(hqspi);

+#else

+      HAL_QSPI_TxCpltCallback(hqspi);

+#endif

+    }

+    else if(hqspi->State == HAL_QSPI_STATE_BUSY_INDIRECT_RX)

+    {

+      if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN) != 0U)

+      {

+        /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */

+        CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);

+

+        /* Disable the DMA channel */

+        __HAL_DMA_DISABLE(hqspi->hdma);

+      }

+      else

+      {

+        data_reg = &hqspi->Instance->DR;

+        while(READ_BIT(hqspi->Instance->SR, QUADSPI_SR_FLEVEL) != 0U)

+        {

+          if (hqspi->RxXferCount > 0U)

+          {

+            /* Read the last data received in the FIFO until it is empty */

+            *hqspi->pRxBuffPtr = *((__IO uint8_t *)data_reg);

+            hqspi->pRxBuffPtr++;

+            hqspi->RxXferCount--;

+          }

+          else

+          {

+            /* All data have been received for the transfer */

+            break;

+          }

+        }

+      }

+

+#if  (defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx))

+      /* Workaround - Extra data written in the FIFO at the end of a read transfer */

+      HAL_QSPI_Abort_IT(hqspi);

+#endif

+

+      /* Change state of QSPI */

+      hqspi->State = HAL_QSPI_STATE_READY;

+

+      /* RX Complete callback */

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+      hqspi->RxCpltCallback(hqspi);

+#else

+      HAL_QSPI_RxCpltCallback(hqspi);

+#endif

+    }

+    else if(hqspi->State == HAL_QSPI_STATE_BUSY)

+    {

+      /* Change state of QSPI */

+      hqspi->State = HAL_QSPI_STATE_READY;

+

+      /* Command Complete callback */

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+      hqspi->CmdCpltCallback(hqspi);

+#else

+      HAL_QSPI_CmdCpltCallback(hqspi);

+#endif

+    }

+    else if(hqspi->State == HAL_QSPI_STATE_ABORT)

+    {

+      /* Reset functional mode configuration to indirect write mode by default */

+      CLEAR_BIT(hqspi->Instance->CCR, QUADSPI_CCR_FMODE);

+

+      /* Change state of QSPI */

+      hqspi->State = HAL_QSPI_STATE_READY;

+

+      if (hqspi->ErrorCode == HAL_QSPI_ERROR_NONE)

+      {

+        /* Abort called by the user */

+

+        /* Abort Complete callback */

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+        hqspi->AbortCpltCallback(hqspi);

+#else

+        HAL_QSPI_AbortCpltCallback(hqspi);

+#endif

+      }

+      else

+      {

+        /* Abort due to an error (eg :  DMA error) */

+

+        /* Error callback */

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+        hqspi->ErrorCallback(hqspi);

+#else

+        HAL_QSPI_ErrorCallback(hqspi);

+#endif

+      }

+    }

+    else

+    {

+     /* Nothing to do */

+    }

+  }

+

+  /* QSPI Status Match interrupt occurred ------------------------------------*/

+  else if(((flag & QSPI_FLAG_SM) != 0U) && ((itsource & QSPI_IT_SM) != 0U))

+  {

+    /* Clear interrupt */

+    WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_SM);

+

+    /* Check if the automatic poll mode stop is activated */

+    if(READ_BIT(hqspi->Instance->CR, QUADSPI_CR_APMS) != 0U)

+    {

+      /* Disable the QSPI Transfer Error and Status Match Interrupts */

+      __HAL_QSPI_DISABLE_IT(hqspi, (QSPI_IT_SM | QSPI_IT_TE));

+

+      /* Change state of QSPI */

+      hqspi->State = HAL_QSPI_STATE_READY;

+    }

+

+    /* Status match callback */

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+    hqspi->StatusMatchCallback(hqspi);

+#else

+    HAL_QSPI_StatusMatchCallback(hqspi);

+#endif

+  }

+

+  /* QSPI Transfer Error interrupt occurred ----------------------------------*/

+  else if(((flag & QSPI_FLAG_TE) != 0U) && ((itsource & QSPI_IT_TE) != 0U))

+  {

+    /* Clear interrupt */

+    WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_TE);

+

+    /* Disable all the QSPI Interrupts */

+    __HAL_QSPI_DISABLE_IT(hqspi, QSPI_IT_SM | QSPI_IT_TC | QSPI_IT_TE | QSPI_IT_FT);

+

+    /* Set error code */

+    hqspi->ErrorCode |= HAL_QSPI_ERROR_TRANSFER;

+

+    if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN) != 0U)

+    {

+      /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */

+      CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);

+

+      /* Disable the DMA channel */

+      hqspi->hdma->XferAbortCallback = QSPI_DMAAbortCplt;

+      if (HAL_DMA_Abort_IT(hqspi->hdma) != HAL_OK)

+      {

+        /* Set error code to DMA */

+        hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;

+

+        /* Change state of QSPI */

+        hqspi->State = HAL_QSPI_STATE_READY;

+        

+        /* Error callback */

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+        hqspi->ErrorCallback(hqspi);

+#else

+        HAL_QSPI_ErrorCallback(hqspi);

+#endif

+      }

+    }

+    else

+    {

+      /* Change state of QSPI */

+      hqspi->State = HAL_QSPI_STATE_READY;

+

+      /* Error callback */

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+      hqspi->ErrorCallback(hqspi);

+#else

+      HAL_QSPI_ErrorCallback(hqspi);

+#endif

+    }

+  }

+

+  /* QSPI Timeout interrupt occurred -----------------------------------------*/

+  else if(((flag & QSPI_FLAG_TO) != 0U) && ((itsource & QSPI_IT_TO) != 0U))

+  {

+    /* Clear interrupt */

+    WRITE_REG(hqspi->Instance->FCR, QSPI_FLAG_TO);

+

+    /* Timeout callback */

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+    hqspi->TimeOutCallback(hqspi);

+#else

+    HAL_QSPI_TimeOutCallback(hqspi);

+#endif

+  }

+

+   else

+  {

+   /* Nothing to do */

+  }

+}

+

+/**

+  * @brief Set the command configuration.

+  * @param hqspi : QSPI handle

+  * @param cmd : structure that contains the command configuration information

+  * @param Timeout : Timeout duration

+  * @note   This function is used only in Indirect Read or Write Modes

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_QSPI_Command(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t Timeout)

+{

+  HAL_StatusTypeDef status;

+  uint32_t tickstart = HAL_GetTick();

+

+  /* Check the parameters */

+  assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));

+  if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)

+  {

+    assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));

+  }

+

+  assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));

+  if (cmd->AddressMode != QSPI_ADDRESS_NONE)

+  {

+    assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));

+  }

+

+  assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));

+  if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)

+  {

+    assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));

+  }

+

+  assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));

+  assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));

+

+  assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));

+  assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));

+  assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));

+

+  /* Process locked */

+  __HAL_LOCK(hqspi);

+

+  if(hqspi->State == HAL_QSPI_STATE_READY)

+  {

+    hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;

+

+    /* Update QSPI state */

+    hqspi->State = HAL_QSPI_STATE_BUSY;

+

+    /* Wait till BUSY flag reset */

+    status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, Timeout);

+

+    if (status == HAL_OK)

+    {

+      /* Call the configuration function */

+      QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);

+

+      if (cmd->DataMode == QSPI_DATA_NONE)

+      {

+        /* When there is no data phase, the transfer start as soon as the configuration is done

+        so wait until TC flag is set to go back in idle state */

+        status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, tickstart, Timeout);

+

+        if (status == HAL_OK)

+        {

+          __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);

+

+          /* Update QSPI state */

+          hqspi->State = HAL_QSPI_STATE_READY;

+        }

+      }

+      else

+      {

+        /* Update QSPI state */

+        hqspi->State = HAL_QSPI_STATE_READY;

+      }

+    }

+  }

+  else

+  {

+    status = HAL_BUSY;

+  }

+

+  /* Process unlocked */

+  __HAL_UNLOCK(hqspi);

+

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief Set the command configuration in interrupt mode.

+  * @param hqspi : QSPI handle

+  * @param cmd : structure that contains the command configuration information

+  * @note   This function is used only in Indirect Read or Write Modes

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_QSPI_Command_IT(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd)

+{

+  HAL_StatusTypeDef status;

+  uint32_t tickstart = HAL_GetTick();

+

+  /* Check the parameters */

+  assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));

+  if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)

+  {

+    assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));

+  }

+

+  assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));

+  if (cmd->AddressMode != QSPI_ADDRESS_NONE)

+  {

+    assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));

+  }

+

+  assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));

+  if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)

+  {

+    assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));

+  }

+

+  assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));

+  assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));

+

+  assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));

+  assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));

+  assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));

+

+  /* Process locked */

+  __HAL_LOCK(hqspi);

+

+  if(hqspi->State == HAL_QSPI_STATE_READY)

+  {

+    hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;

+

+    /* Update QSPI state */

+    hqspi->State = HAL_QSPI_STATE_BUSY;

+

+    /* Wait till BUSY flag reset */

+    status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);

+

+    if (status == HAL_OK)

+    {

+      if (cmd->DataMode == QSPI_DATA_NONE)

+      {

+        /* Clear interrupt */

+        __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_TC);

+      }

+

+      /* Call the configuration function */

+      QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);

+

+      if (cmd->DataMode == QSPI_DATA_NONE)

+      {

+        /* When there is no data phase, the transfer start as soon as the configuration is done

+        so activate TC and TE interrupts */

+        /* Process unlocked */

+        __HAL_UNLOCK(hqspi);

+

+        /* Enable the QSPI Transfer Error Interrupt */

+        __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE | QSPI_IT_TC);

+      }

+      else

+      {

+        /* Update QSPI state */

+        hqspi->State = HAL_QSPI_STATE_READY;

+

+        /* Process unlocked */

+        __HAL_UNLOCK(hqspi);

+      }

+    }

+    else

+    {

+      /* Process unlocked */

+      __HAL_UNLOCK(hqspi);

+    }

+  }

+  else

+  {

+    status = HAL_BUSY;

+

+    /* Process unlocked */

+    __HAL_UNLOCK(hqspi);

+  }

+

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief Transmit an amount of data in blocking mode.

+  * @param hqspi : QSPI handle

+  * @param pData : pointer to data buffer

+  * @param Timeout : Timeout duration

+  * @note   This function is used only in Indirect Write Mode

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_QSPI_Transmit(QSPI_HandleTypeDef *hqspi, uint8_t *pData, uint32_t Timeout)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+  uint32_t tickstart = HAL_GetTick();

+  __IO uint32_t *data_reg = &hqspi->Instance->DR;

+

+  /* Process locked */

+  __HAL_LOCK(hqspi);

+

+  if(hqspi->State == HAL_QSPI_STATE_READY)

+  {

+    hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;

+

+    if(pData != NULL )

+    {

+      /* Update state */

+      hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_TX;

+

+      /* Configure counters and size of the handle */

+      hqspi->TxXferCount = READ_REG(hqspi->Instance->DLR) + 1U;

+      hqspi->TxXferSize = READ_REG(hqspi->Instance->DLR) + 1U;

+      hqspi->pTxBuffPtr = pData;

+

+      /* Configure QSPI: CCR register with functional as indirect write */

+      MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);

+

+      while(hqspi->TxXferCount > 0U)

+      {

+        /* Wait until FT flag is set to send data */

+        status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_FT, SET, tickstart, Timeout);

+

+        if (status != HAL_OK)

+        {

+          break;

+        }

+

+        *((__IO uint8_t *)data_reg) = *hqspi->pTxBuffPtr;

+        hqspi->pTxBuffPtr++;

+        hqspi->TxXferCount--;

+      }

+

+      if (status == HAL_OK)

+      {

+        /* Wait until TC flag is set to go back in idle state */

+        status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, tickstart, Timeout);

+

+        if (status == HAL_OK)

+        {

+          /* Clear Transfer Complete bit */

+          __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);

+

+#if  (defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx))

+          /* Clear Busy bit */

+          status = HAL_QSPI_Abort(hqspi);

+#endif

+        }

+      }

+

+      /* Update QSPI state */

+      hqspi->State = HAL_QSPI_STATE_READY;

+    }

+    else

+    {

+      hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;

+      status = HAL_ERROR;

+    }

+  }

+  else

+  {

+    status = HAL_BUSY;

+  }

+

+  /* Process unlocked */

+  __HAL_UNLOCK(hqspi);

+

+  return status;

+}

+

+

+/**

+  * @brief Receive an amount of data in blocking mode.

+  * @param hqspi : QSPI handle

+  * @param pData : pointer to data buffer

+  * @param Timeout : Timeout duration

+  * @note   This function is used only in Indirect Read Mode

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_QSPI_Receive(QSPI_HandleTypeDef *hqspi, uint8_t *pData, uint32_t Timeout)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+  uint32_t tickstart = HAL_GetTick();

+  uint32_t addr_reg = READ_REG(hqspi->Instance->AR);

+  __IO uint32_t *data_reg = &hqspi->Instance->DR;

+

+  /* Process locked */

+  __HAL_LOCK(hqspi);

+

+  if(hqspi->State == HAL_QSPI_STATE_READY)

+  {

+    hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;

+

+    if(pData != NULL )

+    {

+      /* Update state */

+      hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_RX;

+

+      /* Configure counters and size of the handle */

+      hqspi->RxXferCount = READ_REG(hqspi->Instance->DLR) + 1U;

+      hqspi->RxXferSize = READ_REG(hqspi->Instance->DLR) + 1U;

+      hqspi->pRxBuffPtr = pData;

+

+      /* Configure QSPI: CCR register with functional as indirect read */

+      MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);

+

+      /* Start the transfer by re-writing the address in AR register */

+      WRITE_REG(hqspi->Instance->AR, addr_reg);

+

+      while(hqspi->RxXferCount > 0U)

+      {

+        /* Wait until FT or TC flag is set to read received data */

+        status = QSPI_WaitFlagStateUntilTimeout(hqspi, (QSPI_FLAG_FT | QSPI_FLAG_TC), SET, tickstart, Timeout);

+

+        if  (status != HAL_OK)

+        {

+          break;

+        }

+

+        *hqspi->pRxBuffPtr = *((__IO uint8_t *)data_reg);

+        hqspi->pRxBuffPtr++;

+        hqspi->RxXferCount--;

+      }

+

+      if (status == HAL_OK)

+      {

+        /* Wait until TC flag is set to go back in idle state */

+        status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, tickstart, Timeout);

+

+        if  (status == HAL_OK)

+        {

+          /* Clear Transfer Complete bit */

+          __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);

+

+#if  (defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx))

+          /* Workaround - Extra data written in the FIFO at the end of a read transfer */

+          status = HAL_QSPI_Abort(hqspi);

+#endif

+        }

+      }

+

+      /* Update QSPI state */

+      hqspi->State = HAL_QSPI_STATE_READY;

+    }

+    else

+    {

+      hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;

+      status = HAL_ERROR;

+    }

+  }

+  else

+  {

+    status = HAL_BUSY;

+  }

+

+  /* Process unlocked */

+  __HAL_UNLOCK(hqspi);

+

+  return status;

+}

+

+/**

+  * @brief  Send an amount of data in non-blocking mode with interrupt.

+  * @param  hqspi : QSPI handle

+  * @param  pData : pointer to data buffer

+  * @note   This function is used only in Indirect Write Mode

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_QSPI_Transmit_IT(QSPI_HandleTypeDef *hqspi, uint8_t *pData)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Process locked */

+  __HAL_LOCK(hqspi);

+

+  if(hqspi->State == HAL_QSPI_STATE_READY)

+  {

+    hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;

+

+    if(pData != NULL )

+    {

+      /* Update state */

+      hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_TX;

+

+      /* Configure counters and size of the handle */

+      hqspi->TxXferCount = READ_REG(hqspi->Instance->DLR) + 1U;

+      hqspi->TxXferSize = READ_REG(hqspi->Instance->DLR) + 1U;

+      hqspi->pTxBuffPtr = pData;

+

+      /* Clear interrupt */

+      __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_TC);

+

+      /* Configure QSPI: CCR register with functional as indirect write */

+      MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);

+

+      /* Process unlocked */

+      __HAL_UNLOCK(hqspi);

+

+      /* Enable the QSPI transfer error, FIFO threshold and transfer complete Interrupts */

+      __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE | QSPI_IT_FT | QSPI_IT_TC);

+    }

+    else

+    {

+      hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;

+      status = HAL_ERROR;

+

+      /* Process unlocked */

+      __HAL_UNLOCK(hqspi);

+    }

+  }

+  else

+  {

+    status = HAL_BUSY;

+

+    /* Process unlocked */

+    __HAL_UNLOCK(hqspi);

+  }

+

+  return status;

+}

+

+/**

+  * @brief  Receive an amount of data in non-blocking mode with interrupt.

+  * @param  hqspi : QSPI handle

+  * @param  pData : pointer to data buffer

+  * @note   This function is used only in Indirect Read Mode

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_QSPI_Receive_IT(QSPI_HandleTypeDef *hqspi, uint8_t *pData)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+  uint32_t addr_reg = READ_REG(hqspi->Instance->AR);

+

+  /* Process locked */

+  __HAL_LOCK(hqspi);

+

+  if(hqspi->State == HAL_QSPI_STATE_READY)

+  {

+    hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;

+

+    if(pData != NULL )

+    {

+      /* Update state */

+      hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_RX;

+

+      /* Configure counters and size of the handle */

+      hqspi->RxXferCount = READ_REG(hqspi->Instance->DLR) + 1U;

+      hqspi->RxXferSize = READ_REG(hqspi->Instance->DLR) + 1U;

+      hqspi->pRxBuffPtr = pData;

+

+      /* Clear interrupt */

+      __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_TC);

+

+      /* Configure QSPI: CCR register with functional as indirect read */

+      MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);

+

+      /* Start the transfer by re-writing the address in AR register */

+      WRITE_REG(hqspi->Instance->AR, addr_reg);

+

+      /* Process unlocked */

+      __HAL_UNLOCK(hqspi);

+

+      /* Enable the QSPI transfer error, FIFO threshold and transfer complete Interrupts */

+      __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE | QSPI_IT_FT | QSPI_IT_TC);

+    }

+    else

+    {

+      hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;

+      status = HAL_ERROR;

+

+      /* Process unlocked */

+      __HAL_UNLOCK(hqspi);

+    }

+  }

+  else

+  {

+    status = HAL_BUSY;

+

+    /* Process unlocked */

+    __HAL_UNLOCK(hqspi);

+  }

+

+  return status;

+}

+

+/**

+  * @brief  Send an amount of data in non-blocking mode with DMA.

+  * @param  hqspi : QSPI handle

+  * @param  pData : pointer to data buffer

+  * @note   This function is used only in Indirect Write Mode

+  * @note   If DMA peripheral access is configured as halfword, the number

+  *         of data and the fifo threshold should be aligned on halfword

+  * @note   If DMA peripheral access is configured as word, the number

+  *         of data and the fifo threshold should be aligned on word

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_QSPI_Transmit_DMA(QSPI_HandleTypeDef *hqspi, uint8_t *pData)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+  uint32_t data_size = (READ_REG(hqspi->Instance->DLR) + 1U);

+

+  /* Process locked */

+  __HAL_LOCK(hqspi);

+

+  if(hqspi->State == HAL_QSPI_STATE_READY)

+  {

+    /* Clear the error code */

+    hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;

+

+    if(pData != NULL )

+    {

+      /* Configure counters of the handle */

+      if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_BYTE)

+      {

+        hqspi->TxXferCount = data_size;

+      }

+      else if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_HALFWORD)

+      {

+        if (((data_size % 2U) != 0U) || ((hqspi->Init.FifoThreshold % 2U) != 0U))

+        {

+          /* The number of data or the fifo threshold is not aligned on halfword

+          => no transfer possible with DMA peripheral access configured as halfword */

+          hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;

+          status = HAL_ERROR;

+

+          /* Process unlocked */

+          __HAL_UNLOCK(hqspi);

+        }

+        else

+        {

+          hqspi->TxXferCount = (data_size >> 1U);

+        }

+      }

+      else if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_WORD)

+      {

+        if (((data_size % 4U) != 0U) || ((hqspi->Init.FifoThreshold % 4U) != 0U))

+        {

+          /* The number of data or the fifo threshold is not aligned on word

+          => no transfer possible with DMA peripheral access configured as word */

+          hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;

+          status = HAL_ERROR;

+

+          /* Process unlocked */

+          __HAL_UNLOCK(hqspi);

+        }

+        else

+        {

+          hqspi->TxXferCount = (data_size >> 2U);

+        }

+      }

+      else

+      {

+        /* Nothing to do */

+      }

+

+      if (status == HAL_OK)

+      {

+        /* Update state */

+        hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_TX;

+

+        /* Clear interrupt */

+        __HAL_QSPI_CLEAR_FLAG(hqspi, (QSPI_FLAG_TE | QSPI_FLAG_TC));

+

+        /* Configure size and pointer of the handle */

+        hqspi->TxXferSize = hqspi->TxXferCount;

+        hqspi->pTxBuffPtr = pData;

+

+        /* Configure QSPI: CCR register with functional mode as indirect write */

+        MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE);

+

+        /* Set the QSPI DMA transfer complete callback */

+        hqspi->hdma->XferCpltCallback = QSPI_DMATxCplt;

+

+        /* Set the QSPI DMA Half transfer complete callback */

+        hqspi->hdma->XferHalfCpltCallback = QSPI_DMATxHalfCplt;

+

+        /* Set the DMA error callback */

+        hqspi->hdma->XferErrorCallback = QSPI_DMAError;

+

+        /* Clear the DMA abort callback */

+        hqspi->hdma->XferAbortCallback = NULL;

+

+        /* Configure the direction of the DMA */

+        hqspi->hdma->Init.Direction = DMA_MEMORY_TO_PERIPH;

+        MODIFY_REG(hqspi->hdma->Instance->CCR, DMA_CCR_DIR, hqspi->hdma->Init.Direction);

+

+        /* Enable the QSPI transmit DMA Channel */

+        if (HAL_DMA_Start_IT(hqspi->hdma, (uint32_t)pData, (uint32_t)&hqspi->Instance->DR, hqspi->TxXferSize) == HAL_OK)

+        {

+          /* Process unlocked */

+          __HAL_UNLOCK(hqspi);

+          

+          /* Enable the QSPI transfer error Interrupt */

+          __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE);

+          

+          /* Enable the DMA transfer by setting the DMAEN bit in the QSPI CR register */

+          SET_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);

+        }

+        else

+        {

+          status = HAL_ERROR;

+          hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;

+          hqspi->State = HAL_QSPI_STATE_READY;

+

+          /* Process unlocked */

+          __HAL_UNLOCK(hqspi);

+        }

+     }

+    }

+    else

+    {

+      hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;

+      status = HAL_ERROR;

+

+      /* Process unlocked */

+      __HAL_UNLOCK(hqspi);

+    }

+  }

+  else

+  {

+    status = HAL_BUSY;

+

+    /* Process unlocked */

+    __HAL_UNLOCK(hqspi);

+  }

+

+  return status;

+}

+

+/**

+  * @brief  Receive an amount of data in non-blocking mode with DMA.

+  * @param  hqspi : QSPI handle

+  * @param  pData : pointer to data buffer.

+  * @note   This function is used only in Indirect Read Mode

+  * @note   If DMA peripheral access is configured as halfword, the number

+  *         of data and the fifo threshold should be aligned on halfword

+  * @note   If DMA peripheral access is configured as word, the number

+  *         of data and the fifo threshold should be aligned on word

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_QSPI_Receive_DMA(QSPI_HandleTypeDef *hqspi, uint8_t *pData)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+  uint32_t addr_reg = READ_REG(hqspi->Instance->AR);

+  uint32_t data_size = (READ_REG(hqspi->Instance->DLR) + 1U);

+

+  /* Process locked */

+  __HAL_LOCK(hqspi);

+

+  if(hqspi->State == HAL_QSPI_STATE_READY)

+  {

+    /* Clear the error code */

+    hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;

+

+    if(pData != NULL )

+    {

+      /* Configure counters of the handle */

+      if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_BYTE)

+      {

+        hqspi->RxXferCount = data_size;

+      }

+      else if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_HALFWORD)

+      {

+        if (((data_size % 2U) != 0U) || ((hqspi->Init.FifoThreshold % 2U) != 0U))

+        {

+          /* The number of data or the fifo threshold is not aligned on halfword

+             => no transfer possible with DMA peripheral access configured as halfword */

+          hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;

+          status = HAL_ERROR;

+

+          /* Process unlocked */

+          __HAL_UNLOCK(hqspi);

+        }

+        else

+        {

+          hqspi->RxXferCount = (data_size >> 1U);

+        }

+      }

+      else if (hqspi->hdma->Init.PeriphDataAlignment == DMA_PDATAALIGN_WORD)

+      {

+        if (((data_size % 4U) != 0U) || ((hqspi->Init.FifoThreshold % 4U) != 0U))

+        {

+          /* The number of data or the fifo threshold is not aligned on word

+             => no transfer possible with DMA peripheral access configured as word */

+          hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;

+          status = HAL_ERROR;

+

+          /* Process unlocked */

+          __HAL_UNLOCK(hqspi);

+        }

+        else

+        {

+          hqspi->RxXferCount = (data_size >> 2U);

+        }

+      }

+      else

+      {

+        /* Nothing to do */

+      }

+

+      if (status == HAL_OK)

+      {

+        /* Update state */

+        hqspi->State = HAL_QSPI_STATE_BUSY_INDIRECT_RX;

+

+        /* Clear interrupt */

+        __HAL_QSPI_CLEAR_FLAG(hqspi, (QSPI_FLAG_TE | QSPI_FLAG_TC));

+

+        /* Configure size and pointer of the handle */

+        hqspi->RxXferSize = hqspi->RxXferCount;

+        hqspi->pRxBuffPtr = pData;

+

+        /* Set the QSPI DMA transfer complete callback */

+        hqspi->hdma->XferCpltCallback = QSPI_DMARxCplt;

+

+        /* Set the QSPI DMA Half transfer complete callback */

+        hqspi->hdma->XferHalfCpltCallback = QSPI_DMARxHalfCplt;

+

+        /* Set the DMA error callback */

+        hqspi->hdma->XferErrorCallback = QSPI_DMAError;

+

+        /* Clear the DMA abort callback */

+        hqspi->hdma->XferAbortCallback = NULL;

+

+        /* Configure the direction of the DMA */

+        hqspi->hdma->Init.Direction = DMA_PERIPH_TO_MEMORY;

+        MODIFY_REG(hqspi->hdma->Instance->CCR, DMA_CCR_DIR, hqspi->hdma->Init.Direction);

+

+        /* Enable the DMA Channel */

+        if (HAL_DMA_Start_IT(hqspi->hdma, (uint32_t)&hqspi->Instance->DR, (uint32_t)pData, hqspi->RxXferSize) == HAL_OK)

+        {

+          /* Configure QSPI: CCR register with functional as indirect read */

+          MODIFY_REG(hqspi->Instance->CCR, QUADSPI_CCR_FMODE, QSPI_FUNCTIONAL_MODE_INDIRECT_READ);

+

+          /* Start the transfer by re-writing the address in AR register */

+          WRITE_REG(hqspi->Instance->AR, addr_reg);

+

+          /* Process unlocked */

+          __HAL_UNLOCK(hqspi);

+          

+          /* Enable the QSPI transfer error Interrupt */

+          __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TE);

+          

+          /* Enable the DMA transfer by setting the DMAEN bit in the QSPI CR register */

+          SET_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);

+        }

+        else

+        {

+          status = HAL_ERROR;

+          hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;

+          hqspi->State = HAL_QSPI_STATE_READY;

+

+          /* Process unlocked */

+          __HAL_UNLOCK(hqspi);

+        }

+      }

+    }

+    else

+    {

+      hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_PARAM;

+      status = HAL_ERROR;

+

+      /* Process unlocked */

+      __HAL_UNLOCK(hqspi);

+    }

+  }

+  else

+  {

+    status = HAL_BUSY;

+

+    /* Process unlocked */

+    __HAL_UNLOCK(hqspi);

+  }

+

+  return status;

+}

+

+/**

+  * @brief  Configure the QSPI Automatic Polling Mode in blocking mode.

+  * @param  hqspi : QSPI handle

+  * @param  cmd : structure that contains the command configuration information.

+  * @param  cfg : structure that contains the polling configuration information.

+  * @param  Timeout : Timeout duration

+  * @note   This function is used only in Automatic Polling Mode

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_QSPI_AutoPolling(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_AutoPollingTypeDef *cfg, uint32_t Timeout)

+{

+  HAL_StatusTypeDef status;

+  uint32_t tickstart = HAL_GetTick();

+

+  /* Check the parameters */

+  assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));

+  if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)

+  {

+    assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));

+  }

+

+  assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));

+  if (cmd->AddressMode != QSPI_ADDRESS_NONE)

+  {

+    assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));

+  }

+

+  assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));

+  if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)

+  {

+    assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));

+  }

+

+  assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));

+  assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));

+

+  assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));

+  assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));

+  assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));

+

+  assert_param(IS_QSPI_INTERVAL(cfg->Interval));

+  assert_param(IS_QSPI_STATUS_BYTES_SIZE(cfg->StatusBytesSize));

+  assert_param(IS_QSPI_MATCH_MODE(cfg->MatchMode));

+

+  /* Process locked */

+  __HAL_LOCK(hqspi);

+

+  if(hqspi->State == HAL_QSPI_STATE_READY)

+  {

+    hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;

+

+    /* Update state */

+    hqspi->State = HAL_QSPI_STATE_BUSY_AUTO_POLLING;

+

+    /* Wait till BUSY flag reset */

+    status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, Timeout);

+

+    if (status == HAL_OK)

+    {

+      /* Configure QSPI: PSMAR register with the status match value */

+      WRITE_REG(hqspi->Instance->PSMAR, cfg->Match);

+

+      /* Configure QSPI: PSMKR register with the status mask value */

+      WRITE_REG(hqspi->Instance->PSMKR, cfg->Mask);

+

+      /* Configure QSPI: PIR register with the interval value */

+      WRITE_REG(hqspi->Instance->PIR, cfg->Interval);

+

+      /* Configure QSPI: CR register with Match mode and Automatic stop enabled

+      (otherwise there will be an infinite loop in blocking mode) */

+      MODIFY_REG(hqspi->Instance->CR, (QUADSPI_CR_PMM | QUADSPI_CR_APMS),

+               (cfg->MatchMode | QSPI_AUTOMATIC_STOP_ENABLE));

+

+      /* Call the configuration function */

+      cmd->NbData = cfg->StatusBytesSize;

+      QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_AUTO_POLLING);

+

+      /* Wait until SM flag is set to go back in idle state */

+      status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_SM, SET, tickstart, Timeout);

+

+      if (status == HAL_OK)

+      {

+        __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_SM);

+

+        /* Update state */

+        hqspi->State = HAL_QSPI_STATE_READY;

+      }

+    }

+  }

+  else

+  {

+    status = HAL_BUSY;

+  }

+

+  /* Process unlocked */

+  __HAL_UNLOCK(hqspi);

+

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  Configure the QSPI Automatic Polling Mode in non-blocking mode.

+  * @param  hqspi : QSPI handle

+  * @param  cmd : structure that contains the command configuration information.

+  * @param  cfg : structure that contains the polling configuration information.

+  * @note   This function is used only in Automatic Polling Mode

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_QSPI_AutoPolling_IT(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_AutoPollingTypeDef *cfg)

+{

+  HAL_StatusTypeDef status;

+  uint32_t tickstart = HAL_GetTick();

+

+  /* Check the parameters */

+  assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));

+  if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)

+  {

+    assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));

+  }

+

+  assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));

+  if (cmd->AddressMode != QSPI_ADDRESS_NONE)

+  {

+    assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));

+  }

+

+  assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));

+  if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)

+  {

+    assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));

+  }

+

+  assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));

+  assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));

+

+  assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));

+  assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));

+  assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));

+

+  assert_param(IS_QSPI_INTERVAL(cfg->Interval));

+  assert_param(IS_QSPI_STATUS_BYTES_SIZE(cfg->StatusBytesSize));

+  assert_param(IS_QSPI_MATCH_MODE(cfg->MatchMode));

+  assert_param(IS_QSPI_AUTOMATIC_STOP(cfg->AutomaticStop));

+

+  /* Process locked */

+  __HAL_LOCK(hqspi);

+

+  if(hqspi->State == HAL_QSPI_STATE_READY)

+  {

+    hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;

+

+    /* Update state */

+    hqspi->State = HAL_QSPI_STATE_BUSY_AUTO_POLLING;

+

+    /* Wait till BUSY flag reset */

+    status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);

+

+    if (status == HAL_OK)

+    {

+      /* Configure QSPI: PSMAR register with the status match value */

+      WRITE_REG(hqspi->Instance->PSMAR, cfg->Match);

+

+      /* Configure QSPI: PSMKR register with the status mask value */

+      WRITE_REG(hqspi->Instance->PSMKR, cfg->Mask);

+

+      /* Configure QSPI: PIR register with the interval value */

+      WRITE_REG(hqspi->Instance->PIR, cfg->Interval);

+

+      /* Configure QSPI: CR register with Match mode and Automatic stop mode */

+      MODIFY_REG(hqspi->Instance->CR, (QUADSPI_CR_PMM | QUADSPI_CR_APMS),

+               (cfg->MatchMode | cfg->AutomaticStop));

+

+      /* Clear interrupt */

+      __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TE | QSPI_FLAG_SM);

+

+      /* Call the configuration function */

+      cmd->NbData = cfg->StatusBytesSize;

+      QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_AUTO_POLLING);

+

+      /* Process unlocked */

+      __HAL_UNLOCK(hqspi);

+

+      /* Enable the QSPI Transfer Error and status match Interrupt */

+      __HAL_QSPI_ENABLE_IT(hqspi, (QSPI_IT_SM | QSPI_IT_TE));

+

+    }

+    else

+    {

+      /* Process unlocked */

+      __HAL_UNLOCK(hqspi);

+    }

+  }

+  else

+  {

+    status = HAL_BUSY;

+

+    /* Process unlocked */

+    __HAL_UNLOCK(hqspi);

+  }

+

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  Configure the Memory Mapped mode.

+  * @param  hqspi : QSPI handle

+  * @param  cmd : structure that contains the command configuration information.

+  * @param  cfg : structure that contains the memory mapped configuration information.

+  * @note   This function is used only in Memory mapped Mode

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_QSPI_MemoryMapped(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_MemoryMappedTypeDef *cfg)

+{

+  HAL_StatusTypeDef status;

+  uint32_t tickstart = HAL_GetTick();

+

+  /* Check the parameters */

+  assert_param(IS_QSPI_INSTRUCTION_MODE(cmd->InstructionMode));

+  if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)

+  {

+  assert_param(IS_QSPI_INSTRUCTION(cmd->Instruction));

+  }

+

+  assert_param(IS_QSPI_ADDRESS_MODE(cmd->AddressMode));

+  if (cmd->AddressMode != QSPI_ADDRESS_NONE)

+  {

+    assert_param(IS_QSPI_ADDRESS_SIZE(cmd->AddressSize));

+  }

+

+  assert_param(IS_QSPI_ALTERNATE_BYTES_MODE(cmd->AlternateByteMode));

+  if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)

+  {

+    assert_param(IS_QSPI_ALTERNATE_BYTES_SIZE(cmd->AlternateBytesSize));

+  }

+

+  assert_param(IS_QSPI_DUMMY_CYCLES(cmd->DummyCycles));

+  assert_param(IS_QSPI_DATA_MODE(cmd->DataMode));

+

+  assert_param(IS_QSPI_DDR_MODE(cmd->DdrMode));

+  assert_param(IS_QSPI_DDR_HHC(cmd->DdrHoldHalfCycle));

+  assert_param(IS_QSPI_SIOO_MODE(cmd->SIOOMode));

+

+  assert_param(IS_QSPI_TIMEOUT_ACTIVATION(cfg->TimeOutActivation));

+

+  /* Process locked */

+  __HAL_LOCK(hqspi);

+

+  if(hqspi->State == HAL_QSPI_STATE_READY)

+  {

+    hqspi->ErrorCode = HAL_QSPI_ERROR_NONE;

+

+    /* Update state */

+    hqspi->State = HAL_QSPI_STATE_BUSY_MEM_MAPPED;

+

+    /* Wait till BUSY flag reset */

+    status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);

+

+    if (status == HAL_OK)

+    {

+      /* Configure QSPI: CR register with timeout counter enable */

+    MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_TCEN, cfg->TimeOutActivation);

+

+    if (cfg->TimeOutActivation == QSPI_TIMEOUT_COUNTER_ENABLE)

+      {

+        assert_param(IS_QSPI_TIMEOUT_PERIOD(cfg->TimeOutPeriod));

+

+        /* Configure QSPI: LPTR register with the low-power timeout value */

+        WRITE_REG(hqspi->Instance->LPTR, cfg->TimeOutPeriod);

+

+        /* Clear interrupt */

+        __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TO);

+

+        /* Enable the QSPI TimeOut Interrupt */

+        __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TO);

+      }

+

+      /* Call the configuration function */

+      QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED);

+    }

+  }

+  else

+  {

+    status = HAL_BUSY;

+  }

+

+  /* Process unlocked */

+  __HAL_UNLOCK(hqspi);

+

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  Transfer Error callback.

+  * @param  hqspi : QSPI handle

+  * @retval None

+  */

+__weak void HAL_QSPI_ErrorCallback(QSPI_HandleTypeDef *hqspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hqspi);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_QSPI_ErrorCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Abort completed callback.

+  * @param  hqspi : QSPI handle

+  * @retval None

+  */

+__weak void HAL_QSPI_AbortCpltCallback(QSPI_HandleTypeDef *hqspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hqspi);

+

+  /* NOTE: This function should not be modified, when the callback is needed,

+           the HAL_QSPI_AbortCpltCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Command completed callback.

+  * @param  hqspi : QSPI handle

+  * @retval None

+  */

+__weak void HAL_QSPI_CmdCpltCallback(QSPI_HandleTypeDef *hqspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hqspi);

+

+  /* NOTE: This function should not be modified, when the callback is needed,

+           the HAL_QSPI_CmdCpltCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Rx Transfer completed callback.

+  * @param  hqspi : QSPI handle

+  * @retval None

+  */

+__weak void HAL_QSPI_RxCpltCallback(QSPI_HandleTypeDef *hqspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hqspi);

+

+  /* NOTE: This function should not be modified, when the callback is needed,

+           the HAL_QSPI_RxCpltCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Tx Transfer completed callback.

+  * @param  hqspi : QSPI handle

+  * @retval None

+  */

+__weak void HAL_QSPI_TxCpltCallback(QSPI_HandleTypeDef *hqspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hqspi);

+

+  /* NOTE: This function should not be modified, when the callback is needed,

+           the HAL_QSPI_TxCpltCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Rx Half Transfer completed callback.

+  * @param  hqspi : QSPI handle

+  * @retval None

+  */

+__weak void HAL_QSPI_RxHalfCpltCallback(QSPI_HandleTypeDef *hqspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hqspi);

+

+  /* NOTE: This function should not be modified, when the callback is needed,

+           the HAL_QSPI_RxHalfCpltCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Tx Half Transfer completed callback.

+  * @param  hqspi : QSPI handle

+  * @retval None

+  */

+__weak void HAL_QSPI_TxHalfCpltCallback(QSPI_HandleTypeDef *hqspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hqspi);

+

+  /* NOTE: This function should not be modified, when the callback is needed,

+           the HAL_QSPI_TxHalfCpltCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  FIFO Threshold callback.

+  * @param  hqspi : QSPI handle

+  * @retval None

+  */

+__weak void HAL_QSPI_FifoThresholdCallback(QSPI_HandleTypeDef *hqspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hqspi);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_QSPI_FIFOThresholdCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Status Match callback.

+  * @param  hqspi : QSPI handle

+  * @retval None

+  */

+__weak void HAL_QSPI_StatusMatchCallback(QSPI_HandleTypeDef *hqspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hqspi);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_QSPI_StatusMatchCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Timeout callback.

+  * @param  hqspi : QSPI handle

+  * @retval None

+  */

+__weak void HAL_QSPI_TimeOutCallback(QSPI_HandleTypeDef *hqspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hqspi);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_QSPI_TimeOutCallback could be implemented in the user file

+   */

+}

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+/**

+  * @brief  Register a User QSPI Callback

+  *         To be used instead of the weak (surcharged) predefined callback

+  * @param hqspi : QSPI handle

+  * @param CallbackId : ID of the callback to be registered

+  *        This parameter can be one of the following values:

+  *          @arg @ref HAL_QSPI_ERROR_CB_ID          QSPI Error Callback ID

+  *          @arg @ref HAL_QSPI_ABORT_CB_ID          QSPI Abort Callback ID

+  *          @arg @ref HAL_QSPI_FIFO_THRESHOLD_CB_ID QSPI FIFO Threshold Callback ID

+  *          @arg @ref HAL_QSPI_CMD_CPLT_CB_ID       QSPI Command Complete Callback ID

+  *          @arg @ref HAL_QSPI_RX_CPLT_CB_ID        QSPI Rx Complete Callback ID

+  *          @arg @ref HAL_QSPI_TX_CPLT_CB_ID        QSPI Tx Complete Callback ID

+  *          @arg @ref HAL_QSPI_RX_HALF_CPLT_CB_ID   QSPI Rx Half Complete Callback ID

+  *          @arg @ref HAL_QSPI_TX_HALF_CPLT_CB_ID   QSPI Tx Half Complete Callback ID

+  *          @arg @ref HAL_QSPI_STATUS_MATCH_CB_ID   QSPI Status Match Callback ID

+  *          @arg @ref HAL_QSPI_TIMEOUT_CB_ID        QSPI Timeout Callback ID

+  *          @arg @ref HAL_QSPI_MSP_INIT_CB_ID       QSPI MspInit callback ID

+  *          @arg @ref HAL_QSPI_MSP_DEINIT_CB_ID     QSPI MspDeInit callback ID

+  * @param pCallback : pointer to the Callback function

+  * @retval status

+  */

+HAL_StatusTypeDef HAL_QSPI_RegisterCallback (QSPI_HandleTypeDef *hqspi, HAL_QSPI_CallbackIDTypeDef CallbackId, pQSPI_CallbackTypeDef pCallback)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  if(pCallback == NULL)

+  {

+    /* Update the error code */

+    hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;

+    return HAL_ERROR;

+  }

+

+  /* Process locked */

+  __HAL_LOCK(hqspi);

+

+  if(hqspi->State == HAL_QSPI_STATE_READY)

+  {

+    switch (CallbackId)

+    {

+    case  HAL_QSPI_ERROR_CB_ID :

+      hqspi->ErrorCallback = pCallback;

+      break;

+    case HAL_QSPI_ABORT_CB_ID :

+      hqspi->AbortCpltCallback = pCallback;

+      break;

+    case HAL_QSPI_FIFO_THRESHOLD_CB_ID :

+      hqspi->FifoThresholdCallback = pCallback;

+      break;

+    case HAL_QSPI_CMD_CPLT_CB_ID :

+      hqspi->CmdCpltCallback = pCallback;

+      break;

+    case HAL_QSPI_RX_CPLT_CB_ID :

+      hqspi->RxCpltCallback = pCallback;

+      break;

+    case HAL_QSPI_TX_CPLT_CB_ID :

+      hqspi->TxCpltCallback = pCallback;

+      break;

+    case HAL_QSPI_RX_HALF_CPLT_CB_ID :

+      hqspi->RxHalfCpltCallback = pCallback;

+      break;

+    case HAL_QSPI_TX_HALF_CPLT_CB_ID :

+      hqspi->TxHalfCpltCallback = pCallback;

+      break;

+    case HAL_QSPI_STATUS_MATCH_CB_ID :

+      hqspi->StatusMatchCallback = pCallback;

+      break;

+    case HAL_QSPI_TIMEOUT_CB_ID :

+      hqspi->TimeOutCallback = pCallback;

+      break;

+    case HAL_QSPI_MSP_INIT_CB_ID :

+      hqspi->MspInitCallback = pCallback;

+      break;

+    case HAL_QSPI_MSP_DEINIT_CB_ID :

+      hqspi->MspDeInitCallback = pCallback;

+      break;

+    default :

+      /* Update the error code */

+      hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;

+      /* update return status */

+      status =  HAL_ERROR;

+      break;

+    }

+  }

+  else if (hqspi->State == HAL_QSPI_STATE_RESET)

+  {

+    switch (CallbackId)

+    {

+    case HAL_QSPI_MSP_INIT_CB_ID :

+      hqspi->MspInitCallback = pCallback;

+      break;

+    case HAL_QSPI_MSP_DEINIT_CB_ID :

+      hqspi->MspDeInitCallback = pCallback;

+      break;

+    default :

+      /* Update the error code */

+      hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;

+      /* update return status */

+      status =  HAL_ERROR;

+      break;

+    }

+  }

+  else

+  {

+    /* Update the error code */

+    hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;

+    /* update return status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hqspi);

+  return status;

+}

+

+/**

+  * @brief  Unregister a User QSPI Callback

+  *         QSPI Callback is redirected to the weak (surcharged) predefined callback

+  * @param hqspi : QSPI handle

+  * @param CallbackId : ID of the callback to be unregistered

+  *        This parameter can be one of the following values:

+  *          @arg @ref HAL_QSPI_ERROR_CB_ID          QSPI Error Callback ID

+  *          @arg @ref HAL_QSPI_ABORT_CB_ID          QSPI Abort Callback ID

+  *          @arg @ref HAL_QSPI_FIFO_THRESHOLD_CB_ID QSPI FIFO Threshold Callback ID

+  *          @arg @ref HAL_QSPI_CMD_CPLT_CB_ID       QSPI Command Complete Callback ID

+  *          @arg @ref HAL_QSPI_RX_CPLT_CB_ID        QSPI Rx Complete Callback ID

+  *          @arg @ref HAL_QSPI_TX_CPLT_CB_ID        QSPI Tx Complete Callback ID

+  *          @arg @ref HAL_QSPI_RX_HALF_CPLT_CB_ID   QSPI Rx Half Complete Callback ID

+  *          @arg @ref HAL_QSPI_TX_HALF_CPLT_CB_ID   QSPI Tx Half Complete Callback ID

+  *          @arg @ref HAL_QSPI_STATUS_MATCH_CB_ID   QSPI Status Match Callback ID

+  *          @arg @ref HAL_QSPI_TIMEOUT_CB_ID        QSPI Timeout Callback ID

+  *          @arg @ref HAL_QSPI_MSP_INIT_CB_ID       QSPI MspInit callback ID

+  *          @arg @ref HAL_QSPI_MSP_DEINIT_CB_ID     QSPI MspDeInit callback ID

+  * @retval status

+  */

+HAL_StatusTypeDef HAL_QSPI_UnRegisterCallback (QSPI_HandleTypeDef *hqspi, HAL_QSPI_CallbackIDTypeDef CallbackId)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Process locked */

+  __HAL_LOCK(hqspi);

+

+  if(hqspi->State == HAL_QSPI_STATE_READY)

+  {

+    switch (CallbackId)

+    {

+    case  HAL_QSPI_ERROR_CB_ID :

+      hqspi->ErrorCallback = HAL_QSPI_ErrorCallback;

+      break;

+    case HAL_QSPI_ABORT_CB_ID :

+      hqspi->AbortCpltCallback = HAL_QSPI_AbortCpltCallback;

+      break;

+    case HAL_QSPI_FIFO_THRESHOLD_CB_ID :

+      hqspi->FifoThresholdCallback = HAL_QSPI_FifoThresholdCallback;

+      break;

+    case HAL_QSPI_CMD_CPLT_CB_ID :

+      hqspi->CmdCpltCallback = HAL_QSPI_CmdCpltCallback;

+      break;

+    case HAL_QSPI_RX_CPLT_CB_ID :

+      hqspi->RxCpltCallback = HAL_QSPI_RxCpltCallback;

+      break;

+    case HAL_QSPI_TX_CPLT_CB_ID :

+      hqspi->TxCpltCallback = HAL_QSPI_TxCpltCallback;

+      break;

+    case HAL_QSPI_RX_HALF_CPLT_CB_ID :

+      hqspi->RxHalfCpltCallback = HAL_QSPI_RxHalfCpltCallback;

+      break;

+    case HAL_QSPI_TX_HALF_CPLT_CB_ID :

+      hqspi->TxHalfCpltCallback = HAL_QSPI_TxHalfCpltCallback;

+      break;

+    case HAL_QSPI_STATUS_MATCH_CB_ID :

+      hqspi->StatusMatchCallback = HAL_QSPI_StatusMatchCallback;

+      break;

+    case HAL_QSPI_TIMEOUT_CB_ID :

+      hqspi->TimeOutCallback = HAL_QSPI_TimeOutCallback;

+      break;

+    case HAL_QSPI_MSP_INIT_CB_ID :

+      hqspi->MspInitCallback = HAL_QSPI_MspInit;

+      break;

+    case HAL_QSPI_MSP_DEINIT_CB_ID :

+      hqspi->MspDeInitCallback = HAL_QSPI_MspDeInit;

+      break;

+    default :

+      /* Update the error code */

+      hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;

+      /* update return status */

+      status =  HAL_ERROR;

+      break;

+    }

+  }

+  else if (hqspi->State == HAL_QSPI_STATE_RESET)

+  {

+    switch (CallbackId)

+    {

+    case HAL_QSPI_MSP_INIT_CB_ID :

+      hqspi->MspInitCallback = HAL_QSPI_MspInit;

+      break;

+    case HAL_QSPI_MSP_DEINIT_CB_ID :

+      hqspi->MspDeInitCallback = HAL_QSPI_MspDeInit;

+      break;

+    default :

+      /* Update the error code */

+      hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;

+      /* update return status */

+      status =  HAL_ERROR;

+      break;

+    }

+  }

+  else

+  {

+    /* Update the error code */

+    hqspi->ErrorCode |= HAL_QSPI_ERROR_INVALID_CALLBACK;

+    /* update return status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hqspi);

+  return status;

+}

+#endif

+

+/**

+  * @}

+  */

+

+/** @defgroup QSPI_Exported_Functions_Group3 Peripheral Control and State functions

+  *  @brief   QSPI control and State functions

+  *

+@verbatim

+ ===============================================================================

+                  ##### Peripheral Control and State functions #####

+ ===============================================================================

+    [..]

+    This subsection provides a set of functions allowing to :

+      (+) Check in run-time the state of the driver.

+      (+) Check the error code set during last operation.

+      (+) Abort any operation.

+

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Return the QSPI handle state.

+  * @param  hqspi : QSPI handle

+  * @retval HAL state

+  */

+HAL_QSPI_StateTypeDef HAL_QSPI_GetState(QSPI_HandleTypeDef *hqspi)

+{

+  /* Return QSPI handle state */

+  return hqspi->State;

+}

+

+/**

+* @brief  Return the QSPI error code.

+* @param  hqspi : QSPI handle

+* @retval QSPI Error Code

+*/

+uint32_t HAL_QSPI_GetError(QSPI_HandleTypeDef *hqspi)

+{

+  return hqspi->ErrorCode;

+}

+

+/**

+* @brief  Abort the current transmission.

+* @param  hqspi : QSPI handle

+* @retval HAL status

+*/

+HAL_StatusTypeDef HAL_QSPI_Abort(QSPI_HandleTypeDef *hqspi)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+  uint32_t tickstart = HAL_GetTick();

+

+  /* Check if the state is in one of the busy states */

+  if (((uint32_t)hqspi->State & 0x2U) != 0U)

+  {

+    /* Process unlocked */

+    __HAL_UNLOCK(hqspi);

+

+    if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN) != 0U)

+    {

+      /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */

+      CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);

+

+      /* Abort DMA channel */

+      status = HAL_DMA_Abort(hqspi->hdma);

+      if(status != HAL_OK)

+      {

+        hqspi->ErrorCode |= HAL_QSPI_ERROR_DMA;

+      }

+    }

+

+    /* Configure QSPI: CR register with Abort request */

+    SET_BIT(hqspi->Instance->CR, QUADSPI_CR_ABORT);

+

+    /* Wait until TC flag is set to go back in idle state */

+    status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_TC, SET, tickstart, hqspi->Timeout);

+

+    if (status == HAL_OK)

+    {

+      __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);

+

+      /* Wait until BUSY flag is reset */

+      status = QSPI_WaitFlagStateUntilTimeout(hqspi, QSPI_FLAG_BUSY, RESET, tickstart, hqspi->Timeout);

+    }

+

+    if (status == HAL_OK)

+    {

+      /* Reset functional mode configuration to indirect write mode by default */

+      CLEAR_BIT(hqspi->Instance->CCR, QUADSPI_CCR_FMODE);

+

+      /* Update state */

+      hqspi->State = HAL_QSPI_STATE_READY;

+    }

+  }

+

+  return status;

+}

+

+/**

+* @brief  Abort the current transmission (non-blocking function)

+* @param  hqspi : QSPI handle

+* @retval HAL status

+*/

+HAL_StatusTypeDef HAL_QSPI_Abort_IT(QSPI_HandleTypeDef *hqspi)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check if the state is in one of the busy states */

+  if (((uint32_t)hqspi->State & 0x2U) != 0U)

+  {

+    /* Process unlocked */

+    __HAL_UNLOCK(hqspi);

+

+    /* Update QSPI state */

+    hqspi->State = HAL_QSPI_STATE_ABORT;

+

+    /* Disable all interrupts */

+    __HAL_QSPI_DISABLE_IT(hqspi, (QSPI_IT_TO | QSPI_IT_SM | QSPI_IT_FT | QSPI_IT_TC | QSPI_IT_TE));

+

+    if ((hqspi->Instance->CR & QUADSPI_CR_DMAEN) != 0U)

+    {

+      /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */

+      CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);

+

+      /* Abort DMA channel */

+      hqspi->hdma->XferAbortCallback = QSPI_DMAAbortCplt;

+      if (HAL_DMA_Abort_IT(hqspi->hdma) != HAL_OK)

+      {

+        /* Change state of QSPI */

+        hqspi->State = HAL_QSPI_STATE_READY;

+        

+        /* Abort Complete callback */

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+        hqspi->AbortCpltCallback(hqspi);

+#else

+        HAL_QSPI_AbortCpltCallback(hqspi);

+#endif

+      }

+    }

+    else

+    {

+      /* Clear interrupt */

+      __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);

+

+      /* Enable the QSPI Transfer Complete Interrupt */

+      __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);

+

+      /* Configure QSPI: CR register with Abort request */

+      SET_BIT(hqspi->Instance->CR, QUADSPI_CR_ABORT);

+    }

+  }

+  return status;

+}

+

+/** @brief Set QSPI timeout.

+  * @param  hqspi : QSPI handle.

+  * @param  Timeout : Timeout for the QSPI memory access.

+  * @retval None

+  */

+void HAL_QSPI_SetTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Timeout)

+{

+  hqspi->Timeout = Timeout;

+}

+

+/** @brief Set QSPI Fifo threshold.

+  * @param  hqspi : QSPI handle.

+  * @param  Threshold : Threshold of the Fifo (value between 1 and 16).

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_QSPI_SetFifoThreshold(QSPI_HandleTypeDef *hqspi, uint32_t Threshold)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Process locked */

+  __HAL_LOCK(hqspi);

+

+  if(hqspi->State == HAL_QSPI_STATE_READY)

+  {

+    /* Synchronize init structure with new FIFO threshold value */

+    hqspi->Init.FifoThreshold = Threshold;

+

+    /* Configure QSPI FIFO Threshold */

+    MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_FTHRES,

+               ((hqspi->Init.FifoThreshold - 1U) << QUADSPI_CR_FTHRES_Pos));

+  }

+  else

+  {

+    status = HAL_BUSY;

+  }

+

+  /* Process unlocked */

+  __HAL_UNLOCK(hqspi);

+

+  /* Return function status */

+  return status;

+}

+

+/** @brief Get QSPI Fifo threshold.

+  * @param  hqspi : QSPI handle.

+  * @retval Fifo threshold (value between 1 and 16)

+  */

+uint32_t HAL_QSPI_GetFifoThreshold(QSPI_HandleTypeDef *hqspi)

+{

+  return ((READ_BIT(hqspi->Instance->CR, QUADSPI_CR_FTHRES) >> QUADSPI_CR_FTHRES_Pos) + 1U);

+}

+

+#if defined(QUADSPI_CR_DFM)

+/** @brief  Set FlashID.

+  * @param  hqspi : QSPI handle.

+  * @param  FlashID : Index of the flash memory to be accessed.

+  *                   This parameter can be a value of @ref QSPI_Flash_Select.

+  * @note   The FlashID is ignored when dual flash mode is enabled.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_QSPI_SetFlashID(QSPI_HandleTypeDef *hqspi, uint32_t FlashID)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Check the parameter */

+  assert_param(IS_QSPI_FLASH_ID(FlashID));

+

+  /* Process locked */

+  __HAL_LOCK(hqspi);

+

+  if(hqspi->State == HAL_QSPI_STATE_READY)

+  {

+    /* Synchronize init structure with new FlashID value */

+    hqspi->Init.FlashID = FlashID;

+

+    /* Configure QSPI FlashID */

+    MODIFY_REG(hqspi->Instance->CR, QUADSPI_CR_FSEL, FlashID);

+  }

+  else

+  {

+    status = HAL_BUSY;

+  }

+

+  /* Process unlocked */

+  __HAL_UNLOCK(hqspi);

+

+  /* Return function status */

+  return status;

+}

+

+#endif

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/** @defgroup QSPI_Private_Functions QSPI Private Functions

+  * @{

+  */

+

+/**

+  * @brief  DMA QSPI receive process complete callback.

+  * @param  hdma : DMA handle

+  * @retval None

+  */

+static void QSPI_DMARxCplt(DMA_HandleTypeDef *hdma)

+{

+  QSPI_HandleTypeDef* hqspi = (QSPI_HandleTypeDef*)(hdma->Parent);

+  hqspi->RxXferCount = 0U;

+

+  /* Enable the QSPI transfer complete Interrupt */

+  __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);

+}

+

+/**

+  * @brief  DMA QSPI transmit process complete callback.

+  * @param  hdma : DMA handle

+  * @retval None

+  */

+static void QSPI_DMATxCplt(DMA_HandleTypeDef *hdma)

+{

+  QSPI_HandleTypeDef* hqspi = (QSPI_HandleTypeDef*)(hdma->Parent);

+  hqspi->TxXferCount = 0U;

+

+  /* Enable the QSPI transfer complete Interrupt */

+  __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);

+}

+

+/**

+  * @brief  DMA QSPI receive process half complete callback.

+  * @param  hdma : DMA handle

+  * @retval None

+  */

+static void QSPI_DMARxHalfCplt(DMA_HandleTypeDef *hdma)

+{

+  QSPI_HandleTypeDef* hqspi = (QSPI_HandleTypeDef*)(hdma->Parent);

+

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+  hqspi->RxHalfCpltCallback(hqspi);

+#else

+  HAL_QSPI_RxHalfCpltCallback(hqspi);

+#endif

+}

+

+/**

+  * @brief  DMA QSPI transmit process half complete callback.

+  * @param  hdma : DMA handle

+  * @retval None

+  */

+static void QSPI_DMATxHalfCplt(DMA_HandleTypeDef *hdma)

+{

+  QSPI_HandleTypeDef* hqspi = (QSPI_HandleTypeDef*)(hdma->Parent);

+

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+  hqspi->TxHalfCpltCallback(hqspi);

+#else

+  HAL_QSPI_TxHalfCpltCallback(hqspi);

+#endif

+}

+

+/**

+  * @brief  DMA QSPI communication error callback.

+  * @param  hdma : DMA handle

+  * @retval None

+  */

+static void QSPI_DMAError(DMA_HandleTypeDef *hdma)

+{

+  QSPI_HandleTypeDef* hqspi = ( QSPI_HandleTypeDef* )(hdma->Parent);

+

+  hqspi->RxXferCount = 0U;

+  hqspi->TxXferCount = 0U;

+  hqspi->ErrorCode   |= HAL_QSPI_ERROR_DMA;

+

+  /* Disable the DMA transfer by clearing the DMAEN bit in the QSPI CR register */

+  CLEAR_BIT(hqspi->Instance->CR, QUADSPI_CR_DMAEN);

+

+  /* Abort the QSPI */

+  (void)HAL_QSPI_Abort_IT(hqspi);

+

+}

+

+/**

+  * @brief  DMA QSPI abort complete callback.

+  * @param  hdma : DMA handle

+  * @retval None

+  */

+static void QSPI_DMAAbortCplt(DMA_HandleTypeDef *hdma)

+{

+  QSPI_HandleTypeDef* hqspi = ( QSPI_HandleTypeDef* )(hdma->Parent);

+

+  hqspi->RxXferCount = 0U;

+  hqspi->TxXferCount = 0U;

+

+  if(hqspi->State == HAL_QSPI_STATE_ABORT)

+  {

+    /* DMA Abort called by QSPI abort */

+    /* Clear interrupt */

+    __HAL_QSPI_CLEAR_FLAG(hqspi, QSPI_FLAG_TC);

+

+    /* Enable the QSPI Transfer Complete Interrupt */

+    __HAL_QSPI_ENABLE_IT(hqspi, QSPI_IT_TC);

+

+    /* Configure QSPI: CR register with Abort request */

+    SET_BIT(hqspi->Instance->CR, QUADSPI_CR_ABORT);

+  }

+  else

+  {

+    /* DMA Abort called due to a transfer error interrupt */

+    /* Change state of QSPI */

+    hqspi->State = HAL_QSPI_STATE_READY;

+

+    /* Error callback */

+#if (USE_HAL_QSPI_REGISTER_CALLBACKS == 1)

+    hqspi->ErrorCallback(hqspi);

+#else

+    HAL_QSPI_ErrorCallback(hqspi);

+#endif

+  }

+}

+

+/**

+  * @brief  Wait for a flag state until timeout.

+  * @param  hqspi : QSPI handle

+  * @param  Flag : Flag checked

+  * @param  State : Value of the flag expected

+  * @param  Tickstart : Tick start value

+  * @param  Timeout : Duration of the timeout

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef QSPI_WaitFlagStateUntilTimeout(QSPI_HandleTypeDef *hqspi, uint32_t Flag,

+                                                        FlagStatus State, uint32_t Tickstart, uint32_t Timeout)

+{

+  /* Wait until flag is in expected state */

+  while((__HAL_QSPI_GET_FLAG(hqspi, Flag)) != State)

+  {

+    /* Check for the Timeout */

+    if (Timeout != HAL_MAX_DELAY)

+    {

+      if(((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))

+      {

+        hqspi->State     = HAL_QSPI_STATE_ERROR;

+        hqspi->ErrorCode |= HAL_QSPI_ERROR_TIMEOUT;

+

+        return HAL_ERROR;

+      }

+    }

+  }

+  return HAL_OK;

+}

+

+/**

+  * @brief  Configure the communication registers.

+  * @param  hqspi : QSPI handle

+  * @param  cmd : structure that contains the command configuration information

+  * @param  FunctionalMode : functional mode to configured

+  *           This parameter can be one of the following values:

+  *            @arg QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE: Indirect write mode

+  *            @arg QSPI_FUNCTIONAL_MODE_INDIRECT_READ: Indirect read mode

+  *            @arg QSPI_FUNCTIONAL_MODE_AUTO_POLLING: Automatic polling mode

+  *            @arg QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED: Memory-mapped mode

+  * @retval None

+  */

+static void QSPI_Config(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t FunctionalMode)

+{

+  assert_param(IS_QSPI_FUNCTIONAL_MODE(FunctionalMode));

+

+  if ((cmd->DataMode != QSPI_DATA_NONE) && (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED))

+  {

+    /* Configure QSPI: DLR register with the number of data to read or write */

+    WRITE_REG(hqspi->Instance->DLR, (cmd->NbData - 1U));

+  }

+

+  if (cmd->InstructionMode != QSPI_INSTRUCTION_NONE)

+  {

+    if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)

+    {

+      /* Configure QSPI: ABR register with alternate bytes value */

+      WRITE_REG(hqspi->Instance->ABR, cmd->AlternateBytes);

+

+      if (cmd->AddressMode != QSPI_ADDRESS_NONE)

+      {

+        /*---- Command with instruction, address and alternate bytes ----*/

+        /* Configure QSPI: CCR register with all communications parameters */

+        WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |

+                                         cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |

+                                         cmd->AlternateBytesSize | cmd->AlternateByteMode |

+                                         cmd->AddressSize | cmd->AddressMode | cmd->InstructionMode |

+                                         cmd->Instruction | FunctionalMode));

+

+        if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)

+        {

+          /* Configure QSPI: AR register with address value */

+          WRITE_REG(hqspi->Instance->AR, cmd->Address);

+        }

+      }

+      else

+      {

+        /*---- Command with instruction and alternate bytes ----*/

+        /* Configure QSPI: CCR register with all communications parameters */

+        WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |

+                                         cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |

+                                         cmd->AlternateBytesSize | cmd->AlternateByteMode |

+                                         cmd->AddressMode | cmd->InstructionMode |

+                                         cmd->Instruction | FunctionalMode));

+      }

+    }

+    else

+    {

+      if (cmd->AddressMode != QSPI_ADDRESS_NONE)

+      {

+        /*---- Command with instruction and address ----*/

+        /* Configure QSPI: CCR register with all communications parameters */

+        WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |

+                                         cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |

+                                         cmd->AlternateByteMode | cmd->AddressSize | cmd->AddressMode |

+                                         cmd->InstructionMode | cmd->Instruction | FunctionalMode));

+

+        if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)

+        {

+          /* Configure QSPI: AR register with address value */

+          WRITE_REG(hqspi->Instance->AR, cmd->Address);

+        }

+      }

+      else

+      {

+        /*---- Command with only instruction ----*/

+        /* Configure QSPI: CCR register with all communications parameters */

+        WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |

+                                         cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |

+                                         cmd->AlternateByteMode | cmd->AddressMode |

+                                         cmd->InstructionMode | cmd->Instruction | FunctionalMode));

+      }

+    }

+  }

+  else

+  {

+    if (cmd->AlternateByteMode != QSPI_ALTERNATE_BYTES_NONE)

+    {

+      /* Configure QSPI: ABR register with alternate bytes value */

+      WRITE_REG(hqspi->Instance->ABR, cmd->AlternateBytes);

+

+      if (cmd->AddressMode != QSPI_ADDRESS_NONE)

+      {

+        /*---- Command with address and alternate bytes ----*/

+        /* Configure QSPI: CCR register with all communications parameters */

+        WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |

+                                         cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |

+                                         cmd->AlternateBytesSize | cmd->AlternateByteMode |

+                                         cmd->AddressSize | cmd->AddressMode |

+                                         cmd->InstructionMode | FunctionalMode));

+

+        if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)

+        {

+          /* Configure QSPI: AR register with address value */

+          WRITE_REG(hqspi->Instance->AR, cmd->Address);

+        }

+      }

+      else

+      {

+        /*---- Command with only alternate bytes ----*/

+        /* Configure QSPI: CCR register with all communications parameters */

+        WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |

+                                         cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |

+                                         cmd->AlternateBytesSize | cmd->AlternateByteMode |

+                                         cmd->AddressMode | cmd->InstructionMode | FunctionalMode));

+      }

+    }

+    else

+    {

+      if (cmd->AddressMode != QSPI_ADDRESS_NONE)

+      {

+        /*---- Command with only address ----*/

+        /* Configure QSPI: CCR register with all communications parameters */

+        WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |

+                                         cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |

+                                         cmd->AlternateByteMode | cmd->AddressSize |

+                                         cmd->AddressMode | cmd->InstructionMode | FunctionalMode));

+

+        if (FunctionalMode != QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED)

+        {

+          /* Configure QSPI: AR register with address value */

+          WRITE_REG(hqspi->Instance->AR, cmd->Address);

+        }

+      }

+      else

+      {

+        /*---- Command with only data phase ----*/

+        if (cmd->DataMode != QSPI_DATA_NONE)

+        {

+          /* Configure QSPI: CCR register with all communications parameters */

+          WRITE_REG(hqspi->Instance->CCR, (cmd->DdrMode | cmd->DdrHoldHalfCycle | cmd->SIOOMode |

+                                           cmd->DataMode | (cmd->DummyCycles << QUADSPI_CCR_DCYC_Pos) |

+                                           cmd->AlternateByteMode | cmd->AddressMode |

+                                           cmd->InstructionMode | FunctionalMode));

+        }

+      }

+    }

+  }

+}

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#endif /* HAL_QSPI_MODULE_ENABLED */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#endif /* defined(QUADSPI) || defined(QUADSPI1) || defined(QUADSPI2) */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c
new file mode 100644
index 0000000..9709d06
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c
@@ -0,0 +1,1869 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_rcc.c

+  * @author  MCD Application Team

+  * @brief   RCC HAL module driver.

+  *          This file provides firmware functions to manage the following

+  *          functionalities of the Reset and Clock Control (RCC) peripheral:

+  *           + Initialization and de-initialization functions

+  *           + Peripheral Control functions

+  *

+  @verbatim

+  ==============================================================================

+                      ##### RCC specific features #####

+  ==============================================================================

+    [..]

+      After reset the device is running from Multiple Speed Internal oscillator

+      (4 MHz) with Flash 0 wait state. Flash prefetch buffer, D-Cache

+      and I-Cache are disabled, and all peripherals are off except internal

+      SRAM, Flash and JTAG.

+

+      (+) There is no prescaler on High speed (AHBs) and Low speed (APBs) busses:

+          all peripherals mapped on these busses are running at MSI speed.

+      (+) The clock for all peripherals is switched off, except the SRAM and FLASH.

+      (+) All GPIOs are in analog mode, except the JTAG pins which

+          are assigned to be used for debug purpose.

+

+    [..]

+      Once the device started from reset, the user application has to:

+      (+) Configure the clock source to be used to drive the System clock

+          (if the application needs higher frequency/performance)

+      (+) Configure the System clock frequency and Flash settings

+      (+) Configure the AHB and APB busses prescalers

+      (+) Enable the clock for the peripheral(s) to be used

+      (+) Configure the clock source(s) for peripherals which clocks are not

+          derived from the System clock (SAIx, RTC, ADC, USB OTG FS/SDMMC1/RNG)

+

+  @endverbatim

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup RCC RCC

+  * @brief RCC HAL module driver

+  * @{

+  */

+

+#ifdef HAL_RCC_MODULE_ENABLED

+

+/* Private typedef -----------------------------------------------------------*/

+/* Private define ------------------------------------------------------------*/

+/** @defgroup RCC_Private_Constants RCC Private Constants

+ * @{

+ */

+#define HSE_TIMEOUT_VALUE          HSE_STARTUP_TIMEOUT

+#define HSI_TIMEOUT_VALUE          2U    /* 2 ms (minimum Tick + 1) */

+#define MSI_TIMEOUT_VALUE          2U    /* 2 ms (minimum Tick + 1) */

+#if defined(RCC_CSR_LSIPREDIV)

+#define LSI_TIMEOUT_VALUE          17U   /* 17 ms (16 ms starting time + 1) */

+#else

+#define LSI_TIMEOUT_VALUE          2U    /* 2 ms (minimum Tick + 1) */

+#endif /* RCC_CSR_LSIPREDIV */

+#define HSI48_TIMEOUT_VALUE        2U    /* 2 ms (minimum Tick + 1) */

+#define PLL_TIMEOUT_VALUE          2U    /* 2 ms (minimum Tick + 1) */

+#define CLOCKSWITCH_TIMEOUT_VALUE  5000U /* 5 s    */

+/**

+  * @}

+  */

+

+/* Private macro -------------------------------------------------------------*/

+/** @defgroup RCC_Private_Macros RCC Private Macros

+  * @{

+  */

+#define __MCO1_CLK_ENABLE()   __HAL_RCC_GPIOA_CLK_ENABLE()

+#define MCO1_GPIO_PORT        GPIOA

+#define MCO1_PIN              GPIO_PIN_8

+

+#define RCC_PLL_OSCSOURCE_CONFIG(__HAL_RCC_PLLSOURCE__) \

+            (MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, (__HAL_RCC_PLLSOURCE__)))

+/**

+  * @}

+  */

+

+/* Private variables ---------------------------------------------------------*/

+

+/* Private function prototypes -----------------------------------------------*/

+/** @defgroup RCC_Private_Functions RCC Private Functions

+  * @{

+  */

+static HAL_StatusTypeDef RCC_SetFlashLatencyFromMSIRange(uint32_t msirange);

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+static uint32_t          RCC_GetSysClockFreqFromPLLSource(void);

+#endif

+/**

+  * @}

+  */

+

+/* Exported functions --------------------------------------------------------*/

+

+/** @defgroup RCC_Exported_Functions RCC Exported Functions

+  * @{

+  */

+

+/** @defgroup RCC_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 configure the internal and external oscillators

+      (HSE, HSI, LSE, MSI, LSI, PLL, CSS and MCO) and the System busses clocks (SYSCLK, AHB, APB1

+       and APB2).

+

+    [..] Internal/external clock and PLL configuration

+         (+) HSI (high-speed internal): 16 MHz factory-trimmed RC used directly or through

+             the PLL as System clock source.

+

+         (+) MSI (Mutiple Speed Internal): Its frequency is software trimmable from 100KHZ to 48MHZ.

+             It can be used to generate the clock for the USB OTG FS (48 MHz).

+             The number of flash wait states is automatically adjusted when MSI range is updated with

+             HAL_RCC_OscConfig() and the MSI is used as System clock source.

+

+         (+) LSI (low-speed internal): 32 KHz low consumption RC used as IWDG and/or RTC

+             clock source.

+

+         (+) HSE (high-speed external): 4 to 48 MHz crystal oscillator used directly or

+             through the PLL as System clock source. Can be used also optionally as RTC clock source.

+

+         (+) LSE (low-speed external): 32.768 KHz oscillator used optionally as RTC clock source.

+

+         (+) PLL (clocked by HSI, HSE or MSI) providing up to three independent output clocks:

+           (++) The first output is used to generate the high speed system clock (up to 80MHz).

+           (++) The second output is used to generate the clock for the USB OTG FS (48 MHz),

+                the random analog generator (<=48 MHz) and the SDMMC1 (<= 48 MHz).

+           (++) The third output is used to generate an accurate clock to achieve

+                high-quality audio performance on SAI interface.

+

+         (+) PLLSAI1 (clocked by HSI, HSE or MSI) providing up to three independent output clocks:

+           (++) The first output is used to generate SAR ADC1 clock.

+           (++) The second output is used to generate the clock for the USB OTG FS (48 MHz),

+                the random analog generator (<=48 MHz) and the SDMMC1 (<= 48 MHz).

+           (++) The Third output is used to generate an accurate clock to achieve

+                high-quality audio performance on SAI interface.

+

+         (+) PLLSAI2 (clocked by HSI, HSE or MSI) providing up to two independent output clocks:

+           (++) The first output is used to generate SAR ADC2 clock.

+           (++) The second  output is used to generate an accurate clock to achieve

+                high-quality audio performance on SAI interface.

+

+         (+) CSS (Clock security system): once enabled, if a HSE clock failure occurs

+            (HSE used directly or through PLL as System clock source), the System clock

+             is automatically switched to HSI and an interrupt is generated if enabled.

+             The interrupt is linked to the Cortex-M4 NMI (Non-Maskable Interrupt)

+             exception vector.

+

+         (+) MCO (microcontroller clock output): used to output MSI, LSI, HSI, LSE, HSE or

+             main PLL clock (through a configurable prescaler) on PA8 pin.

+

+    [..] System, AHB and APB busses clocks configuration

+         (+) Several clock sources can be used to drive the System clock (SYSCLK): MSI, HSI,

+             HSE and main PLL.

+             The AHB clock (HCLK) is derived from System clock through configurable

+             prescaler and used to clock the CPU, memory and peripherals mapped

+             on AHB bus (DMA, GPIO...). APB1 (PCLK1) and APB2 (PCLK2) clocks are derived

+             from AHB clock through configurable prescalers and used to clock

+             the peripherals mapped on these busses. You can use

+             "HAL_RCC_GetSysClockFreq()" function to retrieve the frequencies of these clocks.

+

+         -@- All the peripheral clocks are derived from the System clock (SYSCLK) except:

+

+           (+@) SAI: the SAI clock can be derived either from a specific PLL (PLLSAI1) or (PLLSAI2) or

+                from an external clock mapped on the SAI_CKIN pin.

+                You have to use HAL_RCCEx_PeriphCLKConfig() function to configure this clock.

+           (+@) RTC: the RTC clock can be derived either from the LSI, LSE or HSE clock

+                divided by 2 to 31.

+                You have to use __HAL_RCC_RTC_ENABLE() and HAL_RCCEx_PeriphCLKConfig() function

+                to configure this clock.

+           (+@) USB OTG FS, SDMMC1 and RNG: USB OTG FS requires a frequency equal to 48 MHz

+                to work correctly, while the SDMMC1 and RNG peripherals require a frequency

+                equal or lower than to 48 MHz. This clock is derived of the main PLL or PLLSAI1

+                through PLLQ divider. You have to enable the peripheral clock and use

+                HAL_RCCEx_PeriphCLKConfig() function to configure this clock.

+           (+@) IWDG clock which is always the LSI clock.

+

+

+         (+) The maximum frequency of the SYSCLK, HCLK, PCLK1 and PCLK2 is 80 MHz.

+             The clock source frequency should be adapted depending on the device voltage range

+             as listed in the Reference Manual "Clock source frequency versus voltage scaling" chapter.

+

+  @endverbatim

+

+           Table 1. HCLK clock frequency for STM32L4Rx/STM32L4Sx devices

+           +--------------------------------------------------------+

+           | Latency         |     HCLK clock frequency (MHz)       |

+           |                 |--------------------------------------|

+           |                 |  voltage range 1  | voltage range 2  |

+           |                 |       1.2 V       |     1.0 V        |

+           |-----------------|-------------------|------------------|

+           |0WS(1 CPU cycles)|   0 < HCLK <= 20  |  0 < HCLK <= 8   |

+           |-----------------|-------------------|------------------|

+           |1WS(2 CPU cycles)|  20 < HCLK <= 40  |  8 < HCLK <= 16  |

+           |-----------------|-------------------|------------------|

+           |2WS(3 CPU cycles)|  40 < HCLK <= 60  | 16 < HCLK <= 26  |

+           |-----------------|-------------------|------------------|

+           |3WS(4 CPU cycles)|  60 < HCLK <= 80  | 16 < HCLK <= 26  |

+           |-----------------|-------------------|------------------|

+           |4WS(5 CPU cycles)|  80 < HCLK <= 100 | 16 < HCLK <= 26  |

+           |-----------------|-------------------|------------------|

+           |5WS(6 CPU cycles)| 100 < HCLK <= 120 | 16 < HCLK <= 26  |

+           +--------------------------------------------------------+

+

+           Table 2. HCLK clock frequency for other STM32L4 devices

+           +-------------------------------------------------------+

+           | Latency         |    HCLK clock frequency (MHz)       |

+           |                 |-------------------------------------|

+           |                 | voltage range 1  | voltage range 2  |

+           |                 |      1.2 V       |     1.0 V        |

+           |-----------------|------------------|------------------|

+           |0WS(1 CPU cycles)|  0 < HCLK <= 16  |  0 < HCLK <= 6   |

+           |-----------------|------------------|------------------|

+           |1WS(2 CPU cycles)| 16 < HCLK <= 32  |  6 < HCLK <= 12  |

+           |-----------------|------------------|------------------|

+           |2WS(3 CPU cycles)| 32 < HCLK <= 48  | 12 < HCLK <= 18  |

+           |-----------------|------------------|------------------|

+           |3WS(4 CPU cycles)| 48 < HCLK <= 64  | 18 < HCLK <= 26  |

+           |-----------------|------------------|------------------|

+           |4WS(5 CPU cycles)| 64 < HCLK <= 80  | 18 < HCLK <= 26  |

+           +-------------------------------------------------------+

+  * @{

+  */

+

+/**

+  * @brief  Reset the RCC clock configuration to the default reset state.

+  * @note   The default reset state of the clock configuration is given below:

+  *            - MSI ON and used as system clock source

+  *            - HSE, HSI, PLL, PLLSAI1 and PLLSAI2 OFF

+  *            - AHB, APB1 and APB2 prescalers set to 1.

+  *            - CSS, MCO1 OFF

+  *            - All interrupts disabled

+  *            - All interrupt and reset flags cleared

+  * @note   This function does not modify the configuration of the

+  *            - Peripheral clock sources

+  *            - LSI, LSE and RTC clocks (Backup domain)

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_RCC_DeInit(void)

+{

+  uint32_t tickstart;

+

+  /* Reset to default System clock */

+  /* Set MSION bit */

+  SET_BIT(RCC->CR, RCC_CR_MSION);

+

+  /* Insure MSIRDY bit is set before writing default MSIRANGE value */

+  /* Get start tick */

+  tickstart = HAL_GetTick();

+

+  /* Wait till MSI is ready */

+  while(READ_BIT(RCC->CR, RCC_CR_MSIRDY) == 0U)

+  {

+    if((HAL_GetTick() - tickstart) > MSI_TIMEOUT_VALUE)

+    {

+      return HAL_TIMEOUT;

+    }

+  }

+

+  /* Set MSIRANGE default value */

+  MODIFY_REG(RCC->CR, RCC_CR_MSIRANGE, RCC_MSIRANGE_6);

+

+  /* Reset CFGR register (MSI is selected as system clock source) */

+  CLEAR_REG(RCC->CFGR);

+

+  /* Update the SystemCoreClock global variable for MSI as system clock source */

+  SystemCoreClock = MSI_VALUE;

+

+  /* Configure the source of time base considering new system clock settings  */

+  if(HAL_InitTick(uwTickPrio) != HAL_OK)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Insure MSI selected as system clock source */

+  /* Get start tick */

+  tickstart = HAL_GetTick();

+

+  /* Wait till system clock source is ready */

+  while(READ_BIT(RCC->CFGR, RCC_CFGR_SWS) != RCC_CFGR_SWS_MSI)

+  {

+    if((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE)

+    {

+      return HAL_TIMEOUT;

+    }

+  }

+

+  /* Reset HSION, HSIKERON, HSIASFS, HSEON, HSECSSON, PLLON, PLLSAIxON bits */

+#if defined(RCC_PLLSAI2_SUPPORT)

+

+  CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_HSION | RCC_CR_HSIKERON| RCC_CR_HSIASFS | RCC_CR_PLLON | RCC_CR_PLLSAI1ON | RCC_CR_PLLSAI2ON);

+

+#elif defined(RCC_PLLSAI1_SUPPORT)

+

+  CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_HSION | RCC_CR_HSIKERON| RCC_CR_HSIASFS | RCC_CR_PLLON | RCC_CR_PLLSAI1ON);

+

+#else

+

+  CLEAR_BIT(RCC->CR, RCC_CR_HSEON | RCC_CR_HSION | RCC_CR_HSIKERON| RCC_CR_HSIASFS | RCC_CR_PLLON);

+

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+  /* Insure PLLRDY, PLLSAI1RDY and PLLSAI2RDY (if present) are reset */

+  /* Get start tick */

+  tickstart = HAL_GetTick();

+

+#if defined(RCC_PLLSAI2_SUPPORT)

+

+  while(READ_BIT(RCC->CR, RCC_CR_PLLRDY | RCC_CR_PLLSAI1RDY | RCC_CR_PLLSAI2RDY) != 0U)

+

+#elif defined(RCC_PLLSAI1_SUPPORT)

+

+  while(READ_BIT(RCC->CR, RCC_CR_PLLRDY | RCC_CR_PLLSAI1RDY) != 0U)

+

+#else

+

+  while(READ_BIT(RCC->CR, RCC_CR_PLLRDY) != 0U)

+

+#endif

+  {

+    if((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE)

+    {

+      return HAL_TIMEOUT;

+    }

+  }

+

+  /* Reset PLLCFGR register */

+  CLEAR_REG(RCC->PLLCFGR);

+  SET_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN_4 );

+

+#if defined(RCC_PLLSAI1_SUPPORT)

+

+  /* Reset PLLSAI1CFGR register */

+  CLEAR_REG(RCC->PLLSAI1CFGR);

+  SET_BIT(RCC->PLLSAI1CFGR,  RCC_PLLSAI1CFGR_PLLSAI1N_4 );

+

+#endif /* RCC_PLLSAI1_SUPPORT */

+

+#if defined(RCC_PLLSAI2_SUPPORT)

+

+  /* Reset PLLSAI2CFGR register */

+  CLEAR_REG(RCC->PLLSAI2CFGR);

+  SET_BIT(RCC->PLLSAI2CFGR,  RCC_PLLSAI2CFGR_PLLSAI2N_4 );

+

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+  /* Reset HSEBYP bit */

+  CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP);

+

+  /* Disable all interrupts */

+  CLEAR_REG(RCC->CIER);

+

+  /* Clear all interrupt flags */

+  WRITE_REG(RCC->CICR, 0xFFFFFFFFU);

+

+  /* Clear all reset flags */

+  SET_BIT(RCC->CSR, RCC_CSR_RMVF);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Initialize the RCC Oscillators according to the specified parameters in the

+  *         RCC_OscInitTypeDef.

+  * @param  RCC_OscInitStruct  pointer to an RCC_OscInitTypeDef structure that

+  *         contains the configuration information for the RCC Oscillators.

+  * @note   The PLL is not disabled when used as system clock.

+  * @note   Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not

+  *         supported by this macro. User should request a transition to LSE Off

+  *         first and then LSE On or LSE Bypass.

+  * @note   Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not

+  *         supported by this macro. User should request a transition to HSE Off

+  *         first and then HSE On or HSE Bypass.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef  *RCC_OscInitStruct)

+{

+  uint32_t tickstart;

+  HAL_StatusTypeDef status;

+  uint32_t sysclk_source, pll_config;

+

+  /* Check Null pointer */

+  if(RCC_OscInitStruct == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check the parameters */

+  assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType));

+

+  sysclk_source = __HAL_RCC_GET_SYSCLK_SOURCE();

+  pll_config = __HAL_RCC_GET_PLL_OSCSOURCE();

+

+  /*----------------------------- MSI Configuration --------------------------*/

+  if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_MSI) == RCC_OSCILLATORTYPE_MSI)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_MSI(RCC_OscInitStruct->MSIState));

+    assert_param(IS_RCC_MSICALIBRATION_VALUE(RCC_OscInitStruct->MSICalibrationValue));

+    assert_param(IS_RCC_MSI_CLOCK_RANGE(RCC_OscInitStruct->MSIClockRange));

+

+    /* Check if MSI is used as system clock or as PLL source when PLL is selected as system clock */

+    if((sysclk_source == RCC_CFGR_SWS_MSI) ||

+       ((sysclk_source == RCC_CFGR_SWS_PLL) && (pll_config == RCC_PLLSOURCE_MSI)))

+    {

+      if((READ_BIT(RCC->CR, RCC_CR_MSIRDY) != 0U) && (RCC_OscInitStruct->MSIState == RCC_MSI_OFF))

+      {

+        return HAL_ERROR;

+      }

+

+       /* Otherwise, just the calibration and MSI range change are allowed */

+      else

+      {

+        /* To correctly read data from FLASH memory, the number of wait states (LATENCY)

+           must be correctly programmed according to the frequency of the CPU clock

+           (HCLK) and the supply voltage of the device. */

+        if(RCC_OscInitStruct->MSIClockRange > __HAL_RCC_GET_MSI_RANGE())

+        {

+          /* First increase number of wait states update if necessary */

+          if(RCC_SetFlashLatencyFromMSIRange(RCC_OscInitStruct->MSIClockRange) != HAL_OK)

+          {

+            return HAL_ERROR;

+          }

+

+          /* Selects the Multiple Speed oscillator (MSI) clock range .*/

+          __HAL_RCC_MSI_RANGE_CONFIG(RCC_OscInitStruct->MSIClockRange);

+          /* Adjusts the Multiple Speed oscillator (MSI) calibration value.*/

+          __HAL_RCC_MSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->MSICalibrationValue);

+        }

+        else

+        {

+          /* Else, keep current flash latency while decreasing applies */

+          /* Selects the Multiple Speed oscillator (MSI) clock range .*/

+          __HAL_RCC_MSI_RANGE_CONFIG(RCC_OscInitStruct->MSIClockRange);

+          /* Adjusts the Multiple Speed oscillator (MSI) calibration value.*/

+          __HAL_RCC_MSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->MSICalibrationValue);

+

+          /* Decrease number of wait states update if necessary */

+          if(RCC_SetFlashLatencyFromMSIRange(RCC_OscInitStruct->MSIClockRange) != HAL_OK)

+          {

+            return HAL_ERROR;

+          }

+        }

+

+        /* Update the SystemCoreClock global variable */

+        SystemCoreClock = HAL_RCC_GetSysClockFreq() >> (AHBPrescTable[READ_BIT(RCC->CFGR, RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos] & 0x1FU);

+

+        /* Configure the source of time base considering new system clocks settings*/

+        status = HAL_InitTick(uwTickPrio);

+        if(status != HAL_OK)

+        {

+          return status;

+        }

+      }

+    }

+    else

+    {

+      /* Check the MSI State */

+      if(RCC_OscInitStruct->MSIState != RCC_MSI_OFF)

+      {

+        /* Enable the Internal High Speed oscillator (MSI). */

+        __HAL_RCC_MSI_ENABLE();

+

+        /* Get timeout */

+        tickstart = HAL_GetTick();

+

+        /* Wait till MSI is ready */

+        while(READ_BIT(RCC->CR, RCC_CR_MSIRDY) == 0U)

+        {

+          if((HAL_GetTick() - tickstart) > MSI_TIMEOUT_VALUE)

+          {

+            return HAL_TIMEOUT;

+          }

+        }

+         /* Selects the Multiple Speed oscillator (MSI) clock range .*/

+        __HAL_RCC_MSI_RANGE_CONFIG(RCC_OscInitStruct->MSIClockRange);

+         /* Adjusts the Multiple Speed oscillator (MSI) calibration value.*/

+        __HAL_RCC_MSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->MSICalibrationValue);

+

+      }

+      else

+      {

+        /* Disable the Internal High Speed oscillator (MSI). */

+        __HAL_RCC_MSI_DISABLE();

+

+        /* Get timeout */

+        tickstart = HAL_GetTick();

+

+        /* Wait till MSI is ready */

+        while(READ_BIT(RCC->CR, RCC_CR_MSIRDY) != 0U)

+        {

+          if((HAL_GetTick() - tickstart) > MSI_TIMEOUT_VALUE)

+          {

+            return HAL_TIMEOUT;

+          }

+        }

+      }

+    }

+  }

+  /*------------------------------- HSE Configuration ------------------------*/

+  if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState));

+

+    /* When the HSE is used as system clock or clock source for PLL in these cases it is not allowed to be disabled */

+    if((sysclk_source == RCC_CFGR_SWS_HSE) ||

+       ((sysclk_source == RCC_CFGR_SWS_PLL) && (pll_config == RCC_PLLSOURCE_HSE)))

+    {

+      if((READ_BIT(RCC->CR, RCC_CR_HSERDY) != 0U) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF))

+      {

+        return HAL_ERROR;

+      }

+    }

+    else

+    {

+      /* Set the new HSE configuration ---------------------------------------*/

+      __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState);

+

+      /* Check the HSE State */

+      if(RCC_OscInitStruct->HSEState != RCC_HSE_OFF)

+      {

+        /* Get Start Tick*/

+        tickstart = HAL_GetTick();

+

+        /* Wait till HSE is ready */

+        while(READ_BIT(RCC->CR, RCC_CR_HSERDY) == 0U)

+        {

+          if((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE)

+          {

+            return HAL_TIMEOUT;

+          }

+        }

+      }

+      else

+      {

+        /* Get Start Tick*/

+        tickstart = HAL_GetTick();

+

+        /* Wait till HSE is disabled */

+        while(READ_BIT(RCC->CR, RCC_CR_HSERDY) != 0U)

+        {

+          if((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE)

+          {

+            return HAL_TIMEOUT;

+          }

+        }

+      }

+    }

+  }

+  /*----------------------------- HSI Configuration --------------------------*/

+  if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState));

+    assert_param(IS_RCC_HSI_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue));

+

+    /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */

+    if((sysclk_source == RCC_CFGR_SWS_HSI) ||

+       ((sysclk_source == RCC_CFGR_SWS_PLL) && (pll_config == RCC_PLLSOURCE_HSI)))

+    {

+      /* When HSI is used as system clock it will not be disabled */

+      if((READ_BIT(RCC->CR, RCC_CR_HSIRDY) != 0U) && (RCC_OscInitStruct->HSIState == RCC_HSI_OFF))

+      {

+        return HAL_ERROR;

+      }

+      /* Otherwise, just the calibration is allowed */

+      else

+      {

+        /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/

+        __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue);

+      }

+    }

+    else

+    {

+      /* Check the HSI State */

+      if(RCC_OscInitStruct->HSIState != RCC_HSI_OFF)

+      {

+        /* Enable the Internal High Speed oscillator (HSI). */

+        __HAL_RCC_HSI_ENABLE();

+

+        /* Get Start Tick*/

+        tickstart = HAL_GetTick();

+

+        /* Wait till HSI is ready */

+        while(READ_BIT(RCC->CR, RCC_CR_HSIRDY) == 0U)

+        {

+          if((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE)

+          {

+            return HAL_TIMEOUT;

+          }

+        }

+

+        /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/

+        __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue);

+      }

+      else

+      {

+        /* Disable the Internal High Speed oscillator (HSI). */

+        __HAL_RCC_HSI_DISABLE();

+

+        /* Get Start Tick*/

+        tickstart = HAL_GetTick();

+

+        /* Wait till HSI is disabled */

+        while(READ_BIT(RCC->CR, RCC_CR_HSIRDY) != 0U)

+        {

+          if((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE)

+          {

+            return HAL_TIMEOUT;

+          }

+        }

+      }

+    }

+  }

+  /*------------------------------ LSI Configuration -------------------------*/

+  if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState));

+

+    /* Check the LSI State */

+    if(RCC_OscInitStruct->LSIState != RCC_LSI_OFF)

+    {

+#if defined(RCC_CSR_LSIPREDIV)

+      uint32_t csr_temp = RCC->CSR;

+

+      /* Check LSI division factor */

+      assert_param(IS_RCC_LSIDIV(RCC_OscInitStruct->LSIDiv));

+

+      if (RCC_OscInitStruct->LSIDiv != (csr_temp & RCC_CSR_LSIPREDIV))

+      {

+        if (((csr_temp & RCC_CSR_LSIRDY) == RCC_CSR_LSIRDY) && \

+            ((csr_temp & RCC_CSR_LSION) != RCC_CSR_LSION))

+        {

+           /* If LSIRDY is set while LSION is not enabled,

+              LSIPREDIV can't be updated  */

+          return HAL_ERROR;

+        }

+

+        /* Turn off LSI before changing RCC_CSR_LSIPREDIV */

+        if ((csr_temp & RCC_CSR_LSION) == RCC_CSR_LSION)

+        {

+          __HAL_RCC_LSI_DISABLE();

+

+          /* Get Start Tick*/

+          tickstart = HAL_GetTick();

+

+          /* Wait till LSI is disabled */

+          while(READ_BIT(RCC->CSR, RCC_CSR_LSIRDY) != 0U)

+          {

+            if((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE)

+            {

+              return HAL_TIMEOUT;

+            }

+          }

+        }

+

+        /* Set LSI division factor */

+        MODIFY_REG(RCC->CSR, RCC_CSR_LSIPREDIV, RCC_OscInitStruct->LSIDiv);

+      }

+#endif /* RCC_CSR_LSIPREDIV */

+

+      /* Enable the Internal Low Speed oscillator (LSI). */

+      __HAL_RCC_LSI_ENABLE();

+

+      /* Get Start Tick*/

+      tickstart = HAL_GetTick();

+

+      /* Wait till LSI is ready */

+      while(READ_BIT(RCC->CSR, RCC_CSR_LSIRDY) == 0U)

+      {

+        if((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE)

+        {

+          return HAL_TIMEOUT;

+        }

+      }

+    }

+    else

+    {

+      /* Disable the Internal Low Speed oscillator (LSI). */

+      __HAL_RCC_LSI_DISABLE();

+

+      /* Get Start Tick*/

+      tickstart = HAL_GetTick();

+

+      /* Wait till LSI is disabled */

+      while(READ_BIT(RCC->CSR, RCC_CSR_LSIRDY) != 0U)

+      {

+        if((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE)

+        {

+          return HAL_TIMEOUT;

+        }

+      }

+    }

+  }

+  /*------------------------------ LSE Configuration -------------------------*/

+  if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE)

+  {

+    FlagStatus       pwrclkchanged = RESET;

+

+    /* Check the parameters */

+    assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState));

+

+    /* Update LSE configuration in Backup Domain control register    */

+    /* Requires to enable write access to Backup Domain of necessary */

+    if(HAL_IS_BIT_CLR(RCC->APB1ENR1, RCC_APB1ENR1_PWREN))

+    {

+      __HAL_RCC_PWR_CLK_ENABLE();

+      pwrclkchanged = SET;

+    }

+

+    if(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP))

+    {

+      /* Enable write access to Backup domain */

+      SET_BIT(PWR->CR1, PWR_CR1_DBP);

+

+      /* Wait for Backup domain Write protection disable */

+      tickstart = HAL_GetTick();

+

+      while(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP))

+      {

+        if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE)

+        {

+          return HAL_TIMEOUT;

+        }

+      }

+    }

+

+    /* Set the new LSE configuration -----------------------------------------*/

+#if defined(RCC_BDCR_LSESYSDIS)

+    if((RCC_OscInitStruct->LSEState & RCC_BDCR_LSEON) != 0U)

+    {

+      /* Set LSESYSDIS bit according to LSE propagation option (enabled or disabled) */

+      MODIFY_REG(RCC->BDCR, RCC_BDCR_LSESYSDIS, (RCC_OscInitStruct->LSEState & RCC_BDCR_LSESYSDIS));

+

+      if((RCC_OscInitStruct->LSEState & RCC_BDCR_LSEBYP) != 0U)

+      {

+        /* LSE oscillator bypass enable */

+        SET_BIT(RCC->BDCR, RCC_BDCR_LSEBYP);

+        SET_BIT(RCC->BDCR, RCC_BDCR_LSEON);

+      }

+      else

+      {

+        /* LSE oscillator enable */

+        SET_BIT(RCC->BDCR, RCC_BDCR_LSEON);

+      }

+    }

+    else

+    {

+      CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON);

+      CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP);

+    }

+#else

+    __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState);

+#endif /* RCC_BDCR_LSESYSDIS */

+

+    /* Check the LSE State */

+    if(RCC_OscInitStruct->LSEState != RCC_LSE_OFF)

+    {

+      /* Get Start Tick*/

+      tickstart = HAL_GetTick();

+

+      /* Wait till LSE is ready */

+      while(READ_BIT(RCC->BDCR, RCC_BDCR_LSERDY) == 0U)

+      {

+        if((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE)

+        {

+          return HAL_TIMEOUT;

+        }

+      }

+    }

+    else

+    {

+      /* Get Start Tick*/

+      tickstart = HAL_GetTick();

+

+      /* Wait till LSE is disabled */

+      while(READ_BIT(RCC->BDCR, RCC_BDCR_LSERDY) != 0U)

+      {

+        if((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE)

+        {

+          return HAL_TIMEOUT;

+        }

+      }

+

+#if defined(RCC_BDCR_LSESYSDIS)

+      /* By default, stop disabling LSE propagation */

+      CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSESYSDIS);

+#endif /* RCC_BDCR_LSESYSDIS */

+    }

+

+    /* Restore clock configuration if changed */

+    if(pwrclkchanged == SET)

+    {

+      __HAL_RCC_PWR_CLK_DISABLE();

+    }

+  }

+#if defined(RCC_HSI48_SUPPORT)

+  /*------------------------------ HSI48 Configuration -----------------------*/

+  if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI48) == RCC_OSCILLATORTYPE_HSI48)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_HSI48(RCC_OscInitStruct->HSI48State));

+

+    /* Check the LSI State */

+    if(RCC_OscInitStruct->HSI48State != RCC_HSI48_OFF)

+    {

+      /* Enable the Internal Low Speed oscillator (HSI48). */

+      __HAL_RCC_HSI48_ENABLE();

+

+      /* Get Start Tick*/

+      tickstart = HAL_GetTick();

+

+      /* Wait till HSI48 is ready */

+      while(READ_BIT(RCC->CRRCR, RCC_CRRCR_HSI48RDY) == 0U)

+      {

+        if((HAL_GetTick() - tickstart) > HSI48_TIMEOUT_VALUE)

+        {

+          return HAL_TIMEOUT;

+        }

+      }

+    }

+    else

+    {

+      /* Disable the Internal Low Speed oscillator (HSI48). */

+      __HAL_RCC_HSI48_DISABLE();

+

+      /* Get Start Tick*/

+      tickstart = HAL_GetTick();

+

+      /* Wait till HSI48 is disabled */

+      while(READ_BIT(RCC->CRRCR, RCC_CRRCR_HSI48RDY) != 0U)

+      {

+        if((HAL_GetTick() - tickstart) > HSI48_TIMEOUT_VALUE)

+        {

+          return HAL_TIMEOUT;

+        }

+      }

+    }

+  }

+#endif /* RCC_HSI48_SUPPORT */

+  /*-------------------------------- PLL Configuration -----------------------*/

+  /* Check the parameters */

+  assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState));

+

+  if(RCC_OscInitStruct->PLL.PLLState != RCC_PLL_NONE)

+  {

+    /* Check if the PLL is used as system clock or not */

+    if(sysclk_source != RCC_CFGR_SWS_PLL)

+    {

+      if(RCC_OscInitStruct->PLL.PLLState == RCC_PLL_ON)

+      {

+        /* Check the parameters */

+        assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource));

+        assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM));

+        assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN));

+#if defined(RCC_PLLP_SUPPORT)

+        assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP));

+#endif /* RCC_PLLP_SUPPORT */

+        assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ));

+        assert_param(IS_RCC_PLLR_VALUE(RCC_OscInitStruct->PLL.PLLR));

+

+        /* Disable the main PLL. */

+        __HAL_RCC_PLL_DISABLE();

+

+        /* Get Start Tick*/

+        tickstart = HAL_GetTick();

+

+        /* Wait till PLL is ready */

+        while(READ_BIT(RCC->CR, RCC_CR_PLLRDY) != 0U)

+        {

+          if((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE)

+          {

+            return HAL_TIMEOUT;

+          }

+        }

+

+        /* Configure the main PLL clock source, multiplication and division factors. */

+        __HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource,

+                             RCC_OscInitStruct->PLL.PLLM,

+                             RCC_OscInitStruct->PLL.PLLN,

+#if defined(RCC_PLLP_SUPPORT)

+                             RCC_OscInitStruct->PLL.PLLP,

+#endif

+                             RCC_OscInitStruct->PLL.PLLQ,

+                             RCC_OscInitStruct->PLL.PLLR);

+

+        /* Enable the main PLL. */

+        __HAL_RCC_PLL_ENABLE();

+

+        /* Enable PLL System Clock output. */

+        __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL_SYSCLK);

+

+        /* Get Start Tick*/

+        tickstart = HAL_GetTick();

+

+        /* Wait till PLL is ready */

+        while(READ_BIT(RCC->CR, RCC_CR_PLLRDY) == 0U)

+        {

+          if((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE)

+          {

+            return HAL_TIMEOUT;

+          }

+        }

+      }

+      else

+      {

+        /* Disable the main PLL. */

+        __HAL_RCC_PLL_DISABLE();

+

+        /* Disable all PLL outputs to save power if no PLLs on */

+#if defined(RCC_PLLSAI1_SUPPORT) && defined(RCC_CR_PLLSAI2RDY)

+        if(READ_BIT(RCC->CR, (RCC_CR_PLLSAI1RDY | RCC_CR_PLLSAI2RDY)) == 0U)

+        {

+          MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, RCC_PLLSOURCE_NONE);

+        }

+#elif defined(RCC_PLLSAI1_SUPPORT)

+        if(READ_BIT(RCC->CR, RCC_CR_PLLSAI1RDY) == 0U)

+        {

+          MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, RCC_PLLSOURCE_NONE);

+        }

+#else

+        MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, RCC_PLLSOURCE_NONE);

+#endif /* RCC_PLLSAI1_SUPPORT && RCC_CR_PLLSAI2RDY */

+

+#if defined(RCC_PLLSAI2_SUPPORT)

+        __HAL_RCC_PLLCLKOUT_DISABLE(RCC_PLL_SYSCLK | RCC_PLL_48M1CLK | RCC_PLL_SAI3CLK);

+#elif defined(RCC_PLLSAI1_SUPPORT)

+        __HAL_RCC_PLLCLKOUT_DISABLE(RCC_PLL_SYSCLK | RCC_PLL_48M1CLK | RCC_PLL_SAI2CLK);

+#else

+        __HAL_RCC_PLLCLKOUT_DISABLE(RCC_PLL_SYSCLK | RCC_PLL_48M1CLK);

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+        /* Get Start Tick*/

+        tickstart = HAL_GetTick();

+

+        /* Wait till PLL is disabled */

+        while(READ_BIT(RCC->CR, RCC_CR_PLLRDY) != 0U)

+        {

+          if((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE)

+          {

+            return HAL_TIMEOUT;

+          }

+        }

+      }

+    }

+    else

+    {

+      /* Check if there is a request to disable the PLL used as System clock source */

+      if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF)

+      {

+        return HAL_ERROR;

+      }

+      else

+      {

+        pll_config = RCC->PLLCFGR;

+        /* Do not return HAL_ERROR if request repeats the current configuration */

+        if((READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC)  != RCC_OscInitStruct->PLL.PLLSource) ||

+           (READ_BIT(pll_config, RCC_PLLCFGR_PLLM)    != ((RCC_OscInitStruct->PLL.PLLM - 1U) << RCC_PLLCFGR_PLLM_Pos)) ||

+           (READ_BIT(pll_config, RCC_PLLCFGR_PLLN)    != (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos)) ||

+#if defined(RCC_PLLP_SUPPORT)

+#if defined(RCC_PLLP_DIV_2_31_SUPPORT)

+           (READ_BIT(pll_config, RCC_PLLCFGR_PLLPDIV) != (RCC_OscInitStruct->PLL.PLLP << RCC_PLLCFGR_PLLPDIV_Pos)) ||

+#else

+           (READ_BIT(pll_config, RCC_PLLCFGR_PLLP)    != ((RCC_OscInitStruct->PLL.PLLP == RCC_PLLP_DIV7) ? 0U : 1U)) ||

+#endif

+#endif

+           (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ)    != ((((RCC_OscInitStruct->PLL.PLLQ) >> 1U) - 1U) << RCC_PLLCFGR_PLLQ_Pos)) ||

+           (READ_BIT(pll_config, RCC_PLLCFGR_PLLR)    != ((((RCC_OscInitStruct->PLL.PLLR) >> 1U) - 1U) << RCC_PLLCFGR_PLLR_Pos)))

+        {

+          return HAL_ERROR;

+        }

+      }

+    }

+  }

+  return HAL_OK;

+}

+

+/**

+  * @brief  Initialize the CPU, AHB and APB busses clocks according to the specified

+  *         parameters in the RCC_ClkInitStruct.

+  * @param  RCC_ClkInitStruct  pointer to an RCC_OscInitTypeDef structure that

+  *         contains the configuration information for the RCC peripheral.

+  * @param  FLatency  FLASH Latency

+  *          This parameter can be one of the following values:

+  *            @arg FLASH_LATENCY_0   FLASH 0 Latency cycle

+  *            @arg FLASH_LATENCY_1   FLASH 1 Latency cycle

+  *            @arg FLASH_LATENCY_2   FLASH 2 Latency cycles

+  *            @arg FLASH_LATENCY_3   FLASH 3 Latency cycles

+  *            @arg FLASH_LATENCY_4   FLASH 4 Latency cycles

+  @if STM32L4S9xx

+  *            @arg FLASH_LATENCY_5   FLASH 5 Latency cycles

+  *            @arg FLASH_LATENCY_6   FLASH 6 Latency cycles

+  *            @arg FLASH_LATENCY_7   FLASH 7 Latency cycles

+  *            @arg FLASH_LATENCY_8   FLASH 8 Latency cycles

+  *            @arg FLASH_LATENCY_9   FLASH 9 Latency cycles

+  *            @arg FLASH_LATENCY_10  FLASH 10 Latency cycles

+  *            @arg FLASH_LATENCY_11  FLASH 11 Latency cycles

+  *            @arg FLASH_LATENCY_12  FLASH 12 Latency cycles

+  *            @arg FLASH_LATENCY_13  FLASH 13 Latency cycles

+  *            @arg FLASH_LATENCY_14  FLASH 14 Latency cycles

+  *            @arg FLASH_LATENCY_15  FLASH 15 Latency cycles

+  @endif

+  *

+  * @note   The SystemCoreClock CMSIS variable is used to store System Clock Frequency

+  *         and updated by HAL_RCC_GetHCLKFreq() function called within this function

+  *

+  * @note   The MSI is used by default as system clock source after

+  *         startup from Reset, wake-up from STANDBY mode. After restart from Reset,

+  *         the MSI frequency is set to its default value 4 MHz.

+  *

+  * @note   The HSI can be selected as system clock source after

+  *         from STOP modes or in case of failure of the HSE used directly or indirectly

+  *         as system clock (if the Clock Security System CSS is enabled).

+  *

+  * @note   A switch from one clock source to another occurs only if the target

+  *         clock source is ready (clock stable after startup delay or PLL locked).

+  *         If a clock source which is not yet ready is selected, the switch will

+  *         occur when the clock source is ready.

+  *

+  * @note   You can use HAL_RCC_GetClockConfig() function to know which clock is

+  *         currently used as system clock source.

+  *

+  * @note   Depending on the device voltage range, the software has to set correctly

+  *         HPRE[3:0] bits to ensure that HCLK not exceed the maximum allowed frequency

+  *         (for more details refer to section above "Initialization/de-initialization functions")

+  * @retval None

+  */

+HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef  *RCC_ClkInitStruct, uint32_t FLatency)

+{

+  uint32_t tickstart;

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+  uint32_t hpre = RCC_SYSCLK_DIV1;

+#endif

+  HAL_StatusTypeDef status;

+

+  /* Check Null pointer */

+  if(RCC_ClkInitStruct == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check the parameters */

+  assert_param(IS_RCC_CLOCKTYPE(RCC_ClkInitStruct->ClockType));

+  assert_param(IS_FLASH_LATENCY(FLatency));

+

+  /* To correctly read data from FLASH memory, the number of wait states (LATENCY)

+    must be correctly programmed according to the frequency of the CPU clock

+    (HCLK) and the supply voltage of the device. */

+

+  /* Increasing the number of wait states because of higher CPU frequency */

+  if(FLatency > __HAL_FLASH_GET_LATENCY())

+  {

+    /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */

+    __HAL_FLASH_SET_LATENCY(FLatency);

+

+    /* Check that the new number of wait states is taken into account to access the Flash

+    memory by reading the FLASH_ACR register */

+    if(__HAL_FLASH_GET_LATENCY() != FLatency)

+    {

+      return HAL_ERROR;

+    }

+  }

+

+  /*------------------------- SYSCLK Configuration ---------------------------*/

+  if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK)

+  {

+    assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource));

+

+    /* PLL is selected as System Clock Source */

+    if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK)

+    {

+      /* Check the PLL ready flag */

+      if(READ_BIT(RCC->CR, RCC_CR_PLLRDY) == 0U)

+      {

+        return HAL_ERROR;

+      }

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+      /* Undershoot management when selection PLL as SYSCLK source and frequency above 80Mhz */

+      /* Compute target PLL output frequency */

+      if(RCC_GetSysClockFreqFromPLLSource() > 80000000U)

+      {

+        if(READ_BIT(RCC->CFGR, RCC_CFGR_HPRE) == RCC_SYSCLK_DIV1)

+        {

+          /* Intermediate step with HCLK prescaler 2 necessary before to go over 80Mhz */

+          MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_SYSCLK_DIV2);

+          hpre = RCC_SYSCLK_DIV2;

+        }

+        else if((((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) && (RCC_ClkInitStruct->AHBCLKDivider == RCC_SYSCLK_DIV1))

+        {

+          /* Intermediate step with HCLK prescaler 2 necessary before to go over 80Mhz */

+          MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_SYSCLK_DIV2);

+          hpre = RCC_SYSCLK_DIV2;

+        }

+        else

+        {

+          /* nothing to do */

+        }

+      }

+#endif

+    }

+    else

+    {

+      /* HSE is selected as System Clock Source */

+      if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE)

+      {

+        /* Check the HSE ready flag */

+        if(READ_BIT(RCC->CR, RCC_CR_HSERDY) == 0U)

+        {

+          return HAL_ERROR;

+        }

+      }

+      /* MSI is selected as System Clock Source */

+      else if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_MSI)

+      {

+        /* Check the MSI ready flag */

+        if(READ_BIT(RCC->CR, RCC_CR_MSIRDY) == 0U)

+        {

+          return HAL_ERROR;

+        }

+      }

+      /* HSI is selected as System Clock Source */

+      else

+      {

+        /* Check the HSI ready flag */

+        if(READ_BIT(RCC->CR, RCC_CR_HSIRDY) == 0U)

+        {

+          return HAL_ERROR;

+        }

+      }

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+      /* Overshoot management when going down from PLL as SYSCLK source and frequency above 80Mhz */

+      if(HAL_RCC_GetSysClockFreq() > 80000000U)

+      {

+        /* Intermediate step with HCLK prescaler 2 necessary before to go under 80Mhz */

+        MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_SYSCLK_DIV2);

+        hpre = RCC_SYSCLK_DIV2;

+      }

+#endif

+

+    }

+

+    MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_ClkInitStruct->SYSCLKSource);

+

+    /* Get Start Tick*/

+    tickstart = HAL_GetTick();

+

+    while(__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos))

+    {

+      if((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE)

+      {

+        return HAL_TIMEOUT;

+      }

+    }

+  }

+

+  /*-------------------------- HCLK Configuration --------------------------*/

+  if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK)

+  {

+    assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider));

+    MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider);

+  }

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+  else

+  {

+    /* Is intermediate HCLK prescaler 2 applied internally, complete with HCLK prescaler 1 */

+    if(hpre == RCC_SYSCLK_DIV2)

+    {

+      MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_SYSCLK_DIV1);

+    }

+  }

+#endif

+

+  /* Decreasing the number of wait states because of lower CPU frequency */

+  if(FLatency < __HAL_FLASH_GET_LATENCY())

+  {

+    /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */

+    __HAL_FLASH_SET_LATENCY(FLatency);

+

+    /* Check that the new number of wait states is taken into account to access the Flash

+    memory by reading the FLASH_ACR register */

+    if(__HAL_FLASH_GET_LATENCY() != FLatency)

+    {

+      return HAL_ERROR;

+    }

+  }

+

+  /*-------------------------- PCLK1 Configuration ---------------------------*/

+  if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1)

+  {

+    assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider));

+    MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider);

+  }

+

+  /*-------------------------- PCLK2 Configuration ---------------------------*/

+  if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2)

+  {

+    assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider));

+    MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3U));

+  }

+

+  /* Update the SystemCoreClock global variable */

+  SystemCoreClock = HAL_RCC_GetSysClockFreq() >> (AHBPrescTable[READ_BIT(RCC->CFGR, RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos] & 0x1FU);

+

+  /* Configure the source of time base considering new system clocks settings*/

+  status = HAL_InitTick(uwTickPrio);

+

+  return status;

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup RCC_Exported_Functions_Group2 Peripheral Control functions

+ *  @brief   RCC clocks control functions

+ *

+@verbatim

+ ===============================================================================

+                      ##### Peripheral Control functions #####

+ ===============================================================================

+    [..]

+    This subsection provides a set of functions allowing to:

+

+    (+) Ouput clock to MCO pin.

+    (+) Retrieve current clock frequencies.

+    (+) Enable the Clock Security System.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Select the clock source to output on MCO pin(PA8).

+  * @note   PA8 should be configured in alternate function mode.

+  * @param  RCC_MCOx  specifies the output direction for the clock source.

+  *          For STM32L4xx family this parameter can have only one value:

+  *            @arg @ref RCC_MCO1  Clock source to output on MCO1 pin(PA8).

+  * @param  RCC_MCOSource  specifies the clock source to output.

+  *          This parameter can be one of the following values:

+  *            @arg @ref RCC_MCO1SOURCE_NOCLOCK  MCO output disabled, no clock on MCO

+  *            @arg @ref RCC_MCO1SOURCE_SYSCLK  system  clock selected as MCO source

+  *            @arg @ref RCC_MCO1SOURCE_MSI  MSI clock selected as MCO source

+  *            @arg @ref RCC_MCO1SOURCE_HSI  HSI clock selected as MCO source

+  *            @arg @ref RCC_MCO1SOURCE_HSE  HSE clock selected as MCO sourcee

+  *            @arg @ref RCC_MCO1SOURCE_PLLCLK  main PLL clock selected as MCO source

+  *            @arg @ref RCC_MCO1SOURCE_LSI  LSI clock selected as MCO source

+  *            @arg @ref RCC_MCO1SOURCE_LSE  LSE clock selected as MCO source

+  @if STM32L443xx

+  *            @arg @ref RCC_MCO1SOURCE_HSI48  HSI48 clock selected as MCO source for devices with HSI48

+  @endif

+  * @param  RCC_MCODiv  specifies the MCO prescaler.

+  *          This parameter can be one of the following values:

+  *            @arg @ref RCC_MCODIV_1  no division applied to MCO clock

+  *            @arg @ref RCC_MCODIV_2  division by 2 applied to MCO clock

+  *            @arg @ref RCC_MCODIV_4  division by 4 applied to MCO clock

+  *            @arg @ref RCC_MCODIV_8  division by 8 applied to MCO clock

+  *            @arg @ref RCC_MCODIV_16  division by 16 applied to MCO clock

+  * @retval None

+  */

+void HAL_RCC_MCOConfig( uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv)

+{

+  GPIO_InitTypeDef GPIO_InitStruct;

+

+  /* Check the parameters */

+  assert_param(IS_RCC_MCO(RCC_MCOx));

+  assert_param(IS_RCC_MCODIV(RCC_MCODiv));

+  assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource));

+

+  /* Prevent unused argument(s) compilation warning if no assert_param check */

+  UNUSED(RCC_MCOx);

+

+  /* MCO Clock Enable */

+  __MCO1_CLK_ENABLE();

+

+  /* Configue the MCO1 pin in alternate function mode */

+  GPIO_InitStruct.Pin = MCO1_PIN;

+  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

+  GPIO_InitStruct.Pull = GPIO_NOPULL;

+  GPIO_InitStruct.Alternate = GPIO_AF0_MCO;

+  HAL_GPIO_Init(MCO1_GPIO_PORT, &GPIO_InitStruct);

+

+  /* Mask MCOSEL[] and MCOPRE[] bits then set MCO1 clock source and prescaler */

+  MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCOSEL | RCC_CFGR_MCOPRE), (RCC_MCOSource | RCC_MCODiv ));

+}

+

+/**

+  * @brief  Return the SYSCLK frequency.

+  *

+  * @note   The system frequency computed by this function is not the real

+  *         frequency in the chip. It is calculated based on the predefined

+  *         constant and the selected clock source:

+  * @note     If SYSCLK source is MSI, function returns values based on MSI

+  *             Value as defined by the MSI range.

+  * @note     If SYSCLK source is HSI, function returns values based on HSI_VALUE(*)

+  * @note     If SYSCLK source is HSE, function returns values based on HSE_VALUE(**)

+  * @note     If SYSCLK source is PLL, function returns values based on HSE_VALUE(**),

+  *           HSI_VALUE(*) or MSI Value multiplied/divided by the PLL factors.

+  * @note     (*) HSI_VALUE is a constant defined in stm32l4xx_hal_conf.h file (default value

+  *               16 MHz) but the real value may vary depending on the variations

+  *               in voltage and temperature.

+  * @note     (**) HSE_VALUE is a constant defined in stm32l4xx_hal_conf.h file (default value

+  *                8 MHz), user has to ensure that HSE_VALUE is same as the real

+  *                frequency of the crystal used. Otherwise, this function may

+  *                have wrong result.

+  *

+  * @note   The result of this function could be not correct when using fractional

+  *         value for HSE crystal.

+  *

+  * @note   This function can be used by the user application to compute the

+  *         baudrate for the communication peripherals or configure other parameters.

+  *

+  * @note   Each time SYSCLK changes, this function must be called to update the

+  *         right SYSCLK value. Otherwise, any configuration based on this function will be incorrect.

+  *

+  *

+  * @retval SYSCLK frequency

+  */

+uint32_t HAL_RCC_GetSysClockFreq(void)

+{

+  uint32_t msirange = 0U, sysclockfreq = 0U;

+  uint32_t pllvco, pllsource, pllr, pllm;    /* no init needed */

+  uint32_t sysclk_source, pll_oscsource;

+

+  sysclk_source = __HAL_RCC_GET_SYSCLK_SOURCE();

+  pll_oscsource = __HAL_RCC_GET_PLL_OSCSOURCE();

+

+  if((sysclk_source == RCC_CFGR_SWS_MSI) ||

+     ((sysclk_source == RCC_CFGR_SWS_PLL) && (pll_oscsource == RCC_PLLSOURCE_MSI)))

+  {

+    /* MSI or PLL with MSI source used as system clock source */

+

+    /* Get SYSCLK source */

+    if(READ_BIT(RCC->CR, RCC_CR_MSIRGSEL) == 0U)

+    { /* MSISRANGE from RCC_CSR applies */

+      msirange = READ_BIT(RCC->CSR, RCC_CSR_MSISRANGE) >> RCC_CSR_MSISRANGE_Pos;

+    }

+    else

+    { /* MSIRANGE from RCC_CR applies */

+      msirange = READ_BIT(RCC->CR, RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos;

+    }

+    /*MSI frequency range in HZ*/

+    msirange = MSIRangeTable[msirange];

+

+    if(sysclk_source == RCC_CFGR_SWS_MSI)

+    {

+      /* MSI used as system clock source */

+      sysclockfreq = msirange;

+    }

+  }

+  else if(sysclk_source == RCC_CFGR_SWS_HSI)

+  {

+    /* HSI used as system clock source */

+    sysclockfreq = HSI_VALUE;

+  }

+  else if(sysclk_source == RCC_CFGR_SWS_HSE)

+  {

+    /* HSE used as system clock source */

+    sysclockfreq = HSE_VALUE;

+  }

+  else

+  {

+    /* unexpected case: sysclockfreq at 0 */

+  }

+

+  if(sysclk_source == RCC_CFGR_SWS_PLL)

+  {

+    /* PLL used as system clock  source */

+

+    /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE) * PLLN / PLLM

+    SYSCLK = PLL_VCO / PLLR

+    */

+    pllsource = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC);

+

+    switch (pllsource)

+    {

+    case RCC_PLLSOURCE_HSI:  /* HSI used as PLL clock source */

+      pllvco = HSI_VALUE;

+      break;

+

+    case RCC_PLLSOURCE_HSE:  /* HSE used as PLL clock source */

+      pllvco = HSE_VALUE;

+      break;

+

+    case RCC_PLLSOURCE_MSI:  /* MSI used as PLL clock source */

+    default:

+      pllvco = msirange;

+      break;

+    }

+    pllm = (READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U ;

+    pllvco = (pllvco * (READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)) / pllm;

+    pllr = ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1U ) * 2U;

+    sysclockfreq = pllvco / pllr;

+  }

+

+  return sysclockfreq;

+}

+

+/**

+  * @brief  Return the HCLK frequency.

+  * @note   Each time HCLK changes, this function must be called to update the

+  *         right HCLK value. Otherwise, any configuration based on this function will be incorrect.

+  *

+  * @note   The SystemCoreClock CMSIS variable is used to store System Clock Frequency.

+  * @retval HCLK frequency in Hz

+  */

+uint32_t HAL_RCC_GetHCLKFreq(void)

+{

+  return SystemCoreClock;

+}

+

+/**

+  * @brief  Return the PCLK1 frequency.

+  * @note   Each time PCLK1 changes, this function must be called to update the

+  *         right PCLK1 value. Otherwise, any configuration based on this function will be incorrect.

+  * @retval PCLK1 frequency in Hz

+  */

+uint32_t HAL_RCC_GetPCLK1Freq(void)

+{

+  /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/

+  return (HAL_RCC_GetHCLKFreq() >> (APBPrescTable[READ_BIT(RCC->CFGR, RCC_CFGR_PPRE1) >> RCC_CFGR_PPRE1_Pos] & 0x1FU));

+}

+

+/**

+  * @brief  Return the PCLK2 frequency.

+  * @note   Each time PCLK2 changes, this function must be called to update the

+  *         right PCLK2 value. Otherwise, any configuration based on this function will be incorrect.

+  * @retval PCLK2 frequency in Hz

+  */

+uint32_t HAL_RCC_GetPCLK2Freq(void)

+{

+  /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/

+  return (HAL_RCC_GetHCLKFreq()>> (APBPrescTable[READ_BIT(RCC->CFGR, RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos] & 0x1FU));

+}

+

+/**

+  * @brief  Configure the RCC_OscInitStruct according to the internal

+  *         RCC configuration registers.

+  * @param  RCC_OscInitStruct  pointer to an RCC_OscInitTypeDef structure that

+  *         will be configured.

+  * @retval None

+  */

+void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef  *RCC_OscInitStruct)

+{

+  /* Check the parameters */

+  assert_param(RCC_OscInitStruct != (void *)NULL);

+

+  /* Set all possible values for the Oscillator type parameter ---------------*/

+#if defined(RCC_HSI48_SUPPORT)

+  RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_MSI | \

+                                      RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_HSI48;

+#else

+  RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_MSI | \

+                                      RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI;

+#endif /* RCC_HSI48_SUPPORT */

+

+  /* Get the HSE configuration -----------------------------------------------*/

+  if(READ_BIT(RCC->CR, RCC_CR_HSEBYP) == RCC_CR_HSEBYP)

+  {

+    RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS;

+  }

+  else if(READ_BIT(RCC->CR, RCC_CR_HSEON) == RCC_CR_HSEON)

+  {

+    RCC_OscInitStruct->HSEState = RCC_HSE_ON;

+  }

+  else

+  {

+    RCC_OscInitStruct->HSEState = RCC_HSE_OFF;

+  }

+

+   /* Get the MSI configuration -----------------------------------------------*/

+  if(READ_BIT(RCC->CR, RCC_CR_MSION) == RCC_CR_MSION)

+  {

+    RCC_OscInitStruct->MSIState = RCC_MSI_ON;

+  }

+  else

+  {

+    RCC_OscInitStruct->MSIState = RCC_MSI_OFF;

+  }

+

+  RCC_OscInitStruct->MSICalibrationValue = READ_BIT(RCC->ICSCR, RCC_ICSCR_MSITRIM) >> RCC_ICSCR_MSITRIM_Pos;

+  RCC_OscInitStruct->MSIClockRange = READ_BIT(RCC->CR, RCC_CR_MSIRANGE);

+

+  /* Get the HSI configuration -----------------------------------------------*/

+  if(READ_BIT(RCC->CR, RCC_CR_HSION) == RCC_CR_HSION)

+  {

+    RCC_OscInitStruct->HSIState = RCC_HSI_ON;

+  }

+  else

+  {

+    RCC_OscInitStruct->HSIState = RCC_HSI_OFF;

+  }

+

+  RCC_OscInitStruct->HSICalibrationValue = READ_BIT(RCC->ICSCR, RCC_ICSCR_HSITRIM) >> RCC_ICSCR_HSITRIM_Pos;

+

+  /* Get the LSE configuration -----------------------------------------------*/

+  if(READ_BIT(RCC->BDCR, RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP)

+  {

+#if defined(RCC_BDCR_LSESYSDIS)

+    if((RCC->BDCR & RCC_BDCR_LSESYSDIS) == RCC_BDCR_LSESYSDIS)

+    {

+      RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS_RTC_ONLY;

+    }

+    else

+#endif /* RCC_BDCR_LSESYSDIS */

+    {

+      RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS;

+    }

+  }

+  else if(READ_BIT(RCC->BDCR, RCC_BDCR_LSEON) == RCC_BDCR_LSEON)

+  {

+#if defined(RCC_BDCR_LSESYSDIS)

+    if((RCC->BDCR & RCC_BDCR_LSESYSDIS) == RCC_BDCR_LSESYSDIS)

+    {

+      RCC_OscInitStruct->LSEState = RCC_LSE_ON_RTC_ONLY;

+    }

+    else

+#endif /* RCC_BDCR_LSESYSDIS */

+    {

+      RCC_OscInitStruct->LSEState = RCC_LSE_ON;

+    }

+  }

+  else

+  {

+    RCC_OscInitStruct->LSEState = RCC_LSE_OFF;

+  }

+

+  /* Get the LSI configuration -----------------------------------------------*/

+  if(READ_BIT(RCC->CSR, RCC_CSR_LSION) == RCC_CSR_LSION)

+  {

+    RCC_OscInitStruct->LSIState = RCC_LSI_ON;

+  }

+  else

+  {

+    RCC_OscInitStruct->LSIState = RCC_LSI_OFF;

+  }

+#if defined(RCC_CSR_LSIPREDIV)

+

+  /* Get the LSI configuration -----------------------------------------------*/

+  if((RCC->CSR & RCC_CSR_LSIPREDIV) == RCC_CSR_LSIPREDIV)

+  {

+    RCC_OscInitStruct->LSIDiv = RCC_LSI_DIV128;

+  }

+  else

+  {

+    RCC_OscInitStruct->LSIDiv = RCC_LSI_DIV1;

+  }

+#endif /* RCC_CSR_LSIPREDIV */

+

+#if defined(RCC_HSI48_SUPPORT)

+  /* Get the HSI48 configuration ---------------------------------------------*/

+  if(READ_BIT(RCC->CRRCR, RCC_CRRCR_HSI48ON) == RCC_CRRCR_HSI48ON)

+  {

+    RCC_OscInitStruct->HSI48State = RCC_HSI48_ON;

+  }

+  else

+  {

+    RCC_OscInitStruct->HSI48State = RCC_HSI48_OFF;

+  }

+#else

+  RCC_OscInitStruct->HSI48State = RCC_HSI48_OFF;

+#endif /* RCC_HSI48_SUPPORT */

+

+  /* Get the PLL configuration -----------------------------------------------*/

+  if(READ_BIT(RCC->CR, RCC_CR_PLLON) == RCC_CR_PLLON)

+  {

+    RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON;

+  }

+  else

+  {

+    RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF;

+  }

+  RCC_OscInitStruct->PLL.PLLSource = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC);

+  RCC_OscInitStruct->PLL.PLLM = (READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U;

+  RCC_OscInitStruct->PLL.PLLN = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos;

+  RCC_OscInitStruct->PLL.PLLQ = (((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos) + 1U) << 1U);

+  RCC_OscInitStruct->PLL.PLLR = (((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1U) << 1U);

+#if defined(RCC_PLLP_SUPPORT)

+#if defined(RCC_PLLP_DIV_2_31_SUPPORT)

+  RCC_OscInitStruct->PLL.PLLP = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLPDIV) >> RCC_PLLCFGR_PLLPDIV_Pos;

+#else

+  if(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLP) != 0U)

+  {

+    RCC_OscInitStruct->PLL.PLLP = RCC_PLLP_DIV17;

+  }

+  else

+  {

+    RCC_OscInitStruct->PLL.PLLP = RCC_PLLP_DIV7;

+  }

+#endif /* RCC_PLLP_DIV_2_31_SUPPORT */

+#endif /* RCC_PLLP_SUPPORT */

+}

+

+/**

+  * @brief  Configure the RCC_ClkInitStruct according to the internal

+  *         RCC configuration registers.

+  * @param  RCC_ClkInitStruct  pointer to an RCC_ClkInitTypeDef structure that

+  *         will be configured.

+  * @param  pFLatency  Pointer on the Flash Latency.

+  * @retval None

+  */

+void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef  *RCC_ClkInitStruct, uint32_t *pFLatency)

+{

+  /* Check the parameters */

+  assert_param(RCC_ClkInitStruct != (void  *)NULL);

+  assert_param(pFLatency != (void *)NULL);

+

+  /* Set all possible values for the Clock type parameter --------------------*/

+  RCC_ClkInitStruct->ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;

+

+  /* Get the SYSCLK configuration --------------------------------------------*/

+  RCC_ClkInitStruct->SYSCLKSource = READ_BIT(RCC->CFGR, RCC_CFGR_SW);

+

+  /* Get the HCLK configuration ----------------------------------------------*/

+  RCC_ClkInitStruct->AHBCLKDivider = READ_BIT(RCC->CFGR, RCC_CFGR_HPRE);

+

+  /* Get the APB1 configuration ----------------------------------------------*/

+  RCC_ClkInitStruct->APB1CLKDivider = READ_BIT(RCC->CFGR, RCC_CFGR_PPRE1);

+

+  /* Get the APB2 configuration ----------------------------------------------*/

+  RCC_ClkInitStruct->APB2CLKDivider = (READ_BIT(RCC->CFGR, RCC_CFGR_PPRE2) >> 3U);

+

+  /* Get the Flash Wait State (Latency) configuration ------------------------*/

+  *pFLatency = __HAL_FLASH_GET_LATENCY();

+}

+

+/**

+  * @brief  Enable the Clock Security System.

+  * @note   If a failure is detected on the HSE oscillator clock, this oscillator

+  *         is automatically disabled and an interrupt is generated to inform the

+  *         software about the failure (Clock Security System Interrupt, CSSI),

+  *         allowing the MCU to perform rescue operations. The CSSI is linked to

+  *         the Cortex-M4 NMI (Non-Maskable Interrupt) exception vector.

+  * @note   The Clock Security System can only be cleared by reset.

+  * @retval None

+  */

+void HAL_RCC_EnableCSS(void)

+{

+  SET_BIT(RCC->CR, RCC_CR_CSSON) ;

+}

+

+/**

+  * @brief Handle the RCC Clock Security System interrupt request.

+  * @note This API should be called under the NMI_Handler().

+  * @retval None

+  */

+void HAL_RCC_NMI_IRQHandler(void)

+{

+  /* Check RCC CSSF interrupt flag  */

+  if(__HAL_RCC_GET_IT(RCC_IT_CSS))

+  {

+    /* RCC Clock Security System interrupt user callback */

+    HAL_RCC_CSSCallback();

+

+    /* Clear RCC CSS pending bit */

+    __HAL_RCC_CLEAR_IT(RCC_IT_CSS);

+  }

+}

+

+/**

+  * @brief  RCC Clock Security System interrupt callback.

+  * @retval none

+  */

+__weak void HAL_RCC_CSSCallback(void)

+{

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_RCC_CSSCallback should be implemented in the user file

+   */

+}

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Private function prototypes -----------------------------------------------*/

+/** @addtogroup RCC_Private_Functions

+  * @{

+  */

+/**

+  * @brief  Update number of Flash wait states in line with MSI range and current

+            voltage range.

+  * @param  msirange  MSI range value from RCC_MSIRANGE_0 to RCC_MSIRANGE_11

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef RCC_SetFlashLatencyFromMSIRange(uint32_t msirange)

+{

+  uint32_t vos;

+  uint32_t latency = FLASH_LATENCY_0;  /* default value 0WS */

+

+  if(__HAL_RCC_PWR_IS_CLK_ENABLED())

+  {

+    vos = HAL_PWREx_GetVoltageRange();

+  }

+  else

+  {

+    __HAL_RCC_PWR_CLK_ENABLE();

+    vos = HAL_PWREx_GetVoltageRange();

+    __HAL_RCC_PWR_CLK_DISABLE();

+  }

+

+  if(vos == PWR_REGULATOR_VOLTAGE_SCALE1)

+  {

+    if(msirange > RCC_MSIRANGE_8)

+    {

+      /* MSI > 16Mhz */

+      if(msirange > RCC_MSIRANGE_10)

+      {

+        /* MSI 48Mhz */

+        latency = FLASH_LATENCY_2; /* 2WS */

+      }

+      else

+      {

+        /* MSI 24Mhz or 32Mhz */

+        latency = FLASH_LATENCY_1; /* 1WS */

+      }

+    }

+    /* else MSI <= 16Mhz default FLASH_LATENCY_0 0WS */

+  }

+  else

+  {

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+    if(msirange >= RCC_MSIRANGE_8)

+    {

+      /* MSI >= 16Mhz */

+      latency = FLASH_LATENCY_2; /* 2WS */

+    }

+    else

+    {

+      if(msirange == RCC_MSIRANGE_7)

+      {

+        /* MSI 8Mhz */

+        latency = FLASH_LATENCY_1; /* 1WS */

+      }

+      /* else MSI < 8Mhz default FLASH_LATENCY_0 0WS */

+    }

+#else

+    if(msirange > RCC_MSIRANGE_8)

+    {

+      /* MSI > 16Mhz */

+      latency = FLASH_LATENCY_3; /* 3WS */

+    }

+    else

+    {

+      if(msirange == RCC_MSIRANGE_8)

+      {

+        /* MSI 16Mhz */

+        latency = FLASH_LATENCY_2; /* 2WS */

+      }

+      else if(msirange == RCC_MSIRANGE_7)

+      {

+        /* MSI 8Mhz */

+        latency = FLASH_LATENCY_1; /* 1WS */

+      }

+      /* else MSI < 8Mhz default FLASH_LATENCY_0 0WS */

+    }

+#endif

+  }

+

+  __HAL_FLASH_SET_LATENCY(latency);

+

+  /* Check that the new number of wait states is taken into account to access the Flash

+     memory by reading the FLASH_ACR register */

+  if(__HAL_FLASH_GET_LATENCY() != latency)

+  {

+    return HAL_ERROR;

+  }

+

+  return HAL_OK;

+}

+

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+/**

+  * @brief  Compute SYSCLK frequency based on PLL SYSCLK source.

+  * @retval SYSCLK frequency

+  */

+static uint32_t RCC_GetSysClockFreqFromPLLSource(void)

+{

+  uint32_t msirange = 0U;

+  uint32_t pllvco, pllsource, pllr, pllm, sysclockfreq;  /* no init needed */

+

+  if(__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_MSI)

+  {

+    /* Get MSI range source */

+    if(READ_BIT(RCC->CR, RCC_CR_MSIRGSEL) == 0U)

+    { /* MSISRANGE from RCC_CSR applies */

+      msirange = READ_BIT(RCC->CSR, RCC_CSR_MSISRANGE) >> RCC_CSR_MSISRANGE_Pos;

+    }

+    else

+    { /* MSIRANGE from RCC_CR applies */

+      msirange = READ_BIT(RCC->CR, RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos;

+    }

+    /*MSI frequency range in HZ*/

+    msirange = MSIRangeTable[msirange];

+  }

+

+  /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE) * PLLN / PLLM

+     SYSCLK = PLL_VCO / PLLR

+   */

+  pllsource = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC);

+

+  switch (pllsource)

+  {

+  case RCC_PLLSOURCE_HSI:  /* HSI used as PLL clock source */

+    pllvco = HSI_VALUE;

+    break;

+

+  case RCC_PLLSOURCE_HSE:  /* HSE used as PLL clock source */

+    pllvco = HSE_VALUE;

+    break;

+

+  case RCC_PLLSOURCE_MSI:  /* MSI used as PLL clock source */

+  default:

+    pllvco = msirange;

+    break;

+  }

+  pllm = (READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U ;

+  pllvco = (pllvco * (READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)) / pllm;

+  pllr = ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1U ) * 2U;

+  sysclockfreq = pllvco / pllr;

+

+  return sysclockfreq;

+}

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+/**

+  * @}

+  */

+

+#endif /* HAL_RCC_MODULE_ENABLED */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c
new file mode 100644
index 0000000..2dc8462
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c
@@ -0,0 +1,3538 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_rcc_ex.c

+  * @author  MCD Application Team

+  * @brief   Extended RCC HAL module driver.

+  *          This file provides firmware functions to manage the following

+  *          functionalities RCC extended peripheral:

+  *           + Extended Peripheral Control functions

+  *           + Extended Clock management functions

+  *           + Extended Clock Recovery System Control functions

+  *

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup RCCEx RCCEx

+  * @brief RCC Extended HAL module driver

+  * @{

+  */

+

+#ifdef HAL_RCC_MODULE_ENABLED

+

+/* Private typedef -----------------------------------------------------------*/

+/* Private defines -----------------------------------------------------------*/

+/** @defgroup RCCEx_Private_Constants RCCEx Private Constants

+ * @{

+ */

+#define PLLSAI1_TIMEOUT_VALUE     2U    /* 2 ms (minimum Tick + 1) */

+#define PLLSAI2_TIMEOUT_VALUE     2U    /* 2 ms (minimum Tick + 1) */

+#define PLL_TIMEOUT_VALUE         2U    /* 2 ms (minimum Tick + 1) */

+

+#define DIVIDER_P_UPDATE          0U

+#define DIVIDER_Q_UPDATE          1U

+#define DIVIDER_R_UPDATE          2U

+

+#define __LSCO_CLK_ENABLE()       __HAL_RCC_GPIOA_CLK_ENABLE()

+#define LSCO_GPIO_PORT            GPIOA

+#define LSCO_PIN                  GPIO_PIN_2

+/**

+  * @}

+  */

+

+/* Private macros ------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/* Private function prototypes -----------------------------------------------*/

+/** @defgroup RCCEx_Private_Functions RCCEx Private Functions

+ * @{

+ */

+#if defined(RCC_PLLSAI1_SUPPORT)

+

+static HAL_StatusTypeDef RCCEx_PLLSAI1_Config(RCC_PLLSAI1InitTypeDef *PllSai1, uint32_t Divider);

+

+#endif /* RCC_PLLSAI1_SUPPORT */

+

+#if defined(RCC_PLLSAI2_SUPPORT)

+

+static HAL_StatusTypeDef RCCEx_PLLSAI2_Config(RCC_PLLSAI2InitTypeDef *PllSai2, uint32_t Divider);

+

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+#if defined(SAI1)

+

+static uint32_t RCCEx_GetSAIxPeriphCLKFreq(uint32_t PeriphClk, uint32_t InputFrequency);

+

+#endif /* SAI1 */

+/**

+  * @}

+  */

+

+/* Exported functions --------------------------------------------------------*/

+

+/** @defgroup RCCEx_Exported_Functions RCCEx Exported Functions

+  * @{

+  */

+

+/** @defgroup RCCEx_Exported_Functions_Group1 Extended Peripheral Control functions

+ *  @brief  Extended Peripheral Control functions

+ *

+@verbatim

+ ===============================================================================

+                ##### Extended Peripheral Control functions  #####

+ ===============================================================================

+    [..]

+    This subsection provides a set of functions allowing to control the RCC Clocks

+    frequencies.

+    [..]

+    (@) Important note: Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to

+        select the RTC clock source; in this case the Backup domain will be reset in

+        order to modify the RTC Clock source, as consequence RTC registers (including

+        the backup registers) are set to their reset values.

+

+@endverbatim

+  * @{

+  */

+/**

+  * @brief  Initialize the RCC extended peripherals clocks according to the specified

+  *         parameters in the RCC_PeriphCLKInitTypeDef.

+  * @param  PeriphClkInit  pointer to an RCC_PeriphCLKInitTypeDef structure that

+  *         contains a field PeriphClockSelection which can be a combination of the following values:

+  *            @arg @ref RCC_PERIPHCLK_RTC  RTC peripheral clock

+  *            @arg @ref RCC_PERIPHCLK_ADC  ADC peripheral clock

+  @if STM32L462xx

+  *            @arg @ref RCC_PERIPHCLK_DFSDM1  DFSDM1 peripheral clock (only for devices with DFSDM1)

+  @endif

+  @if STM32L486xx

+  *            @arg @ref RCC_PERIPHCLK_DFSDM1  DFSDM1 peripheral clock (only for devices with DFSDM1)

+  @endif

+  @if STM32L4A6xx

+  *            @arg @ref RCC_PERIPHCLK_DFSDM1  DFSDM1 peripheral clock (only for devices with DFSDM1)

+  @endif

+  *            @arg @ref RCC_PERIPHCLK_I2C1  I2C1 peripheral clock

+  *            @arg @ref RCC_PERIPHCLK_I2C2  I2C2 peripheral clock

+  *            @arg @ref RCC_PERIPHCLK_I2C3  I2C3 peripheral clock

+  @if STM32L462xx

+  *            @arg @ref RCC_PERIPHCLK_I2C4  I2C4 peripheral clock (only for devices with I2C4)

+  @endif

+  @if STM32L4A6xx

+  *            @arg @ref RCC_PERIPHCLK_I2C4  I2C4 peripheral clock (only for devices with I2C4)

+  @endif

+  @if STM32L4S9xx

+  *            @arg @ref RCC_PERIPHCLK_I2C4  I2C4 peripheral clock (only for devices with I2C4)

+  @endif

+  *            @arg @ref RCC_PERIPHCLK_LPTIM1  LPTIM1 peripheral clock

+  *            @arg @ref RCC_PERIPHCLK_LPTIM2  LPTIM2 peripheral clock

+  *            @arg @ref RCC_PERIPHCLK_LPUART1  LPUART1 peripheral clock

+  *            @arg @ref RCC_PERIPHCLK_RNG  RNG peripheral clock

+  *            @arg @ref RCC_PERIPHCLK_SAI1  SAI1 peripheral clock (only for devices with SAI1)

+  @if STM32L486xx

+  *            @arg @ref RCC_PERIPHCLK_SAI2  SAI2 peripheral clock (only for devices with SAI2)

+  @endif

+  @if STM32L4A6xx

+  *            @arg @ref RCC_PERIPHCLK_SAI2  SAI2 peripheral clock (only for devices with SAI2)

+  @endif

+  @if STM32L4S9xx

+  *            @arg @ref RCC_PERIPHCLK_SAI2  SAI2 peripheral clock (only for devices with SAI2)

+  @endif

+  *            @arg @ref RCC_PERIPHCLK_SDMMC1  SDMMC1 peripheral clock

+  @if STM32L443xx

+  *            @arg @ref RCC_PERIPHCLK_SWPMI1  SWPMI1 peripheral clock (only for devices with SWPMI1)

+  @endif

+  @if STM32L486xx

+  *            @arg @ref RCC_PERIPHCLK_SWPMI1  SWPMI1 peripheral clock (only for devices with SWPMI1)

+  @endif

+  @if STM32L4A6xx

+  *            @arg @ref RCC_PERIPHCLK_SWPMI1  SWPMI1 peripheral clock (only for devices with SWPMI1)

+  @endif

+  *            @arg @ref RCC_PERIPHCLK_USART1  USART1 peripheral clock

+  *            @arg @ref RCC_PERIPHCLK_USART2  USART1 peripheral clock

+  *            @arg @ref RCC_PERIPHCLK_USART3  USART1 peripheral clock

+  @if STM32L462xx

+  *            @arg @ref RCC_PERIPHCLK_UART4  USART1 peripheral clock (only for devices with UART4)

+  @endif

+  @if STM32L486xx

+  *            @arg @ref RCC_PERIPHCLK_UART4  USART1 peripheral clock (only for devices with UART4)

+  *            @arg @ref RCC_PERIPHCLK_UART5  USART1 peripheral clock (only for devices with UART5)

+  *            @arg @ref RCC_PERIPHCLK_USB  USB peripheral clock (only for devices with USB)

+  @endif

+  @if STM32L4A6xx

+  *            @arg @ref RCC_PERIPHCLK_UART4  USART1 peripheral clock (only for devices with UART4)

+  *            @arg @ref RCC_PERIPHCLK_UART5  USART1 peripheral clock (only for devices with UART5)

+  *            @arg @ref RCC_PERIPHCLK_USB  USB peripheral clock (only for devices with USB)

+  @endif

+  @if STM32L4S9xx

+  *            @arg @ref RCC_PERIPHCLK_UART4  USART1 peripheral clock (only for devices with UART4)

+  *            @arg @ref RCC_PERIPHCLK_UART5  USART1 peripheral clock (only for devices with UART5)

+  *            @arg @ref RCC_PERIPHCLK_USB  USB peripheral clock (only for devices with USB)

+  *            @arg @ref RCC_PERIPHCLK_DFSDM1  DFSDM1 peripheral kernel clock (only for devices with DFSDM1)

+  *            @arg @ref RCC_PERIPHCLK_DFSDM1AUDIO  DFSDM1 peripheral audio clock (only for devices with DFSDM1)

+  *            @arg @ref RCC_PERIPHCLK_LTDC  LTDC peripheral clock (only for devices with LTDC)

+  *            @arg @ref RCC_PERIPHCLK_DSI  DSI peripheral clock (only for devices with DSI)

+  *            @arg @ref RCC_PERIPHCLK_OSPI  OctoSPI peripheral clock (only for devices with OctoSPI)

+  @endif

+  *

+  * @note   Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select

+  *         the RTC clock source: in this case the access to Backup domain is enabled.

+  *

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef  *PeriphClkInit)

+{

+  uint32_t tmpregister, tickstart;     /* no init needed */

+  HAL_StatusTypeDef ret = HAL_OK;      /* Intermediate status */

+  HAL_StatusTypeDef status = HAL_OK;   /* Final status */

+

+  /* Check the parameters */

+  assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection));

+

+#if defined(SAI1)

+

+  /*-------------------------- SAI1 clock source configuration ---------------------*/

+  if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1))

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_SAI1CLK(PeriphClkInit->Sai1ClockSelection));

+

+    switch(PeriphClkInit->Sai1ClockSelection)

+    {

+    case RCC_SAI1CLKSOURCE_PLL:      /* PLL is used as clock source for SAI1*/

+      /* Enable SAI Clock output generated form System PLL . */

+#if defined(RCC_PLLSAI2_SUPPORT)

+      __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL_SAI3CLK);

+#else

+      __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL_SAI2CLK);

+#endif /* RCC_PLLSAI2_SUPPORT */

+      /* SAI1 clock source config set later after clock selection check */

+      break;

+

+    case RCC_SAI1CLKSOURCE_PLLSAI1:  /* PLLSAI1 is used as clock source for SAI1*/

+      /* PLLSAI1 input clock, parameters M, N & P configuration and clock output (PLLSAI1ClockOut) */

+      ret = RCCEx_PLLSAI1_Config(&(PeriphClkInit->PLLSAI1), DIVIDER_P_UPDATE);

+      /* SAI1 clock source config set later after clock selection check */

+      break;

+

+#if defined(RCC_PLLSAI2_SUPPORT)

+

+    case RCC_SAI1CLKSOURCE_PLLSAI2:  /* PLLSAI2 is used as clock source for SAI1*/

+      /* PLLSAI2 input clock, parameters M, N & P configuration clock output (PLLSAI2ClockOut) */

+      ret = RCCEx_PLLSAI2_Config(&(PeriphClkInit->PLLSAI2), DIVIDER_P_UPDATE);

+      /* SAI1 clock source config set later after clock selection check */

+      break;

+

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+    case RCC_SAI1CLKSOURCE_PIN:      /* External clock is used as source of SAI1 clock*/

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+    case RCC_SAI1CLKSOURCE_HSI:      /* HSI is used as source of SAI1 clock*/

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+      /* SAI1 clock source config set later after clock selection check */

+      break;

+

+    default:

+      ret = HAL_ERROR;

+      break;

+    }

+

+    if(ret == HAL_OK)

+    {

+      /* Set the source of SAI1 clock*/

+      __HAL_RCC_SAI1_CONFIG(PeriphClkInit->Sai1ClockSelection);

+    }

+    else

+    {

+      /* set overall return value */

+      status = ret;

+    }

+  }

+

+#endif /* SAI1 */

+

+#if defined(SAI2)

+

+  /*-------------------------- SAI2 clock source configuration ---------------------*/

+  if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2))

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_SAI2CLK(PeriphClkInit->Sai2ClockSelection));

+

+    switch(PeriphClkInit->Sai2ClockSelection)

+    {

+    case RCC_SAI2CLKSOURCE_PLL:      /* PLL is used as clock source for SAI2*/

+      /* Enable SAI Clock output generated form System PLL . */

+      __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL_SAI3CLK);

+      /* SAI2 clock source config set later after clock selection check */

+      break;

+

+    case RCC_SAI2CLKSOURCE_PLLSAI1: /* PLLSAI1 is used as clock source for SAI2*/

+      /* PLLSAI1 input clock, parameters M, N & P configuration and clock output (PLLSAI1ClockOut) */

+      ret = RCCEx_PLLSAI1_Config(&(PeriphClkInit->PLLSAI1), DIVIDER_P_UPDATE);

+      /* SAI2 clock source config set later after clock selection check */

+      break;

+

+    case RCC_SAI2CLKSOURCE_PLLSAI2:  /* PLLSAI2 is used as clock source for SAI2*/

+      /* PLLSAI2 input clock, parameters M, N & P configuration and clock output (PLLSAI2ClockOut) */

+      ret = RCCEx_PLLSAI2_Config(&(PeriphClkInit->PLLSAI2), DIVIDER_P_UPDATE);

+      /* SAI2 clock source config set later after clock selection check */

+      break;

+

+    case RCC_SAI2CLKSOURCE_PIN:      /* External clock is used as source of SAI2 clock*/

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+    case RCC_SAI2CLKSOURCE_HSI:      /* HSI is used as source of SAI2 clock*/

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+      /* SAI2 clock source config set later after clock selection check */

+      break;

+

+    default:

+      ret = HAL_ERROR;

+      break;

+    }

+

+    if(ret == HAL_OK)

+    {

+      /* Set the source of SAI2 clock*/

+      __HAL_RCC_SAI2_CONFIG(PeriphClkInit->Sai2ClockSelection);

+    }

+    else

+    {

+      /* set overall return value */

+      status = ret;

+    }

+  }

+#endif /* SAI2 */

+

+  /*-------------------------- RTC clock source configuration ----------------------*/

+  if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_RTC) == RCC_PERIPHCLK_RTC)

+  {

+    FlagStatus       pwrclkchanged = RESET;

+

+    /* Check for RTC Parameters used to output RTCCLK */

+    assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection));

+

+    /* Enable Power Clock */

+    if(__HAL_RCC_PWR_IS_CLK_DISABLED() != 0U)

+    {

+      __HAL_RCC_PWR_CLK_ENABLE();

+      pwrclkchanged = SET;

+    }

+

+    /* Enable write access to Backup domain */

+    SET_BIT(PWR->CR1, PWR_CR1_DBP);

+

+    /* Wait for Backup domain Write protection disable */

+    tickstart = HAL_GetTick();

+

+    while(READ_BIT(PWR->CR1, PWR_CR1_DBP) == 0U)

+    {

+      if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE)

+      {

+        ret = HAL_TIMEOUT;

+        break;

+      }

+    }

+

+    if(ret == HAL_OK)

+    {

+      /* Reset the Backup domain only if the RTC Clock source selection is modified from default */

+      tmpregister = READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL);

+

+      if((tmpregister != RCC_RTCCLKSOURCE_NONE) && (tmpregister != PeriphClkInit->RTCClockSelection))

+      {

+        /* Store the content of BDCR register before the reset of Backup Domain */

+        tmpregister = READ_BIT(RCC->BDCR, ~(RCC_BDCR_RTCSEL));

+        /* RTC Clock selection can be changed only if the Backup Domain is reset */

+        __HAL_RCC_BACKUPRESET_FORCE();

+        __HAL_RCC_BACKUPRESET_RELEASE();

+        /* Restore the Content of BDCR register */

+        RCC->BDCR = tmpregister;

+      }

+

+      /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */

+      if (HAL_IS_BIT_SET(tmpregister, RCC_BDCR_LSEON))

+      {

+        /* Get Start Tick*/

+        tickstart = HAL_GetTick();

+

+        /* Wait till LSE is ready */

+        while(READ_BIT(RCC->BDCR, RCC_BDCR_LSERDY) == 0U)

+        {

+          if((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE)

+          {

+            ret = HAL_TIMEOUT;

+            break;

+          }

+        }

+      }

+

+      if(ret == HAL_OK)

+      {

+        /* Apply new RTC clock source selection */

+        __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection);

+      }

+      else

+      {

+        /* set overall return value */

+        status = ret;

+      }

+    }

+    else

+    {

+      /* set overall return value */

+      status = ret;

+    }

+

+    /* Restore clock configuration if changed */

+    if(pwrclkchanged == SET)

+    {

+      __HAL_RCC_PWR_CLK_DISABLE();

+    }

+  }

+

+  /*-------------------------- USART1 clock source configuration -------------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART1) == RCC_PERIPHCLK_USART1)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_USART1CLKSOURCE(PeriphClkInit->Usart1ClockSelection));

+

+    /* Configure the USART1 clock source */

+    __HAL_RCC_USART1_CONFIG(PeriphClkInit->Usart1ClockSelection);

+  }

+

+  /*-------------------------- USART2 clock source configuration -------------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART2) == RCC_PERIPHCLK_USART2)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_USART2CLKSOURCE(PeriphClkInit->Usart2ClockSelection));

+

+    /* Configure the USART2 clock source */

+    __HAL_RCC_USART2_CONFIG(PeriphClkInit->Usart2ClockSelection);

+  }

+

+#if defined(USART3)

+

+  /*-------------------------- USART3 clock source configuration -------------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART3) == RCC_PERIPHCLK_USART3)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_USART3CLKSOURCE(PeriphClkInit->Usart3ClockSelection));

+

+    /* Configure the USART3 clock source */

+    __HAL_RCC_USART3_CONFIG(PeriphClkInit->Usart3ClockSelection);

+  }

+

+#endif /* USART3 */

+

+#if defined(UART4)

+

+  /*-------------------------- UART4 clock source configuration --------------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_UART4) == RCC_PERIPHCLK_UART4)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_UART4CLKSOURCE(PeriphClkInit->Uart4ClockSelection));

+

+    /* Configure the UART4 clock source */

+    __HAL_RCC_UART4_CONFIG(PeriphClkInit->Uart4ClockSelection);

+  }

+

+#endif /* UART4 */

+

+#if defined(UART5)

+

+  /*-------------------------- UART5 clock source configuration --------------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_UART5) == RCC_PERIPHCLK_UART5)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_UART5CLKSOURCE(PeriphClkInit->Uart5ClockSelection));

+

+    /* Configure the UART5 clock source */

+    __HAL_RCC_UART5_CONFIG(PeriphClkInit->Uart5ClockSelection);

+  }

+

+#endif /* UART5 */

+

+  /*-------------------------- LPUART1 clock source configuration ------------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPUART1) == RCC_PERIPHCLK_LPUART1)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_LPUART1CLKSOURCE(PeriphClkInit->Lpuart1ClockSelection));

+

+    /* Configure the LPUAR1 clock source */

+    __HAL_RCC_LPUART1_CONFIG(PeriphClkInit->Lpuart1ClockSelection);

+  }

+

+  /*-------------------------- LPTIM1 clock source configuration -------------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM1) == (RCC_PERIPHCLK_LPTIM1))

+  {

+    assert_param(IS_RCC_LPTIM1CLK(PeriphClkInit->Lptim1ClockSelection));

+    __HAL_RCC_LPTIM1_CONFIG(PeriphClkInit->Lptim1ClockSelection);

+  }

+

+  /*-------------------------- LPTIM2 clock source configuration -------------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LPTIM2) == (RCC_PERIPHCLK_LPTIM2))

+  {

+    assert_param(IS_RCC_LPTIM2CLK(PeriphClkInit->Lptim2ClockSelection));

+    __HAL_RCC_LPTIM2_CONFIG(PeriphClkInit->Lptim2ClockSelection);

+  }

+

+  /*-------------------------- I2C1 clock source configuration ---------------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C1) == RCC_PERIPHCLK_I2C1)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_I2C1CLKSOURCE(PeriphClkInit->I2c1ClockSelection));

+

+    /* Configure the I2C1 clock source */

+    __HAL_RCC_I2C1_CONFIG(PeriphClkInit->I2c1ClockSelection);

+  }

+

+#if defined(I2C2)

+

+  /*-------------------------- I2C2 clock source configuration ---------------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C2) == RCC_PERIPHCLK_I2C2)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_I2C2CLKSOURCE(PeriphClkInit->I2c2ClockSelection));

+

+    /* Configure the I2C2 clock source */

+    __HAL_RCC_I2C2_CONFIG(PeriphClkInit->I2c2ClockSelection);

+  }

+

+#endif /* I2C2 */

+

+  /*-------------------------- I2C3 clock source configuration ---------------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C3) == RCC_PERIPHCLK_I2C3)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_I2C3CLKSOURCE(PeriphClkInit->I2c3ClockSelection));

+

+    /* Configure the I2C3 clock source */

+    __HAL_RCC_I2C3_CONFIG(PeriphClkInit->I2c3ClockSelection);

+  }

+

+#if defined(I2C4)

+

+  /*-------------------------- I2C4 clock source configuration ---------------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C4) == RCC_PERIPHCLK_I2C4)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_I2C4CLKSOURCE(PeriphClkInit->I2c4ClockSelection));

+

+    /* Configure the I2C4 clock source */

+    __HAL_RCC_I2C4_CONFIG(PeriphClkInit->I2c4ClockSelection);

+  }

+

+#endif /* I2C4 */

+

+#if defined(USB_OTG_FS) || defined(USB)

+

+  /*-------------------------- USB clock source configuration ----------------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USB) == (RCC_PERIPHCLK_USB))

+  {

+    assert_param(IS_RCC_USBCLKSOURCE(PeriphClkInit->UsbClockSelection));

+    __HAL_RCC_USB_CONFIG(PeriphClkInit->UsbClockSelection);

+

+    if(PeriphClkInit->UsbClockSelection == RCC_USBCLKSOURCE_PLL)

+    {

+      /* Enable PLL48M1CLK output */

+      __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL_48M1CLK);

+    }

+    else

+    {

+#if defined(RCC_PLLSAI1_SUPPORT)

+      if(PeriphClkInit->UsbClockSelection == RCC_USBCLKSOURCE_PLLSAI1)

+      {

+        /* PLLSAI1 input clock, parameters M, N & Q configuration and clock output (PLLSAI1ClockOut) */

+        ret = RCCEx_PLLSAI1_Config(&(PeriphClkInit->PLLSAI1), DIVIDER_Q_UPDATE);

+

+        if(ret != HAL_OK)

+        {

+          /* set overall return value */

+          status = ret;

+        }

+      }

+#endif /* RCC_PLLSAI1_SUPPORT */

+    }

+  }

+

+#endif /* USB_OTG_FS || USB */

+

+#if defined(SDMMC1)

+

+  /*-------------------------- SDMMC1 clock source configuration -------------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDMMC1) == (RCC_PERIPHCLK_SDMMC1))

+  {

+    assert_param(IS_RCC_SDMMC1CLKSOURCE(PeriphClkInit->Sdmmc1ClockSelection));

+    __HAL_RCC_SDMMC1_CONFIG(PeriphClkInit->Sdmmc1ClockSelection);

+

+    if(PeriphClkInit->Sdmmc1ClockSelection == RCC_SDMMC1CLKSOURCE_PLL)   /* PLL "Q" ? */

+    {

+      /* Enable PLL48M1CLK output */

+      __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL_48M1CLK);

+    }

+#if defined(RCC_CCIPR2_SDMMCSEL)

+    else if(PeriphClkInit->Sdmmc1ClockSelection == RCC_SDMMC1CLKSOURCE_PLLP) /* PLL "P" ? */

+    {

+      /* Enable PLLSAI3CLK output */

+      __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL_SAI3CLK);

+    }

+#endif

+    else if(PeriphClkInit->Sdmmc1ClockSelection == RCC_SDMMC1CLKSOURCE_PLLSAI1)

+    {

+      /* PLLSAI1 input clock, parameters M, N & Q configuration and clock output (PLLSAI1ClockOut) */

+      ret = RCCEx_PLLSAI1_Config(&(PeriphClkInit->PLLSAI1), DIVIDER_Q_UPDATE);

+

+      if(ret != HAL_OK)

+      {

+        /* set overall return value */

+        status = ret;

+      }

+    }

+    else

+    {

+      /* nothing to do */

+    }

+  }

+

+#endif /* SDMMC1 */

+

+  /*-------------------------- RNG clock source configuration ----------------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RNG) == (RCC_PERIPHCLK_RNG))

+  {

+    assert_param(IS_RCC_RNGCLKSOURCE(PeriphClkInit->RngClockSelection));

+    __HAL_RCC_RNG_CONFIG(PeriphClkInit->RngClockSelection);

+

+    if(PeriphClkInit->RngClockSelection == RCC_RNGCLKSOURCE_PLL)

+    {

+      /* Enable PLL48M1CLK output */

+      __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL_48M1CLK);

+    }

+#if defined(RCC_PLLSAI1_SUPPORT)

+    else if(PeriphClkInit->RngClockSelection == RCC_RNGCLKSOURCE_PLLSAI1)

+    {

+      /* PLLSAI1 input clock, parameters M, N & Q configuration and clock output (PLLSAI1ClockOut) */

+      ret = RCCEx_PLLSAI1_Config(&(PeriphClkInit->PLLSAI1), DIVIDER_Q_UPDATE);

+

+      if(ret != HAL_OK)

+      {

+        /* set overall return value */

+        status = ret;

+      }

+    }

+#endif /* RCC_PLLSAI1_SUPPORT */

+    else

+    {

+      /* nothing to do */

+    }

+  }

+

+  /*-------------------------- ADC clock source configuration ----------------------*/

+#if !defined(STM32L412xx) && !defined(STM32L422xx)

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_ADC) == RCC_PERIPHCLK_ADC)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_ADCCLKSOURCE(PeriphClkInit->AdcClockSelection));

+

+    /* Configure the ADC interface clock source */

+    __HAL_RCC_ADC_CONFIG(PeriphClkInit->AdcClockSelection);

+

+#if defined(RCC_PLLSAI1_SUPPORT)

+    if(PeriphClkInit->AdcClockSelection == RCC_ADCCLKSOURCE_PLLSAI1)

+    {

+      /* PLLSAI1 input clock, parameters M, N & R configuration and clock output (PLLSAI1ClockOut) */

+      ret = RCCEx_PLLSAI1_Config(&(PeriphClkInit->PLLSAI1), DIVIDER_R_UPDATE);

+

+      if(ret != HAL_OK)

+      {

+        /* set overall return value */

+        status = ret;

+      }

+    }

+#endif /* RCC_PLLSAI1_SUPPORT */

+

+#if defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx) || defined(STM32L496xx) || defined(STM32L4A6xx)

+

+    else if(PeriphClkInit->AdcClockSelection == RCC_ADCCLKSOURCE_PLLSAI2)

+    {

+      /* PLLSAI2 input clock, parameters M, N & R configuration and clock output (PLLSAI2ClockOut) */

+      ret = RCCEx_PLLSAI2_Config(&(PeriphClkInit->PLLSAI2), DIVIDER_R_UPDATE);

+

+      if(ret != HAL_OK)

+      {

+        /* set overall return value */

+        status = ret;

+      }

+    }

+

+#endif /* STM32L471xx || STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx || STM32L496xx || STM32L4A6xx */

+

+  }

+#endif /* !STM32L412xx && !STM32L422xx */

+

+#if defined(SWPMI1)

+

+  /*-------------------------- SWPMI1 clock source configuration -------------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SWPMI1) == RCC_PERIPHCLK_SWPMI1)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_SWPMI1CLKSOURCE(PeriphClkInit->Swpmi1ClockSelection));

+

+    /* Configure the SWPMI1 clock source */

+    __HAL_RCC_SWPMI1_CONFIG(PeriphClkInit->Swpmi1ClockSelection);

+  }

+

+#endif /* SWPMI1 */

+

+#if defined(DFSDM1_Filter0)

+

+  /*-------------------------- DFSDM1 clock source configuration -------------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1) == RCC_PERIPHCLK_DFSDM1)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_DFSDM1CLKSOURCE(PeriphClkInit->Dfsdm1ClockSelection));

+

+    /* Configure the DFSDM1 interface clock source */

+    __HAL_RCC_DFSDM1_CONFIG(PeriphClkInit->Dfsdm1ClockSelection);

+  }

+

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+  /*-------------------------- DFSDM1 audio clock source configuration -------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DFSDM1AUDIO) == RCC_PERIPHCLK_DFSDM1AUDIO)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_DFSDM1AUDIOCLKSOURCE(PeriphClkInit->Dfsdm1AudioClockSelection));

+

+    /* Configure the DFSDM1 interface audio clock source */

+    __HAL_RCC_DFSDM1AUDIO_CONFIG(PeriphClkInit->Dfsdm1AudioClockSelection);

+  }

+

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+#endif /* DFSDM1_Filter0 */

+

+#if defined(LTDC)

+

+  /*-------------------------- LTDC clock source configuration --------------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_LTDC) == RCC_PERIPHCLK_LTDC)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_LTDCCLKSOURCE(PeriphClkInit->LtdcClockSelection));

+

+    /* Disable the PLLSAI2 */

+    __HAL_RCC_PLLSAI2_DISABLE();

+

+    /* Get Start Tick*/

+    tickstart = HAL_GetTick();

+

+    /* Wait till PLLSAI2 is ready */

+    while(READ_BIT(RCC->CR, RCC_CR_PLLSAI2RDY) != 0U)

+    {

+      if((HAL_GetTick() - tickstart) > PLLSAI2_TIMEOUT_VALUE)

+      {

+        ret = HAL_TIMEOUT;

+        break;

+      }

+    }

+

+    if(ret == HAL_OK)

+    {

+      /* Configure the LTDC clock source */

+      __HAL_RCC_LTDC_CONFIG(PeriphClkInit->LtdcClockSelection);

+

+      /* PLLSAI2 input clock, parameters M, N & R configuration and clock output (PLLSAI2ClockOut) */

+      ret = RCCEx_PLLSAI2_Config(&(PeriphClkInit->PLLSAI2), DIVIDER_R_UPDATE);

+    }

+

+    if(ret != HAL_OK)

+    {

+      /* set overall return value */

+      status = ret;

+    }

+  }

+

+#endif /* LTDC */

+

+#if defined(DSI)

+

+  /*-------------------------- DSI clock source configuration ---------------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_DSI) == RCC_PERIPHCLK_DSI)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_DSICLKSOURCE(PeriphClkInit->DsiClockSelection));

+

+    /* Configure the DSI clock source */

+    __HAL_RCC_DSI_CONFIG(PeriphClkInit->DsiClockSelection);

+

+    if(PeriphClkInit->DsiClockSelection == RCC_DSICLKSOURCE_PLLSAI2)

+    {

+      /* PLLSAI2 input clock, parameters M, N & Q configuration and clock output (PLLSAI2ClockOut) */

+      ret = RCCEx_PLLSAI2_Config(&(PeriphClkInit->PLLSAI2), DIVIDER_Q_UPDATE);

+

+      if(ret != HAL_OK)

+      {

+        /* set overall return value */

+        status = ret;

+      }

+    }

+  }

+

+#endif /* DSI */

+

+#if defined(OCTOSPI1) || defined(OCTOSPI2)

+

+  /*-------------------------- OctoSPIx clock source configuration ----------------*/

+  if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_OSPI) == RCC_PERIPHCLK_OSPI)

+  {

+    /* Check the parameters */

+    assert_param(IS_RCC_OSPICLKSOURCE(PeriphClkInit->OspiClockSelection));

+

+    /* Configure the OctoSPI clock source */

+    __HAL_RCC_OSPI_CONFIG(PeriphClkInit->OspiClockSelection);

+

+    if(PeriphClkInit->OspiClockSelection == RCC_OSPICLKSOURCE_PLL)

+    {

+      /* Enable PLL48M1CLK output */

+      __HAL_RCC_PLLCLKOUT_ENABLE(RCC_PLL_48M1CLK);

+    }

+  }

+

+#endif /* OCTOSPI1 || OCTOSPI2 */

+

+  return status;

+}

+

+/**

+  * @brief  Get the RCC_ClkInitStruct according to the internal RCC configuration registers.

+  * @param  PeriphClkInit  pointer to an RCC_PeriphCLKInitTypeDef structure that

+  *         returns the configuration information for the Extended Peripherals

+  *         clocks(SAI1, SAI2, LPTIM1, LPTIM2, I2C1, I2C2, I2C3, I2C4, LPUART,

+  *         USART1, USART2, USART3, UART4, UART5, RTC, ADCx, DFSDMx, SWPMI1, USB, SDMMC1 and RNG).

+  * @retval None

+  */

+void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef  *PeriphClkInit)

+{

+  /* Set all possible values for the extended clock type parameter------------*/

+

+#if defined(STM32L412xx) || defined(STM32L422xx)

+

+  PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1  | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 |                                               \

+                                        RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1   | RCC_PERIPHCLK_I2C2   | RCC_PERIPHCLK_I2C3   |                        \

+                                        RCC_PERIPHCLK_LPTIM1  | RCC_PERIPHCLK_LPTIM2 |                                               RCC_PERIPHCLK_USB    | \

+                                                                RCC_PERIPHCLK_RNG    |                                                                      \

+                                        RCC_PERIPHCLK_RTC ;

+

+#elif defined(STM32L431xx)

+

+  PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1  | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 |                                               \

+                                        RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1   | RCC_PERIPHCLK_I2C2   | RCC_PERIPHCLK_I2C3   |                        \

+                                        RCC_PERIPHCLK_LPTIM1  | RCC_PERIPHCLK_LPTIM2 | RCC_PERIPHCLK_SAI1   |                                               \

+                                        RCC_PERIPHCLK_SDMMC1  | RCC_PERIPHCLK_RNG    | RCC_PERIPHCLK_ADC    | RCC_PERIPHCLK_SWPMI1 |                        \

+                                        RCC_PERIPHCLK_RTC ;

+

+#elif defined(STM32L432xx) || defined(STM32L442xx)

+

+  PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1  | RCC_PERIPHCLK_USART2 |                                                                      \

+                                        RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1   |                        RCC_PERIPHCLK_I2C3   |                        \

+                                        RCC_PERIPHCLK_LPTIM1  | RCC_PERIPHCLK_LPTIM2 | RCC_PERIPHCLK_SAI1   |                        RCC_PERIPHCLK_USB    | \

+                                                                RCC_PERIPHCLK_RNG    | RCC_PERIPHCLK_ADC    | RCC_PERIPHCLK_SWPMI1 |                        \

+                                        RCC_PERIPHCLK_RTC ;

+

+#elif defined(STM32L433xx) || defined(STM32L443xx)

+

+  PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1  | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 |                                               \

+                                        RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1   | RCC_PERIPHCLK_I2C2   | RCC_PERIPHCLK_I2C3   |                        \

+                                        RCC_PERIPHCLK_LPTIM1  | RCC_PERIPHCLK_LPTIM2 | RCC_PERIPHCLK_SAI1   |                        RCC_PERIPHCLK_USB    | \

+                                        RCC_PERIPHCLK_SDMMC1  | RCC_PERIPHCLK_RNG    | RCC_PERIPHCLK_ADC    | RCC_PERIPHCLK_SWPMI1 |                        \

+                                        RCC_PERIPHCLK_RTC ;

+

+#elif defined(STM32L451xx)

+

+  PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1  | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | RCC_PERIPHCLK_UART4  |                        \

+                                        RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1   | RCC_PERIPHCLK_I2C2   | RCC_PERIPHCLK_I2C3   | RCC_PERIPHCLK_I2C4   | \

+                                        RCC_PERIPHCLK_LPTIM1  | RCC_PERIPHCLK_LPTIM2 | RCC_PERIPHCLK_SAI1   |                                               \

+                                        RCC_PERIPHCLK_SDMMC1  | RCC_PERIPHCLK_RNG    | RCC_PERIPHCLK_ADC    |                        RCC_PERIPHCLK_DFSDM1 | \

+                                        RCC_PERIPHCLK_RTC ;

+

+#elif defined(STM32L452xx) || defined(STM32L462xx)

+

+  PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1  | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | RCC_PERIPHCLK_UART4  |                        \

+                                        RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1   | RCC_PERIPHCLK_I2C2   | RCC_PERIPHCLK_I2C3   | RCC_PERIPHCLK_I2C4   | \

+                                        RCC_PERIPHCLK_LPTIM1  | RCC_PERIPHCLK_LPTIM2 | RCC_PERIPHCLK_SAI1   |                        RCC_PERIPHCLK_USB    | \

+                                        RCC_PERIPHCLK_SDMMC1  | RCC_PERIPHCLK_RNG    | RCC_PERIPHCLK_ADC    |                        RCC_PERIPHCLK_DFSDM1 | \

+                                        RCC_PERIPHCLK_RTC ;

+

+#elif defined(STM32L471xx)

+

+  PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1  | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | RCC_PERIPHCLK_UART4  | RCC_PERIPHCLK_UART5  | \

+                                        RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1   | RCC_PERIPHCLK_I2C2   | RCC_PERIPHCLK_I2C3                          | \

+                                        RCC_PERIPHCLK_LPTIM1  | RCC_PERIPHCLK_LPTIM2 | RCC_PERIPHCLK_SAI1   | RCC_PERIPHCLK_SAI2                          | \

+                                        RCC_PERIPHCLK_SDMMC1  | RCC_PERIPHCLK_RNG    | RCC_PERIPHCLK_ADC    | RCC_PERIPHCLK_SWPMI1 | RCC_PERIPHCLK_DFSDM1 | \

+                                        RCC_PERIPHCLK_RTC ;

+

+#elif defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx)

+

+  PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1  | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | RCC_PERIPHCLK_UART4  | RCC_PERIPHCLK_UART5  | \

+                                        RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1   | RCC_PERIPHCLK_I2C2   | RCC_PERIPHCLK_I2C3   |                        \

+                                        RCC_PERIPHCLK_LPTIM1  | RCC_PERIPHCLK_LPTIM2 | RCC_PERIPHCLK_SAI1   | RCC_PERIPHCLK_SAI2   | RCC_PERIPHCLK_USB    | \

+                                        RCC_PERIPHCLK_SDMMC1  | RCC_PERIPHCLK_RNG    | RCC_PERIPHCLK_ADC    | RCC_PERIPHCLK_SWPMI1 | RCC_PERIPHCLK_DFSDM1 | \

+                                        RCC_PERIPHCLK_RTC ;

+

+#elif defined(STM32L496xx) || defined(STM32L4A6xx)

+

+  PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1  | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | RCC_PERIPHCLK_UART4  | RCC_PERIPHCLK_UART5  | \

+                                        RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1   | RCC_PERIPHCLK_I2C2   | RCC_PERIPHCLK_I2C3   | RCC_PERIPHCLK_I2C4   | \

+                                        RCC_PERIPHCLK_LPTIM1  | RCC_PERIPHCLK_LPTIM2 | RCC_PERIPHCLK_SAI1   | RCC_PERIPHCLK_SAI2   | RCC_PERIPHCLK_USB    | \

+                                        RCC_PERIPHCLK_SDMMC1  | RCC_PERIPHCLK_RNG    | RCC_PERIPHCLK_ADC    | RCC_PERIPHCLK_SWPMI1 | RCC_PERIPHCLK_DFSDM1 | \

+                                        RCC_PERIPHCLK_RTC ;

+

+#elif defined(STM32L4R5xx) || defined(STM32L4S5xx)

+

+  PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1  | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | RCC_PERIPHCLK_UART4  | RCC_PERIPHCLK_UART5  | \

+                                        RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1   | RCC_PERIPHCLK_I2C2   | RCC_PERIPHCLK_I2C3   | RCC_PERIPHCLK_I2C4   | \

+                                        RCC_PERIPHCLK_LPTIM1  | RCC_PERIPHCLK_LPTIM2 | RCC_PERIPHCLK_SAI1   | RCC_PERIPHCLK_SAI2   | RCC_PERIPHCLK_USB    | \

+                                        RCC_PERIPHCLK_SDMMC1  | RCC_PERIPHCLK_RNG    | RCC_PERIPHCLK_ADC                           | RCC_PERIPHCLK_DFSDM1 | \

+                                        RCC_PERIPHCLK_DFSDM1AUDIO | RCC_PERIPHCLK_RTC | RCC_PERIPHCLK_OSPI;

+

+#elif defined(STM32L4R7xx) || defined(STM32L4S7xx)

+

+  PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1  | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | RCC_PERIPHCLK_UART4  | RCC_PERIPHCLK_UART5  | \

+                                        RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1   | RCC_PERIPHCLK_I2C2   | RCC_PERIPHCLK_I2C3   | RCC_PERIPHCLK_I2C4   | \

+                                        RCC_PERIPHCLK_LPTIM1  | RCC_PERIPHCLK_LPTIM2 | RCC_PERIPHCLK_SAI1   | RCC_PERIPHCLK_SAI2   | RCC_PERIPHCLK_USB    | \

+                                        RCC_PERIPHCLK_SDMMC1  | RCC_PERIPHCLK_RNG    | RCC_PERIPHCLK_ADC                           | RCC_PERIPHCLK_DFSDM1 | \

+                                        RCC_PERIPHCLK_DFSDM1AUDIO | RCC_PERIPHCLK_RTC | RCC_PERIPHCLK_OSPI  | RCC_PERIPHCLK_LTDC;

+

+#elif defined(STM32L4R9xx) || defined(STM32L4S9xx)

+

+  PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1  | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | RCC_PERIPHCLK_UART4  | RCC_PERIPHCLK_UART5  | \

+                                        RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_I2C1   | RCC_PERIPHCLK_I2C2   | RCC_PERIPHCLK_I2C3   | RCC_PERIPHCLK_I2C4   | \

+                                        RCC_PERIPHCLK_LPTIM1  | RCC_PERIPHCLK_LPTIM2 | RCC_PERIPHCLK_SAI1   | RCC_PERIPHCLK_SAI2   | RCC_PERIPHCLK_USB    | \

+                                        RCC_PERIPHCLK_SDMMC1  | RCC_PERIPHCLK_RNG    | RCC_PERIPHCLK_ADC                           | RCC_PERIPHCLK_DFSDM1 | \

+                                        RCC_PERIPHCLK_DFSDM1AUDIO | RCC_PERIPHCLK_RTC | RCC_PERIPHCLK_OSPI  | RCC_PERIPHCLK_LTDC   | RCC_PERIPHCLK_DSI;

+

+#endif /* STM32L431xx */

+

+#if defined(RCC_PLLSAI1_SUPPORT)

+

+  /* Get the PLLSAI1 Clock configuration -----------------------------------------------*/

+

+  PeriphClkInit->PLLSAI1.PLLSAI1Source = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC) >> RCC_PLLCFGR_PLLSRC_Pos;

+#if defined(RCC_PLLSAI1M_DIV_1_16_SUPPORT)

+  PeriphClkInit->PLLSAI1.PLLSAI1M = (READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1M) >> RCC_PLLSAI1CFGR_PLLSAI1M_Pos) + 1U;

+#else

+  PeriphClkInit->PLLSAI1.PLLSAI1M = (READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U;

+#endif /* RCC_PLLSAI1M_DIV_1_16_SUPPORT */

+  PeriphClkInit->PLLSAI1.PLLSAI1N = READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1N) >> RCC_PLLSAI1CFGR_PLLSAI1N_Pos;

+  PeriphClkInit->PLLSAI1.PLLSAI1P = ((READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1P) >> RCC_PLLSAI1CFGR_PLLSAI1P_Pos) << 4U) + 7U;

+  PeriphClkInit->PLLSAI1.PLLSAI1Q = ((READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1Q) >> RCC_PLLSAI1CFGR_PLLSAI1Q_Pos) + 1U) * 2U;

+  PeriphClkInit->PLLSAI1.PLLSAI1R = ((READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1R) >> RCC_PLLSAI1CFGR_PLLSAI1R_Pos) + 1U) * 2U;

+

+#endif /* RCC_PLLSAI1_SUPPORT */

+

+#if defined(RCC_PLLSAI2_SUPPORT)

+

+  /* Get the PLLSAI2 Clock configuration -----------------------------------------------*/

+

+  PeriphClkInit->PLLSAI2.PLLSAI2Source = PeriphClkInit->PLLSAI1.PLLSAI1Source;

+#if defined(RCC_PLLSAI2M_DIV_1_16_SUPPORT)

+  PeriphClkInit->PLLSAI2.PLLSAI2M = (READ_BIT(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2M) >> RCC_PLLSAI2CFGR_PLLSAI2M_Pos) + 1U;

+#else

+  PeriphClkInit->PLLSAI2.PLLSAI2M = PeriphClkInit->PLLSAI1.PLLSAI1M;

+#endif /* RCC_PLLSAI2M_DIV_1_16_SUPPORT */

+  PeriphClkInit->PLLSAI2.PLLSAI2N = READ_BIT(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2N) >> RCC_PLLSAI2CFGR_PLLSAI2N_Pos;

+  PeriphClkInit->PLLSAI2.PLLSAI2P = ((READ_BIT(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2P) >> RCC_PLLSAI2CFGR_PLLSAI2P_Pos) << 4U) + 7U;

+#if defined(RCC_PLLSAI2Q_DIV_SUPPORT)

+  PeriphClkInit->PLLSAI2.PLLSAI2Q = ((READ_BIT(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2Q) >> RCC_PLLSAI2CFGR_PLLSAI2Q_Pos) + 1U) * 2U;

+#endif /* RCC_PLLSAI2Q_DIV_SUPPORT */

+  PeriphClkInit->PLLSAI2.PLLSAI2R = ((READ_BIT(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2R)>> RCC_PLLSAI2CFGR_PLLSAI2R_Pos) + 1U) * 2U;

+

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+  /* Get the USART1 clock source ---------------------------------------------*/

+  PeriphClkInit->Usart1ClockSelection  = __HAL_RCC_GET_USART1_SOURCE();

+  /* Get the USART2 clock source ---------------------------------------------*/

+  PeriphClkInit->Usart2ClockSelection  = __HAL_RCC_GET_USART2_SOURCE();

+

+#if defined(USART3)

+  /* Get the USART3 clock source ---------------------------------------------*/

+  PeriphClkInit->Usart3ClockSelection  = __HAL_RCC_GET_USART3_SOURCE();

+#endif /* USART3 */

+

+#if defined(UART4)

+  /* Get the UART4 clock source ----------------------------------------------*/

+  PeriphClkInit->Uart4ClockSelection   = __HAL_RCC_GET_UART4_SOURCE();

+#endif /* UART4 */

+

+#if defined(UART5)

+  /* Get the UART5 clock source ----------------------------------------------*/

+  PeriphClkInit->Uart5ClockSelection   = __HAL_RCC_GET_UART5_SOURCE();

+#endif /* UART5 */

+

+  /* Get the LPUART1 clock source --------------------------------------------*/

+  PeriphClkInit->Lpuart1ClockSelection = __HAL_RCC_GET_LPUART1_SOURCE();

+

+  /* Get the I2C1 clock source -----------------------------------------------*/

+  PeriphClkInit->I2c1ClockSelection    = __HAL_RCC_GET_I2C1_SOURCE();

+

+#if defined(I2C2)

+   /* Get the I2C2 clock source ----------------------------------------------*/

+  PeriphClkInit->I2c2ClockSelection    = __HAL_RCC_GET_I2C2_SOURCE();

+#endif /* I2C2 */

+

+  /* Get the I2C3 clock source -----------------------------------------------*/

+  PeriphClkInit->I2c3ClockSelection    = __HAL_RCC_GET_I2C3_SOURCE();

+

+#if defined(I2C4)

+  /* Get the I2C4 clock source -----------------------------------------------*/

+  PeriphClkInit->I2c4ClockSelection    = __HAL_RCC_GET_I2C4_SOURCE();

+#endif /* I2C4 */

+

+  /* Get the LPTIM1 clock source ---------------------------------------------*/

+  PeriphClkInit->Lptim1ClockSelection  = __HAL_RCC_GET_LPTIM1_SOURCE();

+

+  /* Get the LPTIM2 clock source ---------------------------------------------*/

+  PeriphClkInit->Lptim2ClockSelection  = __HAL_RCC_GET_LPTIM2_SOURCE();

+

+#if defined(SAI1)

+  /* Get the SAI1 clock source -----------------------------------------------*/

+  PeriphClkInit->Sai1ClockSelection    = __HAL_RCC_GET_SAI1_SOURCE();

+#endif /* SAI1 */

+

+#if defined(SAI2)

+  /* Get the SAI2 clock source -----------------------------------------------*/

+  PeriphClkInit->Sai2ClockSelection    = __HAL_RCC_GET_SAI2_SOURCE();

+#endif /* SAI2 */

+

+  /* Get the RTC clock source ------------------------------------------------*/

+  PeriphClkInit->RTCClockSelection     = __HAL_RCC_GET_RTC_SOURCE();

+

+#if defined(USB_OTG_FS) || defined(USB)

+  /* Get the USB clock source ------------------------------------------------*/

+  PeriphClkInit->UsbClockSelection   = __HAL_RCC_GET_USB_SOURCE();

+#endif /* USB_OTG_FS || USB */

+

+#if defined(SDMMC1)

+  /* Get the SDMMC1 clock source ---------------------------------------------*/

+  PeriphClkInit->Sdmmc1ClockSelection   = __HAL_RCC_GET_SDMMC1_SOURCE();

+#endif /* SDMMC1 */

+

+  /* Get the RNG clock source ------------------------------------------------*/

+  PeriphClkInit->RngClockSelection   = __HAL_RCC_GET_RNG_SOURCE();

+

+#if !defined(STM32L412xx) && !defined(STM32L422xx)

+  /* Get the ADC clock source ------------------------------------------------*/

+  PeriphClkInit->AdcClockSelection     = __HAL_RCC_GET_ADC_SOURCE();

+#endif /* !STM32L412xx && !STM32L422xx */

+

+#if defined(SWPMI1)

+  /* Get the SWPMI1 clock source ---------------------------------------------*/

+  PeriphClkInit->Swpmi1ClockSelection  = __HAL_RCC_GET_SWPMI1_SOURCE();

+#endif /* SWPMI1 */

+

+#if defined(DFSDM1_Filter0)

+  /* Get the DFSDM1 clock source ---------------------------------------------*/

+  PeriphClkInit->Dfsdm1ClockSelection  = __HAL_RCC_GET_DFSDM1_SOURCE();

+

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+  /* Get the DFSDM1 audio clock source ---------------------------------------*/

+  PeriphClkInit->Dfsdm1AudioClockSelection  = __HAL_RCC_GET_DFSDM1AUDIO_SOURCE();

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+#endif /* DFSDM1_Filter0 */

+

+#if defined(LTDC)

+  /* Get the LTDC clock source -----------------------------------------------*/

+  PeriphClkInit->LtdcClockSelection = __HAL_RCC_GET_LTDC_SOURCE();

+#endif /* LTDC */

+

+#if defined(DSI)

+  /* Get the DSI clock source ------------------------------------------------*/

+  PeriphClkInit->DsiClockSelection = __HAL_RCC_GET_DSI_SOURCE();

+#endif /* DSI */

+

+#if defined(OCTOSPI1) || defined(OCTOSPI2)

+  /* Get the OctoSPIclock source --------------------------------------------*/

+  PeriphClkInit->OspiClockSelection = __HAL_RCC_GET_OSPI_SOURCE();

+#endif /* OCTOSPI1 || OCTOSPI2 */

+}

+

+/**

+  * @brief  Return the peripheral clock frequency for peripherals with clock source from PLLSAIs

+  * @note   Return 0 if peripheral clock identifier not managed by this API

+  * @param  PeriphClk  Peripheral clock identifier

+  *         This parameter can be one of the following values:

+  *            @arg @ref RCC_PERIPHCLK_RTC  RTC peripheral clock

+  *            @arg @ref RCC_PERIPHCLK_ADC  ADC peripheral clock

+  @if STM32L462xx

+  *            @arg @ref RCC_PERIPHCLK_DFSDM1  DFSDM1 peripheral clock (only for devices with DFSDM)

+  @endif

+  @if STM32L486xx

+  *            @arg @ref RCC_PERIPHCLK_DFSDM1  DFSDM1 peripheral clock (only for devices with DFSDM)

+  @endif

+  @if STM32L4A6xx

+  *            @arg @ref RCC_PERIPHCLK_DFSDM1  DFSDM1 peripheral clock (only for devices with DFSDM)

+  @endif

+  *            @arg @ref RCC_PERIPHCLK_I2C1  I2C1 peripheral clock

+  *            @arg @ref RCC_PERIPHCLK_I2C2  I2C2 peripheral clock

+  *            @arg @ref RCC_PERIPHCLK_I2C3  I2C3 peripheral clock

+  @if STM32L462xx

+  *            @arg @ref RCC_PERIPHCLK_I2C4  I2C4 peripheral clock (only for devices with I2C4)

+  @endif

+  @if STM32L4A6xx

+  *            @arg @ref RCC_PERIPHCLK_I2C4  I2C4 peripheral clock (only for devices with I2C4)

+  @endif

+  @if STM32L4S9xx

+  *            @arg @ref RCC_PERIPHCLK_I2C4  I2C4 peripheral clock (only for devices with I2C4)

+  @endif

+  *            @arg @ref RCC_PERIPHCLK_LPTIM1  LPTIM1 peripheral clock

+  *            @arg @ref RCC_PERIPHCLK_LPTIM2  LPTIM2 peripheral clock

+  *            @arg @ref RCC_PERIPHCLK_LPUART1  LPUART1 peripheral clock

+  *            @arg @ref RCC_PERIPHCLK_RNG  RNG peripheral clock

+  *            @arg @ref RCC_PERIPHCLK_SAI1  SAI1 peripheral clock (only for devices with SAI1)

+  @if STM32L486xx

+  *            @arg @ref RCC_PERIPHCLK_SAI2  SAI2 peripheral clock (only for devices with SAI2)

+  @endif

+  @if STM32L4A6xx

+  *            @arg @ref RCC_PERIPHCLK_SAI2  SAI2 peripheral clock (only for devices with SAI2)

+  @endif

+  @if STM32L4S9xx

+  *            @arg @ref RCC_PERIPHCLK_SAI2  SAI2 peripheral clock (only for devices with SAI2)

+  @endif

+  *            @arg @ref RCC_PERIPHCLK_SDMMC1  SDMMC1 peripheral clock

+  @if STM32L443xx

+  *            @arg @ref RCC_PERIPHCLK_SWPMI1  SWPMI1 peripheral clock (only for devices with SWPMI1)

+  @endif

+  @if STM32L486xx

+  *            @arg @ref RCC_PERIPHCLK_SWPMI1  SWPMI1 peripheral clock (only for devices with SWPMI1)

+  @endif

+  @if STM32L4A6xx

+  *            @arg @ref RCC_PERIPHCLK_SWPMI1  SWPMI1 peripheral clock (only for devices with SWPMI1)

+  @endif

+  *            @arg @ref RCC_PERIPHCLK_USART1  USART1 peripheral clock

+  *            @arg @ref RCC_PERIPHCLK_USART2  USART1 peripheral clock

+  *            @arg @ref RCC_PERIPHCLK_USART3  USART1 peripheral clock

+  @if STM32L462xx

+  *            @arg @ref RCC_PERIPHCLK_UART4  UART4 peripheral clock (only for devices with UART4)

+  *            @arg @ref RCC_PERIPHCLK_USB  USB peripheral clock (only for devices with USB)

+  @endif

+  @if STM32L486xx

+  *            @arg @ref RCC_PERIPHCLK_UART4  UART4 peripheral clock (only for devices with UART4)

+  *            @arg @ref RCC_PERIPHCLK_UART5  UART5 peripheral clock (only for devices with UART5)

+  *            @arg @ref RCC_PERIPHCLK_USB  USB peripheral clock (only for devices with USB)

+  @endif

+  @if STM32L4A6xx

+  *            @arg @ref RCC_PERIPHCLK_UART4  UART4 peripheral clock (only for devices with UART4)

+  *            @arg @ref RCC_PERIPHCLK_UART5  UART5 peripheral clock (only for devices with UART5)

+  *            @arg @ref RCC_PERIPHCLK_USB  USB peripheral clock (only for devices with USB)

+  @endif

+  @if STM32L4S9xx

+  *            @arg @ref RCC_PERIPHCLK_UART4  USART1 peripheral clock (only for devices with UART4)

+  *            @arg @ref RCC_PERIPHCLK_UART5  USART1 peripheral clock (only for devices with UART5)

+  *            @arg @ref RCC_PERIPHCLK_USB  USB peripheral clock (only for devices with USB)

+  *            @arg @ref RCC_PERIPHCLK_DFSDM1  DFSDM1 peripheral kernel clock (only for devices with DFSDM1)

+  *            @arg @ref RCC_PERIPHCLK_DFSDM1AUDIO  DFSDM1 peripheral audio clock (only for devices with DFSDM1)

+  *            @arg @ref RCC_PERIPHCLK_LTDC  LTDC peripheral clock (only for devices with LTDC)

+  *            @arg @ref RCC_PERIPHCLK_DSI  DSI peripheral clock (only for devices with DSI)

+  *            @arg @ref RCC_PERIPHCLK_OSPI  OctoSPI peripheral clock (only for devices with OctoSPI)

+  @endif

+  * @retval Frequency in Hz

+  */

+uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk)

+{

+  uint32_t frequency = 0U;

+  uint32_t srcclk, pll_oscsource, pllvco, plln;    /* no init needed */

+#if defined(SDMMC1) && defined(RCC_CCIPR2_SDMMCSEL)

+  uint32_t pllp;  /* no init needed */

+#endif

+

+  /* Check the parameters */

+  assert_param(IS_RCC_PERIPHCLOCK(PeriphClk));

+

+  if(PeriphClk == RCC_PERIPHCLK_RTC)

+  {

+    /* Get the current RTC source */

+    srcclk = __HAL_RCC_GET_RTC_SOURCE();

+

+    switch(srcclk)

+    {

+    case RCC_RTCCLKSOURCE_LSE:

+      /* Check if LSE is ready */

+      if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))

+      {

+        frequency = LSE_VALUE;

+      }

+      break;

+    case RCC_RTCCLKSOURCE_LSI:

+      /* Check if LSI is ready */

+      if(HAL_IS_BIT_SET(RCC->CSR, RCC_CSR_LSIRDY))

+      {

+#if defined(RCC_CSR_LSIPREDIV)

+        if(HAL_IS_BIT_SET(RCC->CSR, RCC_CSR_LSIPREDIV))

+        {

+          frequency = LSI_VALUE/128U;

+        }

+        else

+#endif /* RCC_CSR_LSIPREDIV */

+        {

+          frequency = LSI_VALUE;

+        }

+      }

+      break;

+    case RCC_RTCCLKSOURCE_HSE_DIV32:

+      /* Check if HSE is ready */

+      if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSERDY))

+      {

+        frequency = HSE_VALUE / 32U;

+      }

+      break;

+    default:

+      /* No clock source, frequency default init at 0 */

+      break;

+    }

+  }

+  else

+  {

+    /* Other external peripheral clock source than RTC */

+    pll_oscsource = __HAL_RCC_GET_PLL_OSCSOURCE();

+

+    /* Compute PLL clock input */

+    switch(pll_oscsource)

+    {

+    case RCC_PLLSOURCE_MSI:   /* MSI ? */

+      if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIRDY))

+      {

+        /*MSI frequency range in HZ*/

+        pllvco = MSIRangeTable[(__HAL_RCC_GET_MSI_RANGE() >> 4U)];

+      }

+      else

+      {

+        pllvco = 0U;

+      }

+      break;

+    case RCC_PLLSOURCE_HSI:   /* HSI ? */

+      if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))

+      {

+        pllvco = HSI_VALUE;

+      }

+      else

+      {

+        pllvco = 0U;

+      }

+      break;

+    case RCC_PLLSOURCE_HSE:   /* HSE ? */

+      if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSERDY))

+      {

+        pllvco = HSE_VALUE;

+      }

+      else

+      {

+        pllvco = 0U;

+      }

+      break;

+    default:

+      /* No source */

+      pllvco = 0U;

+      break;

+    }

+

+    switch(PeriphClk)

+    {

+#if defined(SAI1)

+

+    case RCC_PERIPHCLK_SAI1:

+      frequency = RCCEx_GetSAIxPeriphCLKFreq(RCC_PERIPHCLK_SAI1, pllvco);

+      break;

+

+#endif

+

+#if defined(SAI2)

+

+    case RCC_PERIPHCLK_SAI2:

+      frequency = RCCEx_GetSAIxPeriphCLKFreq(RCC_PERIPHCLK_SAI2, pllvco);

+      break;

+

+#endif

+

+#if defined(USB_OTG_FS) || defined(USB)

+

+    case RCC_PERIPHCLK_USB:

+

+#endif /* USB_OTG_FS || USB */

+

+    case RCC_PERIPHCLK_RNG:

+

+#if defined(SDMMC1) && !defined(RCC_CCIPR2_SDMMCSEL)

+

+    case RCC_PERIPHCLK_SDMMC1:

+

+#endif /* SDMMC1 && !RCC_CCIPR2_SDMMCSEL */

+      {

+        srcclk = READ_BIT(RCC->CCIPR, RCC_CCIPR_CLK48SEL);

+

+        switch(srcclk)

+        {

+        case RCC_CCIPR_CLK48SEL:   /* MSI ? */

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIRDY))

+          {

+            /*MSI frequency range in HZ*/

+            frequency = MSIRangeTable[(__HAL_RCC_GET_MSI_RANGE() >> 4U)];

+          }

+          break;

+        case RCC_CCIPR_CLK48SEL_1:  /* PLL ? */

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))

+          {

+            if(HAL_IS_BIT_SET(RCC->PLLCFGR, RCC_PLLCFGR_PLLQEN))

+            {

+              /* f(PLL Source) * PLLN / PLLM */

+              plln = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos;

+              pllvco = ((pllvco * plln) / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U));

+              /* f(PLL48M1CLK) = f(VCO input) / PLLQ */

+              frequency = (pllvco / (((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos) + 1U) << 1U));

+            }

+          }

+          break;

+#if defined(RCC_PLLSAI1_SUPPORT)

+        case RCC_CCIPR_CLK48SEL_0:  /* PLLSAI1 ? */

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLSAI1RDY))

+          {

+            if(HAL_IS_BIT_SET(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1QEN))

+            {

+              plln = READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1N) >> RCC_PLLSAI1CFGR_PLLSAI1N_Pos;

+#if defined(RCC_PLLSAI1M_DIV_1_16_SUPPORT)

+              /* PLLSAI1M exists: apply PLLSAI1M divider for PLLSAI1 output computation */

+              /* f(PLLSAI1 Source) * PLLSAI1N / PLLSAI1M */

+              pllvco = ((pllvco * plln) / ((READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1M) >> RCC_PLLSAI1CFGR_PLLSAI1M_Pos) + 1U));

+#else

+              /* f(PLL Source) * PLLSAI1N / PLLM */

+              pllvco = ((pllvco * plln) / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U));

+#endif

+              /* f(PLL48M2CLK) = f(VCOSAI1 input) / PLLSAI1Q */

+              frequency = (pllvco / (((READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1Q) >> RCC_PLLSAI1CFGR_PLLSAI1Q_Pos) + 1U) << 1U));

+            }

+          }

+          break;

+#endif /* RCC_PLLSAI1_SUPPORT */

+#if defined(RCC_HSI48_SUPPORT)

+        case 0U:

+          if(HAL_IS_BIT_SET(RCC->CRRCR, RCC_CRRCR_HSI48RDY)) /* HSI48 ? */

+          {

+            frequency = HSI48_VALUE;

+          }

+          break;

+#endif /* RCC_HSI48_SUPPORT */

+        default:

+          /* No clock source, frequency default init at 0 */

+          break;

+        } /* switch(srcclk) */

+        break;

+      }

+

+#if defined(SDMMC1) && defined(RCC_CCIPR2_SDMMCSEL)

+

+    case RCC_PERIPHCLK_SDMMC1:

+

+      if(HAL_IS_BIT_SET(RCC->CCIPR2, RCC_CCIPR2_SDMMCSEL))  /* PLL "P" ? */

+      {

+        if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))

+        {

+          if(HAL_IS_BIT_SET(RCC->PLLCFGR, RCC_PLLCFGR_PLLPEN))

+          {

+            /* f(PLL Source) * PLLN / PLLM */

+            plln = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos;

+            pllvco = ((pllvco * plln) / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U));

+            /* f(PLLSAI3CLK) = f(VCO input) / PLLP */

+            pllp = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLPDIV) >> RCC_PLLCFGR_PLLPDIV_Pos;

+            if(pllp == 0U)

+            {

+              if(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLP) != 0U)

+              {

+                pllp = 17U;

+              }

+              else

+              {

+                pllp = 7U;

+              }

+            }

+            frequency = (pllvco / pllp);

+          }

+        }

+      }

+      else  /* 48MHz from PLL "Q" or MSI or PLLSAI1Q or HSI48 */

+      {

+        srcclk = READ_BIT(RCC->CCIPR, RCC_CCIPR_CLK48SEL);

+

+        switch(srcclk)

+        {

+        case RCC_CCIPR_CLK48SEL:   /* MSI ? */

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIRDY))

+          {

+            /*MSI frequency range in HZ*/

+            frequency = MSIRangeTable[(__HAL_RCC_GET_MSI_RANGE() >> 4U)];

+          }

+          break;

+        case RCC_CCIPR_CLK48SEL_1:  /* PLL "Q" ? */

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))

+          {

+            if(HAL_IS_BIT_SET(RCC->PLLCFGR, RCC_PLLCFGR_PLLQEN))

+            {

+              /* f(PLL Source) * PLLN / PLLM */

+              plln = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos;

+              pllvco = ((pllvco * plln) / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U));

+              /* f(PLL48M1CLK) = f(VCO input) / PLLQ */

+              frequency = (pllvco / (((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos) + 1U) << 1U));

+            }

+          }

+          break;

+        case RCC_CCIPR_CLK48SEL_0:  /* PLLSAI1 ? */

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLSAI1RDY))

+          {

+            if(HAL_IS_BIT_SET(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1QEN))

+            {

+              /* f(PLLSAI1 Source) * PLLSAI1N / PLLSAI1M */

+              plln = READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1N) >> RCC_PLLSAI1CFGR_PLLSAI1N_Pos;

+              pllvco = ((pllvco * plln) / ((READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1M) >> RCC_PLLSAI1CFGR_PLLSAI1M_Pos) + 1U));

+              /* f(PLL48M2CLK) = f(VCOSAI1 input) / PLLSAI1Q */

+              frequency = (pllvco / (((READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1Q) >> RCC_PLLSAI1CFGR_PLLSAI1Q_Pos) + 1U) << 1U));

+            }

+          }

+          break;

+        case 0U:

+          if(HAL_IS_BIT_SET(RCC->CRRCR, RCC_CRRCR_HSI48RDY)) /* HSI48 ? */

+          {

+            frequency = HSI48_VALUE;

+          }

+          break;

+        default:

+          /* No clock source, frequency default init at 0 */

+          break;

+        } /* switch(srcclk) */

+      }

+      break;

+

+#endif /* SDMMC1 && RCC_CCIPR2_SDMMCSEL */

+

+    case RCC_PERIPHCLK_USART1:

+      {

+        /* Get the current USART1 source */

+        srcclk = __HAL_RCC_GET_USART1_SOURCE();

+

+        switch(srcclk)

+        {

+        case RCC_USART1CLKSOURCE_PCLK2:

+          frequency = HAL_RCC_GetPCLK2Freq();

+          break;

+        case RCC_USART1CLKSOURCE_SYSCLK:

+          frequency = HAL_RCC_GetSysClockFreq();

+          break;

+        case RCC_USART1CLKSOURCE_HSI:

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))

+          {

+            frequency = HSI_VALUE;

+          }

+          break;

+        case RCC_USART1CLKSOURCE_LSE:

+          if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))

+          {

+            frequency = LSE_VALUE;

+          }

+          break;

+        default:

+          /* No clock source, frequency default init at 0 */

+          break;

+        }

+

+        break;

+      }

+

+    case RCC_PERIPHCLK_USART2:

+      {

+        /* Get the current USART2 source */

+        srcclk = __HAL_RCC_GET_USART2_SOURCE();

+

+        switch(srcclk)

+        {

+        case RCC_USART2CLKSOURCE_PCLK1:

+          frequency = HAL_RCC_GetPCLK1Freq();

+          break;

+        case RCC_USART2CLKSOURCE_SYSCLK:

+          frequency = HAL_RCC_GetSysClockFreq();

+          break;

+        case RCC_USART2CLKSOURCE_HSI:

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))

+          {

+            frequency = HSI_VALUE;

+          }

+          break;

+        case RCC_USART2CLKSOURCE_LSE:

+          if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))

+          {

+            frequency = LSE_VALUE;

+          }

+          break;

+        default:

+          /* No clock source, frequency default init at 0 */

+          break;

+        }

+

+        break;

+      }

+

+#if defined(USART3)

+

+    case RCC_PERIPHCLK_USART3:

+      {

+        /* Get the current USART3 source */

+        srcclk = __HAL_RCC_GET_USART3_SOURCE();

+

+        switch(srcclk)

+        {

+        case RCC_USART3CLKSOURCE_PCLK1:

+          frequency = HAL_RCC_GetPCLK1Freq();

+          break;

+        case RCC_USART3CLKSOURCE_SYSCLK:

+          frequency = HAL_RCC_GetSysClockFreq();

+          break;

+        case RCC_USART3CLKSOURCE_HSI:

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))

+          {

+            frequency = HSI_VALUE;

+          }

+          break;

+        case RCC_USART3CLKSOURCE_LSE:

+          if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))

+          {

+            frequency = LSE_VALUE;

+          }

+          break;

+        default:

+          /* No clock source, frequency default init at 0 */

+          break;

+        }

+

+        break;

+      }

+

+#endif /* USART3 */

+

+#if defined(UART4)

+

+    case RCC_PERIPHCLK_UART4:

+      {

+        /* Get the current UART4 source */

+        srcclk = __HAL_RCC_GET_UART4_SOURCE();

+

+        switch(srcclk)

+        {

+        case RCC_UART4CLKSOURCE_PCLK1:

+          frequency = HAL_RCC_GetPCLK1Freq();

+          break;

+        case RCC_UART4CLKSOURCE_SYSCLK:

+          frequency = HAL_RCC_GetSysClockFreq();

+          break;

+        case RCC_UART4CLKSOURCE_HSI:

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))

+          {

+            frequency = HSI_VALUE;

+          }

+          break;

+        case RCC_UART4CLKSOURCE_LSE:

+          if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))

+          {

+            frequency = LSE_VALUE;

+          }

+          break;

+        default:

+          /* No clock source, frequency default init at 0 */

+          break;

+        }

+

+        break;

+      }

+

+#endif /* UART4 */

+

+#if defined(UART5)

+

+    case RCC_PERIPHCLK_UART5:

+      {

+        /* Get the current UART5 source */

+        srcclk = __HAL_RCC_GET_UART5_SOURCE();

+

+        switch(srcclk)

+        {

+        case RCC_UART5CLKSOURCE_PCLK1:

+          frequency = HAL_RCC_GetPCLK1Freq();

+          break;

+        case RCC_UART5CLKSOURCE_SYSCLK:

+          frequency = HAL_RCC_GetSysClockFreq();

+          break;

+        case RCC_UART5CLKSOURCE_HSI:

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))

+          {

+            frequency = HSI_VALUE;

+          }

+          break;

+        case RCC_UART5CLKSOURCE_LSE:

+          if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))

+          {

+            frequency = LSE_VALUE;

+          }

+          break;

+        default:

+          /* No clock source, frequency default init at 0 */

+          break;

+        }

+

+        break;

+      }

+

+#endif /* UART5 */

+

+    case RCC_PERIPHCLK_LPUART1:

+      {

+        /* Get the current LPUART1 source */

+        srcclk = __HAL_RCC_GET_LPUART1_SOURCE();

+

+        switch(srcclk)

+        {

+        case RCC_LPUART1CLKSOURCE_PCLK1:

+          frequency = HAL_RCC_GetPCLK1Freq();

+          break;

+        case RCC_LPUART1CLKSOURCE_SYSCLK:

+          frequency = HAL_RCC_GetSysClockFreq();

+          break;

+        case RCC_LPUART1CLKSOURCE_HSI:

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))

+          {

+            frequency = HSI_VALUE;

+          }

+          break;

+        case RCC_LPUART1CLKSOURCE_LSE:

+          if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))

+          {

+            frequency = LSE_VALUE;

+          }

+          break;

+        default:

+          /* No clock source, frequency default init at 0 */

+          break;

+        }

+

+        break;

+      }

+

+    case RCC_PERIPHCLK_ADC:

+      {

+        srcclk = __HAL_RCC_GET_ADC_SOURCE();

+

+        switch(srcclk)

+        {

+        case RCC_ADCCLKSOURCE_SYSCLK:

+          frequency = HAL_RCC_GetSysClockFreq();

+          break;

+#if defined(RCC_PLLSAI1_SUPPORT)

+        case RCC_ADCCLKSOURCE_PLLSAI1:

+          if(__HAL_RCC_GET_PLLSAI1CLKOUT_CONFIG(RCC_PLLSAI1_ADC1CLK) != 0U)

+          {

+            plln = READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1N) >> RCC_PLLSAI1CFGR_PLLSAI1N_Pos;

+#if defined(RCC_PLLSAI1M_DIV_1_16_SUPPORT)

+            /* PLLSAI1M exists: apply PLLSAI1M divider for PLLSAI1 output computation */

+            /* f(PLLSAI1 Source) * PLLSAI1N / PLLSAI1M */

+            pllvco = ((pllvco * plln) / ((READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1M) >> RCC_PLLSAI1CFGR_PLLSAI1M_Pos) + 1U));

+#else

+            /* f(PLL Source) * PLLSAI1N / PLLM */

+            pllvco = ((pllvco * plln) / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U));

+#endif

+            /* f(PLLADC1CLK) = f(VCOSAI1 input) / PLLSAI1R */

+            frequency = (pllvco / (((READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1R) >> RCC_PLLSAI1CFGR_PLLSAI1R_Pos) + 1U) << 1U));

+          }

+          break;

+#endif /* RCC_PLLSAI1_SUPPORT */

+#if defined(STM32L471xx) || defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx) || defined(STM32L496xx) || defined(STM32L4A6xx)

+        case RCC_ADCCLKSOURCE_PLLSAI2:

+          if(__HAL_RCC_GET_PLLSAI2CLKOUT_CONFIG(RCC_PLLSAI2_ADC2CLK) != 0U)

+          {

+            plln = READ_BIT(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2N) >> RCC_PLLSAI2CFGR_PLLSAI2N_Pos;

+#if defined(RCC_PLLSAI2M_DIV_1_16_SUPPORT)

+            /* PLLSAI2M exists: apply PLLSAI2M divider for PLLSAI2 output computation */

+            /* f(PLLSAI2 Source) * PLLSAI2N / PLLSAI2M */

+            pllvco = ((pllvco * plln) / ((READ_BIT(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2M) >> RCC_PLLSAI2CFGR_PLLSAI2M_Pos) + 1U));

+#else

+            /* f(PLL Source) * PLLSAI2N / PLLM */

+            pllvco = ((pllvco * plln) / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U));

+#endif

+            /* f(PLLADC2CLK) = f(VCOSAI2 input) / PLLSAI2R */

+            frequency = (pllvco / (((READ_BIT(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2R) >> RCC_PLLSAI2CFGR_PLLSAI2R_Pos) + 1U) << 1U));

+          }

+          break;

+#endif /* STM32L471xx || STM32L475xx || STM32L476xx || STM32L485xx || STM32L486xx || STM32L496xx || STM32L4A6xx */

+        default:

+          /* No clock source, frequency default init at 0 */

+          break;

+        }

+

+        break;

+      }

+

+#if defined(DFSDM1_Filter0)

+

+    case RCC_PERIPHCLK_DFSDM1:

+      {

+        /* Get the current DFSDM1 source */

+        srcclk = __HAL_RCC_GET_DFSDM1_SOURCE();

+

+        if(srcclk == RCC_DFSDM1CLKSOURCE_PCLK2)

+        {

+          frequency = HAL_RCC_GetPCLK2Freq();

+        }

+        else

+        {

+          frequency = HAL_RCC_GetSysClockFreq();

+        }

+

+        break;

+      }

+

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+

+    case RCC_PERIPHCLK_DFSDM1AUDIO:

+      {

+        /* Get the current DFSDM1 audio source */

+        srcclk = __HAL_RCC_GET_DFSDM1AUDIO_SOURCE();

+

+        switch(srcclk)

+        {

+        case RCC_DFSDM1AUDIOCLKSOURCE_SAI1:

+          frequency = RCCEx_GetSAIxPeriphCLKFreq(RCC_PERIPHCLK_SAI1, pllvco);

+          break;

+        case RCC_DFSDM1AUDIOCLKSOURCE_MSI:

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIRDY))

+          {

+            /*MSI frequency range in HZ*/

+            frequency = MSIRangeTable[(__HAL_RCC_GET_MSI_RANGE() >> 4U)];

+          }

+          break;

+        case RCC_DFSDM1AUDIOCLKSOURCE_HSI:

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))

+          {

+            frequency = HSI_VALUE;

+          }

+          break;

+        default:

+          /* No clock source, frequency default init at 0 */

+          break;

+        }

+

+        break;

+      }

+

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+#endif /* DFSDM1_Filter0 */

+

+    case RCC_PERIPHCLK_I2C1:

+      {

+        /* Get the current I2C1 source */

+        srcclk = __HAL_RCC_GET_I2C1_SOURCE();

+

+        switch(srcclk)

+        {

+        case RCC_I2C1CLKSOURCE_PCLK1:

+          frequency = HAL_RCC_GetPCLK1Freq();

+          break;

+        case RCC_I2C1CLKSOURCE_SYSCLK:

+          frequency = HAL_RCC_GetSysClockFreq();

+          break;

+        case RCC_I2C1CLKSOURCE_HSI:

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))

+          {

+            frequency = HSI_VALUE;

+          }

+          break;

+        default:

+          /* No clock source, frequency default init at 0 */

+          break;

+        }

+

+        break;

+      }

+

+#if defined(I2C2)

+

+    case RCC_PERIPHCLK_I2C2:

+      {

+        /* Get the current I2C2 source */

+        srcclk = __HAL_RCC_GET_I2C2_SOURCE();

+

+        switch(srcclk)

+        {

+        case RCC_I2C2CLKSOURCE_PCLK1:

+          frequency = HAL_RCC_GetPCLK1Freq();

+          break;

+        case RCC_I2C2CLKSOURCE_SYSCLK:

+          frequency = HAL_RCC_GetSysClockFreq();

+          break;

+        case RCC_I2C2CLKSOURCE_HSI:

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))

+          {

+            frequency = HSI_VALUE;

+          }

+          break;

+        default:

+          /* No clock source, frequency default init at 0 */

+          break;

+        }

+

+        break;

+      }

+

+#endif /* I2C2 */

+

+    case RCC_PERIPHCLK_I2C3:

+      {

+        /* Get the current I2C3 source */

+        srcclk = __HAL_RCC_GET_I2C3_SOURCE();

+

+        switch(srcclk)

+        {

+        case RCC_I2C3CLKSOURCE_PCLK1:

+          frequency = HAL_RCC_GetPCLK1Freq();

+          break;

+        case RCC_I2C3CLKSOURCE_SYSCLK:

+          frequency = HAL_RCC_GetSysClockFreq();

+          break;

+        case RCC_I2C3CLKSOURCE_HSI:

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))

+          {

+            frequency = HSI_VALUE;

+          }

+          break;

+        default:

+          /* No clock source, frequency default init at 0 */

+          break;

+        }

+

+        break;

+      }

+

+#if defined(I2C4)

+

+    case RCC_PERIPHCLK_I2C4:

+      {

+        /* Get the current I2C4 source */

+        srcclk = __HAL_RCC_GET_I2C4_SOURCE();

+

+        switch(srcclk)

+        {

+        case RCC_I2C4CLKSOURCE_PCLK1:

+          frequency = HAL_RCC_GetPCLK1Freq();

+          break;

+        case RCC_I2C4CLKSOURCE_SYSCLK:

+          frequency = HAL_RCC_GetSysClockFreq();

+          break;

+        case RCC_I2C4CLKSOURCE_HSI:

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))

+          {

+            frequency = HSI_VALUE;

+          }

+          break;

+        default:

+          /* No clock source, frequency default init at 0 */

+          break;

+        }

+

+        break;

+      }

+

+#endif /* I2C4 */

+

+    case RCC_PERIPHCLK_LPTIM1:

+      {

+        /* Get the current LPTIM1 source */

+        srcclk = __HAL_RCC_GET_LPTIM1_SOURCE();

+

+        switch(srcclk)

+        {

+        case RCC_LPTIM1CLKSOURCE_PCLK1:

+          frequency = HAL_RCC_GetPCLK1Freq();

+          break;

+        case RCC_LPTIM1CLKSOURCE_LSI:

+          if(HAL_IS_BIT_SET(RCC->CSR, RCC_CSR_LSIRDY))

+          {

+#if defined(RCC_CSR_LSIPREDIV)

+            if(HAL_IS_BIT_SET(RCC->CSR, RCC_CSR_LSIPREDIV))

+            {

+              frequency = LSI_VALUE/128U;

+            }

+            else

+#endif /* RCC_CSR_LSIPREDIV */

+            {

+              frequency = LSI_VALUE;

+            }

+          }

+          break;

+        case RCC_LPTIM1CLKSOURCE_HSI:

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))

+          {

+            frequency = HSI_VALUE;

+          }

+          break;

+        case RCC_LPTIM1CLKSOURCE_LSE:

+          if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))

+          {

+            frequency = LSE_VALUE;

+          }

+          break;

+        default:

+          /* No clock source, frequency default init at 0 */

+          break;

+        }

+

+        break;

+      }

+

+    case RCC_PERIPHCLK_LPTIM2:

+      {

+        /* Get the current LPTIM2 source */

+       srcclk = __HAL_RCC_GET_LPTIM2_SOURCE();

+

+        switch(srcclk)

+        {

+        case RCC_LPTIM2CLKSOURCE_PCLK1:

+          frequency = HAL_RCC_GetPCLK1Freq();

+          break;

+        case RCC_LPTIM2CLKSOURCE_LSI:

+          if(HAL_IS_BIT_SET(RCC->CSR, RCC_CSR_LSIRDY))

+          {

+#if defined(RCC_CSR_LSIPREDIV)

+            if(HAL_IS_BIT_SET(RCC->CSR, RCC_CSR_LSIPREDIV))

+            {

+              frequency = LSI_VALUE/128U;

+            }

+            else

+#endif /* RCC_CSR_LSIPREDIV */

+            {

+              frequency = LSI_VALUE;

+            }

+          }

+          break;

+        case RCC_LPTIM2CLKSOURCE_HSI:

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))

+          {

+            frequency = HSI_VALUE;

+          }

+          break;

+        case RCC_LPTIM2CLKSOURCE_LSE:

+          if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))

+          {

+            frequency = LSE_VALUE;

+          }

+          break;

+        default:

+          /* No clock source, frequency default init at 0 */

+          break;

+        }

+

+        break;

+      }

+

+#if defined(SWPMI1)

+

+    case RCC_PERIPHCLK_SWPMI1:

+      {

+        /* Get the current SWPMI1 source */

+        srcclk = __HAL_RCC_GET_SWPMI1_SOURCE();

+

+        switch(srcclk)

+        {

+        case RCC_SWPMI1CLKSOURCE_PCLK1:

+          frequency = HAL_RCC_GetPCLK1Freq();

+          break;

+        case RCC_SWPMI1CLKSOURCE_HSI:

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))

+          {

+            frequency = HSI_VALUE;

+          }

+          break;

+        default:

+          /* No clock source, frequency default init at 0 */

+          break;

+        }

+

+        break;

+      }

+

+#endif /* SWPMI1 */

+

+#if defined(OCTOSPI1) || defined(OCTOSPI2)

+

+    case RCC_PERIPHCLK_OSPI:

+      {

+        /* Get the current OctoSPI clock source */

+        srcclk = __HAL_RCC_GET_OSPI_SOURCE();

+

+        switch(srcclk)

+        {

+        case RCC_OSPICLKSOURCE_SYSCLK:

+          frequency = HAL_RCC_GetSysClockFreq();

+          break;

+        case RCC_OSPICLKSOURCE_MSI:

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_MSIRDY))

+          {

+            /*MSI frequency range in HZ*/

+            frequency = MSIRangeTable[(__HAL_RCC_GET_MSI_RANGE() >> 4U)];

+          }

+          break;

+        case RCC_OSPICLKSOURCE_PLL:

+          if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))

+          {

+            if(HAL_IS_BIT_SET(RCC->PLLCFGR, RCC_PLLCFGR_PLLQEN))

+            {

+              /* f(PLL Source) * PLLN / PLLM */

+              plln = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos;

+              pllvco = ((pllvco * plln) / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U));

+              /* f(PLL48M1CLK) = f(VCO input) / PLLQ */

+              frequency = (pllvco / (((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos) + 1U) << 1U));

+            }

+          }

+          break;

+        default:

+          /* No clock source, frequency default init at 0 */

+          break;

+        }

+

+        break;

+      }

+

+#endif /* OCTOSPI1 || OCTOSPI2 */

+

+    default:

+      break;

+    }

+  }

+

+  return(frequency);

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup RCCEx_Exported_Functions_Group2 Extended Clock management functions

+ *  @brief  Extended Clock management functions

+ *

+@verbatim

+ ===============================================================================

+                ##### Extended clock management functions  #####

+ ===============================================================================

+    [..]

+    This subsection provides a set of functions allowing to control the

+    activation or deactivation of MSI PLL-mode, PLLSAI1, PLLSAI2, LSE CSS,

+    Low speed clock output and clock after wake-up from STOP mode.

+@endverbatim

+  * @{

+  */

+

+#if defined(RCC_PLLSAI1_SUPPORT)

+

+/**

+  * @brief  Enable PLLSAI1.

+  * @param  PLLSAI1Init  pointer to an RCC_PLLSAI1InitTypeDef structure that

+  *         contains the configuration information for the PLLSAI1

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI1(RCC_PLLSAI1InitTypeDef  *PLLSAI1Init)

+{

+  uint32_t tickstart;

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* check for PLLSAI1 Parameters used to output PLLSAI1CLK */

+  assert_param(IS_RCC_PLLSAI1SOURCE(PLLSAI1Init->PLLSAI1Source));

+  assert_param(IS_RCC_PLLSAI1M_VALUE(PLLSAI1Init->PLLSAI1M));

+  assert_param(IS_RCC_PLLSAI1N_VALUE(PLLSAI1Init->PLLSAI1N));

+  assert_param(IS_RCC_PLLSAI1P_VALUE(PLLSAI1Init->PLLSAI1P));

+  assert_param(IS_RCC_PLLSAI1Q_VALUE(PLLSAI1Init->PLLSAI1Q));

+  assert_param(IS_RCC_PLLSAI1R_VALUE(PLLSAI1Init->PLLSAI1R));

+  assert_param(IS_RCC_PLLSAI1CLOCKOUT_VALUE(PLLSAI1Init->PLLSAI1ClockOut));

+

+  /* Disable the PLLSAI1 */

+  __HAL_RCC_PLLSAI1_DISABLE();

+

+  /* Get Start Tick*/

+  tickstart = HAL_GetTick();

+

+  /* Wait till PLLSAI1 is ready to be updated */

+  while(READ_BIT(RCC->CR, RCC_CR_PLLSAI1RDY) != 0U)

+  {

+    if((HAL_GetTick() - tickstart) > PLLSAI1_TIMEOUT_VALUE)

+    {

+      status = HAL_TIMEOUT;

+      break;

+    }

+  }

+

+  if(status == HAL_OK)

+  {

+#if defined(RCC_PLLSAI1M_DIV_1_16_SUPPORT)

+    /* Configure the PLLSAI1 Multiplication factor N */

+    /* Configure the PLLSAI1 Division factors M, P, Q and R */

+    __HAL_RCC_PLLSAI1_CONFIG(PLLSAI1Init->PLLSAI1M, PLLSAI1Init->PLLSAI1N, PLLSAI1Init->PLLSAI1P, PLLSAI1Init->PLLSAI1Q, PLLSAI1Init->PLLSAI1R);

+#else

+    /* Configure the PLLSAI1 Multiplication factor N */

+    /* Configure the PLLSAI1 Division factors P, Q and R */

+    __HAL_RCC_PLLSAI1_CONFIG(PLLSAI1Init->PLLSAI1N, PLLSAI1Init->PLLSAI1P, PLLSAI1Init->PLLSAI1Q, PLLSAI1Init->PLLSAI1R);

+#endif /* RCC_PLLSAI1M_DIV_1_16_SUPPORT */

+    /* Configure the PLLSAI1 Clock output(s) */

+    __HAL_RCC_PLLSAI1CLKOUT_ENABLE(PLLSAI1Init->PLLSAI1ClockOut);

+

+    /* Enable the PLLSAI1 again by setting PLLSAI1ON to 1*/

+    __HAL_RCC_PLLSAI1_ENABLE();

+

+    /* Get Start Tick*/

+    tickstart = HAL_GetTick();

+

+    /* Wait till PLLSAI1 is ready */

+    while(READ_BIT(RCC->CR, RCC_CR_PLLSAI1RDY) == 0U)

+    {

+      if((HAL_GetTick() - tickstart) > PLLSAI1_TIMEOUT_VALUE)

+      {

+        status = HAL_TIMEOUT;

+        break;

+      }

+    }

+  }

+

+  return status;

+}

+

+/**

+  * @brief  Disable PLLSAI1.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI1(void)

+{

+  uint32_t tickstart;

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Disable the PLLSAI1 */

+  __HAL_RCC_PLLSAI1_DISABLE();

+

+  /* Get Start Tick*/

+  tickstart = HAL_GetTick();

+

+  /* Wait till PLLSAI1 is ready */

+  while(READ_BIT(RCC->CR, RCC_CR_PLLSAI1RDY) != 0U)

+  {

+    if((HAL_GetTick() - tickstart) > PLLSAI1_TIMEOUT_VALUE)

+    {

+      status = HAL_TIMEOUT;

+      break;

+    }

+  }

+

+  /* Disable the PLLSAI1 Clock outputs */

+  __HAL_RCC_PLLSAI1CLKOUT_DISABLE(RCC_PLLSAI1CFGR_PLLSAI1PEN|RCC_PLLSAI1CFGR_PLLSAI1QEN|RCC_PLLSAI1CFGR_PLLSAI1REN);

+

+  /* Reset PLL source to save power if no PLLs on */

+#if defined(RCC_PLLSAI2_SUPPORT)

+  if(READ_BIT(RCC->CR, (RCC_CR_PLLRDY | RCC_CR_PLLSAI2RDY)) == 0U)

+  {

+    MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, RCC_PLLSOURCE_NONE);

+  }

+#else

+  if(READ_BIT(RCC->CR, RCC_CR_PLLRDY) == 0U)

+  {

+    MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, RCC_PLLSOURCE_NONE);

+  }

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+  return status;

+}

+

+#endif /* RCC_PLLSAI1_SUPPORT */

+

+#if defined(RCC_PLLSAI2_SUPPORT)

+

+/**

+  * @brief  Enable PLLSAI2.

+  * @param  PLLSAI2Init  pointer to an RCC_PLLSAI2InitTypeDef structure that

+  *         contains the configuration information for the PLLSAI2

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI2(RCC_PLLSAI2InitTypeDef  *PLLSAI2Init)

+{

+  uint32_t tickstart;

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* check for PLLSAI2 Parameters used to output PLLSAI2CLK */

+  assert_param(IS_RCC_PLLSAI2SOURCE(PLLSAI2Init->PLLSAI2Source));

+  assert_param(IS_RCC_PLLSAI2M_VALUE(PLLSAI2Init->PLLSAI2M));

+  assert_param(IS_RCC_PLLSAI2N_VALUE(PLLSAI2Init->PLLSAI2N));

+  assert_param(IS_RCC_PLLSAI2P_VALUE(PLLSAI2Init->PLLSAI2P));

+#if defined(RCC_PLLSAI2Q_DIV_SUPPORT)

+  assert_param(IS_RCC_PLLSAI2Q_VALUE(PLLSAI2Init->PLLSAI2Q));

+#endif /* RCC_PLLSAI2Q_DIV_SUPPORT */

+  assert_param(IS_RCC_PLLSAI2R_VALUE(PLLSAI2Init->PLLSAI2R));

+  assert_param(IS_RCC_PLLSAI2CLOCKOUT_VALUE(PLLSAI2Init->PLLSAI2ClockOut));

+

+  /* Disable the PLLSAI2 */

+  __HAL_RCC_PLLSAI2_DISABLE();

+

+  /* Get Start Tick*/

+  tickstart = HAL_GetTick();

+

+  /* Wait till PLLSAI2 is ready to be updated */

+  while(READ_BIT(RCC->CR, RCC_CR_PLLSAI2RDY) != 0U)

+  {

+    if((HAL_GetTick() - tickstart) > PLLSAI2_TIMEOUT_VALUE)

+    {

+      status = HAL_TIMEOUT;

+      break;

+    }

+  }

+

+  if(status == HAL_OK)

+  {

+#if defined(RCC_PLLSAI2M_DIV_1_16_SUPPORT) && defined(RCC_PLLSAI2Q_DIV_SUPPORT)

+    /* Configure the PLLSAI2 Multiplication factor N */

+    /* Configure the PLLSAI2 Division factors M, P, Q and R */

+    __HAL_RCC_PLLSAI2_CONFIG(PLLSAI2Init->PLLSAI2M, PLLSAI2Init->PLLSAI2N, PLLSAI2Init->PLLSAI2P, PLLSAI2Init->PLLSAI2Q, PLLSAI2Init->PLLSAI2R);

+#elif defined(RCC_PLLSAI2M_DIV_1_16_SUPPORT)

+    /* Configure the PLLSAI2 Multiplication factor N */

+    /* Configure the PLLSAI2 Division factors M, P and R */

+    __HAL_RCC_PLLSAI2_CONFIG(PLLSAI2Init->PLLSAI2M, PLLSAI2Init->PLLSAI2N, PLLSAI2Init->PLLSAI2P, PLLSAI2Init->PLLSAI2R);

+#elif defined(RCC_PLLSAI2Q_DIV_SUPPORT)

+    /* Configure the PLLSAI2 Multiplication factor N */

+    /* Configure the PLLSAI2 Division factors P, Q and R */

+    __HAL_RCC_PLLSAI2_CONFIG(PLLSAI2Init->PLLSAI2N, PLLSAI2Init->PLLSAI2P, PLLSAI2Init->PLLSAI2Q, PLLSAI2Init->PLLSAI2R);

+#else

+    /* Configure the PLLSAI2 Multiplication factor N */

+    /* Configure the PLLSAI2 Division factors P and R */

+    __HAL_RCC_PLLSAI2_CONFIG(PLLSAI2Init->PLLSAI2N, PLLSAI2Init->PLLSAI2P, PLLSAI2Init->PLLSAI2R);

+#endif /* RCC_PLLSAI2M_DIV_1_16_SUPPORT && RCC_PLLSAI2Q_DIV_SUPPORT */

+    /* Configure the PLLSAI2 Clock output(s) */

+    __HAL_RCC_PLLSAI2CLKOUT_ENABLE(PLLSAI2Init->PLLSAI2ClockOut);

+

+    /* Enable the PLLSAI2 again by setting PLLSAI2ON to 1*/

+    __HAL_RCC_PLLSAI2_ENABLE();

+

+    /* Get Start Tick*/

+    tickstart = HAL_GetTick();

+

+    /* Wait till PLLSAI2 is ready */

+    while(READ_BIT(RCC->CR, RCC_CR_PLLSAI2RDY) == 0U)

+    {

+      if((HAL_GetTick() - tickstart) > PLLSAI2_TIMEOUT_VALUE)

+      {

+        status = HAL_TIMEOUT;

+        break;

+      }

+    }

+  }

+

+  return status;

+}

+

+/**

+  * @brief  Disable PLLISAI2.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI2(void)

+{

+  uint32_t tickstart;

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Disable the PLLSAI2 */

+  __HAL_RCC_PLLSAI2_DISABLE();

+

+  /* Get Start Tick*/

+  tickstart = HAL_GetTick();

+

+  /* Wait till PLLSAI2 is ready */

+  while(READ_BIT(RCC->CR, RCC_CR_PLLSAI2RDY) != 0U)

+  {

+    if((HAL_GetTick() - tickstart) > PLLSAI2_TIMEOUT_VALUE)

+    {

+      status = HAL_TIMEOUT;

+      break;

+    }

+  }

+

+  /* Disable the PLLSAI2 Clock outputs */

+#if defined(RCC_PLLSAI2Q_DIV_SUPPORT)

+  __HAL_RCC_PLLSAI2CLKOUT_DISABLE(RCC_PLLSAI2CFGR_PLLSAI2PEN|RCC_PLLSAI2CFGR_PLLSAI2QEN|RCC_PLLSAI2CFGR_PLLSAI2REN);

+#else

+  __HAL_RCC_PLLSAI2CLKOUT_DISABLE(RCC_PLLSAI2CFGR_PLLSAI2PEN|RCC_PLLSAI2CFGR_PLLSAI2REN);

+#endif /* RCC_PLLSAI2M_DIV_1_16_SUPPORT && RCC_PLLSAI2Q_DIV_SUPPORT */

+

+  /* Reset PLL source to save power if no PLLs on */

+  if(READ_BIT(RCC->CR, (RCC_CR_PLLRDY | RCC_CR_PLLSAI1RDY)) == 0U)

+  {

+    MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, RCC_PLLSOURCE_NONE);

+  }

+

+  return status;

+}

+

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+/**

+  * @brief  Configure the oscillator clock source for wakeup from Stop and CSS backup clock.

+  * @param  WakeUpClk  Wakeup clock

+  *         This parameter can be one of the following values:

+  *            @arg @ref RCC_STOP_WAKEUPCLOCK_MSI  MSI oscillator selection

+  *            @arg @ref RCC_STOP_WAKEUPCLOCK_HSI  HSI oscillator selection

+  * @note   This function shall not be called after the Clock Security System on HSE has been

+  *         enabled.

+  * @retval None

+  */

+void HAL_RCCEx_WakeUpStopCLKConfig(uint32_t WakeUpClk)

+{

+  assert_param(IS_RCC_STOP_WAKEUPCLOCK(WakeUpClk));

+

+  __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(WakeUpClk);

+}

+

+/**

+  * @brief  Configure the MSI range after standby mode.

+  * @note   After Standby its frequency can be selected between 4 possible values (1, 2, 4 or 8 MHz).

+  * @param  MSIRange  MSI range

+  *         This parameter can be one of the following values:

+  *            @arg @ref RCC_MSIRANGE_4  Range 4 around 1 MHz

+  *            @arg @ref RCC_MSIRANGE_5  Range 5 around 2 MHz

+  *            @arg @ref RCC_MSIRANGE_6  Range 6 around 4 MHz (reset value)

+  *            @arg @ref RCC_MSIRANGE_7  Range 7 around 8 MHz

+  * @retval None

+  */

+void HAL_RCCEx_StandbyMSIRangeConfig(uint32_t MSIRange)

+{

+  assert_param(IS_RCC_MSI_STANDBY_CLOCK_RANGE(MSIRange));

+

+  __HAL_RCC_MSI_STANDBY_RANGE_CONFIG(MSIRange);

+}

+

+/**

+  * @brief  Enable the LSE Clock Security System.

+  * @note   Prior to enable the LSE Clock Security System, LSE oscillator is to be enabled

+  *         with HAL_RCC_OscConfig() and the LSE oscillator clock is to be selected as RTC

+  *         clock with HAL_RCCEx_PeriphCLKConfig().

+  * @retval None

+  */

+void HAL_RCCEx_EnableLSECSS(void)

+{

+  SET_BIT(RCC->BDCR, RCC_BDCR_LSECSSON) ;

+}

+

+/**

+  * @brief  Disable the LSE Clock Security System.

+  * @note   LSE Clock Security System can only be disabled after a LSE failure detection.

+  * @retval None

+  */

+void HAL_RCCEx_DisableLSECSS(void)

+{

+  CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSECSSON) ;

+

+  /* Disable LSE CSS IT if any */

+  __HAL_RCC_DISABLE_IT(RCC_IT_LSECSS);

+}

+

+/**

+  * @brief  Enable the LSE Clock Security System Interrupt & corresponding EXTI line.

+  * @note   LSE Clock Security System Interrupt is mapped on RTC EXTI line 19

+  * @retval None

+  */

+void HAL_RCCEx_EnableLSECSS_IT(void)

+{

+  /* Enable LSE CSS */

+  SET_BIT(RCC->BDCR, RCC_BDCR_LSECSSON) ;

+

+  /* Enable LSE CSS IT */

+  __HAL_RCC_ENABLE_IT(RCC_IT_LSECSS);

+

+  /* Enable IT on EXTI Line 19 */

+  __HAL_RCC_LSECSS_EXTI_ENABLE_IT();

+  __HAL_RCC_LSECSS_EXTI_ENABLE_RISING_EDGE();

+}

+

+/**

+  * @brief Handle the RCC LSE Clock Security System interrupt request.

+  * @retval None

+  */

+void HAL_RCCEx_LSECSS_IRQHandler(void)

+{

+  /* Check RCC LSE CSSF flag  */

+  if(__HAL_RCC_GET_IT(RCC_IT_LSECSS))

+  {

+    /* RCC LSE Clock Security System interrupt user callback */

+    HAL_RCCEx_LSECSS_Callback();

+

+    /* Clear RCC LSE CSS pending bit */

+    __HAL_RCC_CLEAR_IT(RCC_IT_LSECSS);

+  }

+}

+

+/**

+  * @brief  RCCEx LSE Clock Security System interrupt callback.

+  * @retval none

+  */

+__weak void HAL_RCCEx_LSECSS_Callback(void)

+{

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the @ref HAL_RCCEx_LSECSS_Callback should be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Select the Low Speed clock source to output on LSCO pin (PA2).

+  * @param  LSCOSource  specifies the Low Speed clock source to output.

+  *          This parameter can be one of the following values:

+  *            @arg @ref RCC_LSCOSOURCE_LSI  LSI clock selected as LSCO source

+  *            @arg @ref RCC_LSCOSOURCE_LSE  LSE clock selected as LSCO source

+  * @retval None

+  */

+void HAL_RCCEx_EnableLSCO(uint32_t LSCOSource)

+{

+  GPIO_InitTypeDef GPIO_InitStruct;

+  FlagStatus       pwrclkchanged = RESET;

+  FlagStatus       backupchanged = RESET;

+

+  /* Check the parameters */

+  assert_param(IS_RCC_LSCOSOURCE(LSCOSource));

+

+  /* LSCO Pin Clock Enable */

+  __LSCO_CLK_ENABLE();

+

+  /* Configue the LSCO pin in analog mode */

+  GPIO_InitStruct.Pin = LSCO_PIN;

+  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;

+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

+  GPIO_InitStruct.Pull = GPIO_NOPULL;

+  HAL_GPIO_Init(LSCO_GPIO_PORT, &GPIO_InitStruct);

+

+  /* Update LSCOSEL clock source in Backup Domain control register */

+  if(__HAL_RCC_PWR_IS_CLK_DISABLED())

+  {

+    __HAL_RCC_PWR_CLK_ENABLE();

+    pwrclkchanged = SET;

+  }

+  if(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP))

+  {

+    HAL_PWR_EnableBkUpAccess();

+    backupchanged = SET;

+  }

+

+  MODIFY_REG(RCC->BDCR, RCC_BDCR_LSCOSEL | RCC_BDCR_LSCOEN, LSCOSource | RCC_BDCR_LSCOEN);

+

+  if(backupchanged == SET)

+  {

+    HAL_PWR_DisableBkUpAccess();

+  }

+  if(pwrclkchanged == SET)

+  {

+    __HAL_RCC_PWR_CLK_DISABLE();

+  }

+}

+

+/**

+  * @brief  Disable the Low Speed clock output.

+  * @retval None

+  */

+void HAL_RCCEx_DisableLSCO(void)

+{

+  FlagStatus       pwrclkchanged = RESET;

+  FlagStatus       backupchanged = RESET;

+

+  /* Update LSCOEN bit in Backup Domain control register */

+  if(__HAL_RCC_PWR_IS_CLK_DISABLED())

+  {

+    __HAL_RCC_PWR_CLK_ENABLE();

+    pwrclkchanged = SET;

+  }

+  if(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP))

+  {

+    /* Enable access to the backup domain */

+    HAL_PWR_EnableBkUpAccess();

+    backupchanged = SET;

+  }

+

+  CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSCOEN);

+

+  /* Restore previous configuration */

+  if(backupchanged == SET)

+  {

+    /* Disable access to the backup domain */

+    HAL_PWR_DisableBkUpAccess();

+  }

+  if(pwrclkchanged == SET)

+  {

+    __HAL_RCC_PWR_CLK_DISABLE();

+  }

+}

+

+/**

+  * @brief  Enable the PLL-mode of the MSI.

+  * @note   Prior to enable the PLL-mode of the MSI for automatic hardware

+  *         calibration LSE oscillator is to be enabled with HAL_RCC_OscConfig().

+  * @retval None

+  */

+void HAL_RCCEx_EnableMSIPLLMode(void)

+{

+  SET_BIT(RCC->CR, RCC_CR_MSIPLLEN) ;

+}

+

+/**

+  * @brief  Disable the PLL-mode of the MSI.

+  * @note   PLL-mode of the MSI is automatically reset when LSE oscillator is disabled.

+  * @retval None

+  */

+void HAL_RCCEx_DisableMSIPLLMode(void)

+{

+  CLEAR_BIT(RCC->CR, RCC_CR_MSIPLLEN) ;

+}

+

+/**

+  * @}

+  */

+

+#if defined(CRS)

+

+/** @defgroup RCCEx_Exported_Functions_Group3 Extended Clock Recovery System Control functions

+ *  @brief  Extended Clock Recovery System Control functions

+ *

+@verbatim

+ ===============================================================================

+                ##### Extended Clock Recovery System Control functions  #####

+ ===============================================================================

+    [..]

+      For devices with Clock Recovery System feature (CRS), RCC Extention HAL driver can be used as follows:

+

+      (#) In System clock config, HSI48 needs to be enabled

+

+      (#) Enable CRS clock in IP MSP init which will use CRS functions

+

+      (#) Call CRS functions as follows:

+          (##) Prepare synchronization configuration necessary for HSI48 calibration

+              (+++) Default values can be set for frequency Error Measurement (reload and error limit)

+                        and also HSI48 oscillator smooth trimming.

+              (+++) Macro __HAL_RCC_CRS_RELOADVALUE_CALCULATE can be also used to calculate

+                        directly reload value with target and sychronization frequencies values

+          (##) Call function HAL_RCCEx_CRSConfig which

+              (+++) Resets CRS registers to their default values.

+              (+++) Configures CRS registers with synchronization configuration

+              (+++) Enables automatic calibration and frequency error counter feature

+           Note: When using USB LPM (Link Power Management) and the device is in Sleep mode, the

+           periodic USB SOF will not be generated by the host. No SYNC signal will therefore be

+           provided to the CRS to calibrate the HSI48 on the run. To guarantee the required clock

+           precision after waking up from Sleep mode, the LSE or reference clock on the GPIOs

+           should be used as SYNC signal.

+

+          (##) A polling function is provided to wait for complete synchronization

+              (+++) Call function HAL_RCCEx_CRSWaitSynchronization()

+              (+++) According to CRS status, user can decide to adjust again the calibration or continue

+                        application if synchronization is OK

+

+      (#) User can retrieve information related to synchronization in calling function

+            HAL_RCCEx_CRSGetSynchronizationInfo()

+

+      (#) Regarding synchronization status and synchronization information, user can try a new calibration

+           in changing synchronization configuration and call again HAL_RCCEx_CRSConfig.

+           Note: When the SYNC event is detected during the downcounting phase (before reaching the zero value),

+           it means that the actual frequency is lower than the target (and so, that the TRIM value should be

+           incremented), while when it is detected during the upcounting phase it means that the actual frequency

+           is higher (and that the TRIM value should be decremented).

+

+      (#) In interrupt mode, user can resort to the available macros (__HAL_RCC_CRS_XXX_IT). Interrupts will go

+          through CRS Handler (CRS_IRQn/CRS_IRQHandler)

+              (++) Call function HAL_RCCEx_CRSConfig()

+              (++) Enable CRS_IRQn (thanks to NVIC functions)

+              (++) Enable CRS interrupt (__HAL_RCC_CRS_ENABLE_IT)

+              (++) Implement CRS status management in the following user callbacks called from

+                   HAL_RCCEx_CRS_IRQHandler():

+                   (+++) HAL_RCCEx_CRS_SyncOkCallback()

+                   (+++) HAL_RCCEx_CRS_SyncWarnCallback()

+                   (+++) HAL_RCCEx_CRS_ExpectedSyncCallback()

+                   (+++) HAL_RCCEx_CRS_ErrorCallback()

+

+      (#) To force a SYNC EVENT, user can use the function HAL_RCCEx_CRSSoftwareSynchronizationGenerate().

+          This function can be called before calling HAL_RCCEx_CRSConfig (for instance in Systick handler)

+

+@endverbatim

+ * @{

+ */

+

+/**

+  * @brief  Start automatic synchronization for polling mode

+  * @param  pInit Pointer on RCC_CRSInitTypeDef structure

+  * @retval None

+  */

+void HAL_RCCEx_CRSConfig(RCC_CRSInitTypeDef *pInit)

+{

+  uint32_t value;  /* no init needed */

+

+  /* Check the parameters */

+  assert_param(IS_RCC_CRS_SYNC_DIV(pInit->Prescaler));

+  assert_param(IS_RCC_CRS_SYNC_SOURCE(pInit->Source));

+  assert_param(IS_RCC_CRS_SYNC_POLARITY(pInit->Polarity));

+  assert_param(IS_RCC_CRS_RELOADVALUE(pInit->ReloadValue));

+  assert_param(IS_RCC_CRS_ERRORLIMIT(pInit->ErrorLimitValue));

+  assert_param(IS_RCC_CRS_HSI48CALIBRATION(pInit->HSI48CalibrationValue));

+

+  /* CONFIGURATION */

+

+  /* Before configuration, reset CRS registers to their default values*/

+  __HAL_RCC_CRS_FORCE_RESET();

+  __HAL_RCC_CRS_RELEASE_RESET();

+

+  /* Set the SYNCDIV[2:0] bits according to Prescaler value */

+  /* Set the SYNCSRC[1:0] bits according to Source value */

+  /* Set the SYNCSPOL bit according to Polarity value */

+  value = (pInit->Prescaler | pInit->Source | pInit->Polarity);

+  /* Set the RELOAD[15:0] bits according to ReloadValue value */

+  value |= pInit->ReloadValue;

+  /* Set the FELIM[7:0] bits according to ErrorLimitValue value */

+  value |= (pInit->ErrorLimitValue << CRS_CFGR_FELIM_Pos);

+  WRITE_REG(CRS->CFGR, value);

+

+  /* Adjust HSI48 oscillator smooth trimming */

+  /* Set the TRIM[6:0] bits for STM32L412xx/L422xx or TRIM[5:0] bits otherwise

+     according to RCC_CRS_HSI48CalibrationValue value */

+  MODIFY_REG(CRS->CR, CRS_CR_TRIM, (pInit->HSI48CalibrationValue << CRS_CR_TRIM_Pos));

+

+  /* START AUTOMATIC SYNCHRONIZATION*/

+

+  /* Enable Automatic trimming & Frequency error counter */

+  SET_BIT(CRS->CR, CRS_CR_AUTOTRIMEN | CRS_CR_CEN);

+}

+

+/**

+  * @brief  Generate the software synchronization event

+  * @retval None

+  */

+void HAL_RCCEx_CRSSoftwareSynchronizationGenerate(void)

+{

+  SET_BIT(CRS->CR, CRS_CR_SWSYNC);

+}

+

+/**

+  * @brief  Return synchronization info

+  * @param  pSynchroInfo Pointer on RCC_CRSSynchroInfoTypeDef structure

+  * @retval None

+  */

+void HAL_RCCEx_CRSGetSynchronizationInfo(RCC_CRSSynchroInfoTypeDef *pSynchroInfo)

+{

+  /* Check the parameter */

+  assert_param(pSynchroInfo != (void *)NULL);

+

+  /* Get the reload value */

+  pSynchroInfo->ReloadValue = (READ_BIT(CRS->CFGR, CRS_CFGR_RELOAD));

+

+  /* Get HSI48 oscillator smooth trimming */

+  pSynchroInfo->HSI48CalibrationValue = (READ_BIT(CRS->CR, CRS_CR_TRIM) >> CRS_CR_TRIM_Pos);

+

+  /* Get Frequency error capture */

+  pSynchroInfo->FreqErrorCapture = (READ_BIT(CRS->ISR, CRS_ISR_FECAP) >> CRS_ISR_FECAP_Pos);

+

+  /* Get Frequency error direction */

+  pSynchroInfo->FreqErrorDirection = (READ_BIT(CRS->ISR, CRS_ISR_FEDIR));

+}

+

+/**

+* @brief Wait for CRS Synchronization status.

+* @param Timeout  Duration of the timeout

+* @note  Timeout is based on the maximum time to receive a SYNC event based on synchronization

+*        frequency.

+* @note    If Timeout set to HAL_MAX_DELAY, HAL_TIMEOUT will be never returned.

+* @retval Combination of Synchronization status

+*          This parameter can be a combination of the following values:

+*            @arg @ref RCC_CRS_TIMEOUT

+*            @arg @ref RCC_CRS_SYNCOK

+*            @arg @ref RCC_CRS_SYNCWARN

+*            @arg @ref RCC_CRS_SYNCERR

+*            @arg @ref RCC_CRS_SYNCMISS

+*            @arg @ref RCC_CRS_TRIMOVF

+*/

+uint32_t HAL_RCCEx_CRSWaitSynchronization(uint32_t Timeout)

+{

+  uint32_t crsstatus = RCC_CRS_NONE;

+  uint32_t tickstart;

+

+  /* Get timeout */

+  tickstart = HAL_GetTick();

+

+  /* Wait for CRS flag or timeout detection */

+  do

+  {

+    if(Timeout != HAL_MAX_DELAY)

+    {

+      if(((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))

+      {

+        crsstatus = RCC_CRS_TIMEOUT;

+      }

+    }

+    /* Check CRS SYNCOK flag  */

+    if(__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCOK))

+    {

+      /* CRS SYNC event OK */

+      crsstatus |= RCC_CRS_SYNCOK;

+

+      /* Clear CRS SYNC event OK bit */

+      __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_SYNCOK);

+    }

+

+    /* Check CRS SYNCWARN flag  */

+    if(__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCWARN))

+    {

+      /* CRS SYNC warning */

+      crsstatus |= RCC_CRS_SYNCWARN;

+

+      /* Clear CRS SYNCWARN bit */

+      __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_SYNCWARN);

+    }

+

+    /* Check CRS TRIM overflow flag  */

+    if(__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_TRIMOVF))

+    {

+      /* CRS SYNC Error */

+      crsstatus |= RCC_CRS_TRIMOVF;

+

+      /* Clear CRS Error bit */

+      __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_TRIMOVF);

+    }

+

+    /* Check CRS Error flag  */

+    if(__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCERR))

+    {

+      /* CRS SYNC Error */

+      crsstatus |= RCC_CRS_SYNCERR;

+

+      /* Clear CRS Error bit */

+      __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_SYNCERR);

+    }

+

+    /* Check CRS SYNC Missed flag  */

+    if(__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_SYNCMISS))

+    {

+      /* CRS SYNC Missed */

+      crsstatus |= RCC_CRS_SYNCMISS;

+

+      /* Clear CRS SYNC Missed bit */

+      __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_SYNCMISS);

+    }

+

+    /* Check CRS Expected SYNC flag  */

+    if(__HAL_RCC_CRS_GET_FLAG(RCC_CRS_FLAG_ESYNC))

+    {

+      /* frequency error counter reached a zero value */

+      __HAL_RCC_CRS_CLEAR_FLAG(RCC_CRS_FLAG_ESYNC);

+    }

+  } while(RCC_CRS_NONE == crsstatus);

+

+  return crsstatus;

+}

+

+/**

+  * @brief Handle the Clock Recovery System interrupt request.

+  * @retval None

+  */

+void HAL_RCCEx_CRS_IRQHandler(void)

+{

+  uint32_t crserror = RCC_CRS_NONE;

+  /* Get current IT flags and IT sources values */

+  uint32_t itflags = READ_REG(CRS->ISR);

+  uint32_t itsources = READ_REG(CRS->CR);

+

+  /* Check CRS SYNCOK flag  */

+  if(((itflags & RCC_CRS_FLAG_SYNCOK) != 0U) && ((itsources & RCC_CRS_IT_SYNCOK) != 0U))

+  {

+    /* Clear CRS SYNC event OK flag */

+    WRITE_REG(CRS->ICR, CRS_ICR_SYNCOKC);

+

+    /* user callback */

+    HAL_RCCEx_CRS_SyncOkCallback();

+  }

+  /* Check CRS SYNCWARN flag  */

+  else if(((itflags & RCC_CRS_FLAG_SYNCWARN) != 0U) && ((itsources & RCC_CRS_IT_SYNCWARN) != 0U))

+  {

+    /* Clear CRS SYNCWARN flag */

+    WRITE_REG(CRS->ICR, CRS_ICR_SYNCWARNC);

+

+    /* user callback */

+    HAL_RCCEx_CRS_SyncWarnCallback();

+  }

+  /* Check CRS Expected SYNC flag  */

+  else if(((itflags & RCC_CRS_FLAG_ESYNC) != 0U) && ((itsources & RCC_CRS_IT_ESYNC) != 0U))

+  {

+    /* frequency error counter reached a zero value */

+    WRITE_REG(CRS->ICR, CRS_ICR_ESYNCC);

+

+    /* user callback */

+    HAL_RCCEx_CRS_ExpectedSyncCallback();

+  }

+  /* Check CRS Error flags  */

+  else

+  {

+    if(((itflags & RCC_CRS_FLAG_ERR) != 0U) && ((itsources & RCC_CRS_IT_ERR) != 0U))

+    {

+      if((itflags & RCC_CRS_FLAG_SYNCERR) != 0U)

+      {

+        crserror |= RCC_CRS_SYNCERR;

+      }

+      if((itflags & RCC_CRS_FLAG_SYNCMISS) != 0U)

+      {

+        crserror |= RCC_CRS_SYNCMISS;

+      }

+      if((itflags & RCC_CRS_FLAG_TRIMOVF) != 0U)

+      {

+        crserror |= RCC_CRS_TRIMOVF;

+      }

+

+      /* Clear CRS Error flags */

+      WRITE_REG(CRS->ICR, CRS_ICR_ERRC);

+

+      /* user error callback */

+      HAL_RCCEx_CRS_ErrorCallback(crserror);

+    }

+  }

+}

+

+/**

+  * @brief  RCCEx Clock Recovery System SYNCOK interrupt callback.

+  * @retval none

+  */

+__weak void HAL_RCCEx_CRS_SyncOkCallback(void)

+{

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the @ref HAL_RCCEx_CRS_SyncOkCallback should be implemented in the user file

+   */

+}

+

+/**

+  * @brief  RCCEx Clock Recovery System SYNCWARN interrupt callback.

+  * @retval none

+  */

+__weak void HAL_RCCEx_CRS_SyncWarnCallback(void)

+{

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the @ref HAL_RCCEx_CRS_SyncWarnCallback should be implemented in the user file

+   */

+}

+

+/**

+  * @brief  RCCEx Clock Recovery System Expected SYNC interrupt callback.

+  * @retval none

+  */

+__weak void HAL_RCCEx_CRS_ExpectedSyncCallback(void)

+{

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the @ref HAL_RCCEx_CRS_ExpectedSyncCallback should be implemented in the user file

+   */

+}

+

+/**

+  * @brief  RCCEx Clock Recovery System Error interrupt callback.

+  * @param  Error Combination of Error status.

+  *         This parameter can be a combination of the following values:

+  *           @arg @ref RCC_CRS_SYNCERR

+  *           @arg @ref RCC_CRS_SYNCMISS

+  *           @arg @ref RCC_CRS_TRIMOVF

+  * @retval none

+  */

+__weak void HAL_RCCEx_CRS_ErrorCallback(uint32_t Error)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(Error);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the @ref HAL_RCCEx_CRS_ErrorCallback should be implemented in the user file

+   */

+}

+

+/**

+  * @}

+  */

+

+#endif /* CRS */

+

+/**

+  * @}

+  */

+

+/** @addtogroup RCCEx_Private_Functions

+ * @{

+ */

+

+#if defined(RCC_PLLSAI1_SUPPORT)

+

+/**

+  * @brief  Configure the parameters N & P & optionally M of PLLSAI1 and enable PLLSAI1 output clock(s).

+  * @param  PllSai1  pointer to an RCC_PLLSAI1InitTypeDef structure that

+  *         contains the configuration parameters N & P & optionally M as well as PLLSAI1 output clock(s)

+  * @param  Divider  divider parameter to be updated

+  *

+  * @note   PLLSAI1 is temporary disable to apply new parameters

+  *

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef RCCEx_PLLSAI1_Config(RCC_PLLSAI1InitTypeDef *PllSai1, uint32_t Divider)

+{

+  uint32_t tickstart;

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* check for PLLSAI1 Parameters used to output PLLSAI1CLK */

+  /* P, Q and R dividers are verified in each specific divider case below */

+  assert_param(IS_RCC_PLLSAI1SOURCE(PllSai1->PLLSAI1Source));

+  assert_param(IS_RCC_PLLSAI1M_VALUE(PllSai1->PLLSAI1M));

+  assert_param(IS_RCC_PLLSAI1N_VALUE(PllSai1->PLLSAI1N));

+  assert_param(IS_RCC_PLLSAI1CLOCKOUT_VALUE(PllSai1->PLLSAI1ClockOut));

+

+  /* Check that PLLSAI1 clock source and divider M can be applied */

+  if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_NONE)

+  {

+    /* PLL clock source and divider M already set, check that no request for change  */

+    if((__HAL_RCC_GET_PLL_OSCSOURCE() != PllSai1->PLLSAI1Source)

+       ||

+       (PllSai1->PLLSAI1Source == RCC_PLLSOURCE_NONE)

+#if !defined(RCC_PLLSAI1M_DIV_1_16_SUPPORT)

+       ||

+       (((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U) != PllSai1->PLLSAI1M)

+#endif

+      )

+    {

+      status = HAL_ERROR;

+    }

+  }

+  else

+  {

+    /* Check PLLSAI1 clock source availability */

+    switch(PllSai1->PLLSAI1Source)

+    {

+    case RCC_PLLSOURCE_MSI:

+      if(HAL_IS_BIT_CLR(RCC->CR, RCC_CR_MSIRDY))

+      {

+        status = HAL_ERROR;

+      }

+      break;

+    case RCC_PLLSOURCE_HSI:

+      if(HAL_IS_BIT_CLR(RCC->CR, RCC_CR_HSIRDY))

+      {

+        status = HAL_ERROR;

+      }

+      break;

+    case RCC_PLLSOURCE_HSE:

+      if(HAL_IS_BIT_CLR(RCC->CR, RCC_CR_HSERDY))

+      {

+        if(HAL_IS_BIT_CLR(RCC->CR, RCC_CR_HSEBYP))

+        {

+          status = HAL_ERROR;

+        }

+      }

+      break;

+    default:

+      status = HAL_ERROR;

+      break;

+    }

+

+    if(status == HAL_OK)

+    {

+#if defined(RCC_PLLSAI1M_DIV_1_16_SUPPORT)

+      /* Set PLLSAI1 clock source */

+      MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, PllSai1->PLLSAI1Source);

+#else

+      /* Set PLLSAI1 clock source and divider M */

+      MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM, PllSai1->PLLSAI1Source | (PllSai1->PLLSAI1M - 1U) << RCC_PLLCFGR_PLLM_Pos);

+#endif

+    }

+  }

+

+  if(status == HAL_OK)

+  {

+    /* Disable the PLLSAI1 */

+    __HAL_RCC_PLLSAI1_DISABLE();

+

+    /* Get Start Tick*/

+    tickstart = HAL_GetTick();

+

+    /* Wait till PLLSAI1 is ready to be updated */

+    while(READ_BIT(RCC->CR, RCC_CR_PLLSAI1RDY) != 0U)

+    {

+      if((HAL_GetTick() - tickstart) > PLLSAI1_TIMEOUT_VALUE)

+      {

+        status = HAL_TIMEOUT;

+        break;

+      }

+    }

+

+    if(status == HAL_OK)

+    {

+      if(Divider == DIVIDER_P_UPDATE)

+      {

+        assert_param(IS_RCC_PLLSAI1P_VALUE(PllSai1->PLLSAI1P));

+#if defined(RCC_PLLSAI1M_DIV_1_16_SUPPORT)

+

+        /* Configure the PLLSAI1 Division factor M, P and Multiplication factor N*/

+#if defined(RCC_PLLSAI1P_DIV_2_31_SUPPORT)

+        MODIFY_REG(RCC->PLLSAI1CFGR,

+                   RCC_PLLSAI1CFGR_PLLSAI1N | RCC_PLLSAI1CFGR_PLLSAI1PDIV | RCC_PLLSAI1CFGR_PLLSAI1M,

+                   (PllSai1->PLLSAI1N << RCC_PLLSAI1CFGR_PLLSAI1N_Pos) |

+                   (PllSai1->PLLSAI1P << RCC_PLLSAI1CFGR_PLLSAI1PDIV_Pos) |

+                   ((PllSai1->PLLSAI1M - 1U) << RCC_PLLSAI1CFGR_PLLSAI1M_Pos));

+#else

+        MODIFY_REG(RCC->PLLSAI1CFGR,

+                   RCC_PLLSAI1CFGR_PLLSAI1N | RCC_PLLSAI1CFGR_PLLSAI1P | RCC_PLLSAI1CFGR_PLLSAI1M,

+                   (PllSai1->PLLSAI1N << RCC_PLLSAI1CFGR_PLLSAI1N_Pos) |

+                   ((PllSai1->PLLSAI1P >> 4U) << RCC_PLLSAI1CFGR_PLLSAI1P_Pos) |

+                   ((PllSai1->PLLSAI1M - 1U) << RCC_PLLSAI1CFGR_PLLSAI1M_Pos));

+#endif /* RCC_PLLSAI1P_DIV_2_31_SUPPORT */

+

+#else

+        /* Configure the PLLSAI1 Division factor P and Multiplication factor N*/

+#if defined(RCC_PLLSAI1P_DIV_2_31_SUPPORT)

+        MODIFY_REG(RCC->PLLSAI1CFGR,

+                   RCC_PLLSAI1CFGR_PLLSAI1N | RCC_PLLSAI1CFGR_PLLSAI1PDIV,

+                   (PllSai1->PLLSAI1N << RCC_PLLSAI1CFGR_PLLSAI1N_Pos) |

+                   (PllSai1->PLLSAI1P << RCC_PLLSAI1CFGR_PLLSAI1PDIV_Pos));

+#else

+        MODIFY_REG(RCC->PLLSAI1CFGR,

+                   RCC_PLLSAI1CFGR_PLLSAI1N | RCC_PLLSAI1CFGR_PLLSAI1P,

+                   (PllSai1->PLLSAI1N << RCC_PLLSAI1CFGR_PLLSAI1N_Pos) |

+                   ((PllSai1->PLLSAI1P >> 4U) << RCC_PLLSAI1CFGR_PLLSAI1P_Pos));

+#endif /* RCC_PLLSAI1P_DIV_2_31_SUPPORT */

+

+#endif /* RCC_PLLSAI1M_DIV_1_16_SUPPORT */

+      }

+      else if(Divider == DIVIDER_Q_UPDATE)

+      {

+        assert_param(IS_RCC_PLLSAI1Q_VALUE(PllSai1->PLLSAI1Q));

+#if defined(RCC_PLLSAI1M_DIV_1_16_SUPPORT)

+        /* Configure the PLLSAI1 Division factor M, Q and Multiplication factor N*/

+        MODIFY_REG(RCC->PLLSAI1CFGR,

+                   RCC_PLLSAI1CFGR_PLLSAI1N | RCC_PLLSAI1CFGR_PLLSAI1Q | RCC_PLLSAI1CFGR_PLLSAI1M,

+                   (PllSai1->PLLSAI1N << RCC_PLLSAI1CFGR_PLLSAI1N_Pos) |

+                   (((PllSai1->PLLSAI1Q >> 1U) - 1U) << RCC_PLLSAI1CFGR_PLLSAI1Q_Pos) |

+                   ((PllSai1->PLLSAI1M - 1U) << RCC_PLLSAI1CFGR_PLLSAI1M_Pos));

+#else

+        /* Configure the PLLSAI1 Division factor Q and Multiplication factor N*/

+        MODIFY_REG(RCC->PLLSAI1CFGR,

+                   RCC_PLLSAI1CFGR_PLLSAI1N | RCC_PLLSAI1CFGR_PLLSAI1Q,

+                   (PllSai1->PLLSAI1N << RCC_PLLSAI1CFGR_PLLSAI1N_Pos) |

+                   (((PllSai1->PLLSAI1Q >> 1U) - 1U) << RCC_PLLSAI1CFGR_PLLSAI1Q_Pos));

+#endif /* RCC_PLLSAI1M_DIV_1_16_SUPPORT */

+      }

+      else

+      {

+        assert_param(IS_RCC_PLLSAI1R_VALUE(PllSai1->PLLSAI1R));

+#if defined(RCC_PLLSAI1M_DIV_1_16_SUPPORT)

+        /* Configure the PLLSAI1 Division factor M, R and Multiplication factor N*/

+        MODIFY_REG(RCC->PLLSAI1CFGR,

+                   RCC_PLLSAI1CFGR_PLLSAI1N | RCC_PLLSAI1CFGR_PLLSAI1R | RCC_PLLSAI1CFGR_PLLSAI1M,

+                   (PllSai1->PLLSAI1N << RCC_PLLSAI1CFGR_PLLSAI1N_Pos) |

+                   (((PllSai1->PLLSAI1R >> 1U) - 1U) << RCC_PLLSAI1CFGR_PLLSAI1R_Pos) |

+                   ((PllSai1->PLLSAI1M - 1U) << RCC_PLLSAI1CFGR_PLLSAI1M_Pos));

+#else

+        /* Configure the PLLSAI1 Division factor R and Multiplication factor N*/

+        MODIFY_REG(RCC->PLLSAI1CFGR,

+                   RCC_PLLSAI1CFGR_PLLSAI1N | RCC_PLLSAI1CFGR_PLLSAI1R,

+                   (PllSai1->PLLSAI1N << RCC_PLLSAI1CFGR_PLLSAI1N_Pos) |

+                   (((PllSai1->PLLSAI1R >> 1U) - 1U) << RCC_PLLSAI1CFGR_PLLSAI1R_Pos));

+#endif /* RCC_PLLSAI1M_DIV_1_16_SUPPORT */

+      }

+

+      /* Enable the PLLSAI1 again by setting PLLSAI1ON to 1*/

+      __HAL_RCC_PLLSAI1_ENABLE();

+

+      /* Get Start Tick*/

+      tickstart = HAL_GetTick();

+

+      /* Wait till PLLSAI1 is ready */

+      while(READ_BIT(RCC->CR, RCC_CR_PLLSAI1RDY) == 0U)

+      {

+        if((HAL_GetTick() - tickstart) > PLLSAI1_TIMEOUT_VALUE)

+        {

+          status = HAL_TIMEOUT;

+          break;

+        }

+      }

+

+      if(status == HAL_OK)

+      {

+        /* Configure the PLLSAI1 Clock output(s) */

+        __HAL_RCC_PLLSAI1CLKOUT_ENABLE(PllSai1->PLLSAI1ClockOut);

+      }

+    }

+  }

+

+  return status;

+}

+

+#endif /* RCC_PLLSAI1_SUPPORT */

+

+#if defined(RCC_PLLSAI2_SUPPORT)

+

+/**

+  * @brief  Configure the parameters N & P & optionally M of PLLSAI2 and enable PLLSAI2 output clock(s).

+  * @param  PllSai2  pointer to an RCC_PLLSAI2InitTypeDef structure that

+  *         contains the configuration parameters N & P & optionally M as well as PLLSAI2 output clock(s)

+  * @param  Divider  divider parameter to be updated

+  *

+  * @note   PLLSAI2 is temporary disable to apply new parameters

+  *

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef RCCEx_PLLSAI2_Config(RCC_PLLSAI2InitTypeDef *PllSai2, uint32_t Divider)

+{

+  uint32_t tickstart;

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* check for PLLSAI2 Parameters used to output PLLSAI2CLK */

+  /* P, Q and R dividers are verified in each specific divider case below */

+  assert_param(IS_RCC_PLLSAI2SOURCE(PllSai2->PLLSAI2Source));

+  assert_param(IS_RCC_PLLSAI2M_VALUE(PllSai2->PLLSAI2M));

+  assert_param(IS_RCC_PLLSAI2N_VALUE(PllSai2->PLLSAI2N));

+  assert_param(IS_RCC_PLLSAI2CLOCKOUT_VALUE(PllSai2->PLLSAI2ClockOut));

+

+  /* Check that PLLSAI2 clock source and divider M can be applied */

+  if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_NONE)

+  {

+    /* PLL clock source and divider M already set, check that no request for change  */

+    if((__HAL_RCC_GET_PLL_OSCSOURCE() != PllSai2->PLLSAI2Source)

+       ||

+       (PllSai2->PLLSAI2Source == RCC_PLLSOURCE_NONE)

+#if !defined(RCC_PLLSAI2M_DIV_1_16_SUPPORT)

+       ||

+       (((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U) != PllSai2->PLLSAI2M)

+#endif

+      )

+    {

+      status = HAL_ERROR;

+    }

+  }

+  else

+  {

+    /* Check PLLSAI2 clock source availability */

+    switch(PllSai2->PLLSAI2Source)

+    {

+    case RCC_PLLSOURCE_MSI:

+      if(HAL_IS_BIT_CLR(RCC->CR, RCC_CR_MSIRDY))

+      {

+        status = HAL_ERROR;

+      }

+      break;

+    case RCC_PLLSOURCE_HSI:

+      if(HAL_IS_BIT_CLR(RCC->CR, RCC_CR_HSIRDY))

+      {

+        status = HAL_ERROR;

+      }

+      break;

+    case RCC_PLLSOURCE_HSE:

+      if(HAL_IS_BIT_CLR(RCC->CR, RCC_CR_HSERDY))

+      {

+        if(HAL_IS_BIT_CLR(RCC->CR, RCC_CR_HSEBYP))

+        {

+          status = HAL_ERROR;

+        }

+      }

+      break;

+    default:

+      status = HAL_ERROR;

+      break;

+    }

+

+    if(status == HAL_OK)

+    {

+#if defined(RCC_PLLSAI2M_DIV_1_16_SUPPORT)

+      /* Set PLLSAI2 clock source */

+      MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, PllSai2->PLLSAI2Source);

+#else

+      /* Set PLLSAI2 clock source and divider M */

+      MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM, PllSai2->PLLSAI2Source | (PllSai2->PLLSAI2M - 1U) << RCC_PLLCFGR_PLLM_Pos);

+#endif

+    }

+  }

+

+  if(status == HAL_OK)

+  {

+    /* Disable the PLLSAI2 */

+    __HAL_RCC_PLLSAI2_DISABLE();

+

+    /* Get Start Tick*/

+    tickstart = HAL_GetTick();

+

+    /* Wait till PLLSAI2 is ready to be updated */

+    while(READ_BIT(RCC->CR, RCC_CR_PLLSAI2RDY) != 0U)

+    {

+      if((HAL_GetTick() - tickstart) > PLLSAI2_TIMEOUT_VALUE)

+      {

+        status = HAL_TIMEOUT;

+        break;

+      }

+    }

+

+    if(status == HAL_OK)

+    {

+      if(Divider == DIVIDER_P_UPDATE)

+      {

+        assert_param(IS_RCC_PLLSAI2P_VALUE(PllSai2->PLLSAI2P));

+#if defined(RCC_PLLSAI2M_DIV_1_16_SUPPORT)

+

+        /* Configure the PLLSAI2 Division factor M, P and Multiplication factor N*/

+#if defined(RCC_PLLSAI2P_DIV_2_31_SUPPORT)

+        MODIFY_REG(RCC->PLLSAI2CFGR,

+                   RCC_PLLSAI2CFGR_PLLSAI2N | RCC_PLLSAI2CFGR_PLLSAI2PDIV | RCC_PLLSAI2CFGR_PLLSAI2M,

+                   (PllSai2->PLLSAI2N << RCC_PLLSAI2CFGR_PLLSAI2N_Pos) |

+                   (PllSai2->PLLSAI2P << RCC_PLLSAI2CFGR_PLLSAI2PDIV_Pos) |

+                   ((PllSai2->PLLSAI2M - 1U) << RCC_PLLSAI2CFGR_PLLSAI2M_Pos));

+#else

+        MODIFY_REG(RCC->PLLSAI2CFGR,

+                   RCC_PLLSAI2CFGR_PLLSAI2N | RCC_PLLSAI2CFGR_PLLSAI2P | RCC_PLLSAI2CFGR_PLLSAI2M,

+                   (PllSai2->PLLSAI2N << RCC_PLLSAI2CFGR_PLLSAI2N_Pos) |

+                   ((PllSai2->PLLSAI2P >> 4U) << RCC_PLLSAI2CFGR_PLLSAI2P_Pos) |

+                   ((PllSai2->PLLSAI2M - 1U) << RCC_PLLSAI2CFGR_PLLSAI2M_Pos));

+#endif /* RCC_PLLSAI2P_DIV_2_31_SUPPORT */

+

+#else

+        /* Configure the PLLSAI2 Division factor P and Multiplication factor N*/

+#if defined(RCC_PLLSAI2P_DIV_2_31_SUPPORT)

+        MODIFY_REG(RCC->PLLSAI2CFGR,

+                   RCC_PLLSAI2CFGR_PLLSAI2N | RCC_PLLSAI2CFGR_PLLSAI2PDIV,

+                   (PllSai2->PLLSAI2N << RCC_PLLSAI2CFGR_PLLSAI2N_Pos) |

+                   (PllSai2->PLLSAI2P << RCC_PLLSAI2CFGR_PLLSAI2PDIV_Pos));

+#else

+        MODIFY_REG(RCC->PLLSAI2CFGR,

+                   RCC_PLLSAI2CFGR_PLLSAI2N | RCC_PLLSAI2CFGR_PLLSAI2P,

+                   (PllSai2->PLLSAI2N << RCC_PLLSAI2CFGR_PLLSAI2N_Pos) |

+                   ((PllSai2->PLLSAI2P >> 4U) << RCC_PLLSAI2CFGR_PLLSAI2P_Pos));

+#endif /* RCC_PLLSAI2P_DIV_2_31_SUPPORT */

+

+#endif /* RCC_PLLSAI2M_DIV_1_16_SUPPORT */

+      }

+#if defined(RCC_PLLSAI2Q_DIV_SUPPORT)

+      else if(Divider == DIVIDER_Q_UPDATE)

+      {

+        assert_param(IS_RCC_PLLSAI2Q_VALUE(PllSai2->PLLSAI2Q));

+#if defined(RCC_PLLSAI2M_DIV_1_16_SUPPORT)

+        /* Configure the PLLSAI2 Division factor M, Q and Multiplication factor N*/

+        MODIFY_REG(RCC->PLLSAI2CFGR,

+                   RCC_PLLSAI2CFGR_PLLSAI2N | RCC_PLLSAI2CFGR_PLLSAI2Q | RCC_PLLSAI2CFGR_PLLSAI2M,

+                   (PllSai2->PLLSAI2N << RCC_PLLSAI2CFGR_PLLSAI2N_Pos) |

+                   (((PllSai2->PLLSAI2Q >> 1U) - 1U) << RCC_PLLSAI2CFGR_PLLSAI2Q_Pos) |

+                   ((PllSai2->PLLSAI2M - 1U) << RCC_PLLSAI2CFGR_PLLSAI2M_Pos));

+#else

+        /* Configure the PLLSAI2 Division factor Q and Multiplication factor N*/

+        MODIFY_REG(RCC->PLLSAI2CFGR,

+                   RCC_PLLSAI2CFGR_PLLSAI2N | RCC_PLLSAI2CFGR_PLLSAI2Q,

+                   (PllSai2->PLLSAI2N << RCC_PLLSAI2CFGR_PLLSAI2N_Pos) |

+                   (((PllSai2->PLLSAI2Q >> 1U) - 1U) << RCC_PLLSAI2CFGR_PLLSAI2Q_Pos));

+#endif /* RCC_PLLSAI2M_DIV_1_16_SUPPORT */

+      }

+#endif /* RCC_PLLSAI2Q_DIV_SUPPORT */

+      else

+      {

+        assert_param(IS_RCC_PLLSAI2R_VALUE(PllSai2->PLLSAI2R));

+#if defined(RCC_PLLSAI2M_DIV_1_16_SUPPORT)

+        /* Configure the PLLSAI2 Division factor M, R and Multiplication factor N*/

+        MODIFY_REG(RCC->PLLSAI2CFGR,

+                   RCC_PLLSAI2CFGR_PLLSAI2N | RCC_PLLSAI2CFGR_PLLSAI2R | RCC_PLLSAI2CFGR_PLLSAI2M,

+                   (PllSai2->PLLSAI2N << RCC_PLLSAI2CFGR_PLLSAI2N_Pos) |

+                   (((PllSai2->PLLSAI2R >> 1U) - 1U) << RCC_PLLSAI2CFGR_PLLSAI2R_Pos) |

+                   ((PllSai2->PLLSAI2M - 1U) << RCC_PLLSAI2CFGR_PLLSAI2M_Pos));

+#else

+        /* Configure the PLLSAI2 Division factor R and Multiplication factor N*/

+        MODIFY_REG(RCC->PLLSAI2CFGR,

+                   RCC_PLLSAI2CFGR_PLLSAI2N | RCC_PLLSAI2CFGR_PLLSAI2R,

+                   (PllSai2->PLLSAI2N << RCC_PLLSAI2CFGR_PLLSAI2N_Pos) |

+                   (((PllSai2->PLLSAI2R >> 1U) - 1U) << RCC_PLLSAI2CFGR_PLLSAI2R_Pos));

+#endif /* RCC_PLLSAI2M_DIV_1_16_SUPPORT */

+      }

+

+      /* Enable the PLLSAI2 again by setting PLLSAI2ON to 1*/

+      __HAL_RCC_PLLSAI2_ENABLE();

+

+      /* Get Start Tick*/

+      tickstart = HAL_GetTick();

+

+      /* Wait till PLLSAI2 is ready */

+      while(READ_BIT(RCC->CR, RCC_CR_PLLSAI2RDY) == 0U)

+      {

+        if((HAL_GetTick() - tickstart) > PLLSAI2_TIMEOUT_VALUE)

+        {

+          status = HAL_TIMEOUT;

+          break;

+        }

+      }

+

+      if(status == HAL_OK)

+      {

+        /* Configure the PLLSAI2 Clock output(s) */

+        __HAL_RCC_PLLSAI2CLKOUT_ENABLE(PllSai2->PLLSAI2ClockOut);

+      }

+    }

+  }

+

+  return status;

+}

+

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+#if defined(SAI1)

+

+static uint32_t RCCEx_GetSAIxPeriphCLKFreq(uint32_t PeriphClk, uint32_t InputFrequency)

+{

+  uint32_t frequency = 0U;

+  uint32_t srcclk = 0U;

+  uint32_t pllvco, plln;    /* no init needed */

+#if defined(RCC_PLLP_SUPPORT)

+  uint32_t pllp = 0U;

+#endif /* RCC_PLLP_SUPPORT */

+

+  /* Handle SAIs */

+  if(PeriphClk == RCC_PERIPHCLK_SAI1)

+  {

+    srcclk = __HAL_RCC_GET_SAI1_SOURCE();

+    if(srcclk == RCC_SAI1CLKSOURCE_PIN)

+    {

+      frequency = EXTERNAL_SAI1_CLOCK_VALUE;

+    }

+    /* Else, PLL clock output to check below */

+  }

+#if defined(SAI2)

+  else

+  {

+    if(PeriphClk == RCC_PERIPHCLK_SAI2)

+    {

+      srcclk = __HAL_RCC_GET_SAI2_SOURCE();

+      if(srcclk == RCC_SAI2CLKSOURCE_PIN)

+      {

+        frequency = EXTERNAL_SAI2_CLOCK_VALUE;

+      }

+      /* Else, PLL clock output to check below */

+    }

+  }

+#endif /* SAI2 */

+

+  if(frequency == 0U)

+  {

+    pllvco = InputFrequency;

+

+#if defined(SAI2)

+    if((srcclk == RCC_SAI1CLKSOURCE_PLL) || (srcclk == RCC_SAI2CLKSOURCE_PLL))

+    {

+      if(__HAL_RCC_GET_PLLCLKOUT_CONFIG(RCC_PLL_SAI3CLK) != 0U)

+      {

+        /* f(PLL Source) / PLLM */

+        pllvco = (pllvco / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U));

+        /* f(PLLSAI3CLK) = f(VCO input) * PLLN / PLLP */

+        plln = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos;

+#if defined(RCC_PLLP_DIV_2_31_SUPPORT)

+        pllp = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLPDIV) >> RCC_PLLCFGR_PLLPDIV_Pos;

+#endif

+        if(pllp == 0U)

+        {

+          if(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLP) != 0U)

+          {

+            pllp = 17U;

+          }

+          else

+          {

+            pllp = 7U;

+          }

+        }

+        frequency = (pllvco * plln) / pllp;

+      }

+    }

+    else if(srcclk == 0U)  /* RCC_SAI1CLKSOURCE_PLLSAI1 || RCC_SAI2CLKSOURCE_PLLSAI1 */

+    {

+      if(__HAL_RCC_GET_PLLSAI1CLKOUT_CONFIG(RCC_PLLSAI1_SAI1CLK) != 0U)

+      {

+#if defined(RCC_PLLSAI1M_DIV_1_16_SUPPORT)

+        /* PLLSAI1M exists: apply PLLSAI1M divider for PLLSAI1 output computation */

+        /* f(PLLSAI1 Source) / PLLSAI1M */

+        pllvco = (pllvco / ((READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1M) >> RCC_PLLSAI1CFGR_PLLSAI1M_Pos) + 1U));

+#else

+        /* f(PLL Source) / PLLM */

+        pllvco = (pllvco / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U));

+#endif

+        /* f(PLLSAI1CLK) = f(VCOSAI1 input) * PLLSAI1N / PLLSAI1P */

+        plln = READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1N) >> RCC_PLLSAI1CFGR_PLLSAI1N_Pos;

+#if defined(RCC_PLLSAI1P_DIV_2_31_SUPPORT)

+        pllp = READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1PDIV) >> RCC_PLLSAI1CFGR_PLLSAI1PDIV_Pos;

+#endif

+        if(pllp == 0U)

+        {

+          if(READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1P) != 0U)

+          {

+            pllp = 17U;

+          }

+          else

+          {

+            pllp = 7U;

+          }

+        }

+        frequency = (pllvco * plln) / pllp;

+      }

+    }

+#if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)

+    else if((srcclk == RCC_SAI1CLKSOURCE_HSI) || (srcclk == RCC_SAI2CLKSOURCE_HSI))

+    {

+      if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))

+      {

+        frequency = HSI_VALUE;

+      }

+    }

+#endif /* STM32L4R5xx || STM32L4R7xx || STM32L4R9xx || STM32L4S5xx || STM32L4S7xx || STM32L4S9xx */

+

+#else

+    if(srcclk == RCC_SAI1CLKSOURCE_PLL)

+    {

+      if(__HAL_RCC_GET_PLLCLKOUT_CONFIG(RCC_PLL_SAI2CLK) != 0U)

+      {

+        /* f(PLL Source) / PLLM */

+        pllvco = (pllvco / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U));

+        /* f(PLLSAI2CLK) = f(VCO input) * PLLN / PLLP */

+        plln = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos;

+#if defined(RCC_PLLP_DIV_2_31_SUPPORT)

+        pllp = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLPDIV) >> RCC_PLLCFGR_PLLPDIV_Pos;

+#endif

+        if(pllp == 0U)

+        {

+          if(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLP) != 0U)

+          {

+            pllp = 17U;

+          }

+          else

+          {

+            pllp = 7U;

+          }

+        }

+        frequency = (pllvco * plln) / pllp;

+      }

+      else if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))

+      {

+        /* HSI automatically selected as clock source if PLLs not enabled */

+        frequency = HSI_VALUE;

+      }

+      else

+      {

+        /* No clock source, frequency default init at 0 */

+      }

+    }

+    else if(srcclk == RCC_SAI1CLKSOURCE_PLLSAI1)

+    {

+      if(__HAL_RCC_GET_PLLSAI1CLKOUT_CONFIG(RCC_PLLSAI1_SAI1CLK) != 0U)

+      {

+#if defined(RCC_PLLSAI1M_DIV_1_16_SUPPORT)

+        /* PLLSAI1M exists: apply PLLSAI1M divider for PLLSAI1 output computation */

+        /* f(PLLSAI1 Source) / PLLSAI1M */

+        pllvco = (pllvco / ((READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1M) >> RCC_PLLSAI1CFGR_PLLSAI1M_Pos) + 1U));

+#else

+        /* f(PLL Source) / PLLM */

+        pllvco = (pllvco / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U));

+#endif

+        /* f(PLLSAI1CLK) = f(VCOSAI1 input) * PLLSAI1N / PLLSAI1P */

+        plln = READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1N) >> RCC_PLLSAI1CFGR_PLLSAI1N_Pos;

+#if defined(RCC_PLLSAI1P_DIV_2_31_SUPPORT)

+        pllp = READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1PDIV) >> RCC_PLLSAI1CFGR_PLLSAI1PDIV_Pos;

+#endif

+        if(pllp == 0U)

+        {

+          if(READ_BIT(RCC->PLLSAI1CFGR, RCC_PLLSAI1CFGR_PLLSAI1P) != 0U)

+          {

+            pllp = 17U;

+          }

+          else

+          {

+            pllp = 7U;

+          }

+        }

+        frequency = (pllvco * plln) / pllp;

+      }

+      else if(HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))

+      {

+        /* HSI automatically selected as clock source if PLLs not enabled */

+        frequency = HSI_VALUE;

+      }

+      else

+      {

+        /* No clock source, frequency default init at 0 */

+      }

+    }

+#endif /* SAI2 */

+

+#if defined(RCC_PLLSAI2_SUPPORT)

+

+    else if((srcclk == RCC_SAI1CLKSOURCE_PLLSAI2) || (srcclk == RCC_SAI2CLKSOURCE_PLLSAI2))

+    {

+      if(__HAL_RCC_GET_PLLSAI2CLKOUT_CONFIG(RCC_PLLSAI2_SAI2CLK) != 0U)

+      {

+#if defined(RCC_PLLSAI2M_DIV_1_16_SUPPORT)

+        /* PLLSAI2M exists: apply PLLSAI2M divider for PLLSAI2 output computation */

+        /* f(PLLSAI2 Source) / PLLSAI2M */

+        pllvco = (pllvco / ((READ_BIT(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2M) >> RCC_PLLSAI2CFGR_PLLSAI2M_Pos) + 1U));

+#else

+        /* f(PLL Source) / PLLM */

+        pllvco = (pllvco / ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U));

+#endif

+        /* f(PLLSAI2CLK) = f(VCOSAI2 input) * PLLSAI2N / PLLSAI2P */

+        plln = READ_BIT(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2N) >> RCC_PLLSAI2CFGR_PLLSAI2N_Pos;

+#if defined(RCC_PLLSAI2P_DIV_2_31_SUPPORT)

+        pllp = READ_BIT(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2PDIV) >> RCC_PLLSAI2CFGR_PLLSAI2PDIV_Pos;

+#endif

+        if(pllp == 0U)

+        {

+          if(READ_BIT(RCC->PLLSAI2CFGR, RCC_PLLSAI2CFGR_PLLSAI2P) != 0U)

+          {

+            pllp = 17U;

+          }

+          else

+          {

+            pllp = 7U;

+          }

+        }

+        frequency = (pllvco * plln) / pllp;

+      }

+    }

+

+#endif /* RCC_PLLSAI2_SUPPORT */

+

+    else

+    {

+      /* No clock source, frequency default init at 0 */

+    }

+  }

+

+

+  return frequency;

+}

+

+#endif /* SAI1 */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+#endif /* HAL_RCC_MODULE_ENABLED */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c
new file mode 100644
index 0000000..3be342c
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c
@@ -0,0 +1,4273 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_spi.c

+  * @author  MCD Application Team

+  * @brief   SPI HAL module driver.

+  *          This file provides firmware functions to manage the following

+  *          functionalities of the Serial Peripheral Interface (SPI) peripheral:

+  *           + Initialization and de-initialization functions

+  *           + IO operation functions

+  *           + Peripheral Control functions

+  *           + Peripheral State functions

+  *

+  @verbatim

+  ==============================================================================

+                        ##### How to use this driver #####

+  ==============================================================================

+    [..]

+      The SPI HAL driver can be used as follows:

+

+      (#) Declare a SPI_HandleTypeDef handle structure, for example:

+          SPI_HandleTypeDef  hspi;

+

+      (#)Initialize the SPI low level resources by implementing the HAL_SPI_MspInit() API:

+          (##) Enable the SPIx interface clock

+          (##) SPI pins configuration

+              (+++) Enable the clock for the SPI GPIOs

+              (+++) Configure these SPI pins as alternate function push-pull

+          (##) NVIC configuration if you need to use interrupt process

+              (+++) Configure the SPIx interrupt priority

+              (+++) Enable the NVIC SPI IRQ handle

+          (##) DMA Configuration if you need to use DMA process

+              (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive Stream/Channel

+              (+++) Enable the DMAx clock

+              (+++) Configure the DMA handle parameters

+              (+++) Configure the DMA Tx or Rx Stream/Channel

+              (+++) Associate the initialized hdma_tx(or _rx)  handle to the hspi DMA Tx or Rx handle

+              (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx or Rx Stream/Channel

+

+      (#) Program the Mode, BidirectionalMode , Data size, Baudrate Prescaler, NSS

+          management, Clock polarity and phase, FirstBit and CRC configuration in the hspi Init structure.

+

+      (#) Initialize the SPI registers by calling the HAL_SPI_Init() API:

+          (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc)

+              by calling the customized HAL_SPI_MspInit() API.

+     [..]

+       Circular mode restriction:

+      (#) The DMA circular mode cannot be used when the SPI is configured in these modes:

+          (##) Master 2Lines RxOnly

+          (##) Master 1Line Rx

+      (#) The CRC feature is not managed when the DMA circular mode is enabled

+      (#) When the SPI DMA Pause/Stop features are used, we must use the following APIs

+          the HAL_SPI_DMAPause()/ HAL_SPI_DMAStop() only under the SPI callbacks

+     [..]

+       Master Receive mode restriction:

+      (#) In Master unidirectional receive-only mode (MSTR =1, BIDIMODE=0, RXONLY=1) or

+          bidirectional receive mode (MSTR=1, BIDIMODE=1, BIDIOE=0), to ensure that the SPI

+          does not initiate a new transfer the following procedure has to be respected:

+          (##) HAL_SPI_DeInit()

+          (##) HAL_SPI_Init()

+     [..]

+       Callback registration:

+

+      (#) The compilation flag USE_HAL_SPI_REGISTER_CALLBACKS when set to 1U

+          allows the user to configure dynamically the driver callbacks.

+          Use Functions HAL_SPI_RegisterCallback() to register an interrupt callback.

+

+          Function HAL_SPI_RegisterCallback() allows to register following callbacks:

+            (+) TxCpltCallback        : SPI Tx Completed callback

+            (+) RxCpltCallback        : SPI Rx Completed callback

+            (+) TxRxCpltCallback      : SPI TxRx Completed callback

+            (+) TxHalfCpltCallback    : SPI Tx Half Completed callback

+            (+) RxHalfCpltCallback    : SPI Rx Half Completed callback

+            (+) TxRxHalfCpltCallback  : SPI TxRx Half Completed callback

+            (+) ErrorCallback         : SPI Error callback

+            (+) AbortCpltCallback     : SPI Abort callback

+            (+) MspInitCallback       : SPI Msp Init callback

+            (+) MspDeInitCallback     : SPI Msp DeInit callback

+          This function takes as parameters the HAL peripheral handle, the Callback ID

+          and a pointer to the user callback function.

+

+

+      (#) Use function HAL_SPI_UnRegisterCallback to reset a callback to the default

+          weak function.

+          HAL_SPI_UnRegisterCallback takes as parameters the HAL peripheral handle,

+          and the Callback ID.

+          This function allows to reset following callbacks:

+            (+) TxCpltCallback        : SPI Tx Completed callback

+            (+) RxCpltCallback        : SPI Rx Completed callback

+            (+) TxRxCpltCallback      : SPI TxRx Completed callback

+            (+) TxHalfCpltCallback    : SPI Tx Half Completed callback

+            (+) RxHalfCpltCallback    : SPI Rx Half Completed callback

+            (+) TxRxHalfCpltCallback  : SPI TxRx Half Completed callback

+            (+) ErrorCallback         : SPI Error callback

+            (+) AbortCpltCallback     : SPI Abort callback

+            (+) MspInitCallback       : SPI Msp Init callback

+            (+) MspDeInitCallback     : SPI Msp DeInit callback

+

+       By default, after the HAL_SPI_Init() and when the state is HAL_SPI_STATE_RESET

+       all callbacks are set to the corresponding weak functions:

+       examples HAL_SPI_MasterTxCpltCallback(), HAL_SPI_MasterRxCpltCallback().

+       Exception done for MspInit and MspDeInit functions that are

+       reset to the legacy weak functions in the HAL_SPI_Init()/ HAL_SPI_DeInit() only when

+       these callbacks are null (not registered beforehand).

+       If MspInit or MspDeInit are not null, the HAL_SPI_Init()/ HAL_SPI_DeInit()

+       keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state.

+

+       Callbacks can be registered/unregistered in HAL_SPI_STATE_READY state only.

+       Exception done MspInit/MspDeInit functions that can be registered/unregistered

+       in HAL_SPI_STATE_READY or HAL_SPI_STATE_RESET state,

+       thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit.

+       Then, the user first registers the MspInit/MspDeInit user callbacks

+       using HAL_SPI_RegisterCallback() before calling HAL_SPI_DeInit()

+       or HAL_SPI_Init() function.

+

+       When The compilation define USE_HAL_PPP_REGISTER_CALLBACKS is set to 0 or

+       not defined, the callback registering feature is not available

+       and weak (surcharged) callbacks are used.

+

+     [..]

+       Using the HAL it is not possible to reach all supported SPI frequency with the different SPI Modes,

+       the following table resume the max SPI frequency reached with data size 8bits/16bits,

+         according to frequency of the APBx Peripheral Clock (fPCLK) used by the SPI instance.

+

+  @endverbatim

+

+  Additional table :

+

+       DataSize = SPI_DATASIZE_8BIT:

+       +----------------------------------------------------------------------------------------------+

+       |         |                | 2Lines Fullduplex   |     2Lines RxOnly    |         1Line        |

+       | Process | Tranfert mode  |---------------------|----------------------|----------------------|

+       |         |                |  Master  |  Slave   |  Master   |  Slave   |  Master   |  Slave   |

+       |==============================================================================================|

+       |    T    |     Polling    | Fpclk/4  | Fpclk/8  |    NA     |    NA    |    NA     |   NA     |

+       |    X    |----------------|----------|----------|-----------|----------|-----------|----------|

+       |    /    |     Interrupt  | Fpclk/4  | Fpclk/16 |    NA     |    NA    |    NA     |   NA     |

+       |    R    |----------------|----------|----------|-----------|----------|-----------|----------|

+       |    X    |       DMA      | Fpclk/2  | Fpclk/2  |    NA     |    NA    |    NA     |   NA     |

+       |=========|================|==========|==========|===========|==========|===========|==========|

+       |         |     Polling    | Fpclk/4  | Fpclk/8  | Fpclk/16  | Fpclk/8  | Fpclk/8   | Fpclk/8  |

+       |         |----------------|----------|----------|-----------|----------|-----------|----------|

+       |    R    |     Interrupt  | Fpclk/8  | Fpclk/16 | Fpclk/8   | Fpclk/8  | Fpclk/8   | Fpclk/4  |

+       |    X    |----------------|----------|----------|-----------|----------|-----------|----------|

+       |         |       DMA      | Fpclk/4  | Fpclk/2  | Fpclk/2   | Fpclk/16 | Fpclk/2   | Fpclk/16 |

+       |=========|================|==========|==========|===========|==========|===========|==========|

+       |         |     Polling    | Fpclk/8  | Fpclk/2  |     NA    |    NA    | Fpclk/8   | Fpclk/8  |

+       |         |----------------|----------|----------|-----------|----------|-----------|----------|

+       |    T    |     Interrupt  | Fpclk/2  | Fpclk/4  |     NA    |    NA    | Fpclk/16  | Fpclk/8  |

+       |    X    |----------------|----------|----------|-----------|----------|-----------|----------|

+       |         |       DMA      | Fpclk/2  | Fpclk/2  |     NA    |    NA    | Fpclk/8   | Fpclk/16 |

+       +----------------------------------------------------------------------------------------------+

+

+       DataSize = SPI_DATASIZE_16BIT:

+       +----------------------------------------------------------------------------------------------+

+       |         |                | 2Lines Fullduplex   |     2Lines RxOnly    |         1Line        |

+       | Process | Tranfert mode  |---------------------|----------------------|----------------------|

+       |         |                |  Master  |  Slave   |  Master   |  Slave   |  Master   |  Slave   |

+       |==============================================================================================|

+       |    T    |     Polling    | Fpclk/4  | Fpclk/8  |    NA     |    NA    |    NA     |   NA     |

+       |    X    |----------------|----------|----------|-----------|----------|-----------|----------|

+       |    /    |     Interrupt  | Fpclk/4  | Fpclk/16 |    NA     |    NA    |    NA     |   NA     |

+       |    R    |----------------|----------|----------|-----------|----------|-----------|----------|

+       |    X    |       DMA      | Fpclk/2  | Fpclk/2  |    NA     |    NA    |    NA     |   NA     |

+       |=========|================|==========|==========|===========|==========|===========|==========|

+       |         |     Polling    | Fpclk/4  | Fpclk/8  | Fpclk/16  | Fpclk/8  | Fpclk/8   | Fpclk/8  |

+       |         |----------------|----------|----------|-----------|----------|-----------|----------|

+       |    R    |     Interrupt  | Fpclk/8  | Fpclk/16 | Fpclk/8   | Fpclk/8  | Fpclk/8   | Fpclk/4  |

+       |    X    |----------------|----------|----------|-----------|----------|-----------|----------|

+       |         |       DMA      | Fpclk/4  | Fpclk/2  | Fpclk/2   | Fpclk/16 | Fpclk/2   | Fpclk/16 |

+       |=========|================|==========|==========|===========|==========|===========|==========|

+       |         |     Polling    | Fpclk/8  | Fpclk/2  |     NA    |    NA    | Fpclk/8   | Fpclk/8  |

+       |         |----------------|----------|----------|-----------|----------|-----------|----------|

+       |    T    |     Interrupt  | Fpclk/2  | Fpclk/4  |     NA    |    NA    | Fpclk/16  | Fpclk/8  |

+       |    X    |----------------|----------|----------|-----------|----------|-----------|----------|

+       |         |       DMA      | Fpclk/2  | Fpclk/2  |     NA    |    NA    | Fpclk/8   | Fpclk/16 |

+       +----------------------------------------------------------------------------------------------+

+       @note The max SPI frequency depend on SPI data size (4bits, 5bits,..., 8bits,...15bits, 16bits),

+             SPI mode(2 Lines fullduplex, 2 lines RxOnly, 1 line TX/RX) and Process mode (Polling, IT, DMA).

+       @note

+            (#) TX/RX processes are HAL_SPI_TransmitReceive(), HAL_SPI_TransmitReceive_IT() and HAL_SPI_TransmitReceive_DMA()

+            (#) RX processes are HAL_SPI_Receive(), HAL_SPI_Receive_IT() and HAL_SPI_Receive_DMA()

+            (#) TX processes are HAL_SPI_Transmit(), HAL_SPI_Transmit_IT() and HAL_SPI_Transmit_DMA()

+

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup SPI SPI

+  * @brief SPI HAL module driver

+  * @{

+  */

+#ifdef HAL_SPI_MODULE_ENABLED

+

+/* Private typedef -----------------------------------------------------------*/

+/* Private defines -----------------------------------------------------------*/

+/** @defgroup SPI_Private_Constants SPI Private Constants

+  * @{

+  */

+#define SPI_DEFAULT_TIMEOUT 100U

+/**

+  * @}

+  */

+

+/* Private macros ------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/* Private function prototypes -----------------------------------------------*/

+/** @defgroup SPI_Private_Functions SPI Private Functions

+  * @{

+  */

+static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma);

+static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma);

+static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma);

+static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma);

+static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma);

+static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma);

+static void SPI_DMAError(DMA_HandleTypeDef *hdma);

+static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma);

+static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma);

+static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma);

+static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus State,

+                                                       uint32_t Timeout, uint32_t Tickstart);

+static HAL_StatusTypeDef SPI_WaitFifoStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Fifo, uint32_t State,

+                                                       uint32_t Timeout, uint32_t Tickstart);

+static void SPI_TxISR_8BIT(struct __SPI_HandleTypeDef *hspi);

+static void SPI_TxISR_16BIT(struct __SPI_HandleTypeDef *hspi);

+static void SPI_RxISR_8BIT(struct __SPI_HandleTypeDef *hspi);

+static void SPI_RxISR_16BIT(struct __SPI_HandleTypeDef *hspi);

+static void SPI_2linesRxISR_8BIT(struct __SPI_HandleTypeDef *hspi);

+static void SPI_2linesTxISR_8BIT(struct __SPI_HandleTypeDef *hspi);

+static void SPI_2linesTxISR_16BIT(struct __SPI_HandleTypeDef *hspi);

+static void SPI_2linesRxISR_16BIT(struct __SPI_HandleTypeDef *hspi);

+#if (USE_SPI_CRC != 0U)

+static void SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi);

+static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi);

+static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi);

+static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi);

+#endif /* USE_SPI_CRC */

+static void SPI_AbortRx_ISR(SPI_HandleTypeDef *hspi);

+static void SPI_AbortTx_ISR(SPI_HandleTypeDef *hspi);

+static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi);

+static void SPI_CloseRx_ISR(SPI_HandleTypeDef *hspi);

+static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi);

+static HAL_StatusTypeDef SPI_EndRxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart);

+static HAL_StatusTypeDef SPI_EndRxTxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart);

+/**

+  * @}

+  */

+

+/* Exported functions --------------------------------------------------------*/

+/** @defgroup SPI_Exported_Functions SPI Exported Functions

+  * @{

+  */

+

+/** @defgroup SPI_Exported_Functions_Group1 Initialization and de-initialization functions

+ *  @brief    Initialization and Configuration functions

+ *

+@verbatim

+ ===============================================================================

+              ##### Initialization and de-initialization functions #####

+ ===============================================================================

+    [..]  This subsection provides a set of functions allowing to initialize and

+          de-initialize the SPIx peripheral:

+

+      (+) User must implement HAL_SPI_MspInit() function in which he configures

+          all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ).

+

+      (+) Call the function HAL_SPI_Init() to configure the selected device with

+          the selected configuration:

+        (++) Mode

+        (++) Direction

+        (++) Data Size

+        (++) Clock Polarity and Phase

+        (++) NSS Management

+        (++) BaudRate Prescaler

+        (++) FirstBit

+        (++) TIMode

+        (++) CRC Calculation

+        (++) CRC Polynomial if CRC enabled

+        (++) CRC Length, used only with Data8 and Data16

+        (++) FIFO reception threshold

+

+      (+) Call the function HAL_SPI_DeInit() to restore the default configuration

+          of the selected SPIx peripheral.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Initialize the SPI according to the specified parameters

+  *         in the SPI_InitTypeDef and initialize the associated handle.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi)

+{

+  uint32_t frxth;

+

+  /* Check the SPI handle allocation */

+  if (hspi == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check the parameters */

+  assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance));

+  assert_param(IS_SPI_MODE(hspi->Init.Mode));

+  assert_param(IS_SPI_DIRECTION(hspi->Init.Direction));

+  assert_param(IS_SPI_DATASIZE(hspi->Init.DataSize));

+  assert_param(IS_SPI_NSS(hspi->Init.NSS));

+  assert_param(IS_SPI_NSSP(hspi->Init.NSSPMode));

+  assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler));

+  assert_param(IS_SPI_FIRST_BIT(hspi->Init.FirstBit));

+  assert_param(IS_SPI_TIMODE(hspi->Init.TIMode));

+  if (hspi->Init.TIMode == SPI_TIMODE_DISABLE)

+  {

+    assert_param(IS_SPI_CPOL(hspi->Init.CLKPolarity));

+    assert_param(IS_SPI_CPHA(hspi->Init.CLKPhase));

+  }

+#if (USE_SPI_CRC != 0U)

+  assert_param(IS_SPI_CRC_CALCULATION(hspi->Init.CRCCalculation));

+  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+  {

+    assert_param(IS_SPI_CRC_POLYNOMIAL(hspi->Init.CRCPolynomial));

+    assert_param(IS_SPI_CRC_LENGTH(hspi->Init.CRCLength));

+  }

+#else

+  hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;

+#endif /* USE_SPI_CRC */

+

+  if (hspi->State == HAL_SPI_STATE_RESET)

+  {

+    /* Allocate lock resource and initialize it */

+    hspi->Lock = HAL_UNLOCKED;

+

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+    /* Init the SPI Callback settings */

+    hspi->TxCpltCallback       = HAL_SPI_TxCpltCallback;       /* Legacy weak TxCpltCallback       */

+    hspi->RxCpltCallback       = HAL_SPI_RxCpltCallback;       /* Legacy weak RxCpltCallback       */

+    hspi->TxRxCpltCallback     = HAL_SPI_TxRxCpltCallback;     /* Legacy weak TxRxCpltCallback     */

+    hspi->TxHalfCpltCallback   = HAL_SPI_TxHalfCpltCallback;   /* Legacy weak TxHalfCpltCallback   */

+    hspi->RxHalfCpltCallback   = HAL_SPI_RxHalfCpltCallback;   /* Legacy weak RxHalfCpltCallback   */

+    hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback; /* Legacy weak TxRxHalfCpltCallback */

+    hspi->ErrorCallback        = HAL_SPI_ErrorCallback;        /* Legacy weak ErrorCallback        */

+    hspi->AbortCpltCallback    = HAL_SPI_AbortCpltCallback;    /* Legacy weak AbortCpltCallback    */

+

+    if (hspi->MspInitCallback == NULL)

+    {

+      hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit  */

+    }

+

+    /* Init the low level hardware : GPIO, CLOCK, NVIC... */

+    hspi->MspInitCallback(hspi);

+#else

+    /* Init the low level hardware : GPIO, CLOCK, NVIC... */

+    HAL_SPI_MspInit(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+  }

+

+  hspi->State = HAL_SPI_STATE_BUSY;

+

+  /* Disable the selected SPI peripheral */

+  __HAL_SPI_DISABLE(hspi);

+

+  /* Align by default the rs fifo threshold on the data size */

+  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)

+  {

+    frxth = SPI_RXFIFO_THRESHOLD_HF;

+  }

+  else

+  {

+    frxth = SPI_RXFIFO_THRESHOLD_QF;

+  }

+

+  /* CRC calculation is valid only for 16Bit and 8 Bit */

+  if ((hspi->Init.DataSize != SPI_DATASIZE_16BIT) && (hspi->Init.DataSize != SPI_DATASIZE_8BIT))

+  {

+    /* CRC must be disabled */

+    hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;

+  }

+

+  /* Align the CRC Length on the data size */

+  if (hspi->Init.CRCLength == SPI_CRC_LENGTH_DATASIZE)

+  {

+    /* CRC Length aligned on the data size : value set by default */

+    if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)

+    {

+      hspi->Init.CRCLength = SPI_CRC_LENGTH_16BIT;

+    }

+    else

+    {

+      hspi->Init.CRCLength = SPI_CRC_LENGTH_8BIT;

+    }

+  }

+

+  /*----------------------- SPIx CR1 & CR2 Configuration ---------------------*/

+  /* Configure : SPI Mode, Communication Mode, Clock polarity and phase, NSS management,

+  Communication speed, First bit and CRC calculation state */

+  WRITE_REG(hspi->Instance->CR1, (hspi->Init.Mode | hspi->Init.Direction |

+                                  hspi->Init.CLKPolarity | hspi->Init.CLKPhase | (hspi->Init.NSS & SPI_CR1_SSM) |

+                                  hspi->Init.BaudRatePrescaler | hspi->Init.FirstBit  | hspi->Init.CRCCalculation));

+#if (USE_SPI_CRC != 0U)

+  /* Configure : CRC Length */

+  if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)

+  {

+    hspi->Instance->CR1 |= SPI_CR1_CRCL;

+  }

+#endif /* USE_SPI_CRC */

+

+  /* Configure : NSS management, TI Mode, NSS Pulse, Data size and Rx Fifo threshold */

+  WRITE_REG(hspi->Instance->CR2, (((hspi->Init.NSS >> 16U) & SPI_CR2_SSOE) | hspi->Init.TIMode |

+                                  hspi->Init.NSSPMode | hspi->Init.DataSize) | frxth);

+

+#if (USE_SPI_CRC != 0U)

+  /*---------------------------- SPIx CRCPOLY Configuration ------------------*/

+  /* Configure : CRC Polynomial */

+  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+  {

+    WRITE_REG(hspi->Instance->CRCPR, hspi->Init.CRCPolynomial);

+  }

+#endif /* USE_SPI_CRC */

+

+#if defined(SPI_I2SCFGR_I2SMOD)

+  /* Activate the SPI mode (Make sure that I2SMOD bit in I2SCFGR register is reset) */

+  CLEAR_BIT(hspi->Instance->I2SCFGR, SPI_I2SCFGR_I2SMOD);

+#endif /* SPI_I2SCFGR_I2SMOD */

+

+  hspi->ErrorCode = HAL_SPI_ERROR_NONE;

+  hspi->State     = HAL_SPI_STATE_READY;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  De-Initialize the SPI peripheral.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi)

+{

+  /* Check the SPI handle allocation */

+  if (hspi == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check SPI Instance parameter */

+  assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance));

+

+  hspi->State = HAL_SPI_STATE_BUSY;

+

+  /* Disable the SPI Peripheral Clock */

+  __HAL_SPI_DISABLE(hspi);

+

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+  if (hspi->MspDeInitCallback == NULL)

+  {

+    hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit  */

+  }

+

+  /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */

+  hspi->MspDeInitCallback(hspi);

+#else

+  /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */

+  HAL_SPI_MspDeInit(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+

+  hspi->ErrorCode = HAL_SPI_ERROR_NONE;

+  hspi->State = HAL_SPI_STATE_RESET;

+

+  /* Release Lock */

+  __HAL_UNLOCK(hspi);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Initialize the SPI MSP.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+__weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hspi);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_SPI_MspInit should be implemented in the user file

+   */

+}

+

+/**

+  * @brief  De-Initialize the SPI MSP.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+__weak void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hspi);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_SPI_MspDeInit should be implemented in the user file

+   */

+}

+

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+/**

+  * @brief  Register a User SPI Callback

+  *         To be used instead of the weak predefined callback

+  * @param  hspi Pointer to a SPI_HandleTypeDef structure that contains

+  *                the configuration information for the specified SPI.

+  * @param  CallbackID ID of the callback to be registered

+  * @param  pCallback pointer to the Callback function

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_SPI_RegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID, pSPI_CallbackTypeDef pCallback)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  if (pCallback == NULL)

+  {

+    /* Update the error code */

+    hspi->ErrorCode |= HAL_SPI_ERROR_INVALID_CALLBACK;

+

+    return HAL_ERROR;

+  }

+  /* Process locked */

+  __HAL_LOCK(hspi);

+

+  if (HAL_SPI_STATE_READY == hspi->State)

+  {

+    switch (CallbackID)

+    {

+      case HAL_SPI_TX_COMPLETE_CB_ID :

+        hspi->TxCpltCallback = pCallback;

+        break;

+

+      case HAL_SPI_RX_COMPLETE_CB_ID :

+        hspi->RxCpltCallback = pCallback;

+        break;

+

+      case HAL_SPI_TX_RX_COMPLETE_CB_ID :

+        hspi->TxRxCpltCallback = pCallback;

+        break;

+

+      case HAL_SPI_TX_HALF_COMPLETE_CB_ID :

+        hspi->TxHalfCpltCallback = pCallback;

+        break;

+

+      case HAL_SPI_RX_HALF_COMPLETE_CB_ID :

+        hspi->RxHalfCpltCallback = pCallback;

+        break;

+

+      case HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID :

+        hspi->TxRxHalfCpltCallback = pCallback;

+        break;

+

+      case HAL_SPI_ERROR_CB_ID :

+        hspi->ErrorCallback = pCallback;

+        break;

+

+      case HAL_SPI_ABORT_CB_ID :

+        hspi->AbortCpltCallback = pCallback;

+        break;

+

+      case HAL_SPI_MSPINIT_CB_ID :

+        hspi->MspInitCallback = pCallback;

+        break;

+

+      case HAL_SPI_MSPDEINIT_CB_ID :

+        hspi->MspDeInitCallback = pCallback;

+        break;

+

+      default :

+        /* Update the error code */

+        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);

+

+        /* Return error status */

+        status =  HAL_ERROR;

+        break;

+    }

+  }

+  else if (HAL_SPI_STATE_RESET == hspi->State)

+  {

+    switch (CallbackID)

+    {

+      case HAL_SPI_MSPINIT_CB_ID :

+        hspi->MspInitCallback = pCallback;

+        break;

+

+      case HAL_SPI_MSPDEINIT_CB_ID :

+        hspi->MspDeInitCallback = pCallback;

+        break;

+

+      default :

+        /* Update the error code */

+        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);

+

+        /* Return error status */

+        status =  HAL_ERROR;

+        break;

+    }

+  }

+  else

+  {

+    /* Update the error code */

+    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);

+

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hspi);

+  return status;

+}

+

+/**

+  * @brief  Unregister an SPI Callback

+  *         SPI callback is redirected to the weak predefined callback

+  * @param  hspi Pointer to a SPI_HandleTypeDef structure that contains

+  *                the configuration information for the specified SPI.

+  * @param  CallbackID ID of the callback to be unregistered

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_SPI_UnRegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef CallbackID)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Process locked */

+  __HAL_LOCK(hspi);

+

+  if (HAL_SPI_STATE_READY == hspi->State)

+  {

+    switch (CallbackID)

+    {

+      case HAL_SPI_TX_COMPLETE_CB_ID :

+        hspi->TxCpltCallback = HAL_SPI_TxCpltCallback;             /* Legacy weak TxCpltCallback       */

+        break;

+

+      case HAL_SPI_RX_COMPLETE_CB_ID :

+        hspi->RxCpltCallback = HAL_SPI_RxCpltCallback;             /* Legacy weak RxCpltCallback       */

+        break;

+

+      case HAL_SPI_TX_RX_COMPLETE_CB_ID :

+        hspi->TxRxCpltCallback = HAL_SPI_TxRxCpltCallback;         /* Legacy weak TxRxCpltCallback     */

+        break;

+

+      case HAL_SPI_TX_HALF_COMPLETE_CB_ID :

+        hspi->TxHalfCpltCallback = HAL_SPI_TxHalfCpltCallback;     /* Legacy weak TxHalfCpltCallback   */

+        break;

+

+      case HAL_SPI_RX_HALF_COMPLETE_CB_ID :

+        hspi->RxHalfCpltCallback = HAL_SPI_RxHalfCpltCallback;     /* Legacy weak RxHalfCpltCallback   */

+        break;

+

+      case HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID :

+        hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback; /* Legacy weak TxRxHalfCpltCallback */

+        break;

+

+      case HAL_SPI_ERROR_CB_ID :

+        hspi->ErrorCallback = HAL_SPI_ErrorCallback;               /* Legacy weak ErrorCallback        */

+        break;

+

+      case HAL_SPI_ABORT_CB_ID :

+        hspi->AbortCpltCallback = HAL_SPI_AbortCpltCallback;       /* Legacy weak AbortCpltCallback    */

+        break;

+

+      case HAL_SPI_MSPINIT_CB_ID :

+        hspi->MspInitCallback = HAL_SPI_MspInit;                   /* Legacy weak MspInit              */

+        break;

+

+      case HAL_SPI_MSPDEINIT_CB_ID :

+        hspi->MspDeInitCallback = HAL_SPI_MspDeInit;               /* Legacy weak MspDeInit            */

+        break;

+

+      default :

+        /* Update the error code */

+        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);

+

+        /* Return error status */

+        status =  HAL_ERROR;

+        break;

+    }

+  }

+  else if (HAL_SPI_STATE_RESET == hspi->State)

+  {

+    switch (CallbackID)

+    {

+      case HAL_SPI_MSPINIT_CB_ID :

+        hspi->MspInitCallback = HAL_SPI_MspInit;                   /* Legacy weak MspInit              */

+        break;

+

+      case HAL_SPI_MSPDEINIT_CB_ID :

+        hspi->MspDeInitCallback = HAL_SPI_MspDeInit;               /* Legacy weak MspDeInit            */

+        break;

+

+      default :

+        /* Update the error code */

+        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);

+

+        /* Return error status */

+        status =  HAL_ERROR;

+        break;

+    }

+  }

+  else

+  {

+    /* Update the error code */

+    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK);

+

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(hspi);

+  return status;

+}

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+/**

+  * @}

+  */

+

+/** @defgroup SPI_Exported_Functions_Group2 IO operation functions

+ *  @brief   Data transfers functions

+ *

+@verbatim

+  ==============================================================================

+                      ##### IO operation functions #####

+ ===============================================================================

+ [..]

+    This subsection provides a set of functions allowing to manage the SPI

+    data transfers.

+

+    [..] The SPI supports master and slave mode :

+

+    (#) There are two modes of transfer:

+       (++) Blocking mode: The communication is performed in polling mode.

+            The HAL status of all data processing is returned by the same function

+            after finishing transfer.

+       (++) No-Blocking mode: The communication is performed using Interrupts

+            or DMA, These APIs return the HAL status.

+            The end of the data processing will be indicated through the

+            dedicated SPI IRQ when using Interrupt mode or the DMA IRQ when

+            using DMA mode.

+            The HAL_SPI_TxCpltCallback(), HAL_SPI_RxCpltCallback() and HAL_SPI_TxRxCpltCallback() user callbacks

+            will be executed respectively at the end of the transmit or Receive process

+            The HAL_SPI_ErrorCallback()user callback will be executed when a communication error is detected

+

+    (#) APIs provided for these 2 transfer modes (Blocking mode or Non blocking mode using either Interrupt or DMA)

+        exist for 1Line (simplex) and 2Lines (full duplex) modes.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Transmit an amount of data in blocking mode.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @param  pData pointer to data buffer

+  * @param  Size amount of data to be sent

+  * @param  Timeout Timeout duration

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

+{

+  uint32_t tickstart;

+  HAL_StatusTypeDef errorcode = HAL_OK;

+  uint16_t initial_TxXferCount;

+

+  /* Check Direction parameter */

+  assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));

+

+  /* Process Locked */

+  __HAL_LOCK(hspi);

+

+  /* Init tickstart for timeout management*/

+  tickstart = HAL_GetTick();

+  initial_TxXferCount = Size;

+

+  if (hspi->State != HAL_SPI_STATE_READY)

+  {

+    errorcode = HAL_BUSY;

+    goto error;

+  }

+

+  if ((pData == NULL) || (Size == 0U))

+  {

+    errorcode = HAL_ERROR;

+    goto error;

+  }

+

+  /* Set the transaction information */

+  hspi->State       = HAL_SPI_STATE_BUSY_TX;

+  hspi->ErrorCode   = HAL_SPI_ERROR_NONE;

+  hspi->pTxBuffPtr  = (uint8_t *)pData;

+  hspi->TxXferSize  = Size;

+  hspi->TxXferCount = Size;

+

+  /*Init field not used in handle to zero */

+  hspi->pRxBuffPtr  = (uint8_t *)NULL;

+  hspi->RxXferSize  = 0U;

+  hspi->RxXferCount = 0U;

+  hspi->TxISR       = NULL;

+  hspi->RxISR       = NULL;

+

+  /* Configure communication direction : 1Line */

+  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)

+  {

+    SPI_1LINE_TX(hspi);

+  }

+

+#if (USE_SPI_CRC != 0U)

+  /* Reset CRC Calculation */

+  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+  {

+    SPI_RESET_CRC(hspi);

+  }

+#endif /* USE_SPI_CRC */

+

+  /* Check if the SPI is already enabled */

+  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)

+  {

+    /* Enable SPI peripheral */

+    __HAL_SPI_ENABLE(hspi);

+  }

+

+  /* Transmit data in 16 Bit mode */

+  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)

+  {

+    if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U))

+    {

+      hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);

+      hspi->pTxBuffPtr += sizeof(uint16_t);

+      hspi->TxXferCount--;

+    }

+    /* Transmit data in 16 Bit mode */

+    while (hspi->TxXferCount > 0U)

+    {

+      /* Wait until TXE flag is set to send data */

+      if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE))

+      {

+        hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);

+        hspi->pTxBuffPtr += sizeof(uint16_t);

+        hspi->TxXferCount--;

+      }

+      else

+      {

+        /* Timeout management */

+        if ((((HAL_GetTick() - tickstart) >=  Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))

+        {

+          errorcode = HAL_TIMEOUT;

+          goto error;

+        }

+      }

+    }

+  }

+  /* Transmit data in 8 Bit mode */

+  else

+  {

+    if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U))

+    {

+      if (hspi->TxXferCount > 1U)

+      {

+        /* write on the data register in packing mode */

+        hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);

+        hspi->pTxBuffPtr += sizeof(uint16_t);

+        hspi->TxXferCount -= 2U;

+      }

+      else

+      {

+        *((__IO uint8_t *)&hspi->Instance->DR) = (*hspi->pTxBuffPtr);

+        hspi->pTxBuffPtr ++;

+        hspi->TxXferCount--;

+      }

+    }

+    while (hspi->TxXferCount > 0U)

+    {

+      /* Wait until TXE flag is set to send data */

+      if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE))

+      {

+        if (hspi->TxXferCount > 1U)

+        {

+          /* write on the data register in packing mode */

+          hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);

+          hspi->pTxBuffPtr += sizeof(uint16_t);

+          hspi->TxXferCount -= 2U;

+        }

+        else

+        {

+          *((__IO uint8_t *)&hspi->Instance->DR) = (*hspi->pTxBuffPtr);

+          hspi->pTxBuffPtr++;

+          hspi->TxXferCount--;

+        }

+      }

+      else

+      {

+        /* Timeout management */

+        if ((((HAL_GetTick() - tickstart) >=  Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))

+        {

+          errorcode = HAL_TIMEOUT;

+          goto error;

+        }

+      }

+    }

+  }

+#if (USE_SPI_CRC != 0U)

+  /* Enable CRC Transmission */

+  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+  {

+    SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);

+  }

+#endif /* USE_SPI_CRC */

+

+  /* Check the end of the transaction */

+  if (SPI_EndRxTxTransaction(hspi, Timeout, tickstart) != HAL_OK)

+  {

+    hspi->ErrorCode = HAL_SPI_ERROR_FLAG;

+  }

+

+  /* Clear overrun flag in 2 Lines communication mode because received is not read */

+  if (hspi->Init.Direction == SPI_DIRECTION_2LINES)

+  {

+    __HAL_SPI_CLEAR_OVRFLAG(hspi);

+  }

+

+  if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)

+  {

+    errorcode = HAL_ERROR;

+  }

+

+error:

+  hspi->State = HAL_SPI_STATE_READY;

+  /* Process Unlocked */

+  __HAL_UNLOCK(hspi);

+  return errorcode;

+}

+

+/**

+  * @brief  Receive an amount of data in blocking mode.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @param  pData pointer to data buffer

+  * @param  Size amount of data to be received

+  * @param  Timeout Timeout duration

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

+{

+  uint32_t tickstart;

+  HAL_StatusTypeDef errorcode = HAL_OK;

+

+  if ((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES))

+  {

+    hspi->State = HAL_SPI_STATE_BUSY_RX;

+    /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */

+    return HAL_SPI_TransmitReceive(hspi, pData, pData, Size, Timeout);

+  }

+

+  /* Process Locked */

+  __HAL_LOCK(hspi);

+

+  /* Init tickstart for timeout management*/

+  tickstart = HAL_GetTick();

+

+  if (hspi->State != HAL_SPI_STATE_READY)

+  {

+    errorcode = HAL_BUSY;

+    goto error;

+  }

+

+  if ((pData == NULL) || (Size == 0U))

+  {

+    errorcode = HAL_ERROR;

+    goto error;

+  }

+

+  /* Set the transaction information */

+  hspi->State       = HAL_SPI_STATE_BUSY_RX;

+  hspi->ErrorCode   = HAL_SPI_ERROR_NONE;

+  hspi->pRxBuffPtr  = (uint8_t *)pData;

+  hspi->RxXferSize  = Size;

+  hspi->RxXferCount = Size;

+

+  /*Init field not used in handle to zero */

+  hspi->pTxBuffPtr  = (uint8_t *)NULL;

+  hspi->TxXferSize  = 0U;

+  hspi->TxXferCount = 0U;

+  hspi->RxISR       = NULL;

+  hspi->TxISR       = NULL;

+

+#if (USE_SPI_CRC != 0U)

+  /* Reset CRC Calculation */

+  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+  {

+    SPI_RESET_CRC(hspi);

+    /* this is done to handle the CRCNEXT before the latest data */

+    hspi->RxXferCount--;

+  }

+#endif /* USE_SPI_CRC */

+

+  /* Set the Rx Fifo threshold */

+  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)

+  {

+    /* Set RX Fifo threshold according the reception data length: 16bit */

+    CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);

+  }

+  else

+  {

+    /* Set RX Fifo threshold according the reception data length: 8bit */

+    SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);

+  }

+

+  /* Configure communication direction: 1Line */

+  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)

+  {

+    SPI_1LINE_RX(hspi);

+  }

+

+  /* Check if the SPI is already enabled */

+  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)

+  {

+    /* Enable SPI peripheral */

+    __HAL_SPI_ENABLE(hspi);

+  }

+

+  /* Receive data in 8 Bit mode */

+  if (hspi->Init.DataSize <= SPI_DATASIZE_8BIT)

+  {

+    /* Transfer loop */

+    while (hspi->RxXferCount > 0U)

+    {

+      /* Check the RXNE flag */

+      if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE))

+      {

+        /* read the received data */

+        (* (uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR;

+        hspi->pRxBuffPtr += sizeof(uint8_t);

+        hspi->RxXferCount--;

+      }

+      else

+      {

+        /* Timeout management */

+        if ((((HAL_GetTick() - tickstart) >=  Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))

+        {

+          errorcode = HAL_TIMEOUT;

+          goto error;

+        }

+      }

+    }

+  }

+  else

+  {

+    /* Transfer loop */

+    while (hspi->RxXferCount > 0U)

+    {

+      /* Check the RXNE flag */

+      if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE))

+      {

+        *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR;

+        hspi->pRxBuffPtr += sizeof(uint16_t);

+        hspi->RxXferCount--;

+      }

+      else

+      {

+        /* Timeout management */

+        if ((((HAL_GetTick() - tickstart) >=  Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))

+        {

+          errorcode = HAL_TIMEOUT;

+          goto error;

+        }

+      }

+    }

+  }

+

+#if (USE_SPI_CRC != 0U)

+  /* Handle the CRC Transmission */

+  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+  {

+    /* freeze the CRC before the latest data */

+    SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);

+

+    /* Read the latest data */

+    if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK)

+    {

+      /* the latest data has not been received */

+      errorcode = HAL_TIMEOUT;

+      goto error;

+    }

+

+    /* Receive last data in 16 Bit mode */

+    if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)

+    {

+      *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR;

+    }

+    /* Receive last data in 8 Bit mode */

+    else

+    {

+      (*(uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR;

+    }

+

+    /* Wait the CRC data */

+    if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK)

+    {

+      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);

+      errorcode = HAL_TIMEOUT;

+      goto error;

+    }

+

+    /* Read CRC to Flush DR and RXNE flag */

+    if (hspi->Init.DataSize == SPI_DATASIZE_16BIT)

+    {

+      /* Read 16bit CRC */

+      READ_REG(hspi->Instance->DR);

+    }

+    else

+    {

+      /* Read 8bit CRC */

+      READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);

+

+      if ((hspi->Init.DataSize == SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT))

+      {

+        if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK)

+        {

+          /* Error on the CRC reception */

+          SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);

+          errorcode = HAL_TIMEOUT;

+          goto error;

+        }

+        /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */

+        READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);

+      }

+    }

+  }

+#endif /* USE_SPI_CRC */

+

+  /* Check the end of the transaction */

+  if (SPI_EndRxTransaction(hspi, Timeout, tickstart) != HAL_OK)

+  {

+    hspi->ErrorCode = HAL_SPI_ERROR_FLAG;

+  }

+

+#if (USE_SPI_CRC != 0U)

+  /* Check if CRC error occurred */

+  if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR))

+  {

+    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);

+    __HAL_SPI_CLEAR_CRCERRFLAG(hspi);

+  }

+#endif /* USE_SPI_CRC */

+

+  if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)

+  {

+    errorcode = HAL_ERROR;

+  }

+

+error :

+  hspi->State = HAL_SPI_STATE_READY;

+  __HAL_UNLOCK(hspi);

+  return errorcode;

+}

+

+/**

+  * @brief  Transmit and Receive an amount of data in blocking mode.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @param  pTxData pointer to transmission data buffer

+  * @param  pRxData pointer to reception data buffer

+  * @param  Size amount of data to be sent and received

+  * @param  Timeout Timeout duration

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size,

+                                          uint32_t Timeout)

+{

+  uint16_t             initial_TxXferCount;

+  uint16_t             initial_RxXferCount;

+  uint32_t             tmp_mode;

+  HAL_SPI_StateTypeDef tmp_state;

+  uint32_t             tickstart;

+#if (USE_SPI_CRC != 0U)

+  uint32_t             spi_cr1;

+  uint32_t             spi_cr2;

+#endif /* USE_SPI_CRC */

+

+  /* Variable used to alternate Rx and Tx during transfer */

+  uint32_t             txallowed = 1U;

+  HAL_StatusTypeDef    errorcode = HAL_OK;

+

+  /* Check Direction parameter */

+  assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));

+

+  /* Process Locked */

+  __HAL_LOCK(hspi);

+

+  /* Init tickstart for timeout management*/

+  tickstart = HAL_GetTick();

+

+  /* Init temporary variables */

+  tmp_state           = hspi->State;

+  tmp_mode            = hspi->Init.Mode;

+  initial_TxXferCount = Size;

+  initial_RxXferCount = Size;

+#if (USE_SPI_CRC != 0U)

+  spi_cr1             = READ_REG(hspi->Instance->CR1);

+  spi_cr2             = READ_REG(hspi->Instance->CR2);

+#endif /* USE_SPI_CRC */

+

+  if (!((tmp_state == HAL_SPI_STATE_READY) || \

+        ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_state == HAL_SPI_STATE_BUSY_RX))))

+  {

+    errorcode = HAL_BUSY;

+    goto error;

+  }

+

+  if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))

+  {

+    errorcode = HAL_ERROR;

+    goto error;

+  }

+

+  /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */

+  if (hspi->State != HAL_SPI_STATE_BUSY_RX)

+  {

+    hspi->State = HAL_SPI_STATE_BUSY_TX_RX;

+  }

+

+  /* Set the transaction information */

+  hspi->ErrorCode   = HAL_SPI_ERROR_NONE;

+  hspi->pRxBuffPtr  = (uint8_t *)pRxData;

+  hspi->RxXferCount = Size;

+  hspi->RxXferSize  = Size;

+  hspi->pTxBuffPtr  = (uint8_t *)pTxData;

+  hspi->TxXferCount = Size;

+  hspi->TxXferSize  = Size;

+

+  /*Init field not used in handle to zero */

+  hspi->RxISR       = NULL;

+  hspi->TxISR       = NULL;

+

+#if (USE_SPI_CRC != 0U)

+  /* Reset CRC Calculation */

+  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+  {

+    SPI_RESET_CRC(hspi);

+  }

+#endif /* USE_SPI_CRC */

+

+  /* Set the Rx Fifo threshold */

+  if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || (initial_RxXferCount > 1U))

+  {

+    /* Set fiforxthreshold according the reception data length: 16bit */

+    CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);

+  }

+  else

+  {

+    /* Set fiforxthreshold according the reception data length: 8bit */

+    SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);

+  }

+

+  /* Check if the SPI is already enabled */

+  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)

+  {

+    /* Enable SPI peripheral */

+    __HAL_SPI_ENABLE(hspi);

+  }

+

+  /* Transmit and Receive data in 16 Bit mode */

+  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)

+  {

+    if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U))

+    {

+      hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);

+      hspi->pTxBuffPtr += sizeof(uint16_t);

+      hspi->TxXferCount--;

+    }

+    while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U))

+    {

+      /* Check TXE flag */

+      if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U))

+      {

+        hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);

+        hspi->pTxBuffPtr += sizeof(uint16_t);

+        hspi->TxXferCount--;

+        /* Next Data is a reception (Rx). Tx not allowed */

+        txallowed = 0U;

+

+#if (USE_SPI_CRC != 0U)

+        /* Enable CRC Transmission */

+        if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE))

+        {

+          /* Set NSS Soft to received correctly the CRC on slave mode with NSS pulse activated */

+          if ((READ_BIT(spi_cr1, SPI_CR1_MSTR) == 0U) && (READ_BIT(spi_cr2, SPI_CR2_NSSP) == SPI_CR2_NSSP))

+          {

+            SET_BIT(hspi->Instance->CR1, SPI_CR1_SSM);

+          }

+          SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);

+        }

+#endif /* USE_SPI_CRC */

+      }

+

+      /* Check RXNE flag */

+      if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U))

+      {

+        *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR;

+        hspi->pRxBuffPtr += sizeof(uint16_t);

+        hspi->RxXferCount--;

+        /* Next Data is a Transmission (Tx). Tx is allowed */

+        txallowed = 1U;

+      }

+      if (((HAL_GetTick() - tickstart) >=  Timeout) && (Timeout != HAL_MAX_DELAY))

+      {

+        errorcode = HAL_TIMEOUT;

+        goto error;

+      }

+    }

+  }

+  /* Transmit and Receive data in 8 Bit mode */

+  else

+  {

+    if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U))

+    {

+      if (hspi->TxXferCount > 1U)

+      {

+        hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);

+        hspi->pTxBuffPtr += sizeof(uint16_t);

+        hspi->TxXferCount -= 2U;

+      }

+      else

+      {

+        *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr);

+        hspi->pTxBuffPtr++;

+        hspi->TxXferCount--;

+      }

+    }

+    while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U))

+    {

+      /* Check TXE flag */

+      if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U))

+      {

+        if (hspi->TxXferCount > 1U)

+        {

+          hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);

+          hspi->pTxBuffPtr += sizeof(uint16_t);

+          hspi->TxXferCount -= 2U;

+        }

+        else

+        {

+          *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr);

+          hspi->pTxBuffPtr++;

+          hspi->TxXferCount--;

+        }

+        /* Next Data is a reception (Rx). Tx not allowed */

+        txallowed = 0U;

+

+#if (USE_SPI_CRC != 0U)

+        /* Enable CRC Transmission */

+        if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE))

+        {

+          /* Set NSS Soft to received correctly the CRC on slave mode with NSS pulse activated */

+          if ((READ_BIT(spi_cr1, SPI_CR1_MSTR) == 0U) && (READ_BIT(spi_cr2, SPI_CR2_NSSP) == SPI_CR2_NSSP))

+          {

+            SET_BIT(hspi->Instance->CR1, SPI_CR1_SSM);

+          }

+          SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);

+        }

+#endif /* USE_SPI_CRC */

+      }

+

+      /* Wait until RXNE flag is reset */

+      if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U))

+      {

+        if (hspi->RxXferCount > 1U)

+        {

+          *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR;

+          hspi->pRxBuffPtr += sizeof(uint16_t);

+          hspi->RxXferCount -= 2U;

+          if (hspi->RxXferCount <= 1U)

+          {

+            /* Set RX Fifo threshold before to switch on 8 bit data size */

+            SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);

+          }

+        }

+        else

+        {

+          (*(uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR;

+          hspi->pRxBuffPtr++;

+          hspi->RxXferCount--;

+        }

+        /* Next Data is a Transmission (Tx). Tx is allowed */

+        txallowed = 1U;

+      }

+      if ((((HAL_GetTick() - tickstart) >=  Timeout) && ((Timeout != HAL_MAX_DELAY))) || (Timeout == 0U))

+      {

+        errorcode = HAL_TIMEOUT;

+        goto error;

+      }

+    }

+  }

+

+#if (USE_SPI_CRC != 0U)

+  /* Read CRC from DR to close CRC calculation process */

+  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+  {

+    /* Wait until TXE flag */

+    if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK)

+    {

+      /* Error on the CRC reception */

+      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);

+      errorcode = HAL_TIMEOUT;

+      goto error;

+    }

+    /* Read CRC */

+    if (hspi->Init.DataSize == SPI_DATASIZE_16BIT)

+    {

+      /* Read 16bit CRC */

+      READ_REG(hspi->Instance->DR);

+    }

+    else

+    {

+      /* Read 8bit CRC */

+      READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);

+

+      if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)

+      {

+        if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK)

+        {

+          /* Error on the CRC reception */

+          SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);

+          errorcode = HAL_TIMEOUT;

+          goto error;

+        }

+        /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */

+        READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);

+      }

+    }

+  }

+

+  /* Check if CRC error occurred */

+  if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR))

+  {

+    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);

+    /* Clear CRC Flag */

+    __HAL_SPI_CLEAR_CRCERRFLAG(hspi);

+

+    errorcode = HAL_ERROR;

+  }

+#endif /* USE_SPI_CRC */

+

+  /* Check the end of the transaction */

+  if (SPI_EndRxTxTransaction(hspi, Timeout, tickstart) != HAL_OK)

+  {

+    errorcode = HAL_ERROR;

+    hspi->ErrorCode = HAL_SPI_ERROR_FLAG;

+  }

+

+error :

+  hspi->State = HAL_SPI_STATE_READY;

+  __HAL_UNLOCK(hspi);

+  return errorcode;

+}

+

+/**

+  * @brief  Transmit an amount of data in non-blocking mode with Interrupt.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @param  pData pointer to data buffer

+  * @param  Size amount of data to be sent

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)

+{

+  HAL_StatusTypeDef errorcode = HAL_OK;

+

+  /* Check Direction parameter */

+  assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));

+

+  /* Process Locked */

+  __HAL_LOCK(hspi);

+

+  if ((pData == NULL) || (Size == 0U))

+  {

+    errorcode = HAL_ERROR;

+    goto error;

+  }

+

+  if (hspi->State != HAL_SPI_STATE_READY)

+  {

+    errorcode = HAL_BUSY;

+    goto error;

+  }

+

+  /* Set the transaction information */

+  hspi->State       = HAL_SPI_STATE_BUSY_TX;

+  hspi->ErrorCode   = HAL_SPI_ERROR_NONE;

+  hspi->pTxBuffPtr  = (uint8_t *)pData;

+  hspi->TxXferSize  = Size;

+  hspi->TxXferCount = Size;

+

+  /* Init field not used in handle to zero */

+  hspi->pRxBuffPtr  = (uint8_t *)NULL;

+  hspi->RxXferSize  = 0U;

+  hspi->RxXferCount = 0U;

+  hspi->RxISR       = NULL;

+

+  /* Set the function for IT treatment */

+  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)

+  {

+    hspi->TxISR = SPI_TxISR_16BIT;

+  }

+  else

+  {

+    hspi->TxISR = SPI_TxISR_8BIT;

+  }

+

+  /* Configure communication direction : 1Line */

+  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)

+  {

+    SPI_1LINE_TX(hspi);

+  }

+

+#if (USE_SPI_CRC != 0U)

+  /* Reset CRC Calculation */

+  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+  {

+    SPI_RESET_CRC(hspi);

+  }

+#endif /* USE_SPI_CRC */

+

+  /* Enable TXE and ERR interrupt */

+  __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR));

+

+

+  /* Check if the SPI is already enabled */

+  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)

+  {

+    /* Enable SPI peripheral */

+    __HAL_SPI_ENABLE(hspi);

+  }

+

+error :

+  __HAL_UNLOCK(hspi);

+  return errorcode;

+}

+

+/**

+  * @brief  Receive an amount of data in non-blocking mode with Interrupt.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @param  pData pointer to data buffer

+  * @param  Size amount of data to be sent

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)

+{

+  HAL_StatusTypeDef errorcode = HAL_OK;

+

+  if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER))

+  {

+    hspi->State = HAL_SPI_STATE_BUSY_RX;

+    /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */

+    return HAL_SPI_TransmitReceive_IT(hspi, pData, pData, Size);

+  }

+

+  /* Process Locked */

+  __HAL_LOCK(hspi);

+

+  if (hspi->State != HAL_SPI_STATE_READY)

+  {

+    errorcode = HAL_BUSY;

+    goto error;

+  }

+

+  if ((pData == NULL) || (Size == 0U))

+  {

+    errorcode = HAL_ERROR;

+    goto error;

+  }

+

+  /* Set the transaction information */

+  hspi->State       = HAL_SPI_STATE_BUSY_RX;

+  hspi->ErrorCode   = HAL_SPI_ERROR_NONE;

+  hspi->pRxBuffPtr  = (uint8_t *)pData;

+  hspi->RxXferSize  = Size;

+  hspi->RxXferCount = Size;

+

+  /* Init field not used in handle to zero */

+  hspi->pTxBuffPtr  = (uint8_t *)NULL;

+  hspi->TxXferSize  = 0U;

+  hspi->TxXferCount = 0U;

+  hspi->TxISR       = NULL;

+

+  /* Check the data size to adapt Rx threshold and the set the function for IT treatment */

+  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)

+  {

+    /* Set RX Fifo threshold according the reception data length: 16 bit */

+    CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);

+    hspi->RxISR = SPI_RxISR_16BIT;

+  }

+  else

+  {

+    /* Set RX Fifo threshold according the reception data length: 8 bit */

+    SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);

+    hspi->RxISR = SPI_RxISR_8BIT;

+  }

+

+  /* Configure communication direction : 1Line */

+  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)

+  {

+    SPI_1LINE_RX(hspi);

+  }

+

+#if (USE_SPI_CRC != 0U)

+  /* Reset CRC Calculation */

+  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+  {

+    hspi->CRCSize = 1U;

+    if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT))

+    {

+      hspi->CRCSize = 2U;

+    }

+    SPI_RESET_CRC(hspi);

+  }

+  else

+  {

+    hspi->CRCSize = 0U;

+  }

+#endif /* USE_SPI_CRC */

+

+  /* Enable TXE and ERR interrupt */

+  __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));

+

+  /* Note : The SPI must be enabled after unlocking current process

+            to avoid the risk of SPI interrupt handle execution before current

+            process unlock */

+

+  /* Check if the SPI is already enabled */

+  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)

+  {

+    /* Enable SPI peripheral */

+    __HAL_SPI_ENABLE(hspi);

+  }

+

+error :

+  /* Process Unlocked */

+  __HAL_UNLOCK(hspi);

+  return errorcode;

+}

+

+/**

+  * @brief  Transmit and Receive an amount of data in non-blocking mode with Interrupt.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @param  pTxData pointer to transmission data buffer

+  * @param  pRxData pointer to reception data buffer

+  * @param  Size amount of data to be sent and received

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)

+{

+  uint32_t             tmp_mode;

+  HAL_SPI_StateTypeDef tmp_state;

+  HAL_StatusTypeDef    errorcode = HAL_OK;

+

+  /* Check Direction parameter */

+  assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));

+

+  /* Process locked */

+  __HAL_LOCK(hspi);

+

+  /* Init temporary variables */

+  tmp_state           = hspi->State;

+  tmp_mode            = hspi->Init.Mode;

+

+  if (!((tmp_state == HAL_SPI_STATE_READY) || \

+        ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_state == HAL_SPI_STATE_BUSY_RX))))

+  {

+    errorcode = HAL_BUSY;

+    goto error;

+  }

+

+  if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))

+  {

+    errorcode = HAL_ERROR;

+    goto error;

+  }

+

+  /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */

+  if (hspi->State != HAL_SPI_STATE_BUSY_RX)

+  {

+    hspi->State = HAL_SPI_STATE_BUSY_TX_RX;

+  }

+

+  /* Set the transaction information */

+  hspi->ErrorCode   = HAL_SPI_ERROR_NONE;

+  hspi->pTxBuffPtr  = (uint8_t *)pTxData;

+  hspi->TxXferSize  = Size;

+  hspi->TxXferCount = Size;

+  hspi->pRxBuffPtr  = (uint8_t *)pRxData;

+  hspi->RxXferSize  = Size;

+  hspi->RxXferCount = Size;

+

+  /* Set the function for IT treatment */

+  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)

+  {

+    hspi->RxISR     = SPI_2linesRxISR_16BIT;

+    hspi->TxISR     = SPI_2linesTxISR_16BIT;

+  }

+  else

+  {

+    hspi->RxISR     = SPI_2linesRxISR_8BIT;

+    hspi->TxISR     = SPI_2linesTxISR_8BIT;

+  }

+

+#if (USE_SPI_CRC != 0U)

+  /* Reset CRC Calculation */

+  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+  {

+    hspi->CRCSize = 1U;

+    if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT))

+    {

+      hspi->CRCSize = 2U;

+    }

+    SPI_RESET_CRC(hspi);

+  }

+  else

+  {

+    hspi->CRCSize = 0U;

+  }

+#endif /* USE_SPI_CRC */

+

+  /* Check if packing mode is enabled and if there is more than 2 data to receive */

+  if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || (Size >= 2U))

+  {

+    /* Set RX Fifo threshold according the reception data length: 16 bit */

+    CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);

+  }

+  else

+  {

+    /* Set RX Fifo threshold according the reception data length: 8 bit */

+    SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);

+  }

+

+  /* Enable TXE, RXNE and ERR interrupt */

+  __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR));

+

+  /* Check if the SPI is already enabled */

+  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)

+  {

+    /* Enable SPI peripheral */

+    __HAL_SPI_ENABLE(hspi);

+  }

+

+error :

+  /* Process Unlocked */

+  __HAL_UNLOCK(hspi);

+  return errorcode;

+}

+

+/**

+  * @brief  Transmit an amount of data in non-blocking mode with DMA.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @param  pData pointer to data buffer

+  * @param  Size amount of data to be sent

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)

+{

+  HAL_StatusTypeDef errorcode = HAL_OK;

+

+  /* Check tx dma handle */

+  assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx));

+

+  /* Check Direction parameter */

+  assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));

+

+  /* Process Locked */

+  __HAL_LOCK(hspi);

+

+  if (hspi->State != HAL_SPI_STATE_READY)

+  {

+    errorcode = HAL_BUSY;

+    goto error;

+  }

+

+  if ((pData == NULL) || (Size == 0U))

+  {

+    errorcode = HAL_ERROR;

+    goto error;

+  }

+

+  /* Set the transaction information */

+  hspi->State       = HAL_SPI_STATE_BUSY_TX;

+  hspi->ErrorCode   = HAL_SPI_ERROR_NONE;

+  hspi->pTxBuffPtr  = (uint8_t *)pData;

+  hspi->TxXferSize  = Size;

+  hspi->TxXferCount = Size;

+

+  /* Init field not used in handle to zero */

+  hspi->pRxBuffPtr  = (uint8_t *)NULL;

+  hspi->TxISR       = NULL;

+  hspi->RxISR       = NULL;

+  hspi->RxXferSize  = 0U;

+  hspi->RxXferCount = 0U;

+

+  /* Configure communication direction : 1Line */

+  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)

+  {

+    SPI_1LINE_TX(hspi);

+  }

+

+#if (USE_SPI_CRC != 0U)

+  /* Reset CRC Calculation */

+  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+  {

+    SPI_RESET_CRC(hspi);

+  }

+#endif /* USE_SPI_CRC */

+

+  /* Set the SPI TxDMA Half transfer complete callback */

+  hspi->hdmatx->XferHalfCpltCallback = SPI_DMAHalfTransmitCplt;

+

+  /* Set the SPI TxDMA transfer complete callback */

+  hspi->hdmatx->XferCpltCallback = SPI_DMATransmitCplt;

+

+  /* Set the DMA error callback */

+  hspi->hdmatx->XferErrorCallback = SPI_DMAError;

+

+  /* Set the DMA AbortCpltCallback */

+  hspi->hdmatx->XferAbortCallback = NULL;

+

+  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX);

+  /* Packing mode is enabled only if the DMA setting is HALWORD */

+  if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->hdmatx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD))

+  {

+    /* Check the even/odd of the data size + crc if enabled */

+    if ((hspi->TxXferCount & 0x1U) == 0U)

+    {

+      CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX);

+      hspi->TxXferCount = (hspi->TxXferCount >> 1U);

+    }

+    else

+    {

+      SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX);

+      hspi->TxXferCount = (hspi->TxXferCount >> 1U) + 1U;

+    }

+  }

+

+  /* Enable the Tx DMA Stream/Channel */

+  if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, hspi->TxXferCount))

+  {

+    /* Update SPI error code */

+    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);

+    errorcode = HAL_ERROR;

+

+    hspi->State = HAL_SPI_STATE_READY;

+    goto error;

+  }

+

+  /* Check if the SPI is already enabled */

+  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)

+  {

+    /* Enable SPI peripheral */

+    __HAL_SPI_ENABLE(hspi);

+  }

+

+  /* Enable the SPI Error Interrupt Bit */

+  __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR));

+

+  /* Enable Tx DMA Request */

+  SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN);

+

+error :

+  /* Process Unlocked */

+  __HAL_UNLOCK(hspi);

+  return errorcode;

+}

+

+/**

+  * @brief  Receive an amount of data in non-blocking mode with DMA.

+  * @note   In case of MASTER mode and SPI_DIRECTION_2LINES direction, hdmatx shall be defined.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @param  pData pointer to data buffer

+  * @note   When the CRC feature is enabled the pData Length must be Size + 1.

+  * @param  Size amount of data to be sent

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)

+{

+  HAL_StatusTypeDef errorcode = HAL_OK;

+

+  /* Check rx dma handle */

+  assert_param(IS_SPI_DMA_HANDLE(hspi->hdmarx));

+

+  if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER))

+  {

+    hspi->State = HAL_SPI_STATE_BUSY_RX;

+

+    /* Check tx dma handle */

+    assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx));

+

+    /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */

+    return HAL_SPI_TransmitReceive_DMA(hspi, pData, pData, Size);

+  }

+

+  /* Process Locked */

+  __HAL_LOCK(hspi);

+

+  if (hspi->State != HAL_SPI_STATE_READY)

+  {

+    errorcode = HAL_BUSY;

+    goto error;

+  }

+

+  if ((pData == NULL) || (Size == 0U))

+  {

+    errorcode = HAL_ERROR;

+    goto error;

+  }

+

+  /* Set the transaction information */

+  hspi->State       = HAL_SPI_STATE_BUSY_RX;

+  hspi->ErrorCode   = HAL_SPI_ERROR_NONE;

+  hspi->pRxBuffPtr  = (uint8_t *)pData;

+  hspi->RxXferSize  = Size;

+  hspi->RxXferCount = Size;

+

+  /*Init field not used in handle to zero */

+  hspi->RxISR       = NULL;

+  hspi->TxISR       = NULL;

+  hspi->TxXferSize  = 0U;

+  hspi->TxXferCount = 0U;

+

+  /* Configure communication direction : 1Line */

+  if (hspi->Init.Direction == SPI_DIRECTION_1LINE)

+  {

+    SPI_1LINE_RX(hspi);

+  }

+

+#if (USE_SPI_CRC != 0U)

+  /* Reset CRC Calculation */

+  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+  {

+    SPI_RESET_CRC(hspi);

+  }

+#endif /* USE_SPI_CRC */

+

+

+  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX);

+  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)

+  {

+    /* Set RX Fifo threshold according the reception data length: 16bit */

+    CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);

+  }

+  else

+  {

+    /* Set RX Fifo threshold according the reception data length: 8bit */

+    SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);

+

+    if (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD)

+    {

+      /* Set RX Fifo threshold according the reception data length: 16bit */

+      CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);

+

+      if ((hspi->RxXferCount & 0x1U) == 0x0U)

+      {

+        CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX);

+        hspi->RxXferCount = hspi->RxXferCount >> 1U;

+      }

+      else

+      {

+        SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX);

+        hspi->RxXferCount = (hspi->RxXferCount >> 1U) + 1U;

+      }

+    }

+  }

+

+  /* Set the SPI RxDMA Half transfer complete callback */

+  hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt;

+

+  /* Set the SPI Rx DMA transfer complete callback */

+  hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt;

+

+  /* Set the DMA error callback */

+  hspi->hdmarx->XferErrorCallback = SPI_DMAError;

+

+  /* Set the DMA AbortCpltCallback */

+  hspi->hdmarx->XferAbortCallback = NULL;

+

+  /* Enable the Rx DMA Stream/Channel  */

+  if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, hspi->RxXferCount))

+  {

+    /* Update SPI error code */

+    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);

+    errorcode = HAL_ERROR;

+

+    hspi->State = HAL_SPI_STATE_READY;

+    goto error;

+  }

+

+  /* Check if the SPI is already enabled */

+  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)

+  {

+    /* Enable SPI peripheral */

+    __HAL_SPI_ENABLE(hspi);

+  }

+

+  /* Enable the SPI Error Interrupt Bit */

+  __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR));

+

+  /* Enable Rx DMA Request */

+  SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN);

+

+error:

+  /* Process Unlocked */

+  __HAL_UNLOCK(hspi);

+  return errorcode;

+}

+

+/**

+  * @brief  Transmit and Receive an amount of data in non-blocking mode with DMA.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @param  pTxData pointer to transmission data buffer

+  * @param  pRxData pointer to reception data buffer

+  * @note   When the CRC feature is enabled the pRxData Length must be Size + 1

+  * @param  Size amount of data to be sent

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData,

+                                              uint16_t Size)

+{

+  uint32_t             tmp_mode;

+  HAL_SPI_StateTypeDef tmp_state;

+  HAL_StatusTypeDef errorcode = HAL_OK;

+

+  /* Check rx & tx dma handles */

+  assert_param(IS_SPI_DMA_HANDLE(hspi->hdmarx));

+  assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx));

+

+  /* Check Direction parameter */

+  assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));

+

+  /* Process locked */

+  __HAL_LOCK(hspi);

+

+  /* Init temporary variables */

+  tmp_state           = hspi->State;

+  tmp_mode            = hspi->Init.Mode;

+

+  if (!((tmp_state == HAL_SPI_STATE_READY) ||

+        ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_state == HAL_SPI_STATE_BUSY_RX))))

+  {

+    errorcode = HAL_BUSY;

+    goto error;

+  }

+

+  if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))

+  {

+    errorcode = HAL_ERROR;

+    goto error;

+  }

+

+  /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */

+  if (hspi->State != HAL_SPI_STATE_BUSY_RX)

+  {

+    hspi->State = HAL_SPI_STATE_BUSY_TX_RX;

+  }

+

+  /* Set the transaction information */

+  hspi->ErrorCode   = HAL_SPI_ERROR_NONE;

+  hspi->pTxBuffPtr  = (uint8_t *)pTxData;

+  hspi->TxXferSize  = Size;

+  hspi->TxXferCount = Size;

+  hspi->pRxBuffPtr  = (uint8_t *)pRxData;

+  hspi->RxXferSize  = Size;

+  hspi->RxXferCount = Size;

+

+  /* Init field not used in handle to zero */

+  hspi->RxISR       = NULL;

+  hspi->TxISR       = NULL;

+

+#if (USE_SPI_CRC != 0U)

+  /* Reset CRC Calculation */

+  if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+  {

+    SPI_RESET_CRC(hspi);

+  }

+#endif /* USE_SPI_CRC */

+

+  /* Reset the threshold bit */

+  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX | SPI_CR2_LDMARX);

+

+  /* The packing mode management is enabled by the DMA settings according the spi data size */

+  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)

+  {

+    /* Set fiforxthreshold according the reception data length: 16bit */

+    CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);

+  }

+  else

+  {

+    /* Set RX Fifo threshold according the reception data length: 8bit */

+    SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);

+

+    if (hspi->hdmatx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD)

+    {

+      if ((hspi->TxXferSize & 0x1U) == 0x0U)

+      {

+        CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX);

+        hspi->TxXferCount = hspi->TxXferCount >> 1U;

+      }

+      else

+      {

+        SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX);

+        hspi->TxXferCount = (hspi->TxXferCount >> 1U) + 1U;

+      }

+    }

+

+    if (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD)

+    {

+      /* Set RX Fifo threshold according the reception data length: 16bit */

+      CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);

+

+      if ((hspi->RxXferCount & 0x1U) == 0x0U)

+      {

+        CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX);

+        hspi->RxXferCount = hspi->RxXferCount >> 1U;

+      }

+      else

+      {

+        SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX);

+        hspi->RxXferCount = (hspi->RxXferCount >> 1U) + 1U;

+      }

+    }

+  }

+

+  /* Check if we are in Rx only or in Rx/Tx Mode and configure the DMA transfer complete callback */

+  if (hspi->State == HAL_SPI_STATE_BUSY_RX)

+  {

+    /* Set the SPI Rx DMA Half transfer complete callback */

+    hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt;

+    hspi->hdmarx->XferCpltCallback     = SPI_DMAReceiveCplt;

+  }

+  else

+  {

+    /* Set the SPI Tx/Rx DMA Half transfer complete callback */

+    hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfTransmitReceiveCplt;

+    hspi->hdmarx->XferCpltCallback     = SPI_DMATransmitReceiveCplt;

+  }

+

+  /* Set the DMA error callback */

+  hspi->hdmarx->XferErrorCallback = SPI_DMAError;

+

+  /* Set the DMA AbortCpltCallback */

+  hspi->hdmarx->XferAbortCallback = NULL;

+

+  /* Enable the Rx DMA Stream/Channel  */

+  if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, hspi->RxXferCount))

+  {

+    /* Update SPI error code */

+    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);

+    errorcode = HAL_ERROR;

+

+    hspi->State = HAL_SPI_STATE_READY;

+    goto error;

+  }

+

+  /* Enable Rx DMA Request */

+  SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN);

+

+  /* Set the SPI Tx DMA transfer complete callback as NULL because the communication closing

+  is performed in DMA reception complete callback  */

+  hspi->hdmatx->XferHalfCpltCallback = NULL;

+  hspi->hdmatx->XferCpltCallback     = NULL;

+  hspi->hdmatx->XferErrorCallback    = NULL;

+  hspi->hdmatx->XferAbortCallback    = NULL;

+

+  /* Enable the Tx DMA Stream/Channel  */

+  if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, hspi->TxXferCount))

+  {

+    /* Update SPI error code */

+    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);

+    errorcode = HAL_ERROR;

+

+    hspi->State = HAL_SPI_STATE_READY;

+    goto error;

+  }

+

+  /* Check if the SPI is already enabled */

+  if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)

+  {

+    /* Enable SPI peripheral */

+    __HAL_SPI_ENABLE(hspi);

+  }

+  /* Enable the SPI Error Interrupt Bit */

+  __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR));

+

+  /* Enable Tx DMA Request */

+  SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN);

+

+error :

+  /* Process Unlocked */

+  __HAL_UNLOCK(hspi);

+  return errorcode;

+}

+

+/**

+  * @brief  Abort ongoing transfer (blocking mode).

+  * @param  hspi SPI handle.

+  * @note   This procedure could be used for aborting any ongoing transfer (Tx and Rx),

+  *         started in Interrupt or DMA mode.

+  *         This procedure performs following operations :

+  *           - Disable SPI Interrupts (depending of transfer direction)

+  *           - Disable the DMA transfer in the peripheral register (if enabled)

+  *           - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)

+  *           - Set handle State to READY

+  * @note   This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.

+  * @retval HAL status

+*/

+HAL_StatusTypeDef HAL_SPI_Abort(SPI_HandleTypeDef *hspi)

+{

+  HAL_StatusTypeDef errorcode;

+  __IO uint32_t count, resetcount;

+

+  /* Initialized local variable  */

+  errorcode = HAL_OK;

+  resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U);

+  count = resetcount;

+

+  /* Clear ERRIE interrupt to avoid error interrupts generation during Abort procedure */

+  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE);

+

+  /* Disable TXEIE, RXNEIE and ERRIE(mode fault event, overrun error, TI frame error) interrupts */

+  if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE))

+  {

+    hspi->TxISR = SPI_AbortTx_ISR;

+    /* Wait HAL_SPI_STATE_ABORT state */

+    do

+    {

+      if (count == 0U)

+      {

+        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);

+        break;

+      }

+      count--;

+    }

+    while (hspi->State != HAL_SPI_STATE_ABORT);

+    /* Reset Timeout Counter */

+    count = resetcount;

+  }

+

+  if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE))

+  {

+    hspi->RxISR = SPI_AbortRx_ISR;

+    /* Wait HAL_SPI_STATE_ABORT state */

+    do

+    {

+      if (count == 0U)

+      {

+        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);

+        break;

+      }

+      count--;

+    }

+    while (hspi->State != HAL_SPI_STATE_ABORT);

+    /* Reset Timeout Counter */

+    count = resetcount;

+  }

+

+  /* Disable the SPI DMA Tx request if enabled */

+  if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN))

+  {

+    /* Abort the SPI DMA Tx Stream/Channel : use blocking DMA Abort API (no callback) */

+    if (hspi->hdmatx != NULL)

+    {

+      /* Set the SPI DMA Abort callback :

+      will lead to call HAL_SPI_AbortCpltCallback() at end of DMA abort procedure */

+      hspi->hdmatx->XferAbortCallback = NULL;

+

+      /* Abort DMA Tx Handle linked to SPI Peripheral */

+      if (HAL_DMA_Abort(hspi->hdmatx) != HAL_OK)

+      {

+        hspi->ErrorCode = HAL_SPI_ERROR_ABORT;

+      }

+

+      /* Disable Tx DMA Request */

+      CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXDMAEN));

+

+      if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)

+      {

+        hspi->ErrorCode = HAL_SPI_ERROR_ABORT;

+      }

+

+      /* Disable SPI Peripheral */

+      __HAL_SPI_DISABLE(hspi);

+

+      /* Empty the FRLVL fifo */

+      if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)

+      {

+        hspi->ErrorCode = HAL_SPI_ERROR_ABORT;

+      }

+    }

+  }

+

+  /* Disable the SPI DMA Rx request if enabled */

+  if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN))

+  {

+    /* Abort the SPI DMA Rx Stream/Channel : use blocking DMA Abort API (no callback) */

+    if (hspi->hdmarx != NULL)

+    {

+      /* Set the SPI DMA Abort callback :

+      will lead to call HAL_SPI_AbortCpltCallback() at end of DMA abort procedure */

+      hspi->hdmarx->XferAbortCallback = NULL;

+

+      /* Abort DMA Rx Handle linked to SPI Peripheral */

+      if (HAL_DMA_Abort(hspi->hdmarx) != HAL_OK)

+      {

+        hspi->ErrorCode = HAL_SPI_ERROR_ABORT;

+      }

+

+      /* Disable peripheral */

+      __HAL_SPI_DISABLE(hspi);

+

+      /* Control the BSY flag */

+      if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)

+      {

+        hspi->ErrorCode = HAL_SPI_ERROR_ABORT;

+      }

+

+      /* Empty the FRLVL fifo */

+      if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)

+      {

+        hspi->ErrorCode = HAL_SPI_ERROR_ABORT;

+      }

+

+      /* Disable Rx DMA Request */

+      CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXDMAEN));

+    }

+  }

+  /* Reset Tx and Rx transfer counters */

+  hspi->RxXferCount = 0U;

+  hspi->TxXferCount = 0U;

+

+  /* Check error during Abort procedure */

+  if (hspi->ErrorCode == HAL_SPI_ERROR_ABORT)

+  {

+    /* return HAL_Error in case of error during Abort procedure */

+    errorcode = HAL_ERROR;

+  }

+  else

+  {

+    /* Reset errorCode */

+    hspi->ErrorCode = HAL_SPI_ERROR_NONE;

+  }

+

+  /* Clear the Error flags in the SR register */

+  __HAL_SPI_CLEAR_OVRFLAG(hspi);

+  __HAL_SPI_CLEAR_FREFLAG(hspi);

+

+  /* Restore hspi->state to ready */

+  hspi->State = HAL_SPI_STATE_READY;

+

+  return errorcode;

+}

+

+/**

+  * @brief  Abort ongoing transfer (Interrupt mode).

+  * @param  hspi SPI handle.

+  * @note   This procedure could be used for aborting any ongoing transfer (Tx and Rx),

+  *         started in Interrupt or DMA mode.

+  *         This procedure performs following operations :

+  *           - Disable SPI Interrupts (depending of transfer direction)

+  *           - Disable the DMA transfer in the peripheral register (if enabled)

+  *           - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)

+  *           - Set handle State to READY

+  *           - At abort completion, call user abort complete callback

+  * @note   This procedure is executed in Interrupt mode, meaning that abort procedure could be

+  *         considered as completed only when user abort complete callback is executed (not when exiting function).

+  * @retval HAL status

+*/

+HAL_StatusTypeDef HAL_SPI_Abort_IT(SPI_HandleTypeDef *hspi)

+{

+  HAL_StatusTypeDef errorcode;

+  uint32_t abortcplt ;

+  __IO uint32_t count, resetcount;

+

+  /* Initialized local variable  */

+  errorcode = HAL_OK;

+  abortcplt = 1U;

+  resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U);

+  count = resetcount;

+

+  /* Clear ERRIE interrupt to avoid error interrupts generation during Abort procedure */

+  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE);

+

+  /* Change Rx and Tx Irq Handler to Disable TXEIE, RXNEIE and ERRIE interrupts */

+  if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE))

+  {

+    hspi->TxISR = SPI_AbortTx_ISR;

+    /* Wait HAL_SPI_STATE_ABORT state */

+    do

+    {

+      if (count == 0U)

+      {

+        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);

+        break;

+      }

+      count--;

+    }

+    while (hspi->State != HAL_SPI_STATE_ABORT);

+    /* Reset Timeout Counter */

+    count = resetcount;

+  }

+

+  if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE))

+  {

+    hspi->RxISR = SPI_AbortRx_ISR;

+    /* Wait HAL_SPI_STATE_ABORT state */

+    do

+    {

+      if (count == 0U)

+      {

+        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);

+        break;

+      }

+      count--;

+    }

+    while (hspi->State != HAL_SPI_STATE_ABORT);

+    /* Reset Timeout Counter */

+    count = resetcount;

+  }

+

+  /* If DMA Tx and/or DMA Rx Handles are associated to SPI Handle, DMA Abort complete callbacks should be initialised

+     before any call to DMA Abort functions */

+  /* DMA Tx Handle is valid */

+  if (hspi->hdmatx != NULL)

+  {

+    /* Set DMA Abort Complete callback if UART DMA Tx request if enabled.

+       Otherwise, set it to NULL */

+    if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN))

+    {

+      hspi->hdmatx->XferAbortCallback = SPI_DMATxAbortCallback;

+    }

+    else

+    {

+      hspi->hdmatx->XferAbortCallback = NULL;

+    }

+  }

+  /* DMA Rx Handle is valid */

+  if (hspi->hdmarx != NULL)

+  {

+    /* Set DMA Abort Complete callback if UART DMA Rx request if enabled.

+       Otherwise, set it to NULL */

+    if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN))

+    {

+      hspi->hdmarx->XferAbortCallback = SPI_DMARxAbortCallback;

+    }

+    else

+    {

+      hspi->hdmarx->XferAbortCallback = NULL;

+    }

+  }

+

+  /* Disable the SPI DMA Tx request if enabled */

+  if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN))

+  {

+    /* Abort the SPI DMA Tx Stream/Channel */

+    if (hspi->hdmatx != NULL)

+    {

+      /* Abort DMA Tx Handle linked to SPI Peripheral */

+      if (HAL_DMA_Abort_IT(hspi->hdmatx) != HAL_OK)

+      {

+        hspi->hdmatx->XferAbortCallback = NULL;

+        hspi->ErrorCode = HAL_SPI_ERROR_ABORT;

+      }

+      else

+      {

+        abortcplt = 0U;

+      }

+    }

+  }

+  /* Disable the SPI DMA Rx request if enabled */

+  if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN))

+  {

+    /* Abort the SPI DMA Rx Stream/Channel */

+    if (hspi->hdmarx != NULL)

+    {

+      /* Abort DMA Rx Handle linked to SPI Peripheral */

+      if (HAL_DMA_Abort_IT(hspi->hdmarx) !=  HAL_OK)

+      {

+        hspi->hdmarx->XferAbortCallback = NULL;

+        hspi->ErrorCode = HAL_SPI_ERROR_ABORT;

+      }

+      else

+      {

+        abortcplt = 0U;

+      }

+    }

+  }

+

+  if (abortcplt == 1U)

+  {

+    /* Reset Tx and Rx transfer counters */

+    hspi->RxXferCount = 0U;

+    hspi->TxXferCount = 0U;

+

+    /* Check error during Abort procedure */

+    if (hspi->ErrorCode == HAL_SPI_ERROR_ABORT)

+    {

+      /* return HAL_Error in case of error during Abort procedure */

+      errorcode = HAL_ERROR;

+    }

+    else

+    {

+      /* Reset errorCode */

+      hspi->ErrorCode = HAL_SPI_ERROR_NONE;

+    }

+

+    /* Clear the Error flags in the SR register */

+    __HAL_SPI_CLEAR_OVRFLAG(hspi);

+    __HAL_SPI_CLEAR_FREFLAG(hspi);

+

+    /* Restore hspi->State to Ready */

+    hspi->State = HAL_SPI_STATE_READY;

+

+    /* As no DMA to be aborted, call directly user Abort complete callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+    hspi->AbortCpltCallback(hspi);

+#else

+    HAL_SPI_AbortCpltCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+  }

+

+  return errorcode;

+}

+

+/**

+  * @brief  Pause the DMA Transfer.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for the specified SPI module.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi)

+{

+  /* Process Locked */

+  __HAL_LOCK(hspi);

+

+  /* Disable the SPI DMA Tx & Rx requests */

+  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);

+

+  /* Process Unlocked */

+  __HAL_UNLOCK(hspi);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Resume the DMA Transfer.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for the specified SPI module.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi)

+{

+  /* Process Locked */

+  __HAL_LOCK(hspi);

+

+  /* Enable the SPI DMA Tx & Rx requests */

+  SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);

+

+  /* Process Unlocked */

+  __HAL_UNLOCK(hspi);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stop the DMA Transfer.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for the specified SPI module.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi)

+{

+  HAL_StatusTypeDef errorcode = HAL_OK;

+  /* The Lock is not implemented on this API to allow the user application

+     to call the HAL SPI API under callbacks HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() or HAL_SPI_TxRxCpltCallback():

+     when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated

+     and the correspond call back is executed HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() or HAL_SPI_TxRxCpltCallback()

+     */

+

+  /* Abort the SPI DMA tx Stream/Channel  */

+  if (hspi->hdmatx != NULL)

+  {

+    if (HAL_OK != HAL_DMA_Abort(hspi->hdmatx))

+    {

+      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);

+      errorcode = HAL_ERROR;

+    }

+  }

+  /* Abort the SPI DMA rx Stream/Channel  */

+  if (hspi->hdmarx != NULL)

+  {

+    if (HAL_OK != HAL_DMA_Abort(hspi->hdmarx))

+    {

+      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);

+      errorcode = HAL_ERROR;

+    }

+  }

+

+  /* Disable the SPI DMA Tx & Rx requests */

+  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);

+  hspi->State = HAL_SPI_STATE_READY;

+  return errorcode;

+}

+

+/**

+  * @brief  Handle SPI interrupt request.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for the specified SPI module.

+  * @retval None

+  */

+void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi)

+{

+  uint32_t itsource = hspi->Instance->CR2;

+  uint32_t itflag   = hspi->Instance->SR;

+

+  /* SPI in mode Receiver ----------------------------------------------------*/

+  if ((SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) == RESET) &&

+      (SPI_CHECK_FLAG(itflag, SPI_FLAG_RXNE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_RXNE) != RESET))

+  {

+    hspi->RxISR(hspi);

+    return;

+  }

+

+  /* SPI in mode Transmitter -------------------------------------------------*/

+  if ((SPI_CHECK_FLAG(itflag, SPI_FLAG_TXE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_TXE) != RESET))

+  {

+    hspi->TxISR(hspi);

+    return;

+  }

+

+  /* SPI in Error Treatment --------------------------------------------------*/

+  if (((SPI_CHECK_FLAG(itflag, SPI_FLAG_MODF) != RESET) || (SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) != RESET) || (SPI_CHECK_FLAG(itflag, SPI_FLAG_FRE) != RESET)) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_ERR) != RESET))

+  {

+    /* SPI Overrun error interrupt occurred ----------------------------------*/

+    if (SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) != RESET)

+    {

+      if (hspi->State != HAL_SPI_STATE_BUSY_TX)

+      {

+        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_OVR);

+        __HAL_SPI_CLEAR_OVRFLAG(hspi);

+      }

+      else

+      {

+        __HAL_SPI_CLEAR_OVRFLAG(hspi);

+        return;

+      }

+    }

+

+    /* SPI Mode Fault error interrupt occurred -------------------------------*/

+    if (SPI_CHECK_FLAG(itflag, SPI_FLAG_MODF) != RESET)

+    {

+      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_MODF);

+      __HAL_SPI_CLEAR_MODFFLAG(hspi);

+    }

+

+    /* SPI Frame error interrupt occurred ------------------------------------*/

+    if (SPI_CHECK_FLAG(itflag, SPI_FLAG_FRE) != RESET)

+    {

+      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FRE);

+      __HAL_SPI_CLEAR_FREFLAG(hspi);

+    }

+

+    if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)

+    {

+      /* Disable all interrupts */

+      __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE | SPI_IT_TXE | SPI_IT_ERR);

+

+      hspi->State = HAL_SPI_STATE_READY;

+      /* Disable the SPI DMA requests if enabled */

+      if ((HAL_IS_BIT_SET(itsource, SPI_CR2_TXDMAEN)) || (HAL_IS_BIT_SET(itsource, SPI_CR2_RXDMAEN)))

+      {

+        CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN));

+

+        /* Abort the SPI DMA Rx channel */

+        if (hspi->hdmarx != NULL)

+        {

+          /* Set the SPI DMA Abort callback :

+          will lead to call HAL_SPI_ErrorCallback() at end of DMA abort procedure */

+          hspi->hdmarx->XferAbortCallback = SPI_DMAAbortOnError;

+          if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmarx))

+          {

+            SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);

+          }

+        }

+        /* Abort the SPI DMA Tx channel */

+        if (hspi->hdmatx != NULL)

+        {

+          /* Set the SPI DMA Abort callback :

+          will lead to call HAL_SPI_ErrorCallback() at end of DMA abort procedure */

+          hspi->hdmatx->XferAbortCallback = SPI_DMAAbortOnError;

+          if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmatx))

+          {

+            SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);

+          }

+        }

+      }

+      else

+      {

+        /* Call user error callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+        hspi->ErrorCallback(hspi);

+#else

+        HAL_SPI_ErrorCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+      }

+    }

+    return;

+  }

+}

+

+/**

+  * @brief  Tx Transfer completed callback.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+__weak void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hspi);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_SPI_TxCpltCallback should be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Rx Transfer completed callback.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+__weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hspi);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_SPI_RxCpltCallback should be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Tx and Rx Transfer completed callback.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+__weak void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hspi);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_SPI_TxRxCpltCallback should be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Tx Half Transfer completed callback.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+__weak void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hspi);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_SPI_TxHalfCpltCallback should be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Rx Half Transfer completed callback.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+__weak void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hspi);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_SPI_RxHalfCpltCallback() should be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Tx and Rx Half Transfer callback.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+__weak void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hspi);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_SPI_TxRxHalfCpltCallback() should be implemented in the user file

+   */

+}

+

+/**

+  * @brief  SPI error callback.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+__weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hspi);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_SPI_ErrorCallback should be implemented in the user file

+   */

+  /* NOTE : The ErrorCode parameter in the hspi handle is updated by the SPI processes

+            and user can use HAL_SPI_GetError() API to check the latest error occurred

+   */

+}

+

+/**

+  * @brief  SPI Abort Complete callback.

+  * @param  hspi SPI handle.

+  * @retval None

+  */

+__weak void HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef *hspi)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(hspi);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_SPI_AbortCpltCallback can be implemented in the user file.

+   */

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup SPI_Exported_Functions_Group3 Peripheral State and Errors functions

+  * @brief   SPI control functions

+  *

+@verbatim

+ ===============================================================================

+                      ##### Peripheral State and Errors functions #####

+ ===============================================================================

+    [..]

+    This subsection provides a set of functions allowing to control the SPI.

+     (+) HAL_SPI_GetState() API can be helpful to check in run-time the state of the SPI peripheral

+     (+) HAL_SPI_GetError() check in run-time Errors occurring during communication

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Return the SPI handle state.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval SPI state

+  */

+HAL_SPI_StateTypeDef HAL_SPI_GetState(SPI_HandleTypeDef *hspi)

+{

+  /* Return SPI handle state */

+  return hspi->State;

+}

+

+/**

+  * @brief  Return the SPI error code.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval SPI error code in bitmap format

+  */

+uint32_t HAL_SPI_GetError(SPI_HandleTypeDef *hspi)

+{

+  /* Return SPI ErrorCode */

+  return hspi->ErrorCode;

+}

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/** @addtogroup SPI_Private_Functions

+  * @brief   Private functions

+  * @{

+  */

+

+/**

+  * @brief  DMA SPI transmit process complete callback.

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *               the configuration information for the specified DMA module.

+  * @retval None

+  */

+static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma)

+{

+  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */

+  uint32_t tickstart;

+

+  /* Init tickstart for timeout management*/

+  tickstart = HAL_GetTick();

+

+  /* DMA Normal Mode */

+  if ((hdma->Instance->CCR & DMA_CCR_CIRC) != DMA_CCR_CIRC)

+  {

+    /* Disable ERR interrupt */

+    __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR);

+

+    /* Disable Tx DMA Request */

+    CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN);

+

+    /* Check the end of the transaction */

+    if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)

+    {

+      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);

+    }

+

+    /* Clear overrun flag in 2 Lines communication mode because received data is not read */

+    if (hspi->Init.Direction == SPI_DIRECTION_2LINES)

+    {

+      __HAL_SPI_CLEAR_OVRFLAG(hspi);

+    }

+

+    hspi->TxXferCount = 0U;

+    hspi->State = HAL_SPI_STATE_READY;

+

+    if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)

+    {

+      /* Call user error callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+      hspi->ErrorCallback(hspi);

+#else

+      HAL_SPI_ErrorCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+      return;

+    }

+  }

+  /* Call user Tx complete callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+  hspi->TxCpltCallback(hspi);

+#else

+  HAL_SPI_TxCpltCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  DMA SPI receive process complete callback.

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *               the configuration information for the specified DMA module.

+  * @retval None

+  */

+static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma)

+{

+  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */

+  uint32_t tickstart;

+

+  /* Init tickstart for timeout management*/

+  tickstart = HAL_GetTick();

+

+  /* DMA Normal Mode */

+  if ((hdma->Instance->CCR & DMA_CCR_CIRC) != DMA_CCR_CIRC)

+  {

+    /* Disable ERR interrupt */

+    __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR);

+

+#if (USE_SPI_CRC != 0U)

+    /* CRC handling */

+    if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+    {

+      /* Wait until RXNE flag */

+      if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)

+      {

+        /* Error on the CRC reception */

+        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);

+      }

+      /* Read CRC */

+      if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)

+      {

+        /* Read 16bit CRC */

+        READ_REG(hspi->Instance->DR);

+      }

+      else

+      {

+        /* Read 8bit CRC */

+        READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);

+

+        if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)

+        {

+          if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)

+          {

+            /* Error on the CRC reception */

+            SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);

+          }

+          /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */

+          READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);

+        }

+      }

+    }

+#endif /* USE_SPI_CRC */

+

+    /* Disable Rx/Tx DMA Request (done by default to handle the case master rx direction 2 lines) */

+    CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);

+

+    /* Check the end of the transaction */

+    if (SPI_EndRxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)

+    {

+      hspi->ErrorCode = HAL_SPI_ERROR_FLAG;

+    }

+

+    hspi->RxXferCount = 0U;

+    hspi->State = HAL_SPI_STATE_READY;

+

+#if (USE_SPI_CRC != 0U)

+    /* Check if CRC error occurred */

+    if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR))

+    {

+      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);

+      __HAL_SPI_CLEAR_CRCERRFLAG(hspi);

+    }

+#endif /* USE_SPI_CRC */

+

+    if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)

+    {

+      /* Call user error callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+      hspi->ErrorCallback(hspi);

+#else

+      HAL_SPI_ErrorCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+      return;

+    }

+  }

+  /* Call user Rx complete callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+  hspi->RxCpltCallback(hspi);

+#else

+  HAL_SPI_RxCpltCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  DMA SPI transmit receive process complete callback.

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *               the configuration information for the specified DMA module.

+  * @retval None

+  */

+static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma)

+{

+  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */

+  uint32_t tickstart;

+

+  /* Init tickstart for timeout management*/

+  tickstart = HAL_GetTick();

+

+  /* DMA Normal Mode */

+  if ((hdma->Instance->CCR & DMA_CCR_CIRC) != DMA_CCR_CIRC)

+  {

+    /* Disable ERR interrupt */

+    __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR);

+

+#if (USE_SPI_CRC != 0U)

+    /* CRC handling */

+    if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+    {

+      if ((hspi->Init.DataSize == SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_8BIT))

+      {

+        if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_QUARTER_FULL, SPI_DEFAULT_TIMEOUT,

+                                          tickstart) != HAL_OK)

+        {

+          /* Error on the CRC reception */

+          SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);

+        }

+        /* Read CRC to Flush DR and RXNE flag */

+        READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);

+      }

+      else

+      {

+        if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_HALF_FULL, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)

+        {

+          /* Error on the CRC reception */

+          SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);

+        }

+        /* Read CRC to Flush DR and RXNE flag */

+        READ_REG(hspi->Instance->DR);

+      }

+    }

+#endif /* USE_SPI_CRC */

+

+    /* Check the end of the transaction */

+    if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)

+    {

+      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);

+    }

+

+    /* Disable Rx/Tx DMA Request */

+    CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);

+

+    hspi->TxXferCount = 0U;

+    hspi->RxXferCount = 0U;

+    hspi->State = HAL_SPI_STATE_READY;

+

+#if (USE_SPI_CRC != 0U)

+    /* Check if CRC error occurred */

+    if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR))

+    {

+      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);

+      __HAL_SPI_CLEAR_CRCERRFLAG(hspi);

+    }

+#endif /* USE_SPI_CRC */

+

+    if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)

+    {

+      /* Call user error callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+      hspi->ErrorCallback(hspi);

+#else

+      HAL_SPI_ErrorCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+      return;

+    }

+  }

+  /* Call user TxRx complete callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+  hspi->TxRxCpltCallback(hspi);

+#else

+  HAL_SPI_TxRxCpltCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  DMA SPI half transmit process complete callback.

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *               the configuration information for the specified DMA module.

+  * @retval None

+  */

+static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma)

+{

+  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */

+

+  /* Call user Tx half complete callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+  hspi->TxHalfCpltCallback(hspi);

+#else

+  HAL_SPI_TxHalfCpltCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  DMA SPI half receive process complete callback

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *               the configuration information for the specified DMA module.

+  * @retval None

+  */

+static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma)

+{

+  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */

+

+  /* Call user Rx half complete callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+  hspi->RxHalfCpltCallback(hspi);

+#else

+  HAL_SPI_RxHalfCpltCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  DMA SPI half transmit receive process complete callback.

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *               the configuration information for the specified DMA module.

+  * @retval None

+  */

+static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma)

+{

+  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */

+

+  /* Call user TxRx half complete callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+  hspi->TxRxHalfCpltCallback(hspi);

+#else

+  HAL_SPI_TxRxHalfCpltCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  DMA SPI communication error callback.

+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains

+  *               the configuration information for the specified DMA module.

+  * @retval None

+  */

+static void SPI_DMAError(DMA_HandleTypeDef *hdma)

+{

+  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */

+

+  /* Stop the disable DMA transfer on SPI side */

+  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);

+

+  SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA);

+  hspi->State = HAL_SPI_STATE_READY;

+  /* Call user error callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+  hspi->ErrorCallback(hspi);

+#else

+  HAL_SPI_ErrorCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  DMA SPI communication abort callback, when initiated by HAL services on Error

+  *         (To be called at end of DMA Abort procedure following error occurrence).

+  * @param  hdma DMA handle.

+  * @retval None

+  */

+static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma)

+{

+  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */

+  hspi->RxXferCount = 0U;

+  hspi->TxXferCount = 0U;

+

+  /* Call user error callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+  hspi->ErrorCallback(hspi);

+#else

+  HAL_SPI_ErrorCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  DMA SPI Tx communication abort callback, when initiated by user

+  *         (To be called at end of DMA Tx Abort procedure following user abort request).

+  * @note   When this callback is executed, User Abort complete call back is called only if no

+  *         Abort still ongoing for Rx DMA Handle.

+  * @param  hdma DMA handle.

+  * @retval None

+  */

+static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma)

+{

+  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */

+

+  hspi->hdmatx->XferAbortCallback = NULL;

+

+  /* Disable Tx DMA Request */

+  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN);

+

+  if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)

+  {

+    hspi->ErrorCode = HAL_SPI_ERROR_ABORT;

+  }

+

+  /* Disable SPI Peripheral */

+  __HAL_SPI_DISABLE(hspi);

+

+  /* Empty the FRLVL fifo */

+  if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)

+  {

+    hspi->ErrorCode = HAL_SPI_ERROR_ABORT;

+  }

+

+  /* Check if an Abort process is still ongoing */

+  if (hspi->hdmarx != NULL)

+  {

+    if (hspi->hdmarx->XferAbortCallback != NULL)

+    {

+      return;

+    }

+  }

+

+  /* No Abort process still ongoing : All DMA Stream/Channel are aborted, call user Abort Complete callback */

+  hspi->RxXferCount = 0U;

+  hspi->TxXferCount = 0U;

+

+  /* Check no error during Abort procedure */

+  if (hspi->ErrorCode != HAL_SPI_ERROR_ABORT)

+  {

+    /* Reset errorCode */

+    hspi->ErrorCode = HAL_SPI_ERROR_NONE;

+  }

+

+  /* Clear the Error flags in the SR register */

+  __HAL_SPI_CLEAR_OVRFLAG(hspi);

+  __HAL_SPI_CLEAR_FREFLAG(hspi);

+

+  /* Restore hspi->State to Ready */

+  hspi->State  = HAL_SPI_STATE_READY;

+

+  /* Call user Abort complete callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+  hspi->AbortCpltCallback(hspi);

+#else

+  HAL_SPI_AbortCpltCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  DMA SPI Rx communication abort callback, when initiated by user

+  *         (To be called at end of DMA Rx Abort procedure following user abort request).

+  * @note   When this callback is executed, User Abort complete call back is called only if no

+  *         Abort still ongoing for Tx DMA Handle.

+  * @param  hdma DMA handle.

+  * @retval None

+  */

+static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma)

+{

+  SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogation MISRAC2012-Rule-11.5 */

+

+  /* Disable SPI Peripheral */

+  __HAL_SPI_DISABLE(hspi);

+

+  hspi->hdmarx->XferAbortCallback = NULL;

+

+  /* Disable Rx DMA Request */

+  CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN);

+

+  /* Control the BSY flag */

+  if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)

+  {

+    hspi->ErrorCode = HAL_SPI_ERROR_ABORT;

+  }

+

+  /* Empty the FRLVL fifo */

+  if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)

+  {

+    hspi->ErrorCode = HAL_SPI_ERROR_ABORT;

+  }

+

+  /* Check if an Abort process is still ongoing */

+  if (hspi->hdmatx != NULL)

+  {

+    if (hspi->hdmatx->XferAbortCallback != NULL)

+    {

+      return;

+    }

+  }

+

+  /* No Abort process still ongoing : All DMA Stream/Channel are aborted, call user Abort Complete callback */

+  hspi->RxXferCount = 0U;

+  hspi->TxXferCount = 0U;

+

+  /* Check no error during Abort procedure */

+  if (hspi->ErrorCode != HAL_SPI_ERROR_ABORT)

+  {

+    /* Reset errorCode */

+    hspi->ErrorCode = HAL_SPI_ERROR_NONE;

+  }

+

+  /* Clear the Error flags in the SR register */

+  __HAL_SPI_CLEAR_OVRFLAG(hspi);

+  __HAL_SPI_CLEAR_FREFLAG(hspi);

+

+  /* Restore hspi->State to Ready */

+  hspi->State  = HAL_SPI_STATE_READY;

+

+  /* Call user Abort complete callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+  hspi->AbortCpltCallback(hspi);

+#else

+  HAL_SPI_AbortCpltCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  Rx 8-bit handler for Transmit and Receive in Interrupt mode.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+static void SPI_2linesRxISR_8BIT(struct __SPI_HandleTypeDef *hspi)

+{

+  /* Receive data in packing mode */

+  if (hspi->RxXferCount > 1U)

+  {

+    *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR);

+    hspi->pRxBuffPtr += sizeof(uint16_t);

+    hspi->RxXferCount -= 2U;

+    if (hspi->RxXferCount == 1U)

+    {

+      /* Set RX Fifo threshold according the reception data length: 8bit */

+      SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);

+    }

+  }

+  /* Receive data in 8 Bit mode */

+  else

+  {

+    *hspi->pRxBuffPtr = *((__IO uint8_t *)&hspi->Instance->DR);

+    hspi->pRxBuffPtr++;

+    hspi->RxXferCount--;

+  }

+

+  /* Check end of the reception */

+  if (hspi->RxXferCount == 0U)

+  {

+#if (USE_SPI_CRC != 0U)

+    if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+    {

+      SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);

+      hspi->RxISR =  SPI_2linesRxISR_8BITCRC;

+      return;

+    }

+#endif /* USE_SPI_CRC */

+

+    /* Disable RXNE  and ERR interrupt */

+    __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));

+

+    if (hspi->TxXferCount == 0U)

+    {

+      SPI_CloseRxTx_ISR(hspi);

+    }

+  }

+}

+

+#if (USE_SPI_CRC != 0U)

+/**

+  * @brief  Rx 8-bit handler for Transmit and Receive in Interrupt mode.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi)

+{

+  /* Read 8bit CRC to flush Data Regsiter */

+  READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);

+

+  hspi->CRCSize--;

+

+  /* Check end of the reception */

+  if (hspi->CRCSize == 0U)

+  {

+    /* Disable RXNE and ERR interrupt */

+    __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));

+

+    if (hspi->TxXferCount == 0U)

+    {

+      SPI_CloseRxTx_ISR(hspi);

+    }

+  }

+}

+#endif /* USE_SPI_CRC */

+

+/**

+  * @brief  Tx 8-bit handler for Transmit and Receive in Interrupt mode.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+static void SPI_2linesTxISR_8BIT(struct __SPI_HandleTypeDef *hspi)

+{

+  /* Transmit data in packing Bit mode */

+  if (hspi->TxXferCount >= 2U)

+  {

+    hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);

+    hspi->pTxBuffPtr += sizeof(uint16_t);

+    hspi->TxXferCount -= 2U;

+  }

+  /* Transmit data in 8 Bit mode */

+  else

+  {

+    *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr);

+    hspi->pTxBuffPtr++;

+    hspi->TxXferCount--;

+  }

+

+  /* Check the end of the transmission */

+  if (hspi->TxXferCount == 0U)

+  {

+#if (USE_SPI_CRC != 0U)

+    if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+    {

+      /* Set CRC Next Bit to send CRC */

+      SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);

+      /* Disable TXE interrupt */

+      __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE);

+      return;

+    }

+#endif /* USE_SPI_CRC */

+

+    /* Disable TXE interrupt */

+    __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE);

+

+    if (hspi->RxXferCount == 0U)

+    {

+      SPI_CloseRxTx_ISR(hspi);

+    }

+  }

+}

+

+/**

+  * @brief  Rx 16-bit handler for Transmit and Receive in Interrupt mode.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+static void SPI_2linesRxISR_16BIT(struct __SPI_HandleTypeDef *hspi)

+{

+  /* Receive data in 16 Bit mode */

+  *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR);

+  hspi->pRxBuffPtr += sizeof(uint16_t);

+  hspi->RxXferCount--;

+

+  if (hspi->RxXferCount == 0U)

+  {

+#if (USE_SPI_CRC != 0U)

+    if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+    {

+      hspi->RxISR =  SPI_2linesRxISR_16BITCRC;

+      return;

+    }

+#endif /* USE_SPI_CRC */

+

+    /* Disable RXNE interrupt */

+    __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE);

+

+    if (hspi->TxXferCount == 0U)

+    {

+      SPI_CloseRxTx_ISR(hspi);

+    }

+  }

+}

+

+#if (USE_SPI_CRC != 0U)

+/**

+  * @brief  Manage the CRC 16-bit receive for Transmit and Receive in Interrupt mode.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi)

+{

+  /* Read 16bit CRC to flush Data Regsiter */

+  READ_REG(hspi->Instance->DR);

+

+  /* Disable RXNE interrupt */

+  __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE);

+

+  SPI_CloseRxTx_ISR(hspi);

+}

+#endif /* USE_SPI_CRC */

+

+/**

+  * @brief  Tx 16-bit handler for Transmit and Receive in Interrupt mode.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+static void SPI_2linesTxISR_16BIT(struct __SPI_HandleTypeDef *hspi)

+{

+  /* Transmit data in 16 Bit mode */

+  hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);

+  hspi->pTxBuffPtr += sizeof(uint16_t);

+  hspi->TxXferCount--;

+

+  /* Enable CRC Transmission */

+  if (hspi->TxXferCount == 0U)

+  {

+#if (USE_SPI_CRC != 0U)

+    if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+    {

+      /* Set CRC Next Bit to send CRC */

+      SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);

+      /* Disable TXE interrupt */

+      __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE);

+      return;

+    }

+#endif /* USE_SPI_CRC */

+

+    /* Disable TXE interrupt */

+    __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE);

+

+    if (hspi->RxXferCount == 0U)

+    {

+      SPI_CloseRxTx_ISR(hspi);

+    }

+  }

+}

+

+#if (USE_SPI_CRC != 0U)

+/**

+  * @brief  Manage the CRC 8-bit receive in Interrupt context.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+static void SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi)

+{

+  /* Read 8bit CRC to flush Data Register */

+  READ_REG(*(__IO uint8_t *)&hspi->Instance->DR);

+

+  hspi->CRCSize--;

+

+  if (hspi->CRCSize == 0U)

+  {

+    SPI_CloseRx_ISR(hspi);

+  }

+}

+#endif /* USE_SPI_CRC */

+

+/**

+  * @brief  Manage the receive 8-bit in Interrupt context.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+static void SPI_RxISR_8BIT(struct __SPI_HandleTypeDef *hspi)

+{

+  *hspi->pRxBuffPtr = (*(__IO uint8_t *)&hspi->Instance->DR);

+  hspi->pRxBuffPtr++;

+  hspi->RxXferCount--;

+

+#if (USE_SPI_CRC != 0U)

+  /* Enable CRC Transmission */

+  if ((hspi->RxXferCount == 1U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE))

+  {

+    SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);

+  }

+#endif /* USE_SPI_CRC */

+

+  if (hspi->RxXferCount == 0U)

+  {

+#if (USE_SPI_CRC != 0U)

+    if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+    {

+      hspi->RxISR =  SPI_RxISR_8BITCRC;

+      return;

+    }

+#endif /* USE_SPI_CRC */

+    SPI_CloseRx_ISR(hspi);

+  }

+}

+

+#if (USE_SPI_CRC != 0U)

+/**

+  * @brief  Manage the CRC 16-bit receive in Interrupt context.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi)

+{

+  /* Read 16bit CRC to flush Data Register */

+  READ_REG(hspi->Instance->DR);

+

+  /* Disable RXNE and ERR interrupt */

+  __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));

+

+  SPI_CloseRx_ISR(hspi);

+}

+#endif /* USE_SPI_CRC */

+

+/**

+  * @brief  Manage the 16-bit receive in Interrupt context.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+static void SPI_RxISR_16BIT(struct __SPI_HandleTypeDef *hspi)

+{

+  *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR);

+  hspi->pRxBuffPtr += sizeof(uint16_t);

+  hspi->RxXferCount--;

+

+#if (USE_SPI_CRC != 0U)

+  /* Enable CRC Transmission */

+  if ((hspi->RxXferCount == 1U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE))

+  {

+    SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);

+  }

+#endif /* USE_SPI_CRC */

+

+  if (hspi->RxXferCount == 0U)

+  {

+#if (USE_SPI_CRC != 0U)

+    if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+    {

+      hspi->RxISR = SPI_RxISR_16BITCRC;

+      return;

+    }

+#endif /* USE_SPI_CRC */

+    SPI_CloseRx_ISR(hspi);

+  }

+}

+

+/**

+  * @brief  Handle the data 8-bit transmit in Interrupt mode.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+static void SPI_TxISR_8BIT(struct __SPI_HandleTypeDef *hspi)

+{

+  *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr);

+  hspi->pTxBuffPtr++;

+  hspi->TxXferCount--;

+

+  if (hspi->TxXferCount == 0U)

+  {

+#if (USE_SPI_CRC != 0U)

+    if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+    {

+      /* Enable CRC Transmission */

+      SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);

+    }

+#endif /* USE_SPI_CRC */

+    SPI_CloseTx_ISR(hspi);

+  }

+}

+

+/**

+  * @brief  Handle the data 16-bit transmit in Interrupt mode.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+static void SPI_TxISR_16BIT(struct __SPI_HandleTypeDef *hspi)

+{

+  /* Transmit data in 16 Bit mode */

+  hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr);

+  hspi->pTxBuffPtr += sizeof(uint16_t);

+  hspi->TxXferCount--;

+

+  if (hspi->TxXferCount == 0U)

+  {

+#if (USE_SPI_CRC != 0U)

+    if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+    {

+      /* Enable CRC Transmission */

+      SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT);

+    }

+#endif /* USE_SPI_CRC */

+    SPI_CloseTx_ISR(hspi);

+  }

+}

+

+/**

+  * @brief  Handle SPI Communication Timeout.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *              the configuration information for SPI module.

+  * @param  Flag SPI flag to check

+  * @param  State flag state to check

+  * @param  Timeout Timeout duration

+  * @param  Tickstart tick start value

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus State,

+                                                       uint32_t Timeout, uint32_t Tickstart)

+{

+  while ((__HAL_SPI_GET_FLAG(hspi, Flag) ? SET : RESET) != State)

+  {

+    if (Timeout != HAL_MAX_DELAY)

+    {

+      if (((HAL_GetTick() - Tickstart) >= Timeout) || (Timeout == 0U))

+      {

+        /* Disable the SPI and reset the CRC: the CRC value should be cleared

+        on both master and slave sides in order to resynchronize the master

+        and slave for their respective CRC calculation */

+

+        /* Disable TXE, RXNE and ERR interrupts for the interrupt process */

+        __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR));

+

+        if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE)

+                                                     || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY)))

+        {

+          /* Disable SPI peripheral */

+          __HAL_SPI_DISABLE(hspi);

+        }

+

+        /* Reset CRC Calculation */

+        if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+        {

+          SPI_RESET_CRC(hspi);

+        }

+

+        hspi->State = HAL_SPI_STATE_READY;

+

+        /* Process Unlocked */

+        __HAL_UNLOCK(hspi);

+

+        return HAL_TIMEOUT;

+      }

+    }

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Handle SPI FIFO Communication Timeout.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *              the configuration information for SPI module.

+  * @param  Fifo Fifo to check

+  * @param  State Fifo state to check

+  * @param  Timeout Timeout duration

+  * @param  Tickstart tick start value

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef SPI_WaitFifoStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Fifo, uint32_t State,

+                                                       uint32_t Timeout, uint32_t Tickstart)

+{

+  while ((hspi->Instance->SR & Fifo) != State)

+  {

+    if ((Fifo == SPI_SR_FRLVL) && (State == SPI_FRLVL_EMPTY))

+    {

+      /* Read 8bit CRC to flush Data Register */

+      READ_REG(*((__IO uint8_t *)&hspi->Instance->DR));

+    }

+

+    if (Timeout != HAL_MAX_DELAY)

+    {

+      if (((HAL_GetTick() - Tickstart) >= Timeout) || (Timeout == 0U))

+      {

+        /* Disable the SPI and reset the CRC: the CRC value should be cleared

+           on both master and slave sides in order to resynchronize the master

+           and slave for their respective CRC calculation */

+

+        /* Disable TXE, RXNE and ERR interrupts for the interrupt process */

+        __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR));

+

+        if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE)

+                                                     || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY)))

+        {

+          /* Disable SPI peripheral */

+          __HAL_SPI_DISABLE(hspi);

+        }

+

+        /* Reset CRC Calculation */

+        if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)

+        {

+          SPI_RESET_CRC(hspi);

+        }

+

+        hspi->State = HAL_SPI_STATE_READY;

+

+        /* Process Unlocked */

+        __HAL_UNLOCK(hspi);

+

+        return HAL_TIMEOUT;

+      }

+    }

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Handle the check of the RX transaction complete.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @param  Timeout Timeout duration

+  * @param  Tickstart tick start value

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef SPI_EndRxTransaction(SPI_HandleTypeDef *hspi,  uint32_t Timeout, uint32_t Tickstart)

+{

+  if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE)

+                                               || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY)))

+  {

+    /* Disable SPI peripheral */

+    __HAL_SPI_DISABLE(hspi);

+  }

+

+  /* Control the BSY flag */

+  if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, Timeout, Tickstart) != HAL_OK)

+  {

+    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);

+    return HAL_TIMEOUT;

+  }

+

+  if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE)

+                                               || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY)))

+  {

+    /* Empty the FRLVL fifo */

+    if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, Timeout, Tickstart) != HAL_OK)

+    {

+      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);

+      return HAL_TIMEOUT;

+    }

+  }

+  return HAL_OK;

+}

+

+/**

+  * @brief  Handle the check of the RXTX or TX transaction complete.

+  * @param  hspi SPI handle

+  * @param  Timeout Timeout duration

+  * @param  Tickstart tick start value

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef SPI_EndRxTxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t Tickstart)

+{

+  /* Control if the TX fifo is empty */

+  if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FTLVL, SPI_FTLVL_EMPTY, Timeout, Tickstart) != HAL_OK)

+  {

+    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);

+    return HAL_TIMEOUT;

+  }

+

+  /* Control the BSY flag */

+  if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, Timeout, Tickstart) != HAL_OK)

+  {

+    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);

+    return HAL_TIMEOUT;

+  }

+

+  /* Control if the RX fifo is empty */

+  if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, Timeout, Tickstart) != HAL_OK)

+  {

+    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);

+    return HAL_TIMEOUT;

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Handle the end of the RXTX transaction.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi)

+{

+  uint32_t tickstart;

+

+  /* Init tickstart for timeout managment*/

+  tickstart = HAL_GetTick();

+

+  /* Disable ERR interrupt */

+  __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR);

+

+  /* Check the end of the transaction */

+  if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)

+  {

+    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);

+  }

+

+#if (USE_SPI_CRC != 0U)

+  /* Check if CRC error occurred */

+  if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET)

+  {

+    hspi->State = HAL_SPI_STATE_READY;

+    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);

+    __HAL_SPI_CLEAR_CRCERRFLAG(hspi);

+    /* Call user error callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+    hspi->ErrorCallback(hspi);

+#else

+    HAL_SPI_ErrorCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+  }

+  else

+  {

+#endif /* USE_SPI_CRC */

+    if (hspi->ErrorCode == HAL_SPI_ERROR_NONE)

+    {

+      if (hspi->State == HAL_SPI_STATE_BUSY_RX)

+      {

+        hspi->State = HAL_SPI_STATE_READY;

+        /* Call user Rx complete callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+        hspi->RxCpltCallback(hspi);

+#else

+        HAL_SPI_RxCpltCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+      }

+      else

+      {

+        hspi->State = HAL_SPI_STATE_READY;

+        /* Call user TxRx complete callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+        hspi->TxRxCpltCallback(hspi);

+#else

+        HAL_SPI_TxRxCpltCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+      }

+    }

+    else

+    {

+      hspi->State = HAL_SPI_STATE_READY;

+      /* Call user error callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+      hspi->ErrorCallback(hspi);

+#else

+      HAL_SPI_ErrorCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+    }

+#if (USE_SPI_CRC != 0U)

+  }

+#endif /* USE_SPI_CRC */

+}

+

+/**

+  * @brief  Handle the end of the RX transaction.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+static void SPI_CloseRx_ISR(SPI_HandleTypeDef *hspi)

+{

+  /* Disable RXNE and ERR interrupt */

+  __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR));

+

+  /* Check the end of the transaction */

+  if (SPI_EndRxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)

+  {

+    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);

+  }

+  hspi->State = HAL_SPI_STATE_READY;

+

+#if (USE_SPI_CRC != 0U)

+  /* Check if CRC error occurred */

+  if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET)

+  {

+    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC);

+    __HAL_SPI_CLEAR_CRCERRFLAG(hspi);

+    /* Call user error callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+    hspi->ErrorCallback(hspi);

+#else

+    HAL_SPI_ErrorCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+  }

+  else

+  {

+#endif /* USE_SPI_CRC */

+    if (hspi->ErrorCode == HAL_SPI_ERROR_NONE)

+    {

+      /* Call user Rx complete callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+      hspi->RxCpltCallback(hspi);

+#else

+      HAL_SPI_RxCpltCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+    }

+    else

+    {

+      /* Call user error callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+      hspi->ErrorCallback(hspi);

+#else

+      HAL_SPI_ErrorCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+    }

+#if (USE_SPI_CRC != 0U)

+  }

+#endif /* USE_SPI_CRC */

+}

+

+/**

+  * @brief  Handle the end of the TX transaction.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi)

+{

+  uint32_t tickstart;

+

+  /* Init tickstart for timeout management*/

+  tickstart = HAL_GetTick();

+

+  /* Disable TXE and ERR interrupt */

+  __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR));

+

+  /* Check the end of the transaction */

+  if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK)

+  {

+    SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);

+  }

+

+  /* Clear overrun flag in 2 Lines communication mode because received is not read */

+  if (hspi->Init.Direction == SPI_DIRECTION_2LINES)

+  {

+    __HAL_SPI_CLEAR_OVRFLAG(hspi);

+  }

+

+  hspi->State = HAL_SPI_STATE_READY;

+  if (hspi->ErrorCode != HAL_SPI_ERROR_NONE)

+  {

+    /* Call user error callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+    hspi->ErrorCallback(hspi);

+#else

+    HAL_SPI_ErrorCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+  }

+  else

+  {

+    /* Call user Rx complete callback */

+#if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U)

+    hspi->TxCpltCallback(hspi);

+#else

+    HAL_SPI_TxCpltCallback(hspi);

+#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */

+  }

+}

+

+/**

+  * @brief  Handle abort a Rx transaction.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+static void SPI_AbortRx_ISR(SPI_HandleTypeDef *hspi)

+{

+  __IO uint32_t count;

+

+  /* Disable SPI Peripheral */

+  __HAL_SPI_DISABLE(hspi);

+

+  count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U);

+

+  /* Disable RXNEIE interrupt */

+  CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXNEIE));

+

+  /* Check RXNEIE is disabled */

+  do

+  {

+    if (count == 0U)

+    {

+      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);

+      break;

+    }

+    count--;

+  }

+  while (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE));

+

+  /* Control the BSY flag */

+  if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)

+  {

+    hspi->ErrorCode = HAL_SPI_ERROR_ABORT;

+  }

+

+  /* Empty the FRLVL fifo */

+  if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)

+  {

+    hspi->ErrorCode = HAL_SPI_ERROR_ABORT;

+  }

+

+  hspi->State = HAL_SPI_STATE_ABORT;

+}

+

+/**

+  * @brief  Handle abort a Tx or Rx/Tx transaction.

+  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains

+  *               the configuration information for SPI module.

+  * @retval None

+  */

+static void SPI_AbortTx_ISR(SPI_HandleTypeDef *hspi)

+{

+  __IO uint32_t count;

+

+  count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U);

+

+  /* Disable TXEIE interrupt */

+  CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXEIE));

+

+  /* Check TXEIE is disabled */

+  do

+  {

+    if (count == 0U)

+    {

+      SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);

+      break;

+    }

+    count--;

+  }

+  while (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE));

+

+  if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)

+  {

+    hspi->ErrorCode = HAL_SPI_ERROR_ABORT;

+  }

+

+  /* Disable SPI Peripheral */

+  __HAL_SPI_DISABLE(hspi);

+

+  /* Empty the FRLVL fifo */

+  if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)

+  {

+    hspi->ErrorCode = HAL_SPI_ERROR_ABORT;

+  }

+

+  /* Check case of Full-Duplex Mode and disable directly RXNEIE interrupt */

+  if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE))

+  {

+    /* Disable RXNEIE interrupt */

+    CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXNEIE));

+

+    /* Check RXNEIE is disabled */

+    do

+    {

+      if (count == 0U)

+      {

+        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT);

+        break;

+      }

+      count--;

+    }

+    while (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE));

+

+    /* Control the BSY flag */

+    if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)

+    {

+      hspi->ErrorCode = HAL_SPI_ERROR_ABORT;

+    }

+

+    /* Empty the FRLVL fifo */

+    if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK)

+    {

+      hspi->ErrorCode = HAL_SPI_ERROR_ABORT;

+    }

+  }

+  hspi->State = HAL_SPI_STATE_ABORT;

+}

+

+/**

+  * @}

+  */

+

+#endif /* HAL_SPI_MODULE_ENABLED */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c
new file mode 100644
index 0000000..6aae121
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c
@@ -0,0 +1,115 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_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

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_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 */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c
new file mode 100644
index 0000000..ef36e7c
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c
@@ -0,0 +1,6904 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_tim.c

+  * @author  MCD Application Team

+  * @brief   TIM HAL module driver.

+  *          This file provides firmware functions to manage the following

+  *          functionalities of the Timer (TIM) peripheral:

+  *           + TIM Time Base Initialization

+  *           + TIM Time Base Start

+  *           + TIM Time Base Start Interruption

+  *           + TIM Time Base Start DMA

+  *           + TIM Output Compare/PWM Initialization

+  *           + TIM Output Compare/PWM Channel Configuration

+  *           + TIM Output Compare/PWM  Start

+  *           + TIM Output Compare/PWM  Start Interruption

+  *           + TIM Output Compare/PWM Start DMA

+  *           + TIM Input Capture Initialization

+  *           + TIM Input Capture Channel Configuration

+  *           + TIM Input Capture Start

+  *           + TIM Input Capture Start Interruption

+  *           + TIM Input Capture Start DMA

+  *           + TIM One Pulse Initialization

+  *           + TIM One Pulse Channel Configuration

+  *           + TIM One Pulse Start

+  *           + TIM Encoder Interface Initialization

+  *           + TIM Encoder Interface Start

+  *           + TIM Encoder Interface Start Interruption

+  *           + TIM Encoder Interface Start DMA

+  *           + Commutation Event configuration with Interruption and DMA

+  *           + TIM OCRef clear configuration

+  *           + TIM External Clock configuration

+  @verbatim

+  ==============================================================================

+                      ##### TIMER Generic features #####

+  ==============================================================================

+  [..] The Timer features include:

+       (#) 16-bit up, down, up/down auto-reload counter.

+       (#) 16-bit programmable prescaler allowing dividing (also on the fly) the

+           counter clock frequency either by any factor between 1 and 65536.

+       (#) Up to 4 independent channels for:

+           (++) Input Capture

+           (++) Output Compare

+           (++) PWM generation (Edge and Center-aligned Mode)

+           (++) One-pulse mode output

+       (#) Synchronization circuit to control the timer with external signals and to interconnect

+            several timers together.

+       (#) Supports incremental encoder for positioning purposes

+

+            ##### How to use this driver #####

+  ==============================================================================

+    [..]

+     (#) Initialize the TIM low level resources by implementing the following functions

+         depending on the selected feature:

+           (++) Time Base : HAL_TIM_Base_MspInit()

+           (++) Input Capture : HAL_TIM_IC_MspInit()

+           (++) Output Compare : HAL_TIM_OC_MspInit()

+           (++) PWM generation : HAL_TIM_PWM_MspInit()

+           (++) One-pulse mode output : HAL_TIM_OnePulse_MspInit()

+           (++) Encoder mode output : HAL_TIM_Encoder_MspInit()

+

+     (#) Initialize the TIM low level resources :

+        (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE();

+        (##) TIM pins configuration

+            (+++) Enable the clock for the TIM GPIOs using the following function:

+             __HAL_RCC_GPIOx_CLK_ENABLE();

+            (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init();

+

+     (#) The external Clock can be configured, if needed (the default clock is the

+         internal clock from the APBx), using the following function:

+         HAL_TIM_ConfigClockSource, the clock configuration should be done before

+         any start function.

+

+     (#) Configure the TIM in the desired functioning mode using one of the

+       Initialization function of this driver:

+       (++) HAL_TIM_Base_Init: to use the Timer to generate a simple time base

+       (++) HAL_TIM_OC_Init and HAL_TIM_OC_ConfigChannel: to use the Timer to generate an

+            Output Compare signal.

+       (++) HAL_TIM_PWM_Init and HAL_TIM_PWM_ConfigChannel: to use the Timer to generate a

+            PWM signal.

+       (++) HAL_TIM_IC_Init and HAL_TIM_IC_ConfigChannel: to use the Timer to measure an

+            external signal.

+       (++) HAL_TIM_OnePulse_Init and HAL_TIM_OnePulse_ConfigChannel: to use the Timer

+            in One Pulse Mode.

+       (++) HAL_TIM_Encoder_Init: to use the Timer Encoder Interface.

+

+     (#) Activate the TIM peripheral using one of the start functions depending from the feature used:

+           (++) Time Base : HAL_TIM_Base_Start(), HAL_TIM_Base_Start_DMA(), HAL_TIM_Base_Start_IT()

+           (++) Input Capture :  HAL_TIM_IC_Start(), HAL_TIM_IC_Start_DMA(), HAL_TIM_IC_Start_IT()

+           (++) Output Compare : HAL_TIM_OC_Start(), HAL_TIM_OC_Start_DMA(), HAL_TIM_OC_Start_IT()

+           (++) PWM generation : HAL_TIM_PWM_Start(), HAL_TIM_PWM_Start_DMA(), HAL_TIM_PWM_Start_IT()

+           (++) One-pulse mode output : HAL_TIM_OnePulse_Start(), HAL_TIM_OnePulse_Start_IT()

+           (++) Encoder mode output : HAL_TIM_Encoder_Start(), HAL_TIM_Encoder_Start_DMA(), HAL_TIM_Encoder_Start_IT().

+

+     (#) The DMA Burst is managed with the two following functions:

+         HAL_TIM_DMABurst_WriteStart()

+         HAL_TIM_DMABurst_ReadStart()

+

+    *** Callback registration ***

+  =============================================

+

+  [..]

+  The compilation define  USE_HAL_TIM_REGISTER_CALLBACKS when set to 1

+  allows the user to configure dynamically the driver callbacks.

+

+  [..]

+  Use Function @ref HAL_TIM_RegisterCallback() to register a callback.

+  @ref HAL_TIM_RegisterCallback() takes as parameters the HAL peripheral handle,

+  the Callback ID and a pointer to the user callback function.

+

+  [..]

+  Use function @ref HAL_TIM_UnRegisterCallback() to reset a callback to the default

+  weak function.

+  @ref HAL_TIM_UnRegisterCallback takes as parameters the HAL peripheral handle,

+  and the Callback ID.

+

+  [..]

+  These functions allow to register/unregister following callbacks:

+    (+) Base_MspInitCallback              : TIM Base Msp Init Callback.

+    (+) Base_MspDeInitCallback            : TIM Base Msp DeInit Callback.

+    (+) IC_MspInitCallback                : TIM IC Msp Init Callback.

+    (+) IC_MspDeInitCallback              : TIM IC Msp DeInit Callback.

+    (+) OC_MspInitCallback                : TIM OC Msp Init Callback.

+    (+) OC_MspDeInitCallback              : TIM OC Msp DeInit Callback.

+    (+) PWM_MspInitCallback               : TIM PWM Msp Init Callback.

+    (+) PWM_MspDeInitCallback             : TIM PWM Msp DeInit Callback.

+    (+) OnePulse_MspInitCallback          : TIM One Pulse Msp Init Callback.

+    (+) OnePulse_MspDeInitCallback        : TIM One Pulse Msp DeInit Callback.

+    (+) Encoder_MspInitCallback           : TIM Encoder Msp Init Callback.

+    (+) Encoder_MspDeInitCallback         : TIM Encoder Msp DeInit Callback.

+    (+) HallSensor_MspInitCallback        : TIM Hall Sensor Msp Init Callback.

+    (+) HallSensor_MspDeInitCallback      : TIM Hall Sensor Msp DeInit Callback.

+    (+) PeriodElapsedCallback             : TIM Period Elapsed Callback.

+    (+) PeriodElapsedHalfCpltCallback     : TIM Period Elapsed half complete Callback.

+    (+) TriggerCallback                   : TIM Trigger Callback.

+    (+) TriggerHalfCpltCallback           : TIM Trigger half complete Callback.

+    (+) IC_CaptureCallback                : TIM Input Capture Callback.

+    (+) IC_CaptureHalfCpltCallback        : TIM Input Capture half complete Callback.

+    (+) OC_DelayElapsedCallback           : TIM Output Compare Delay Elapsed Callback.

+    (+) PWM_PulseFinishedCallback         : TIM PWM Pulse Finished Callback.

+    (+) PWM_PulseFinishedHalfCpltCallback : TIM PWM Pulse Finished half complete Callback.

+    (+) ErrorCallback                     : TIM Error Callback.

+    (+) CommutationCallback               : TIM Commutation Callback.

+    (+) CommutationHalfCpltCallback       : TIM Commutation half complete Callback.

+    (+) BreakCallback                     : TIM Break Callback.

+    (+) Break2Callback                    : TIM Break2 Callback.

+

+  [..]

+By default, after the Init and when the state is HAL_TIM_STATE_RESET

+all interrupt callbacks are set to the corresponding weak functions:

+  examples @ref HAL_TIM_TriggerCallback(), @ref HAL_TIM_ErrorCallback().

+

+  [..]

+  Exception done for MspInit and MspDeInit functions that are reset to the legacy weak

+  functionalities in the Init / DeInit only when these callbacks are null

+  (not registered beforehand). If not, MspInit or MspDeInit are not null, the Init / DeInit

+    keep and use the user MspInit / MspDeInit callbacks(registered beforehand)

+

+  [..]

+    Callbacks can be registered / unregistered in HAL_TIM_STATE_READY state only.

+    Exception done MspInit / MspDeInit that can be registered / unregistered

+    in HAL_TIM_STATE_READY or HAL_TIM_STATE_RESET state,

+    thus registered(user) MspInit / DeInit callbacks can be used during the Init / DeInit.

+  In that case first register the MspInit/MspDeInit user callbacks

+      using @ref HAL_TIM_RegisterCallback() before calling DeInit or Init function.

+

+  [..]

+      When The compilation define USE_HAL_TIM_REGISTER_CALLBACKS is set to 0 or

+      not defined, the callback registration feature is not available and all callbacks

+      are set to the corresponding weak functions.

+

+  @endverbatim

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup TIM TIM

+  * @brief TIM HAL module driver

+  * @{

+  */

+

+#ifdef HAL_TIM_MODULE_ENABLED

+

+/* Private typedef -----------------------------------------------------------*/

+/* Private define ------------------------------------------------------------*/

+/* Private macro -------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/* Private function prototypes -----------------------------------------------*/

+/** @addtogroup TIM_Private_Functions

+  * @{

+  */

+static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config);

+static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config);

+static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config);

+static void TIM_OC5_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config);

+static void TIM_OC6_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config);

+static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter);

+static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection,

+                              uint32_t TIM_ICFilter);

+static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter);

+static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection,

+                              uint32_t TIM_ICFilter);

+static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection,

+                              uint32_t TIM_ICFilter);

+static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource);

+static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma);

+static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma);

+static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma);

+static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma);

+static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim,

+                                                  TIM_SlaveConfigTypeDef *sSlaveConfig);

+/**

+  * @}

+  */

+/* Exported functions --------------------------------------------------------*/

+

+/** @defgroup TIM_Exported_Functions TIM Exported Functions

+  * @{

+  */

+

+/** @defgroup TIM_Exported_Functions_Group1 TIM Time Base functions

+  *  @brief    Time Base functions

+  *

+@verbatim

+  ==============================================================================

+              ##### Time Base functions #####

+  ==============================================================================

+  [..]

+    This section provides functions allowing to:

+    (+) Initialize and configure the TIM base.

+    (+) De-initialize the TIM base.

+    (+) Start the Time Base.

+    (+) Stop the Time Base.

+    (+) Start the Time Base and enable interrupt.

+    (+) Stop the Time Base and disable interrupt.

+    (+) Start the Time Base and enable DMA transfer.

+    (+) Stop the Time Base and disable DMA transfer.

+

+@endverbatim

+  * @{

+  */

+/**

+  * @brief  Initializes the TIM Time base Unit according to the specified

+  *         parameters in the TIM_HandleTypeDef and initialize the associated handle.

+  * @note   Switching from Center Aligned counter mode to Edge counter mode (or reverse)

+  *         requires a timer reset to avoid unexpected direction

+  *         due to DIR bit readonly in center aligned mode.

+  *         Ex: call @ref HAL_TIM_Base_DeInit() before HAL_TIM_Base_Init()

+  * @param  htim TIM Base handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim)

+{

+  /* Check the TIM handle allocation */

+  if (htim == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check the parameters */

+  assert_param(IS_TIM_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode));

+  assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision));

+  assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload));

+

+  if (htim->State == HAL_TIM_STATE_RESET)

+  {

+    /* Allocate lock resource and initialize it */

+    htim->Lock = HAL_UNLOCKED;

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+    /* Reset interrupt callbacks to legacy weak callbacks */

+    TIM_ResetCallback(htim);

+

+    if (htim->Base_MspInitCallback == NULL)

+    {

+      htim->Base_MspInitCallback = HAL_TIM_Base_MspInit;

+    }

+    /* Init the low level hardware : GPIO, CLOCK, NVIC */

+    htim->Base_MspInitCallback(htim);

+#else

+    /* Init the low level hardware : GPIO, CLOCK, NVIC */

+    HAL_TIM_Base_MspInit(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+  }

+

+  /* Set the TIM state */

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  /* Set the Time Base configuration */

+  TIM_Base_SetConfig(htim->Instance, &htim->Init);

+

+  /* Initialize the TIM state*/

+  htim->State = HAL_TIM_STATE_READY;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  DeInitializes the TIM Base peripheral

+  * @param  htim TIM Base handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_INSTANCE(htim->Instance));

+

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  /* Disable the TIM Peripheral Clock */

+  __HAL_TIM_DISABLE(htim);

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+  if (htim->Base_MspDeInitCallback == NULL)

+  {

+    htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit;

+  }

+  /* DeInit the low level hardware */

+  htim->Base_MspDeInitCallback(htim);

+#else

+  /* DeInit the low level hardware: GPIO, CLOCK, NVIC */

+  HAL_TIM_Base_MspDeInit(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+

+  /* Change TIM state */

+  htim->State = HAL_TIM_STATE_RESET;

+

+  /* Release Lock */

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Initializes the TIM Base MSP.

+  * @param  htim TIM Base handle

+  * @retval None

+  */

+__weak void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_Base_MspInit could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  DeInitializes TIM Base MSP.

+  * @param  htim TIM Base handle

+  * @retval None

+  */

+__weak void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_Base_MspDeInit could be implemented in the user file

+   */

+}

+

+

+/**

+  * @brief  Starts the TIM Base generation.

+  * @param  htim TIM Base handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)

+{

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_INSTANCE(htim->Instance));

+

+  /* Set the TIM state */

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Change the TIM state*/

+  htim->State = HAL_TIM_STATE_READY;

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM Base generation.

+  * @param  htim TIM Base handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_INSTANCE(htim->Instance));

+

+  /* Set the TIM state */

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Change the TIM state*/

+  htim->State = HAL_TIM_STATE_READY;

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Starts the TIM Base generation in interrupt mode.

+  * @param  htim TIM Base handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)

+{

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_INSTANCE(htim->Instance));

+

+  /* Enable the TIM Update interrupt */

+  __HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE);

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM Base generation in interrupt mode.

+  * @param  htim TIM Base handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_INSTANCE(htim->Instance));

+  /* Disable the TIM Update interrupt */

+  __HAL_TIM_DISABLE_IT(htim, TIM_IT_UPDATE);

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Starts the TIM Base generation in DMA mode.

+  * @param  htim TIM Base handle

+  * @param  pData The source Buffer address.

+  * @param  Length The length of data to be transferred from memory to peripheral.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length)

+{

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_DMA_INSTANCE(htim->Instance));

+

+  if ((htim->State == HAL_TIM_STATE_BUSY))

+  {

+    return HAL_BUSY;

+  }

+  else if ((htim->State == HAL_TIM_STATE_READY))

+  {

+    if ((pData == NULL) && (Length > 0U))

+    {

+      return HAL_ERROR;

+    }

+    else

+    {

+      htim->State = HAL_TIM_STATE_BUSY;

+    }

+  }

+  else

+  {

+    /* nothing to do */

+  }

+

+  /* Set the DMA Period elapsed callbacks */

+  htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt;

+  htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt;

+

+  /* Set the DMA error callback */

+  htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ;

+

+  /* Enable the DMA channel */

+  if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)pData, (uint32_t)&htim->Instance->ARR, Length) != HAL_OK)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Enable the TIM Update DMA request */

+  __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_UPDATE);

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM Base generation in DMA mode.

+  * @param  htim TIM Base handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_DMA_INSTANCE(htim->Instance));

+

+  /* Disable the TIM Update DMA request */

+  __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_UPDATE);

+

+  (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]);

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Change the htim state */

+  htim->State = HAL_TIM_STATE_READY;

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Exported_Functions_Group2 TIM Output Compare functions

+  *  @brief    TIM Output Compare functions

+  *

+@verbatim

+  ==============================================================================

+                  ##### TIM Output Compare functions #####

+  ==============================================================================

+  [..]

+    This section provides functions allowing to:

+    (+) Initialize and configure the TIM Output Compare.

+    (+) De-initialize the TIM Output Compare.

+    (+) Start the TIM Output Compare.

+    (+) Stop the TIM Output Compare.

+    (+) Start the TIM Output Compare and enable interrupt.

+    (+) Stop the TIM Output Compare and disable interrupt.

+    (+) Start the TIM Output Compare and enable DMA transfer.

+    (+) Stop the TIM Output Compare and disable DMA transfer.

+

+@endverbatim

+  * @{

+  */

+/**

+  * @brief  Initializes the TIM Output Compare according to the specified

+  *         parameters in the TIM_HandleTypeDef and initializes the associated handle.

+  * @note   Switching from Center Aligned counter mode to Edge counter mode (or reverse)

+  *         requires a timer reset to avoid unexpected direction

+  *         due to DIR bit readonly in center aligned mode.

+  *         Ex: call @ref HAL_TIM_OC_DeInit() before HAL_TIM_OC_Init()

+  * @param  htim TIM Output Compare handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim)

+{

+  /* Check the TIM handle allocation */

+  if (htim == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check the parameters */

+  assert_param(IS_TIM_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode));

+  assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision));

+  assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload));

+

+  if (htim->State == HAL_TIM_STATE_RESET)

+  {

+    /* Allocate lock resource and initialize it */

+    htim->Lock = HAL_UNLOCKED;

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+    /* Reset interrupt callbacks to legacy weak callbacks */

+    TIM_ResetCallback(htim);

+

+    if (htim->OC_MspInitCallback == NULL)

+    {

+      htim->OC_MspInitCallback = HAL_TIM_OC_MspInit;

+    }

+    /* Init the low level hardware : GPIO, CLOCK, NVIC */

+    htim->OC_MspInitCallback(htim);

+#else

+    /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */

+    HAL_TIM_OC_MspInit(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+  }

+

+  /* Set the TIM state */

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  /* Init the base time for the Output Compare */

+  TIM_Base_SetConfig(htim->Instance,  &htim->Init);

+

+  /* Initialize the TIM state*/

+  htim->State = HAL_TIM_STATE_READY;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  DeInitializes the TIM peripheral

+  * @param  htim TIM Output Compare handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_INSTANCE(htim->Instance));

+

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  /* Disable the TIM Peripheral Clock */

+  __HAL_TIM_DISABLE(htim);

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+  if (htim->OC_MspDeInitCallback == NULL)

+  {

+    htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit;

+  }

+  /* DeInit the low level hardware */

+  htim->OC_MspDeInitCallback(htim);

+#else

+  /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */

+  HAL_TIM_OC_MspDeInit(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+

+  /* Change TIM state */

+  htim->State = HAL_TIM_STATE_RESET;

+

+  /* Release Lock */

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Initializes the TIM Output Compare MSP.

+  * @param  htim TIM Output Compare handle

+  * @retval None

+  */

+__weak void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_OC_MspInit could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  DeInitializes TIM Output Compare MSP.

+  * @param  htim TIM Output Compare handle

+  * @retval None

+  */

+__weak void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_OC_MspDeInit could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Starts the TIM Output Compare signal generation.

+  * @param  htim TIM Output Compare handle

+  * @param  Channel TIM Channel to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  *            @arg TIM_CHANNEL_5: TIM Channel 5 selected

+  *            @arg TIM_CHANNEL_6: TIM Channel 6 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

+

+  /* Enable the Output compare channel */

+  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);

+

+  if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)

+  {

+    /* Enable the main output */

+    __HAL_TIM_MOE_ENABLE(htim);

+  }

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM Output Compare signal generation.

+  * @param  htim TIM Output Compare handle

+  * @param  Channel TIM Channel to be disabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  *            @arg TIM_CHANNEL_5: TIM Channel 5 selected

+  *            @arg TIM_CHANNEL_6: TIM Channel 6 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

+

+  /* Disable the Output compare channel */

+  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE);

+

+  if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)

+  {

+    /* Disable the Main Output */

+    __HAL_TIM_MOE_DISABLE(htim);

+  }

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Starts the TIM Output Compare signal generation in interrupt mode.

+  * @param  htim TIM Output Compare handle

+  * @param  Channel TIM Channel to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Enable the TIM Capture/Compare 1 interrupt */

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Enable the TIM Capture/Compare 2 interrupt */

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Enable the TIM Capture/Compare 3 interrupt */

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3);

+      break;

+    }

+

+    case TIM_CHANNEL_4:

+    {

+      /* Enable the TIM Capture/Compare 4 interrupt */

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4);

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  /* Enable the Output compare channel */

+  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);

+

+  if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)

+  {

+    /* Enable the main output */

+    __HAL_TIM_MOE_ENABLE(htim);

+  }

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM Output Compare signal generation in interrupt mode.

+  * @param  htim TIM Output Compare handle

+  * @param  Channel TIM Channel to be disabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Disable the TIM Capture/Compare 1 interrupt */

+      __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Disable the TIM Capture/Compare 2 interrupt */

+      __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Disable the TIM Capture/Compare 3 interrupt */

+      __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3);

+      break;

+    }

+

+    case TIM_CHANNEL_4:

+    {

+      /* Disable the TIM Capture/Compare 4 interrupt */

+      __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4);

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  /* Disable the Output compare channel */

+  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE);

+

+  if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)

+  {

+    /* Disable the Main Output */

+    __HAL_TIM_MOE_DISABLE(htim);

+  }

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Starts the TIM Output Compare signal generation in DMA mode.

+  * @param  htim TIM Output Compare handle

+  * @param  Channel TIM Channel to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  * @param  pData The source Buffer address.

+  * @param  Length The length of data to be transferred from memory to TIM peripheral

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length)

+{

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

+

+  if ((htim->State == HAL_TIM_STATE_BUSY))

+  {

+    return HAL_BUSY;

+  }

+  else if ((htim->State == HAL_TIM_STATE_READY))

+  {

+    if ((pData == NULL) && (Length > 0U))

+    {

+      return HAL_ERROR;

+    }

+    else

+    {

+      htim->State = HAL_TIM_STATE_BUSY;

+    }

+  }

+  else

+  {

+    /* nothing to do */

+  }

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Set the DMA compare callbacks */

+      htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt;

+      htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+

+      /* Enable the TIM Capture/Compare 1 DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Set the DMA compare callbacks */

+      htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt;

+      htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+

+      /* Enable the TIM Capture/Compare 2 DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Set the DMA compare callbacks */

+      htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt;

+      htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      /* Enable the TIM Capture/Compare 3 DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3);

+      break;

+    }

+

+    case TIM_CHANNEL_4:

+    {

+      /* Set the DMA compare callbacks */

+      htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt;

+      htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      /* Enable the TIM Capture/Compare 4 DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4);

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  /* Enable the Output compare channel */

+  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);

+

+  if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)

+  {

+    /* Enable the main output */

+    __HAL_TIM_MOE_ENABLE(htim);

+  }

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM Output Compare signal generation in DMA mode.

+  * @param  htim TIM Output Compare handle

+  * @param  Channel TIM Channel to be disabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Disable the TIM Capture/Compare 1 DMA request */

+      __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1);

+      (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Disable the TIM Capture/Compare 2 DMA request */

+      __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2);

+      (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Disable the TIM Capture/Compare 3 DMA request */

+      __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3);

+      (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]);

+      break;

+    }

+

+    case TIM_CHANNEL_4:

+    {

+      /* Disable the TIM Capture/Compare 4 interrupt */

+      __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4);

+      (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]);

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  /* Disable the Output compare channel */

+  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE);

+

+  if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)

+  {

+    /* Disable the Main Output */

+    __HAL_TIM_MOE_DISABLE(htim);

+  }

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Change the htim state */

+  htim->State = HAL_TIM_STATE_READY;

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Exported_Functions_Group3 TIM PWM functions

+  *  @brief    TIM PWM functions

+  *

+@verbatim

+  ==============================================================================

+                          ##### TIM PWM functions #####

+  ==============================================================================

+  [..]

+    This section provides functions allowing to:

+    (+) Initialize and configure the TIM PWM.

+    (+) De-initialize the TIM PWM.

+    (+) Start the TIM PWM.

+    (+) Stop the TIM PWM.

+    (+) Start the TIM PWM and enable interrupt.

+    (+) Stop the TIM PWM and disable interrupt.

+    (+) Start the TIM PWM and enable DMA transfer.

+    (+) Stop the TIM PWM and disable DMA transfer.

+

+@endverbatim

+  * @{

+  */

+/**

+  * @brief  Initializes the TIM PWM Time Base according to the specified

+  *         parameters in the TIM_HandleTypeDef and initializes the associated handle.

+  * @note   Switching from Center Aligned counter mode to Edge counter mode (or reverse)

+  *         requires a timer reset to avoid unexpected direction

+  *         due to DIR bit readonly in center aligned mode.

+  *         Ex: call @ref HAL_TIM_PWM_DeInit() before HAL_TIM_PWM_Init()

+  * @param  htim TIM PWM handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim)

+{

+  /* Check the TIM handle allocation */

+  if (htim == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check the parameters */

+  assert_param(IS_TIM_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode));

+  assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision));

+  assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload));

+

+  if (htim->State == HAL_TIM_STATE_RESET)

+  {

+    /* Allocate lock resource and initialize it */

+    htim->Lock = HAL_UNLOCKED;

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+    /* Reset interrupt callbacks to legacy weak callbacks */

+    TIM_ResetCallback(htim);

+

+    if (htim->PWM_MspInitCallback == NULL)

+    {

+      htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit;

+    }

+    /* Init the low level hardware : GPIO, CLOCK, NVIC */

+    htim->PWM_MspInitCallback(htim);

+#else

+    /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */

+    HAL_TIM_PWM_MspInit(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+  }

+

+  /* Set the TIM state */

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  /* Init the base time for the PWM */

+  TIM_Base_SetConfig(htim->Instance, &htim->Init);

+

+  /* Initialize the TIM state*/

+  htim->State = HAL_TIM_STATE_READY;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  DeInitializes the TIM peripheral

+  * @param  htim TIM PWM handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_INSTANCE(htim->Instance));

+

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  /* Disable the TIM Peripheral Clock */

+  __HAL_TIM_DISABLE(htim);

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+  if (htim->PWM_MspDeInitCallback == NULL)

+  {

+    htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit;

+  }

+  /* DeInit the low level hardware */

+  htim->PWM_MspDeInitCallback(htim);

+#else

+  /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */

+  HAL_TIM_PWM_MspDeInit(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+

+  /* Change TIM state */

+  htim->State = HAL_TIM_STATE_RESET;

+

+  /* Release Lock */

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Initializes the TIM PWM MSP.

+  * @param  htim TIM PWM handle

+  * @retval None

+  */

+__weak void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_PWM_MspInit could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  DeInitializes TIM PWM MSP.

+  * @param  htim TIM PWM handle

+  * @retval None

+  */

+__weak void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_PWM_MspDeInit could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Starts the PWM signal generation.

+  * @param  htim TIM handle

+  * @param  Channel TIM Channels to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  *            @arg TIM_CHANNEL_5: TIM Channel 5 selected

+  *            @arg TIM_CHANNEL_6: TIM Channel 6 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

+

+  /* Enable the Capture compare channel */

+  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);

+

+  if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)

+  {

+    /* Enable the main output */

+    __HAL_TIM_MOE_ENABLE(htim);

+  }

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the PWM signal generation.

+  * @param  htim TIM PWM handle

+  * @param  Channel TIM Channels to be disabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  *            @arg TIM_CHANNEL_5: TIM Channel 5 selected

+  *            @arg TIM_CHANNEL_6: TIM Channel 6 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

+

+  /* Disable the Capture compare channel */

+  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE);

+

+  if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)

+  {

+    /* Disable the Main Output */

+    __HAL_TIM_MOE_DISABLE(htim);

+  }

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Change the htim state */

+  htim->State = HAL_TIM_STATE_READY;

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Starts the PWM signal generation in interrupt mode.

+  * @param  htim TIM PWM handle

+  * @param  Channel TIM Channel to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  uint32_t tmpsmcr;

+  /* Check the parameters */

+  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Enable the TIM Capture/Compare 1 interrupt */

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Enable the TIM Capture/Compare 2 interrupt */

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Enable the TIM Capture/Compare 3 interrupt */

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3);

+      break;

+    }

+

+    case TIM_CHANNEL_4:

+    {

+      /* Enable the TIM Capture/Compare 4 interrupt */

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4);

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  /* Enable the Capture compare channel */

+  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);

+

+  if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)

+  {

+    /* Enable the main output */

+    __HAL_TIM_MOE_ENABLE(htim);

+  }

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the PWM signal generation in interrupt mode.

+  * @param  htim TIM PWM handle

+  * @param  Channel TIM Channels to be disabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Disable the TIM Capture/Compare 1 interrupt */

+      __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Disable the TIM Capture/Compare 2 interrupt */

+      __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Disable the TIM Capture/Compare 3 interrupt */

+      __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3);

+      break;

+    }

+

+    case TIM_CHANNEL_4:

+    {

+      /* Disable the TIM Capture/Compare 4 interrupt */

+      __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4);

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  /* Disable the Capture compare channel */

+  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE);

+

+  if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)

+  {

+    /* Disable the Main Output */

+    __HAL_TIM_MOE_DISABLE(htim);

+  }

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Starts the TIM PWM signal generation in DMA mode.

+  * @param  htim TIM PWM handle

+  * @param  Channel TIM Channels to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  * @param  pData The source Buffer address.

+  * @param  Length The length of data to be transferred from memory to TIM peripheral

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length)

+{

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

+

+  if ((htim->State == HAL_TIM_STATE_BUSY))

+  {

+    return HAL_BUSY;

+  }

+  else if ((htim->State == HAL_TIM_STATE_READY))

+  {

+    if ((pData == NULL) && (Length > 0U))

+    {

+      return HAL_ERROR;

+    }

+    else

+    {

+      htim->State = HAL_TIM_STATE_BUSY;

+    }

+  }

+  else

+  {

+    /* nothing to do */

+  }

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Set the DMA compare callbacks */

+      htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt;

+      htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+

+      /* Enable the TIM Capture/Compare 1 DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Set the DMA compare callbacks */

+      htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt;

+      htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      /* Enable the TIM Capture/Compare 2 DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Set the DMA compare callbacks */

+      htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt;

+      htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      /* Enable the TIM Output Capture/Compare 3 request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3);

+      break;

+    }

+

+    case TIM_CHANNEL_4:

+    {

+      /* Set the DMA compare callbacks */

+      htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt;

+      htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      /* Enable the TIM Capture/Compare 4 DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4);

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  /* Enable the Capture compare channel */

+  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);

+

+  if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)

+  {

+    /* Enable the main output */

+    __HAL_TIM_MOE_ENABLE(htim);

+  }

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM PWM signal generation in DMA mode.

+  * @param  htim TIM PWM handle

+  * @param  Channel TIM Channels to be disabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Disable the TIM Capture/Compare 1 DMA request */

+      __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1);

+      (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Disable the TIM Capture/Compare 2 DMA request */

+      __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2);

+      (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Disable the TIM Capture/Compare 3 DMA request */

+      __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3);

+      (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]);

+      break;

+    }

+

+    case TIM_CHANNEL_4:

+    {

+      /* Disable the TIM Capture/Compare 4 interrupt */

+      __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4);

+      (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]);

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  /* Disable the Capture compare channel */

+  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE);

+

+  if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)

+  {

+    /* Disable the Main Output */

+    __HAL_TIM_MOE_DISABLE(htim);

+  }

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Change the htim state */

+  htim->State = HAL_TIM_STATE_READY;

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Exported_Functions_Group4 TIM Input Capture functions

+  *  @brief    TIM Input Capture functions

+  *

+@verbatim

+  ==============================================================================

+              ##### TIM Input Capture functions #####

+  ==============================================================================

+ [..]

+   This section provides functions allowing to:

+   (+) Initialize and configure the TIM Input Capture.

+   (+) De-initialize the TIM Input Capture.

+   (+) Start the TIM Input Capture.

+   (+) Stop the TIM Input Capture.

+   (+) Start the TIM Input Capture and enable interrupt.

+   (+) Stop the TIM Input Capture and disable interrupt.

+   (+) Start the TIM Input Capture and enable DMA transfer.

+   (+) Stop the TIM Input Capture and disable DMA transfer.

+

+@endverbatim

+  * @{

+  */

+/**

+  * @brief  Initializes the TIM Input Capture Time base according to the specified

+  *         parameters in the TIM_HandleTypeDef and initializes the associated handle.

+  * @note   Switching from Center Aligned counter mode to Edge counter mode (or reverse)

+  *         requires a timer reset to avoid unexpected direction

+  *         due to DIR bit readonly in center aligned mode.

+  *         Ex: call @ref HAL_TIM_IC_DeInit() before HAL_TIM_IC_Init()

+  * @param  htim TIM Input Capture handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim)

+{

+  /* Check the TIM handle allocation */

+  if (htim == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check the parameters */

+  assert_param(IS_TIM_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode));

+  assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision));

+  assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload));

+

+  if (htim->State == HAL_TIM_STATE_RESET)

+  {

+    /* Allocate lock resource and initialize it */

+    htim->Lock = HAL_UNLOCKED;

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+    /* Reset interrupt callbacks to legacy weak callbacks */

+    TIM_ResetCallback(htim);

+

+    if (htim->IC_MspInitCallback == NULL)

+    {

+      htim->IC_MspInitCallback = HAL_TIM_IC_MspInit;

+    }

+    /* Init the low level hardware : GPIO, CLOCK, NVIC */

+    htim->IC_MspInitCallback(htim);

+#else

+    /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */

+    HAL_TIM_IC_MspInit(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+  }

+

+  /* Set the TIM state */

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  /* Init the base time for the input capture */

+  TIM_Base_SetConfig(htim->Instance, &htim->Init);

+

+  /* Initialize the TIM state*/

+  htim->State = HAL_TIM_STATE_READY;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  DeInitializes the TIM peripheral

+  * @param  htim TIM Input Capture handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_INSTANCE(htim->Instance));

+

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  /* Disable the TIM Peripheral Clock */

+  __HAL_TIM_DISABLE(htim);

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+  if (htim->IC_MspDeInitCallback == NULL)

+  {

+    htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit;

+  }

+  /* DeInit the low level hardware */

+  htim->IC_MspDeInitCallback(htim);

+#else

+  /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */

+  HAL_TIM_IC_MspDeInit(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+

+  /* Change TIM state */

+  htim->State = HAL_TIM_STATE_RESET;

+

+  /* Release Lock */

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Initializes the TIM Input Capture MSP.

+  * @param  htim TIM Input Capture handle

+  * @retval None

+  */

+__weak void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_IC_MspInit could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  DeInitializes TIM Input Capture MSP.

+  * @param  htim TIM handle

+  * @retval None

+  */

+__weak void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_IC_MspDeInit could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Starts the TIM Input Capture measurement.

+  * @param  htim TIM Input Capture handle

+  * @param  Channel TIM Channels to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

+

+  /* Enable the Input Capture channel */

+  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM Input Capture measurement.

+  * @param  htim TIM Input Capture handle

+  * @param  Channel TIM Channels to be disabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

+

+  /* Disable the Input Capture channel */

+  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE);

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Starts the TIM Input Capture measurement in interrupt mode.

+  * @param  htim TIM Input Capture handle

+  * @param  Channel TIM Channels to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Enable the TIM Capture/Compare 1 interrupt */

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Enable the TIM Capture/Compare 2 interrupt */

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Enable the TIM Capture/Compare 3 interrupt */

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3);

+      break;

+    }

+

+    case TIM_CHANNEL_4:

+    {

+      /* Enable the TIM Capture/Compare 4 interrupt */

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4);

+      break;

+    }

+

+    default:

+      break;

+  }

+  /* Enable the Input Capture channel */

+  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM Input Capture measurement in interrupt mode.

+  * @param  htim TIM Input Capture handle

+  * @param  Channel TIM Channels to be disabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Disable the TIM Capture/Compare 1 interrupt */

+      __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Disable the TIM Capture/Compare 2 interrupt */

+      __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Disable the TIM Capture/Compare 3 interrupt */

+      __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3);

+      break;

+    }

+

+    case TIM_CHANNEL_4:

+    {

+      /* Disable the TIM Capture/Compare 4 interrupt */

+      __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4);

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  /* Disable the Input Capture channel */

+  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE);

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Starts the TIM Input Capture measurement in DMA mode.

+  * @param  htim TIM Input Capture handle

+  * @param  Channel TIM Channels to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  * @param  pData The destination Buffer address.

+  * @param  Length The length of data to be transferred from TIM peripheral to memory.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length)

+{

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

+  assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance));

+

+  if ((htim->State == HAL_TIM_STATE_BUSY))

+  {

+    return HAL_BUSY;

+  }

+  else if ((htim->State == HAL_TIM_STATE_READY))

+  {

+    if ((pData == NULL) && (Length > 0U))

+    {

+      return HAL_ERROR;

+    }

+    else

+    {

+      htim->State = HAL_TIM_STATE_BUSY;

+    }

+  }

+  else

+  {

+    /* nothing to do */

+  }

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Set the DMA capture callbacks */

+      htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt;

+      htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      /* Enable the TIM Capture/Compare 1 DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Set the DMA capture callbacks */

+      htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt;

+      htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      /* Enable the TIM Capture/Compare 2  DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Set the DMA capture callbacks */

+      htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt;

+      htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->CCR3, (uint32_t)pData, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      /* Enable the TIM Capture/Compare 3  DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3);

+      break;

+    }

+

+    case TIM_CHANNEL_4:

+    {

+      /* Set the DMA capture callbacks */

+      htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt;

+      htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->CCR4, (uint32_t)pData, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      /* Enable the TIM Capture/Compare 4  DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4);

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  /* Enable the Input Capture channel */

+  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM Input Capture measurement in DMA mode.

+  * @param  htim TIM Input Capture handle

+  * @param  Channel TIM Channels to be disabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

+  assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance));

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Disable the TIM Capture/Compare 1 DMA request */

+      __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1);

+      (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Disable the TIM Capture/Compare 2 DMA request */

+      __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2);

+      (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Disable the TIM Capture/Compare 3  DMA request */

+      __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3);

+      (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]);

+      break;

+    }

+

+    case TIM_CHANNEL_4:

+    {

+      /* Disable the TIM Capture/Compare 4  DMA request */

+      __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4);

+      (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]);

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  /* Disable the Input Capture channel */

+  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE);

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Change the htim state */

+  htim->State = HAL_TIM_STATE_READY;

+

+  /* Return function status */

+  return HAL_OK;

+}

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Exported_Functions_Group5 TIM One Pulse functions

+  *  @brief    TIM One Pulse functions

+  *

+@verbatim

+  ==============================================================================

+                        ##### TIM One Pulse functions #####

+  ==============================================================================

+  [..]

+    This section provides functions allowing to:

+    (+) Initialize and configure the TIM One Pulse.

+    (+) De-initialize the TIM One Pulse.

+    (+) Start the TIM One Pulse.

+    (+) Stop the TIM One Pulse.

+    (+) Start the TIM One Pulse and enable interrupt.

+    (+) Stop the TIM One Pulse and disable interrupt.

+    (+) Start the TIM One Pulse and enable DMA transfer.

+    (+) Stop the TIM One Pulse and disable DMA transfer.

+

+@endverbatim

+  * @{

+  */

+/**

+  * @brief  Initializes the TIM One Pulse Time Base according to the specified

+  *         parameters in the TIM_HandleTypeDef and initializes the associated handle.

+  * @note   Switching from Center Aligned counter mode to Edge counter mode (or reverse)

+  *         requires a timer reset to avoid unexpected direction

+  *         due to DIR bit readonly in center aligned mode.

+  *         Ex: call @ref HAL_TIM_OnePulse_DeInit() before HAL_TIM_OnePulse_Init()

+  * @param  htim TIM One Pulse handle

+  * @param  OnePulseMode Select the One pulse mode.

+  *         This parameter can be one of the following values:

+  *            @arg TIM_OPMODE_SINGLE: Only one pulse will be generated.

+  *            @arg TIM_OPMODE_REPETITIVE: Repetitive pulses will be generated.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode)

+{

+  /* Check the TIM handle allocation */

+  if (htim == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check the parameters */

+  assert_param(IS_TIM_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode));

+  assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision));

+  assert_param(IS_TIM_OPM_MODE(OnePulseMode));

+  assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload));

+

+  if (htim->State == HAL_TIM_STATE_RESET)

+  {

+    /* Allocate lock resource and initialize it */

+    htim->Lock = HAL_UNLOCKED;

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+    /* Reset interrupt callbacks to legacy weak callbacks */

+    TIM_ResetCallback(htim);

+

+    if (htim->OnePulse_MspInitCallback == NULL)

+    {

+      htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit;

+    }

+    /* Init the low level hardware : GPIO, CLOCK, NVIC */

+    htim->OnePulse_MspInitCallback(htim);

+#else

+    /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */

+    HAL_TIM_OnePulse_MspInit(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+  }

+

+  /* Set the TIM state */

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  /* Configure the Time base in the One Pulse Mode */

+  TIM_Base_SetConfig(htim->Instance, &htim->Init);

+

+  /* Reset the OPM Bit */

+  htim->Instance->CR1 &= ~TIM_CR1_OPM;

+

+  /* Configure the OPM Mode */

+  htim->Instance->CR1 |= OnePulseMode;

+

+  /* Initialize the TIM state*/

+  htim->State = HAL_TIM_STATE_READY;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  DeInitializes the TIM One Pulse

+  * @param  htim TIM One Pulse handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_INSTANCE(htim->Instance));

+

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  /* Disable the TIM Peripheral Clock */

+  __HAL_TIM_DISABLE(htim);

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+  if (htim->OnePulse_MspDeInitCallback == NULL)

+  {

+    htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit;

+  }

+  /* DeInit the low level hardware */

+  htim->OnePulse_MspDeInitCallback(htim);

+#else

+  /* DeInit the low level hardware: GPIO, CLOCK, NVIC */

+  HAL_TIM_OnePulse_MspDeInit(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+

+  /* Change TIM state */

+  htim->State = HAL_TIM_STATE_RESET;

+

+  /* Release Lock */

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Initializes the TIM One Pulse MSP.

+  * @param  htim TIM One Pulse handle

+  * @retval None

+  */

+__weak void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_OnePulse_MspInit could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  DeInitializes TIM One Pulse MSP.

+  * @param  htim TIM One Pulse handle

+  * @retval None

+  */

+__weak void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_OnePulse_MspDeInit could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Starts the TIM One Pulse signal generation.

+  * @param  htim TIM One Pulse handle

+  * @param  OutputChannel TIM Channels to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(OutputChannel);

+

+  /* Enable the Capture compare and the Input Capture channels

+    (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2)

+    if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and

+    if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output

+    in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together

+

+    No need to enable the counter, it's enabled automatically by hardware

+    (the counter starts in response to a stimulus and generate a pulse */

+

+  TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);

+  TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE);

+

+  if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)

+  {

+    /* Enable the main output */

+    __HAL_TIM_MOE_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM One Pulse signal generation.

+  * @param  htim TIM One Pulse handle

+  * @param  OutputChannel TIM Channels to be disable

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(OutputChannel);

+

+  /* Disable the Capture compare and the Input Capture channels

+  (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2)

+  if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and

+  if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output

+  in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */

+

+  TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);

+  TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE);

+

+  if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)

+  {

+    /* Disable the Main Output */

+    __HAL_TIM_MOE_DISABLE(htim);

+  }

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Starts the TIM One Pulse signal generation in interrupt mode.

+  * @param  htim TIM One Pulse handle

+  * @param  OutputChannel TIM Channels to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(OutputChannel);

+

+  /* Enable the Capture compare and the Input Capture channels

+    (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2)

+    if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and

+    if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output

+    in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together

+

+    No need to enable the counter, it's enabled automatically by hardware

+    (the counter starts in response to a stimulus and generate a pulse */

+

+  /* Enable the TIM Capture/Compare 1 interrupt */

+  __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);

+

+  /* Enable the TIM Capture/Compare 2 interrupt */

+  __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);

+

+  TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);

+  TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE);

+

+  if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)

+  {

+    /* Enable the main output */

+    __HAL_TIM_MOE_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM One Pulse signal generation in interrupt mode.

+  * @param  htim TIM One Pulse handle

+  * @param  OutputChannel TIM Channels to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(OutputChannel);

+

+  /* Disable the TIM Capture/Compare 1 interrupt */

+  __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);

+

+  /* Disable the TIM Capture/Compare 2 interrupt */

+  __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);

+

+  /* Disable the Capture compare and the Input Capture channels

+  (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2)

+  if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and

+  if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output

+  in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */

+  TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);

+  TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE);

+

+  if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)

+  {

+    /* Disable the Main Output */

+    __HAL_TIM_MOE_DISABLE(htim);

+  }

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Exported_Functions_Group6 TIM Encoder functions

+  *  @brief    TIM Encoder functions

+  *

+@verbatim

+  ==============================================================================

+                          ##### TIM Encoder functions #####

+  ==============================================================================

+  [..]

+    This section provides functions allowing to:

+    (+) Initialize and configure the TIM Encoder.

+    (+) De-initialize the TIM Encoder.

+    (+) Start the TIM Encoder.

+    (+) Stop the TIM Encoder.

+    (+) Start the TIM Encoder and enable interrupt.

+    (+) Stop the TIM Encoder and disable interrupt.

+    (+) Start the TIM Encoder and enable DMA transfer.

+    (+) Stop the TIM Encoder and disable DMA transfer.

+

+@endverbatim

+  * @{

+  */

+/**

+  * @brief  Initializes the TIM Encoder Interface and initialize the associated handle.

+  * @note   Switching from Center Aligned counter mode to Edge counter mode (or reverse)

+  *         requires a timer reset to avoid unexpected direction

+  *         due to DIR bit readonly in center aligned mode.

+  *         Ex: call @ref HAL_TIM_Encoder_DeInit() before HAL_TIM_Encoder_Init()

+  * @note   Encoder mode and External clock mode 2 are not compatible and must not be selected together

+  *         Ex: A call for @ref HAL_TIM_Encoder_Init will erase the settings of @ref HAL_TIM_ConfigClockSource

+  *         using TIM_CLOCKSOURCE_ETRMODE2 and vice versa

+  * @param  htim TIM Encoder Interface handle

+  * @param  sConfig TIM Encoder Interface configuration structure

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim,  TIM_Encoder_InitTypeDef *sConfig)

+{

+  uint32_t tmpsmcr;

+  uint32_t tmpccmr1;

+  uint32_t tmpccer;

+

+  /* Check the TIM handle allocation */

+  if (htim == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check the parameters */

+  assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode));

+  assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision));

+  assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload));

+  assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode));

+  assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection));

+  assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection));

+  assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity));

+  assert_param(IS_TIM_IC_POLARITY(sConfig->IC2Polarity));

+  assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler));

+  assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler));

+  assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter));

+  assert_param(IS_TIM_IC_FILTER(sConfig->IC2Filter));

+

+  if (htim->State == HAL_TIM_STATE_RESET)

+  {

+    /* Allocate lock resource and initialize it */

+    htim->Lock = HAL_UNLOCKED;

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+    /* Reset interrupt callbacks to legacy weak callbacks */

+    TIM_ResetCallback(htim);

+

+    if (htim->Encoder_MspInitCallback == NULL)

+    {

+      htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit;

+    }

+    /* Init the low level hardware : GPIO, CLOCK, NVIC */

+    htim->Encoder_MspInitCallback(htim);

+#else

+    /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */

+    HAL_TIM_Encoder_MspInit(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+  }

+

+  /* Set the TIM state */

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  /* Reset the SMS and ECE bits */

+  htim->Instance->SMCR &= ~(TIM_SMCR_SMS | TIM_SMCR_ECE);

+

+  /* Configure the Time base in the Encoder Mode */

+  TIM_Base_SetConfig(htim->Instance, &htim->Init);

+

+  /* Get the TIMx SMCR register value */

+  tmpsmcr = htim->Instance->SMCR;

+

+  /* Get the TIMx CCMR1 register value */

+  tmpccmr1 = htim->Instance->CCMR1;

+

+  /* Get the TIMx CCER register value */

+  tmpccer = htim->Instance->CCER;

+

+  /* Set the encoder Mode */

+  tmpsmcr |= sConfig->EncoderMode;

+

+  /* Select the Capture Compare 1 and the Capture Compare 2 as input */

+  tmpccmr1 &= ~(TIM_CCMR1_CC1S | TIM_CCMR1_CC2S);

+  tmpccmr1 |= (sConfig->IC1Selection | (sConfig->IC2Selection << 8U));

+

+  /* Set the Capture Compare 1 and the Capture Compare 2 prescalers and filters */

+  tmpccmr1 &= ~(TIM_CCMR1_IC1PSC | TIM_CCMR1_IC2PSC);

+  tmpccmr1 &= ~(TIM_CCMR1_IC1F | TIM_CCMR1_IC2F);

+  tmpccmr1 |= sConfig->IC1Prescaler | (sConfig->IC2Prescaler << 8U);

+  tmpccmr1 |= (sConfig->IC1Filter << 4U) | (sConfig->IC2Filter << 12U);

+

+  /* Set the TI1 and the TI2 Polarities */

+  tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P);

+  tmpccer &= ~(TIM_CCER_CC1NP | TIM_CCER_CC2NP);

+  tmpccer |= sConfig->IC1Polarity | (sConfig->IC2Polarity << 4U);

+

+  /* Write to TIMx SMCR */

+  htim->Instance->SMCR = tmpsmcr;

+

+  /* Write to TIMx CCMR1 */

+  htim->Instance->CCMR1 = tmpccmr1;

+

+  /* Write to TIMx CCER */

+  htim->Instance->CCER = tmpccer;

+

+  /* Initialize the TIM state*/

+  htim->State = HAL_TIM_STATE_READY;

+

+  return HAL_OK;

+}

+

+

+/**

+  * @brief  DeInitializes the TIM Encoder interface

+  * @param  htim TIM Encoder Interface handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_INSTANCE(htim->Instance));

+

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  /* Disable the TIM Peripheral Clock */

+  __HAL_TIM_DISABLE(htim);

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+  if (htim->Encoder_MspDeInitCallback == NULL)

+  {

+    htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit;

+  }

+  /* DeInit the low level hardware */

+  htim->Encoder_MspDeInitCallback(htim);

+#else

+  /* DeInit the low level hardware: GPIO, CLOCK, NVIC */

+  HAL_TIM_Encoder_MspDeInit(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+

+  /* Change TIM state */

+  htim->State = HAL_TIM_STATE_RESET;

+

+  /* Release Lock */

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Initializes the TIM Encoder Interface MSP.

+  * @param  htim TIM Encoder Interface handle

+  * @retval None

+  */

+__weak void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_Encoder_MspInit could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  DeInitializes TIM Encoder Interface MSP.

+  * @param  htim TIM Encoder Interface handle

+  * @retval None

+  */

+__weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_Encoder_MspDeInit could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Starts the TIM Encoder Interface.

+  * @param  htim TIM Encoder Interface handle

+  * @param  Channel TIM Channels to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));

+

+  /* Enable the encoder interface channels */

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE);

+      break;

+    }

+

+    default :

+    {

+      TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);

+      TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE);

+      break;

+    }

+  }

+  /* Enable the Peripheral */

+  __HAL_TIM_ENABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM Encoder Interface.

+  * @param  htim TIM Encoder Interface handle

+  * @param  Channel TIM Channels to be disabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));

+

+  /* Disable the Input Capture channels 1 and 2

+    (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE);

+      break;

+    }

+

+    default :

+    {

+      TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);

+      TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE);

+      break;

+    }

+  }

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Starts the TIM Encoder Interface in interrupt mode.

+  * @param  htim TIM Encoder Interface handle

+  * @param  Channel TIM Channels to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));

+

+  /* Enable the encoder interface channels */

+  /* Enable the capture compare Interrupts 1 and/or 2 */

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE);

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);

+      break;

+    }

+

+    default :

+    {

+      TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);

+      TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE);

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);

+      break;

+    }

+  }

+

+  /* Enable the Peripheral */

+  __HAL_TIM_ENABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM Encoder Interface in interrupt mode.

+  * @param  htim TIM Encoder Interface handle

+  * @param  Channel TIM Channels to be disabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));

+

+  /* Disable the Input Capture channels 1 and 2

+    (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */

+  if (Channel == TIM_CHANNEL_1)

+  {

+    TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);

+

+    /* Disable the capture compare Interrupts 1 */

+    __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);

+  }

+  else if (Channel == TIM_CHANNEL_2)

+  {

+    TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE);

+

+    /* Disable the capture compare Interrupts 2 */

+    __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);

+  }

+  else

+  {

+    TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);

+    TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE);

+

+    /* Disable the capture compare Interrupts 1 and 2 */

+    __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);

+    __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);

+  }

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Change the htim state */

+  htim->State = HAL_TIM_STATE_READY;

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Starts the TIM Encoder Interface in DMA mode.

+  * @param  htim TIM Encoder Interface handle

+  * @param  Channel TIM Channels to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected

+  * @param  pData1 The destination Buffer address for IC1.

+  * @param  pData2 The destination Buffer address for IC2.

+  * @param  Length The length of data to be transferred from TIM peripheral to memory.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1,

+                                            uint32_t *pData2, uint16_t Length)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance));

+

+  if ((htim->State == HAL_TIM_STATE_BUSY))

+  {

+    return HAL_BUSY;

+  }

+  else if ((htim->State == HAL_TIM_STATE_READY))

+  {

+    if ((((pData1 == NULL) || (pData2 == NULL))) && (Length > 0U))

+    {

+      return HAL_ERROR;

+    }

+    else

+    {

+      htim->State = HAL_TIM_STATE_BUSY;

+    }

+  }

+  else

+  {

+    /* nothing to do */

+  }

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Set the DMA capture callbacks */

+      htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt;

+      htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      /* Enable the TIM Input Capture DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1);

+

+      /* Enable the Peripheral */

+      __HAL_TIM_ENABLE(htim);

+

+      /* Enable the Capture compare channel */

+      TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Set the DMA capture callbacks */

+      htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt;

+      htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError;

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      /* Enable the TIM Input Capture  DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2);

+

+      /* Enable the Peripheral */

+      __HAL_TIM_ENABLE(htim);

+

+      /* Enable the Capture compare channel */

+      TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE);

+      break;

+    }

+

+    case TIM_CHANNEL_ALL:

+    {

+      /* Set the DMA capture callbacks */

+      htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt;

+      htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+

+      /* Set the DMA capture callbacks */

+      htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt;

+      htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      /* Enable the Peripheral */

+      __HAL_TIM_ENABLE(htim);

+

+      /* Enable the Capture compare channel */

+      TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);

+      TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE);

+

+      /* Enable the TIM Input Capture  DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1);

+      /* Enable the TIM Input Capture  DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2);

+      break;

+    }

+

+    default:

+      break;

+  }

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM Encoder Interface in DMA mode.

+  * @param  htim TIM Encoder Interface handle

+  * @param  Channel TIM Channels to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance));

+

+  /* Disable the Input Capture channels 1 and 2

+    (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */

+  if (Channel == TIM_CHANNEL_1)

+  {

+    TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);

+

+    /* Disable the capture compare DMA Request 1 */

+    __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1);

+    (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]);

+  }

+  else if (Channel == TIM_CHANNEL_2)

+  {

+    TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE);

+

+    /* Disable the capture compare DMA Request 2 */

+    __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2);

+    (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]);

+  }

+  else

+  {

+    TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);

+    TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE);

+

+    /* Disable the capture compare DMA Request 1 and 2 */

+    __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1);

+    __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2);

+    (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]);

+    (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]);

+  }

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Change the htim state */

+  htim->State = HAL_TIM_STATE_READY;

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @}

+  */

+/** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management

+  *  @brief    TIM IRQ handler management

+  *

+@verbatim

+  ==============================================================================

+                        ##### IRQ handler management #####

+  ==============================================================================

+  [..]

+    This section provides Timer IRQ handler function.

+

+@endverbatim

+  * @{

+  */

+/**

+  * @brief  This function handles TIM interrupts requests.

+  * @param  htim TIM  handle

+  * @retval None

+  */

+void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim)

+{

+  /* Capture compare 1 event */

+  if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1) != RESET)

+  {

+    if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC1) != RESET)

+    {

+      {

+        __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1);

+        htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1;

+

+        /* Input capture event */

+        if ((htim->Instance->CCMR1 & TIM_CCMR1_CC1S) != 0x00U)

+        {

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+          htim->IC_CaptureCallback(htim);

+#else

+          HAL_TIM_IC_CaptureCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+        }

+        /* Output compare event */

+        else

+        {

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+          htim->OC_DelayElapsedCallback(htim);

+          htim->PWM_PulseFinishedCallback(htim);

+#else

+          HAL_TIM_OC_DelayElapsedCallback(htim);

+          HAL_TIM_PWM_PulseFinishedCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+        }

+        htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;

+      }

+    }

+  }

+  /* Capture compare 2 event */

+  if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC2) != RESET)

+  {

+    if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC2) != RESET)

+    {

+      __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC2);

+      htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;

+      /* Input capture event */

+      if ((htim->Instance->CCMR1 & TIM_CCMR1_CC2S) != 0x00U)

+      {

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+        htim->IC_CaptureCallback(htim);

+#else

+        HAL_TIM_IC_CaptureCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+      }

+      /* Output compare event */

+      else

+      {

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+        htim->OC_DelayElapsedCallback(htim);

+        htim->PWM_PulseFinishedCallback(htim);

+#else

+        HAL_TIM_OC_DelayElapsedCallback(htim);

+        HAL_TIM_PWM_PulseFinishedCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+      }

+      htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;

+    }

+  }

+  /* Capture compare 3 event */

+  if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC3) != RESET)

+  {

+    if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC3) != RESET)

+    {

+      __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC3);

+      htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;

+      /* Input capture event */

+      if ((htim->Instance->CCMR2 & TIM_CCMR2_CC3S) != 0x00U)

+      {

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+        htim->IC_CaptureCallback(htim);

+#else

+        HAL_TIM_IC_CaptureCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+      }

+      /* Output compare event */

+      else

+      {

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+        htim->OC_DelayElapsedCallback(htim);

+        htim->PWM_PulseFinishedCallback(htim);

+#else

+        HAL_TIM_OC_DelayElapsedCallback(htim);

+        HAL_TIM_PWM_PulseFinishedCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+      }

+      htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;

+    }

+  }

+  /* Capture compare 4 event */

+  if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC4) != RESET)

+  {

+    if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC4) != RESET)

+    {

+      __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC4);

+      htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;

+      /* Input capture event */

+      if ((htim->Instance->CCMR2 & TIM_CCMR2_CC4S) != 0x00U)

+      {

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+        htim->IC_CaptureCallback(htim);

+#else

+        HAL_TIM_IC_CaptureCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+      }

+      /* Output compare event */

+      else

+      {

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+        htim->OC_DelayElapsedCallback(htim);

+        htim->PWM_PulseFinishedCallback(htim);

+#else

+        HAL_TIM_OC_DelayElapsedCallback(htim);

+        HAL_TIM_PWM_PulseFinishedCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+      }

+      htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;

+    }

+  }

+  /* TIM Update event */

+  if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET)

+  {

+    if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) != RESET)

+    {

+      __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+      htim->PeriodElapsedCallback(htim);

+#else

+      HAL_TIM_PeriodElapsedCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+    }

+  }

+  /* TIM Break input event */

+  if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_BREAK) != RESET)

+  {

+    if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_BREAK) != RESET)

+    {

+      __HAL_TIM_CLEAR_IT(htim, TIM_IT_BREAK);

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+      htim->BreakCallback(htim);

+#else

+      HAL_TIMEx_BreakCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+    }

+  }

+  /* TIM Break2 input event */

+  if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_BREAK2) != RESET)

+  {

+    if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_BREAK) != RESET)

+    {

+      __HAL_TIM_CLEAR_FLAG(htim, TIM_FLAG_BREAK2);

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+      htim->Break2Callback(htim);

+#else

+      HAL_TIMEx_Break2Callback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+    }

+  }

+  /* TIM Trigger detection event */

+  if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_TRIGGER) != RESET)

+  {

+    if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_TRIGGER) != RESET)

+    {

+      __HAL_TIM_CLEAR_IT(htim, TIM_IT_TRIGGER);

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+      htim->TriggerCallback(htim);

+#else

+      HAL_TIM_TriggerCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+    }

+  }

+  /* TIM commutation event */

+  if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_COM) != RESET)

+  {

+    if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_COM) != RESET)

+    {

+      __HAL_TIM_CLEAR_IT(htim, TIM_FLAG_COM);

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+      htim->CommutationCallback(htim);

+#else

+      HAL_TIMEx_CommutCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+    }

+  }

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions

+  *  @brief    TIM Peripheral Control functions

+  *

+@verbatim

+  ==============================================================================

+                   ##### Peripheral Control functions #####

+  ==============================================================================

+ [..]

+   This section provides functions allowing to:

+      (+) Configure The Input Output channels for OC, PWM, IC or One Pulse mode.

+      (+) Configure External Clock source.

+      (+) Configure Complementary channels, break features and dead time.

+      (+) Configure Master and the Slave synchronization.

+      (+) Configure the DMA Burst Mode.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Initializes the TIM Output Compare Channels according to the specified

+  *         parameters in the TIM_OC_InitTypeDef.

+  * @param  htim TIM Output Compare handle

+  * @param  sConfig TIM Output Compare configuration structure

+  * @param  Channel TIM Channels to configure

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  *            @arg TIM_CHANNEL_5: TIM Channel 5 selected

+  *            @arg TIM_CHANNEL_6: TIM Channel 6 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim,

+                                           TIM_OC_InitTypeDef *sConfig,

+                                           uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CHANNELS(Channel));

+  assert_param(IS_TIM_OC_MODE(sConfig->OCMode));

+  assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity));

+

+  /* Process Locked */

+  __HAL_LOCK(htim);

+

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));

+

+      /* Configure the TIM Channel 1 in Output Compare */

+      TIM_OC1_SetConfig(htim->Instance, sConfig);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));

+

+      /* Configure the TIM Channel 2 in Output Compare */

+      TIM_OC2_SetConfig(htim->Instance, sConfig);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CC3_INSTANCE(htim->Instance));

+

+      /* Configure the TIM Channel 3 in Output Compare */

+      TIM_OC3_SetConfig(htim->Instance, sConfig);

+      break;

+    }

+

+    case TIM_CHANNEL_4:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CC4_INSTANCE(htim->Instance));

+

+      /* Configure the TIM Channel 4 in Output Compare */

+      TIM_OC4_SetConfig(htim->Instance, sConfig);

+      break;

+    }

+

+    case TIM_CHANNEL_5:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CC5_INSTANCE(htim->Instance));

+

+      /* Configure the TIM Channel 5 in Output Compare */

+      TIM_OC5_SetConfig(htim->Instance, sConfig);

+      break;

+    }

+

+    case TIM_CHANNEL_6:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CC6_INSTANCE(htim->Instance));

+

+      /* Configure the TIM Channel 6 in Output Compare */

+      TIM_OC6_SetConfig(htim->Instance, sConfig);

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  htim->State = HAL_TIM_STATE_READY;

+

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Initializes the TIM Input Capture Channels according to the specified

+  *         parameters in the TIM_IC_InitTypeDef.

+  * @param  htim TIM IC handle

+  * @param  sConfig TIM Input Capture configuration structure

+  * @param  Channel TIM Channel to configure

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_IC_POLARITY(sConfig->ICPolarity));

+  assert_param(IS_TIM_IC_SELECTION(sConfig->ICSelection));

+  assert_param(IS_TIM_IC_PRESCALER(sConfig->ICPrescaler));

+  assert_param(IS_TIM_IC_FILTER(sConfig->ICFilter));

+

+  /* Process Locked */

+  __HAL_LOCK(htim);

+

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  if (Channel == TIM_CHANNEL_1)

+  {

+    /* TI1 Configuration */

+    TIM_TI1_SetConfig(htim->Instance,

+                      sConfig->ICPolarity,

+                      sConfig->ICSelection,

+                      sConfig->ICFilter);

+

+    /* Reset the IC1PSC Bits */

+    htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC;

+

+    /* Set the IC1PSC value */

+    htim->Instance->CCMR1 |= sConfig->ICPrescaler;

+  }

+  else if (Channel == TIM_CHANNEL_2)

+  {

+    /* TI2 Configuration */

+    assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));

+

+    TIM_TI2_SetConfig(htim->Instance,

+                      sConfig->ICPolarity,

+                      sConfig->ICSelection,

+                      sConfig->ICFilter);

+

+    /* Reset the IC2PSC Bits */

+    htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC;

+

+    /* Set the IC2PSC value */

+    htim->Instance->CCMR1 |= (sConfig->ICPrescaler << 8U);

+  }

+  else if (Channel == TIM_CHANNEL_3)

+  {

+    /* TI3 Configuration */

+    assert_param(IS_TIM_CC3_INSTANCE(htim->Instance));

+

+    TIM_TI3_SetConfig(htim->Instance,

+                      sConfig->ICPolarity,

+                      sConfig->ICSelection,

+                      sConfig->ICFilter);

+

+    /* Reset the IC3PSC Bits */

+    htim->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC;

+

+    /* Set the IC3PSC value */

+    htim->Instance->CCMR2 |= sConfig->ICPrescaler;

+  }

+  else

+  {

+    /* TI4 Configuration */

+    assert_param(IS_TIM_CC4_INSTANCE(htim->Instance));

+

+    TIM_TI4_SetConfig(htim->Instance,

+                      sConfig->ICPolarity,

+                      sConfig->ICSelection,

+                      sConfig->ICFilter);

+

+    /* Reset the IC4PSC Bits */

+    htim->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC;

+

+    /* Set the IC4PSC value */

+    htim->Instance->CCMR2 |= (sConfig->ICPrescaler << 8U);

+  }

+

+  htim->State = HAL_TIM_STATE_READY;

+

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Initializes the TIM PWM  channels according to the specified

+  *         parameters in the TIM_OC_InitTypeDef.

+  * @param  htim TIM PWM handle

+  * @param  sConfig TIM PWM configuration structure

+  * @param  Channel TIM Channels to be configured

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  *            @arg TIM_CHANNEL_5: TIM Channel 5 selected

+  *            @arg TIM_CHANNEL_6: TIM Channel 6 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim,

+                                            TIM_OC_InitTypeDef *sConfig,

+                                            uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CHANNELS(Channel));

+  assert_param(IS_TIM_PWM_MODE(sConfig->OCMode));

+  assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity));

+  assert_param(IS_TIM_FAST_STATE(sConfig->OCFastMode));

+

+  /* Process Locked */

+  __HAL_LOCK(htim);

+

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));

+

+      /* Configure the Channel 1 in PWM mode */

+      TIM_OC1_SetConfig(htim->Instance, sConfig);

+

+      /* Set the Preload enable bit for channel1 */

+      htim->Instance->CCMR1 |= TIM_CCMR1_OC1PE;

+

+      /* Configure the Output Fast mode */

+      htim->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE;

+      htim->Instance->CCMR1 |= sConfig->OCFastMode;

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));

+

+      /* Configure the Channel 2 in PWM mode */

+      TIM_OC2_SetConfig(htim->Instance, sConfig);

+

+      /* Set the Preload enable bit for channel2 */

+      htim->Instance->CCMR1 |= TIM_CCMR1_OC2PE;

+

+      /* Configure the Output Fast mode */

+      htim->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE;

+      htim->Instance->CCMR1 |= sConfig->OCFastMode << 8U;

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CC3_INSTANCE(htim->Instance));

+

+      /* Configure the Channel 3 in PWM mode */

+      TIM_OC3_SetConfig(htim->Instance, sConfig);

+

+      /* Set the Preload enable bit for channel3 */

+      htim->Instance->CCMR2 |= TIM_CCMR2_OC3PE;

+

+      /* Configure the Output Fast mode */

+      htim->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE;

+      htim->Instance->CCMR2 |= sConfig->OCFastMode;

+      break;

+    }

+

+    case TIM_CHANNEL_4:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CC4_INSTANCE(htim->Instance));

+

+      /* Configure the Channel 4 in PWM mode */

+      TIM_OC4_SetConfig(htim->Instance, sConfig);

+

+      /* Set the Preload enable bit for channel4 */

+      htim->Instance->CCMR2 |= TIM_CCMR2_OC4PE;

+

+      /* Configure the Output Fast mode */

+      htim->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE;

+      htim->Instance->CCMR2 |= sConfig->OCFastMode << 8U;

+      break;

+    }

+

+    case TIM_CHANNEL_5:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CC5_INSTANCE(htim->Instance));

+

+      /* Configure the Channel 5 in PWM mode */

+      TIM_OC5_SetConfig(htim->Instance, sConfig);

+

+      /* Set the Preload enable bit for channel5*/

+      htim->Instance->CCMR3 |= TIM_CCMR3_OC5PE;

+

+      /* Configure the Output Fast mode */

+      htim->Instance->CCMR3 &= ~TIM_CCMR3_OC5FE;

+      htim->Instance->CCMR3 |= sConfig->OCFastMode;

+      break;

+    }

+

+    case TIM_CHANNEL_6:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CC6_INSTANCE(htim->Instance));

+

+      /* Configure the Channel 6 in PWM mode */

+      TIM_OC6_SetConfig(htim->Instance, sConfig);

+

+      /* Set the Preload enable bit for channel6 */

+      htim->Instance->CCMR3 |= TIM_CCMR3_OC6PE;

+

+      /* Configure the Output Fast mode */

+      htim->Instance->CCMR3 &= ~TIM_CCMR3_OC6FE;

+      htim->Instance->CCMR3 |= sConfig->OCFastMode << 8U;

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  htim->State = HAL_TIM_STATE_READY;

+

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Initializes the TIM One Pulse Channels according to the specified

+  *         parameters in the TIM_OnePulse_InitTypeDef.

+  * @param  htim TIM One Pulse handle

+  * @param  sConfig TIM One Pulse configuration structure

+  * @param  OutputChannel TIM output channel to configure

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  * @param  InputChannel TIM input Channel to configure

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim,  TIM_OnePulse_InitTypeDef *sConfig,

+                                                 uint32_t OutputChannel,  uint32_t InputChannel)

+{

+  TIM_OC_InitTypeDef temp1;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_OPM_CHANNELS(OutputChannel));

+  assert_param(IS_TIM_OPM_CHANNELS(InputChannel));

+

+  if (OutputChannel != InputChannel)

+  {

+    /* Process Locked */

+    __HAL_LOCK(htim);

+

+    htim->State = HAL_TIM_STATE_BUSY;

+

+    /* Extract the Output compare configuration from sConfig structure */

+    temp1.OCMode = sConfig->OCMode;

+    temp1.Pulse = sConfig->Pulse;

+    temp1.OCPolarity = sConfig->OCPolarity;

+    temp1.OCNPolarity = sConfig->OCNPolarity;

+    temp1.OCIdleState = sConfig->OCIdleState;

+    temp1.OCNIdleState = sConfig->OCNIdleState;

+

+    switch (OutputChannel)

+    {

+      case TIM_CHANNEL_1:

+      {

+        assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));

+

+        TIM_OC1_SetConfig(htim->Instance, &temp1);

+        break;

+      }

+      case TIM_CHANNEL_2:

+      {

+        assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));

+

+        TIM_OC2_SetConfig(htim->Instance, &temp1);

+        break;

+      }

+      default:

+        break;

+    }

+

+    switch (InputChannel)

+    {

+      case TIM_CHANNEL_1:

+      {

+        assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));

+

+        TIM_TI1_SetConfig(htim->Instance, sConfig->ICPolarity,

+                          sConfig->ICSelection, sConfig->ICFilter);

+

+        /* Reset the IC1PSC Bits */

+        htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC;

+

+        /* Select the Trigger source */

+        htim->Instance->SMCR &= ~TIM_SMCR_TS;

+        htim->Instance->SMCR |= TIM_TS_TI1FP1;

+

+        /* Select the Slave Mode */

+        htim->Instance->SMCR &= ~TIM_SMCR_SMS;

+        htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER;

+        break;

+      }

+      case TIM_CHANNEL_2:

+      {

+        assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));

+

+        TIM_TI2_SetConfig(htim->Instance, sConfig->ICPolarity,

+                          sConfig->ICSelection, sConfig->ICFilter);

+

+        /* Reset the IC2PSC Bits */

+        htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC;

+

+        /* Select the Trigger source */

+        htim->Instance->SMCR &= ~TIM_SMCR_TS;

+        htim->Instance->SMCR |= TIM_TS_TI2FP2;

+

+        /* Select the Slave Mode */

+        htim->Instance->SMCR &= ~TIM_SMCR_SMS;

+        htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER;

+        break;

+      }

+

+      default:

+        break;

+    }

+

+    htim->State = HAL_TIM_STATE_READY;

+

+    __HAL_UNLOCK(htim);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_ERROR;

+  }

+}

+

+/**

+  * @brief  Configure the DMA Burst to transfer Data from the memory to the TIM peripheral

+  * @param  htim TIM handle

+  * @param  BurstBaseAddress TIM Base address from where the DMA  will start the Data write

+  *         This parameter can be one of the following values:

+  *            @arg TIM_DMABASE_CR1

+  *            @arg TIM_DMABASE_CR2

+  *            @arg TIM_DMABASE_SMCR

+  *            @arg TIM_DMABASE_DIER

+  *            @arg TIM_DMABASE_SR

+  *            @arg TIM_DMABASE_EGR

+  *            @arg TIM_DMABASE_CCMR1

+  *            @arg TIM_DMABASE_CCMR2

+  *            @arg TIM_DMABASE_CCER

+  *            @arg TIM_DMABASE_CNT

+  *            @arg TIM_DMABASE_PSC

+  *            @arg TIM_DMABASE_ARR

+  *            @arg TIM_DMABASE_RCR

+  *            @arg TIM_DMABASE_CCR1

+  *            @arg TIM_DMABASE_CCR2

+  *            @arg TIM_DMABASE_CCR3

+  *            @arg TIM_DMABASE_CCR4

+  *            @arg TIM_DMABASE_BDTR

+  *            @arg TIM_DMABASE_OR1

+  *            @arg TIM_DMABASE_CCMR3 

+  *            @arg TIM_DMABASE_CCR5 

+  *            @arg TIM_DMABASE_CCR6 

+  *            @arg TIM_DMABASE_OR2  

+  *            @arg TIM_DMABASE_OR3  

+  * @param  BurstRequestSrc TIM DMA Request sources

+  *         This parameter can be one of the following values:

+  *            @arg TIM_DMA_UPDATE: TIM update Interrupt source

+  *            @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source

+  *            @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source

+  *            @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source

+  *            @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source

+  *            @arg TIM_DMA_COM: TIM Commutation DMA source

+  *            @arg TIM_DMA_TRIGGER: TIM Trigger DMA source

+  * @param  BurstBuffer The Buffer address.

+  * @param  BurstLength DMA Burst length. This parameter can be one value

+  *         between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS.

+  * @note   This function should be used only when BurstLength is equal to DMA data transfer length.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc,

+                                              uint32_t *BurstBuffer, uint32_t  BurstLength)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_DMA_BASE(BurstBaseAddress));

+  assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc));

+  assert_param(IS_TIM_DMA_LENGTH(BurstLength));

+

+  if ((htim->State == HAL_TIM_STATE_BUSY))

+  {

+    return HAL_BUSY;

+  }

+  else if ((htim->State == HAL_TIM_STATE_READY))

+  {

+    if ((BurstBuffer == NULL) && (BurstLength > 0U))

+    {

+      return HAL_ERROR;

+    }

+    else

+    {

+      htim->State = HAL_TIM_STATE_BUSY;

+    }

+  }

+  else

+  {

+    /* nothing to do */

+  }

+  switch (BurstRequestSrc)

+  {

+    case TIM_DMA_UPDATE:

+    {

+      /* Set the DMA Period elapsed callbacks */

+      htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt;

+      htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      break;

+    }

+    case TIM_DMA_CC1:

+    {

+      /* Set the DMA compare callbacks */

+      htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt;

+      htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer,

+                           (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      break;

+    }

+    case TIM_DMA_CC2:

+    {

+      /* Set the DMA compare callbacks */

+      htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt;

+      htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer,

+                           (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      break;

+    }

+    case TIM_DMA_CC3:

+    {

+      /* Set the DMA compare callbacks */

+      htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt;

+      htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer,

+                           (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      break;

+    }

+    case TIM_DMA_CC4:

+    {

+      /* Set the DMA compare callbacks */

+      htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt;

+      htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer,

+                           (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      break;

+    }

+    case TIM_DMA_COM:

+    {

+      /* Set the DMA commutation callbacks */

+      htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback =  TIMEx_DMACommutationCplt;

+      htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback =  TIMEx_DMACommutationHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer,

+                           (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      break;

+    }

+    case TIM_DMA_TRIGGER:

+    {

+      /* Set the DMA trigger callbacks */

+      htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt;

+      htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer,

+                           (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      break;

+    }

+    default:

+      break;

+  }

+  /* configure the DMA Burst Mode */

+  htim->Instance->DCR = (BurstBaseAddress | BurstLength);

+

+  /* Enable the TIM DMA Request */

+  __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc);

+

+  htim->State = HAL_TIM_STATE_READY;

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM DMA Burst mode

+  * @param  htim TIM handle

+  * @param  BurstRequestSrc TIM DMA Request sources to disable

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+  /* Check the parameters */

+  assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc));

+

+  /* Abort the DMA transfer (at least disable the DMA channel) */

+  switch (BurstRequestSrc)

+  {

+    case TIM_DMA_UPDATE:

+    {

+      status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]);

+      break;

+    }

+    case TIM_DMA_CC1:

+    {

+      status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]);

+      break;

+    }

+    case TIM_DMA_CC2:

+    {

+      status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]);

+      break;

+    }

+    case TIM_DMA_CC3:

+    {

+      status =  HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]);

+      break;

+    }

+    case TIM_DMA_CC4:

+    {

+      status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]);

+      break;

+    }

+    case TIM_DMA_COM:

+    {

+      status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]);

+      break;

+    }

+    case TIM_DMA_TRIGGER:

+    {

+      status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]);

+      break;

+    }

+    default:

+      break;

+  }

+

+  if (HAL_OK == status)

+  {

+    /* Disable the TIM Update DMA request */

+    __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc);

+  }

+

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  Configure the DMA Burst to transfer Data from the TIM peripheral to the memory

+  * @param  htim TIM handle

+  * @param  BurstBaseAddress TIM Base address from where the DMA  will start the Data read

+  *         This parameter can be one of the following values:

+  *            @arg TIM_DMABASE_CR1

+  *            @arg TIM_DMABASE_CR2

+  *            @arg TIM_DMABASE_SMCR

+  *            @arg TIM_DMABASE_DIER

+  *            @arg TIM_DMABASE_SR

+  *            @arg TIM_DMABASE_EGR

+  *            @arg TIM_DMABASE_CCMR1

+  *            @arg TIM_DMABASE_CCMR2

+  *            @arg TIM_DMABASE_CCER

+  *            @arg TIM_DMABASE_CNT

+  *            @arg TIM_DMABASE_PSC

+  *            @arg TIM_DMABASE_ARR

+  *            @arg TIM_DMABASE_RCR

+  *            @arg TIM_DMABASE_CCR1

+  *            @arg TIM_DMABASE_CCR2

+  *            @arg TIM_DMABASE_CCR3

+  *            @arg TIM_DMABASE_CCR4

+  *            @arg TIM_DMABASE_BDTR

+  *            @arg TIM_DMABASE_OR1

+  *            @arg TIM_DMABASE_CCMR3 

+  *            @arg TIM_DMABASE_CCR5 

+  *            @arg TIM_DMABASE_CCR6 

+  *            @arg TIM_DMABASE_OR2  

+  *            @arg TIM_DMABASE_OR3  

+  * @param  BurstRequestSrc TIM DMA Request sources

+  *         This parameter can be one of the following values:

+  *            @arg TIM_DMA_UPDATE: TIM update Interrupt source

+  *            @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source

+  *            @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source

+  *            @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source

+  *            @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source

+  *            @arg TIM_DMA_COM: TIM Commutation DMA source

+  *            @arg TIM_DMA_TRIGGER: TIM Trigger DMA source

+  * @param  BurstBuffer The Buffer address.

+  * @param  BurstLength DMA Burst length. This parameter can be one value

+  *         between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS.

+  * @note   This function should be used only when BurstLength is equal to DMA data transfer length.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress,

+                                             uint32_t BurstRequestSrc, uint32_t  *BurstBuffer, uint32_t  BurstLength)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_DMA_BASE(BurstBaseAddress));

+  assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc));

+  assert_param(IS_TIM_DMA_LENGTH(BurstLength));

+

+  if ((htim->State == HAL_TIM_STATE_BUSY))

+  {

+    return HAL_BUSY;

+  }

+  else if ((htim->State == HAL_TIM_STATE_READY))

+  {

+    if ((BurstBuffer == NULL) && (BurstLength > 0U))

+    {

+      return HAL_ERROR;

+    }

+    else

+    {

+      htim->State = HAL_TIM_STATE_BUSY;

+    }

+  }

+  else

+  {

+    /* nothing to do */

+  }

+  switch (BurstRequestSrc)

+  {

+    case TIM_DMA_UPDATE:

+    {

+      /* Set the DMA Period elapsed callbacks */

+      htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt;

+      htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      break;

+    }

+    case TIM_DMA_CC1:

+    {

+      /* Set the DMA capture callbacks */

+      htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt;

+      htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      break;

+    }

+    case TIM_DMA_CC2:

+    {

+      /* Set the DMA capture/compare callbacks */

+      htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt;

+      htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      break;

+    }

+    case TIM_DMA_CC3:

+    {

+      /* Set the DMA capture callbacks */

+      htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt;

+      htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      break;

+    }

+    case TIM_DMA_CC4:

+    {

+      /* Set the DMA capture callbacks */

+      htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt;

+      htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      break;

+    }

+    case TIM_DMA_COM:

+    {

+      /* Set the DMA commutation callbacks */

+      htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback =  TIMEx_DMACommutationCplt;

+      htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback =  TIMEx_DMACommutationHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      break;

+    }

+    case TIM_DMA_TRIGGER:

+    {

+      /* Set the DMA trigger callbacks */

+      htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt;

+      htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8U) + 1U) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      break;

+    }

+    default:

+      break;

+  }

+

+  /* configure the DMA Burst Mode */

+  htim->Instance->DCR = (BurstBaseAddress | BurstLength);

+

+  /* Enable the TIM DMA Request */

+  __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc);

+

+  htim->State = HAL_TIM_STATE_READY;

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stop the DMA burst reading

+  * @param  htim TIM handle

+  * @param  BurstRequestSrc TIM DMA Request sources to disable.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+  /* Check the parameters */

+  assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc));

+

+  /* Abort the DMA transfer (at least disable the DMA channel) */

+  switch (BurstRequestSrc)

+  {

+    case TIM_DMA_UPDATE:

+    {

+      status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]);

+      break;

+    }

+    case TIM_DMA_CC1:

+    {

+      status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]);

+      break;

+    }

+    case TIM_DMA_CC2:

+    {

+      status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]);

+      break;

+    }

+    case TIM_DMA_CC3:

+    {

+      status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]);

+      break;

+    }

+    case TIM_DMA_CC4:

+    {

+      status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]);

+      break;

+    }

+    case TIM_DMA_COM:

+    {

+      status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]);

+      break;

+    }

+    case TIM_DMA_TRIGGER:

+    {

+      status = HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]);

+      break;

+    }

+    default:

+      break;

+  }

+

+  if (HAL_OK == status)

+  {

+    /* Disable the TIM Update DMA request */

+    __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc);

+  }

+

+  /* Return function status */

+  return status;

+}

+

+/**

+  * @brief  Generate a software event

+  * @param  htim TIM handle

+  * @param  EventSource specifies the event source.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_EVENTSOURCE_UPDATE: Timer update Event source

+  *            @arg TIM_EVENTSOURCE_CC1: Timer Capture Compare 1 Event source

+  *            @arg TIM_EVENTSOURCE_CC2: Timer Capture Compare 2 Event source

+  *            @arg TIM_EVENTSOURCE_CC3: Timer Capture Compare 3 Event source

+  *            @arg TIM_EVENTSOURCE_CC4: Timer Capture Compare 4 Event source

+  *            @arg TIM_EVENTSOURCE_COM: Timer COM event source

+  *            @arg TIM_EVENTSOURCE_TRIGGER: Timer Trigger Event source

+  *            @arg TIM_EVENTSOURCE_BREAK: Timer Break event source

+  *            @arg TIM_EVENTSOURCE_BREAK2: Timer Break2 event source

+  * @note   Basic timers can only generate an update event.

+  * @note   TIM_EVENTSOURCE_COM is relevant only with advanced timer instances.

+  * @note   TIM_EVENTSOURCE_BREAK and TIM_EVENTSOURCE_BREAK2 are relevant

+  *         only for timer instances supporting break input(s).

+  * @retval HAL status

+  */

+

+HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_EVENT_SOURCE(EventSource));

+

+  /* Process Locked */

+  __HAL_LOCK(htim);

+

+  /* Change the TIM state */

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  /* Set the event sources */

+  htim->Instance->EGR = EventSource;

+

+  /* Change the TIM state */

+  htim->State = HAL_TIM_STATE_READY;

+

+  __HAL_UNLOCK(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Configures the OCRef clear feature

+  * @param  htim TIM handle

+  * @param  sClearInputConfig pointer to a TIM_ClearInputConfigTypeDef structure that

+  *         contains the OCREF clear feature and parameters for the TIM peripheral.

+  * @param  Channel specifies the TIM Channel

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1

+  *            @arg TIM_CHANNEL_2: TIM Channel 2

+  *            @arg TIM_CHANNEL_3: TIM Channel 3

+  *            @arg TIM_CHANNEL_4: TIM Channel 4

+  *            @arg TIM_CHANNEL_5: TIM Channel 5

+  *            @arg TIM_CHANNEL_6: TIM Channel 6

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim,

+                                           TIM_ClearInputConfigTypeDef *sClearInputConfig,

+                                           uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_OCXREF_CLEAR_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_CLEARINPUT_SOURCE(sClearInputConfig->ClearInputSource));

+

+  /* Process Locked */

+  __HAL_LOCK(htim);

+

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  switch (sClearInputConfig->ClearInputSource)

+  {

+    case TIM_CLEARINPUTSOURCE_NONE:

+    {

+      /* Clear the OCREF clear selection bit and the the ETR Bits */

+      CLEAR_BIT(htim->Instance->SMCR, (TIM_SMCR_OCCS | TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP));

+      break;

+    }

+    case TIM_CLEARINPUTSOURCE_OCREFCLR:

+    {

+      /* Clear the OCREF clear selection bit */

+      CLEAR_BIT(htim->Instance->SMCR, TIM_SMCR_OCCS);

+    }

+    break;

+

+    case TIM_CLEARINPUTSOURCE_ETR:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CLEARINPUT_POLARITY(sClearInputConfig->ClearInputPolarity));

+      assert_param(IS_TIM_CLEARINPUT_PRESCALER(sClearInputConfig->ClearInputPrescaler));

+      assert_param(IS_TIM_CLEARINPUT_FILTER(sClearInputConfig->ClearInputFilter));

+

+      /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */

+      if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1)

+      {

+        htim->State = HAL_TIM_STATE_READY;

+        __HAL_UNLOCK(htim);

+        return HAL_ERROR;

+      }

+

+      TIM_ETR_SetConfig(htim->Instance,

+                        sClearInputConfig->ClearInputPrescaler,

+                        sClearInputConfig->ClearInputPolarity,

+                        sClearInputConfig->ClearInputFilter);

+

+      /* Set the OCREF clear selection bit */

+      SET_BIT(htim->Instance->SMCR, TIM_SMCR_OCCS);

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE)

+      {

+        /* Enable the OCREF clear feature for Channel 1 */

+        SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE);

+      }

+      else

+      {

+        /* Disable the OCREF clear feature for Channel 1 */

+        CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE);

+      }

+      break;

+    }

+    case TIM_CHANNEL_2:

+    {

+      if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE)

+      {

+        /* Enable the OCREF clear feature for Channel 2 */

+        SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE);

+      }

+      else

+      {

+        /* Disable the OCREF clear feature for Channel 2 */

+        CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE);

+      }

+      break;

+    }

+    case TIM_CHANNEL_3:

+    {

+      if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE)

+      {

+        /* Enable the OCREF clear feature for Channel 3 */

+        SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE);

+      }

+      else

+      {

+        /* Disable the OCREF clear feature for Channel 3 */

+        CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE);

+      }

+      break;

+    }

+    case TIM_CHANNEL_4:

+    {

+      if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE)

+      {

+        /* Enable the OCREF clear feature for Channel 4 */

+        SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE);

+      }

+      else

+      {

+        /* Disable the OCREF clear feature for Channel 4 */

+        CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE);

+      }

+      break;

+    }

+    case TIM_CHANNEL_5:

+    {

+      if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE)

+      {

+        /* Enable the OCREF clear feature for Channel 5 */

+        SET_BIT(htim->Instance->CCMR3, TIM_CCMR3_OC5CE);

+      }

+      else

+      {

+        /* Disable the OCREF clear feature for Channel 5 */

+        CLEAR_BIT(htim->Instance->CCMR3, TIM_CCMR3_OC5CE);

+      }

+      break;

+    }

+    case TIM_CHANNEL_6:

+    {

+      if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE)

+      {

+        /* Enable the OCREF clear feature for Channel 6 */

+        SET_BIT(htim->Instance->CCMR3, TIM_CCMR3_OC6CE);

+      }

+      else

+      {

+        /* Disable the OCREF clear feature for Channel 6 */

+        CLEAR_BIT(htim->Instance->CCMR3, TIM_CCMR3_OC6CE);

+      }

+      break;

+    }

+    default:

+      break;

+  }

+

+  htim->State = HAL_TIM_STATE_READY;

+

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief   Configures the clock source to be used

+  * @param  htim TIM handle

+  * @param  sClockSourceConfig pointer to a TIM_ClockConfigTypeDef structure that

+  *         contains the clock source information for the TIM peripheral.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef *sClockSourceConfig)

+{

+  uint32_t tmpsmcr;

+

+  /* Process Locked */

+  __HAL_LOCK(htim);

+

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_CLOCKSOURCE(sClockSourceConfig->ClockSource));

+

+  /* Reset the SMS, TS, ECE, ETPS and ETRF bits */

+  tmpsmcr = htim->Instance->SMCR;

+  tmpsmcr &= ~(TIM_SMCR_SMS | TIM_SMCR_TS);

+  tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP);

+  htim->Instance->SMCR = tmpsmcr;

+

+  switch (sClockSourceConfig->ClockSource)

+  {

+    case TIM_CLOCKSOURCE_INTERNAL:

+    {

+      assert_param(IS_TIM_INSTANCE(htim->Instance));

+      break;

+    }

+

+    case TIM_CLOCKSOURCE_ETRMODE1:

+    {

+      /* Check whether or not the timer instance supports external trigger input mode 1 (ETRF)*/

+      assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance));

+

+      /* Check ETR input conditioning related parameters */

+      assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler));

+      assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity));

+      assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter));

+

+      /* Configure the ETR Clock source */

+      TIM_ETR_SetConfig(htim->Instance,

+                        sClockSourceConfig->ClockPrescaler,

+                        sClockSourceConfig->ClockPolarity,

+                        sClockSourceConfig->ClockFilter);

+

+      /* Select the External clock mode1 and the ETRF trigger */

+      tmpsmcr = htim->Instance->SMCR;

+      tmpsmcr |= (TIM_SLAVEMODE_EXTERNAL1 | TIM_CLOCKSOURCE_ETRMODE1);

+      /* Write to TIMx SMCR */

+      htim->Instance->SMCR = tmpsmcr;

+      break;

+    }

+

+    case TIM_CLOCKSOURCE_ETRMODE2:

+    {

+      /* Check whether or not the timer instance supports external trigger input mode 2 (ETRF)*/

+      assert_param(IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(htim->Instance));

+

+      /* Check ETR input conditioning related parameters */

+      assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler));

+      assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity));

+      assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter));

+

+      /* Configure the ETR Clock source */

+      TIM_ETR_SetConfig(htim->Instance,

+                        sClockSourceConfig->ClockPrescaler,

+                        sClockSourceConfig->ClockPolarity,

+                        sClockSourceConfig->ClockFilter);

+      /* Enable the External clock mode2 */

+      htim->Instance->SMCR |= TIM_SMCR_ECE;

+      break;

+    }

+

+    case TIM_CLOCKSOURCE_TI1:

+    {

+      /* Check whether or not the timer instance supports external clock mode 1 */

+      assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance));

+

+      /* Check TI1 input conditioning related parameters */

+      assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity));

+      assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter));

+

+      TIM_TI1_ConfigInputStage(htim->Instance,

+                               sClockSourceConfig->ClockPolarity,

+                               sClockSourceConfig->ClockFilter);

+      TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1);

+      break;

+    }

+

+    case TIM_CLOCKSOURCE_TI2:

+    {

+      /* Check whether or not the timer instance supports external clock mode 1 (ETRF)*/

+      assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance));

+

+      /* Check TI2 input conditioning related parameters */

+      assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity));

+      assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter));

+

+      TIM_TI2_ConfigInputStage(htim->Instance,

+                               sClockSourceConfig->ClockPolarity,

+                               sClockSourceConfig->ClockFilter);

+      TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI2);

+      break;

+    }

+

+    case TIM_CLOCKSOURCE_TI1ED:

+    {

+      /* Check whether or not the timer instance supports external clock mode 1 */

+      assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance));

+

+      /* Check TI1 input conditioning related parameters */

+      assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity));

+      assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter));

+

+      TIM_TI1_ConfigInputStage(htim->Instance,

+                               sClockSourceConfig->ClockPolarity,

+                               sClockSourceConfig->ClockFilter);

+      TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1ED);

+      break;

+    }

+

+    case TIM_CLOCKSOURCE_ITR0:

+    case TIM_CLOCKSOURCE_ITR1:

+    case TIM_CLOCKSOURCE_ITR2:

+    case TIM_CLOCKSOURCE_ITR3:

+    {

+      /* Check whether or not the timer instance supports internal trigger input */

+      assert_param(IS_TIM_CLOCKSOURCE_ITRX_INSTANCE(htim->Instance));

+

+      TIM_ITRx_SetConfig(htim->Instance, sClockSourceConfig->ClockSource);

+      break;

+    }

+

+    default:

+      break;

+  }

+  htim->State = HAL_TIM_STATE_READY;

+

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Selects the signal connected to the TI1 input: direct from CH1_input

+  *         or a XOR combination between CH1_input, CH2_input & CH3_input

+  * @param  htim TIM handle.

+  * @param  TI1_Selection Indicate whether or not channel 1 is connected to the

+  *         output of a XOR gate.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_TI1SELECTION_CH1: The TIMx_CH1 pin is connected to TI1 input

+  *            @arg TIM_TI1SELECTION_XORCOMBINATION: The TIMx_CH1, CH2 and CH3

+  *            pins are connected to the TI1 input (XOR combination)

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection)

+{

+  uint32_t tmpcr2;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_XOR_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_TI1SELECTION(TI1_Selection));

+

+  /* Get the TIMx CR2 register value */

+  tmpcr2 = htim->Instance->CR2;

+

+  /* Reset the TI1 selection */

+  tmpcr2 &= ~TIM_CR2_TI1S;

+

+  /* Set the TI1 selection */

+  tmpcr2 |= TI1_Selection;

+

+  /* Write to TIMxCR2 */

+  htim->Instance->CR2 = tmpcr2;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Configures the TIM in Slave mode

+  * @param  htim TIM handle.

+  * @param  sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that

+  *         contains the selected trigger (internal trigger input, filtered

+  *         timer input or external trigger input) and the Slave mode

+  *         (Disable, Reset, Gated, Trigger, External clock mode 1).

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode));

+  assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger));

+

+  __HAL_LOCK(htim);

+

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK)

+  {

+    htim->State = HAL_TIM_STATE_READY;

+    __HAL_UNLOCK(htim);

+    return HAL_ERROR;

+  }

+

+  /* Disable Trigger Interrupt */

+  __HAL_TIM_DISABLE_IT(htim, TIM_IT_TRIGGER);

+

+  /* Disable Trigger DMA request */

+  __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER);

+

+  htim->State = HAL_TIM_STATE_READY;

+

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Configures the TIM in Slave mode in interrupt mode

+  * @param  htim TIM handle.

+  * @param  sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that

+  *         contains the selected trigger (internal trigger input, filtered

+  *         timer input or external trigger input) and the Slave mode

+  *         (Disable, Reset, Gated, Trigger, External clock mode 1).

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim,

+                                                TIM_SlaveConfigTypeDef *sSlaveConfig)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode));

+  assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger));

+

+  __HAL_LOCK(htim);

+

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK)

+  {

+    htim->State = HAL_TIM_STATE_READY;

+    __HAL_UNLOCK(htim);

+    return HAL_ERROR;

+  }

+

+  /* Enable Trigger Interrupt */

+  __HAL_TIM_ENABLE_IT(htim, TIM_IT_TRIGGER);

+

+  /* Disable Trigger DMA request */

+  __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER);

+

+  htim->State = HAL_TIM_STATE_READY;

+

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Read the captured value from Capture Compare unit

+  * @param  htim TIM handle.

+  * @param  Channel TIM Channels to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected

+  * @retval Captured value

+  */

+uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  uint32_t tmpreg = 0U;

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));

+

+      /* Return the capture 1 value */

+      tmpreg =  htim->Instance->CCR1;

+

+      break;

+    }

+    case TIM_CHANNEL_2:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));

+

+      /* Return the capture 2 value */

+      tmpreg =   htim->Instance->CCR2;

+

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CC3_INSTANCE(htim->Instance));

+

+      /* Return the capture 3 value */

+      tmpreg =   htim->Instance->CCR3;

+

+      break;

+    }

+

+    case TIM_CHANNEL_4:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CC4_INSTANCE(htim->Instance));

+

+      /* Return the capture 4 value */

+      tmpreg =   htim->Instance->CCR4;

+

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  return tmpreg;

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions

+  *  @brief    TIM Callbacks functions

+  *

+@verbatim

+  ==============================================================================

+                        ##### TIM Callbacks functions #####

+  ==============================================================================

+ [..]

+   This section provides TIM callback functions:

+   (+) TIM Period elapsed callback

+   (+) TIM Output Compare callback

+   (+) TIM Input capture callback

+   (+) TIM Trigger callback

+   (+) TIM Error callback

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Period elapsed callback in non-blocking mode

+  * @param  htim TIM handle

+  * @retval None

+  */

+__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_PeriodElapsedCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Period elapsed half complete callback in non-blocking mode

+  * @param  htim TIM handle

+  * @retval None

+  */

+__weak void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_PeriodElapsedHalfCpltCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Output Compare callback in non-blocking mode

+  * @param  htim TIM OC handle

+  * @retval None

+  */

+__weak void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_OC_DelayElapsedCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Input Capture callback in non-blocking mode

+  * @param  htim TIM IC handle

+  * @retval None

+  */

+__weak void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_IC_CaptureCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Input Capture half complete callback in non-blocking mode

+  * @param  htim TIM IC handle

+  * @retval None

+  */

+__weak void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_IC_CaptureHalfCpltCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  PWM Pulse finished callback in non-blocking mode

+  * @param  htim TIM handle

+  * @retval None

+  */

+__weak void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_PWM_PulseFinishedCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  PWM Pulse finished half complete callback in non-blocking mode

+  * @param  htim TIM handle

+  * @retval None

+  */

+__weak void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_PWM_PulseFinishedHalfCpltCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Hall Trigger detection callback in non-blocking mode

+  * @param  htim TIM handle

+  * @retval None

+  */

+__weak void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_TriggerCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Hall Trigger detection half complete callback in non-blocking mode

+  * @param  htim TIM handle

+  * @retval None

+  */

+__weak void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_TriggerHalfCpltCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Timer error callback in non-blocking mode

+  * @param  htim TIM handle

+  * @retval None

+  */

+__weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIM_ErrorCallback could be implemented in the user file

+   */

+}

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+/**

+  * @brief  Register a User TIM callback to be used instead of the weak predefined callback

+  * @param htim tim handle

+  * @param CallbackID ID of the callback to be registered

+  *        This parameter can be one of the following values:

+  *          @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID

+  *          @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID

+  *          @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID

+  *          @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID

+  *          @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID

+  *          @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID

+  *          @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID

+  *          @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID

+  *          @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID

+  *          @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID

+  *          @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID

+  *          @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID

+  *          @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID

+  *          @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID

+  *          @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID

+  *          @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID

+  *          @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID

+  *          @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID

+  *          @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID

+  *          @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID

+  *          @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID

+  *          @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID

+  *          @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID

+  *          @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID

+  *          @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID

+  *          @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID

+  *          @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID

+  *          @arg @ref HAL_TIM_BREAK2_CB_ID Break2 Callback ID

+  *          @param pCallback pointer to the callback function

+  *          @retval status

+  */

+HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID,

+                                           pTIM_CallbackTypeDef pCallback)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  if (pCallback == NULL)

+  {

+    return HAL_ERROR;

+  }

+  /* Process locked */

+  __HAL_LOCK(htim);

+

+  if (htim->State == HAL_TIM_STATE_READY)

+  {

+    switch (CallbackID)

+    {

+      case HAL_TIM_BASE_MSPINIT_CB_ID :

+        htim->Base_MspInitCallback                 = pCallback;

+        break;

+

+      case HAL_TIM_BASE_MSPDEINIT_CB_ID :

+        htim->Base_MspDeInitCallback               = pCallback;

+        break;

+

+      case HAL_TIM_IC_MSPINIT_CB_ID :

+        htim->IC_MspInitCallback                   = pCallback;

+        break;

+

+      case HAL_TIM_IC_MSPDEINIT_CB_ID :

+        htim->IC_MspDeInitCallback                 = pCallback;

+        break;

+

+      case HAL_TIM_OC_MSPINIT_CB_ID :

+        htim->OC_MspInitCallback                   = pCallback;

+        break;

+

+      case HAL_TIM_OC_MSPDEINIT_CB_ID :

+        htim->OC_MspDeInitCallback                 = pCallback;

+        break;

+

+      case HAL_TIM_PWM_MSPINIT_CB_ID :

+        htim->PWM_MspInitCallback                  = pCallback;

+        break;

+

+      case HAL_TIM_PWM_MSPDEINIT_CB_ID :

+        htim->PWM_MspDeInitCallback                = pCallback;

+        break;

+

+      case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID :

+        htim->OnePulse_MspInitCallback             = pCallback;

+        break;

+

+      case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID :

+        htim->OnePulse_MspDeInitCallback           = pCallback;

+        break;

+

+      case HAL_TIM_ENCODER_MSPINIT_CB_ID :

+        htim->Encoder_MspInitCallback              = pCallback;

+        break;

+

+      case HAL_TIM_ENCODER_MSPDEINIT_CB_ID :

+        htim->Encoder_MspDeInitCallback            = pCallback;

+        break;

+

+      case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID :

+        htim->HallSensor_MspInitCallback           = pCallback;

+        break;

+

+      case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID :

+        htim->HallSensor_MspDeInitCallback         = pCallback;

+        break;

+

+      case HAL_TIM_PERIOD_ELAPSED_CB_ID :

+        htim->PeriodElapsedCallback                = pCallback;

+        break;

+

+      case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID :

+        htim->PeriodElapsedHalfCpltCallback        = pCallback;

+        break;

+

+      case HAL_TIM_TRIGGER_CB_ID :

+        htim->TriggerCallback                      = pCallback;

+        break;

+

+      case HAL_TIM_TRIGGER_HALF_CB_ID :

+        htim->TriggerHalfCpltCallback              = pCallback;

+        break;

+

+      case HAL_TIM_IC_CAPTURE_CB_ID :

+        htim->IC_CaptureCallback                   = pCallback;

+        break;

+

+      case HAL_TIM_IC_CAPTURE_HALF_CB_ID :

+        htim->IC_CaptureHalfCpltCallback           = pCallback;

+        break;

+

+      case HAL_TIM_OC_DELAY_ELAPSED_CB_ID :

+        htim->OC_DelayElapsedCallback              = pCallback;

+        break;

+

+      case HAL_TIM_PWM_PULSE_FINISHED_CB_ID :

+        htim->PWM_PulseFinishedCallback            = pCallback;

+        break;

+

+      case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID :

+        htim->PWM_PulseFinishedHalfCpltCallback    = pCallback;

+        break;

+

+      case HAL_TIM_ERROR_CB_ID :

+        htim->ErrorCallback                        = pCallback;

+        break;

+

+      case HAL_TIM_COMMUTATION_CB_ID :

+        htim->CommutationCallback                  = pCallback;

+        break;

+

+      case HAL_TIM_COMMUTATION_HALF_CB_ID :

+        htim->CommutationHalfCpltCallback          = pCallback;

+        break;

+

+      case HAL_TIM_BREAK_CB_ID :

+        htim->BreakCallback                        = pCallback;

+        break;

+

+      case HAL_TIM_BREAK2_CB_ID :

+        htim->Break2Callback                       = pCallback;

+        break;

+

+      default :

+        /* Return error status */

+        status =  HAL_ERROR;

+        break;

+    }

+  }

+  else if (htim->State == HAL_TIM_STATE_RESET)

+  {

+    switch (CallbackID)

+    {

+      case HAL_TIM_BASE_MSPINIT_CB_ID :

+        htim->Base_MspInitCallback         = pCallback;

+        break;

+

+      case HAL_TIM_BASE_MSPDEINIT_CB_ID :

+        htim->Base_MspDeInitCallback       = pCallback;

+        break;

+

+      case HAL_TIM_IC_MSPINIT_CB_ID :

+        htim->IC_MspInitCallback           = pCallback;

+        break;

+

+      case HAL_TIM_IC_MSPDEINIT_CB_ID :

+        htim->IC_MspDeInitCallback         = pCallback;

+        break;

+

+      case HAL_TIM_OC_MSPINIT_CB_ID :

+        htim->OC_MspInitCallback           = pCallback;

+        break;

+

+      case HAL_TIM_OC_MSPDEINIT_CB_ID :

+        htim->OC_MspDeInitCallback         = pCallback;

+        break;

+

+      case HAL_TIM_PWM_MSPINIT_CB_ID :

+        htim->PWM_MspInitCallback          = pCallback;

+        break;

+

+      case HAL_TIM_PWM_MSPDEINIT_CB_ID :

+        htim->PWM_MspDeInitCallback        = pCallback;

+        break;

+

+      case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID :

+        htim->OnePulse_MspInitCallback     = pCallback;

+        break;

+

+      case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID :

+        htim->OnePulse_MspDeInitCallback   = pCallback;

+        break;

+

+      case HAL_TIM_ENCODER_MSPINIT_CB_ID :

+        htim->Encoder_MspInitCallback      = pCallback;

+        break;

+

+      case HAL_TIM_ENCODER_MSPDEINIT_CB_ID :

+        htim->Encoder_MspDeInitCallback    = pCallback;

+        break;

+

+      case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID :

+        htim->HallSensor_MspInitCallback   = pCallback;

+        break;

+

+      case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID :

+        htim->HallSensor_MspDeInitCallback = pCallback;

+        break;

+

+      default :

+        /* Return error status */

+        status =  HAL_ERROR;

+        break;

+    }

+  }

+  else

+  {

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(htim);

+

+  return status;

+}

+

+/**

+  * @brief  Unregister a TIM callback

+  *         TIM callback is redirected to the weak predefined callback

+  * @param htim tim handle

+  * @param CallbackID ID of the callback to be unregistered

+  *        This parameter can be one of the following values:

+  *          @arg @ref HAL_TIM_BASE_MSPINIT_CB_ID Base MspInit Callback ID

+  *          @arg @ref HAL_TIM_BASE_MSPDEINIT_CB_ID Base MspDeInit Callback ID

+  *          @arg @ref HAL_TIM_IC_MSPINIT_CB_ID IC MspInit Callback ID

+  *          @arg @ref HAL_TIM_IC_MSPDEINIT_CB_ID IC MspDeInit Callback ID

+  *          @arg @ref HAL_TIM_OC_MSPINIT_CB_ID OC MspInit Callback ID

+  *          @arg @ref HAL_TIM_OC_MSPDEINIT_CB_ID OC MspDeInit Callback ID

+  *          @arg @ref HAL_TIM_PWM_MSPINIT_CB_ID PWM MspInit Callback ID

+  *          @arg @ref HAL_TIM_PWM_MSPDEINIT_CB_ID PWM MspDeInit Callback ID

+  *          @arg @ref HAL_TIM_ONE_PULSE_MSPINIT_CB_ID One Pulse MspInit Callback ID

+  *          @arg @ref HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID One Pulse MspDeInit Callback ID

+  *          @arg @ref HAL_TIM_ENCODER_MSPINIT_CB_ID Encoder MspInit Callback ID

+  *          @arg @ref HAL_TIM_ENCODER_MSPDEINIT_CB_ID Encoder MspDeInit Callback ID

+  *          @arg @ref HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID Hall Sensor MspInit Callback ID

+  *          @arg @ref HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID Hall Sensor MspDeInit Callback ID

+  *          @arg @ref HAL_TIM_PERIOD_ELAPSED_CB_ID Period Elapsed Callback ID

+  *          @arg @ref HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID Period Elapsed half complete Callback ID

+  *          @arg @ref HAL_TIM_TRIGGER_CB_ID Trigger Callback ID

+  *          @arg @ref HAL_TIM_TRIGGER_HALF_CB_ID Trigger half complete Callback ID

+  *          @arg @ref HAL_TIM_IC_CAPTURE_CB_ID Input Capture Callback ID

+  *          @arg @ref HAL_TIM_IC_CAPTURE_HALF_CB_ID Input Capture half complete Callback ID

+  *          @arg @ref HAL_TIM_OC_DELAY_ELAPSED_CB_ID Output Compare Delay Elapsed Callback ID

+  *          @arg @ref HAL_TIM_PWM_PULSE_FINISHED_CB_ID PWM Pulse Finished Callback ID

+  *          @arg @ref HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID PWM Pulse Finished half complete Callback ID

+  *          @arg @ref HAL_TIM_ERROR_CB_ID Error Callback ID

+  *          @arg @ref HAL_TIM_COMMUTATION_CB_ID Commutation Callback ID

+  *          @arg @ref HAL_TIM_COMMUTATION_HALF_CB_ID Commutation half complete Callback ID

+  *          @arg @ref HAL_TIM_BREAK_CB_ID Break Callback ID

+  *          @arg @ref HAL_TIM_BREAK2_CB_ID Break2 Callback ID

+  *          @retval status

+  */

+HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  /* Process locked */

+  __HAL_LOCK(htim);

+

+  if (htim->State == HAL_TIM_STATE_READY)

+  {

+    switch (CallbackID)

+    {

+      case HAL_TIM_BASE_MSPINIT_CB_ID :

+        htim->Base_MspInitCallback              = HAL_TIM_Base_MspInit;                      /* Legacy weak Base MspInit Callback */

+        break;

+

+      case HAL_TIM_BASE_MSPDEINIT_CB_ID :

+        htim->Base_MspDeInitCallback            = HAL_TIM_Base_MspDeInit;                    /* Legacy weak Base Msp DeInit Callback */

+        break;

+

+      case HAL_TIM_IC_MSPINIT_CB_ID :

+        htim->IC_MspInitCallback                = HAL_TIM_IC_MspInit;                        /* Legacy weak IC Msp Init Callback */

+        break;

+

+      case HAL_TIM_IC_MSPDEINIT_CB_ID :

+        htim->IC_MspDeInitCallback              = HAL_TIM_IC_MspDeInit;                      /* Legacy weak IC Msp DeInit Callback */

+        break;

+

+      case HAL_TIM_OC_MSPINIT_CB_ID :

+        htim->OC_MspInitCallback                = HAL_TIM_OC_MspInit;                        /* Legacy weak OC Msp Init Callback */

+        break;

+

+      case HAL_TIM_OC_MSPDEINIT_CB_ID :

+        htim->OC_MspDeInitCallback              = HAL_TIM_OC_MspDeInit;                      /* Legacy weak OC Msp DeInit Callback */

+        break;

+

+      case HAL_TIM_PWM_MSPINIT_CB_ID :

+        htim->PWM_MspInitCallback               = HAL_TIM_PWM_MspInit;                       /* Legacy weak PWM Msp Init Callback */

+        break;

+

+      case HAL_TIM_PWM_MSPDEINIT_CB_ID :

+        htim->PWM_MspDeInitCallback             = HAL_TIM_PWM_MspDeInit;                     /* Legacy weak PWM Msp DeInit Callback */

+        break;

+

+      case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID :

+        htim->OnePulse_MspInitCallback          = HAL_TIM_OnePulse_MspInit;                  /* Legacy weak One Pulse Msp Init Callback */

+        break;

+

+      case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID :

+        htim->OnePulse_MspDeInitCallback        = HAL_TIM_OnePulse_MspDeInit;                /* Legacy weak One Pulse Msp DeInit Callback */

+        break;

+

+      case HAL_TIM_ENCODER_MSPINIT_CB_ID :

+        htim->Encoder_MspInitCallback           = HAL_TIM_Encoder_MspInit;                   /* Legacy weak Encoder Msp Init Callback */

+        break;

+

+      case HAL_TIM_ENCODER_MSPDEINIT_CB_ID :

+        htim->Encoder_MspDeInitCallback         = HAL_TIM_Encoder_MspDeInit;                 /* Legacy weak Encoder Msp DeInit Callback */

+        break;

+

+      case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID :

+        htim->HallSensor_MspInitCallback        = HAL_TIMEx_HallSensor_MspInit;              /* Legacy weak Hall Sensor Msp Init Callback */

+        break;

+

+      case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID :

+        htim->HallSensor_MspDeInitCallback      = HAL_TIMEx_HallSensor_MspDeInit;            /* Legacy weak Hall Sensor Msp DeInit Callback */

+        break;

+

+      case HAL_TIM_PERIOD_ELAPSED_CB_ID :

+        htim->PeriodElapsedCallback             = HAL_TIM_PeriodElapsedCallback;             /* Legacy weak Period Elapsed Callback */

+        break;

+

+      case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID :

+        htim->PeriodElapsedHalfCpltCallback     = HAL_TIM_PeriodElapsedHalfCpltCallback;     /* Legacy weak Period Elapsed half complete Callback */

+        break;

+

+      case HAL_TIM_TRIGGER_CB_ID :

+        htim->TriggerCallback                   = HAL_TIM_TriggerCallback;                   /* Legacy weak Trigger Callback */

+        break;

+

+      case HAL_TIM_TRIGGER_HALF_CB_ID :

+        htim->TriggerHalfCpltCallback           = HAL_TIM_TriggerHalfCpltCallback;           /* Legacy weak Trigger half complete Callback */

+        break;

+

+      case HAL_TIM_IC_CAPTURE_CB_ID :

+        htim->IC_CaptureCallback                = HAL_TIM_IC_CaptureCallback;                /* Legacy weak IC Capture Callback */

+        break;

+

+      case HAL_TIM_IC_CAPTURE_HALF_CB_ID :

+        htim->IC_CaptureHalfCpltCallback        = HAL_TIM_IC_CaptureHalfCpltCallback;        /* Legacy weak IC Capture half complete Callback */

+        break;

+

+      case HAL_TIM_OC_DELAY_ELAPSED_CB_ID :

+        htim->OC_DelayElapsedCallback           = HAL_TIM_OC_DelayElapsedCallback;           /* Legacy weak OC Delay Elapsed Callback */

+        break;

+

+      case HAL_TIM_PWM_PULSE_FINISHED_CB_ID :

+        htim->PWM_PulseFinishedCallback         = HAL_TIM_PWM_PulseFinishedCallback;         /* Legacy weak PWM Pulse Finished Callback */

+        break;

+

+      case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID :

+        htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; /* Legacy weak PWM Pulse Finished half complete Callback */

+        break;

+

+      case HAL_TIM_ERROR_CB_ID :

+        htim->ErrorCallback                     = HAL_TIM_ErrorCallback;                     /* Legacy weak Error Callback */

+        break;

+

+      case HAL_TIM_COMMUTATION_CB_ID :

+        htim->CommutationCallback               = HAL_TIMEx_CommutCallback;                  /* Legacy weak Commutation Callback */

+        break;

+

+      case HAL_TIM_COMMUTATION_HALF_CB_ID :

+        htim->CommutationHalfCpltCallback       = HAL_TIMEx_CommutHalfCpltCallback;          /* Legacy weak Commutation half complete Callback */

+        break;

+

+      case HAL_TIM_BREAK_CB_ID :

+        htim->BreakCallback                     = HAL_TIMEx_BreakCallback;                   /* Legacy weak Break Callback */

+        break;

+

+      case HAL_TIM_BREAK2_CB_ID :

+        htim->Break2Callback                    = HAL_TIMEx_Break2Callback;                  /* Legacy weak Break2 Callback */

+        break;

+

+      default :

+        /* Return error status */

+        status =  HAL_ERROR;

+        break;

+    }

+  }

+  else if (htim->State == HAL_TIM_STATE_RESET)

+  {

+    switch (CallbackID)

+    {

+      case HAL_TIM_BASE_MSPINIT_CB_ID :

+        htim->Base_MspInitCallback         = HAL_TIM_Base_MspInit;              /* Legacy weak Base MspInit Callback */

+        break;

+

+      case HAL_TIM_BASE_MSPDEINIT_CB_ID :

+        htim->Base_MspDeInitCallback       = HAL_TIM_Base_MspDeInit;            /* Legacy weak Base Msp DeInit Callback */

+        break;

+

+      case HAL_TIM_IC_MSPINIT_CB_ID :

+        htim->IC_MspInitCallback           = HAL_TIM_IC_MspInit;                /* Legacy weak IC Msp Init Callback */

+        break;

+

+      case HAL_TIM_IC_MSPDEINIT_CB_ID :

+        htim->IC_MspDeInitCallback         = HAL_TIM_IC_MspDeInit;              /* Legacy weak IC Msp DeInit Callback */

+        break;

+

+      case HAL_TIM_OC_MSPINIT_CB_ID :

+        htim->OC_MspInitCallback           = HAL_TIM_OC_MspInit;                /* Legacy weak OC Msp Init Callback */

+        break;

+

+      case HAL_TIM_OC_MSPDEINIT_CB_ID :

+        htim->OC_MspDeInitCallback         = HAL_TIM_OC_MspDeInit;              /* Legacy weak OC Msp DeInit Callback */

+        break;

+

+      case HAL_TIM_PWM_MSPINIT_CB_ID :

+        htim->PWM_MspInitCallback          = HAL_TIM_PWM_MspInit;               /* Legacy weak PWM Msp Init Callback */

+        break;

+

+      case HAL_TIM_PWM_MSPDEINIT_CB_ID :

+        htim->PWM_MspDeInitCallback        = HAL_TIM_PWM_MspDeInit;             /* Legacy weak PWM Msp DeInit Callback */

+        break;

+

+      case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID :

+        htim->OnePulse_MspInitCallback     = HAL_TIM_OnePulse_MspInit;          /* Legacy weak One Pulse Msp Init Callback */

+        break;

+

+      case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID :

+        htim->OnePulse_MspDeInitCallback   = HAL_TIM_OnePulse_MspDeInit;        /* Legacy weak One Pulse Msp DeInit Callback */

+        break;

+

+      case HAL_TIM_ENCODER_MSPINIT_CB_ID :

+        htim->Encoder_MspInitCallback      = HAL_TIM_Encoder_MspInit;           /* Legacy weak Encoder Msp Init Callback */

+        break;

+

+      case HAL_TIM_ENCODER_MSPDEINIT_CB_ID :

+        htim->Encoder_MspDeInitCallback    = HAL_TIM_Encoder_MspDeInit;         /* Legacy weak Encoder Msp DeInit Callback */

+        break;

+

+      case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID :

+        htim->HallSensor_MspInitCallback   = HAL_TIMEx_HallSensor_MspInit;      /* Legacy weak Hall Sensor Msp Init Callback */

+        break;

+

+      case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID :

+        htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit;    /* Legacy weak Hall Sensor Msp DeInit Callback */

+        break;

+

+      default :

+        /* Return error status */

+        status =  HAL_ERROR;

+        break;

+    }

+  }

+  else

+  {

+    /* Return error status */

+    status =  HAL_ERROR;

+  }

+

+  /* Release Lock */

+  __HAL_UNLOCK(htim);

+

+  return status;

+}

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions

+  *  @brief   TIM Peripheral State functions

+  *

+@verbatim

+  ==============================================================================

+                        ##### Peripheral State functions #####

+  ==============================================================================

+    [..]

+    This subsection permits to get in run-time the status of the peripheral

+    and the data flow.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Return the TIM Base handle state.

+  * @param  htim TIM Base handle

+  * @retval HAL state

+  */

+HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(TIM_HandleTypeDef *htim)

+{

+  return htim->State;

+}

+

+/**

+  * @brief  Return the TIM OC handle state.

+  * @param  htim TIM Output Compare handle

+  * @retval HAL state

+  */

+HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(TIM_HandleTypeDef *htim)

+{

+  return htim->State;

+}

+

+/**

+  * @brief  Return the TIM PWM handle state.

+  * @param  htim TIM handle

+  * @retval HAL state

+  */

+HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(TIM_HandleTypeDef *htim)

+{

+  return htim->State;

+}

+

+/**

+  * @brief  Return the TIM Input Capture handle state.

+  * @param  htim TIM IC handle

+  * @retval HAL state

+  */

+HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(TIM_HandleTypeDef *htim)

+{

+  return htim->State;

+}

+

+/**

+  * @brief  Return the TIM One Pulse Mode handle state.

+  * @param  htim TIM OPM handle

+  * @retval HAL state

+  */

+HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(TIM_HandleTypeDef *htim)

+{

+  return htim->State;

+}

+

+/**

+  * @brief  Return the TIM Encoder Mode handle state.

+  * @param  htim TIM Encoder Interface handle

+  * @retval HAL state

+  */

+HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim)

+{

+  return htim->State;

+}

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/** @defgroup TIM_Private_Functions TIM Private Functions

+  * @{

+  */

+

+/**

+  * @brief  TIM DMA error callback

+  * @param  hdma pointer to DMA handle.

+  * @retval None

+  */

+void TIM_DMAError(DMA_HandleTypeDef *hdma)

+{

+  TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;

+

+  htim->State = HAL_TIM_STATE_READY;

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+  htim->ErrorCallback(htim);

+#else

+  HAL_TIM_ErrorCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  TIM DMA Delay Pulse complete callback.

+  * @param  hdma pointer to DMA handle.

+  * @retval None

+  */

+void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma)

+{

+  TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;

+

+  htim->State = HAL_TIM_STATE_READY;

+

+  if (hdma == htim->hdma[TIM_DMA_ID_CC1])

+  {

+    htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1;

+  }

+  else if (hdma == htim->hdma[TIM_DMA_ID_CC2])

+  {

+    htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;

+  }

+  else if (hdma == htim->hdma[TIM_DMA_ID_CC3])

+  {

+    htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;

+  }

+  else if (hdma == htim->hdma[TIM_DMA_ID_CC4])

+  {

+    htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;

+  }

+  else

+  {

+    /* nothing to do */

+  }

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+  htim->PWM_PulseFinishedCallback(htim);

+#else

+  HAL_TIM_PWM_PulseFinishedCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+

+  htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;

+}

+

+/**

+  * @brief  TIM DMA Delay Pulse half complete callback.

+  * @param  hdma pointer to DMA handle.

+  * @retval None

+  */

+void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma)

+{

+  TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;

+

+  htim->State = HAL_TIM_STATE_READY;

+

+  if (hdma == htim->hdma[TIM_DMA_ID_CC1])

+  {

+    htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1;

+  }

+  else if (hdma == htim->hdma[TIM_DMA_ID_CC2])

+  {

+    htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;

+  }

+  else if (hdma == htim->hdma[TIM_DMA_ID_CC3])

+  {

+    htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;

+  }

+  else if (hdma == htim->hdma[TIM_DMA_ID_CC4])

+  {

+    htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;

+  }

+  else

+  {

+    /* nothing to do */

+  }

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+  htim->PWM_PulseFinishedHalfCpltCallback(htim);

+#else

+  HAL_TIM_PWM_PulseFinishedHalfCpltCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+

+  htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;

+}

+

+/**

+  * @brief  TIM DMA Capture complete callback.

+  * @param  hdma pointer to DMA handle.

+  * @retval None

+  */

+void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma)

+{

+  TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;

+

+  htim->State = HAL_TIM_STATE_READY;

+

+  if (hdma == htim->hdma[TIM_DMA_ID_CC1])

+  {

+    htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1;

+  }

+  else if (hdma == htim->hdma[TIM_DMA_ID_CC2])

+  {

+    htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;

+  }

+  else if (hdma == htim->hdma[TIM_DMA_ID_CC3])

+  {

+    htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;

+  }

+  else if (hdma == htim->hdma[TIM_DMA_ID_CC4])

+  {

+    htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;

+  }

+  else

+  {

+    /* nothing to do */

+  }

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+  htim->IC_CaptureCallback(htim);

+#else

+  HAL_TIM_IC_CaptureCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+

+  htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;

+}

+

+/**

+  * @brief  TIM DMA Capture half complete callback.

+  * @param  hdma pointer to DMA handle.

+  * @retval None

+  */

+void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma)

+{

+  TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;

+

+  htim->State = HAL_TIM_STATE_READY;

+

+  if (hdma == htim->hdma[TIM_DMA_ID_CC1])

+  {

+    htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1;

+  }

+  else if (hdma == htim->hdma[TIM_DMA_ID_CC2])

+  {

+    htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;

+  }

+  else if (hdma == htim->hdma[TIM_DMA_ID_CC3])

+  {

+    htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;

+  }

+  else if (hdma == htim->hdma[TIM_DMA_ID_CC4])

+  {

+    htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;

+  }

+  else

+  {

+    /* nothing to do */

+  }

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+  htim->IC_CaptureHalfCpltCallback(htim);

+#else

+  HAL_TIM_IC_CaptureHalfCpltCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+

+  htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;

+}

+

+/**

+  * @brief  TIM DMA Period Elapse complete callback.

+  * @param  hdma pointer to DMA handle.

+  * @retval None

+  */

+static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma)

+{

+  TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;

+

+  htim->State = HAL_TIM_STATE_READY;

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+  htim->PeriodElapsedCallback(htim);

+#else

+  HAL_TIM_PeriodElapsedCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  TIM DMA Period Elapse half complete callback.

+  * @param  hdma pointer to DMA handle.

+  * @retval None

+  */

+static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma)

+{

+  TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;

+

+  htim->State = HAL_TIM_STATE_READY;

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+  htim->PeriodElapsedHalfCpltCallback(htim);

+#else

+  HAL_TIM_PeriodElapsedHalfCpltCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  TIM DMA Trigger callback.

+  * @param  hdma pointer to DMA handle.

+  * @retval None

+  */

+static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma)

+{

+  TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;

+

+  htim->State = HAL_TIM_STATE_READY;

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+  htim->TriggerCallback(htim);

+#else

+  HAL_TIM_TriggerCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  TIM DMA Trigger half complete callback.

+  * @param  hdma pointer to DMA handle.

+  * @retval None

+  */

+static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma)

+{

+  TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;

+

+  htim->State = HAL_TIM_STATE_READY;

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+  htim->TriggerHalfCpltCallback(htim);

+#else

+  HAL_TIM_TriggerHalfCpltCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  Time Base configuration

+  * @param  TIMx TIM peripheral

+  * @param  Structure TIM Base configuration structure

+  * @retval None

+  */

+void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure)

+{

+  uint32_t tmpcr1;

+  tmpcr1 = TIMx->CR1;

+

+  /* Set TIM Time Base Unit parameters ---------------------------------------*/

+  if (IS_TIM_COUNTER_MODE_SELECT_INSTANCE(TIMx))

+  {

+    /* Select the Counter Mode */

+    tmpcr1 &= ~(TIM_CR1_DIR | TIM_CR1_CMS);

+    tmpcr1 |= Structure->CounterMode;

+  }

+

+  if (IS_TIM_CLOCK_DIVISION_INSTANCE(TIMx))

+  {

+    /* Set the clock division */

+    tmpcr1 &= ~TIM_CR1_CKD;

+    tmpcr1 |= (uint32_t)Structure->ClockDivision;

+  }

+

+  /* Set the auto-reload preload */

+  MODIFY_REG(tmpcr1, TIM_CR1_ARPE, Structure->AutoReloadPreload);

+

+  TIMx->CR1 = tmpcr1;

+

+  /* Set the Autoreload value */

+  TIMx->ARR = (uint32_t)Structure->Period ;

+

+  /* Set the Prescaler value */

+  TIMx->PSC = Structure->Prescaler;

+

+  if (IS_TIM_REPETITION_COUNTER_INSTANCE(TIMx))

+  {

+    /* Set the Repetition Counter value */

+    TIMx->RCR = Structure->RepetitionCounter;

+  }

+

+  /* Generate an update event to reload the Prescaler

+     and the repetition counter (only for advanced timer) value immediately */

+  TIMx->EGR = TIM_EGR_UG;

+}

+

+/**

+  * @brief  Timer Output Compare 1 configuration

+  * @param  TIMx to select the TIM peripheral

+  * @param  OC_Config The ouput configuration structure

+  * @retval None

+  */

+static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config)

+{

+  uint32_t tmpccmrx;

+  uint32_t tmpccer;

+  uint32_t tmpcr2;

+

+  /* Disable the Channel 1: Reset the CC1E Bit */

+  TIMx->CCER &= ~TIM_CCER_CC1E;

+

+  /* Get the TIMx CCER register value */

+  tmpccer = TIMx->CCER;

+  /* Get the TIMx CR2 register value */

+  tmpcr2 =  TIMx->CR2;

+

+  /* Get the TIMx CCMR1 register value */

+  tmpccmrx = TIMx->CCMR1;

+

+  /* Reset the Output Compare Mode Bits */

+  tmpccmrx &= ~TIM_CCMR1_OC1M;

+  tmpccmrx &= ~TIM_CCMR1_CC1S;

+  /* Select the Output Compare Mode */

+  tmpccmrx |= OC_Config->OCMode;

+

+  /* Reset the Output Polarity level */

+  tmpccer &= ~TIM_CCER_CC1P;

+  /* Set the Output Compare Polarity */

+  tmpccer |= OC_Config->OCPolarity;

+

+  if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_1))

+  {

+    /* Check parameters */

+    assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity));

+

+    /* Reset the Output N Polarity level */

+    tmpccer &= ~TIM_CCER_CC1NP;

+    /* Set the Output N Polarity */

+    tmpccer |= OC_Config->OCNPolarity;

+    /* Reset the Output N State */

+    tmpccer &= ~TIM_CCER_CC1NE;

+  }

+

+  if (IS_TIM_BREAK_INSTANCE(TIMx))

+  {

+    /* Check parameters */

+    assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState));

+    assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState));

+

+    /* Reset the Output Compare and Output Compare N IDLE State */

+    tmpcr2 &= ~TIM_CR2_OIS1;

+    tmpcr2 &= ~TIM_CR2_OIS1N;

+    /* Set the Output Idle state */

+    tmpcr2 |= OC_Config->OCIdleState;

+    /* Set the Output N Idle state */

+    tmpcr2 |= OC_Config->OCNIdleState;

+  }

+

+  /* Write to TIMx CR2 */

+  TIMx->CR2 = tmpcr2;

+

+  /* Write to TIMx CCMR1 */

+  TIMx->CCMR1 = tmpccmrx;

+

+  /* Set the Capture Compare Register value */

+  TIMx->CCR1 = OC_Config->Pulse;

+

+  /* Write to TIMx CCER */

+  TIMx->CCER = tmpccer;

+}

+

+/**

+  * @brief  Timer Output Compare 2 configuration

+  * @param  TIMx to select the TIM peripheral

+  * @param  OC_Config The ouput configuration structure

+  * @retval None

+  */

+void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config)

+{

+  uint32_t tmpccmrx;

+  uint32_t tmpccer;

+  uint32_t tmpcr2;

+

+  /* Disable the Channel 2: Reset the CC2E Bit */

+  TIMx->CCER &= ~TIM_CCER_CC2E;

+

+  /* Get the TIMx CCER register value */

+  tmpccer = TIMx->CCER;

+  /* Get the TIMx CR2 register value */

+  tmpcr2 =  TIMx->CR2;

+

+  /* Get the TIMx CCMR1 register value */

+  tmpccmrx = TIMx->CCMR1;

+

+  /* Reset the Output Compare mode and Capture/Compare selection Bits */

+  tmpccmrx &= ~TIM_CCMR1_OC2M;

+  tmpccmrx &= ~TIM_CCMR1_CC2S;

+

+  /* Select the Output Compare Mode */

+  tmpccmrx |= (OC_Config->OCMode << 8U);

+

+  /* Reset the Output Polarity level */

+  tmpccer &= ~TIM_CCER_CC2P;

+  /* Set the Output Compare Polarity */

+  tmpccer |= (OC_Config->OCPolarity << 4U);

+

+  if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_2))

+  {

+    assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity));

+

+    /* Reset the Output N Polarity level */

+    tmpccer &= ~TIM_CCER_CC2NP;

+    /* Set the Output N Polarity */

+    tmpccer |= (OC_Config->OCNPolarity << 4U);

+    /* Reset the Output N State */

+    tmpccer &= ~TIM_CCER_CC2NE;

+

+  }

+

+  if (IS_TIM_BREAK_INSTANCE(TIMx))

+  {

+    /* Check parameters */

+    assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState));

+    assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState));

+

+    /* Reset the Output Compare and Output Compare N IDLE State */

+    tmpcr2 &= ~TIM_CR2_OIS2;

+    tmpcr2 &= ~TIM_CR2_OIS2N;

+    /* Set the Output Idle state */

+    tmpcr2 |= (OC_Config->OCIdleState << 2U);

+    /* Set the Output N Idle state */

+    tmpcr2 |= (OC_Config->OCNIdleState << 2U);

+  }

+

+  /* Write to TIMx CR2 */

+  TIMx->CR2 = tmpcr2;

+

+  /* Write to TIMx CCMR1 */

+  TIMx->CCMR1 = tmpccmrx;

+

+  /* Set the Capture Compare Register value */

+  TIMx->CCR2 = OC_Config->Pulse;

+

+  /* Write to TIMx CCER */

+  TIMx->CCER = tmpccer;

+}

+

+/**

+  * @brief  Timer Output Compare 3 configuration

+  * @param  TIMx to select the TIM peripheral

+  * @param  OC_Config The ouput configuration structure

+  * @retval None

+  */

+static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config)

+{

+  uint32_t tmpccmrx;

+  uint32_t tmpccer;

+  uint32_t tmpcr2;

+

+  /* Disable the Channel 3: Reset the CC2E Bit */

+  TIMx->CCER &= ~TIM_CCER_CC3E;

+

+  /* Get the TIMx CCER register value */

+  tmpccer = TIMx->CCER;

+  /* Get the TIMx CR2 register value */

+  tmpcr2 =  TIMx->CR2;

+

+  /* Get the TIMx CCMR2 register value */

+  tmpccmrx = TIMx->CCMR2;

+

+  /* Reset the Output Compare mode and Capture/Compare selection Bits */

+  tmpccmrx &= ~TIM_CCMR2_OC3M;

+  tmpccmrx &= ~TIM_CCMR2_CC3S;

+  /* Select the Output Compare Mode */

+  tmpccmrx |= OC_Config->OCMode;

+

+  /* Reset the Output Polarity level */

+  tmpccer &= ~TIM_CCER_CC3P;

+  /* Set the Output Compare Polarity */

+  tmpccer |= (OC_Config->OCPolarity << 8U);

+

+  if (IS_TIM_CCXN_INSTANCE(TIMx, TIM_CHANNEL_3))

+  {

+    assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity));

+

+    /* Reset the Output N Polarity level */

+    tmpccer &= ~TIM_CCER_CC3NP;

+    /* Set the Output N Polarity */

+    tmpccer |= (OC_Config->OCNPolarity << 8U);

+    /* Reset the Output N State */

+    tmpccer &= ~TIM_CCER_CC3NE;

+  }

+

+  if (IS_TIM_BREAK_INSTANCE(TIMx))

+  {

+    /* Check parameters */

+    assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState));

+    assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState));

+

+    /* Reset the Output Compare and Output Compare N IDLE State */

+    tmpcr2 &= ~TIM_CR2_OIS3;

+    tmpcr2 &= ~TIM_CR2_OIS3N;

+    /* Set the Output Idle state */

+    tmpcr2 |= (OC_Config->OCIdleState << 4U);

+    /* Set the Output N Idle state */

+    tmpcr2 |= (OC_Config->OCNIdleState << 4U);

+  }

+

+  /* Write to TIMx CR2 */

+  TIMx->CR2 = tmpcr2;

+

+  /* Write to TIMx CCMR2 */

+  TIMx->CCMR2 = tmpccmrx;

+

+  /* Set the Capture Compare Register value */

+  TIMx->CCR3 = OC_Config->Pulse;

+

+  /* Write to TIMx CCER */

+  TIMx->CCER = tmpccer;

+}

+

+/**

+  * @brief  Timer Output Compare 4 configuration

+  * @param  TIMx to select the TIM peripheral

+  * @param  OC_Config The ouput configuration structure

+  * @retval None

+  */

+static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config)

+{

+  uint32_t tmpccmrx;

+  uint32_t tmpccer;

+  uint32_t tmpcr2;

+

+  /* Disable the Channel 4: Reset the CC4E Bit */

+  TIMx->CCER &= ~TIM_CCER_CC4E;

+

+  /* Get the TIMx CCER register value */

+  tmpccer = TIMx->CCER;

+  /* Get the TIMx CR2 register value */

+  tmpcr2 =  TIMx->CR2;

+

+  /* Get the TIMx CCMR2 register value */

+  tmpccmrx = TIMx->CCMR2;

+

+  /* Reset the Output Compare mode and Capture/Compare selection Bits */

+  tmpccmrx &= ~TIM_CCMR2_OC4M;

+  tmpccmrx &= ~TIM_CCMR2_CC4S;

+

+  /* Select the Output Compare Mode */

+  tmpccmrx |= (OC_Config->OCMode << 8U);

+

+  /* Reset the Output Polarity level */

+  tmpccer &= ~TIM_CCER_CC4P;

+  /* Set the Output Compare Polarity */

+  tmpccer |= (OC_Config->OCPolarity << 12U);

+

+  if (IS_TIM_BREAK_INSTANCE(TIMx))

+  {

+    /* Check parameters */

+    assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState));

+

+    /* Reset the Output Compare IDLE State */

+    tmpcr2 &= ~TIM_CR2_OIS4;

+

+    /* Set the Output Idle state */

+    tmpcr2 |= (OC_Config->OCIdleState << 6U);

+  }

+

+  /* Write to TIMx CR2 */

+  TIMx->CR2 = tmpcr2;

+

+  /* Write to TIMx CCMR2 */

+  TIMx->CCMR2 = tmpccmrx;

+

+  /* Set the Capture Compare Register value */

+  TIMx->CCR4 = OC_Config->Pulse;

+

+  /* Write to TIMx CCER */

+  TIMx->CCER = tmpccer;

+}

+

+/**

+  * @brief  Timer Output Compare 5 configuration

+  * @param  TIMx to select the TIM peripheral

+  * @param  OC_Config The ouput configuration structure

+  * @retval None

+  */

+static void TIM_OC5_SetConfig(TIM_TypeDef *TIMx,

+                              TIM_OC_InitTypeDef *OC_Config)

+{

+  uint32_t tmpccmrx;

+  uint32_t tmpccer;

+  uint32_t tmpcr2;

+

+  /* Disable the output: Reset the CCxE Bit */

+  TIMx->CCER &= ~TIM_CCER_CC5E;

+

+  /* Get the TIMx CCER register value */

+  tmpccer = TIMx->CCER;

+  /* Get the TIMx CR2 register value */

+  tmpcr2 =  TIMx->CR2;

+  /* Get the TIMx CCMR1 register value */

+  tmpccmrx = TIMx->CCMR3;

+

+  /* Reset the Output Compare Mode Bits */

+  tmpccmrx &= ~(TIM_CCMR3_OC5M);

+  /* Select the Output Compare Mode */

+  tmpccmrx |= OC_Config->OCMode;

+

+  /* Reset the Output Polarity level */

+  tmpccer &= ~TIM_CCER_CC5P;

+  /* Set the Output Compare Polarity */

+  tmpccer |= (OC_Config->OCPolarity << 16U);

+

+  if (IS_TIM_BREAK_INSTANCE(TIMx))

+  {

+    /* Reset the Output Compare IDLE State */

+    tmpcr2 &= ~TIM_CR2_OIS5;

+    /* Set the Output Idle state */

+    tmpcr2 |= (OC_Config->OCIdleState << 8U);

+  }

+  /* Write to TIMx CR2 */

+  TIMx->CR2 = tmpcr2;

+

+  /* Write to TIMx CCMR3 */

+  TIMx->CCMR3 = tmpccmrx;

+

+  /* Set the Capture Compare Register value */

+  TIMx->CCR5 = OC_Config->Pulse;

+

+  /* Write to TIMx CCER */

+  TIMx->CCER = tmpccer;

+}

+

+/**

+  * @brief  Timer Output Compare 6 configuration

+  * @param  TIMx to select the TIM peripheral

+  * @param  OC_Config The ouput configuration structure

+  * @retval None

+  */

+static void TIM_OC6_SetConfig(TIM_TypeDef *TIMx,

+                              TIM_OC_InitTypeDef *OC_Config)

+{

+  uint32_t tmpccmrx;

+  uint32_t tmpccer;

+  uint32_t tmpcr2;

+

+  /* Disable the output: Reset the CCxE Bit */

+  TIMx->CCER &= ~TIM_CCER_CC6E;

+

+  /* Get the TIMx CCER register value */

+  tmpccer = TIMx->CCER;

+  /* Get the TIMx CR2 register value */

+  tmpcr2 =  TIMx->CR2;

+  /* Get the TIMx CCMR1 register value */

+  tmpccmrx = TIMx->CCMR3;

+

+  /* Reset the Output Compare Mode Bits */

+  tmpccmrx &= ~(TIM_CCMR3_OC6M);

+  /* Select the Output Compare Mode */

+  tmpccmrx |= (OC_Config->OCMode << 8U);

+

+  /* Reset the Output Polarity level */

+  tmpccer &= (uint32_t)~TIM_CCER_CC6P;

+  /* Set the Output Compare Polarity */

+  tmpccer |= (OC_Config->OCPolarity << 20U);

+

+  if (IS_TIM_BREAK_INSTANCE(TIMx))

+  {

+    /* Reset the Output Compare IDLE State */

+    tmpcr2 &= ~TIM_CR2_OIS6;

+    /* Set the Output Idle state */

+    tmpcr2 |= (OC_Config->OCIdleState << 10U);

+  }

+

+  /* Write to TIMx CR2 */

+  TIMx->CR2 = tmpcr2;

+

+  /* Write to TIMx CCMR3 */

+  TIMx->CCMR3 = tmpccmrx;

+

+  /* Set the Capture Compare Register value */

+  TIMx->CCR6 = OC_Config->Pulse;

+

+  /* Write to TIMx CCER */

+  TIMx->CCER = tmpccer;

+}

+

+/**

+  * @brief  Slave Timer configuration function

+  * @param  htim TIM handle

+  * @param  sSlaveConfig Slave timer configuration

+  * @retval None

+  */

+static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim,

+                                                  TIM_SlaveConfigTypeDef *sSlaveConfig)

+{

+  uint32_t tmpsmcr;

+  uint32_t tmpccmr1;

+  uint32_t tmpccer;

+

+  /* Get the TIMx SMCR register value */

+  tmpsmcr = htim->Instance->SMCR;

+

+  /* Reset the Trigger Selection Bits */

+  tmpsmcr &= ~TIM_SMCR_TS;

+  /* Set the Input Trigger source */

+  tmpsmcr |= sSlaveConfig->InputTrigger;

+

+  /* Reset the slave mode Bits */

+  tmpsmcr &= ~TIM_SMCR_SMS;

+  /* Set the slave mode */

+  tmpsmcr |= sSlaveConfig->SlaveMode;

+

+  /* Write to TIMx SMCR */

+  htim->Instance->SMCR = tmpsmcr;

+

+  /* Configure the trigger prescaler, filter, and polarity */

+  switch (sSlaveConfig->InputTrigger)

+  {

+    case TIM_TS_ETRF:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance));

+      assert_param(IS_TIM_TRIGGERPRESCALER(sSlaveConfig->TriggerPrescaler));

+      assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity));

+      assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter));

+      /* Configure the ETR Trigger source */

+      TIM_ETR_SetConfig(htim->Instance,

+                        sSlaveConfig->TriggerPrescaler,

+                        sSlaveConfig->TriggerPolarity,

+                        sSlaveConfig->TriggerFilter);

+      break;

+    }

+

+    case TIM_TS_TI1F_ED:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));

+      assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter));

+

+      if(sSlaveConfig->SlaveMode == TIM_SLAVEMODE_GATED)

+      {

+        return HAL_ERROR;

+      }

+

+      /* Disable the Channel 1: Reset the CC1E Bit */

+      tmpccer = htim->Instance->CCER;

+      htim->Instance->CCER &= ~TIM_CCER_CC1E;

+      tmpccmr1 = htim->Instance->CCMR1;

+

+      /* Set the filter */

+      tmpccmr1 &= ~TIM_CCMR1_IC1F;

+      tmpccmr1 |= ((sSlaveConfig->TriggerFilter) << 4U);

+

+      /* Write to TIMx CCMR1 and CCER registers */

+      htim->Instance->CCMR1 = tmpccmr1;

+      htim->Instance->CCER = tmpccer;

+      break;

+    }

+

+    case TIM_TS_TI1FP1:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CC1_INSTANCE(htim->Instance));

+      assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity));

+      assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter));

+

+      /* Configure TI1 Filter and Polarity */

+      TIM_TI1_ConfigInputStage(htim->Instance,

+                               sSlaveConfig->TriggerPolarity,

+                               sSlaveConfig->TriggerFilter);

+      break;

+    }

+

+    case TIM_TS_TI2FP2:

+    {

+      /* Check the parameters */

+      assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));

+      assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity));

+      assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter));

+

+      /* Configure TI2 Filter and Polarity */

+      TIM_TI2_ConfigInputStage(htim->Instance,

+                               sSlaveConfig->TriggerPolarity,

+                               sSlaveConfig->TriggerFilter);

+      break;

+    }

+

+    case TIM_TS_ITR0:

+    case TIM_TS_ITR1:

+    case TIM_TS_ITR2:

+    case TIM_TS_ITR3:

+    {

+      /* Check the parameter */

+      assert_param(IS_TIM_CC2_INSTANCE(htim->Instance));

+      break;

+    }

+

+    default:

+      break;

+  }

+  return HAL_OK;

+}

+

+/**

+  * @brief  Configure the TI1 as Input.

+  * @param  TIMx to select the TIM peripheral.

+  * @param  TIM_ICPolarity The Input Polarity.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_ICPOLARITY_RISING

+  *            @arg TIM_ICPOLARITY_FALLING

+  *            @arg TIM_ICPOLARITY_BOTHEDGE

+  * @param  TIM_ICSelection specifies the input to be used.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_ICSELECTION_DIRECTTI: TIM Input 1 is selected to be connected to IC1.

+  *            @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 1 is selected to be connected to IC2.

+  *            @arg TIM_ICSELECTION_TRC: TIM Input 1 is selected to be connected to TRC.

+  * @param  TIM_ICFilter Specifies the Input Capture Filter.

+  *          This parameter must be a value between 0x00 and 0x0F.

+  * @retval None

+  * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI2FP1

+  *       (on channel2 path) is used as the input signal. Therefore CCMR1 must be

+  *        protected against un-initialized filter and polarity values.

+  */

+void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection,

+                       uint32_t TIM_ICFilter)

+{

+  uint32_t tmpccmr1;

+  uint32_t tmpccer;

+

+  /* Disable the Channel 1: Reset the CC1E Bit */

+  TIMx->CCER &= ~TIM_CCER_CC1E;

+  tmpccmr1 = TIMx->CCMR1;

+  tmpccer = TIMx->CCER;

+

+  /* Select the Input */

+  if (IS_TIM_CC2_INSTANCE(TIMx) != RESET)

+  {

+    tmpccmr1 &= ~TIM_CCMR1_CC1S;

+    tmpccmr1 |= TIM_ICSelection;

+  }

+  else

+  {

+    tmpccmr1 |= TIM_CCMR1_CC1S_0;

+  }

+

+  /* Set the filter */

+  tmpccmr1 &= ~TIM_CCMR1_IC1F;

+  tmpccmr1 |= ((TIM_ICFilter << 4U) & TIM_CCMR1_IC1F);

+

+  /* Select the Polarity and set the CC1E Bit */

+  tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP);

+  tmpccer |= (TIM_ICPolarity & (TIM_CCER_CC1P | TIM_CCER_CC1NP));

+

+  /* Write to TIMx CCMR1 and CCER registers */

+  TIMx->CCMR1 = tmpccmr1;

+  TIMx->CCER = tmpccer;

+}

+

+/**

+  * @brief  Configure the Polarity and Filter for TI1.

+  * @param  TIMx to select the TIM peripheral.

+  * @param  TIM_ICPolarity The Input Polarity.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_ICPOLARITY_RISING

+  *            @arg TIM_ICPOLARITY_FALLING

+  *            @arg TIM_ICPOLARITY_BOTHEDGE

+  * @param  TIM_ICFilter Specifies the Input Capture Filter.

+  *          This parameter must be a value between 0x00 and 0x0F.

+  * @retval None

+  */

+static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter)

+{

+  uint32_t tmpccmr1;

+  uint32_t tmpccer;

+

+  /* Disable the Channel 1: Reset the CC1E Bit */

+  tmpccer = TIMx->CCER;

+  TIMx->CCER &= ~TIM_CCER_CC1E;

+  tmpccmr1 = TIMx->CCMR1;

+

+  /* Set the filter */

+  tmpccmr1 &= ~TIM_CCMR1_IC1F;

+  tmpccmr1 |= (TIM_ICFilter << 4U);

+

+  /* Select the Polarity and set the CC1E Bit */

+  tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP);

+  tmpccer |= TIM_ICPolarity;

+

+  /* Write to TIMx CCMR1 and CCER registers */

+  TIMx->CCMR1 = tmpccmr1;

+  TIMx->CCER = tmpccer;

+}

+

+/**

+  * @brief  Configure the TI2 as Input.

+  * @param  TIMx to select the TIM peripheral

+  * @param  TIM_ICPolarity The Input Polarity.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_ICPOLARITY_RISING

+  *            @arg TIM_ICPOLARITY_FALLING

+  *            @arg TIM_ICPOLARITY_BOTHEDGE

+  * @param  TIM_ICSelection specifies the input to be used.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_ICSELECTION_DIRECTTI: TIM Input 2 is selected to be connected to IC2.

+  *            @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 2 is selected to be connected to IC1.

+  *            @arg TIM_ICSELECTION_TRC: TIM Input 2 is selected to be connected to TRC.

+  * @param  TIM_ICFilter Specifies the Input Capture Filter.

+  *          This parameter must be a value between 0x00 and 0x0F.

+  * @retval None

+  * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI1FP2

+  *       (on channel1 path) is used as the input signal. Therefore CCMR1 must be

+  *        protected against un-initialized filter and polarity values.

+  */

+static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection,

+                              uint32_t TIM_ICFilter)

+{

+  uint32_t tmpccmr1;

+  uint32_t tmpccer;

+

+  /* Disable the Channel 2: Reset the CC2E Bit */

+  TIMx->CCER &= ~TIM_CCER_CC2E;

+  tmpccmr1 = TIMx->CCMR1;

+  tmpccer = TIMx->CCER;

+

+  /* Select the Input */

+  tmpccmr1 &= ~TIM_CCMR1_CC2S;

+  tmpccmr1 |= (TIM_ICSelection << 8U);

+

+  /* Set the filter */

+  tmpccmr1 &= ~TIM_CCMR1_IC2F;

+  tmpccmr1 |= ((TIM_ICFilter << 12U) & TIM_CCMR1_IC2F);

+

+  /* Select the Polarity and set the CC2E Bit */

+  tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP);

+  tmpccer |= ((TIM_ICPolarity << 4U) & (TIM_CCER_CC2P | TIM_CCER_CC2NP));

+

+  /* Write to TIMx CCMR1 and CCER registers */

+  TIMx->CCMR1 = tmpccmr1 ;

+  TIMx->CCER = tmpccer;

+}

+

+/**

+  * @brief  Configure the Polarity and Filter for TI2.

+  * @param  TIMx to select the TIM peripheral.

+  * @param  TIM_ICPolarity The Input Polarity.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_ICPOLARITY_RISING

+  *            @arg TIM_ICPOLARITY_FALLING

+  *            @arg TIM_ICPOLARITY_BOTHEDGE

+  * @param  TIM_ICFilter Specifies the Input Capture Filter.

+  *          This parameter must be a value between 0x00 and 0x0F.

+  * @retval None

+  */

+static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter)

+{

+  uint32_t tmpccmr1;

+  uint32_t tmpccer;

+

+  /* Disable the Channel 2: Reset the CC2E Bit */

+  TIMx->CCER &= ~TIM_CCER_CC2E;

+  tmpccmr1 = TIMx->CCMR1;

+  tmpccer = TIMx->CCER;

+

+  /* Set the filter */

+  tmpccmr1 &= ~TIM_CCMR1_IC2F;

+  tmpccmr1 |= (TIM_ICFilter << 12U);

+

+  /* Select the Polarity and set the CC2E Bit */

+  tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP);

+  tmpccer |= (TIM_ICPolarity << 4U);

+

+  /* Write to TIMx CCMR1 and CCER registers */

+  TIMx->CCMR1 = tmpccmr1 ;

+  TIMx->CCER = tmpccer;

+}

+

+/**

+  * @brief  Configure the TI3 as Input.

+  * @param  TIMx to select the TIM peripheral

+  * @param  TIM_ICPolarity The Input Polarity.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_ICPOLARITY_RISING

+  *            @arg TIM_ICPOLARITY_FALLING

+  *            @arg TIM_ICPOLARITY_BOTHEDGE

+  * @param  TIM_ICSelection specifies the input to be used.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_ICSELECTION_DIRECTTI: TIM Input 3 is selected to be connected to IC3.

+  *            @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 3 is selected to be connected to IC4.

+  *            @arg TIM_ICSELECTION_TRC: TIM Input 3 is selected to be connected to TRC.

+  * @param  TIM_ICFilter Specifies the Input Capture Filter.

+  *          This parameter must be a value between 0x00 and 0x0F.

+  * @retval None

+  * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI3FP4

+  *       (on channel1 path) is used as the input signal. Therefore CCMR2 must be

+  *        protected against un-initialized filter and polarity values.

+  */

+static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection,

+                              uint32_t TIM_ICFilter)

+{

+  uint32_t tmpccmr2;

+  uint32_t tmpccer;

+

+  /* Disable the Channel 3: Reset the CC3E Bit */

+  TIMx->CCER &= ~TIM_CCER_CC3E;

+  tmpccmr2 = TIMx->CCMR2;

+  tmpccer = TIMx->CCER;

+

+  /* Select the Input */

+  tmpccmr2 &= ~TIM_CCMR2_CC3S;

+  tmpccmr2 |= TIM_ICSelection;

+

+  /* Set the filter */

+  tmpccmr2 &= ~TIM_CCMR2_IC3F;

+  tmpccmr2 |= ((TIM_ICFilter << 4U) & TIM_CCMR2_IC3F);

+

+  /* Select the Polarity and set the CC3E Bit */

+  tmpccer &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP);

+  tmpccer |= ((TIM_ICPolarity << 8U) & (TIM_CCER_CC3P | TIM_CCER_CC3NP));

+

+  /* Write to TIMx CCMR2 and CCER registers */

+  TIMx->CCMR2 = tmpccmr2;

+  TIMx->CCER = tmpccer;

+}

+

+/**

+  * @brief  Configure the TI4 as Input.

+  * @param  TIMx to select the TIM peripheral

+  * @param  TIM_ICPolarity The Input Polarity.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_ICPOLARITY_RISING

+  *            @arg TIM_ICPOLARITY_FALLING

+  *            @arg TIM_ICPOLARITY_BOTHEDGE

+  * @param  TIM_ICSelection specifies the input to be used.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_ICSELECTION_DIRECTTI: TIM Input 4 is selected to be connected to IC4.

+  *            @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 4 is selected to be connected to IC3.

+  *            @arg TIM_ICSELECTION_TRC: TIM Input 4 is selected to be connected to TRC.

+  * @param  TIM_ICFilter Specifies the Input Capture Filter.

+  *          This parameter must be a value between 0x00 and 0x0F.

+  * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI4FP3

+  *       (on channel1 path) is used as the input signal. Therefore CCMR2 must be

+  *        protected against un-initialized filter and polarity values.

+  * @retval None

+  */

+static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection,

+                              uint32_t TIM_ICFilter)

+{

+  uint32_t tmpccmr2;

+  uint32_t tmpccer;

+

+  /* Disable the Channel 4: Reset the CC4E Bit */

+  TIMx->CCER &= ~TIM_CCER_CC4E;

+  tmpccmr2 = TIMx->CCMR2;

+  tmpccer = TIMx->CCER;

+

+  /* Select the Input */

+  tmpccmr2 &= ~TIM_CCMR2_CC4S;

+  tmpccmr2 |= (TIM_ICSelection << 8U);

+

+  /* Set the filter */

+  tmpccmr2 &= ~TIM_CCMR2_IC4F;

+  tmpccmr2 |= ((TIM_ICFilter << 12U) & TIM_CCMR2_IC4F);

+

+  /* Select the Polarity and set the CC4E Bit */

+  tmpccer &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP);

+  tmpccer |= ((TIM_ICPolarity << 12U) & (TIM_CCER_CC4P | TIM_CCER_CC4NP));

+

+  /* Write to TIMx CCMR2 and CCER registers */

+  TIMx->CCMR2 = tmpccmr2;

+  TIMx->CCER = tmpccer ;

+}

+

+/**

+  * @brief  Selects the Input Trigger source

+  * @param  TIMx to select the TIM peripheral

+  * @param  InputTriggerSource The Input Trigger source.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_TS_ITR0: Internal Trigger 0

+  *            @arg TIM_TS_ITR1: Internal Trigger 1

+  *            @arg TIM_TS_ITR2: Internal Trigger 2

+  *            @arg TIM_TS_ITR3: Internal Trigger 3

+  *            @arg TIM_TS_TI1F_ED: TI1 Edge Detector

+  *            @arg TIM_TS_TI1FP1: Filtered Timer Input 1

+  *            @arg TIM_TS_TI2FP2: Filtered Timer Input 2

+  *            @arg TIM_TS_ETRF: External Trigger input

+  * @retval None

+  */

+static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint32_t InputTriggerSource)

+{

+  uint32_t tmpsmcr;

+

+  /* Get the TIMx SMCR register value */

+  tmpsmcr = TIMx->SMCR;

+  /* Reset the TS Bits */

+  tmpsmcr &= ~TIM_SMCR_TS;

+  /* Set the Input Trigger source and the slave mode*/

+  tmpsmcr |= (InputTriggerSource | TIM_SLAVEMODE_EXTERNAL1);

+  /* Write to TIMx SMCR */

+  TIMx->SMCR = tmpsmcr;

+}

+/**

+  * @brief  Configures the TIMx External Trigger (ETR).

+  * @param  TIMx to select the TIM peripheral

+  * @param  TIM_ExtTRGPrescaler The external Trigger Prescaler.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_ETRPRESCALER_DIV1: ETRP Prescaler OFF.

+  *            @arg TIM_ETRPRESCALER_DIV2: ETRP frequency divided by 2.

+  *            @arg TIM_ETRPRESCALER_DIV4: ETRP frequency divided by 4.

+  *            @arg TIM_ETRPRESCALER_DIV8: ETRP frequency divided by 8.

+  * @param  TIM_ExtTRGPolarity The external Trigger Polarity.

+  *          This parameter can be one of the following values:

+  *            @arg TIM_ETRPOLARITY_INVERTED: active low or falling edge active.

+  *            @arg TIM_ETRPOLARITY_NONINVERTED: active high or rising edge active.

+  * @param  ExtTRGFilter External Trigger Filter.

+  *          This parameter must be a value between 0x00 and 0x0F

+  * @retval None

+  */

+void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler,

+                       uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter)

+{

+  uint32_t tmpsmcr;

+

+  tmpsmcr = TIMx->SMCR;

+

+  /* Reset the ETR Bits */

+  tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP);

+

+  /* Set the Prescaler, the Filter value and the Polarity */

+  tmpsmcr |= (uint32_t)(TIM_ExtTRGPrescaler | (TIM_ExtTRGPolarity | (ExtTRGFilter << 8U)));

+

+  /* Write to TIMx SMCR */

+  TIMx->SMCR = tmpsmcr;

+}

+

+/**

+  * @brief  Enables or disables the TIM Capture Compare Channel x.

+  * @param  TIMx to select the TIM peripheral

+  * @param  Channel specifies the TIM Channel

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1

+  *            @arg TIM_CHANNEL_2: TIM Channel 2

+  *            @arg TIM_CHANNEL_3: TIM Channel 3

+  *            @arg TIM_CHANNEL_4: TIM Channel 4

+  *            @arg TIM_CHANNEL_5: TIM Channel 5 selected

+  *            @arg TIM_CHANNEL_6: TIM Channel 6 selected

+  * @param  ChannelState specifies the TIM Channel CCxE bit new state.

+  *          This parameter can be: TIM_CCx_ENABLE or TIM_CCx_DISABLE.

+  * @retval None

+  */

+void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState)

+{

+  uint32_t tmp;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_CC1_INSTANCE(TIMx));

+  assert_param(IS_TIM_CHANNELS(Channel));

+

+  tmp = TIM_CCER_CC1E << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */

+

+  /* Reset the CCxE Bit */

+  TIMx->CCER &= ~tmp;

+

+  /* Set or reset the CCxE Bit */

+  TIMx->CCER |= (uint32_t)(ChannelState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */

+}

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+/**

+  * @brief  Reset interrupt callbacks to the legacy weak callbacks.

+  * @param  htim pointer to a TIM_HandleTypeDef structure that contains

+  *                the configuration information for TIM module.

+  * @retval None

+  */

+void TIM_ResetCallback(TIM_HandleTypeDef *htim)

+{

+  /* Reset the TIM callback to the legacy weak callbacks */

+  htim->PeriodElapsedCallback             = HAL_TIM_PeriodElapsedCallback;             /* Legacy weak PeriodElapsedCallback             */

+  htim->PeriodElapsedHalfCpltCallback     = HAL_TIM_PeriodElapsedHalfCpltCallback;     /* Legacy weak PeriodElapsedHalfCpltCallback     */

+  htim->TriggerCallback                   = HAL_TIM_TriggerCallback;                   /* Legacy weak TriggerCallback                   */

+  htim->TriggerHalfCpltCallback           = HAL_TIM_TriggerHalfCpltCallback;           /* Legacy weak TriggerHalfCpltCallback           */

+  htim->IC_CaptureCallback                = HAL_TIM_IC_CaptureCallback;                /* Legacy weak IC_CaptureCallback                */

+  htim->IC_CaptureHalfCpltCallback        = HAL_TIM_IC_CaptureHalfCpltCallback;        /* Legacy weak IC_CaptureHalfCpltCallback        */

+  htim->OC_DelayElapsedCallback           = HAL_TIM_OC_DelayElapsedCallback;           /* Legacy weak OC_DelayElapsedCallback           */

+  htim->PWM_PulseFinishedCallback         = HAL_TIM_PWM_PulseFinishedCallback;         /* Legacy weak PWM_PulseFinishedCallback         */

+  htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; /* Legacy weak PWM_PulseFinishedHalfCpltCallback */

+  htim->ErrorCallback                     = HAL_TIM_ErrorCallback;                     /* Legacy weak ErrorCallback                     */

+  htim->CommutationCallback               = HAL_TIMEx_CommutCallback;                  /* Legacy weak CommutationCallback               */

+  htim->CommutationHalfCpltCallback       = HAL_TIMEx_CommutHalfCpltCallback;          /* Legacy weak CommutationHalfCpltCallback       */

+  htim->BreakCallback                     = HAL_TIMEx_BreakCallback;                   /* Legacy weak BreakCallback                     */

+  htim->Break2Callback                    = HAL_TIMEx_Break2Callback;                  /* Legacy weak Break2Callback                    */

+}

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+

+/**

+  * @}

+  */

+

+#endif /* HAL_TIM_MODULE_ENABLED */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c
new file mode 100644
index 0000000..559abea
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c
@@ -0,0 +1,2373 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_tim_ex.c

+  * @author  MCD Application Team

+  * @brief   TIM HAL module driver.

+  *          This file provides firmware functions to manage the following

+  *          functionalities of the Timer Extended peripheral:

+  *           + Time Hall Sensor Interface Initialization

+  *           + Time Hall Sensor Interface Start

+  *           + Time Complementary signal break and dead time configuration

+  *           + Time Master and Slave synchronization configuration

+  *           + Time Output Compare/PWM Channel Configuration (for channels 5 and 6)

+  *           + Time OCRef clear configuration

+  *           + Timer remapping capabilities configuration

+  @verbatim

+  ==============================================================================

+                      ##### TIMER Extended features #####

+  ==============================================================================

+  [..]

+    The Timer Extended features include:

+    (#) Complementary outputs with programmable dead-time for :

+        (++) Output Compare

+        (++) PWM generation (Edge and Center-aligned Mode)

+        (++) One-pulse mode output

+    (#) Synchronization circuit to control the timer with external signals and to

+        interconnect several timers together.

+    (#) Break input to put the timer output signals in reset state or in a known state.

+    (#) Supports incremental (quadrature) encoder and hall-sensor circuitry for

+        positioning purposes

+

+            ##### How to use this driver #####

+  ==============================================================================

+    [..]

+     (#) Initialize the TIM low level resources by implementing the following functions

+         depending on the selected feature:

+           (++) Hall Sensor output : HAL_TIMEx_HallSensor_MspInit()

+

+     (#) Initialize the TIM low level resources :

+        (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE();

+        (##) TIM pins configuration

+            (+++) Enable the clock for the TIM GPIOs using the following function:

+              __HAL_RCC_GPIOx_CLK_ENABLE();

+            (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init();

+

+     (#) The external Clock can be configured, if needed (the default clock is the

+         internal clock from the APBx), using the following function:

+         HAL_TIM_ConfigClockSource, the clock configuration should be done before

+         any start function.

+

+     (#) Configure the TIM in the desired functioning mode using one of the

+         initialization function of this driver:

+          (++) HAL_TIMEx_HallSensor_Init() and HAL_TIMEx_ConfigCommutEvent(): to use the

+               Timer Hall Sensor Interface and the commutation event with the corresponding

+               Interrupt and DMA request if needed (Note that One Timer is used to interface

+               with the Hall sensor Interface and another Timer should be used to use

+               the commutation event).

+

+     (#) Activate the TIM peripheral using one of the start functions:

+           (++) Complementary Output Compare : HAL_TIMEx_OCN_Start(), HAL_TIMEx_OCN_Start_DMA(), HAL_TIMEx_OC_Start_IT()

+           (++) Complementary PWM generation : HAL_TIMEx_PWMN_Start(), HAL_TIMEx_PWMN_Start_DMA(), HAL_TIMEx_PWMN_Start_IT()

+           (++) Complementary One-pulse mode output : HAL_TIMEx_OnePulseN_Start(), HAL_TIMEx_OnePulseN_Start_IT()

+           (++) Hall Sensor output : HAL_TIMEx_HallSensor_Start(), HAL_TIMEx_HallSensor_Start_DMA(), HAL_TIMEx_HallSensor_Start_IT().

+

+  @endverbatim

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup TIMEx TIMEx

+  * @brief TIM Extended HAL module driver

+  * @{

+  */

+

+#ifdef HAL_TIM_MODULE_ENABLED

+

+/* Private typedef -----------------------------------------------------------*/

+/* Private define ------------------------------------------------------------*/

+/* Private macro -------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/* Private function prototypes -----------------------------------------------*/

+static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState);

+

+/* Exported functions --------------------------------------------------------*/

+/** @defgroup TIMEx_Exported_Functions TIM Extended Exported Functions

+  * @{

+  */

+

+/** @defgroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions

+  * @brief    Timer Hall Sensor functions

+  *

+@verbatim

+  ==============================================================================

+                      ##### Timer Hall Sensor functions #####

+  ==============================================================================

+  [..]

+    This section provides functions allowing to:

+    (+) Initialize and configure TIM HAL Sensor.

+    (+) De-initialize TIM HAL Sensor.

+    (+) Start the Hall Sensor Interface.

+    (+) Stop the Hall Sensor Interface.

+    (+) Start the Hall Sensor Interface and enable interrupts.

+    (+) Stop the Hall Sensor Interface and disable interrupts.

+    (+) Start the Hall Sensor Interface and enable DMA transfers.

+    (+) Stop the Hall Sensor Interface and disable DMA transfers.

+

+@endverbatim

+  * @{

+  */

+/**

+  * @brief  Initializes the TIM Hall Sensor Interface and initialize the associated handle.

+  * @param  htim TIM Hall Sensor Interface handle

+  * @param  sConfig TIM Hall Sensor configuration structure

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig)

+{

+  TIM_OC_InitTypeDef OC_Config;

+

+  /* Check the TIM handle allocation */

+  if (htim == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check the parameters */

+  assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode));

+  assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision));

+  assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload));

+  assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity));

+  assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler));

+  assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter));

+

+  if (htim->State == HAL_TIM_STATE_RESET)

+  {

+    /* Allocate lock resource and initialize it */

+    htim->Lock = HAL_UNLOCKED;

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+    /* Reset interrupt callbacks to legacy week callbacks */

+    TIM_ResetCallback(htim);

+

+    if (htim->HallSensor_MspInitCallback == NULL)

+    {

+      htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit;

+    }

+    /* Init the low level hardware : GPIO, CLOCK, NVIC */

+    htim->HallSensor_MspInitCallback(htim);

+#else

+    /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */

+    HAL_TIMEx_HallSensor_MspInit(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+  }

+

+  /* Set the TIM state */

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  /* Configure the Time base in the Encoder Mode */

+  TIM_Base_SetConfig(htim->Instance, &htim->Init);

+

+  /* Configure the Channel 1 as Input Channel to interface with the three Outputs of the  Hall sensor */

+  TIM_TI1_SetConfig(htim->Instance, sConfig->IC1Polarity, TIM_ICSELECTION_TRC, sConfig->IC1Filter);

+

+  /* Reset the IC1PSC Bits */

+  htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC;

+  /* Set the IC1PSC value */

+  htim->Instance->CCMR1 |= sConfig->IC1Prescaler;

+

+  /* Enable the Hall sensor interface (XOR function of the three inputs) */

+  htim->Instance->CR2 |= TIM_CR2_TI1S;

+

+  /* Select the TIM_TS_TI1F_ED signal as Input trigger for the TIM */

+  htim->Instance->SMCR &= ~TIM_SMCR_TS;

+  htim->Instance->SMCR |= TIM_TS_TI1F_ED;

+

+  /* Use the TIM_TS_TI1F_ED signal to reset the TIM counter each edge detection */

+  htim->Instance->SMCR &= ~TIM_SMCR_SMS;

+  htim->Instance->SMCR |= TIM_SLAVEMODE_RESET;

+

+  /* Program channel 2 in PWM 2 mode with the desired Commutation_Delay*/

+  OC_Config.OCFastMode = TIM_OCFAST_DISABLE;

+  OC_Config.OCIdleState = TIM_OCIDLESTATE_RESET;

+  OC_Config.OCMode = TIM_OCMODE_PWM2;

+  OC_Config.OCNIdleState = TIM_OCNIDLESTATE_RESET;

+  OC_Config.OCNPolarity = TIM_OCNPOLARITY_HIGH;

+  OC_Config.OCPolarity = TIM_OCPOLARITY_HIGH;

+  OC_Config.Pulse = sConfig->Commutation_Delay;

+

+  TIM_OC2_SetConfig(htim->Instance, &OC_Config);

+

+  /* Select OC2REF as trigger output on TRGO: write the MMS bits in the TIMx_CR2

+    register to 101 */

+  htim->Instance->CR2 &= ~TIM_CR2_MMS;

+  htim->Instance->CR2 |= TIM_TRGO_OC2REF;

+

+  /* Initialize the TIM state*/

+  htim->State = HAL_TIM_STATE_READY;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  DeInitializes the TIM Hall Sensor interface

+  * @param  htim TIM Hall Sensor Interface handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_INSTANCE(htim->Instance));

+

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  /* Disable the TIM Peripheral Clock */

+  __HAL_TIM_DISABLE(htim);

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+  if (htim->HallSensor_MspDeInitCallback == NULL)

+  {

+    htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit;

+  }

+  /* DeInit the low level hardware */

+  htim->HallSensor_MspDeInitCallback(htim);

+#else

+  /* DeInit the low level hardware: GPIO, CLOCK, NVIC */

+  HAL_TIMEx_HallSensor_MspDeInit(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+

+  /* Change TIM state */

+  htim->State = HAL_TIM_STATE_RESET;

+

+  /* Release Lock */

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Initializes the TIM Hall Sensor MSP.

+  * @param  htim TIM Hall Sensor Interface handle

+  * @retval None

+  */

+__weak void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIMEx_HallSensor_MspInit could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  DeInitializes TIM Hall Sensor MSP.

+  * @param  htim TIM Hall Sensor Interface handle

+  * @retval None

+  */

+__weak void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIMEx_HallSensor_MspDeInit could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Starts the TIM Hall Sensor Interface.

+  * @param  htim TIM Hall Sensor Interface handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim)

+{

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance));

+

+  /* Enable the Input Capture channel 1

+    (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */

+  TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM Hall sensor Interface.

+  * @param  htim TIM Hall Sensor Interface handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance));

+

+  /* Disable the Input Capture channels 1, 2 and 3

+    (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */

+  TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Starts the TIM Hall Sensor Interface in interrupt mode.

+  * @param  htim TIM Hall Sensor Interface handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim)

+{

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance));

+

+  /* Enable the capture compare Interrupts 1 event */

+  __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);

+

+  /* Enable the Input Capture channel 1

+    (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */

+  TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM Hall Sensor Interface in interrupt mode.

+  * @param  htim TIM Hall Sensor Interface handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance));

+

+  /* Disable the Input Capture channel 1

+    (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */

+  TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);

+

+  /* Disable the capture compare Interrupts event */

+  __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Starts the TIM Hall Sensor Interface in DMA mode.

+  * @param  htim TIM Hall Sensor Interface handle

+  * @param  pData The destination Buffer address.

+  * @param  Length The length of data to be transferred from TIM peripheral to memory.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length)

+{

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance));

+

+  if ((htim->State == HAL_TIM_STATE_BUSY))

+  {

+    return HAL_BUSY;

+  }

+  else if ((htim->State == HAL_TIM_STATE_READY))

+  {

+    if (((uint32_t)pData == 0U) && (Length > 0U))

+    {

+      return HAL_ERROR;

+    }

+    else

+    {

+      htim->State = HAL_TIM_STATE_BUSY;

+    }

+  }

+  else

+  {

+    /* nothing to do */

+  }

+  /* Enable the Input Capture channel 1

+    (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */

+  TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);

+

+  /* Set the DMA Input Capture 1 Callbacks */

+  htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt;

+  htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt;

+  /* Set the DMA error callback */

+  htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;

+

+  /* Enable the DMA channel for Capture 1*/

+  if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, Length) != HAL_OK)

+  {

+    return HAL_ERROR;

+  }

+  /* Enable the capture compare 1 Interrupt */

+  __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1);

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM Hall Sensor Interface in DMA mode.

+  * @param  htim TIM Hall Sensor Interface handle

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance));

+

+  /* Disable the Input Capture channel 1

+    (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, TIM_CHANNEL_2 and TIM_CHANNEL_3) */

+  TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE);

+

+

+  /* Disable the capture compare Interrupts 1 event */

+  __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1);

+

+  (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]);

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions

+  *  @brief   Timer Complementary Output Compare functions

+  *

+@verbatim

+  ==============================================================================

+              ##### Timer Complementary Output Compare functions #####

+  ==============================================================================

+  [..]

+    This section provides functions allowing to:

+    (+) Start the Complementary Output Compare/PWM.

+    (+) Stop the Complementary Output Compare/PWM.

+    (+) Start the Complementary Output Compare/PWM and enable interrupts.

+    (+) Stop the Complementary Output Compare/PWM and disable interrupts.

+    (+) Start the Complementary Output Compare/PWM and enable DMA transfers.

+    (+) Stop the Complementary Output Compare/PWM and disable DMA transfers.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Starts the TIM Output Compare signal generation on the complementary

+  *         output.

+  * @param  htim TIM Output Compare handle

+  * @param  Channel TIM Channel to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));

+

+  /* Enable the Capture compare channel N */

+  TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE);

+

+  /* Enable the Main Output */

+  __HAL_TIM_MOE_ENABLE(htim);

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM Output Compare signal generation on the complementary

+  *         output.

+  * @param  htim TIM handle

+  * @param  Channel TIM Channel to be disabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));

+

+  /* Disable the Capture compare channel N */

+  TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE);

+

+  /* Disable the Main Output */

+  __HAL_TIM_MOE_DISABLE(htim);

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Starts the TIM Output Compare signal generation in interrupt mode

+  *         on the complementary output.

+  * @param  htim TIM OC handle

+  * @param  Channel TIM Channel to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Enable the TIM Output Compare interrupt */

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Enable the TIM Output Compare interrupt */

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Enable the TIM Output Compare interrupt */

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3);

+      break;

+    }

+

+

+    default:

+      break;

+  }

+

+  /* Enable the TIM Break interrupt */

+  __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK);

+

+  /* Enable the Capture compare channel N */

+  TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE);

+

+  /* Enable the Main Output */

+  __HAL_TIM_MOE_ENABLE(htim);

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM Output Compare signal generation in interrupt mode

+  *         on the complementary output.

+  * @param  htim TIM Output Compare handle

+  * @param  Channel TIM Channel to be disabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  uint32_t tmpccer;

+  /* Check the parameters */

+  assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Disable the TIM Output Compare interrupt */

+      __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Disable the TIM Output Compare interrupt */

+      __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Disable the TIM Output Compare interrupt */

+      __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3);

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  /* Disable the Capture compare channel N */

+  TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE);

+

+  /* Disable the TIM Break interrupt (only if no more channel is active) */

+  tmpccer = htim->Instance->CCER;

+  if ((tmpccer & (TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) == (uint32_t)RESET)

+  {

+    __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK);

+  }

+

+  /* Disable the Main Output */

+  __HAL_TIM_MOE_DISABLE(htim);

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Starts the TIM Output Compare signal generation in DMA mode

+  *         on the complementary output.

+  * @param  htim TIM Output Compare handle

+  * @param  Channel TIM Channel to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  * @param  pData The source Buffer address.

+  * @param  Length The length of data to be transferred from memory to TIM peripheral

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length)

+{

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));

+

+  if ((htim->State == HAL_TIM_STATE_BUSY))

+  {

+    return HAL_BUSY;

+  }

+  else if ((htim->State == HAL_TIM_STATE_READY))

+  {

+    if (((uint32_t)pData == 0U) && (Length > 0U))

+    {

+      return HAL_ERROR;

+    }

+    else

+    {

+      htim->State = HAL_TIM_STATE_BUSY;

+    }

+  }

+  else

+  {

+    /* nothing to do  */

+  }

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Set the DMA compare callbacks */

+      htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt;

+      htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      /* Enable the TIM Output Compare DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Set the DMA compare callbacks */

+      htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt;

+      htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      /* Enable the TIM Output Compare DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Set the DMA compare callbacks */

+      htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt;

+      htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      /* Enable the TIM Output Compare DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3);

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  /* Enable the Capture compare channel N */

+  TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE);

+

+  /* Enable the Main Output */

+  __HAL_TIM_MOE_ENABLE(htim);

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM Output Compare signal generation in DMA mode

+  *         on the complementary output.

+  * @param  htim TIM Output Compare handle

+  * @param  Channel TIM Channel to be disabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Disable the TIM Output Compare DMA request */

+      __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1);

+      (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Disable the TIM Output Compare DMA request */

+      __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2);

+      (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Disable the TIM Output Compare DMA request */

+      __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3);

+      (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]);

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  /* Disable the Capture compare channel N */

+  TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE);

+

+  /* Disable the Main Output */

+  __HAL_TIM_MOE_DISABLE(htim);

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Change the htim state */

+  htim->State = HAL_TIM_STATE_READY;

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions

+  * @brief    Timer Complementary PWM functions

+  *

+@verbatim

+  ==============================================================================

+                 ##### Timer Complementary PWM functions #####

+  ==============================================================================

+  [..]

+    This section provides functions allowing to:

+    (+) Start the Complementary PWM.

+    (+) Stop the Complementary PWM.

+    (+) Start the Complementary PWM and enable interrupts.

+    (+) Stop the Complementary PWM and disable interrupts.

+    (+) Start the Complementary PWM and enable DMA transfers.

+    (+) Stop the Complementary PWM and disable DMA transfers.

+    (+) Start the Complementary Input Capture measurement.

+    (+) Stop the Complementary Input Capture.

+    (+) Start the Complementary Input Capture and enable interrupts.

+    (+) Stop the Complementary Input Capture and disable interrupts.

+    (+) Start the Complementary Input Capture and enable DMA transfers.

+    (+) Stop the Complementary Input Capture and disable DMA transfers.

+    (+) Start the Complementary One Pulse generation.

+    (+) Stop the Complementary One Pulse.

+    (+) Start the Complementary One Pulse and enable interrupts.

+    (+) Stop the Complementary One Pulse and disable interrupts.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Starts the PWM signal generation on the complementary output.

+  * @param  htim TIM handle

+  * @param  Channel TIM Channel to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));

+

+  /* Enable the complementary PWM output  */

+  TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE);

+

+  /* Enable the Main Output */

+  __HAL_TIM_MOE_ENABLE(htim);

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the PWM signal generation on the complementary output.

+  * @param  htim TIM handle

+  * @param  Channel TIM Channel to be disabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));

+

+  /* Disable the complementary PWM output  */

+  TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE);

+

+  /* Disable the Main Output */

+  __HAL_TIM_MOE_DISABLE(htim);

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Starts the PWM signal generation in interrupt mode on the

+  *         complementary output.

+  * @param  htim TIM handle

+  * @param  Channel TIM Channel to be disabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Enable the TIM Capture/Compare 1 interrupt */

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Enable the TIM Capture/Compare 2 interrupt */

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Enable the TIM Capture/Compare 3 interrupt */

+      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3);

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  /* Enable the TIM Break interrupt */

+  __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK);

+

+  /* Enable the complementary PWM output  */

+  TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE);

+

+  /* Enable the Main Output */

+  __HAL_TIM_MOE_ENABLE(htim);

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the PWM signal generation in interrupt mode on the

+  *         complementary output.

+  * @param  htim TIM handle

+  * @param  Channel TIM Channel to be disabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  uint32_t tmpccer;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Disable the TIM Capture/Compare 1 interrupt */

+      __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Disable the TIM Capture/Compare 2 interrupt */

+      __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Disable the TIM Capture/Compare 3 interrupt */

+      __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3);

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  /* Disable the complementary PWM output  */

+  TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE);

+

+  /* Disable the TIM Break interrupt (only if no more channel is active) */

+  tmpccer = htim->Instance->CCER;

+  if ((tmpccer & (TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) == (uint32_t)RESET)

+  {

+    __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK);

+  }

+

+  /* Disable the Main Output */

+  __HAL_TIM_MOE_DISABLE(htim);

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Starts the TIM PWM signal generation in DMA mode on the

+  *         complementary output

+  * @param  htim TIM handle

+  * @param  Channel TIM Channel to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  * @param  pData The source Buffer address.

+  * @param  Length The length of data to be transferred from memory to TIM peripheral

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length)

+{

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));

+

+  if ((htim->State == HAL_TIM_STATE_BUSY))

+  {

+    return HAL_BUSY;

+  }

+  else if ((htim->State == HAL_TIM_STATE_READY))

+  {

+    if (((uint32_t)pData == 0U) && (Length > 0U))

+    {

+      return HAL_ERROR;

+    }

+    else

+    {

+      htim->State = HAL_TIM_STATE_BUSY;

+    }

+  }

+  else

+  {

+    /* nothing to do */

+  }

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Set the DMA compare callbacks */

+      htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt;

+      htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      /* Enable the TIM Capture/Compare 1 DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Set the DMA compare callbacks */

+      htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt;

+      htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      /* Enable the TIM Capture/Compare 2 DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Set the DMA compare callbacks */

+      htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt;

+      htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt;

+

+      /* Set the DMA error callback */

+      htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, Length) != HAL_OK)

+      {

+        return HAL_ERROR;

+      }

+      /* Enable the TIM Capture/Compare 3 DMA request */

+      __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3);

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  /* Enable the complementary PWM output  */

+  TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE);

+

+  /* Enable the Main Output */

+  __HAL_TIM_MOE_ENABLE(htim);

+

+  /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */

+  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;

+  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))

+  {

+    __HAL_TIM_ENABLE(htim);

+  }

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM PWM signal generation in DMA mode on the complementary

+  *         output

+  * @param  htim TIM handle

+  * @param  Channel TIM Channel to be disabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel));

+

+  switch (Channel)

+  {

+    case TIM_CHANNEL_1:

+    {

+      /* Disable the TIM Capture/Compare 1 DMA request */

+      __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1);

+      (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]);

+      break;

+    }

+

+    case TIM_CHANNEL_2:

+    {

+      /* Disable the TIM Capture/Compare 2 DMA request */

+      __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2);

+      (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]);

+      break;

+    }

+

+    case TIM_CHANNEL_3:

+    {

+      /* Disable the TIM Capture/Compare 3 DMA request */

+      __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3);

+      (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]);

+      break;

+    }

+

+    default:

+      break;

+  }

+

+  /* Disable the complementary PWM output */

+  TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE);

+

+  /* Disable the Main Output */

+  __HAL_TIM_MOE_DISABLE(htim);

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Change the htim state */

+  htim->State = HAL_TIM_STATE_READY;

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions

+  * @brief    Timer Complementary One Pulse functions

+  *

+@verbatim

+  ==============================================================================

+                ##### Timer Complementary One Pulse functions #####

+  ==============================================================================

+  [..]

+    This section provides functions allowing to:

+    (+) Start the Complementary One Pulse generation.

+    (+) Stop the Complementary One Pulse.

+    (+) Start the Complementary One Pulse and enable interrupts.

+    (+) Stop the Complementary One Pulse and disable interrupts.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Starts the TIM One Pulse signal generation on the complementary

+  *         output.

+  * @param  htim TIM One Pulse handle

+  * @param  OutputChannel TIM Channel to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel));

+

+  /* Enable the complementary One Pulse output */

+  TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE);

+

+  /* Enable the Main Output */

+  __HAL_TIM_MOE_ENABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM One Pulse signal generation on the complementary

+  *         output.

+  * @param  htim TIM One Pulse handle

+  * @param  OutputChannel TIM Channel to be disabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel)

+{

+

+  /* Check the parameters */

+  assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel));

+

+  /* Disable the complementary One Pulse output */

+  TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE);

+

+  /* Disable the Main Output */

+  __HAL_TIM_MOE_DISABLE(htim);

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Starts the TIM One Pulse signal generation in interrupt mode on the

+  *         complementary channel.

+  * @param  htim TIM One Pulse handle

+  * @param  OutputChannel TIM Channel to be enabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel));

+

+  /* Enable the TIM Capture/Compare 1 interrupt */

+  __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);

+

+  /* Enable the TIM Capture/Compare 2 interrupt */

+  __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);

+

+  /* Enable the complementary One Pulse output */

+  TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE);

+

+  /* Enable the Main Output */

+  __HAL_TIM_MOE_ENABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stops the TIM One Pulse signal generation in interrupt mode on the

+  *         complementary channel.

+  * @param  htim TIM One Pulse handle

+  * @param  OutputChannel TIM Channel to be disabled

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected

+  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel));

+

+  /* Disable the TIM Capture/Compare 1 interrupt */

+  __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1);

+

+  /* Disable the TIM Capture/Compare 2 interrupt */

+  __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2);

+

+  /* Disable the complementary One Pulse output */

+  TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE);

+

+  /* Disable the Main Output */

+  __HAL_TIM_MOE_DISABLE(htim);

+

+  /* Disable the Peripheral */

+  __HAL_TIM_DISABLE(htim);

+

+  /* Return function status */

+  return HAL_OK;

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions

+  * @brief    Peripheral Control functions

+  *

+@verbatim

+  ==============================================================================

+                    ##### Peripheral Control functions #####

+  ==============================================================================

+  [..]

+    This section provides functions allowing to:

+      (+) Configure the commutation event in case of use of the Hall sensor interface.

+      (+) Configure Output channels for OC and PWM mode.

+

+      (+) Configure Complementary channels, break features and dead time.

+      (+) Configure Master synchronization.

+      (+) Configure timer remapping capabilities.

+      (+) Enable or disable channel grouping.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Configure the TIM commutation event sequence.

+  * @note  This function is mandatory to use the commutation event in order to

+  *        update the configuration at each commutation detection on the TRGI input of the Timer,

+  *        the typical use of this feature is with the use of another Timer(interface Timer)

+  *        configured in Hall sensor interface, this interface Timer will generate the

+  *        commutation at its TRGO output (connected to Timer used in this function) each time

+  *        the TI1 of the Interface Timer detect a commutation at its input TI1.

+  * @param  htim TIM handle

+  * @param  InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor

+  *          This parameter can be one of the following values:

+  *            @arg TIM_TS_ITR0: Internal trigger 0 selected

+  *            @arg TIM_TS_ITR1: Internal trigger 1 selected

+  *            @arg TIM_TS_ITR2: Internal trigger 2 selected

+  *            @arg TIM_TS_ITR3: Internal trigger 3 selected

+  *            @arg TIM_TS_NONE: No trigger is needed

+  * @param  CommutationSource the Commutation Event source

+  *          This parameter can be one of the following values:

+  *            @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer

+  *            @arg TIM_COMMUTATION_SOFTWARE:  Commutation source is set by software using the COMG bit

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t  InputTrigger,

+                                              uint32_t  CommutationSource)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger));

+

+  __HAL_LOCK(htim);

+

+  if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) ||

+      (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3))

+  {

+    /* Select the Input trigger */

+    htim->Instance->SMCR &= ~TIM_SMCR_TS;

+    htim->Instance->SMCR |= InputTrigger;

+  }

+

+  /* Select the Capture Compare preload feature */

+  htim->Instance->CR2 |= TIM_CR2_CCPC;

+  /* Select the Commutation event source */

+  htim->Instance->CR2 &= ~TIM_CR2_CCUS;

+  htim->Instance->CR2 |= CommutationSource;

+

+  /* Disable Commutation Interrupt */

+  __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM);

+

+  /* Disable Commutation DMA request */

+  __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM);

+

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Configure the TIM commutation event sequence with interrupt.

+  * @note  This function is mandatory to use the commutation event in order to

+  *        update the configuration at each commutation detection on the TRGI input of the Timer,

+  *        the typical use of this feature is with the use of another Timer(interface Timer)

+  *        configured in Hall sensor interface, this interface Timer will generate the

+  *        commutation at its TRGO output (connected to Timer used in this function) each time

+  *        the TI1 of the Interface Timer detect a commutation at its input TI1.

+  * @param  htim TIM handle

+  * @param  InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor

+  *          This parameter can be one of the following values:

+  *            @arg TIM_TS_ITR0: Internal trigger 0 selected

+  *            @arg TIM_TS_ITR1: Internal trigger 1 selected

+  *            @arg TIM_TS_ITR2: Internal trigger 2 selected

+  *            @arg TIM_TS_ITR3: Internal trigger 3 selected

+  *            @arg TIM_TS_NONE: No trigger is needed

+  * @param  CommutationSource the Commutation Event source

+  *          This parameter can be one of the following values:

+  *            @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer

+  *            @arg TIM_COMMUTATION_SOFTWARE:  Commutation source is set by software using the COMG bit

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t  InputTrigger,

+                                                 uint32_t  CommutationSource)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger));

+

+  __HAL_LOCK(htim);

+

+  if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) ||

+      (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3))

+  {

+    /* Select the Input trigger */

+    htim->Instance->SMCR &= ~TIM_SMCR_TS;

+    htim->Instance->SMCR |= InputTrigger;

+  }

+

+  /* Select the Capture Compare preload feature */

+  htim->Instance->CR2 |= TIM_CR2_CCPC;

+  /* Select the Commutation event source */

+  htim->Instance->CR2 &= ~TIM_CR2_CCUS;

+  htim->Instance->CR2 |= CommutationSource;

+

+  /* Disable Commutation DMA request */

+  __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM);

+

+  /* Enable the Commutation Interrupt */

+  __HAL_TIM_ENABLE_IT(htim, TIM_IT_COM);

+

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Configure the TIM commutation event sequence with DMA.

+  * @note  This function is mandatory to use the commutation event in order to

+  *        update the configuration at each commutation detection on the TRGI input of the Timer,

+  *        the typical use of this feature is with the use of another Timer(interface Timer)

+  *        configured in Hall sensor interface, this interface Timer will generate the

+  *        commutation at its TRGO output (connected to Timer used in this function) each time

+  *        the TI1 of the Interface Timer detect a commutation at its input TI1.

+  * @note  The user should configure the DMA in his own software, in This function only the COMDE bit is set

+  * @param  htim TIM handle

+  * @param  InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor

+  *          This parameter can be one of the following values:

+  *            @arg TIM_TS_ITR0: Internal trigger 0 selected

+  *            @arg TIM_TS_ITR1: Internal trigger 1 selected

+  *            @arg TIM_TS_ITR2: Internal trigger 2 selected

+  *            @arg TIM_TS_ITR3: Internal trigger 3 selected

+  *            @arg TIM_TS_NONE: No trigger is needed

+  * @param  CommutationSource the Commutation Event source

+  *          This parameter can be one of the following values:

+  *            @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer

+  *            @arg TIM_COMMUTATION_SOFTWARE:  Commutation source is set by software using the COMG bit

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t  InputTrigger,

+                                                  uint32_t  CommutationSource)

+{

+  /* Check the parameters */

+  assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger));

+

+  __HAL_LOCK(htim);

+

+  if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) ||

+      (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3))

+  {

+    /* Select the Input trigger */

+    htim->Instance->SMCR &= ~TIM_SMCR_TS;

+    htim->Instance->SMCR |= InputTrigger;

+  }

+

+  /* Select the Capture Compare preload feature */

+  htim->Instance->CR2 |= TIM_CR2_CCPC;

+  /* Select the Commutation event source */

+  htim->Instance->CR2 &= ~TIM_CR2_CCUS;

+  htim->Instance->CR2 |= CommutationSource;

+

+  /* Enable the Commutation DMA Request */

+  /* Set the DMA Commutation Callback */

+  htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt;

+  htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt;

+  /* Set the DMA error callback */

+  htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError;

+

+  /* Disable Commutation Interrupt */

+  __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM);

+

+  /* Enable the Commutation DMA Request */

+  __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_COM);

+

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Configures the TIM in master mode.

+  * @param  htim TIM handle.

+  * @param  sMasterConfig pointer to a TIM_MasterConfigTypeDef structure that

+  *         contains the selected trigger output (TRGO) and the Master/Slave

+  *         mode.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim,

+                                                        TIM_MasterConfigTypeDef *sMasterConfig)

+{

+  uint32_t tmpcr2;

+  uint32_t tmpsmcr;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_SYNCHRO_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_TRGO_SOURCE(sMasterConfig->MasterOutputTrigger));

+  assert_param(IS_TIM_MSM_STATE(sMasterConfig->MasterSlaveMode));

+

+  /* Check input state */

+  __HAL_LOCK(htim);

+

+  /* Change the handler state */

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  /* Get the TIMx CR2 register value */

+  tmpcr2 = htim->Instance->CR2;

+

+  /* Get the TIMx SMCR register value */

+  tmpsmcr = htim->Instance->SMCR;

+

+  /* If the timer supports ADC synchronization through TRGO2, set the master mode selection 2 */

+  if (IS_TIM_TRGO2_INSTANCE(htim->Instance))

+  {

+    /* Check the parameters */

+    assert_param(IS_TIM_TRGO2_SOURCE(sMasterConfig->MasterOutputTrigger2));

+

+    /* Clear the MMS2 bits */

+    tmpcr2 &= ~TIM_CR2_MMS2;

+    /* Select the TRGO2 source*/

+    tmpcr2 |= sMasterConfig->MasterOutputTrigger2;

+  }

+

+  /* Reset the MMS Bits */

+  tmpcr2 &= ~TIM_CR2_MMS;

+  /* Select the TRGO source */

+  tmpcr2 |=  sMasterConfig->MasterOutputTrigger;

+

+  /* Reset the MSM Bit */

+  tmpsmcr &= ~TIM_SMCR_MSM;

+  /* Set master mode */

+  tmpsmcr |= sMasterConfig->MasterSlaveMode;

+

+  /* Update TIMx CR2 */

+  htim->Instance->CR2 = tmpcr2;

+

+  /* Update TIMx SMCR */

+  htim->Instance->SMCR = tmpsmcr;

+

+  /* Change the htim state */

+  htim->State = HAL_TIM_STATE_READY;

+

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Configures the Break feature, dead time, Lock level, OSSI/OSSR State

+  *         and the AOE(automatic output enable).

+  * @param  htim TIM handle

+  * @param  sBreakDeadTimeConfig pointer to a TIM_ConfigBreakDeadConfigTypeDef structure that

+  *         contains the BDTR Register configuration  information for the TIM peripheral.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim,

+                                                TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig)

+{

+  /* Keep this variable initialized to 0 as it is used to configure BDTR register */

+  uint32_t tmpbdtr = 0U;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_OSSR_STATE(sBreakDeadTimeConfig->OffStateRunMode));

+  assert_param(IS_TIM_OSSI_STATE(sBreakDeadTimeConfig->OffStateIDLEMode));

+  assert_param(IS_TIM_LOCK_LEVEL(sBreakDeadTimeConfig->LockLevel));

+  assert_param(IS_TIM_DEADTIME(sBreakDeadTimeConfig->DeadTime));

+  assert_param(IS_TIM_BREAK_STATE(sBreakDeadTimeConfig->BreakState));

+  assert_param(IS_TIM_BREAK_POLARITY(sBreakDeadTimeConfig->BreakPolarity));

+  assert_param(IS_TIM_BREAK_FILTER(sBreakDeadTimeConfig->BreakFilter));

+  assert_param(IS_TIM_AUTOMATIC_OUTPUT_STATE(sBreakDeadTimeConfig->AutomaticOutput));

+

+  /* Check input state */

+  __HAL_LOCK(htim);

+

+  /* Set the Lock level, the Break enable Bit and the Polarity, the OSSR State,

+     the OSSI State, the dead time value and the Automatic Output Enable Bit */

+

+  /* Set the BDTR bits */

+  MODIFY_REG(tmpbdtr, TIM_BDTR_DTG, sBreakDeadTimeConfig->DeadTime);

+  MODIFY_REG(tmpbdtr, TIM_BDTR_LOCK, sBreakDeadTimeConfig->LockLevel);

+  MODIFY_REG(tmpbdtr, TIM_BDTR_OSSI, sBreakDeadTimeConfig->OffStateIDLEMode);

+  MODIFY_REG(tmpbdtr, TIM_BDTR_OSSR, sBreakDeadTimeConfig->OffStateRunMode);

+  MODIFY_REG(tmpbdtr, TIM_BDTR_BKE, sBreakDeadTimeConfig->BreakState);

+  MODIFY_REG(tmpbdtr, TIM_BDTR_BKP, sBreakDeadTimeConfig->BreakPolarity);

+  MODIFY_REG(tmpbdtr, TIM_BDTR_AOE, sBreakDeadTimeConfig->AutomaticOutput);

+  MODIFY_REG(tmpbdtr, TIM_BDTR_BKF, (sBreakDeadTimeConfig->BreakFilter << TIM_BDTR_BKF_Pos));

+

+  if (IS_TIM_BKIN2_INSTANCE(htim->Instance))

+  {

+    /* Check the parameters */

+    assert_param(IS_TIM_BREAK2_STATE(sBreakDeadTimeConfig->Break2State));

+    assert_param(IS_TIM_BREAK2_POLARITY(sBreakDeadTimeConfig->Break2Polarity));

+    assert_param(IS_TIM_BREAK_FILTER(sBreakDeadTimeConfig->Break2Filter));

+

+    /* Set the BREAK2 input related BDTR bits */

+    MODIFY_REG(tmpbdtr, TIM_BDTR_BK2F, (sBreakDeadTimeConfig->Break2Filter << TIM_BDTR_BK2F_Pos));

+    MODIFY_REG(tmpbdtr, TIM_BDTR_BK2E, sBreakDeadTimeConfig->Break2State);

+    MODIFY_REG(tmpbdtr, TIM_BDTR_BK2P, sBreakDeadTimeConfig->Break2Polarity);

+  }

+

+  /* Set TIMx_BDTR */

+  htim->Instance->BDTR = tmpbdtr;

+

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Configures the break input source.

+  * @param  htim TIM handle.

+  * @param  BreakInput Break input to configure

+  *          This parameter can be one of the following values:

+  *            @arg TIM_BREAKINPUT_BRK: Timer break input

+  *            @arg TIM_BREAKINPUT_BRK2: Timer break 2 input

+  * @param  sBreakInputConfig Break input source configuration

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim,

+                                             uint32_t BreakInput,

+                                             TIMEx_BreakInputConfigTypeDef *sBreakInputConfig)

+

+{

+  uint32_t tmporx;

+  uint32_t bkin_enable_mask = 0U;

+  uint32_t bkin_polarity_mask = 0U;

+  uint32_t bkin_enable_bitpos = 0U;

+  uint32_t bkin_polarity_bitpos = 0U;

+

+  /* Check the parameters */

+  assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_BREAKINPUT(BreakInput));

+  assert_param(IS_TIM_BREAKINPUTSOURCE(sBreakInputConfig->Source));

+  assert_param(IS_TIM_BREAKINPUTSOURCE_STATE(sBreakInputConfig->Enable));

+#if defined(DFSDM1_Channel0)

+  if (sBreakInputConfig->Source != TIM_BREAKINPUTSOURCE_DFSDM1)

+  {

+    assert_param(IS_TIM_BREAKINPUTSOURCE_POLARITY(sBreakInputConfig->Polarity));

+  }

+#else

+  assert_param(IS_TIM_BREAKINPUTSOURCE_POLARITY(sBreakInputConfig->Polarity));

+#endif /* DFSDM1_Channel0 */

+

+  /* Check input state */

+  __HAL_LOCK(htim);

+

+  switch (sBreakInputConfig->Source)

+  {

+    case TIM_BREAKINPUTSOURCE_BKIN:

+    {

+      bkin_enable_mask = TIM1_OR2_BKINE;

+      bkin_enable_bitpos = TIM1_OR2_BKINE_Pos;

+      bkin_polarity_mask = TIM1_OR2_BKINP;

+      bkin_polarity_bitpos = TIM1_OR2_BKINP_Pos;

+      break;

+    }

+    case TIM_BREAKINPUTSOURCE_COMP1:

+    {

+      bkin_enable_mask = TIM1_OR2_BKCMP1E;

+      bkin_enable_bitpos = TIM1_OR2_BKCMP1E_Pos;

+      bkin_polarity_mask = TIM1_OR2_BKCMP1P;

+      bkin_polarity_bitpos = TIM1_OR2_BKCMP1P_Pos;

+      break;

+    }

+    case TIM_BREAKINPUTSOURCE_COMP2:

+    {

+      bkin_enable_mask = TIM1_OR2_BKCMP2E;

+      bkin_enable_bitpos = TIM1_OR2_BKCMP2E_Pos;

+      bkin_polarity_mask = TIM1_OR2_BKCMP2P;

+      bkin_polarity_bitpos = TIM1_OR2_BKCMP2P_Pos;

+      break;

+    }

+#if defined(DFSDM1_Channel0)

+    case TIM_BREAKINPUTSOURCE_DFSDM1:

+    {

+      bkin_enable_mask = TIM1_OR2_BKDF1BK0E;

+      bkin_enable_bitpos = 8U;

+      break;

+    }

+#endif /* DFSDM1_Channel0 */

+

+    default:

+      break;

+  }

+

+  switch (BreakInput)

+  {

+    case TIM_BREAKINPUT_BRK:

+    {

+      /* Get the TIMx_OR2 register value */

+      tmporx = htim->Instance->OR2;

+

+      /* Enable the break input */

+      tmporx &= ~bkin_enable_mask;

+      tmporx |= (sBreakInputConfig->Enable << bkin_enable_bitpos) & bkin_enable_mask;

+

+      /* Set the break input polarity */

+#if defined(DFSDM1_Channel0)

+      if (sBreakInputConfig->Source != TIM_BREAKINPUTSOURCE_DFSDM1)

+#endif /* DFSDM1_Channel0 */

+      {

+        tmporx &= ~bkin_polarity_mask;

+        tmporx |= (sBreakInputConfig->Polarity << bkin_polarity_bitpos) & bkin_polarity_mask;

+      }

+

+      /* Set TIMx_OR2 */

+      htim->Instance->OR2 = tmporx;

+      break;

+    }

+    case TIM_BREAKINPUT_BRK2:

+    {

+      /* Get the TIMx_OR3 register value */

+      tmporx = htim->Instance->OR3;

+

+      /* Enable the break input */

+      tmporx &= ~bkin_enable_mask;

+      tmporx |= (sBreakInputConfig->Enable << bkin_enable_bitpos) & bkin_enable_mask;

+

+      /* Set the break input polarity */

+#if defined(DFSDM1_Channel0)

+      if (sBreakInputConfig->Source != TIM_BREAKINPUTSOURCE_DFSDM1)

+#endif /* DFSDM1_Channel0 */

+      {

+        tmporx &= ~bkin_polarity_mask;

+        tmporx |= (sBreakInputConfig->Polarity << bkin_polarity_bitpos) & bkin_polarity_mask;

+      }

+

+      /* Set TIMx_OR3 */

+      htim->Instance->OR3 = tmporx;

+      break;

+    }

+    default:

+      break;

+  }

+

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Configures the TIMx Remapping input capabilities.

+  * @param  htim TIM handle.

+  * @param  Remap specifies the TIM remapping source.

+    @if STM32L422xx

+  *         For TIM1, the parameter is a combination of 2 fields (field1 | field2):

+  *

+  *                   field1 can have the following values:

+  *            @arg TIM_TIM1_ETR_ADC1_NONE:           TIM1_ETR is not connected to any ADC1 AWD (analog watchdog)

+  *            @arg TIM_TIM1_ETR_ADC1_AWD1:           TIM1_ETR is connected to ADC1 AWD1

+  *            @arg TIM_TIM1_ETR_ADC1_AWD2:           TIM1_ETR is connected to ADC1 AWD2

+  *            @arg TIM_TIM1_ETR_ADC1_AWD3:           TIM1_ETR is connected to ADC1 AWD3

+  *

+  *                   field2 can have the following values:

+  *            @arg TIM_TIM1_TI1_GPIO:                TIM1 TI1 is connected to GPIO

+  *            @arg TIM_TIM1_TI1_COMP1:               TIM1 TI1 is connected to COMP1 output

+  *

+  @endif

+@if STM32L486xx

+  *         For TIM1, the parameter is a combination of 4 fields (field1 | field2 | field3 | field4):

+  *

+  *                   field1 can have the following values:

+  *            @arg TIM_TIM1_ETR_ADC1_NONE:           TIM1_ETR is not connected to any ADC1 AWD (analog watchdog)

+  *            @arg TIM_TIM1_ETR_ADC1_AWD1:           TIM1_ETR is connected to ADC1 AWD1

+  *            @arg TIM_TIM1_ETR_ADC1_AWD2:           TIM1_ETR is connected to ADC1 AWD2

+  *            @arg TIM_TIM1_ETR_ADC1_AWD3:           TIM1_ETR is connected to ADC1 AWD3

+  *

+  *                   field2 can have the following values:

+  *            @arg TIM_TIM1_ETR_ADC3_NONE:           TIM1_ETR is not connected to any ADC3 AWD (analog watchdog)

+  *            @arg TIM_TIM1_ETR_ADC3_AWD1:           TIM1_ETR is connected to ADC3 AWD1

+  *            @arg TIM_TIM1_ETR_ADC3_AWD2:           TIM1_ETR is connected to ADC3 AWD2

+  *            @arg TIM_TIM1_ETR_ADC3_AWD3:           TIM1_ETR is connected to ADC3 AWD3

+  *

+  *                   field3 can have the following values:

+  *            @arg TIM_TIM1_TI1_GPIO:                TIM1 TI1 is connected to GPIO

+  *            @arg TIM_TIM1_TI1_COMP1:               TIM1 TI1 is connected to COMP1 output

+  *

+  *                   field4 can have the following values:

+  *            @arg TIM_TIM1_ETR_COMP1:               TIM1_ETR is connected to COMP1 output

+  *            @arg TIM_TIM1_ETR_COMP2:               TIM1_ETR is connected to COMP2 output

+  *            @note  When field4 is set to TIM_TIM1_ETR_COMP1 or TIM_TIM1_ETR_COMP2 field1 and field2 values are not significant

+  @endif

+  @if STM32L443xx

+  *         For TIM1, the parameter is a combination of 3 fields (field1 | field2 | field3):

+  *

+  *                   field1 can have the following values:

+  *            @arg TIM_TIM1_ETR_ADC1_NONE:           TIM1_ETR is not connected to any ADC1 AWD (analog watchdog)

+  *            @arg TIM_TIM1_ETR_ADC1_AWD1:           TIM1_ETR is connected to ADC1 AWD1

+  *            @arg TIM_TIM1_ETR_ADC1_AWD2:           TIM1_ETR is connected to ADC1 AWD2

+  *            @arg TIM_TIM1_ETR_ADC1_AWD3:           TIM1_ETR is connected to ADC1 AWD3

+  *

+  *                   field2 can have the following values:

+  *            @arg TIM_TIM1_TI1_GPIO:                TIM1 TI1 is connected to GPIO

+  *            @arg TIM_TIM1_TI1_COMP1:               TIM1 TI1 is connected to COMP1 output

+  *

+  *                   field3 can have the following values:

+  *            @arg TIM_TIM1_ETR_COMP1:               TIM1_ETR is connected to COMP1 output

+  *            @arg TIM_TIM1_ETR_COMP2:               TIM1_ETR is connected to COMP2 output

+  *

+  *            @note  When field3 is set to TIM_TIM1_ETR_COMP1 or TIM_TIM1_ETR_COMP2 field1 values is not significant

+  *

+  @endif

+  @if STM32L486xx

+  *         For TIM2, the parameter is a combination of 3 fields (field1 | field2 | field3):

+  *

+  *                   field1 can have the following values:

+  *            @arg TIM_TIM2_ITR1_TIM8_TRGO:          TIM2_ITR1 is connected to TIM8_TRGO

+  *            @arg TIM_TIM2_ITR1_OTG_FS_SOF:         TIM2_ITR1 is connected to OTG_FS SOF

+  *

+  *                   field2 can have the following values:

+  *            @arg TIM_TIM2_ETR_GPIO:                TIM2_ETR is connected to GPIO

+  *            @arg TIM_TIM2_ETR_LSE:                 TIM2_ETR is connected to LSE

+  *            @arg TIM_TIM2_ETR_COMP1:               TIM2_ETR is connected to COMP1 output

+  *            @arg TIM_TIM2_ETR_COMP2:               TIM2_ETR is connected to COMP2 output

+  *

+  *                   field3 can have the following values:

+  *            @arg TIM_TIM2_TI4_GPIO:                TIM2 TI4 is connected to GPIO

+  *            @arg TIM_TIM2_TI4_COMP1:               TIM2 TI4 is connected to COMP1 output

+  *            @arg TIM_TIM2_TI4_COMP2:               TIM2 TI4 is connected to COMP2 output

+  *            @arg TIM_TIM2_TI4_COMP1_COMP2:         TIM2 TI4 is connected to logical OR between COMP1 and COMP2 output

+  @endif

+  @if STM32L422xx

+  *         For TIM2, the parameter is a combination of 3 fields (field1 | field2 | field3):

+  *

+  *                   field1 can have the following values:

+  *            @arg TIM_TIM2_ITR1_NONE:               No internal trigger on TIM2_ITR1

+  *            @arg TIM_TIM2_ITR1_USB_SOF:            TIM2_ITR1 is connected to USB SOF

+  *

+  *                   field2 can have the following values:

+  *            @arg TIM_TIM2_ETR_GPIO:                TIM2_ETR is connected to GPIO

+  *            @arg TIM_TIM2_ETR_LSE:                 TIM2_ETR is connected to LSE

+  *            @arg TIM_TIM2_ETR_COMP1:               TIM2_ETR is connected to COMP1 output

+  *

+  *                   field3 can have the following values:

+  *            @arg TIM_TIM2_TI4_GPIO:                TIM2 TI4 is connected to GPIO

+  *            @arg TIM_TIM2_TI4_COMP1:               TIM2 TI4 is connected to COMP1 output

+  *

+  @endif

+  @if STM32L443xx

+  *         For TIM2, the parameter is a combination of 3 fields (field1 | field2 | field3):

+  *

+  *                   field1 can have the following values:

+  *            @arg TIM_TIM2_ITR1_NONE:               No internal trigger on TIM2_ITR1

+  *            @arg TIM_TIM2_ITR1_USB_SOF:            TIM2_ITR1 is connected to USB SOF

+  *

+  *                   field2 can have the following values:

+  *            @arg TIM_TIM2_ETR_GPIO:                TIM2_ETR is connected to GPIO

+  *            @arg TIM_TIM2_ETR_LSE:                 TIM2_ETR is connected to LSE

+  *            @arg TIM_TIM2_ETR_COMP1:               TIM2_ETR is connected to COMP1 output

+  *            @arg TIM_TIM2_ETR_COMP2:               TIM2_ETR is connected to COMP2 output

+  *

+  *                   field3 can have the following values:

+  *            @arg TIM_TIM2_TI4_GPIO:                TIM2 TI4 is connected to GPIO

+  *            @arg TIM_TIM2_TI4_COMP1:               TIM2 TI4 is connected to COMP1 output

+  *            @arg TIM_TIM2_TI4_COMP2:               TIM2 TI4 is connected to COMP2 output

+  *            @arg TIM_TIM2_TI4_COMP1_COMP2:         TIM2 TI4 is connected to logical OR between COMP1 and COMP2 output

+  *

+  @endif

+  @if STM32L486xx

+  *         For TIM3, the parameter is a combination 2 fields(field1 | field2):

+  *

+  *                   field1 can have the following values:

+  *            @arg TIM_TIM3_TI1_GPIO:                TIM3 TI1 is connected to GPIO

+  *            @arg TIM_TIM3_TI1_COMP1:               TIM3 TI1 is connected to COMP1 output

+  *            @arg TIM_TIM3_TI1_COMP2:               TIM3 TI1 is connected to COMP2 output

+  *            @arg TIM_TIM3_TI1_COMP1_COMP2:         TIM3 TI1 is connected to logical OR between COMP1 and COMP2 output

+  *

+  *                   field2 can have the following values:

+  *            @arg TIM_TIM3_ETR_GPIO:                TIM3_ETR is connected to GPIO

+  *            @arg TIM_TIM3_ETR_COMP1:               TIM3_ETR is connected to COMP1 output

+  *

+  @endif

+  @if STM32L486xx

+  *         For TIM8, the parameter is a combination of 3 fields (field1 | field2 | field3):

+  *

+  *                   field1 can have the following values:

+  *            @arg TIM_TIM8_ETR_ADC2_NONE:          TIM8_ETR is not connected to any ADC2 AWD (analog watchdog)

+  *            @arg TIM_TIM8_ETR_ADC2_AWD1:          TIM8_ETR is connected to ADC2 AWD1

+  *            @arg TIM_TIM8_ETR_ADC2_AWD2:          TIM8_ETR is connected to ADC2 AWD2

+  *            @arg TIM_TIM8_ETR_ADC2_AWD3:          TIM8_ETR is connected to ADC2 AWD3

+  *

+  *                   field2 can have the following values:

+  *            @arg TIM_TIM8_ETR_ADC3_NONE:          TIM8_ETR is not connected to any ADC3 AWD (analog watchdog)

+  *            @arg TIM_TIM8_ETR_ADC3_AWD1:          TIM8_ETR is connected to ADC3 AWD1

+  *            @arg TIM_TIM8_ETR_ADC3_AWD2:          TIM8_ETR is connected to ADC3 AWD2

+  *            @arg TIM_TIM8_ETR_ADC3_AWD3:          TIM8_ETR is connected to ADC3 AWD3

+  *

+  *                   field3 can have the following values:

+  *            @arg TIM_TIM8_TI1_GPIO:               TIM8 TI1 is connected to GPIO

+  *            @arg TIM_TIM8_TI1_COMP2:              TIM8 TI1 is connected to COMP2 output

+  *

+  *                   field4 can have the following values:

+  *            @arg TIM_TIM8_ETR_COMP1:               TIM8_ETR is connected to COMP1 output

+  *            @arg TIM_TIM8_ETR_COMP2:               TIM8_ETR is connected to COMP2 output

+  *            @note  When field4 is set to TIM_TIM8_ETR_COMP1 or TIM_TIM8_ETR_COMP2 field1 and field2 values are not significant

+  *

+  @endif

+  @if STM32L422xx

+  *         For TIM15, the parameter is a combination of 2 fields (field1 | field2):

+  *

+  *                   field1 can have the following values:

+  *            @arg TIM_TIM15_TI1_GPIO:              TIM15 TI1 is connected to GPIO

+  *            @arg TIM_TIM15_TI1_LSE:               TIM15 TI1 is connected to LSE

+  *

+  *                   field2 can have the following values:

+  *            @arg TIM_TIM15_ENCODERMODE_NONE:      No redirection

+  *            @arg TIM_TIM15_ENCODERMODE_TIM2:      TIM2 IC1 and TIM2 IC2 are connected to TIM15 IC1 and TIM15 IC2 respectively

+  *

+  @endif

+  @if STM32L443xx

+  *         For TIM15, the parameter is a combination of 2 fields (field1 | field2):

+  *

+  *                   field1 can have the following values:

+  *            @arg TIM_TIM15_TI1_GPIO:              TIM15 TI1 is connected to GPIO

+  *            @arg TIM_TIM15_TI1_LSE:               TIM15 TI1 is connected to LSE

+  *

+  *                   field2 can have the following values:

+  *            @arg TIM_TIM15_ENCODERMODE_NONE:      No redirection

+  *            @arg TIM_TIM15_ENCODERMODE_TIM2:      TIM2 IC1 and TIM2 IC2 are connected to TIM15 IC1 and TIM15 IC2 respectively

+  *            @arg TIM_TIM15_ENCODERMODE_TIM3:      TIM3 IC1 and TIM3 IC2 are connected to TIM15 IC1 and TIM15 IC2 respectively

+  *            @arg TIM_TIM15_ENCODERMODE_TIM4:      TIM4 IC1 and TIM4 IC2 are connected to TIM15 IC1 and TIM15 IC2 respectively

+  *

+  @endif

+  @if STM32L486xx

+  *            @arg TIM_TIM16_TI1_GPIO:              TIM16 TI1 is connected to GPIO

+  *            @arg TIM_TIM16_TI1_LSI:               TIM16 TI1 is connected to LSI

+  *            @arg TIM_TIM16_TI1_LSE:               TIM16 TI1 is connected to LSE

+  *            @arg TIM_TIM16_TI1_RTC:               TIM16 TI1 is connected to RTC wakeup interrupt

+  *

+  @endif

+  @if STM32L422xx

+  *         For TIM16, the parameter can have the following values:

+  *            @arg TIM_TIM16_TI1_GPIO:              TIM16 TI1 is connected to GPIO

+  *            @arg TIM_TIM16_TI1_LSI:               TIM16 TI1 is connected to LSI

+  *            @arg TIM_TIM16_TI1_LSE:               TIM16 TI1 is connected to LSE

+  *            @arg TIM_TIM16_TI1_RTC:               TIM16 TI1 is connected to RTC wakeup interrupt

+  *            @arg TIM_TIM16_TI1_MSI:               TIM16 TI1 is connected to MSI  (contraints: MSI clock < 1/4 TIM APB clock)

+  *            @arg TIM_TIM16_TI1_HSE_32:            TIM16 TI1 is connected to HSE div 32  (note that HSE div 32 must be selected as RTC clock source)

+  *            @arg TIM_TIM16_TI1_MCO:               TIM16 TI1 is connected to MCO

+  *

+  @endif

+  @if STM32L443xx

+  *         For TIM16, the parameter can have the following values:

+  *            @arg TIM_TIM16_TI1_GPIO:              TIM16 TI1 is connected to GPIO

+  *            @arg TIM_TIM16_TI1_LSI:               TIM16 TI1 is connected to LSI

+  *            @arg TIM_TIM16_TI1_LSE:               TIM16 TI1 is connected to LSE

+  *            @arg TIM_TIM16_TI1_RTC:               TIM16 TI1 is connected to RTC wakeup interrupt

+  *            @arg TIM_TIM16_TI1_MSI:               TIM16 TI1 is connected to MSI  (contraints: MSI clock < 1/4 TIM APB clock)

+  *            @arg TIM_TIM16_TI1_HSE_32:            TIM16 TI1 is connected to HSE div 32  (note that HSE div 32 must be selected as RTC clock source)

+  *            @arg TIM_TIM16_TI1_MCO:               TIM16 TI1 is connected to MCO

+  *

+  @endif

+  @if STM32L486xx

+  *         For TIM17, the parameter can have the following values:

+  *            @arg TIM_TIM17_TI1_GPIO:              TIM17 TI1 is connected to GPIO

+  *            @arg TIM_TIM17_TI1_MSI:               TIM17 TI1 is connected to MSI  (contraints: MSI clock < 1/4 TIM APB clock)

+  *            @arg TIM_TIM17_TI1_HSE_32:            TIM17 TI1 is connected to HSE div 32

+  *            @arg TIM_TIM17_TI1_MCO:               TIM17 TI1 is connected to MCO

+  @endif

+  *

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap)

+{

+  uint32_t tmpor1 = 0U;

+  uint32_t tmpor2 = 0U;

+

+  __HAL_LOCK(htim);

+

+  /* Check parameters */

+  assert_param(IS_TIM_REMAP_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_REMAP(Remap));

+

+  /* Set ETR_SEL bit field (if required) */

+  if (IS_TIM_ETRSEL_INSTANCE(htim->Instance))

+  {

+    tmpor2 = htim->Instance->OR2;

+    tmpor2 &= ~TIM1_OR2_ETRSEL_Msk;

+    tmpor2 |= (Remap & TIM1_OR2_ETRSEL_Msk);

+

+    /* Set TIMx_OR2 */

+    htim->Instance->OR2 = tmpor2;

+  }

+

+  /* Set other remapping capabilities */

+  tmpor1 = Remap;

+  tmpor1 &= ~TIM1_OR2_ETRSEL_Msk;

+

+  /* Set TIMx_OR1 */

+  htim->Instance->OR1 = tmpor1;

+

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Group channel 5 and channel 1, 2 or 3

+  * @param  htim TIM handle.

+  * @param  Channels specifies the reference signal(s) the OC5REF is combined with.

+  *         This parameter can be any combination of the following values:

+  *         TIM_GROUPCH5_NONE: No effect of OC5REF on OC1REFC, OC2REFC and OC3REFC

+  *         TIM_GROUPCH5_OC1REFC: OC1REFC is the logical AND of OC1REFC and OC5REF

+  *         TIM_GROUPCH5_OC2REFC: OC2REFC is the logical AND of OC2REFC and OC5REF

+  *         TIM_GROUPCH5_OC3REFC: OC3REFC is the logical AND of OC3REFC and OC5REF

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_TIMEx_GroupChannel5(TIM_HandleTypeDef *htim, uint32_t Channels)

+{

+  /* Check parameters */

+  assert_param(IS_TIM_COMBINED3PHASEPWM_INSTANCE(htim->Instance));

+  assert_param(IS_TIM_GROUPCH5(Channels));

+

+  /* Process Locked */

+  __HAL_LOCK(htim);

+

+  htim->State = HAL_TIM_STATE_BUSY;

+

+  /* Clear GC5Cx bit fields */

+  htim->Instance->CCR5 &= ~(TIM_CCR5_GC5C3 | TIM_CCR5_GC5C2 | TIM_CCR5_GC5C1);

+

+  /* Set GC5Cx bit fields */

+  htim->Instance->CCR5 |= Channels;

+

+  /* Change the htim state */

+  htim->State = HAL_TIM_STATE_READY;

+

+  __HAL_UNLOCK(htim);

+

+  return HAL_OK;

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions

+  * @brief    Extended Callbacks functions

+  *

+@verbatim

+  ==============================================================================

+                    ##### Extended Callbacks functions #####

+  ==============================================================================

+  [..]

+    This section provides Extended TIM callback functions:

+    (+) Timer Commutation callback

+    (+) Timer Break callback

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Hall commutation changed callback in non-blocking mode

+  * @param  htim TIM handle

+  * @retval None

+  */

+__weak void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIMEx_CommutCallback could be implemented in the user file

+   */

+}

+/**

+  * @brief  Hall commutation changed half complete callback in non-blocking mode

+  * @param  htim TIM handle

+  * @retval None

+  */

+__weak void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIMEx_CommutHalfCpltCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Hall Break detection callback in non-blocking mode

+  * @param  htim TIM handle

+  * @retval None

+  */

+__weak void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_TIMEx_BreakCallback could be implemented in the user file

+   */

+}

+

+/**

+  * @brief  Hall Break2 detection callback in non blocking mode

+  * @param  htim: TIM handle

+  * @retval None

+  */

+__weak void HAL_TIMEx_Break2Callback(TIM_HandleTypeDef *htim)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(htim);

+

+  /* NOTE : This function Should not be modified, when the callback is needed,

+            the HAL_TIMEx_Break2Callback could be implemented in the user file

+   */

+}

+/**

+  * @}

+  */

+

+/** @defgroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions

+  * @brief    Extended Peripheral State functions

+  *

+@verbatim

+  ==============================================================================

+                ##### Extended Peripheral State functions #####

+  ==============================================================================

+  [..]

+    This subsection permits to get in run-time the status of the peripheral

+    and the data flow.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Return the TIM Hall Sensor interface handle state.

+  * @param  htim TIM Hall Sensor handle

+  * @retval HAL state

+  */

+HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim)

+{

+  return htim->State;

+}

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/* Private functions ---------------------------------------------------------*/

+/** @defgroup TIMEx_Private_Functions TIMEx Private Functions

+  * @{

+  */

+

+/**

+  * @brief  TIM DMA Commutation callback.

+  * @param  hdma pointer to DMA handle.

+  * @retval None

+  */

+void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma)

+{

+  TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;

+

+  /* Change the htim state */

+  htim->State = HAL_TIM_STATE_READY;

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+  htim->CommutationCallback(htim);

+#else

+  HAL_TIMEx_CommutCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  TIM DMA Commutation half complete callback.

+  * @param  hdma pointer to DMA handle.

+  * @retval None

+  */

+void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma)

+{

+  TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;

+

+  /* Change the htim state */

+  htim->State = HAL_TIM_STATE_READY;

+

+#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

+  htim->CommutationHalfCpltCallback(htim);

+#else

+  HAL_TIMEx_CommutHalfCpltCallback(htim);

+#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

+}

+

+

+/**

+  * @brief  Enables or disables the TIM Capture Compare Channel xN.

+  * @param  TIMx to select the TIM peripheral

+  * @param  Channel specifies the TIM Channel

+  *          This parameter can be one of the following values:

+  *            @arg TIM_CHANNEL_1: TIM Channel 1

+  *            @arg TIM_CHANNEL_2: TIM Channel 2

+  *            @arg TIM_CHANNEL_3: TIM Channel 3

+  * @param  ChannelNState specifies the TIM Channel CCxNE bit new state.

+  *          This parameter can be: TIM_CCxN_ENABLE or TIM_CCxN_Disable.

+  * @retval None

+  */

+static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState)

+{

+  uint32_t tmp;

+

+  tmp = TIM_CCER_CC1NE << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */

+

+  /* Reset the CCxNE Bit */

+  TIMx->CCER &=  ~tmp;

+

+  /* Set or reset the CCxNE Bit */

+  TIMx->CCER |= (uint32_t)(ChannelNState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */

+}

+/**

+  * @}

+  */

+

+#endif /* HAL_TIM_MODULE_ENABLED */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c
new file mode 100644
index 0000000..696c3f0
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c
@@ -0,0 +1,4143 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_hal_uart.c

+  * @author  MCD Application Team

+  * @brief   UART HAL module driver.

+  *          This file provides firmware functions to manage the following

+  *          functionalities of the Universal Asynchronous Receiver Transmitter Peripheral (UART).

+  *           + Initialization and de-initialization functions

+  *           + IO operation functions

+  *           + Peripheral Control functions

+  *

+  *

+  @verbatim

+ ===============================================================================

+                        ##### How to use this driver #####

+ ===============================================================================

+  [..]

+    The UART HAL driver can be used as follows:

+

+    (#) Declare a UART_HandleTypeDef handle structure (eg. UART_HandleTypeDef huart).

+    (#) Initialize the UART low level resources by implementing the HAL_UART_MspInit() API:

+        (++) Enable the USARTx interface clock.

+        (++) UART pins configuration:

+            (+++) Enable the clock for the UART GPIOs.

+            (+++) Configure these UART pins as alternate function pull-up.

+        (++) NVIC configuration if you need to use interrupt process (HAL_UART_Transmit_IT()

+             and HAL_UART_Receive_IT() APIs):

+            (+++) Configure the USARTx interrupt priority.

+            (+++) Enable the NVIC USART IRQ handle.

+        (++) UART interrupts handling:

+              -@@-  The specific UART interrupts (Transmission complete interrupt,

+                RXNE interrupt, RX/TX FIFOs related interrupts and Error Interrupts)

+                are managed using the macros __HAL_UART_ENABLE_IT() and __HAL_UART_DISABLE_IT()

+                inside the transmit and receive processes.

+        (++) DMA Configuration if you need to use DMA process (HAL_UART_Transmit_DMA()

+             and HAL_UART_Receive_DMA() APIs):

+            (+++) Declare a DMA handle structure for the Tx/Rx channel.

+            (+++) Enable the DMAx interface clock.

+            (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters.

+            (+++) Configure the DMA Tx/Rx channel.

+            (+++) Associate the initialized DMA handle to the UART DMA Tx/Rx handle.

+            (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx/Rx channel.

+

+    (#) Program the Baud Rate, Word Length, Stop Bit, Parity, Prescaler value , Hardware

+        flow control and Mode (Receiver/Transmitter) in the huart handle Init structure.

+

+    (#) If required, program UART advanced features (TX/RX pins swap, auto Baud rate detection,...)

+        in the huart handle AdvancedInit structure.

+

+    (#) For the UART asynchronous mode, initialize the UART registers by calling

+        the HAL_UART_Init() API.

+

+    (#) For the UART Half duplex mode, initialize the UART registers by calling

+        the HAL_HalfDuplex_Init() API.

+

+    (#) For the UART LIN (Local Interconnection Network) mode, initialize the UART registers

+        by calling the HAL_LIN_Init() API.

+

+    (#) For the UART Multiprocessor mode, initialize the UART registers

+        by calling the HAL_MultiProcessor_Init() API.

+

+    (#) For the UART RS485 Driver Enabled mode, initialize the UART registers

+        by calling the HAL_RS485Ex_Init() API.

+

+    [..]

+    (@) These API's (HAL_UART_Init(), HAL_HalfDuplex_Init(), HAL_LIN_Init(), HAL_MultiProcessor_Init(),

+        also configure the low level Hardware GPIO, CLOCK, CORTEX...etc) by

+        calling the customized HAL_UART_MspInit() API.

+

+    ##### Callback registration #####

+    ==================================

+

+    [..]

+    The compilation define USE_HAL_UART_REGISTER_CALLBACKS when set to 1

+    allows the user to configure dynamically the driver callbacks.

+

+    [..]

+    Use Function @ref HAL_UART_RegisterCallback() to register a user callback.

+    Function @ref HAL_UART_RegisterCallback() allows to register following callbacks:

+    (+) TxHalfCpltCallback        : Tx Half Complete Callback.

+    (+) TxCpltCallback            : Tx Complete Callback.

+    (+) RxHalfCpltCallback        : Rx Half Complete Callback.

+    (+) RxCpltCallback            : Rx Complete Callback.

+    (+) ErrorCallback             : Error Callback.

+    (+) AbortCpltCallback         : Abort Complete Callback.

+    (+) AbortTransmitCpltCallback : Abort Transmit Complete Callback.

+    (+) AbortReceiveCpltCallback  : Abort Receive Complete Callback.

+    (+) WakeupCallback            : Wakeup Callback.

+    (+) RxFifoFullCallback        : Rx Fifo Full Callback.

+    (+) TxFifoEmptyCallback       : Tx Fifo Empty Callback.

+    (+) MspInitCallback           : UART MspInit.

+    (+) MspDeInitCallback         : UART MspDeInit.

+    This function takes as parameters the HAL peripheral handle, the Callback ID

+    and a pointer to the user callback function.

+

+    [..]

+    Use function @ref HAL_UART_UnRegisterCallback() to reset a callback to the default

+    weak (surcharged) function.

+    @ref HAL_UART_UnRegisterCallback() takes as parameters the HAL peripheral handle,

+    and the Callback ID.

+    This function allows to reset following callbacks:

+    (+) TxHalfCpltCallback        : Tx Half Complete Callback.

+    (+) TxCpltCallback            : Tx Complete Callback.

+    (+) RxHalfCpltCallback        : Rx Half Complete Callback.

+    (+) RxCpltCallback            : Rx Complete Callback.

+    (+) ErrorCallback             : Error Callback.

+    (+) AbortCpltCallback         : Abort Complete Callback.

+    (+) AbortTransmitCpltCallback : Abort Transmit Complete Callback.

+    (+) AbortReceiveCpltCallback  : Abort Receive Complete Callback.

+    (+) WakeupCallback            : Wakeup Callback.

+    (+) RxFifoFullCallback        : Rx Fifo Full Callback.

+    (+) TxFifoEmptyCallback       : Tx Fifo Empty Callback.

+    (+) MspInitCallback           : UART MspInit.

+    (+) MspDeInitCallback         : UART MspDeInit.

+

+    [..]

+    By default, after the @ref HAL_UART_Init() and when the state is HAL_UART_STATE_RESET

+    all callbacks are set to the corresponding weak (surcharged) functions:

+    examples @ref HAL_UART_TxCpltCallback(), @ref HAL_UART_RxHalfCpltCallback().

+    Exception done for MspInit and MspDeInit functions that are respectively

+    reset to the legacy weak (surcharged) functions in the @ref HAL_UART_Init()

+    and @ref HAL_UART_DeInit() only when these callbacks are null (not registered beforehand).

+    If not, MspInit or MspDeInit are not null, the @ref HAL_UART_Init() and @ref HAL_UART_DeInit()

+    keep and use the user MspInit/MspDeInit callbacks (registered beforehand).

+

+    [..]

+    Callbacks can be registered/unregistered in HAL_UART_STATE_READY state only.

+    Exception done MspInit/MspDeInit that can be registered/unregistered

+    in HAL_UART_STATE_READY or HAL_UART_STATE_RESET state, thus registered (user)

+    MspInit/DeInit callbacks can be used during the Init/DeInit.

+    In that case first register the MspInit/MspDeInit user callbacks

+    using @ref HAL_UART_RegisterCallback() before calling @ref HAL_UART_DeInit()

+    or @ref HAL_UART_Init() function.

+

+    [..]

+    When The compilation define USE_HAL_UART_REGISTER_CALLBACKS is set to 0 or

+    not defined, the callback registration feature is not available

+    and weak (surcharged) callbacks are used.

+

+

+  @endverbatim

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup UART UART

+  * @brief HAL UART module driver

+  * @{

+  */

+

+#ifdef HAL_UART_MODULE_ENABLED

+

+/* Private typedef -----------------------------------------------------------*/

+/* Private define ------------------------------------------------------------*/

+/** @defgroup UART_Private_Constants UART Private Constants

+  * @{

+  */

+#if defined(USART_CR1_FIFOEN)

+#define USART_CR1_FIELDS  ((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | \

+                                      USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8| \

+                                      USART_CR1_FIFOEN ))                      /*!< UART or USART CR1 fields of parameters set by UART_SetConfig API */

+#else

+#define USART_CR1_FIELDS  ((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | \

+                                      USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8 )) /*!< UART or USART CR1 fields of parameters set by UART_SetConfig API */

+#endif /* USART_CR1_FIFOEN */

+

+#if defined(USART_CR1_FIFOEN)

+#define USART_CR3_FIELDS  ((uint32_t)(USART_CR3_RTSE | USART_CR3_CTSE | USART_CR3_ONEBIT| \

+                                      USART_CR3_TXFTCFG | USART_CR3_RXFTCFG ))  /*!< UART or USART CR3 fields of parameters set by UART_SetConfig API */

+#else

+#define USART_CR3_FIELDS  ((uint32_t)(USART_CR3_RTSE | USART_CR3_CTSE | USART_CR3_ONEBIT))  /*!< UART or USART CR3 fields of parameters set by UART_SetConfig API */

+#endif /* USART_CR1_FIFOEN */

+

+#define LPUART_BRR_MIN  0x00000300U  /* LPUART BRR minimum authorized value */

+#define LPUART_BRR_MAX  0x000FFFFFU  /* LPUART BRR maximum authorized value */

+

+#define UART_BRR_MIN    0x10U        /* UART BRR minimum authorized value */

+#define UART_BRR_MAX    0x0000FFFFU  /* UART BRR maximum authorized value */

+

+/**

+  * @}

+  */

+

+/* Private macros ------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/* Private function prototypes -----------------------------------------------*/

+/** @addtogroup UART_Private_Functions

+  * @{

+  */

+static void UART_EndTxTransfer(UART_HandleTypeDef *huart);

+static void UART_EndRxTransfer(UART_HandleTypeDef *huart);

+static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma);

+static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma);

+static void UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma);

+static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma);

+static void UART_DMAError(DMA_HandleTypeDef *hdma);

+static void UART_DMAAbortOnError(DMA_HandleTypeDef *hdma);

+static void UART_DMATxAbortCallback(DMA_HandleTypeDef *hdma);

+static void UART_DMARxAbortCallback(DMA_HandleTypeDef *hdma);

+static void UART_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma);

+static void UART_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma);

+static void UART_TxISR_8BIT(UART_HandleTypeDef *huart);

+static void UART_TxISR_16BIT(UART_HandleTypeDef *huart);

+#if defined(USART_CR1_FIFOEN)

+static void UART_TxISR_8BIT_FIFOEN(UART_HandleTypeDef *huart);

+static void UART_TxISR_16BIT_FIFOEN(UART_HandleTypeDef *huart);

+#endif /* USART_CR1_FIFOEN */

+static void UART_EndTransmit_IT(UART_HandleTypeDef *huart);

+static void UART_RxISR_8BIT(UART_HandleTypeDef *huart);

+static void UART_RxISR_16BIT(UART_HandleTypeDef *huart);

+#if defined(USART_CR1_FIFOEN)

+static void UART_RxISR_8BIT_FIFOEN(UART_HandleTypeDef *huart);

+static void UART_RxISR_16BIT_FIFOEN(UART_HandleTypeDef *huart);

+#endif /* USART_CR1_FIFOEN */

+/**

+  * @}

+  */

+

+/* Exported functions --------------------------------------------------------*/

+

+/** @defgroup UART_Exported_Functions UART Exported Functions

+  * @{

+  */

+

+/** @defgroup UART_Exported_Functions_Group1 Initialization and de-initialization functions

+  *  @brief    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_UART_Init(), HAL_HalfDuplex_Init(), HAL_LIN_Init()and HAL_MultiProcessor_Init()API

+    follow respectively the UART asynchronous, UART Half duplex, UART LIN mode

+    and UART multiprocessor 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 UART mode according to the specified

+  *        parameters in the UART_InitTypeDef and initialize the associated handle.

+  * @param huart UART handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)

+{

+  /* Check the UART handle allocation */

+  if (huart == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  if (huart->Init.HwFlowCtl != UART_HWCONTROL_NONE)

+  {

+    /* Check the parameters */

+    assert_param(IS_UART_HWFLOW_INSTANCE(huart->Instance));

+  }

+  else

+  {

+    /* Check the parameters */

+    assert_param((IS_UART_INSTANCE(huart->Instance)) || (IS_LPUART_INSTANCE(huart->Instance)));

+  }

+

+  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 */

+    HAL_UART_MspInit(huart);

+#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */

+  }

+

+  huart->gState = HAL_UART_STATE_BUSY;

+

+  __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);

+  }

+

+  /* In asynchronous mode, the following bits must be kept cleared:

+  - LINEN and CLKEN bits in the USART_CR2 register,

+  - SCEN, HDSEL and IREN  bits in the USART_CR3 register.*/

+  CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN));

+  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN));

+

+  __HAL_UART_ENABLE(huart);

+

+  /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */

+  return (UART_CheckIdleState(huart));

+}

+

+/**

+  * @brief Initialize the half-duplex mode according to the specified

+  *        parameters in the UART_InitTypeDef and creates the associated handle.

+  * @param huart UART handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart)

+{

+  /* Check the UART handle allocation */

+  if (huart == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check UART instance */

+  assert_param(IS_UART_HALFDUPLEX_INSTANCE(huart->Instance));

+

+  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 */

+    HAL_UART_MspInit(huart);

+#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */

+  }

+

+  huart->gState = HAL_UART_STATE_BUSY;

+

+  __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);

+  }

+

+  /* In half-duplex mode, the following bits must be kept cleared:

+  - LINEN and CLKEN bits in the USART_CR2 register,

+  - SCEN and IREN bits in the USART_CR3 register.*/

+  CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN));

+  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_IREN | USART_CR3_SCEN));

+

+  /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */

+  SET_BIT(huart->Instance->CR3, USART_CR3_HDSEL);

+

+  __HAL_UART_ENABLE(huart);

+

+  /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */

+  return (UART_CheckIdleState(huart));

+}

+

+

+/**

+  * @brief Initialize the LIN mode according to the specified

+  *        parameters in the UART_InitTypeDef and creates the associated handle.

+  * @param huart             UART handle.

+  * @param BreakDetectLength Specifies the LIN break detection length.

+  *        This parameter can be one of the following values:

+  *          @arg @ref UART_LINBREAKDETECTLENGTH_10B 10-bit break detection

+  *          @arg @ref UART_LINBREAKDETECTLENGTH_11B 11-bit break detection

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength)

+{

+  /* Check the UART handle allocation */

+  if (huart == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check the LIN UART instance */

+  assert_param(IS_UART_LIN_INSTANCE(huart->Instance));

+  /* Check the Break detection length parameter */

+  assert_param(IS_UART_LIN_BREAK_DETECT_LENGTH(BreakDetectLength));

+

+  /* LIN mode limited to 16-bit oversampling only */

+  if (huart->Init.OverSampling == UART_OVERSAMPLING_8)

+  {

+    return HAL_ERROR;

+  }

+  /* LIN mode limited to 8-bit data length */

+  if (huart->Init.WordLength != UART_WORDLENGTH_8B)

+  {

+    return HAL_ERROR;

+  }

+

+  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 */

+    HAL_UART_MspInit(huart);

+#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */

+  }

+

+  huart->gState = HAL_UART_STATE_BUSY;

+

+  __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);

+  }

+

+  /* In LIN mode, the following bits must be kept cleared:

+  - LINEN and CLKEN bits in the USART_CR2 register,

+  - SCEN and IREN bits in the USART_CR3 register.*/

+  CLEAR_BIT(huart->Instance->CR2, USART_CR2_CLKEN);

+  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_HDSEL | USART_CR3_IREN | USART_CR3_SCEN));

+

+  /* Enable the LIN mode by setting the LINEN bit in the CR2 register */

+  SET_BIT(huart->Instance->CR2, USART_CR2_LINEN);

+

+  /* Set the USART LIN Break detection length. */

+  MODIFY_REG(huart->Instance->CR2, USART_CR2_LBDL, BreakDetectLength);

+

+  __HAL_UART_ENABLE(huart);

+

+  /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */

+  return (UART_CheckIdleState(huart));

+}

+

+

+/**

+  * @brief Initialize the multiprocessor mode according to the specified

+  *        parameters in the UART_InitTypeDef and initialize the associated handle.

+  * @param huart        UART handle.

+  * @param Address      UART node address (4-, 6-, 7- or 8-bit long).

+  * @param WakeUpMethod Specifies the UART wakeup method.

+  *        This parameter can be one of the following values:

+  *          @arg @ref UART_WAKEUPMETHOD_IDLELINE WakeUp by an idle line detection

+  *          @arg @ref UART_WAKEUPMETHOD_ADDRESSMARK WakeUp by an address mark

+  * @note  If the user resorts to idle line detection wake up, the Address parameter

+  *        is useless and ignored by the initialization function.

+  * @note  If the user resorts to address mark wake up, the address length detection

+  *        is configured by default to 4 bits only. For the UART to be able to

+  *        manage 6-, 7- or 8-bit long addresses detection, the API

+  *        HAL_MultiProcessorEx_AddressLength_Set() must be called after

+  *        HAL_MultiProcessor_Init().

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod)

+{

+  /* Check the UART handle allocation */

+  if (huart == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check the wake up method parameter */

+  assert_param(IS_UART_WAKEUPMETHOD(WakeUpMethod));

+

+  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 */

+    HAL_UART_MspInit(huart);

+#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */

+  }

+

+  huart->gState = HAL_UART_STATE_BUSY;

+

+  __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);

+  }

+

+  /* In multiprocessor mode, the following bits must be kept cleared:

+  - LINEN and CLKEN bits in the USART_CR2 register,

+  - SCEN, HDSEL and IREN  bits in the USART_CR3 register. */

+  CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN));

+  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN));

+

+  if (WakeUpMethod == UART_WAKEUPMETHOD_ADDRESSMARK)

+  {

+    /* If address mark wake up method is chosen, set the USART address node */

+    MODIFY_REG(huart->Instance->CR2, USART_CR2_ADD, ((uint32_t)Address << UART_CR2_ADDRESS_LSB_POS));

+  }

+

+  /* Set the wake up method by setting the WAKE bit in the CR1 register */

+  MODIFY_REG(huart->Instance->CR1, USART_CR1_WAKE, WakeUpMethod);

+

+  __HAL_UART_ENABLE(huart);

+

+  /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */

+  return (UART_CheckIdleState(huart));

+}

+

+

+/**

+  * @brief DeInitialize the UART peripheral.

+  * @param huart UART handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart)

+{

+  /* Check the UART handle allocation */

+  if (huart == NULL)

+  {

+    return HAL_ERROR;

+  }

+

+  /* Check the parameters */

+  assert_param((IS_UART_INSTANCE(huart->Instance)) || (IS_LPUART_INSTANCE(huart->Instance)));

+

+  huart->gState = HAL_UART_STATE_BUSY;

+

+  __HAL_UART_DISABLE(huart);

+

+  huart->Instance->CR1 = 0x0U;

+  huart->Instance->CR2 = 0x0U;

+  huart->Instance->CR3 = 0x0U;

+

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+  if (huart->MspDeInitCallback == NULL)

+  {

+    huart->MspDeInitCallback = HAL_UART_MspDeInit;

+  }

+  /* DeInit the low level hardware */

+  huart->MspDeInitCallback(huart);

+#else

+  /* DeInit the low level hardware */

+  HAL_UART_MspDeInit(huart);

+#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */

+

+  huart->ErrorCode = HAL_UART_ERROR_NONE;

+  huart->gState = HAL_UART_STATE_RESET;

+  huart->RxState = HAL_UART_STATE_RESET;

+

+  __HAL_UNLOCK(huart);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief Initialize the UART MSP.

+  * @param huart UART handle.

+  * @retval None

+  */

+__weak void HAL_UART_MspInit(UART_HandleTypeDef *huart)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(huart);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_UART_MspInit can be implemented in the user file

+   */

+}

+

+/**

+  * @brief DeInitialize the UART MSP.

+  * @param huart UART handle.

+  * @retval None

+  */

+__weak void HAL_UART_MspDeInit(UART_HandleTypeDef *huart)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(huart);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_UART_MspDeInit can be implemented in the user file

+   */

+}

+

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+/**

+  * @brief  Register a User UART Callback

+  *         To be used instead of the weak predefined callback

+  * @param  huart uart handle

+  * @param  CallbackID ID of the callback to be registered

+  *         This parameter can be one of the following values:

+  *           @arg @ref HAL_UART_TX_HALFCOMPLETE_CB_ID Tx Half Complete Callback ID

+  *           @arg @ref HAL_UART_TX_COMPLETE_CB_ID Tx Complete Callback ID

+  *           @arg @ref HAL_UART_RX_HALFCOMPLETE_CB_ID Rx Half Complete Callback ID

+  *           @arg @ref HAL_UART_RX_COMPLETE_CB_ID Rx Complete Callback ID

+  *           @arg @ref HAL_UART_ERROR_CB_ID Error Callback ID

+  *           @arg @ref HAL_UART_ABORT_COMPLETE_CB_ID Abort Complete Callback ID

+  *           @arg @ref HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID Abort Transmit Complete Callback ID

+  *           @arg @ref HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID Abort Receive Complete Callback ID

+  *           @arg @ref HAL_UART_WAKEUP_CB_ID Wakeup Callback ID

+  *           @arg @ref HAL_UART_RX_FIFO_FULL_CB_ID Rx Fifo Full Callback ID

+  *           @arg @ref HAL_UART_TX_FIFO_EMPTY_CB_ID Tx Fifo Empty Callback ID

+  *           @arg @ref HAL_UART_MSPINIT_CB_ID MspInit Callback ID

+  *           @arg @ref HAL_UART_MSPDEINIT_CB_ID MspDeInit Callback ID

+  * @param  pCallback pointer to the Callback function

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID,

+                                            pUART_CallbackTypeDef pCallback)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  if (pCallback == NULL)

+  {

+    huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;

+

+    return HAL_ERROR;

+  }

+

+  __HAL_LOCK(huart);

+

+  if (huart->gState == HAL_UART_STATE_READY)

+  {

+    switch (CallbackID)

+    {

+      case HAL_UART_TX_HALFCOMPLETE_CB_ID :

+        huart->TxHalfCpltCallback = pCallback;

+        break;

+

+      case HAL_UART_TX_COMPLETE_CB_ID :

+        huart->TxCpltCallback = pCallback;

+        break;

+

+      case HAL_UART_RX_HALFCOMPLETE_CB_ID :

+        huart->RxHalfCpltCallback = pCallback;

+        break;

+

+      case HAL_UART_RX_COMPLETE_CB_ID :

+        huart->RxCpltCallback = pCallback;

+        break;

+

+      case HAL_UART_ERROR_CB_ID :

+        huart->ErrorCallback = pCallback;

+        break;

+

+      case HAL_UART_ABORT_COMPLETE_CB_ID :

+        huart->AbortCpltCallback = pCallback;

+        break;

+

+      case HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID :

+        huart->AbortTransmitCpltCallback = pCallback;

+        break;

+

+      case HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID :

+        huart->AbortReceiveCpltCallback = pCallback;

+        break;

+

+      case HAL_UART_WAKEUP_CB_ID :

+        huart->WakeupCallback = pCallback;

+        break;

+

+#if defined(USART_CR1_FIFOEN)

+      case HAL_UART_RX_FIFO_FULL_CB_ID :

+        huart->RxFifoFullCallback = pCallback;

+        break;

+

+      case HAL_UART_TX_FIFO_EMPTY_CB_ID :

+        huart->TxFifoEmptyCallback = pCallback;

+        break;

+#endif /* USART_CR1_FIFOEN */

+

+      case HAL_UART_MSPINIT_CB_ID :

+        huart->MspInitCallback = pCallback;

+        break;

+

+      case HAL_UART_MSPDEINIT_CB_ID :

+        huart->MspDeInitCallback = pCallback;

+        break;

+

+      default :

+        huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;

+

+        status =  HAL_ERROR;

+        break;

+    }

+  }

+  else if (huart->gState == HAL_UART_STATE_RESET)

+  {

+    switch (CallbackID)

+    {

+      case HAL_UART_MSPINIT_CB_ID :

+        huart->MspInitCallback = pCallback;

+        break;

+

+      case HAL_UART_MSPDEINIT_CB_ID :

+        huart->MspDeInitCallback = pCallback;

+        break;

+

+      default :

+        huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;

+

+        status =  HAL_ERROR;

+        break;

+    }

+  }

+  else

+  {

+    huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;

+

+    status =  HAL_ERROR;

+  }

+

+  __HAL_UNLOCK(huart);

+

+  return status;

+}

+

+/**

+  * @brief  Unregister an UART Callback

+  *         UART callaback is redirected to the weak predefined callback

+  * @param  huart uart handle

+  * @param  CallbackID ID of the callback to be unregistered

+  *         This parameter can be one of the following values:

+  *           @arg @ref HAL_UART_TX_HALFCOMPLETE_CB_ID Tx Half Complete Callback ID

+  *           @arg @ref HAL_UART_TX_COMPLETE_CB_ID Tx Complete Callback ID

+  *           @arg @ref HAL_UART_RX_HALFCOMPLETE_CB_ID Rx Half Complete Callback ID

+  *           @arg @ref HAL_UART_RX_COMPLETE_CB_ID Rx Complete Callback ID

+  *           @arg @ref HAL_UART_ERROR_CB_ID Error Callback ID

+  *           @arg @ref HAL_UART_ABORT_COMPLETE_CB_ID Abort Complete Callback ID

+  *           @arg @ref HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID Abort Transmit Complete Callback ID

+  *           @arg @ref HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID Abort Receive Complete Callback ID

+  *           @arg @ref HAL_UART_WAKEUP_CB_ID Wakeup Callback ID

+  *           @arg @ref HAL_UART_RX_FIFO_FULL_CB_ID Rx Fifo Full Callback ID

+  *           @arg @ref HAL_UART_TX_FIFO_EMPTY_CB_ID Tx Fifo Empty Callback ID

+  *           @arg @ref HAL_UART_MSPINIT_CB_ID MspInit Callback ID

+  *           @arg @ref HAL_UART_MSPDEINIT_CB_ID MspDeInit Callback ID

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID)

+{

+  HAL_StatusTypeDef status = HAL_OK;

+

+  __HAL_LOCK(huart);

+

+  if (HAL_UART_STATE_READY == huart->gState)

+  {

+    switch (CallbackID)

+    {

+      case HAL_UART_TX_HALFCOMPLETE_CB_ID :

+        huart->TxHalfCpltCallback = HAL_UART_TxHalfCpltCallback;               /* Legacy weak  TxHalfCpltCallback       */

+        break;

+

+      case HAL_UART_TX_COMPLETE_CB_ID :

+        huart->TxCpltCallback = HAL_UART_TxCpltCallback;                       /* Legacy weak TxCpltCallback            */

+        break;

+

+      case HAL_UART_RX_HALFCOMPLETE_CB_ID :

+        huart->RxHalfCpltCallback = HAL_UART_RxHalfCpltCallback;               /* Legacy weak RxHalfCpltCallback        */

+        break;

+

+      case HAL_UART_RX_COMPLETE_CB_ID :

+        huart->RxCpltCallback = HAL_UART_RxCpltCallback;                       /* Legacy weak RxCpltCallback            */

+        break;

+

+      case HAL_UART_ERROR_CB_ID :

+        huart->ErrorCallback = HAL_UART_ErrorCallback;                         /* Legacy weak ErrorCallback             */

+        break;

+

+      case HAL_UART_ABORT_COMPLETE_CB_ID :

+        huart->AbortCpltCallback = HAL_UART_AbortCpltCallback;                 /* Legacy weak AbortCpltCallback         */

+        break;

+

+      case HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID :

+        huart->AbortTransmitCpltCallback = HAL_UART_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */

+        break;

+

+      case HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID :

+        huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback;   /* Legacy weak AbortReceiveCpltCallback  */

+        break;

+

+      case HAL_UART_WAKEUP_CB_ID :

+        huart->WakeupCallback = HAL_UARTEx_WakeupCallback;                     /* Legacy weak WakeupCallback            */

+        break;

+

+#if defined(USART_CR1_FIFOEN)

+      case HAL_UART_RX_FIFO_FULL_CB_ID :

+        huart->RxFifoFullCallback = HAL_UARTEx_RxFifoFullCallback;             /* Legacy weak RxFifoFullCallback        */

+        break;

+

+      case HAL_UART_TX_FIFO_EMPTY_CB_ID :

+        huart->TxFifoEmptyCallback = HAL_UARTEx_TxFifoEmptyCallback;           /* Legacy weak TxFifoEmptyCallback       */

+        break;

+

+#endif /* USART_CR1_FIFOEN */

+      case HAL_UART_MSPINIT_CB_ID :

+        huart->MspInitCallback = HAL_UART_MspInit;                             /* Legacy weak MspInitCallback           */

+        break;

+

+      case HAL_UART_MSPDEINIT_CB_ID :

+        huart->MspDeInitCallback = HAL_UART_MspDeInit;                         /* Legacy weak MspDeInitCallback         */

+        break;

+

+      default :

+        huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;

+

+        status =  HAL_ERROR;

+        break;

+    }

+  }

+  else if (HAL_UART_STATE_RESET == huart->gState)

+  {

+    switch (CallbackID)

+    {

+      case HAL_UART_MSPINIT_CB_ID :

+        huart->MspInitCallback = HAL_UART_MspInit;

+        break;

+

+      case HAL_UART_MSPDEINIT_CB_ID :

+        huart->MspDeInitCallback = HAL_UART_MspDeInit;

+        break;

+

+      default :

+        huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;

+

+        status =  HAL_ERROR;

+        break;

+    }

+  }

+  else

+  {

+    huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK;

+

+    status =  HAL_ERROR;

+  }

+

+  __HAL_UNLOCK(huart);

+

+  return status;

+}

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+

+/**

+  * @}

+  */

+

+/** @defgroup UART_Exported_Functions_Group2 IO operation functions

+  * @brief UART Transmit/Receive functions

+  *

+@verbatim

+ ===============================================================================

+                      ##### IO operation functions #####

+ ===============================================================================

+    This subsection provides a set of functions allowing to manage the UART asynchronous

+    and Half duplex data transfers.

+

+    (#) There are two mode of transfer:

+       (+) Blocking mode: The communication is performed in polling mode.

+           The HAL status of all data processing is returned by the same function

+           after finishing transfer.

+       (+) Non-Blocking mode: The communication 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_UART_TxCpltCallback(), HAL_UART_RxCpltCallback() user callbacks

+           will be executed respectively at the end of the transmit or Receive process

+           The HAL_UART_ErrorCallback()user callback will be executed when a communication error is detected

+

+    (#) Blocking mode API's are :

+        (+) HAL_UART_Transmit()

+        (+) HAL_UART_Receive()

+

+    (#) Non-Blocking mode API's with Interrupt are :

+        (+) HAL_UART_Transmit_IT()

+        (+) HAL_UART_Receive_IT()

+        (+) HAL_UART_IRQHandler()

+

+    (#) Non-Blocking mode API's with DMA are :

+        (+) HAL_UART_Transmit_DMA()

+        (+) HAL_UART_Receive_DMA()

+        (+) HAL_UART_DMAPause()

+        (+) HAL_UART_DMAResume()

+        (+) HAL_UART_DMAStop()

+

+    (#) A set of Transfer Complete Callbacks are provided in Non_Blocking mode:

+        (+) HAL_UART_TxHalfCpltCallback()

+        (+) HAL_UART_TxCpltCallback()

+        (+) HAL_UART_RxHalfCpltCallback()

+        (+) HAL_UART_RxCpltCallback()

+        (+) HAL_UART_ErrorCallback()

+

+    (#) Non-Blocking mode transfers could be aborted using Abort API's :

+        (+) HAL_UART_Abort()

+        (+) HAL_UART_AbortTransmit()

+        (+) HAL_UART_AbortReceive()

+        (+) HAL_UART_Abort_IT()

+        (+) HAL_UART_AbortTransmit_IT()

+        (+) HAL_UART_AbortReceive_IT()

+

+    (#) For Abort services based on interrupts (HAL_UART_Abortxxx_IT), a set of Abort Complete Callbacks are provided:

+        (+) HAL_UART_AbortCpltCallback()

+        (+) HAL_UART_AbortTransmitCpltCallback()

+        (+) HAL_UART_AbortReceiveCpltCallback()

+

+    (#) In Non-Blocking mode transfers, possible errors are split into 2 categories.

+        Errors are handled as follows :

+       (+) Error is considered as Recoverable and non blocking : Transfer could go till end, but error severity is

+           to be evaluated by user : this concerns Frame Error, Parity Error or Noise Error in Interrupt mode reception .

+           Received character is then retrieved and stored in Rx buffer, Error code is set to allow user to identify error type,

+           and HAL_UART_ErrorCallback() user callback is executed. Transfer is kept ongoing on UART side.

+           If user wants to abort it, Abort services should be called by user.

+       (+) Error is considered as Blocking : Transfer could not be completed properly and is aborted.

+           This concerns Overrun Error In Interrupt mode reception and all errors in DMA mode.

+           Error code is set to allow user to identify error type, and HAL_UART_ErrorCallback() user callback is executed.

+

+    -@- In the Half duplex communication, it is forbidden to run the transmit

+        and receive process in parallel, the UART state HAL_UART_STATE_BUSY_TX_RX can't be useful.

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief Send an amount of data in blocking mode.

+  * @note When FIFO mode is enabled, writing a data in the TDR register adds one

+  *       data to the TXFIFO. Write operations to the TDR register are performed

+  *       when TXFNF flag is set. From hardware perspective, TXFNF flag and

+  *       TXE are mapped on the same bit-field.

+  * @param huart   UART handle.

+  * @param pData   Pointer to data buffer.

+  * @param Size    Amount of data to be sent.

+  * @param Timeout Timeout duration.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

+{

+  uint8_t  *pdata8bits;

+  uint16_t *pdata16bits;

+  uint32_t tickstart;

+

+  /* Check that a Tx process is not already ongoing */

+  if (huart->gState == HAL_UART_STATE_READY)

+  {

+    if ((pData == NULL) || (Size == 0U))

+    {

+      return  HAL_ERROR;

+    }

+

+    __HAL_LOCK(huart);

+

+    huart->ErrorCode = HAL_UART_ERROR_NONE;

+    huart->gState = HAL_UART_STATE_BUSY_TX;

+

+    /* Init tickstart for timeout managment*/

+    tickstart = HAL_GetTick();

+

+    huart->TxXferSize  = Size;

+    huart->TxXferCount = Size;

+

+    /* In case of 9bits/No Parity transfer, pData 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;

+    }

+

+    while (huart->TxXferCount > 0U)

+    {

+      if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)

+      {

+        return HAL_TIMEOUT;

+      }

+      if (pdata8bits == NULL)

+      {

+        huart->Instance->TDR = (uint16_t)(*pdata16bits & 0x01FFU);

+        pdata16bits++;

+      }

+      else

+      {

+        huart->Instance->TDR = (uint8_t)(*pdata8bits & 0xFFU);

+        pdata8bits++;

+      }

+      huart->TxXferCount--;

+    }

+

+    if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)

+    {

+      return HAL_TIMEOUT;

+    }

+

+    /* At end of Tx process, restore huart->gState to Ready */

+    huart->gState = HAL_UART_STATE_READY;

+

+    __HAL_UNLOCK(huart);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief Receive an amount of data in blocking mode.

+  * @note When FIFO mode is enabled, the RXFNE flag is set as long as the RXFIFO

+  *       is not empty. Read operations from the RDR register are performed when

+  *       RXFNE flag is set. From hardware perspective, RXFNE flag and

+  *       RXNE are mapped on the same bit-field.

+  * @param huart   UART handle.

+  * @param pData   Pointer to data buffer.

+  * @param Size    Amount of data to be received.

+  * @param Timeout Timeout duration.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, 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;

+

+    /* Init tickstart for timeout managment*/

+    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;

+    }

+

+    /* as long as data have to be received */

+    while (huart->RxXferCount > 0U)

+    {

+      if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)

+      {

+        return HAL_TIMEOUT;

+      }

+      if (pdata8bits == NULL)

+      {

+        *pdata16bits = (uint16_t)(huart->Instance->RDR & uhMask);

+        pdata16bits++;

+      }

+      else

+      {

+        *pdata8bits = (uint8_t)(huart->Instance->RDR & (uint8_t)uhMask);

+        pdata8bits++;

+      }

+      huart->RxXferCount--;

+    }

+

+    /* At end of Rx process, restore huart->RxState to Ready */

+    huart->RxState = HAL_UART_STATE_READY;

+

+    __HAL_UNLOCK(huart);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief Send an amount of data in interrupt mode.

+  * @param huart UART handle.

+  * @param pData Pointer to data buffer.

+  * @param Size  Amount of data to be sent.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

+{

+  /* Check that a Tx process is not already ongoing */

+  if (huart->gState == HAL_UART_STATE_READY)

+  {

+    if ((pData == NULL) || (Size == 0U))

+    {

+      return HAL_ERROR;

+    }

+

+    __HAL_LOCK(huart);

+

+    huart->pTxBuffPtr  = pData;

+    huart->TxXferSize  = Size;

+    huart->TxXferCount = Size;

+    huart->TxISR       = NULL;

+

+    huart->ErrorCode = HAL_UART_ERROR_NONE;

+    huart->gState = HAL_UART_STATE_BUSY_TX;

+

+#if defined(USART_CR1_FIFOEN)

+    /* Configure Tx interrupt processing */

+    if (huart->FifoMode == UART_FIFOMODE_ENABLE)

+    {

+      /* Set the Tx ISR function pointer according to the data word length */

+      if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))

+      {

+        huart->TxISR = UART_TxISR_16BIT_FIFOEN;

+      }

+      else

+      {

+        huart->TxISR = UART_TxISR_8BIT_FIFOEN;

+      }

+

+      __HAL_UNLOCK(huart);

+

+      /* Enable the TX FIFO threshold interrupt */

+      SET_BIT(huart->Instance->CR3, USART_CR3_TXFTIE);

+    }

+    else

+    {

+      /* Set the Tx ISR function pointer according to the data word length */

+      if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))

+      {

+        huart->TxISR = UART_TxISR_16BIT;

+      }

+      else

+      {

+        huart->TxISR = UART_TxISR_8BIT;

+      }

+

+      __HAL_UNLOCK(huart);

+

+      /* Enable the Transmit Data Register Empty interrupt */

+      SET_BIT(huart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);

+    }

+#else

+    /* Set the Tx ISR function pointer according to the data word length */

+    if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))

+    {

+      huart->TxISR = UART_TxISR_16BIT;

+    }

+    else

+    {

+      huart->TxISR = UART_TxISR_8BIT;

+    }

+

+    __HAL_UNLOCK(huart);

+

+    /* Enable the Transmit Data Register Empty interrupt */

+    SET_BIT(huart->Instance->CR1, USART_CR1_TXEIE);

+#endif /* USART_CR1_FIFOEN */

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief Receive an amount of data in interrupt mode.

+  * @param huart UART handle.

+  * @param pData Pointer to data buffer.

+  * @param Size  Amount of data to be received.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

+{

+  /* 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->pRxBuffPtr  = pData;

+    huart->RxXferSize  = Size;

+    huart->RxXferCount = Size;

+    huart->RxISR       = NULL;

+

+    /* Computation of UART mask to apply to RDR register */

+    UART_MASK_COMPUTATION(huart);

+

+    huart->ErrorCode = HAL_UART_ERROR_NONE;

+    huart->RxState = HAL_UART_STATE_BUSY_RX;

+

+    /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */

+    SET_BIT(huart->Instance->CR3, USART_CR3_EIE);

+

+#if defined(USART_CR1_FIFOEN)

+    /* Configure Rx interrupt processing*/

+    if ((huart->FifoMode == UART_FIFOMODE_ENABLE) && (Size >= huart->NbRxDataToProcess))

+    {

+      /* Set the Rx ISR function pointer according to the data word length */

+      if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))

+      {

+        huart->RxISR = UART_RxISR_16BIT_FIFOEN;

+      }

+      else

+      {

+        huart->RxISR = UART_RxISR_8BIT_FIFOEN;

+      }

+

+      __HAL_UNLOCK(huart);

+

+      /* Enable the UART Parity Error interrupt and RX FIFO Threshold interrupt */

+      SET_BIT(huart->Instance->CR1, USART_CR1_PEIE);

+      SET_BIT(huart->Instance->CR3, USART_CR3_RXFTIE);

+    }

+    else

+    {

+      /* Set the Rx ISR function pointer according to the data word length */

+      if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))

+      {

+        huart->RxISR = UART_RxISR_16BIT;

+      }

+      else

+      {

+        huart->RxISR = UART_RxISR_8BIT;

+      }

+

+      __HAL_UNLOCK(huart);

+

+      /* Enable the UART Parity Error interrupt and Data Register Not Empty interrupt */

+      SET_BIT(huart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE);

+    }

+#else

+    /* Set the Rx ISR function pointer according to the data word length */

+    if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))

+    {

+      huart->RxISR = UART_RxISR_16BIT;

+    }

+    else

+    {

+      huart->RxISR = UART_RxISR_8BIT;

+    }

+

+    __HAL_UNLOCK(huart);

+

+    /* Enable the UART Parity Error interrupt and Data Register Not Empty interrupt */

+    SET_BIT(huart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE);

+#endif /* USART_CR1_FIFOEN */

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief Send an amount of data in DMA mode.

+  * @param huart UART handle.

+  * @param pData Pointer to data buffer.

+  * @param Size  Amount of data to be sent.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

+{

+  /* Check that a Tx process is not already ongoing */

+  if (huart->gState == HAL_UART_STATE_READY)

+  {

+    if ((pData == NULL) || (Size == 0U))

+    {

+      return HAL_ERROR;

+    }

+

+    __HAL_LOCK(huart);

+

+    huart->pTxBuffPtr  = pData;

+    huart->TxXferSize  = Size;

+    huart->TxXferCount = Size;

+

+    huart->ErrorCode = HAL_UART_ERROR_NONE;

+    huart->gState = HAL_UART_STATE_BUSY_TX;

+

+    if (huart->hdmatx != NULL)

+    {

+      /* Set the UART DMA transfer complete callback */

+      huart->hdmatx->XferCpltCallback = UART_DMATransmitCplt;

+

+      /* Set the UART DMA Half transfer complete callback */

+      huart->hdmatx->XferHalfCpltCallback = UART_DMATxHalfCplt;

+

+      /* Set the DMA error callback */

+      huart->hdmatx->XferErrorCallback = UART_DMAError;

+

+      /* Set the DMA abort callback */

+      huart->hdmatx->XferAbortCallback = NULL;

+

+      /* Enable the UART transmit DMA channel */

+      if (HAL_DMA_Start_IT(huart->hdmatx, (uint32_t)huart->pTxBuffPtr, (uint32_t)&huart->Instance->TDR, Size) != HAL_OK)

+      {

+        /* Set error code to DMA */

+        huart->ErrorCode = HAL_UART_ERROR_DMA;

+

+        __HAL_UNLOCK(huart);

+

+        /* Restore huart->gState to ready */

+        huart->gState = HAL_UART_STATE_READY;

+

+        return HAL_ERROR;

+      }

+    }

+    /* Clear the TC flag in the ICR register */

+    __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_TCF);

+

+    __HAL_UNLOCK(huart);

+

+    /* Enable the DMA transfer for transmit request by setting the DMAT bit

+    in the UART CR3 register */

+    SET_BIT(huart->Instance->CR3, USART_CR3_DMAT);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief Receive an amount of data in DMA mode.

+  * @note   When the UART parity is enabled (PCE = 1), the received data contain

+  *         the parity bit (MSB position).

+  * @param huart UART handle.

+  * @param pData Pointer to data buffer.

+  * @param Size  Amount of data to be received.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

+{

+  /* 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->pRxBuffPtr = pData;

+    huart->RxXferSize = Size;

+

+    huart->ErrorCode = HAL_UART_ERROR_NONE;

+    huart->RxState = HAL_UART_STATE_BUSY_RX;

+

+    if (huart->hdmarx != NULL)

+    {

+      /* Set the UART DMA transfer complete callback */

+      huart->hdmarx->XferCpltCallback = UART_DMAReceiveCplt;

+

+      /* Set the UART DMA Half transfer complete callback */

+      huart->hdmarx->XferHalfCpltCallback = UART_DMARxHalfCplt;

+

+      /* Set the DMA error callback */

+      huart->hdmarx->XferErrorCallback = UART_DMAError;

+

+      /* Set the DMA abort callback */

+      huart->hdmarx->XferAbortCallback = NULL;

+

+      /* Enable the DMA channel */

+      if (HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)&huart->Instance->RDR, (uint32_t)huart->pRxBuffPtr, Size) != HAL_OK)

+      {

+        /* Set error code to DMA */

+        huart->ErrorCode = HAL_UART_ERROR_DMA;

+

+        __HAL_UNLOCK(huart);

+

+        /* Restore huart->gState to ready */

+        huart->gState = HAL_UART_STATE_READY;

+

+        return HAL_ERROR;

+      }

+    }

+    __HAL_UNLOCK(huart);

+

+    /* Enable the UART Parity Error Interrupt */

+    SET_BIT(huart->Instance->CR1, USART_CR1_PEIE);

+

+    /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */

+    SET_BIT(huart->Instance->CR3, USART_CR3_EIE);

+

+    /* Enable the DMA transfer for the receiver request by setting the DMAR bit

+    in the UART CR3 register */

+    SET_BIT(huart->Instance->CR3, USART_CR3_DMAR);

+

+    return HAL_OK;

+  }

+  else

+  {

+    return HAL_BUSY;

+  }

+}

+

+/**

+  * @brief Pause the DMA Transfer.

+  * @param huart UART handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart)

+{

+  const HAL_UART_StateTypeDef gstate = huart->gState;

+  const HAL_UART_StateTypeDef rxstate = huart->RxState;

+

+  __HAL_LOCK(huart);

+

+  if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) &&

+      (gstate == HAL_UART_STATE_BUSY_TX))

+  {

+    /* Disable the UART DMA Tx request */

+    CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);

+  }

+  if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) &&

+      (rxstate == HAL_UART_STATE_BUSY_RX))

+  {

+    /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */

+    CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE);

+    CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);

+

+    /* Disable the UART DMA Rx request */

+    CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);

+  }

+

+  __HAL_UNLOCK(huart);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief Resume the DMA Transfer.

+  * @param huart UART handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart)

+{

+  __HAL_LOCK(huart);

+

+  if (huart->gState == HAL_UART_STATE_BUSY_TX)

+  {

+    /* Enable the UART DMA Tx request */

+    SET_BIT(huart->Instance->CR3, USART_CR3_DMAT);

+  }

+  if (huart->RxState == HAL_UART_STATE_BUSY_RX)

+  {

+    /* Clear the Overrun flag before resuming the Rx transfer */

+    __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF);

+

+    /* Reenable PE and ERR (Frame error, noise error, overrun error) interrupts */

+    SET_BIT(huart->Instance->CR1, USART_CR1_PEIE);

+    SET_BIT(huart->Instance->CR3, USART_CR3_EIE);

+

+    /* Enable the UART DMA Rx request */

+    SET_BIT(huart->Instance->CR3, USART_CR3_DMAR);

+  }

+

+  __HAL_UNLOCK(huart);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief Stop the DMA Transfer.

+  * @param huart UART handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart)

+{

+  /* The Lock is not implemented on this API to allow the user application

+     to call the HAL UART API under callbacks HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback() /

+     HAL_UART_TxHalfCpltCallback / HAL_UART_RxHalfCpltCallback:

+     indeed, when HAL_DMA_Abort() API is called, the DMA TX/RX Transfer or Half Transfer complete

+     interrupt is generated if the DMA transfer interruption occurs at the middle or at the end of

+     the stream and the corresponding call back is executed. */

+

+  const HAL_UART_StateTypeDef gstate = huart->gState;

+  const HAL_UART_StateTypeDef rxstate = huart->RxState;

+

+  /* Stop UART DMA Tx request if ongoing */

+  if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) &&

+      (gstate == HAL_UART_STATE_BUSY_TX))

+  {

+    CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);

+

+    /* Abort the UART DMA Tx channel */

+    if (huart->hdmatx != NULL)

+    {

+      if (HAL_DMA_Abort(huart->hdmatx) != HAL_OK)

+      {

+        if (HAL_DMA_GetError(huart->hdmatx) == HAL_DMA_ERROR_TIMEOUT)

+        {

+          /* Set error code to DMA */

+          huart->ErrorCode = HAL_UART_ERROR_DMA;

+

+          return HAL_TIMEOUT;

+        }

+      }

+    }

+

+    UART_EndTxTransfer(huart);

+  }

+

+  /* Stop UART DMA Rx request if ongoing */

+  if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) &&

+      (rxstate == HAL_UART_STATE_BUSY_RX))

+  {

+    CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);

+

+    /* Abort the UART DMA Rx channel */

+    if (huart->hdmarx != NULL)

+    {

+      if (HAL_DMA_Abort(huart->hdmarx) != HAL_OK)

+      {

+        if (HAL_DMA_GetError(huart->hdmarx) == HAL_DMA_ERROR_TIMEOUT)

+        {

+          /* Set error code to DMA */

+          huart->ErrorCode = HAL_UART_ERROR_DMA;

+

+          return HAL_TIMEOUT;

+        }

+      }

+    }

+

+    UART_EndRxTransfer(huart);

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Abort ongoing transfers (blocking mode).

+  * @param  huart UART handle.

+  * @note   This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode.

+  *         This procedure performs following operations :

+  *           - Disable UART Interrupts (Tx and Rx)

+  *           - Disable the DMA transfer in the peripheral register (if enabled)

+  *           - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)

+  *           - Set handle State to READY

+  * @note   This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart)

+{

+#if defined(USART_CR1_FIFOEN)

+  /* Disable TXE, TC, RXNE, PE, RXFT, TXFT and ERR (Frame error, noise error, overrun error) interrupts */

+  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE));

+  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE);

+#else

+  /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */

+  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));

+  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);

+#endif /* USART_CR1_FIFOEN */

+

+  /* Disable the UART DMA Tx request if enabled */

+  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT))

+  {

+    CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);

+

+    /* Abort the UART DMA Tx channel : use blocking DMA Abort API (no callback) */

+    if (huart->hdmatx != NULL)

+    {

+      /* Set the UART DMA Abort callback to Null.

+         No call back execution at end of DMA abort procedure */

+      huart->hdmatx->XferAbortCallback = NULL;

+

+      if (HAL_DMA_Abort(huart->hdmatx) != HAL_OK)

+      {

+        if (HAL_DMA_GetError(huart->hdmatx) == HAL_DMA_ERROR_TIMEOUT)

+        {

+          /* Set error code to DMA */

+          huart->ErrorCode = HAL_UART_ERROR_DMA;

+

+          return HAL_TIMEOUT;

+        }

+      }

+    }

+  }

+

+  /* Disable the UART DMA Rx request if enabled */

+  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))

+  {

+    CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);

+

+    /* Abort the UART DMA Rx channel : use blocking DMA Abort API (no callback) */

+    if (huart->hdmarx != NULL)

+    {

+      /* Set the UART DMA Abort callback to Null.

+         No call back execution at end of DMA abort procedure */

+      huart->hdmarx->XferAbortCallback = NULL;

+

+      if (HAL_DMA_Abort(huart->hdmarx) != HAL_OK)

+      {

+        if (HAL_DMA_GetError(huart->hdmarx) == HAL_DMA_ERROR_TIMEOUT)

+        {

+          /* Set error code to DMA */

+          huart->ErrorCode = HAL_UART_ERROR_DMA;

+

+          return HAL_TIMEOUT;

+        }

+      }

+    }

+  }

+

+  /* Reset Tx and Rx transfer counters */

+  huart->TxXferCount = 0U;

+  huart->RxXferCount = 0U;

+

+  /* Clear the Error flags in the ICR register */

+  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);

+

+#if defined(USART_CR1_FIFOEN)

+  /* Flush the whole TX FIFO (if needed) */

+  if (huart->FifoMode == UART_FIFOMODE_ENABLE)

+  {

+    __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST);

+  }

+#endif /* USART_CR1_FIFOEN */

+

+  /* Discard the received data */

+  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);

+

+  /* Restore huart->gState and huart->RxState to Ready */

+  huart->gState  = HAL_UART_STATE_READY;

+  huart->RxState = HAL_UART_STATE_READY;

+

+  huart->ErrorCode = HAL_UART_ERROR_NONE;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Abort ongoing Transmit transfer (blocking mode).

+  * @param  huart UART handle.

+  * @note   This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode.

+  *         This procedure performs following operations :

+  *           - Disable UART Interrupts (Tx)

+  *           - Disable the DMA transfer in the peripheral register (if enabled)

+  *           - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)

+  *           - Set handle State to READY

+  * @note   This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart)

+{

+#if defined(USART_CR1_FIFOEN)

+  /* Disable TCIE, TXEIE and TXFTIE interrupts */

+  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TCIE | USART_CR1_TXEIE_TXFNFIE));

+  CLEAR_BIT(huart->Instance->CR3, USART_CR3_TXFTIE);

+#else

+  /* Disable TXEIE and TCIE interrupts */

+  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));

+#endif /* USART_CR1_FIFOEN */

+

+  /* Disable the UART DMA Tx request if enabled */

+  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT))

+  {

+    CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);

+

+    /* Abort the UART DMA Tx channel : use blocking DMA Abort API (no callback) */

+    if (huart->hdmatx != NULL)

+    {

+      /* Set the UART DMA Abort callback to Null.

+         No call back execution at end of DMA abort procedure */

+      huart->hdmatx->XferAbortCallback = NULL;

+

+      if (HAL_DMA_Abort(huart->hdmatx) != HAL_OK)

+      {

+        if (HAL_DMA_GetError(huart->hdmatx) == HAL_DMA_ERROR_TIMEOUT)

+        {

+          /* Set error code to DMA */

+          huart->ErrorCode = HAL_UART_ERROR_DMA;

+

+          return HAL_TIMEOUT;

+        }

+      }

+    }

+  }

+

+  /* Reset Tx transfer counter */

+  huart->TxXferCount = 0U;

+

+#if defined(USART_CR1_FIFOEN)

+  /* Flush the whole TX FIFO (if needed) */

+  if (huart->FifoMode == UART_FIFOMODE_ENABLE)

+  {

+    __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST);

+  }

+#endif /* USART_CR1_FIFOEN */

+

+  /* Restore huart->gState to Ready */

+  huart->gState = HAL_UART_STATE_READY;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Abort ongoing Receive transfer (blocking mode).

+  * @param  huart UART handle.

+  * @note   This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode.

+  *         This procedure performs following operations :

+  *           - Disable UART Interrupts (Rx)

+  *           - Disable the DMA transfer in the peripheral register (if enabled)

+  *           - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode)

+  *           - Set handle State to READY

+  * @note   This procedure is executed in blocking mode : when exiting function, Abort is considered as completed.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart)

+{

+#if defined(USART_CR1_FIFOEN)

+  /* Disable PEIE, EIE, RXNEIE and RXFTIE interrupts */

+  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE));

+  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE | USART_CR3_RXFTIE);

+#else

+  /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */

+  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));

+  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);

+#endif /* USART_CR1_FIFOEN */

+

+  /* Disable the UART DMA Rx request if enabled */

+  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))

+  {

+    CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);

+

+    /* Abort the UART DMA Rx channel : use blocking DMA Abort API (no callback) */

+    if (huart->hdmarx != NULL)

+    {

+      /* Set the UART DMA Abort callback to Null.

+         No call back execution at end of DMA abort procedure */

+      huart->hdmarx->XferAbortCallback = NULL;

+

+      if (HAL_DMA_Abort(huart->hdmarx) != HAL_OK)

+      {

+        if (HAL_DMA_GetError(huart->hdmarx) == HAL_DMA_ERROR_TIMEOUT)

+        {

+          /* Set error code to DMA */

+          huart->ErrorCode = HAL_UART_ERROR_DMA;

+

+          return HAL_TIMEOUT;

+        }

+      }

+    }

+  }

+

+  /* Reset Rx transfer counter */

+  huart->RxXferCount = 0U;

+

+  /* Clear the Error flags in the ICR register */

+  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);

+

+  /* Discard the received data */

+  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);

+

+  /* Restore huart->RxState to Ready */

+  huart->RxState = HAL_UART_STATE_READY;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Abort ongoing transfers (Interrupt mode).

+  * @param  huart UART handle.

+  * @note   This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode.

+  *         This procedure performs following operations :

+  *           - Disable UART Interrupts (Tx and Rx)

+  *           - Disable the DMA transfer in the peripheral register (if enabled)

+  *           - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)

+  *           - Set handle State to READY

+  *           - At abort completion, call user abort complete callback

+  * @note   This procedure is executed in Interrupt mode, meaning that abort procedure could be

+  *         considered as completed only when user abort complete callback is executed (not when exiting function).

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart)

+{

+  uint32_t abortcplt = 1U;

+

+  /* Disable interrupts */

+#if defined(USART_CR1_FIFOEN)

+  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_PEIE | USART_CR1_TCIE | USART_CR1_RXNEIE_RXFNEIE | USART_CR1_TXEIE_TXFNFIE));

+  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE));

+#else

+  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE));

+  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);

+#endif /* USART_CR1_FIFOEN */

+

+  /* If DMA Tx and/or DMA Rx Handles are associated to UART Handle, DMA Abort complete callbacks should be initialised

+     before any call to DMA Abort functions */

+  /* DMA Tx Handle is valid */

+  if (huart->hdmatx != NULL)

+  {

+    /* Set DMA Abort Complete callback if UART DMA Tx request if enabled.

+       Otherwise, set it to NULL */

+    if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT))

+    {

+      huart->hdmatx->XferAbortCallback = UART_DMATxAbortCallback;

+    }

+    else

+    {

+      huart->hdmatx->XferAbortCallback = NULL;

+    }

+  }

+  /* DMA Rx Handle is valid */

+  if (huart->hdmarx != NULL)

+  {

+    /* Set DMA Abort Complete callback if UART DMA Rx request if enabled.

+       Otherwise, set it to NULL */

+    if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))

+    {

+      huart->hdmarx->XferAbortCallback = UART_DMARxAbortCallback;

+    }

+    else

+    {

+      huart->hdmarx->XferAbortCallback = NULL;

+    }

+  }

+

+  /* Disable the UART DMA Tx request if enabled */

+  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT))

+  {

+    /* Disable DMA Tx at UART level */

+    CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);

+

+    /* Abort the UART DMA Tx channel : use non blocking DMA Abort API (callback) */

+    if (huart->hdmatx != NULL)

+    {

+      /* UART Tx DMA Abort callback has already been initialised :

+         will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */

+

+      /* Abort DMA TX */

+      if (HAL_DMA_Abort_IT(huart->hdmatx) != HAL_OK)

+      {

+        huart->hdmatx->XferAbortCallback = NULL;

+      }

+      else

+      {

+        abortcplt = 0U;

+      }

+    }

+  }

+

+  /* Disable the UART DMA Rx request if enabled */

+  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))

+  {

+    CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);

+

+    /* Abort the UART DMA Rx channel : use non blocking DMA Abort API (callback) */

+    if (huart->hdmarx != NULL)

+    {

+      /* UART Rx DMA Abort callback has already been initialised :

+         will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */

+

+      /* Abort DMA RX */

+      if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK)

+      {

+        huart->hdmarx->XferAbortCallback = NULL;

+        abortcplt = 1U;

+      }

+      else

+      {

+        abortcplt = 0U;

+      }

+    }

+  }

+

+  /* if no DMA abort complete callback execution is required => call user Abort Complete callback */

+  if (abortcplt == 1U)

+  {

+    /* Reset Tx and Rx transfer counters */

+    huart->TxXferCount = 0U;

+    huart->RxXferCount = 0U;

+

+    /* Clear ISR function pointers */

+    huart->RxISR = NULL;

+    huart->TxISR = NULL;

+

+    /* Reset errorCode */

+    huart->ErrorCode = HAL_UART_ERROR_NONE;

+

+    /* Clear the Error flags in the ICR register */

+    __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);

+

+#if defined(USART_CR1_FIFOEN)

+    /* Flush the whole TX FIFO (if needed) */

+    if (huart->FifoMode == UART_FIFOMODE_ENABLE)

+    {

+      __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST);

+    }

+#endif /* USART_CR1_FIFOEN */

+

+    /* Discard the received data */

+    __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);

+

+    /* Restore huart->gState and huart->RxState to Ready */

+    huart->gState  = HAL_UART_STATE_READY;

+    huart->RxState = HAL_UART_STATE_READY;

+

+    /* As no DMA to be aborted, call directly user Abort complete callback */

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+    /* Call registered Abort complete callback */

+    huart->AbortCpltCallback(huart);

+#else

+    /* Call legacy weak Abort complete callback */

+    HAL_UART_AbortCpltCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Abort ongoing Transmit transfer (Interrupt mode).

+  * @param  huart UART handle.

+  * @note   This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode.

+  *         This procedure performs following operations :

+  *           - Disable UART Interrupts (Tx)

+  *           - Disable the DMA transfer in the peripheral register (if enabled)

+  *           - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)

+  *           - Set handle State to READY

+  *           - At abort completion, call user abort complete callback

+  * @note   This procedure is executed in Interrupt mode, meaning that abort procedure could be

+  *         considered as completed only when user abort complete callback is executed (not when exiting function).

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart)

+{

+  /* Disable interrupts */

+#if defined(USART_CR1_FIFOEN)

+  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TCIE | USART_CR1_TXEIE_TXFNFIE));

+  CLEAR_BIT(huart->Instance->CR3, USART_CR3_TXFTIE);

+#else

+  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));

+#endif /* USART_CR1_FIFOEN */

+

+  /* Disable the UART DMA Tx request if enabled */

+  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT))

+  {

+    CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);

+

+    /* Abort the UART DMA Tx channel : use non blocking DMA Abort API (callback) */

+    if (huart->hdmatx != NULL)

+    {

+      /* Set the UART DMA Abort callback :

+         will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */

+      huart->hdmatx->XferAbortCallback = UART_DMATxOnlyAbortCallback;

+

+      /* Abort DMA TX */

+      if (HAL_DMA_Abort_IT(huart->hdmatx) != HAL_OK)

+      {

+        /* Call Directly huart->hdmatx->XferAbortCallback function in case of error */

+        huart->hdmatx->XferAbortCallback(huart->hdmatx);

+      }

+    }

+    else

+    {

+      /* Reset Tx transfer counter */

+      huart->TxXferCount = 0U;

+

+      /* Clear TxISR function pointers */

+      huart->TxISR = NULL;

+

+      /* Restore huart->gState to Ready */

+      huart->gState = HAL_UART_STATE_READY;

+

+      /* As no DMA to be aborted, call directly user Abort complete callback */

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+      /* Call registered Abort Transmit Complete Callback */

+      huart->AbortTransmitCpltCallback(huart);

+#else

+      /* Call legacy weak Abort Transmit Complete Callback */

+      HAL_UART_AbortTransmitCpltCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+    }

+  }

+  else

+  {

+    /* Reset Tx transfer counter */

+    huart->TxXferCount = 0U;

+

+    /* Clear TxISR function pointers */

+    huart->TxISR = NULL;

+

+#if defined(USART_CR1_FIFOEN)

+    /* Flush the whole TX FIFO (if needed) */

+    if (huart->FifoMode == UART_FIFOMODE_ENABLE)

+    {

+      __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST);

+    }

+#endif /* USART_CR1_FIFOEN */

+

+    /* Restore huart->gState to Ready */

+    huart->gState = HAL_UART_STATE_READY;

+

+    /* As no DMA to be aborted, call directly user Abort complete callback */

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+    /* Call registered Abort Transmit Complete Callback */

+    huart->AbortTransmitCpltCallback(huart);

+#else

+    /* Call legacy weak Abort Transmit Complete Callback */

+    HAL_UART_AbortTransmitCpltCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Abort ongoing Receive transfer (Interrupt mode).

+  * @param  huart UART handle.

+  * @note   This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode.

+  *         This procedure performs following operations :

+  *           - Disable UART Interrupts (Rx)

+  *           - Disable the DMA transfer in the peripheral register (if enabled)

+  *           - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode)

+  *           - Set handle State to READY

+  *           - At abort completion, call user abort complete callback

+  * @note   This procedure is executed in Interrupt mode, meaning that abort procedure could be

+  *         considered as completed only when user abort complete callback is executed (not when exiting function).

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart)

+{

+  /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */

+#if defined(USART_CR1_FIFOEN)

+  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE));

+  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));

+#else

+  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));

+  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);

+#endif /* USART_CR1_FIFOEN */

+

+  /* Disable the UART DMA Rx request if enabled */

+  if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))

+  {

+    CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);

+

+    /* Abort the UART DMA Rx channel : use non blocking DMA Abort API (callback) */

+    if (huart->hdmarx != NULL)

+    {

+      /* Set the UART DMA Abort callback :

+         will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */

+      huart->hdmarx->XferAbortCallback = UART_DMARxOnlyAbortCallback;

+

+      /* Abort DMA RX */

+      if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK)

+      {

+        /* Call Directly huart->hdmarx->XferAbortCallback function in case of error */

+        huart->hdmarx->XferAbortCallback(huart->hdmarx);

+      }

+    }

+    else

+    {

+      /* Reset Rx transfer counter */

+      huart->RxXferCount = 0U;

+

+      /* Clear RxISR function pointer */

+      huart->pRxBuffPtr = NULL;

+

+      /* Clear the Error flags in the ICR register */

+      __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);

+

+      /* Discard the received data */

+      __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);

+

+      /* Restore huart->RxState to Ready */

+      huart->RxState = HAL_UART_STATE_READY;

+

+      /* As no DMA to be aborted, call directly user Abort complete callback */

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+      /* Call registered Abort Receive Complete Callback */

+      huart->AbortReceiveCpltCallback(huart);

+#else

+      /* Call legacy weak Abort Receive Complete Callback */

+      HAL_UART_AbortReceiveCpltCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+    }

+  }

+  else

+  {

+    /* Reset Rx transfer counter */

+    huart->RxXferCount = 0U;

+

+    /* Clear RxISR function pointer */

+    huart->pRxBuffPtr = NULL;

+

+    /* Clear the Error flags in the ICR register */

+    __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);

+

+    /* Restore huart->RxState to Ready */

+    huart->RxState = HAL_UART_STATE_READY;

+

+    /* As no DMA to be aborted, call directly user Abort complete callback */

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+    /* Call registered Abort Receive Complete Callback */

+    huart->AbortReceiveCpltCallback(huart);

+#else

+    /* Call legacy weak Abort Receive Complete Callback */

+    HAL_UART_AbortReceiveCpltCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief Handle UART interrupt request.

+  * @param huart UART handle.

+  * @retval None

+  */

+void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)

+{

+  uint32_t isrflags   = READ_REG(huart->Instance->ISR);

+  uint32_t cr1its     = READ_REG(huart->Instance->CR1);

+  uint32_t cr3its     = READ_REG(huart->Instance->CR3);

+

+  uint32_t errorflags;

+  uint32_t errorcode;

+

+  /* If no error occurs */

+  errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE));

+  if (errorflags == 0U)

+  {

+    /* UART in mode Receiver ---------------------------------------------------*/

+#if defined(USART_CR1_FIFOEN)

+    if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)

+        && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)

+            || ((cr3its & USART_CR3_RXFTIE) != 0U)))

+#else

+    if (((isrflags & USART_ISR_RXNE) != 0U)

+        && ((cr1its & USART_CR1_RXNEIE) != 0U))

+#endif /* USART_CR1_FIFOEN */

+    {

+      if (huart->RxISR != NULL)

+      {

+        huart->RxISR(huart);

+      }

+      return;

+    }

+  }

+

+  /* If some errors occur */

+#if defined(USART_CR1_FIFOEN)

+  if ((errorflags != 0U)

+      && ((((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U)

+           || ((cr1its & (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)) != 0U))))

+#else

+  if ((errorflags != 0U)

+      && (((cr3its & USART_CR3_EIE) != 0U)

+          || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != 0U)))

+#endif /* USART_CR1_FIFOEN */

+  {

+    /* UART parity error interrupt occurred -------------------------------------*/

+    if (((isrflags & USART_ISR_PE) != 0U) && ((cr1its & USART_CR1_PEIE) != 0U))

+    {

+      __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_PEF);

+

+      huart->ErrorCode |= HAL_UART_ERROR_PE;

+    }

+

+    /* UART frame error interrupt occurred --------------------------------------*/

+    if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))

+    {

+      __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF);

+

+      huart->ErrorCode |= HAL_UART_ERROR_FE;

+    }

+

+    /* UART noise error interrupt occurred --------------------------------------*/

+    if (((isrflags & USART_ISR_NE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))

+    {

+      __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_NEF);

+

+      huart->ErrorCode |= HAL_UART_ERROR_NE;

+    }

+

+    /* UART Over-Run interrupt occurred -----------------------------------------*/

+#if defined(USART_CR1_FIFOEN)

+    if (((isrflags & USART_ISR_ORE) != 0U)

+        && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) ||

+            ((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U)))

+#else

+    if (((isrflags & USART_ISR_ORE) != 0U)

+        && (((cr1its & USART_CR1_RXNEIE) != 0U) ||

+            ((cr3its & USART_CR3_EIE) != 0U)))

+#endif /* USART_CR1_FIFOEN */

+    {

+      __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF);

+

+      huart->ErrorCode |= HAL_UART_ERROR_ORE;

+    }

+

+    /* Call UART Error Call back function if need be --------------------------*/

+    if (huart->ErrorCode != HAL_UART_ERROR_NONE)

+    {

+      /* UART in mode Receiver ---------------------------------------------------*/

+#if defined(USART_CR1_FIFOEN)

+      if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)

+          && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)

+              || ((cr3its & USART_CR3_RXFTIE) != 0U)))

+#else

+      if (((isrflags & USART_ISR_RXNE) != 0U)

+          && ((cr1its & USART_CR1_RXNEIE) != 0U))

+#endif /* USART_CR1_FIFOEN */

+      {

+        if (huart->RxISR != NULL)

+        {

+          huart->RxISR(huart);

+        }

+      }

+

+      /* If Overrun error occurs, or if any error occurs in DMA mode reception,

+         consider error as blocking */

+      errorcode = huart->ErrorCode;

+      if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) ||

+          ((errorcode & HAL_UART_ERROR_ORE) != 0U))

+      {

+        /* Blocking error : transfer is aborted

+           Set the UART state ready to be able to start again the process,

+           Disable Rx Interrupts, and disable Rx DMA request, if ongoing */

+        UART_EndRxTransfer(huart);

+

+        /* Disable the UART DMA Rx request if enabled */

+        if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR))

+        {

+          CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);

+

+          /* Abort the UART DMA Rx channel */

+          if (huart->hdmarx != NULL)

+          {

+            /* Set the UART DMA Abort callback :

+               will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */

+            huart->hdmarx->XferAbortCallback = UART_DMAAbortOnError;

+

+            /* Abort DMA RX */

+            if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK)

+            {

+              /* Call Directly huart->hdmarx->XferAbortCallback function in case of error */

+              huart->hdmarx->XferAbortCallback(huart->hdmarx);

+            }

+          }

+          else

+          {

+            /* Call user error callback */

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+            /*Call registered error callback*/

+            huart->ErrorCallback(huart);

+#else

+            /*Call legacy weak error callback*/

+            HAL_UART_ErrorCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+

+          }

+        }

+        else

+        {

+          /* Call user error callback */

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+          /*Call registered error callback*/

+          huart->ErrorCallback(huart);

+#else

+          /*Call legacy weak error callback*/

+          HAL_UART_ErrorCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+        }

+      }

+      else

+      {

+        /* Non Blocking error : transfer could go on.

+           Error is notified to user through user error callback */

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+        /*Call registered error callback*/

+        huart->ErrorCallback(huart);

+#else

+        /*Call legacy weak error callback*/

+        HAL_UART_ErrorCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+        huart->ErrorCode = HAL_UART_ERROR_NONE;

+      }

+    }

+    return;

+

+  } /* End if some error occurs */

+

+  /* UART wakeup from Stop mode interrupt occurred ---------------------------*/

+  if (((isrflags & USART_ISR_WUF) != 0U) && ((cr3its & USART_CR3_WUFIE) != 0U))

+  {

+    __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_WUF);

+

+    /* UART Rx state is not reset as a reception process might be ongoing.

+       If UART handle state fields need to be reset to READY, this could be done in Wakeup callback */

+

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+    /* Call registered Wakeup Callback */

+    huart->WakeupCallback(huart);

+#else

+    /* Call legacy weak Wakeup Callback */

+    HAL_UARTEx_WakeupCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+    return;

+  }

+

+  /* UART in mode Transmitter ------------------------------------------------*/

+#if defined(USART_CR1_FIFOEN)

+  if (((isrflags & USART_ISR_TXE_TXFNF) != 0U)

+      && (((cr1its & USART_CR1_TXEIE_TXFNFIE) != 0U)

+          || ((cr3its & USART_CR3_TXFTIE) != 0U)))

+#else

+  if (((isrflags & USART_ISR_TXE) != 0U)

+      && ((cr1its & USART_CR1_TXEIE) != 0U))

+#endif /* USART_CR1_FIFOEN */

+  {

+    if (huart->TxISR != NULL)

+    {

+      huart->TxISR(huart);

+    }

+    return;

+  }

+

+  /* UART in mode Transmitter (transmission end) -----------------------------*/

+  if (((isrflags & USART_ISR_TC) != 0U) && ((cr1its & USART_CR1_TCIE) != 0U))

+  {

+    UART_EndTransmit_IT(huart);

+    return;

+  }

+

+#if defined(USART_CR1_FIFOEN)

+  /* UART TX Fifo Empty occurred ----------------------------------------------*/

+  if (((isrflags & USART_ISR_TXFE) != 0U) && ((cr1its & USART_CR1_TXFEIE) != 0U))

+  {

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+    /* Call registered Tx Fifo Empty Callback */

+    huart->TxFifoEmptyCallback(huart);

+#else

+    /* Call legacy weak Tx Fifo Empty Callback */

+    HAL_UARTEx_TxFifoEmptyCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+    return;

+  }

+

+  /* UART RX Fifo Full occurred ----------------------------------------------*/

+  if (((isrflags & USART_ISR_RXFF) != 0U) && ((cr1its & USART_CR1_RXFFIE) != 0U))

+  {

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+    /* Call registered Rx Fifo Full Callback */

+    huart->RxFifoFullCallback(huart);

+#else

+    /* Call legacy weak Rx Fifo Full Callback */

+    HAL_UARTEx_RxFifoFullCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+    return;

+  }

+#endif /* USART_CR1_FIFOEN */

+}

+

+/**

+  * @brief Tx Transfer completed callback.

+  * @param huart UART handle.

+  * @retval None

+  */

+__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(huart);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_UART_TxCpltCallback can be implemented in the user file.

+   */

+}

+

+/**

+  * @brief  Tx Half Transfer completed callback.

+  * @param  huart UART handle.

+  * @retval None

+  */

+__weak void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(huart);

+

+  /* NOTE: This function should not be modified, when the callback is needed,

+           the HAL_UART_TxHalfCpltCallback can be implemented in the user file.

+   */

+}

+

+/**

+  * @brief  Rx Transfer completed callback.

+  * @param  huart UART handle.

+  * @retval None

+  */

+__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(huart);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_UART_RxCpltCallback can be implemented in the user file.

+   */

+}

+

+/**

+  * @brief  Rx Half Transfer completed callback.

+  * @param  huart UART handle.

+  * @retval None

+  */

+__weak void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(huart);

+

+  /* NOTE: This function should not be modified, when the callback is needed,

+           the HAL_UART_RxHalfCpltCallback can be implemented in the user file.

+   */

+}

+

+/**

+  * @brief  UART error callback.

+  * @param  huart UART handle.

+  * @retval None

+  */

+__weak void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(huart);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_UART_ErrorCallback can be implemented in the user file.

+   */

+}

+

+/**

+  * @brief  UART Abort Complete callback.

+  * @param  huart UART handle.

+  * @retval None

+  */

+__weak void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(huart);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_UART_AbortCpltCallback can be implemented in the user file.

+   */

+}

+

+/**

+  * @brief  UART Abort Complete callback.

+  * @param  huart UART handle.

+  * @retval None

+  */

+__weak void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(huart);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_UART_AbortTransmitCpltCallback can be implemented in the user file.

+   */

+}

+

+/**

+  * @brief  UART Abort Receive Complete callback.

+  * @param  huart UART handle.

+  * @retval None

+  */

+__weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(huart);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_UART_AbortReceiveCpltCallback can be implemented in the user file.

+   */

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup UART_Exported_Functions_Group3 Peripheral Control functions

+  *  @brief   UART control functions

+  *

+@verbatim

+ ===============================================================================

+                      ##### Peripheral Control functions #####

+ ===============================================================================

+    [..]

+    This subsection provides a set of functions allowing to control the UART.

+     (+) HAL_MultiProcessor_EnableMuteMode() API enables mute mode

+     (+) HAL_MultiProcessor_DisableMuteMode() API disables mute mode

+     (+) HAL_MultiProcessor_EnterMuteMode() API enters mute mode

+     (+) UART_SetConfig() API configures the UART peripheral

+     (+) UART_AdvFeatureConfig() API optionally configures the UART advanced features

+     (+) UART_CheckIdleState() API ensures that TEACK and/or REACK are set after initialization

+     (+) HAL_HalfDuplex_EnableTransmitter() API disables receiver and enables transmitter

+     (+) HAL_HalfDuplex_EnableReceiver() API disables transmitter and enables receiver

+     (+) HAL_LIN_SendBreak() API transmits the break characters

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Enable UART in mute mode (does not mean UART enters mute mode;

+  *         to enter mute mode, HAL_MultiProcessor_EnterMuteMode() API must be called).

+  * @param  huart UART handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_MultiProcessor_EnableMuteMode(UART_HandleTypeDef *huart)

+{

+  __HAL_LOCK(huart);

+

+  huart->gState = HAL_UART_STATE_BUSY;

+

+  /* Enable USART mute mode by setting the MME bit in the CR1 register */

+  SET_BIT(huart->Instance->CR1, USART_CR1_MME);

+

+  huart->gState = HAL_UART_STATE_READY;

+

+  return (UART_CheckIdleState(huart));

+}

+

+/**

+  * @brief  Disable UART mute mode (does not mean the UART actually exits mute mode

+  *         as it may not have been in mute mode at this very moment).

+  * @param  huart UART handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_MultiProcessor_DisableMuteMode(UART_HandleTypeDef *huart)

+{

+  __HAL_LOCK(huart);

+

+  huart->gState = HAL_UART_STATE_BUSY;

+

+  /* Disable USART mute mode by clearing the MME bit in the CR1 register */

+  CLEAR_BIT(huart->Instance->CR1, USART_CR1_MME);

+

+  huart->gState = HAL_UART_STATE_READY;

+

+  return (UART_CheckIdleState(huart));

+}

+

+/**

+  * @brief Enter UART mute mode (means UART actually enters mute mode).

+  * @note  To exit from mute mode, HAL_MultiProcessor_DisableMuteMode() API must be called.

+  * @param huart UART handle.

+  * @retval None

+  */

+void HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart)

+{

+  __HAL_UART_SEND_REQ(huart, UART_MUTE_MODE_REQUEST);

+}

+

+/**

+  * @brief  Enable the UART transmitter and disable the UART receiver.

+  * @param  huart UART handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart)

+{

+  __HAL_LOCK(huart);

+  huart->gState = HAL_UART_STATE_BUSY;

+

+  /* Clear TE and RE bits */

+  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TE | USART_CR1_RE));

+

+  /* Enable the USART's transmit interface by setting the TE bit in the USART CR1 register */

+  SET_BIT(huart->Instance->CR1, USART_CR1_TE);

+

+  huart->gState = HAL_UART_STATE_READY;

+

+  __HAL_UNLOCK(huart);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Enable the UART receiver and disable the UART transmitter.

+  * @param  huart UART handle.

+  * @retval HAL status.

+  */

+HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart)

+{

+  __HAL_LOCK(huart);

+  huart->gState = HAL_UART_STATE_BUSY;

+

+  /* Clear TE and RE bits */

+  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TE | USART_CR1_RE));

+

+  /* Enable the USART's receive interface by setting the RE bit in the USART CR1 register */

+  SET_BIT(huart->Instance->CR1, USART_CR1_RE);

+

+  huart->gState = HAL_UART_STATE_READY;

+

+  __HAL_UNLOCK(huart);

+

+  return HAL_OK;

+}

+

+

+/**

+  * @brief  Transmit break characters.

+  * @param  huart UART handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart)

+{

+  /* Check the parameters */

+  assert_param(IS_UART_LIN_INSTANCE(huart->Instance));

+

+  __HAL_LOCK(huart);

+

+  huart->gState = HAL_UART_STATE_BUSY;

+

+  /* Send break characters */

+  __HAL_UART_SEND_REQ(huart, UART_SENDBREAK_REQUEST);

+

+  huart->gState = HAL_UART_STATE_READY;

+

+  __HAL_UNLOCK(huart);

+

+  return HAL_OK;

+}

+

+/**

+  * @}

+  */

+

+/** @defgroup UART_Exported_Functions_Group4 Peripheral State and Error functions

+  *  @brief   UART Peripheral State functions

+  *

+@verbatim

+  ==============================================================================

+            ##### Peripheral State and Error functions #####

+  ==============================================================================

+    [..]

+    This subsection provides functions allowing to :

+      (+) Return the UART handle state.

+      (+) Return the UART handle error code

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief Return the UART handle state.

+  * @param  huart Pointer to a UART_HandleTypeDef structure that contains

+  *               the configuration information for the specified UART.

+  * @retval HAL state

+  */

+HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart)

+{

+  uint32_t temp1;

+  uint32_t temp2;

+  temp1 = huart->gState;

+  temp2 = huart->RxState;

+

+  return (HAL_UART_StateTypeDef)(temp1 | temp2);

+}

+

+/**

+  * @brief  Return the UART handle error code.

+  * @param  huart Pointer to a UART_HandleTypeDef structure that contains

+  *               the configuration information for the specified UART.

+  * @retval UART Error Code

+  */

+uint32_t HAL_UART_GetError(UART_HandleTypeDef *huart)

+{

+  return huart->ErrorCode;

+}

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/** @defgroup UART_Private_Functions UART Private Functions

+  * @{

+  */

+

+/**

+  * @brief  Initialize the callbacks to their default values.

+  * @param  huart UART handle.

+  * @retval none

+  */

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+void UART_InitCallbacksToDefault(UART_HandleTypeDef *huart)

+{

+  /* Init the UART Callback settings */

+  huart->TxHalfCpltCallback        = HAL_UART_TxHalfCpltCallback;        /* Legacy weak TxHalfCpltCallback        */

+  huart->TxCpltCallback            = HAL_UART_TxCpltCallback;            /* Legacy weak TxCpltCallback            */

+  huart->RxHalfCpltCallback        = HAL_UART_RxHalfCpltCallback;        /* Legacy weak RxHalfCpltCallback        */

+  huart->RxCpltCallback            = HAL_UART_RxCpltCallback;            /* Legacy weak RxCpltCallback            */

+  huart->ErrorCallback             = HAL_UART_ErrorCallback;             /* Legacy weak ErrorCallback             */

+  huart->AbortCpltCallback         = HAL_UART_AbortCpltCallback;         /* Legacy weak AbortCpltCallback         */

+  huart->AbortTransmitCpltCallback = HAL_UART_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */

+  huart->AbortReceiveCpltCallback  = HAL_UART_AbortReceiveCpltCallback;  /* Legacy weak AbortReceiveCpltCallback  */

+  huart->WakeupCallback            = HAL_UARTEx_WakeupCallback;          /* Legacy weak WakeupCallback            */

+#if defined(USART_CR1_FIFOEN)

+  huart->RxFifoFullCallback        = HAL_UARTEx_RxFifoFullCallback;      /* Legacy weak RxFifoFullCallback        */

+  huart->TxFifoEmptyCallback       = HAL_UARTEx_TxFifoEmptyCallback;     /* Legacy weak TxFifoEmptyCallback       */

+#endif /* USART_CR1_FIFOEN */

+

+}

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+

+/**

+  * @brief Configure the UART peripheral.

+  * @param huart UART handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart)

+{

+  uint32_t tmpreg;

+  uint16_t brrtemp;

+  UART_ClockSourceTypeDef clocksource;

+  uint32_t usartdiv                   = 0x00000000U;

+  HAL_StatusTypeDef ret               = HAL_OK;

+  uint32_t lpuart_ker_ck_pres         = 0x00000000U;

+

+  /* Check the parameters */

+  assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate));

+  assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength));

+  if (UART_INSTANCE_LOWPOWER(huart))

+  {

+    assert_param(IS_LPUART_STOPBITS(huart->Init.StopBits));

+  }

+  else

+  {

+    assert_param(IS_UART_STOPBITS(huart->Init.StopBits));

+    assert_param(IS_UART_ONE_BIT_SAMPLE(huart->Init.OneBitSampling));

+  }

+

+  assert_param(IS_UART_PARITY(huart->Init.Parity));

+  assert_param(IS_UART_MODE(huart->Init.Mode));

+  assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl));

+  assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling));

+#if defined(USART_PRESC_PRESCALER)

+  assert_param(IS_UART_PRESCALER(huart->Init.ClockPrescaler));

+#endif /* USART_PRESC_PRESCALER */

+

+  /*-------------------------- USART CR1 Configuration -----------------------*/

+  /* Clear M, PCE, PS, TE, RE and OVER8 bits and configure

+  *  the UART Word Length, Parity, Mode and oversampling:

+  *  set the M bits according to huart->Init.WordLength value

+  *  set PCE and PS bits according to huart->Init.Parity value

+  *  set TE and RE bits according to huart->Init.Mode value

+  *  set OVER8 bit according to huart->Init.OverSampling value */

+  tmpreg = (uint32_t)huart->Init.WordLength | huart->Init.Parity | huart->Init.Mode | huart->Init.OverSampling ;

+#if defined(USART_CR1_FIFOEN)

+  tmpreg |= (uint32_t)huart->FifoMode;

+#endif /* USART_CR1_FIFOEN */

+  MODIFY_REG(huart->Instance->CR1, USART_CR1_FIELDS, tmpreg);

+

+  /*-------------------------- USART CR2 Configuration -----------------------*/

+  /* Configure the UART Stop Bits: Set STOP[13:12] bits according

+  * to huart->Init.StopBits value */

+  MODIFY_REG(huart->Instance->CR2, USART_CR2_STOP, huart->Init.StopBits);

+

+  /*-------------------------- USART CR3 Configuration -----------------------*/

+  /* Configure

+  * - UART HardWare Flow Control: set CTSE and RTSE bits according

+  *   to huart->Init.HwFlowCtl value

+  * - one-bit sampling method versus three samples' majority rule according

+  *   to huart->Init.OneBitSampling (not applicable to LPUART) */

+  tmpreg = (uint32_t)huart->Init.HwFlowCtl;

+

+  if (!(UART_INSTANCE_LOWPOWER(huart)))

+  {

+    tmpreg |= huart->Init.OneBitSampling;

+  }

+  MODIFY_REG(huart->Instance->CR3, USART_CR3_FIELDS, tmpreg);

+

+#if defined(USART_PRESC_PRESCALER)

+  /*-------------------------- USART PRESC Configuration -----------------------*/

+  /* Configure

+  * - UART Clock Prescaler : set PRESCALER according to huart->Init.ClockPrescaler value */

+  MODIFY_REG(huart->Instance->PRESC, USART_PRESC_PRESCALER, huart->Init.ClockPrescaler);

+#endif /* USART_PRESC_PRESCALER */

+

+  /*-------------------------- USART BRR Configuration -----------------------*/

+  UART_GETCLOCKSOURCE(huart, clocksource);

+

+  /* Check LPUART instance */

+  if (UART_INSTANCE_LOWPOWER(huart))

+  {

+    /* Retrieve frequency clock */

+    switch (clocksource)

+    {

+      case UART_CLOCKSOURCE_PCLK1:

+#if defined(USART_PRESC_PRESCALER)

+        lpuart_ker_ck_pres = (HAL_RCC_GetPCLK1Freq() / UART_GET_DIV_FACTOR(huart->Init.ClockPrescaler));

+#else

+        lpuart_ker_ck_pres = HAL_RCC_GetPCLK1Freq();

+#endif /* USART_PRESC_PRESCALER */

+        break;

+      case UART_CLOCKSOURCE_HSI:

+#if defined(USART_PRESC_PRESCALER)

+        lpuart_ker_ck_pres = ((uint32_t)HSI_VALUE / UART_GET_DIV_FACTOR(huart->Init.ClockPrescaler));

+#else

+        lpuart_ker_ck_pres = (uint32_t)HSI_VALUE;

+#endif /* USART_PRESC_PRESCALER */

+        break;

+      case UART_CLOCKSOURCE_SYSCLK:

+#if defined(USART_PRESC_PRESCALER)

+        lpuart_ker_ck_pres = (HAL_RCC_GetSysClockFreq() / UART_GET_DIV_FACTOR(huart->Init.ClockPrescaler));

+#else

+        lpuart_ker_ck_pres = HAL_RCC_GetSysClockFreq();

+#endif /* USART_PRESC_PRESCALER */

+        break;

+      case UART_CLOCKSOURCE_LSE:

+#if defined(USART_PRESC_PRESCALER)

+        lpuart_ker_ck_pres = ((uint32_t)LSE_VALUE / UART_GET_DIV_FACTOR(huart->Init.ClockPrescaler));

+#else

+        lpuart_ker_ck_pres = (uint32_t)LSE_VALUE;

+#endif /* USART_PRESC_PRESCALER */

+        break;

+      case UART_CLOCKSOURCE_UNDEFINED:

+      default:

+        ret = HAL_ERROR;

+        break;

+    }

+

+    /* if proper clock source reported */

+    if (lpuart_ker_ck_pres != 0U)

+    {

+      /* ensure that Frequency clock is in the range [3 * baudrate, 4096 * baudrate] */

+      if ((lpuart_ker_ck_pres < (3U * huart->Init.BaudRate)) ||

+          (lpuart_ker_ck_pres > (4096U * huart->Init.BaudRate)))

+      {

+        ret = HAL_ERROR;

+      }

+      else

+      {

+        switch (clocksource)

+        {

+          case UART_CLOCKSOURCE_PCLK1:

+#if defined(USART_PRESC_PRESCALER)

+            usartdiv = (uint32_t)(UART_DIV_LPUART(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));

+#else

+            usartdiv = (uint32_t)(UART_DIV_LPUART(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate));

+#endif /* USART_PRESC_PRESCALER */

+            break;

+          case UART_CLOCKSOURCE_HSI:

+#if defined(USART_PRESC_PRESCALER)

+            usartdiv = (uint32_t)(UART_DIV_LPUART(HSI_VALUE, huart->Init.BaudRate, huart->Init.ClockPrescaler));

+#else

+            usartdiv = (uint32_t)(UART_DIV_LPUART(HSI_VALUE, huart->Init.BaudRate));

+#endif /* USART_PRESC_PRESCALER */

+            break;

+          case UART_CLOCKSOURCE_SYSCLK:

+#if defined(USART_PRESC_PRESCALER)

+            usartdiv = (uint32_t)(UART_DIV_LPUART(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));

+#else

+            usartdiv = (uint32_t)(UART_DIV_LPUART(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate));

+#endif /* USART_PRESC_PRESCALER */

+            break;

+          case UART_CLOCKSOURCE_LSE:

+#if defined(USART_PRESC_PRESCALER)

+            usartdiv = (uint32_t)(UART_DIV_LPUART(LSE_VALUE, huart->Init.BaudRate, huart->Init.ClockPrescaler));

+#else

+            usartdiv = (uint32_t)(UART_DIV_LPUART(LSE_VALUE, huart->Init.BaudRate));

+#endif /* USART_PRESC_PRESCALER */

+            break;

+          case UART_CLOCKSOURCE_UNDEFINED:

+          default:

+            ret = HAL_ERROR;

+            break;

+        }

+

+        /* It is forbidden to write values lower than 0x300 in the LPUART_BRR register */

+        if ((usartdiv >= LPUART_BRR_MIN) && (usartdiv <= LPUART_BRR_MAX))

+        {

+          huart->Instance->BRR = usartdiv;

+        }

+        else

+        {

+          ret = HAL_ERROR;

+        }

+      } /*   if ( (lpuart_ker_ck_pres < (3 * huart->Init.BaudRate) ) || (lpuart_ker_ck_pres > (4096 * huart->Init.BaudRate) )) */

+    } /* if (lpuart_ker_ck_pres != 0) */

+  }

+  /* Check UART Over Sampling to set Baud Rate Register */

+  else if (huart->Init.OverSampling == UART_OVERSAMPLING_8)

+  {

+    switch (clocksource)

+    {

+      case UART_CLOCKSOURCE_PCLK1:

+#if defined(USART_PRESC_PRESCALER)

+        usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));

+#else

+        usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate));

+#endif /* USART_PRESC_PRESCALER */

+        break;

+      case UART_CLOCKSOURCE_PCLK2:

+#if defined(USART_PRESC_PRESCALER)

+        usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));

+#else

+        usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate));

+#endif /* USART_PRESC_PRESCALER */

+        break;

+      case UART_CLOCKSOURCE_HSI:

+#if defined(USART_PRESC_PRESCALER)

+        usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HSI_VALUE, huart->Init.BaudRate, huart->Init.ClockPrescaler));

+#else

+        usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HSI_VALUE, huart->Init.BaudRate));

+#endif /* USART_PRESC_PRESCALER */

+        break;

+      case UART_CLOCKSOURCE_SYSCLK:

+#if defined(USART_PRESC_PRESCALER)

+        usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));

+#else

+        usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate));

+#endif /* USART_PRESC_PRESCALER */

+        break;

+      case UART_CLOCKSOURCE_LSE:

+#if defined(USART_PRESC_PRESCALER)

+        usartdiv = (uint16_t)(UART_DIV_SAMPLING8((uint32_t)LSE_VALUE, huart->Init.BaudRate, huart->Init.ClockPrescaler));

+#else

+        usartdiv = (uint16_t)(UART_DIV_SAMPLING8(LSE_VALUE, huart->Init.BaudRate));

+#endif /* USART_PRESC_PRESCALER */

+        break;

+      case UART_CLOCKSOURCE_UNDEFINED:

+      default:

+        ret = HAL_ERROR;

+        break;

+    }

+

+    /* USARTDIV must be greater than or equal to 0d16 */

+    if ((usartdiv >= UART_BRR_MIN) && (usartdiv <= UART_BRR_MAX))

+    {

+      brrtemp = (uint16_t)(usartdiv & 0xFFF0U);

+      brrtemp |= (uint16_t)((usartdiv & (uint16_t)0x000FU) >> 1U);

+      huart->Instance->BRR = brrtemp;

+    }

+    else

+    {

+      ret = HAL_ERROR;

+    }

+  }

+  else

+  {

+    switch (clocksource)

+    {

+      case UART_CLOCKSOURCE_PCLK1:

+#if defined(USART_PRESC_PRESCALER)

+        usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));

+#else

+        usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate));

+#endif /* USART_PRESC_PRESCALER */

+        break;

+      case UART_CLOCKSOURCE_PCLK2:

+#if defined(USART_PRESC_PRESCALER)

+        usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));

+#else

+        usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate));

+#endif /* USART_PRESC_PRESCALER */

+        break;

+      case UART_CLOCKSOURCE_HSI:

+#if defined(USART_PRESC_PRESCALER)

+        usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HSI_VALUE, huart->Init.BaudRate, huart->Init.ClockPrescaler));

+#else

+        usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HSI_VALUE, huart->Init.BaudRate));

+#endif /* USART_PRESC_PRESCALER */

+        break;

+      case UART_CLOCKSOURCE_SYSCLK:

+#if defined(USART_PRESC_PRESCALER)

+        usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate, huart->Init.ClockPrescaler));

+#else

+        usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate));

+#endif /* USART_PRESC_PRESCALER */

+        break;

+      case UART_CLOCKSOURCE_LSE:

+#if defined(USART_PRESC_PRESCALER)

+        usartdiv = (uint16_t)(UART_DIV_SAMPLING16((uint32_t)LSE_VALUE, huart->Init.BaudRate, huart->Init.ClockPrescaler));

+#else

+        usartdiv = (uint16_t)(UART_DIV_SAMPLING16(LSE_VALUE, huart->Init.BaudRate));

+#endif /* USART_PRESC_PRESCALER */

+        break;

+      case UART_CLOCKSOURCE_UNDEFINED:

+      default:

+        ret = HAL_ERROR;

+        break;

+    }

+

+    /* USARTDIV must be greater than or equal to 0d16 */

+    if ((usartdiv >= UART_BRR_MIN) && (usartdiv <= UART_BRR_MAX))

+    {

+      huart->Instance->BRR = usartdiv;

+    }

+    else

+    {

+      ret = HAL_ERROR;

+    }

+  }

+

+#if defined(USART_CR1_FIFOEN)

+  /* Initialize the number of data to process during RX/TX ISR execution */

+  huart->NbTxDataToProcess = 1;

+  huart->NbRxDataToProcess = 1;

+#endif /* USART_CR1_FIFOEN */

+

+  /* Clear ISR function pointers */

+  huart->RxISR = NULL;

+  huart->TxISR = NULL;

+

+  return ret;

+}

+

+/**

+  * @brief Configure the UART peripheral advanced features.

+  * @param huart UART handle.

+  * @retval None

+  */

+void UART_AdvFeatureConfig(UART_HandleTypeDef *huart)

+{

+  /* Check whether the set of advanced features to configure is properly set */

+  assert_param(IS_UART_ADVFEATURE_INIT(huart->AdvancedInit.AdvFeatureInit));

+

+  /* if required, configure TX pin active level inversion */

+  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_TXINVERT_INIT))

+  {

+    assert_param(IS_UART_ADVFEATURE_TXINV(huart->AdvancedInit.TxPinLevelInvert));

+    MODIFY_REG(huart->Instance->CR2, USART_CR2_TXINV, huart->AdvancedInit.TxPinLevelInvert);

+  }

+

+  /* if required, configure RX pin active level inversion */

+  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_RXINVERT_INIT))

+  {

+    assert_param(IS_UART_ADVFEATURE_RXINV(huart->AdvancedInit.RxPinLevelInvert));

+    MODIFY_REG(huart->Instance->CR2, USART_CR2_RXINV, huart->AdvancedInit.RxPinLevelInvert);

+  }

+

+  /* if required, configure data inversion */

+  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_DATAINVERT_INIT))

+  {

+    assert_param(IS_UART_ADVFEATURE_DATAINV(huart->AdvancedInit.DataInvert));

+    MODIFY_REG(huart->Instance->CR2, USART_CR2_DATAINV, huart->AdvancedInit.DataInvert);

+  }

+

+  /* if required, configure RX/TX pins swap */

+  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_SWAP_INIT))

+  {

+    assert_param(IS_UART_ADVFEATURE_SWAP(huart->AdvancedInit.Swap));

+    MODIFY_REG(huart->Instance->CR2, USART_CR2_SWAP, huart->AdvancedInit.Swap);

+  }

+

+  /* if required, configure RX overrun detection disabling */

+  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_RXOVERRUNDISABLE_INIT))

+  {

+    assert_param(IS_UART_OVERRUN(huart->AdvancedInit.OverrunDisable));

+    MODIFY_REG(huart->Instance->CR3, USART_CR3_OVRDIS, huart->AdvancedInit.OverrunDisable);

+  }

+

+  /* if required, configure DMA disabling on reception error */

+  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_DMADISABLEONERROR_INIT))

+  {

+    assert_param(IS_UART_ADVFEATURE_DMAONRXERROR(huart->AdvancedInit.DMADisableonRxError));

+    MODIFY_REG(huart->Instance->CR3, USART_CR3_DDRE, huart->AdvancedInit.DMADisableonRxError);

+  }

+

+  /* if required, configure auto Baud rate detection scheme */

+  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_AUTOBAUDRATE_INIT))

+  {

+    assert_param(IS_USART_AUTOBAUDRATE_DETECTION_INSTANCE(huart->Instance));

+    assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATE(huart->AdvancedInit.AutoBaudRateEnable));

+    MODIFY_REG(huart->Instance->CR2, USART_CR2_ABREN, huart->AdvancedInit.AutoBaudRateEnable);

+    /* set auto Baudrate detection parameters if detection is enabled */

+    if (huart->AdvancedInit.AutoBaudRateEnable == UART_ADVFEATURE_AUTOBAUDRATE_ENABLE)

+    {

+      assert_param(IS_UART_ADVFEATURE_AUTOBAUDRATEMODE(huart->AdvancedInit.AutoBaudRateMode));

+      MODIFY_REG(huart->Instance->CR2, USART_CR2_ABRMODE, huart->AdvancedInit.AutoBaudRateMode);

+    }

+  }

+

+  /* if required, configure MSB first on communication line */

+  if (HAL_IS_BIT_SET(huart->AdvancedInit.AdvFeatureInit, UART_ADVFEATURE_MSBFIRST_INIT))

+  {

+    assert_param(IS_UART_ADVFEATURE_MSBFIRST(huart->AdvancedInit.MSBFirst));

+    MODIFY_REG(huart->Instance->CR2, USART_CR2_MSBFIRST, huart->AdvancedInit.MSBFirst);

+  }

+}

+

+/**

+  * @brief Check the UART Idle State.

+  * @param huart UART handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef UART_CheckIdleState(UART_HandleTypeDef *huart)

+{

+  uint32_t tickstart;

+

+  /* Initialize the UART ErrorCode */

+  huart->ErrorCode = HAL_UART_ERROR_NONE;

+

+  /* Init tickstart for timeout managment*/

+  tickstart = HAL_GetTick();

+

+  /* Check if the Transmitter is enabled */

+  if ((huart->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE)

+  {

+    /* Wait until TEACK flag is set */

+    if (UART_WaitOnFlagUntilTimeout(huart, USART_ISR_TEACK, RESET, tickstart, HAL_UART_TIMEOUT_VALUE) != HAL_OK)

+    {

+      /* Timeout occurred */

+      return HAL_TIMEOUT;

+    }

+  }

+

+  /* Check if the Receiver is enabled */

+  if ((huart->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE)

+  {

+    /* Wait until REACK flag is set */

+    if (UART_WaitOnFlagUntilTimeout(huart, USART_ISR_REACK, RESET, tickstart, HAL_UART_TIMEOUT_VALUE) != HAL_OK)

+    {

+      /* Timeout occurred */

+      return HAL_TIMEOUT;

+    }

+  }

+

+  /* Initialize the UART State */

+  huart->gState = HAL_UART_STATE_READY;

+  huart->RxState = HAL_UART_STATE_READY;

+

+  __HAL_UNLOCK(huart);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Handle UART Communication Timeout.

+  * @param huart     UART handle.

+  * @param Flag      Specifies the UART flag to check

+  * @param Status    Flag status (SET or RESET)

+  * @param Tickstart Tick start value

+  * @param Timeout   Timeout duration

+  * @retval HAL status

+  */

+HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status,

+                                              uint32_t Tickstart, uint32_t Timeout)

+{

+  /* Wait until flag is set */

+  while ((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status)

+  {

+    /* Check for the Timeout */

+    if (Timeout != HAL_MAX_DELAY)

+    {

+      if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))

+      {

+        /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */

+#if defined(USART_CR1_FIFOEN)

+        CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE));

+#else

+        CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));

+#endif /* USART_CR1_FIFOEN */

+        CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);

+

+        huart->gState = HAL_UART_STATE_READY;

+        huart->RxState = HAL_UART_STATE_READY;

+

+        __HAL_UNLOCK(huart);

+

+        return HAL_TIMEOUT;

+      }

+    }

+  }

+  return HAL_OK;

+}

+

+

+/**

+  * @brief  End ongoing Tx transfer on UART peripheral (following error detection or Transmit completion).

+  * @param  huart UART handle.

+  * @retval None

+  */

+static void UART_EndTxTransfer(UART_HandleTypeDef *huart)

+{

+#if defined(USART_CR1_FIFOEN)

+  /* Disable TXEIE, TCIE, TXFT interrupts */

+  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE_TXFNFIE | USART_CR1_TCIE));

+  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_TXFTIE));

+#else

+  /* Disable TXEIE and TCIE interrupts */

+  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE));

+#endif /* USART_CR1_FIFOEN */

+

+  /* At end of Tx process, restore huart->gState to Ready */

+  huart->gState = HAL_UART_STATE_READY;

+}

+

+

+/**

+  * @brief  End ongoing Rx transfer on UART peripheral (following error detection or Reception completion).

+  * @param  huart UART handle.

+  * @retval None

+  */

+static void UART_EndRxTransfer(UART_HandleTypeDef *huart)

+{

+  /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */

+#if defined(USART_CR1_FIFOEN)

+  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));

+  CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));

+#else

+  CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));

+  CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);

+#endif /* USART_CR1_FIFOEN */

+

+  /* At end of Rx process, restore huart->RxState to Ready */

+  huart->RxState = HAL_UART_STATE_READY;

+

+  /* Reset RxIsr function pointer */

+  huart->RxISR = NULL;

+}

+

+

+/**

+  * @brief DMA UART transmit process complete callback.

+  * @param hdma DMA handle.

+  * @retval None

+  */

+static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma)

+{

+  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);

+

+  /* DMA Normal mode */

+  if (HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC))

+  {

+    huart->TxXferCount = 0U;

+

+    /* Disable the DMA transfer for transmit request by resetting the DMAT bit

+       in the UART CR3 register */

+    CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT);

+

+    /* Enable the UART Transmit Complete Interrupt */

+    SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);

+  }

+  /* DMA Circular mode */

+  else

+  {

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+    /*Call registered Tx complete callback*/

+    huart->TxCpltCallback(huart);

+#else

+    /*Call legacy weak Tx complete callback*/

+    HAL_UART_TxCpltCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+  }

+}

+

+/**

+  * @brief DMA UART transmit process half complete callback.

+  * @param hdma DMA handle.

+  * @retval None

+  */

+static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma)

+{

+  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);

+

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+  /*Call registered Tx Half complete callback*/

+  huart->TxHalfCpltCallback(huart);

+#else

+  /*Call legacy weak Tx Half complete callback*/

+  HAL_UART_TxHalfCpltCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief DMA UART receive process complete callback.

+  * @param hdma DMA handle.

+  * @retval None

+  */

+static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma)

+{

+  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);

+

+  /* DMA Normal mode */

+  if (HAL_IS_BIT_CLR(hdma->Instance->CCR, DMA_CCR_CIRC))

+  {

+    huart->RxXferCount = 0U;

+

+    /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */

+    CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE);

+    CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);

+

+    /* Disable the DMA transfer for the receiver request by resetting the DMAR bit

+       in the UART CR3 register */

+    CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);

+

+    /* At end of Rx process, restore huart->RxState to Ready */

+    huart->RxState = HAL_UART_STATE_READY;

+  }

+

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+  /*Call registered Rx complete callback*/

+  huart->RxCpltCallback(huart);

+#else

+  /*Call legacy weak Rx complete callback*/

+  HAL_UART_RxCpltCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief DMA UART receive process half complete callback.

+  * @param hdma DMA handle.

+  * @retval None

+  */

+static void UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma)

+{

+  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);

+

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+  /*Call registered Rx Half complete callback*/

+  huart->RxHalfCpltCallback(huart);

+#else

+  /*Call legacy weak Rx Half complete callback*/

+  HAL_UART_RxHalfCpltCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief DMA UART communication error callback.

+  * @param hdma DMA handle.

+  * @retval None

+  */

+static void UART_DMAError(DMA_HandleTypeDef *hdma)

+{

+  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);

+

+  const HAL_UART_StateTypeDef gstate = huart->gState;

+  const HAL_UART_StateTypeDef rxstate = huart->RxState;

+

+  /* Stop UART DMA Tx request if ongoing */

+  if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) &&

+      (gstate == HAL_UART_STATE_BUSY_TX))

+  {

+    huart->TxXferCount = 0U;

+    UART_EndTxTransfer(huart);

+  }

+

+  /* Stop UART DMA Rx request if ongoing */

+  if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) &&

+      (rxstate == HAL_UART_STATE_BUSY_RX))

+  {

+    huart->RxXferCount = 0U;

+    UART_EndRxTransfer(huart);

+  }

+

+  huart->ErrorCode |= HAL_UART_ERROR_DMA;

+

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+  /*Call registered error callback*/

+  huart->ErrorCallback(huart);

+#else

+  /*Call legacy weak error callback*/

+  HAL_UART_ErrorCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  DMA UART communication abort callback, when initiated by HAL services on Error

+  *         (To be called at end of DMA Abort procedure following error occurrence).

+  * @param  hdma DMA handle.

+  * @retval None

+  */

+static void UART_DMAAbortOnError(DMA_HandleTypeDef *hdma)

+{

+  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);

+  huart->RxXferCount = 0U;

+  huart->TxXferCount = 0U;

+

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+  /*Call registered error callback*/

+  huart->ErrorCallback(huart);

+#else

+  /*Call legacy weak error callback*/

+  HAL_UART_ErrorCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  DMA UART Tx communication abort callback, when initiated by user

+  *         (To be called at end of DMA Tx Abort procedure following user abort request).

+  * @note   When this callback is executed, User Abort complete call back is called only if no

+  *         Abort still ongoing for Rx DMA Handle.

+  * @param  hdma DMA handle.

+  * @retval None

+  */

+static void UART_DMATxAbortCallback(DMA_HandleTypeDef *hdma)

+{

+  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);

+

+  huart->hdmatx->XferAbortCallback = NULL;

+

+  /* Check if an Abort process is still ongoing */

+  if (huart->hdmarx != NULL)

+  {

+    if (huart->hdmarx->XferAbortCallback != NULL)

+    {

+      return;

+    }

+  }

+

+  /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */

+  huart->TxXferCount = 0U;

+  huart->RxXferCount = 0U;

+

+  /* Reset errorCode */

+  huart->ErrorCode = HAL_UART_ERROR_NONE;

+

+  /* Clear the Error flags in the ICR register */

+  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);

+

+#if defined(USART_CR1_FIFOEN)

+  /* Flush the whole TX FIFO (if needed) */

+  if (huart->FifoMode == UART_FIFOMODE_ENABLE)

+  {

+    __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST);

+  }

+#endif /* USART_CR1_FIFOEN */

+

+  /* Restore huart->gState and huart->RxState to Ready */

+  huart->gState  = HAL_UART_STATE_READY;

+  huart->RxState = HAL_UART_STATE_READY;

+

+  /* Call user Abort complete callback */

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+  /* Call registered Abort complete callback */

+  huart->AbortCpltCallback(huart);

+#else

+  /* Call legacy weak Abort complete callback */

+  HAL_UART_AbortCpltCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+}

+

+

+/**

+  * @brief  DMA UART Rx communication abort callback, when initiated by user

+  *         (To be called at end of DMA Rx Abort procedure following user abort request).

+  * @note   When this callback is executed, User Abort complete call back is called only if no

+  *         Abort still ongoing for Tx DMA Handle.

+  * @param  hdma DMA handle.

+  * @retval None

+  */

+static void UART_DMARxAbortCallback(DMA_HandleTypeDef *hdma)

+{

+  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);

+

+  huart->hdmarx->XferAbortCallback = NULL;

+

+  /* Check if an Abort process is still ongoing */

+  if (huart->hdmatx != NULL)

+  {

+    if (huart->hdmatx->XferAbortCallback != NULL)

+    {

+      return;

+    }

+  }

+

+  /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */

+  huart->TxXferCount = 0U;

+  huart->RxXferCount = 0U;

+

+  /* Reset errorCode */

+  huart->ErrorCode = HAL_UART_ERROR_NONE;

+

+  /* Clear the Error flags in the ICR register */

+  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);

+

+  /* Discard the received data */

+  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);

+

+  /* Restore huart->gState and huart->RxState to Ready */

+  huart->gState  = HAL_UART_STATE_READY;

+  huart->RxState = HAL_UART_STATE_READY;

+

+  /* Call user Abort complete callback */

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+  /* Call registered Abort complete callback */

+  huart->AbortCpltCallback(huart);

+#else

+  /* Call legacy weak Abort complete callback */

+  HAL_UART_AbortCpltCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+}

+

+

+/**

+  * @brief  DMA UART Tx communication abort callback, when initiated by user by a call to

+  *         HAL_UART_AbortTransmit_IT API (Abort only Tx transfer)

+  *         (This callback is executed at end of DMA Tx Abort procedure following user abort request,

+  *         and leads to user Tx Abort Complete callback execution).

+  * @param  hdma DMA handle.

+  * @retval None

+  */

+static void UART_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma)

+{

+  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)(hdma->Parent);

+

+  huart->TxXferCount = 0U;

+

+#if defined(USART_CR1_FIFOEN)

+  /* Flush the whole TX FIFO (if needed) */

+  if (huart->FifoMode == UART_FIFOMODE_ENABLE)

+  {

+    __HAL_UART_SEND_REQ(huart, UART_TXDATA_FLUSH_REQUEST);

+  }

+#endif /* USART_CR1_FIFOEN */

+

+  /* Restore huart->gState to Ready */

+  huart->gState = HAL_UART_STATE_READY;

+

+  /* Call user Abort complete callback */

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+  /* Call registered Abort Transmit Complete Callback */

+  huart->AbortTransmitCpltCallback(huart);

+#else

+  /* Call legacy weak Abort Transmit Complete Callback */

+  HAL_UART_AbortTransmitCpltCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief  DMA UART Rx communication abort callback, when initiated by user by a call to

+  *         HAL_UART_AbortReceive_IT API (Abort only Rx transfer)

+  *         (This callback is executed at end of DMA Rx Abort procedure following user abort request,

+  *         and leads to user Rx Abort Complete callback execution).

+  * @param  hdma DMA handle.

+  * @retval None

+  */

+static void UART_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma)

+{

+  UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;

+

+  huart->RxXferCount = 0U;

+

+  /* Clear the Error flags in the ICR register */

+  __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF | UART_CLEAR_NEF | UART_CLEAR_PEF | UART_CLEAR_FEF);

+

+  /* Discard the received data */

+  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);

+

+  /* Restore huart->RxState to Ready */

+  huart->RxState = HAL_UART_STATE_READY;

+

+  /* Call user Abort complete callback */

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+  /* Call registered Abort Receive Complete Callback */

+  huart->AbortReceiveCpltCallback(huart);

+#else

+  /* Call legacy weak Abort Receive Complete Callback */

+  HAL_UART_AbortReceiveCpltCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief TX interrrupt handler for 7 or 8 bits data word length .

+  * @note   Function is called under interruption only, once

+  *         interruptions have been enabled by HAL_UART_Transmit_IT().

+  * @param huart UART handle.

+  * @retval None

+  */

+static void UART_TxISR_8BIT(UART_HandleTypeDef *huart)

+{

+  /* Check that a Tx process is ongoing */

+  if (huart->gState == HAL_UART_STATE_BUSY_TX)

+  {

+    if (huart->TxXferCount == 0U)

+    {

+      /* Disable the UART Transmit Data Register Empty Interrupt */

+#if defined(USART_CR1_FIFOEN)

+      CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);

+#else

+      CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE);

+#endif /* USART_CR1_FIFOEN */

+

+      /* Enable the UART Transmit Complete Interrupt */

+      SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);

+    }

+    else

+    {

+      huart->Instance->TDR = (uint8_t)(*huart->pTxBuffPtr & (uint8_t)0xFF);

+      huart->pTxBuffPtr++;

+      huart->TxXferCount--;

+    }

+  }

+}

+

+/**

+  * @brief TX interrrupt handler for 9 bits data word length.

+  * @note   Function is called under interruption only, once

+  *         interruptions have been enabled by HAL_UART_Transmit_IT().

+  * @param huart UART handle.

+  * @retval None

+  */

+static void UART_TxISR_16BIT(UART_HandleTypeDef *huart)

+{

+  uint16_t *tmp;

+

+  /* Check that a Tx process is ongoing */

+  if (huart->gState == HAL_UART_STATE_BUSY_TX)

+  {

+    if (huart->TxXferCount == 0U)

+    {

+      /* Disable the UART Transmit Data Register Empty Interrupt */

+#if defined(USART_CR1_FIFOEN)

+      CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);

+#else

+      CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE);

+#endif /* USART_CR1_FIFOEN */

+

+      /* Enable the UART Transmit Complete Interrupt */

+      SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);

+    }

+    else

+    {

+      tmp = (uint16_t *) huart->pTxBuffPtr;

+      huart->Instance->TDR = (((uint32_t)(*tmp)) & 0x01FFUL);

+      huart->pTxBuffPtr += 2U;

+      huart->TxXferCount--;

+    }

+  }

+}

+

+#if defined(USART_CR1_FIFOEN)

+/**

+  * @brief TX interrrupt handler for 7 or 8 bits data word length and FIFO mode is enabled.

+  * @note   Function is called under interruption only, once

+  *         interruptions have been enabled by HAL_UART_Transmit_IT().

+  * @param huart UART handle.

+  * @retval None

+  */

+static void UART_TxISR_8BIT_FIFOEN(UART_HandleTypeDef *huart)

+{

+  uint16_t  nb_tx_data;

+

+  /* Check that a Tx process is ongoing */

+  if (huart->gState == HAL_UART_STATE_BUSY_TX)

+  {

+    for (nb_tx_data = huart->NbTxDataToProcess ; nb_tx_data > 0U ; nb_tx_data--)

+    {

+      if (huart->TxXferCount == 0U)

+      {

+        /* Disable the TX FIFO threshold interrupt */

+        CLEAR_BIT(huart->Instance->CR3, USART_CR3_TXFTIE);

+

+        /* Enable the UART Transmit Complete Interrupt */

+        SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);

+

+        break; /* force exit loop */

+      }

+      else if (READ_BIT(huart->Instance->ISR, USART_ISR_TXE_TXFNF) != 0U)

+      {

+        huart->Instance->TDR = (uint8_t)(*huart->pTxBuffPtr & (uint8_t)0xFF);

+        huart->pTxBuffPtr++;

+        huart->TxXferCount--;

+      }

+      else

+      {

+        /* Nothing to do */

+      }

+    }

+  }

+}

+

+/**

+  * @brief TX interrrupt handler for 9 bits data word length and FIFO mode is enabled.

+  * @note   Function is called under interruption only, once

+  *         interruptions have been enabled by HAL_UART_Transmit_IT().

+  * @param huart UART handle.

+  * @retval None

+  */

+static void UART_TxISR_16BIT_FIFOEN(UART_HandleTypeDef *huart)

+{

+  uint16_t *tmp;

+  uint16_t  nb_tx_data;

+

+  /* Check that a Tx process is ongoing */

+  if (huart->gState == HAL_UART_STATE_BUSY_TX)

+  {

+    for (nb_tx_data = huart->NbTxDataToProcess ; nb_tx_data > 0U ; nb_tx_data--)

+    {

+      if (huart->TxXferCount == 0U)

+      {

+        /* Disable the TX FIFO threshold interrupt */

+        CLEAR_BIT(huart->Instance->CR3, USART_CR3_TXFTIE);

+

+        /* Enable the UART Transmit Complete Interrupt */

+        SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);

+

+        break; /* force exit loop */

+      }

+      else if (READ_BIT(huart->Instance->ISR, USART_ISR_TXE_TXFNF) != 0U)

+      {

+        tmp = (uint16_t *) huart->pTxBuffPtr;

+        huart->Instance->TDR = (((uint32_t)(*tmp)) & 0x01FFUL);

+        huart->pTxBuffPtr += 2U;

+        huart->TxXferCount--;

+      }

+      else

+      {

+        /* Nothing to do */

+      }

+    }

+  }

+}

+#endif /* USART_CR1_FIFOEN */

+

+/**

+  * @brief  Wrap up transmission in non-blocking mode.

+  * @param  huart pointer to a UART_HandleTypeDef structure that contains

+  *                the configuration information for the specified UART module.

+  * @retval None

+  */

+static void UART_EndTransmit_IT(UART_HandleTypeDef *huart)

+{

+  /* Disable the UART Transmit Complete Interrupt */

+  CLEAR_BIT(huart->Instance->CR1, USART_CR1_TCIE);

+

+  /* Tx process is ended, restore huart->gState to Ready */

+  huart->gState = HAL_UART_STATE_READY;

+

+  /* Cleat TxISR function pointer */

+  huart->TxISR = NULL;

+

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+  /*Call registered Tx complete callback*/

+  huart->TxCpltCallback(huart);

+#else

+  /*Call legacy weak Tx complete callback*/

+  HAL_UART_TxCpltCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+}

+

+/**

+  * @brief RX interrrupt handler for 7 or 8 bits data word length .

+  * @param huart UART handle.

+  * @retval None

+  */

+static void UART_RxISR_8BIT(UART_HandleTypeDef *huart)

+{

+  uint16_t uhMask = huart->Mask;

+  uint16_t  uhdata;

+

+  /* Check that a Rx process is ongoing */

+  if (huart->RxState == HAL_UART_STATE_BUSY_RX)

+  {

+    uhdata = (uint16_t) READ_REG(huart->Instance->RDR);

+    *huart->pRxBuffPtr = (uint8_t)(uhdata & (uint8_t)uhMask);

+    huart->pRxBuffPtr++;

+    huart->RxXferCount--;

+

+    if (huart->RxXferCount == 0U)

+    {

+      /* Disable the UART Parity Error Interrupt and RXNE interrupts */

+#if defined(USART_CR1_FIFOEN)

+      CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));

+#else

+      CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));

+#endif /* USART_CR1_FIFOEN */

+

+      /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */

+      CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);

+

+      /* Rx process is completed, restore huart->RxState to Ready */

+      huart->RxState = HAL_UART_STATE_READY;

+

+      /* Clear RxISR function pointer */

+      huart->RxISR = NULL;

+

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+      /*Call registered Rx complete callback*/

+      huart->RxCpltCallback(huart);

+#else

+      /*Call legacy weak Rx complete callback*/

+      HAL_UART_RxCpltCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+    }

+  }

+  else

+  {

+    /* Clear RXNE interrupt flag */

+    __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);

+  }

+}

+

+/**

+  * @brief RX interrrupt handler for 9 bits data word length .

+  * @note   Function is called under interruption only, once

+  *         interruptions have been enabled by HAL_UART_Receive_IT()

+  * @param huart UART handle.

+  * @retval None

+  */

+static void UART_RxISR_16BIT(UART_HandleTypeDef *huart)

+{

+  uint16_t *tmp;

+  uint16_t uhMask = huart->Mask;

+  uint16_t  uhdata;

+

+  /* Check that a Rx process is ongoing */

+  if (huart->RxState == HAL_UART_STATE_BUSY_RX)

+  {

+    uhdata = (uint16_t) READ_REG(huart->Instance->RDR);

+    tmp = (uint16_t *) huart->pRxBuffPtr ;

+    *tmp = (uint16_t)(uhdata & uhMask);

+    huart->pRxBuffPtr += 2U;

+    huart->RxXferCount--;

+

+    if (huart->RxXferCount == 0U)

+    {

+      /* Disable the UART Parity Error Interrupt and RXNE interrupt*/

+#if defined(USART_CR1_FIFOEN)

+      CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));

+#else

+      CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));

+#endif /* USART_CR1_FIFOEN */

+

+      /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */

+      CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);

+

+      /* Rx process is completed, restore huart->RxState to Ready */

+      huart->RxState = HAL_UART_STATE_READY;

+

+      /* Clear RxISR function pointer */

+      huart->RxISR = NULL;

+

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+      /*Call registered Rx complete callback*/

+      huart->RxCpltCallback(huart);

+#else

+      /*Call legacy weak Rx complete callback*/

+      HAL_UART_RxCpltCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+    }

+  }

+  else

+  {

+    /* Clear RXNE interrupt flag */

+    __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);

+  }

+}

+

+#if defined(USART_CR1_FIFOEN)

+/**

+  * @brief RX interrrupt handler for 7 or 8  bits data word length and FIFO mode is enabled.

+  * @note   Function is called under interruption only, once

+  *         interruptions have been enabled by HAL_UART_Receive_IT()

+  * @param huart UART handle.

+  * @retval None

+  */

+static void UART_RxISR_8BIT_FIFOEN(UART_HandleTypeDef *huart)

+{

+  uint16_t  uhMask = huart->Mask;

+  uint16_t  uhdata;

+  uint16_t   nb_rx_data;

+  uint16_t  rxdatacount;

+

+  /* Check that a Rx process is ongoing */

+  if (huart->RxState == HAL_UART_STATE_BUSY_RX)

+  {

+    for (nb_rx_data = huart->NbRxDataToProcess ; nb_rx_data > 0U ; nb_rx_data--)

+    {

+      uhdata = (uint16_t) READ_REG(huart->Instance->RDR);

+      *huart->pRxBuffPtr = (uint8_t)(uhdata & (uint8_t)uhMask);

+      huart->pRxBuffPtr++;

+      huart->RxXferCount--;

+

+      if (huart->RxXferCount == 0U)

+      {

+        /* Disable the UART Parity Error Interrupt and RXFT interrupt*/

+        CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE);

+

+        /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) and RX FIFO Threshold interrupt */

+        CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));

+

+        /* Rx process is completed, restore huart->RxState to Ready */

+        huart->RxState = HAL_UART_STATE_READY;

+

+        /* Clear RxISR function pointer */

+        huart->RxISR = NULL;

+

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+        /*Call registered Rx complete callback*/

+        huart->RxCpltCallback(huart);

+#else

+        /*Call legacy weak Rx complete callback*/

+        HAL_UART_RxCpltCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+      }

+    }

+

+    /* When remaining number of bytes to receive is less than the RX FIFO

+    threshold, next incoming frames are processed as if FIFO mode was

+    disabled (i.e. one interrupt per received frame).

+    */

+    rxdatacount = huart->RxXferCount;

+    if ((rxdatacount != 0U) && (rxdatacount < huart->NbRxDataToProcess))

+    {

+      /* Disable the UART RXFT interrupt*/

+      CLEAR_BIT(huart->Instance->CR3, USART_CR3_RXFTIE);

+

+      /* Update the RxISR function pointer */

+      huart->RxISR = UART_RxISR_8BIT;

+

+      /* Enable the UART Data Register Not Empty interrupt */

+      SET_BIT(huart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE);

+    }

+  }

+  else

+  {

+    /* Clear RXNE interrupt flag */

+    __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);

+  }

+}

+

+/**

+  * @brief RX interrrupt handler for 9 bits data word length and FIFO mode is enabled.

+  * @note   Function is called under interruption only, once

+  *         interruptions have been enabled by HAL_UART_Receive_IT()

+  * @param huart UART handle.

+  * @retval None

+  */

+static void UART_RxISR_16BIT_FIFOEN(UART_HandleTypeDef *huart)

+{

+  uint16_t *tmp;

+  uint16_t  uhMask = huart->Mask;

+  uint16_t  uhdata;

+  uint16_t   nb_rx_data;

+  uint16_t  rxdatacount;

+

+  /* Check that a Rx process is ongoing */

+  if (huart->RxState == HAL_UART_STATE_BUSY_RX)

+  {

+    for (nb_rx_data = huart->NbRxDataToProcess ; nb_rx_data > 0U ; nb_rx_data--)

+    {

+      uhdata = (uint16_t) READ_REG(huart->Instance->RDR);

+      tmp = (uint16_t *) huart->pRxBuffPtr ;

+      *tmp = (uint16_t)(uhdata & uhMask);

+      huart->pRxBuffPtr += 2U;

+      huart->RxXferCount--;

+

+      if (huart->RxXferCount == 0U)

+      {

+        /* Disable the UART Parity Error Interrupt and RXFT interrupt*/

+        CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE);

+

+        /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) and RX FIFO Threshold interrupt */

+        CLEAR_BIT(huart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));

+

+        /* Rx process is completed, restore huart->RxState to Ready */

+        huart->RxState = HAL_UART_STATE_READY;

+

+        /* Clear RxISR function pointer */

+        huart->RxISR = NULL;

+

+#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)

+        /*Call registered Rx complete callback*/

+        huart->RxCpltCallback(huart);

+#else

+        /*Call legacy weak Rx complete callback*/

+        HAL_UART_RxCpltCallback(huart);

+#endif /* USE_HAL_UART_REGISTER_CALLBACKS */

+      }

+    }

+

+    /* When remaining number of bytes to receive is less than the RX FIFO

+    threshold, next incoming frames are processed as if FIFO mode was

+    disabled (i.e. one interrupt per received frame).

+    */

+    rxdatacount = huart->RxXferCount;

+    if ((rxdatacount != 0U) && (rxdatacount < huart->NbRxDataToProcess))

+    {

+      /* Disable the UART RXFT interrupt*/

+      CLEAR_BIT(huart->Instance->CR3, USART_CR3_RXFTIE);

+

+      /* Update the RxISR function pointer */

+      huart->RxISR = UART_RxISR_16BIT;

+

+      /* Enable the UART Data Register Not Empty interrupt */

+      SET_BIT(huart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE);

+    }

+  }

+  else

+  {

+    /* Clear RXNE interrupt flag */

+    __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);

+  }

+}

+#endif /* USART_CR1_FIFOEN */

+

+/**

+  * @}

+  */

+

+#endif /* HAL_UART_MODULE_ENABLED */

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c
new file mode 100644
index 0000000..98f6d33
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c
@@ -0,0 +1,787 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_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

+  *

+  *

+  @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.

+

+    (#) FIFO mode enabling/disabling and RX/TX FIFO threshold programming.

+

+        -@- When UART operates in FIFO mode, FIFO mode must be enabled prior

+            starting RX/TX transfers. Also RX/TX FIFO thresholds must be

+            configured prior starting RX/TX transfers.

+

+  @endverbatim

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_HAL_Driver

+  * @{

+  */

+

+/** @defgroup UARTEx UARTEx

+  * @brief UART Extended HAL module driver

+  * @{

+  */

+

+#ifdef HAL_UART_MODULE_ENABLED

+

+/* Private typedef -----------------------------------------------------------*/

+/* Private define ------------------------------------------------------------*/

+#if defined(USART_CR1_FIFOEN)

+/** @defgroup UARTEX_Private_Constants UARTEx Private Constants

+  * @{

+  */

+/* UART RX FIFO depth */

+#define RX_FIFO_DEPTH 8U

+

+/* UART TX FIFO depth */

+#define TX_FIFO_DEPTH 8U

+/**

+  * @}

+  */

+#endif /* USART_CR1_FIFOEN */

+

+/* Private macros ------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/* Private function prototypes -----------------------------------------------*/

+/** @defgroup UARTEx_Private_Functions UARTEx Private Functions

+  * @{

+  */

+static void UARTEx_Wakeup_AddressConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection);

+#if defined(USART_CR1_FIFOEN)

+static void UARTEx_SetNbDataToProcess(UART_HandleTypeDef *huart);

+#endif /* USART_CR1_FIFOEN */

+/**

+  * @}

+  */

+

+/* 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_Group2 IO operation functions

+  *  @brief Extended functions

+  *

+@verbatim

+ ===============================================================================

+                      ##### IO operation functions #####

+ ===============================================================================

+    This subsection provides a set of Wakeup and FIFO mode related callback functions.

+

+    (#) Wakeup from Stop mode Callback:

+        (+) HAL_UARTEx_WakeupCallback()

+

+    (#) TX/RX Fifos Callbacks:

+        (+) HAL_UARTEx_RxFifoFullCallback()

+        (+) HAL_UARTEx_TxFifoEmptyCallback()

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief UART wakeup from Stop mode callback.

+  * @param huart UART handle.

+  * @retval None

+  */

+__weak void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(huart);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_UARTEx_WakeupCallback can be implemented in the user file.

+   */

+}

+

+#if defined(USART_CR1_FIFOEN)

+/**

+  * @brief  UART RX Fifo full callback.

+  * @param  huart UART handle.

+  * @retval None

+  */

+__weak void HAL_UARTEx_RxFifoFullCallback(UART_HandleTypeDef *huart)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(huart);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_UARTEx_RxFifoFullCallback can be implemented in the user file.

+   */

+}

+

+/**

+  * @brief  UART TX Fifo empty callback.

+  * @param  huart UART handle.

+  * @retval None

+  */

+__weak void HAL_UARTEx_TxFifoEmptyCallback(UART_HandleTypeDef *huart)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(huart);

+

+  /* NOTE : This function should not be modified, when the callback is needed,

+            the HAL_UARTEx_TxFifoEmptyCallback can be implemented in the user file.

+   */

+}

+#endif /* USART_CR1_FIFOEN */

+

+/**

+  * @}

+  */

+

+/** @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.

+     (+) 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

+     (+) HAL_UARTEx_EnableFifoMode() API enables the FIFO mode

+     (+) HAL_UARTEx_DisableFifoMode() API disables the FIFO mode

+     (+) HAL_UARTEx_SetTxFifoThreshold() API sets the TX FIFO threshold

+     (+) HAL_UARTEx_SetRxFifoThreshold() API sets the RX FIFO threshold

+

+@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 */

+  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 */

+  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));

+}

+

+/**

+  * @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);

+

+  /* Set the wake-up selection scheme */

+  MODIFY_REG(huart->Instance->CR3, USART_CR3_WUS, WakeUpSelection.WakeUpEvent);

+

+  if (WakeUpSelection.WakeUpEvent == UART_WAKEUP_ON_ADDRESS)

+  {

+    UARTEx_Wakeup_AddressConfig(huart, WakeUpSelection);

+  }

+

+  /* Enable the Peripheral */

+  __HAL_UART_ENABLE(huart);

+

+  /* Init tickstart for timeout managment*/

+  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 */

+  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 */

+  CLEAR_BIT(huart->Instance->CR1, USART_CR1_UESM);

+

+  /* Process Unlocked */

+  __HAL_UNLOCK(huart);

+

+  return HAL_OK;

+}

+

+#if defined(USART_CR1_FIFOEN)

+/**

+  * @brief  Enable the FIFO mode.

+  * @param huart      UART handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UARTEx_EnableFifoMode(UART_HandleTypeDef *huart)

+{

+  uint32_t tmpcr1;

+

+  /* Check parameters */

+  assert_param(IS_UART_FIFO_INSTANCE(huart->Instance));

+

+  /* Process Locked */

+  __HAL_LOCK(huart);

+

+  huart->gState = HAL_UART_STATE_BUSY;

+

+  /* Save actual UART configuration */

+  tmpcr1 = READ_REG(huart->Instance->CR1);

+

+  /* Disable UART */

+  __HAL_UART_DISABLE(huart);

+

+  /* Enable FIFO mode */

+  SET_BIT(tmpcr1, USART_CR1_FIFOEN);

+  huart->FifoMode = UART_FIFOMODE_ENABLE;

+

+  /* Restore UART configuration */

+  WRITE_REG(huart->Instance->CR1, tmpcr1);

+

+  /* Determine the number of data to process during RX/TX ISR execution */

+  UARTEx_SetNbDataToProcess(huart);

+

+  huart->gState = HAL_UART_STATE_READY;

+

+  /* Process Unlocked */

+  __HAL_UNLOCK(huart);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Disable the FIFO mode.

+  * @param huart      UART handle.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UARTEx_DisableFifoMode(UART_HandleTypeDef *huart)

+{

+  uint32_t tmpcr1;

+

+  /* Check parameters */

+  assert_param(IS_UART_FIFO_INSTANCE(huart->Instance));

+

+  /* Process Locked */

+  __HAL_LOCK(huart);

+

+  huart->gState = HAL_UART_STATE_BUSY;

+

+  /* Save actual UART configuration */

+  tmpcr1 = READ_REG(huart->Instance->CR1);

+

+  /* Disable UART */

+  __HAL_UART_DISABLE(huart);

+

+  /* Enable FIFO mode */

+  CLEAR_BIT(tmpcr1, USART_CR1_FIFOEN);

+  huart->FifoMode = UART_FIFOMODE_DISABLE;

+

+  /* Restore UART configuration */

+  WRITE_REG(huart->Instance->CR1, tmpcr1);

+

+  huart->gState = HAL_UART_STATE_READY;

+

+  /* Process Unlocked */

+  __HAL_UNLOCK(huart);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Set the TXFIFO threshold.

+  * @param huart      UART handle.

+  * @param Threshold  TX FIFO threshold value

+  *          This parameter can be one of the following values:

+  *            @arg @ref UART_TXFIFO_THRESHOLD_1_8

+  *            @arg @ref UART_TXFIFO_THRESHOLD_1_4

+  *            @arg @ref UART_TXFIFO_THRESHOLD_1_2

+  *            @arg @ref UART_TXFIFO_THRESHOLD_3_4

+  *            @arg @ref UART_TXFIFO_THRESHOLD_7_8

+  *            @arg @ref UART_TXFIFO_THRESHOLD_8_8

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UARTEx_SetTxFifoThreshold(UART_HandleTypeDef *huart, uint32_t Threshold)

+{

+  uint32_t tmpcr1;

+

+  /* Check parameters */

+  assert_param(IS_UART_FIFO_INSTANCE(huart->Instance));

+  assert_param(IS_UART_TXFIFO_THRESHOLD(Threshold));

+

+  /* Process Locked */

+  __HAL_LOCK(huart);

+

+  huart->gState = HAL_UART_STATE_BUSY;

+

+  /* Save actual UART configuration */

+  tmpcr1 = READ_REG(huart->Instance->CR1);

+

+  /* Disable UART */

+  __HAL_UART_DISABLE(huart);

+

+  /* Update TX threshold configuration */

+  MODIFY_REG(huart->Instance->CR3, USART_CR3_TXFTCFG, Threshold);

+

+  /* Determine the number of data to process during RX/TX ISR execution */

+  UARTEx_SetNbDataToProcess(huart);

+

+  /* Restore UART configuration */

+  WRITE_REG(huart->Instance->CR1, tmpcr1);

+

+  huart->gState = HAL_UART_STATE_READY;

+

+  /* Process Unlocked */

+  __HAL_UNLOCK(huart);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Set the RXFIFO threshold.

+  * @param huart      UART handle.

+  * @param Threshold  RX FIFO threshold value

+  *          This parameter can be one of the following values:

+  *            @arg @ref UART_RXFIFO_THRESHOLD_1_8

+  *            @arg @ref UART_RXFIFO_THRESHOLD_1_4

+  *            @arg @ref UART_RXFIFO_THRESHOLD_1_2

+  *            @arg @ref UART_RXFIFO_THRESHOLD_3_4

+  *            @arg @ref UART_RXFIFO_THRESHOLD_7_8

+  *            @arg @ref UART_RXFIFO_THRESHOLD_8_8

+  * @retval HAL status

+  */

+HAL_StatusTypeDef HAL_UARTEx_SetRxFifoThreshold(UART_HandleTypeDef *huart, uint32_t Threshold)

+{

+  uint32_t tmpcr1;

+

+  /* Check the parameters */

+  assert_param(IS_UART_FIFO_INSTANCE(huart->Instance));

+  assert_param(IS_UART_RXFIFO_THRESHOLD(Threshold));

+

+  /* Process Locked */

+  __HAL_LOCK(huart);

+

+  huart->gState = HAL_UART_STATE_BUSY;

+

+  /* Save actual UART configuration */

+  tmpcr1 = READ_REG(huart->Instance->CR1);

+

+  /* Disable UART */

+  __HAL_UART_DISABLE(huart);

+

+  /* Update RX threshold configuration */

+  MODIFY_REG(huart->Instance->CR3, USART_CR3_RXFTCFG, Threshold);

+

+  /* Determine the number of data to process during RX/TX ISR execution */

+  UARTEx_SetNbDataToProcess(huart);

+

+  /* Restore UART configuration */

+  WRITE_REG(huart->Instance->CR1, tmpcr1);

+

+  huart->gState = HAL_UART_STATE_READY;

+

+  /* Process Unlocked */

+  __HAL_UNLOCK(huart);

+

+  return HAL_OK;

+}

+#endif /* USART_CR1_FIFOEN */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/** @addtogroup UARTEx_Private_Functions

+  * @{

+  */

+

+/**

+  * @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));

+}

+

+#if defined(USART_CR1_FIFOEN)

+/**

+  * @brief Calculate the number of data to process in RX/TX ISR.

+  * @note The RX FIFO depth and the TX FIFO depth is extracted from

+  *       the UART configuration registers.

+  * @param huart UART handle.

+  * @retval None

+  */

+static void UARTEx_SetNbDataToProcess(UART_HandleTypeDef *huart)

+{

+  uint8_t rx_fifo_depth;

+  uint8_t tx_fifo_depth;

+  uint8_t rx_fifo_threshold;

+  uint8_t tx_fifo_threshold;

+  uint8_t numerator[] = {1U, 1U, 1U, 3U, 7U, 1U, 0U, 0U};

+  uint8_t denominator[] = {8U, 4U, 2U, 4U, 8U, 1U, 1U, 1U};

+

+  if (huart->FifoMode == UART_FIFOMODE_DISABLE)

+  {

+    huart->NbTxDataToProcess = 1U;

+    huart->NbRxDataToProcess = 1U;

+  }

+  else

+  {

+    rx_fifo_depth = RX_FIFO_DEPTH;

+    tx_fifo_depth = TX_FIFO_DEPTH;

+    rx_fifo_threshold = (uint8_t)(READ_BIT(huart->Instance->CR3, USART_CR3_RXFTCFG) >> USART_CR3_RXFTCFG_Pos);

+    tx_fifo_threshold = (uint8_t)(READ_BIT(huart->Instance->CR3, USART_CR3_TXFTCFG) >> USART_CR3_TXFTCFG_Pos);

+    huart->NbTxDataToProcess = ((uint16_t)tx_fifo_depth * numerator[tx_fifo_threshold]) / (uint16_t)denominator[tx_fifo_threshold];

+    huart->NbRxDataToProcess = ((uint16_t)rx_fifo_depth * numerator[rx_fifo_threshold]) / (uint16_t)denominator[rx_fifo_threshold];

+  }

+}

+#endif /* USART_CR1_FIFOEN */

+/**

+  * @}

+  */

+

+#endif /* HAL_UART_MODULE_ENABLED */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

diff --git a/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_usb.c b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_usb.c
new file mode 100644
index 0000000..4533162
--- /dev/null
+++ b/FreeRTOS/Demo/CORTEX_MPU_STM32L4_Discovery_Keil_STM32Cube/ST_Code/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_usb.c
@@ -0,0 +1,2611 @@
+/**

+  ******************************************************************************

+  * @file    stm32l4xx_ll_usb.c

+  * @author  MCD Application Team

+  * @brief   USB Low Layer HAL module driver.

+  *

+  *          This file provides firmware functions to manage the following

+  *          functionalities of the USB Peripheral Controller:

+  *           + Initialization/de-initialization functions

+  *           + I/O operation functions

+  *           + Peripheral Control functions

+  *           + Peripheral State functions

+  *

+  @verbatim

+  ==============================================================================

+                    ##### How to use this driver #####

+  ==============================================================================

+    [..]

+      (#) Fill parameters of Init structure in USB_OTG_CfgTypeDef structure.

+

+      (#) Call USB_CoreInit() API to initialize the USB Core peripheral.

+

+      (#) The upper HAL HCD/PCD driver will call the right routines for its internal processes.

+

+  @endverbatim

+  ******************************************************************************

+  * @attention

+  *

+  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.

+  * All rights reserved.</center></h2>

+  *

+  * This software component is licensed by ST under BSD 3-Clause license,

+  * the "License"; You may not use this file except in compliance with the

+  * License. You may obtain a copy of the License at:

+  *                        opensource.org/licenses/BSD-3-Clause

+  *

+  ******************************************************************************

+  */

+

+/* Includes ------------------------------------------------------------------*/

+#include "stm32l4xx_hal.h"

+

+/** @addtogroup STM32L4xx_LL_USB_DRIVER

+  * @{

+  */

+

+#if defined (HAL_PCD_MODULE_ENABLED) || defined (HAL_HCD_MODULE_ENABLED)

+#if defined (USB) || defined (USB_OTG_FS)

+/* Private typedef -----------------------------------------------------------*/

+/* Private define ------------------------------------------------------------*/

+/* Private macro -------------------------------------------------------------*/

+/* Private variables ---------------------------------------------------------*/

+/* Private function prototypes -----------------------------------------------*/

+/* Private functions ---------------------------------------------------------*/

+#if defined (USB_OTG_FS)

+static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx);

+

+/* Exported functions --------------------------------------------------------*/

+/** @defgroup USB_LL_Exported_Functions USB Low Layer Exported Functions

+  * @{

+  */

+

+/** @defgroup USB_LL_Exported_Functions_Group1 Initialization/de-initialization functions

+ *  @brief    Initialization and Configuration functions

+ *

+@verbatim

+ ===============================================================================

+                      ##### Initialization/de-initialization functions #####

+ ===============================================================================

+

+@endverbatim

+  * @{

+  */

+

+/**

+  * @brief  Initializes the USB Core

+  * @param  USBx USB Instance

+  * @param  cfg pointer to a USB_OTG_CfgTypeDef structure that contains

+  *         the configuration information for the specified USBx peripheral.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg)

+{

+  HAL_StatusTypeDef ret;

+

+  if (cfg.phy_itface == USB_OTG_ULPI_PHY)

+  {

+    USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN);

+

+    /* Init The ULPI Interface */

+    USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_TSDPS | USB_OTG_GUSBCFG_ULPIFSLS | USB_OTG_GUSBCFG_PHYSEL);

+

+    /* Select vbus source */

+    USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI);

+    if (cfg.use_external_vbus == 1U)

+    {

+      USBx->GUSBCFG |= USB_OTG_GUSBCFG_ULPIEVBUSD;

+    }

+    /* Reset after a PHY select  */

+    ret = USB_CoreReset(USBx);

+  }

+  else /* FS interface (embedded Phy) */

+  {

+    /* Select FS Embedded PHY */

+    USBx->GUSBCFG |= USB_OTG_GUSBCFG_PHYSEL;

+

+    /* Reset after a PHY select and set Host mode */

+    ret = USB_CoreReset(USBx);

+

+    if (cfg.battery_charging_enable == 0U)

+    {

+      /* Activate the USB Transceiver */

+      USBx->GCCFG |= USB_OTG_GCCFG_PWRDWN;

+    }

+    else

+    {

+      /* Deactivate the USB Transceiver */

+      USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN);

+    }

+  }

+

+  return ret;

+}

+

+

+/**

+  * @brief  Set the USB turnaround time

+  * @param  USBx USB Instance

+  * @param  hclk: AHB clock frequency

+  * @retval USB turnaround time In PHY Clocks number

+  */

+HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx,

+                                        uint32_t hclk, uint8_t speed)

+{

+  uint32_t UsbTrd;

+

+  /* The USBTRD is configured according to the tables below, depending on AHB frequency

+  used by application. In the low AHB frequency range it is used to stretch enough the USB response

+  time to IN tokens, the USB turnaround time, so to compensate for the longer AHB read access

+  latency to the Data FIFO */

+  if (speed == USBD_FS_SPEED)

+  {

+    if ((hclk >= 14200000U) && (hclk < 15000000U))

+    {

+      /* hclk Clock Range between 14.2-15 MHz */

+      UsbTrd = 0xFU;

+    }

+    else if ((hclk >= 15000000U) && (hclk < 16000000U))

+    {

+      /* hclk Clock Range between 15-16 MHz */

+      UsbTrd = 0xEU;

+    }

+    else if ((hclk >= 16000000U) && (hclk < 17200000U))

+    {

+      /* hclk Clock Range between 16-17.2 MHz */

+      UsbTrd = 0xDU;

+    }

+    else if ((hclk >= 17200000U) && (hclk < 18500000U))

+    {

+      /* hclk Clock Range between 17.2-18.5 MHz */

+      UsbTrd = 0xCU;

+    }

+    else if ((hclk >= 18500000U) && (hclk < 20000000U))

+    {

+      /* hclk Clock Range between 18.5-20 MHz */

+      UsbTrd = 0xBU;

+    }

+    else if ((hclk >= 20000000U) && (hclk < 21800000U))

+    {

+      /* hclk Clock Range between 20-21.8 MHz */

+      UsbTrd = 0xAU;

+    }

+    else if ((hclk >= 21800000U) && (hclk < 24000000U))

+    {

+      /* hclk Clock Range between 21.8-24 MHz */

+      UsbTrd = 0x9U;

+    }

+    else if ((hclk >= 24000000U) && (hclk < 27700000U))

+    {

+      /* hclk Clock Range between 24-27.7 MHz */

+      UsbTrd = 0x8U;

+    }

+    else if ((hclk >= 27700000U) && (hclk < 32000000U))

+    {

+      /* hclk Clock Range between 27.7-32 MHz */

+      UsbTrd = 0x7U;

+    }

+    else /* if(hclk >= 32000000) */

+    {

+      /* hclk Clock Range between 32-200 MHz */

+      UsbTrd = 0x6U;

+    }

+  }

+  else

+  {

+    UsbTrd = USBD_DEFAULT_TRDT_VALUE;

+  }

+

+  USBx->GUSBCFG &= ~USB_OTG_GUSBCFG_TRDT;

+  USBx->GUSBCFG |= (uint32_t)((UsbTrd << 10) & USB_OTG_GUSBCFG_TRDT);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_EnableGlobalInt

+  *         Enables the controller's Global Int in the AHB Config reg

+  * @param  USBx  Selected device

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_EnableGlobalInt(USB_OTG_GlobalTypeDef *USBx)

+{

+  USBx->GAHBCFG |= USB_OTG_GAHBCFG_GINT;

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_DisableGlobalInt

+  *         Disable the controller's Global Int in the AHB Config reg

+  * @param  USBx  Selected device

+  * @retval HAL status

+*/

+HAL_StatusTypeDef USB_DisableGlobalInt(USB_OTG_GlobalTypeDef *USBx)

+{

+  USBx->GAHBCFG &= ~USB_OTG_GAHBCFG_GINT;

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_SetCurrentMode : Set functional mode

+  * @param  USBx  Selected device

+  * @param  mode   current core mode

+  *          This parameter can be one of these values:

+  *            @arg USB_DEVICE_MODE: Peripheral mode

+  *            @arg USB_HOST_MODE: Host mode

+  *            @arg USB_DRD_MODE: Dual Role Device mode

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_SetCurrentMode(USB_OTG_GlobalTypeDef *USBx, USB_ModeTypeDef mode)

+{

+  USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_FHMOD | USB_OTG_GUSBCFG_FDMOD);

+

+  if (mode == USB_HOST_MODE)

+  {

+    USBx->GUSBCFG |= USB_OTG_GUSBCFG_FHMOD;

+  }

+  else if (mode == USB_DEVICE_MODE)

+  {

+    USBx->GUSBCFG |= USB_OTG_GUSBCFG_FDMOD;

+  }

+  else

+  {

+    return HAL_ERROR;

+  }

+  HAL_Delay(50U);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_DevInit : Initializes the USB_OTG controller registers

+  *         for device mode

+  * @param  USBx  Selected device

+  * @param  cfg   pointer to a USB_OTG_CfgTypeDef structure that contains

+  *         the configuration information for the specified USBx peripheral.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg)

+{

+  HAL_StatusTypeDef ret = HAL_OK;

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t i;

+

+  for (i = 0U; i < 15U; i++)

+  {

+    USBx->DIEPTXF[i] = 0U;

+  }

+

+  /* VBUS Sensing setup */

+  if (cfg.vbus_sensing_enable == 0U)

+  {

+    /* Deactivate VBUS Sensing B */

+    USBx->GCCFG &= ~USB_OTG_GCCFG_VBDEN;

+

+    /* B-peripheral session valid override enable */

+    USBx->GOTGCTL |= USB_OTG_GOTGCTL_BVALOEN;

+    USBx->GOTGCTL |= USB_OTG_GOTGCTL_BVALOVAL;

+  }

+  else

+  {

+    /* Enable HW VBUS sensing */

+    USBx->GCCFG |= USB_OTG_GCCFG_VBDEN;

+  }

+

+  /* Restart the Phy Clock */

+  USBx_PCGCCTL = 0U;

+

+  /* Device mode configuration */

+  USBx_DEVICE->DCFG |= DCFG_FRAME_INTERVAL_80;

+

+  /* Set Core speed to Full speed mode */

+  (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_FULL);

+

+  /* Flush the FIFOs */

+  if (USB_FlushTxFifo(USBx, 0x10U) != HAL_OK) /* all Tx FIFOs */

+  {

+    ret = HAL_ERROR;

+  }

+

+  if (USB_FlushRxFifo(USBx) != HAL_OK)

+  {

+    ret = HAL_ERROR;

+  }

+

+  /* Clear all pending Device Interrupts */

+  USBx_DEVICE->DIEPMSK = 0U;

+  USBx_DEVICE->DOEPMSK = 0U;

+  USBx_DEVICE->DAINTMSK = 0U;

+

+  for (i = 0U; i < cfg.dev_endpoints; i++)

+  {

+    if ((USBx_INEP(i)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA)

+    {

+      if (i == 0U)

+      {

+        USBx_INEP(i)->DIEPCTL = USB_OTG_DIEPCTL_SNAK;

+      }

+      else

+      {

+        USBx_INEP(i)->DIEPCTL = USB_OTG_DIEPCTL_EPDIS | USB_OTG_DIEPCTL_SNAK;

+      }

+    }

+    else

+    {

+      USBx_INEP(i)->DIEPCTL = 0U;

+    }

+

+    USBx_INEP(i)->DIEPTSIZ = 0U;

+    USBx_INEP(i)->DIEPINT  = 0xFB7FU;

+  }

+

+  for (i = 0U; i < cfg.dev_endpoints; i++)

+  {

+    if ((USBx_OUTEP(i)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA)

+    {

+      if (i == 0U)

+      {

+        USBx_OUTEP(i)->DOEPCTL = USB_OTG_DOEPCTL_SNAK;

+      }

+      else

+      {

+        USBx_OUTEP(i)->DOEPCTL = USB_OTG_DOEPCTL_EPDIS | USB_OTG_DOEPCTL_SNAK;

+      }

+    }

+    else

+    {

+      USBx_OUTEP(i)->DOEPCTL = 0U;

+    }

+

+    USBx_OUTEP(i)->DOEPTSIZ = 0U;

+    USBx_OUTEP(i)->DOEPINT  = 0xFB7FU;

+  }

+

+  USBx_DEVICE->DIEPMSK &= ~(USB_OTG_DIEPMSK_TXFURM);

+

+  /* Disable all interrupts. */

+  USBx->GINTMSK = 0U;

+

+  /* Clear any pending interrupts */

+  USBx->GINTSTS = 0xBFFFFFFFU;

+

+  /* Enable the common interrupts */

+  USBx->GINTMSK |= USB_OTG_GINTMSK_RXFLVLM;

+

+  /* Enable interrupts matching to the Device mode ONLY */

+  USBx->GINTMSK |= USB_OTG_GINTMSK_USBSUSPM | USB_OTG_GINTMSK_USBRST |

+                   USB_OTG_GINTMSK_ENUMDNEM | USB_OTG_GINTMSK_IEPINT |

+                   USB_OTG_GINTMSK_OEPINT   | USB_OTG_GINTMSK_IISOIXFRM |

+                   USB_OTG_GINTMSK_PXFRM_IISOOXFRM | USB_OTG_GINTMSK_WUIM;

+

+  if (cfg.Sof_enable != 0U)

+  {

+    USBx->GINTMSK |= USB_OTG_GINTMSK_SOFM;

+  }

+

+  if (cfg.vbus_sensing_enable == 1U)

+  {

+    USBx->GINTMSK |= (USB_OTG_GINTMSK_SRQIM | USB_OTG_GINTMSK_OTGINT);

+  }

+

+  return ret;

+}

+

+/**

+  * @brief  USB_OTG_FlushTxFifo : Flush a Tx FIFO

+  * @param  USBx  Selected device

+  * @param  num  FIFO number

+  *         This parameter can be a value from 1 to 15

+            15 means Flush all Tx FIFOs

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_FlushTxFifo(USB_OTG_GlobalTypeDef *USBx, uint32_t num)

+{

+  uint32_t count = 0U;

+

+  USBx->GRSTCTL = (USB_OTG_GRSTCTL_TXFFLSH | (num << 6));

+

+  do

+  {

+    if (++count > 200000U)

+    {

+      return HAL_TIMEOUT;

+    }

+  }

+  while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_TXFFLSH) == USB_OTG_GRSTCTL_TXFFLSH);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_FlushRxFifo : Flush Rx FIFO

+  * @param  USBx  Selected device

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_FlushRxFifo(USB_OTG_GlobalTypeDef *USBx)

+{

+  uint32_t count = 0;

+

+  USBx->GRSTCTL = USB_OTG_GRSTCTL_RXFFLSH;

+

+  do

+  {

+    if (++count > 200000U)

+    {

+      return HAL_TIMEOUT;

+    }

+  }

+  while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_RXFFLSH) == USB_OTG_GRSTCTL_RXFFLSH);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_SetDevSpeed  Initializes the DevSpd field of DCFG register

+  *         depending the PHY type and the enumeration speed of the device.

+  * @param  USBx  Selected device

+  * @param  speed  device speed

+  *          This parameter can be one of these values:

+  *            @arg USB_OTG_SPEED_FULL: Full speed mode

+  * @retval  Hal status

+  */

+HAL_StatusTypeDef USB_SetDevSpeed(USB_OTG_GlobalTypeDef *USBx, uint8_t speed)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+

+  USBx_DEVICE->DCFG |= speed;

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_GetDevSpeed  Return the Dev Speed

+  * @param  USBx  Selected device

+  * @retval speed  device speed

+  *          This parameter can be one of these values:

+  *            @arg PCD_SPEED_FULL: Full speed mode

+  */

+uint8_t USB_GetDevSpeed(USB_OTG_GlobalTypeDef *USBx)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint8_t speed;

+  uint32_t DevEnumSpeed = USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD;

+

+  if ((DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ) ||

+      (DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_48MHZ))

+  {

+    speed = USBD_FS_SPEED;

+  }

+  else

+  {

+    speed = 0xFU;

+  }

+

+  return speed;

+}

+

+/**

+  * @brief  Activate and configure an endpoint

+  * @param  USBx  Selected device

+  * @param  ep pointer to endpoint structure

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_ActivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t epnum = (uint32_t)ep->num;

+

+  if (ep->is_in == 1U)

+  {

+    USBx_DEVICE->DAINTMSK |= USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK));

+

+    if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_USBAEP) == 0U)

+    {

+      USBx_INEP(epnum)->DIEPCTL |= (ep->maxpacket & USB_OTG_DIEPCTL_MPSIZ) |

+                                   ((uint32_t)ep->type << 18) | (epnum << 22) |

+                                   USB_OTG_DIEPCTL_SD0PID_SEVNFRM |

+                                   USB_OTG_DIEPCTL_USBAEP;

+    }

+  }

+  else

+  {

+    USBx_DEVICE->DAINTMSK |= USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16);

+

+    if (((USBx_OUTEP(epnum)->DOEPCTL) & USB_OTG_DOEPCTL_USBAEP) == 0U)

+    {

+      USBx_OUTEP(epnum)->DOEPCTL |= (ep->maxpacket & USB_OTG_DOEPCTL_MPSIZ) |

+                                    ((uint32_t)ep->type << 18) |

+                                    USB_OTG_DIEPCTL_SD0PID_SEVNFRM |

+                                    USB_OTG_DOEPCTL_USBAEP;

+    }

+  }

+  return HAL_OK;

+}

+

+/**

+  * @brief  Activate and configure a dedicated endpoint

+  * @param  USBx  Selected device

+  * @param  ep pointer to endpoint structure

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_ActivateDedicatedEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t epnum = (uint32_t)ep->num;

+

+  /* Read DEPCTLn register */

+  if (ep->is_in == 1U)

+  {

+    if (((USBx_INEP(epnum)->DIEPCTL) & USB_OTG_DIEPCTL_USBAEP) == 0U)

+    {

+      USBx_INEP(epnum)->DIEPCTL |= (ep->maxpacket & USB_OTG_DIEPCTL_MPSIZ) |

+                                   ((uint32_t)ep->type << 18) | (epnum << 22) |

+                                   USB_OTG_DIEPCTL_SD0PID_SEVNFRM |

+                                   USB_OTG_DIEPCTL_USBAEP;

+    }

+

+    USBx_DEVICE->DEACHMSK |= USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK));

+  }

+  else

+  {

+    if (((USBx_OUTEP(epnum)->DOEPCTL) & USB_OTG_DOEPCTL_USBAEP) == 0U)

+    {

+      USBx_OUTEP(epnum)->DOEPCTL |= (ep->maxpacket & USB_OTG_DOEPCTL_MPSIZ) |

+                                    ((uint32_t)ep->type << 18) | (epnum << 22) |

+                                    USB_OTG_DOEPCTL_USBAEP;

+    }

+

+    USBx_DEVICE->DEACHMSK |= USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16);

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  De-activate and de-initialize an endpoint

+  * @param  USBx  Selected device

+  * @param  ep pointer to endpoint structure

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_DeactivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t epnum = (uint32_t)ep->num;

+

+  /* Read DEPCTLn register */

+  if (ep->is_in == 1U)

+  {

+    USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK)));

+    USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK)));

+    USBx_INEP(epnum)->DIEPCTL &= ~(USB_OTG_DIEPCTL_USBAEP |

+                                   USB_OTG_DIEPCTL_MPSIZ |

+                                   USB_OTG_DIEPCTL_TXFNUM |

+                                   USB_OTG_DIEPCTL_SD0PID_SEVNFRM |

+                                   USB_OTG_DIEPCTL_EPTYP);

+  }

+  else

+  {

+    USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16));

+    USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16));

+    USBx_OUTEP(epnum)->DOEPCTL &= ~(USB_OTG_DOEPCTL_USBAEP |

+                                    USB_OTG_DOEPCTL_MPSIZ |

+                                    USB_OTG_DOEPCTL_SD0PID_SEVNFRM |

+                                    USB_OTG_DOEPCTL_EPTYP);

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  De-activate and de-initialize a dedicated endpoint

+  * @param  USBx  Selected device

+  * @param  ep pointer to endpoint structure

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_DeactivateDedicatedEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t epnum = (uint32_t)ep->num;

+

+  /* Read DEPCTLn register */

+  if (ep->is_in == 1U)

+  {

+    USBx_INEP(epnum)->DIEPCTL &= ~ USB_OTG_DIEPCTL_USBAEP;

+    USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK)));

+  }

+  else

+  {

+    USBx_OUTEP(epnum)->DOEPCTL &= ~USB_OTG_DOEPCTL_USBAEP;

+    USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16));

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_EPStartXfer : setup and starts a transfer over an EP

+  * @param  USBx  Selected device

+  * @param  ep pointer to endpoint structure

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t epnum = (uint32_t)ep->num;

+  uint16_t pktcnt;

+

+  /* IN endpoint */

+  if (ep->is_in == 1U)

+  {

+    /* Zero Length Packet? */

+    if (ep->xfer_len == 0U)

+    {

+      USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT);

+      USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19));

+      USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ);

+    }

+    else

+    {

+      /* Program the transfer size and packet count

+      * as follows: xfersize = N * maxpacket +

+      * short_packet pktcnt = N + (short_packet

+      * exist ? 1 : 0)

+      */

+      USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ);

+      USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT);

+      USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (((ep->xfer_len + ep->maxpacket - 1U) / ep->maxpacket) << 19));

+      USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & ep->xfer_len);

+

+      if (ep->type == EP_TYPE_ISOC)

+      {

+        USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_MULCNT);

+        USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_MULCNT & (1U << 29));

+      }

+    }

+    /* EP enable, IN data in FIFO */

+    USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA);

+

+    if (ep->type != EP_TYPE_ISOC)

+    {

+      /* Enable the Tx FIFO Empty Interrupt for this EP */

+      if (ep->xfer_len > 0U)

+      {

+        USBx_DEVICE->DIEPEMPMSK |= 1UL << (ep->num & EP_ADDR_MSK);

+      }

+    }

+    else

+    {

+      if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U)

+      {

+        USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM;

+      }

+      else

+      {

+        USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM;

+      }

+

+      (void)USB_WritePacket(USBx, ep->xfer_buff, ep->num, (uint16_t)ep->xfer_len);

+    }

+  }

+  else /* OUT endpoint */

+  {

+    /* Program the transfer size and packet count as follows:

+    * pktcnt = N

+    * xfersize = N * maxpacket

+    */

+    USBx_OUTEP(epnum)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_XFRSIZ);

+    USBx_OUTEP(epnum)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_PKTCNT);

+

+    if (ep->xfer_len == 0U)

+    {

+      USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & ep->maxpacket);

+      USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19));

+    }

+    else

+    {

+      pktcnt = (uint16_t)((ep->xfer_len + ep->maxpacket - 1U) / ep->maxpacket);

+      USBx_OUTEP(epnum)->DOEPTSIZ |= USB_OTG_DOEPTSIZ_PKTCNT & ((uint32_t)pktcnt << 19);

+      USBx_OUTEP(epnum)->DOEPTSIZ |= USB_OTG_DOEPTSIZ_XFRSIZ & (ep->maxpacket * pktcnt);

+    }

+

+    if (ep->type == EP_TYPE_ISOC)

+    {

+      if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U)

+      {

+        USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SODDFRM;

+      }

+      else

+      {

+        USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SD0PID_SEVNFRM;

+      }

+    }

+    /* EP enable */

+    USBx_OUTEP(epnum)->DOEPCTL |= (USB_OTG_DOEPCTL_CNAK | USB_OTG_DOEPCTL_EPENA);

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_EP0StartXfer : setup and starts a transfer over the EP  0

+  * @param  USBx  Selected device

+  * @param  ep pointer to endpoint structure

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_EP0StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t epnum = (uint32_t)ep->num;

+

+  /* IN endpoint */

+  if (ep->is_in == 1U)

+  {

+    /* Zero Length Packet? */

+    if (ep->xfer_len == 0U)

+    {

+      USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT);

+      USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19));

+      USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ);

+    }

+    else

+    {

+      /* Program the transfer size and packet count

+      * as follows: xfersize = N * maxpacket +

+      * short_packet pktcnt = N + (short_packet

+      * exist ? 1 : 0)

+      */

+      USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ);

+      USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT);

+

+      if (ep->xfer_len > ep->maxpacket)

+      {

+        ep->xfer_len = ep->maxpacket;

+      }

+      USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19));

+      USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & ep->xfer_len);

+    }

+

+    /* EP enable, IN data in FIFO */

+    USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA);

+

+    /* Enable the Tx FIFO Empty Interrupt for this EP */

+    if (ep->xfer_len > 0U)

+    {

+      USBx_DEVICE->DIEPEMPMSK |= 1UL << (ep->num & EP_ADDR_MSK);

+    }

+  }

+  else /* OUT endpoint */

+  {

+    /* Program the transfer size and packet count as follows:

+    * pktcnt = N

+    * xfersize = N * maxpacket

+    */

+    USBx_OUTEP(epnum)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_XFRSIZ);

+    USBx_OUTEP(epnum)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_PKTCNT);

+

+    if (ep->xfer_len > 0U)

+    {

+      ep->xfer_len = ep->maxpacket;

+    }

+

+    USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19));

+    USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & (ep->maxpacket));

+

+    /* EP enable */

+    USBx_OUTEP(epnum)->DOEPCTL |= (USB_OTG_DOEPCTL_CNAK | USB_OTG_DOEPCTL_EPENA);

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_WritePacket : Writes a packet into the Tx FIFO associated

+  *         with the EP/channel

+  * @param  USBx  Selected device

+  * @param  src   pointer to source buffer

+  * @param  ch_ep_num  endpoint or host channel number

+  * @param  len  Number of bytes to write

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_WritePacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *src, uint8_t ch_ep_num, uint16_t len)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t *pSrc = (uint32_t *)src;

+  uint32_t count32b, i;

+

+  count32b = ((uint32_t)len + 3U) / 4U;

+  for (i = 0U; i < count32b; i++)

+  {

+    USBx_DFIFO((uint32_t)ch_ep_num) = __UNALIGNED_UINT32_READ(pSrc);

+    pSrc++;

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_ReadPacket : read a packet from the RX FIFO

+  * @param  USBx  Selected device

+  * @param  dest  source pointer

+  * @param  len  Number of bytes to read

+  * @retval pointer to destination buffer

+  */

+void *USB_ReadPacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t *pDest = (uint32_t *)dest;

+  uint32_t i;

+  uint32_t count32b = ((uint32_t)len + 3U) / 4U;

+

+  for (i = 0U; i < count32b; i++)

+  {

+    __UNALIGNED_UINT32_WRITE(pDest, USBx_DFIFO(0U));

+    pDest++;

+  }

+

+  return ((void *)pDest);

+}

+

+/**

+  * @brief  USB_EPSetStall : set a stall condition over an EP

+  * @param  USBx  Selected device

+  * @param  ep pointer to endpoint structure

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_EPSetStall(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t epnum = (uint32_t)ep->num;

+

+  if (ep->is_in == 1U)

+  {

+    if (((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == 0U) && (epnum != 0U))

+    {

+      USBx_INEP(epnum)->DIEPCTL &= ~(USB_OTG_DIEPCTL_EPDIS);

+    }

+    USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_STALL;

+  }

+  else

+  {

+    if (((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == 0U) && (epnum != 0U))

+    {

+      USBx_OUTEP(epnum)->DOEPCTL &= ~(USB_OTG_DOEPCTL_EPDIS);

+    }

+    USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_STALL;

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_EPClearStall : Clear a stall condition over an EP

+  * @param  USBx  Selected device

+  * @param  ep pointer to endpoint structure

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_EPClearStall(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t epnum = (uint32_t)ep->num;

+

+  if (ep->is_in == 1U)

+  {

+    USBx_INEP(epnum)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL;

+    if ((ep->type == EP_TYPE_INTR) || (ep->type == EP_TYPE_BULK))

+    {

+      USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; /* DATA0 */

+    }

+  }

+  else

+  {

+    USBx_OUTEP(epnum)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL;

+    if ((ep->type == EP_TYPE_INTR) || (ep->type == EP_TYPE_BULK))

+    {

+      USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SD0PID_SEVNFRM; /* DATA0 */

+    }

+  }

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_StopDevice : Stop the usb device mode

+  * @param  USBx  Selected device

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_StopDevice(USB_OTG_GlobalTypeDef *USBx)

+{

+  HAL_StatusTypeDef ret;

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t i;

+

+  /* Clear Pending interrupt */

+  for (i = 0U; i < 15U; i++)

+  {

+    USBx_INEP(i)->DIEPINT = 0xFB7FU;

+    USBx_OUTEP(i)->DOEPINT = 0xFB7FU;

+  }

+

+  /* Clear interrupt masks */

+  USBx_DEVICE->DIEPMSK  = 0U;

+  USBx_DEVICE->DOEPMSK  = 0U;

+  USBx_DEVICE->DAINTMSK = 0U;

+

+  /* Flush the FIFO */

+  ret = USB_FlushRxFifo(USBx);

+  if (ret != HAL_OK)

+  {

+    return ret;

+  }

+

+  ret = USB_FlushTxFifo(USBx,  0x10U);

+  if (ret != HAL_OK)

+  {

+    return ret;

+  }

+

+  return ret;

+}

+

+/**

+  * @brief  USB_SetDevAddress : Stop the usb device mode

+  * @param  USBx  Selected device

+  * @param  address  new device address to be assigned

+  *          This parameter can be a value from 0 to 255

+  * @retval HAL status

+  */

+HAL_StatusTypeDef  USB_SetDevAddress(USB_OTG_GlobalTypeDef *USBx, uint8_t address)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+

+  USBx_DEVICE->DCFG &= ~(USB_OTG_DCFG_DAD);

+  USBx_DEVICE->DCFG |= ((uint32_t)address << 4) & USB_OTG_DCFG_DAD;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_DevConnect : Connect the USB device by enabling the pull-up/pull-down

+  * @param  USBx  Selected device

+  * @retval HAL status

+  */

+HAL_StatusTypeDef  USB_DevConnect(USB_OTG_GlobalTypeDef *USBx)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+

+  USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_SDIS;

+  HAL_Delay(3U);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_DevDisconnect : Disconnect the USB device by disabling the pull-up/pull-down

+  * @param  USBx  Selected device

+  * @retval HAL status

+  */

+HAL_StatusTypeDef  USB_DevDisconnect(USB_OTG_GlobalTypeDef *USBx)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+

+  USBx_DEVICE->DCTL |= USB_OTG_DCTL_SDIS;

+  HAL_Delay(3U);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_ReadInterrupts: return the global USB interrupt status

+  * @param  USBx  Selected device

+  * @retval HAL status

+  */

+uint32_t  USB_ReadInterrupts(USB_OTG_GlobalTypeDef *USBx)

+{

+  uint32_t tmpreg;

+

+  tmpreg = USBx->GINTSTS;

+  tmpreg &= USBx->GINTMSK;

+

+  return tmpreg;

+}

+

+/**

+  * @brief  USB_ReadDevAllOutEpInterrupt: return the USB device OUT endpoints interrupt status

+  * @param  USBx  Selected device

+  * @retval HAL status

+  */

+uint32_t USB_ReadDevAllOutEpInterrupt(USB_OTG_GlobalTypeDef *USBx)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t tmpreg;

+

+  tmpreg  = USBx_DEVICE->DAINT;

+  tmpreg &= USBx_DEVICE->DAINTMSK;

+

+  return ((tmpreg & 0xffff0000U) >> 16);

+}

+

+/**

+  * @brief  USB_ReadDevAllInEpInterrupt: return the USB device IN endpoints interrupt status

+  * @param  USBx  Selected device

+  * @retval HAL status

+  */

+uint32_t USB_ReadDevAllInEpInterrupt(USB_OTG_GlobalTypeDef *USBx)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t tmpreg;

+

+  tmpreg  = USBx_DEVICE->DAINT;

+  tmpreg &= USBx_DEVICE->DAINTMSK;

+

+  return ((tmpreg & 0xFFFFU));

+}

+

+/**

+  * @brief  Returns Device OUT EP Interrupt register

+  * @param  USBx  Selected device

+  * @param  epnum  endpoint number

+  *          This parameter can be a value from 0 to 15

+  * @retval Device OUT EP Interrupt register

+  */

+uint32_t USB_ReadDevOutEPInterrupt(USB_OTG_GlobalTypeDef *USBx, uint8_t epnum)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t tmpreg;

+

+  tmpreg  = USBx_OUTEP((uint32_t)epnum)->DOEPINT;

+  tmpreg &= USBx_DEVICE->DOEPMSK;

+

+  return tmpreg;

+}

+

+/**

+  * @brief  Returns Device IN EP Interrupt register

+  * @param  USBx  Selected device

+  * @param  epnum  endpoint number

+  *          This parameter can be a value from 0 to 15

+  * @retval Device IN EP Interrupt register

+  */

+uint32_t USB_ReadDevInEPInterrupt(USB_OTG_GlobalTypeDef *USBx, uint8_t epnum)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t tmpreg, msk, emp;

+

+  msk = USBx_DEVICE->DIEPMSK;

+  emp = USBx_DEVICE->DIEPEMPMSK;

+  msk |= ((emp >> (epnum & EP_ADDR_MSK)) & 0x1U) << 7;

+  tmpreg = USBx_INEP((uint32_t)epnum)->DIEPINT & msk;

+

+  return tmpreg;

+}

+

+/**

+  * @brief  USB_ClearInterrupts: clear a USB interrupt

+  * @param  USBx  Selected device

+  * @param  interrupt  interrupt flag

+  * @retval None

+  */

+void  USB_ClearInterrupts(USB_OTG_GlobalTypeDef *USBx, uint32_t interrupt)

+{

+  USBx->GINTSTS |= interrupt;

+}

+

+/**

+  * @brief  Returns USB core mode

+  * @param  USBx  Selected device

+  * @retval return core mode : Host or Device

+  *          This parameter can be one of these values:

+  *           0 : Host

+  *           1 : Device

+  */

+uint32_t USB_GetMode(USB_OTG_GlobalTypeDef *USBx)

+{

+  return ((USBx->GINTSTS) & 0x1U);

+}

+

+/**

+  * @brief  Activate EP0 for Setup transactions

+  * @param  USBx  Selected device

+  * @retval HAL status

+  */

+HAL_StatusTypeDef  USB_ActivateSetup(USB_OTG_GlobalTypeDef *USBx)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+

+  /* Set the MPS of the IN EP based on the enumeration speed */

+  USBx_INEP(0U)->DIEPCTL &= ~USB_OTG_DIEPCTL_MPSIZ;

+

+  if ((USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD) == DSTS_ENUMSPD_LS_PHY_6MHZ)

+  {

+    USBx_INEP(0U)->DIEPCTL |= 3U;

+  }

+  USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGINAK;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Prepare the EP0 to start the first control setup

+  * @param  USBx  Selected device

+  * @param  psetup  pointer to setup packet

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_EP0_OutStart(USB_OTG_GlobalTypeDef *USBx, uint8_t *psetup)

+{

+  UNUSED(psetup);

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t gSNPSiD = *(__IO uint32_t *)(&USBx->CID + 0x1U);

+

+  if (gSNPSiD > USB_OTG_CORE_ID_300A)

+  {

+    if ((USBx_OUTEP(0U)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA)

+    {

+      return HAL_OK;

+    }

+  }

+

+  USBx_OUTEP(0U)->DOEPTSIZ = 0U;

+  USBx_OUTEP(0U)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19));

+  USBx_OUTEP(0U)->DOEPTSIZ |= (3U * 8U);

+  USBx_OUTEP(0U)->DOEPTSIZ |=  USB_OTG_DOEPTSIZ_STUPCNT;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Reset the USB Core (needed after USB clock settings change)

+  * @param  USBx  Selected device

+  * @retval HAL status

+  */

+static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx)

+{

+  uint32_t count = 0U;

+

+  /* Wait for AHB master IDLE state. */

+  do

+  {

+    if (++count > 200000U)

+    {

+      return HAL_TIMEOUT;

+    }

+  }

+  while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U);

+

+  /* Core Soft Reset */

+  count = 0U;

+  USBx->GRSTCTL |= USB_OTG_GRSTCTL_CSRST;

+

+  do

+  {

+    if (++count > 200000U)

+    {

+      return HAL_TIMEOUT;

+    }

+  }

+  while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_CSRST) == USB_OTG_GRSTCTL_CSRST);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_HostInit : Initializes the USB OTG controller registers

+  *         for Host mode

+  * @param  USBx  Selected device

+  * @param  cfg   pointer to a USB_OTG_CfgTypeDef structure that contains

+  *         the configuration information for the specified USBx peripheral.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_HostInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t i;

+

+  /* Restart the Phy Clock */

+  USBx_PCGCCTL = 0U;

+

+  /* Disable VBUS sensing */

+  USBx->GCCFG &= ~(USB_OTG_GCCFG_VBDEN);

+

+  /* Disable Battery chargin detector */

+  USBx->GCCFG &= ~(USB_OTG_GCCFG_BCDEN);

+

+  /* Set default Max speed support */

+  USBx_HOST->HCFG &= ~(USB_OTG_HCFG_FSLSS);

+

+  /* Make sure the FIFOs are flushed. */

+  (void)USB_FlushTxFifo(USBx, 0x10U); /* all Tx FIFOs */

+  (void)USB_FlushRxFifo(USBx);

+

+  /* Clear all pending HC Interrupts */

+  for (i = 0U; i < cfg.Host_channels; i++)

+  {

+    USBx_HC(i)->HCINT = 0xFFFFFFFFU;

+    USBx_HC(i)->HCINTMSK = 0U;

+  }

+

+  /* Enable VBUS driving */

+  (void)USB_DriveVbus(USBx, 1U);

+

+  HAL_Delay(200U);

+

+  /* Disable all interrupts. */

+  USBx->GINTMSK = 0U;

+

+  /* Clear any pending interrupts */

+  USBx->GINTSTS = 0xFFFFFFFFU;

+

+  /* set Rx FIFO size */

+  USBx->GRXFSIZ  = 0x80U;

+  USBx->DIEPTXF0_HNPTXFSIZ = (uint32_t)(((0x60U << 16) & USB_OTG_NPTXFD) | 0x80U);

+  USBx->HPTXFSIZ = (uint32_t)(((0x40U << 16)& USB_OTG_HPTXFSIZ_PTXFD) | 0xE0U);

+  /* Enable the common interrupts */

+  USBx->GINTMSK |= USB_OTG_GINTMSK_RXFLVLM;

+

+  /* Enable interrupts matching to the Host mode ONLY */

+  USBx->GINTMSK |= (USB_OTG_GINTMSK_PRTIM            | USB_OTG_GINTMSK_HCIM | \

+                    USB_OTG_GINTMSK_SOFM             | USB_OTG_GINTSTS_DISCINT | \

+                    USB_OTG_GINTMSK_PXFRM_IISOOXFRM  | USB_OTG_GINTMSK_WUIM);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_InitFSLSPClkSel : Initializes the FSLSPClkSel field of the

+  *         HCFG register on the PHY type and set the right frame interval

+  * @param  USBx  Selected device

+  * @param  freq  clock frequency

+  *          This parameter can be one of these values:

+  *           HCFG_48_MHZ : Full Speed 48 MHz Clock

+  *           HCFG_6_MHZ : Low Speed 6 MHz Clock

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_InitFSLSPClkSel(USB_OTG_GlobalTypeDef *USBx, uint8_t freq)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+

+  USBx_HOST->HCFG &= ~(USB_OTG_HCFG_FSLSPCS);

+  USBx_HOST->HCFG |= (uint32_t)freq & USB_OTG_HCFG_FSLSPCS;

+

+  if (freq == HCFG_48_MHZ)

+  {

+    USBx_HOST->HFIR = 48000U;

+  }

+  else if (freq == HCFG_6_MHZ)

+  {

+    USBx_HOST->HFIR = 6000U;

+  }

+  else

+  {

+    /* ... */

+  }

+

+  return HAL_OK;

+}

+

+/**

+* @brief  USB_OTG_ResetPort : Reset Host Port

+  * @param  USBx  Selected device

+  * @retval HAL status

+  * @note (1)The application must wait at least 10 ms

+  *   before clearing the reset bit.

+  */

+HAL_StatusTypeDef USB_ResetPort(USB_OTG_GlobalTypeDef *USBx)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+

+  __IO uint32_t hprt0 = 0U;

+

+  hprt0 = USBx_HPRT0;

+

+  hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |

+             USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG);

+

+  USBx_HPRT0 = (USB_OTG_HPRT_PRST | hprt0);

+  HAL_Delay(100U);                                 /* See Note #1 */

+  USBx_HPRT0 = ((~USB_OTG_HPRT_PRST) & hprt0);

+  HAL_Delay(10U);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_DriveVbus : activate or de-activate vbus

+  * @param  state  VBUS state

+  *          This parameter can be one of these values:

+  *           0 : VBUS Active

+  *           1 : VBUS Inactive

+  * @retval HAL status

+*/

+HAL_StatusTypeDef USB_DriveVbus(USB_OTG_GlobalTypeDef *USBx, uint8_t state)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  __IO uint32_t hprt0 = 0U;

+

+  hprt0 = USBx_HPRT0;

+

+  hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |

+             USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG);

+

+  if (((hprt0 & USB_OTG_HPRT_PPWR) == 0U) && (state == 1U))

+  {

+    USBx_HPRT0 = (USB_OTG_HPRT_PPWR | hprt0);

+  }

+  if (((hprt0 & USB_OTG_HPRT_PPWR) == USB_OTG_HPRT_PPWR) && (state == 0U))

+  {

+    USBx_HPRT0 = ((~USB_OTG_HPRT_PPWR) & hprt0);

+  }

+  return HAL_OK;

+}

+

+/**

+  * @brief  Return Host Core speed

+  * @param  USBx  Selected device

+  * @retval speed : Host speed

+  *          This parameter can be one of these values:

+  *            @arg HCD_SPEED_FULL: Full speed mode

+  *            @arg HCD_SPEED_LOW: Low speed mode

+  */

+uint32_t USB_GetHostSpeed(USB_OTG_GlobalTypeDef *USBx)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  __IO uint32_t hprt0 = 0U;

+

+  hprt0 = USBx_HPRT0;

+  return ((hprt0 & USB_OTG_HPRT_PSPD) >> 17);

+}

+

+/**

+  * @brief  Return Host Current Frame number

+  * @param  USBx  Selected device

+  * @retval current frame number

+*/

+uint32_t USB_GetCurrentFrame(USB_OTG_GlobalTypeDef *USBx)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+

+  return (USBx_HOST->HFNUM & USB_OTG_HFNUM_FRNUM);

+}

+

+/**

+  * @brief  Initialize a host channel

+  * @param  USBx  Selected device

+  * @param  ch_num  Channel number

+  *         This parameter can be a value from 1 to 15

+  * @param  epnum  Endpoint number

+  *          This parameter can be a value from 1 to 15

+  * @param  dev_address  Current device address

+  *          This parameter can be a value from 0 to 255

+  * @param  speed  Current device speed

+  *          This parameter can be one of these values:

+  *            @arg USB_OTG_SPEED_FULL: Full speed mode

+  *            @arg USB_OTG_SPEED_LOW: Low speed mode

+  * @param  ep_type  Endpoint Type

+  *          This parameter can be one of these values:

+  *            @arg EP_TYPE_CTRL: Control type

+  *            @arg EP_TYPE_ISOC: Isochronous type

+  *            @arg EP_TYPE_BULK: Bulk type

+  *            @arg EP_TYPE_INTR: Interrupt type

+  * @param  mps  Max Packet Size

+  *          This parameter can be a value from 0 to32K

+  * @retval HAL state

+  */

+HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx,

+                              uint8_t ch_num,

+                              uint8_t epnum,

+                              uint8_t dev_address,

+                              uint8_t speed,

+                              uint8_t ep_type,

+                              uint16_t mps)

+{

+  HAL_StatusTypeDef ret = HAL_OK;

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t HCcharEpDir, HCcharLowSpeed;

+

+  /* Clear old interrupt conditions for this host channel. */

+  USBx_HC((uint32_t)ch_num)->HCINT = 0xFFFFFFFFU;

+

+  /* Enable channel interrupts required for this transfer. */

+  switch (ep_type)

+  {

+    case EP_TYPE_CTRL:

+    case EP_TYPE_BULK:

+      USBx_HC((uint32_t)ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM  |

+                                            USB_OTG_HCINTMSK_STALLM |

+                                            USB_OTG_HCINTMSK_TXERRM |

+                                            USB_OTG_HCINTMSK_DTERRM |

+                                            USB_OTG_HCINTMSK_AHBERR |

+                                            USB_OTG_HCINTMSK_NAKM;

+

+      if ((epnum & 0x80U) == 0x80U)

+      {

+        USBx_HC((uint32_t)ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM;

+      }

+      break;

+

+    case EP_TYPE_INTR:

+      USBx_HC((uint32_t)ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM  |

+                                            USB_OTG_HCINTMSK_STALLM |

+                                            USB_OTG_HCINTMSK_TXERRM |

+                                            USB_OTG_HCINTMSK_DTERRM |

+                                            USB_OTG_HCINTMSK_NAKM   |

+                                            USB_OTG_HCINTMSK_AHBERR |

+                                            USB_OTG_HCINTMSK_FRMORM;

+

+      if ((epnum & 0x80U) == 0x80U)

+      {

+        USBx_HC((uint32_t)ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM;

+      }

+

+      break;

+

+    case EP_TYPE_ISOC:

+      USBx_HC((uint32_t)ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM  |

+                                            USB_OTG_HCINTMSK_ACKM   |

+                                            USB_OTG_HCINTMSK_AHBERR |

+                                            USB_OTG_HCINTMSK_FRMORM;

+

+      if ((epnum & 0x80U) == 0x80U)

+      {

+        USBx_HC((uint32_t)ch_num)->HCINTMSK |= (USB_OTG_HCINTMSK_TXERRM | USB_OTG_HCINTMSK_BBERRM);

+      }

+      break;

+

+    default:

+      ret = HAL_ERROR;

+      break;

+  }

+

+  /* Enable the top level host channel interrupt. */

+  USBx_HOST->HAINTMSK |= 1UL << (ch_num & 0xFU);

+

+  /* Make sure host channel interrupts are enabled. */

+  USBx->GINTMSK |= USB_OTG_GINTMSK_HCIM;

+

+  /* Program the HCCHAR register */

+  if ((epnum & 0x80U) == 0x80U)

+  {

+    HCcharEpDir = (0x1U << 15) & USB_OTG_HCCHAR_EPDIR;

+  }

+  else

+  {

+    HCcharEpDir = 0U;

+  }

+

+  if (speed == HPRT0_PRTSPD_LOW_SPEED)

+  {

+    HCcharLowSpeed = (0x1U << 17) & USB_OTG_HCCHAR_LSDEV;

+  }

+  else

+  {

+    HCcharLowSpeed = 0U;

+  }

+

+  USBx_HC((uint32_t)ch_num)->HCCHAR = (((uint32_t)dev_address << 22) & USB_OTG_HCCHAR_DAD) |

+                                      ((((uint32_t)epnum & 0x7FU) << 11) & USB_OTG_HCCHAR_EPNUM) |

+                                      (((uint32_t)ep_type << 18) & USB_OTG_HCCHAR_EPTYP) |

+                                      ((uint32_t)mps & USB_OTG_HCCHAR_MPSIZ) | HCcharEpDir | HCcharLowSpeed;

+

+  if (ep_type == EP_TYPE_INTR)

+  {

+    USBx_HC((uint32_t)ch_num)->HCCHAR |= USB_OTG_HCCHAR_ODDFRM ;

+  }

+

+  return ret;

+}

+

+/**

+  * @brief  Start a transfer over a host channel

+  * @param  USBx  Selected device

+  * @param  hc  pointer to host channel structure

+  * @retval HAL state

+  */

+HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDef *hc)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t ch_num = (uint32_t)hc->ch_num;

+  static __IO uint32_t tmpreg = 0U;

+  uint8_t  is_oddframe;

+  uint16_t len_words;

+  uint16_t num_packets;

+  uint16_t max_hc_pkt_count = 256U;

+

+  /* Compute the expected number of packets associated to the transfer */

+  if (hc->xfer_len > 0U)

+  {

+    num_packets = (uint16_t)((hc->xfer_len + hc->max_packet - 1U) / hc->max_packet);

+

+    if (num_packets > max_hc_pkt_count)

+    {

+      num_packets = max_hc_pkt_count;

+      hc->xfer_len = (uint32_t)num_packets * hc->max_packet;

+    }

+  }

+  else

+  {

+    num_packets = 1U;

+  }

+  if (hc->ep_is_in != 0U)

+  {

+    hc->xfer_len = (uint32_t)num_packets * hc->max_packet;

+  }

+

+  /* Initialize the HCTSIZn register */

+  USBx_HC(ch_num)->HCTSIZ = (hc->xfer_len & USB_OTG_HCTSIZ_XFRSIZ) |

+                            (((uint32_t)num_packets << 19) & USB_OTG_HCTSIZ_PKTCNT) |

+                            (((uint32_t)hc->data_pid << 29) & USB_OTG_HCTSIZ_DPID);

+

+  is_oddframe = (((uint32_t)USBx_HOST->HFNUM & 0x01U) != 0U) ? 0U : 1U;

+  USBx_HC(ch_num)->HCCHAR &= ~USB_OTG_HCCHAR_ODDFRM;

+  USBx_HC(ch_num)->HCCHAR |= (uint32_t)is_oddframe << 29;

+

+  /* Set host channel enable */

+  tmpreg = USBx_HC(ch_num)->HCCHAR;

+  tmpreg &= ~USB_OTG_HCCHAR_CHDIS;

+

+  /* make sure to set the correct ep direction */

+  if (hc->ep_is_in != 0U)

+  {

+    tmpreg |= USB_OTG_HCCHAR_EPDIR;

+  }

+  else

+  {

+    tmpreg &= ~USB_OTG_HCCHAR_EPDIR;

+  }

+  tmpreg |= USB_OTG_HCCHAR_CHENA;

+  USBx_HC(ch_num)->HCCHAR = tmpreg;

+

+    if ((hc->ep_is_in == 0U) && (hc->xfer_len > 0U))

+    {

+      switch (hc->ep_type)

+      {

+        /* Non periodic transfer */

+        case EP_TYPE_CTRL:

+        case EP_TYPE_BULK:

+

+          len_words = (uint16_t)((hc->xfer_len + 3U) / 4U);

+

+          /* check if there is enough space in FIFO space */

+          if (len_words > (USBx->HNPTXSTS & 0xFFFFU))

+          {

+            /* need to process data in nptxfempty interrupt */

+            USBx->GINTMSK |= USB_OTG_GINTMSK_NPTXFEM;

+          }

+          break;

+

+        /* Periodic transfer */

+        case EP_TYPE_INTR:

+        case EP_TYPE_ISOC:

+          len_words = (uint16_t)((hc->xfer_len + 3U) / 4U);

+          /* check if there is enough space in FIFO space */

+          if (len_words > (USBx_HOST->HPTXSTS & 0xFFFFU)) /* split the transfer */

+          {

+            /* need to process data in ptxfempty interrupt */

+            USBx->GINTMSK |= USB_OTG_GINTMSK_PTXFEM;

+          }

+          break;

+

+        default:

+          break;

+      }

+

+      /* Write packet into the Tx FIFO. */

+      (void)USB_WritePacket(USBx, hc->xfer_buff, hc->ch_num, (uint16_t)hc->xfer_len);

+    }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief Read all host channel interrupts status

+  * @param  USBx  Selected device

+  * @retval HAL state

+  */

+uint32_t USB_HC_ReadInterrupt(USB_OTG_GlobalTypeDef *USBx)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+

+  return ((USBx_HOST->HAINT) & 0xFFFFU);

+}

+

+/**

+  * @brief  Halt a host channel

+  * @param  USBx  Selected device

+  * @param  hc_num  Host Channel number

+  *         This parameter can be a value from 1 to 15

+  * @retval HAL state

+  */

+HAL_StatusTypeDef USB_HC_Halt(USB_OTG_GlobalTypeDef *USBx, uint8_t hc_num)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t hcnum = (uint32_t)hc_num;

+  uint32_t count = 0U;

+  uint32_t HcEpType = (USBx_HC(hcnum)->HCCHAR & USB_OTG_HCCHAR_EPTYP) >> 18;

+

+  /* Check for space in the request queue to issue the halt. */

+  if ((HcEpType == HCCHAR_CTRL) || (HcEpType == HCCHAR_BULK))

+  {

+    USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHDIS;

+

+    if ((USBx->HNPTXSTS & (0xFFU << 16)) == 0U)

+    {

+      USBx_HC(hcnum)->HCCHAR &= ~USB_OTG_HCCHAR_CHENA;

+      USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA;

+      USBx_HC(hcnum)->HCCHAR &= ~USB_OTG_HCCHAR_EPDIR;

+      do

+      {

+        if (++count > 1000U)

+        {

+          break;

+        }

+      }

+      while ((USBx_HC(hcnum)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA);

+    }

+    else

+    {

+      USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA;

+    }

+  }

+  else

+  {

+    USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHDIS;

+

+    if ((USBx_HOST->HPTXSTS & (0xFFU << 16)) == 0U)

+    {

+      USBx_HC(hcnum)->HCCHAR &= ~USB_OTG_HCCHAR_CHENA;

+      USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA;

+      USBx_HC(hcnum)->HCCHAR &= ~USB_OTG_HCCHAR_EPDIR;

+      do

+      {

+        if (++count > 1000U)

+        {

+          break;

+        }

+      }

+      while ((USBx_HC(hcnum)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA);

+    }

+    else

+    {

+      USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA;

+    }

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Initiate Do Ping protocol

+  * @param  USBx  Selected device

+  * @param  hc_num  Host Channel number

+  *         This parameter can be a value from 1 to 15

+  * @retval HAL state

+  */

+HAL_StatusTypeDef USB_DoPing(USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t chnum = (uint32_t)ch_num;

+  uint32_t num_packets = 1U;

+  uint32_t tmpreg;

+

+  USBx_HC(chnum)->HCTSIZ = ((num_packets << 19) & USB_OTG_HCTSIZ_PKTCNT) |

+                           USB_OTG_HCTSIZ_DOPING;

+

+  /* Set host channel enable */

+  tmpreg = USBx_HC(chnum)->HCCHAR;

+  tmpreg &= ~USB_OTG_HCCHAR_CHDIS;

+  tmpreg |= USB_OTG_HCCHAR_CHENA;

+  USBx_HC(chnum)->HCCHAR = tmpreg;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Stop Host Core

+  * @param  USBx  Selected device

+  * @retval HAL state

+  */

+HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+  uint32_t count = 0U;

+  uint32_t value;

+  uint32_t i;

+

+

+  (void)USB_DisableGlobalInt(USBx);

+

+  /* Flush FIFO */

+  (void)USB_FlushTxFifo(USBx, 0x10U);

+  (void)USB_FlushRxFifo(USBx);

+

+  /* Flush out any leftover queued requests. */

+  for (i = 0U; i <= 15U; i++)

+  {

+    value = USBx_HC(i)->HCCHAR;

+    value |=  USB_OTG_HCCHAR_CHDIS;

+    value &= ~USB_OTG_HCCHAR_CHENA;

+    value &= ~USB_OTG_HCCHAR_EPDIR;

+    USBx_HC(i)->HCCHAR = value;

+  }

+

+  /* Halt all channels to put them into a known state. */

+  for (i = 0U; i <= 15U; i++)

+  {

+    value = USBx_HC(i)->HCCHAR;

+    value |= USB_OTG_HCCHAR_CHDIS;

+    value |= USB_OTG_HCCHAR_CHENA;

+    value &= ~USB_OTG_HCCHAR_EPDIR;

+    USBx_HC(i)->HCCHAR = value;

+

+    do

+    {

+      if (++count > 1000U)

+      {

+        break;

+      }

+    }

+    while ((USBx_HC(i)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA);

+  }

+

+  /* Clear any pending Host interrupts */

+  USBx_HOST->HAINT = 0xFFFFFFFFU;

+  USBx->GINTSTS = 0xFFFFFFFFU;

+  (void)USB_EnableGlobalInt(USBx);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_ActivateRemoteWakeup active remote wakeup signalling

+  * @param  USBx Selected device

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_ActivateRemoteWakeup(USB_OTG_GlobalTypeDef *USBx)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+

+  if ((USBx_DEVICE->DSTS & USB_OTG_DSTS_SUSPSTS) == USB_OTG_DSTS_SUSPSTS)

+  {

+    /* active Remote wakeup signalling */

+    USBx_DEVICE->DCTL |= USB_OTG_DCTL_RWUSIG;

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_DeActivateRemoteWakeup de-active remote wakeup signalling

+  * @param  USBx Selected device

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_DeActivateRemoteWakeup(USB_OTG_GlobalTypeDef *USBx)

+{

+  uint32_t USBx_BASE = (uint32_t)USBx;

+

+  /* active Remote wakeup signalling */

+  USBx_DEVICE->DCTL &= ~(USB_OTG_DCTL_RWUSIG);

+

+  return HAL_OK;

+}

+#endif /* defined (USB_OTG_FS) */

+

+#if defined (USB)

+/**

+  * @brief  Initializes the USB Core

+  * @param  USBx: USB Instance

+  * @param  cfg : pointer to a USB_CfgTypeDef structure that contains

+  *         the configuration information for the specified USBx peripheral.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_CoreInit(USB_TypeDef *USBx, USB_CfgTypeDef cfg)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(USBx);

+  UNUSED(cfg);

+

+  /* NOTE : - This function is not required by USB Device FS peripheral, it is used

+              only by USB OTG FS peripheral.

+            - This function is added to ensure compatibility across platforms.

+   */

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_EnableGlobalInt

+  *         Enables the controller's Global Int in the AHB Config reg

+  * @param  USBx : Selected device

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_EnableGlobalInt(USB_TypeDef *USBx)

+{

+  uint16_t winterruptmask;

+

+  /* Set winterruptmask variable */

+  winterruptmask = USB_CNTR_CTRM  | USB_CNTR_WKUPM |

+                   USB_CNTR_SUSPM | USB_CNTR_ERRM |

+                   USB_CNTR_SOFM | USB_CNTR_ESOFM |

+                   USB_CNTR_RESETM | USB_CNTR_L1REQM;

+

+  /* Set interrupt mask */

+  USBx->CNTR |= winterruptmask;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_DisableGlobalInt

+  *         Disable the controller's Global Int in the AHB Config reg

+  * @param  USBx : Selected device

+  * @retval HAL status

+*/

+HAL_StatusTypeDef USB_DisableGlobalInt(USB_TypeDef *USBx)

+{

+  uint16_t winterruptmask;

+

+  /* Set winterruptmask variable */

+  winterruptmask = USB_CNTR_CTRM  | USB_CNTR_WKUPM |

+                   USB_CNTR_SUSPM | USB_CNTR_ERRM |

+                   USB_CNTR_SOFM | USB_CNTR_ESOFM |

+                   USB_CNTR_RESETM | USB_CNTR_L1REQM;

+

+  /* Clear interrupt mask */

+  USBx->CNTR &= ~winterruptmask;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_SetCurrentMode : Set functional mode

+  * @param  USBx : Selected device

+  * @param  mode :  current core mode

+  *          This parameter can be one of the these values:

+  *            @arg USB_DEVICE_MODE: Peripheral mode mode

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_SetCurrentMode(USB_TypeDef *USBx, USB_ModeTypeDef mode)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(USBx);

+  UNUSED(mode);

+

+  /* NOTE : - This function is not required by USB Device FS peripheral, it is used

+              only by USB OTG FS peripheral.

+            - This function is added to ensure compatibility across platforms.

+   */

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_DevInit : Initializes the USB controller registers

+  *         for device mode

+  * @param  USBx : Selected device

+  * @param  cfg  : pointer to a USB_CfgTypeDef structure that contains

+  *         the configuration information for the specified USBx peripheral.

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_DevInit(USB_TypeDef *USBx, USB_CfgTypeDef cfg)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(cfg);

+

+  /* Init Device */

+  /*CNTR_FRES = 1*/

+  USBx->CNTR = USB_CNTR_FRES;

+

+  /*CNTR_FRES = 0*/

+  USBx->CNTR = 0;

+

+  /*Clear pending interrupts*/

+  USBx->ISTR = 0;

+

+  /*Set Btable Address*/

+  USBx->BTABLE = BTABLE_ADDRESS;

+

+  /* Enable USB Device Interrupt mask */

+  (void)USB_EnableGlobalInt(USBx);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_SetDevSpeed :Initializes the device speed

+  *         depending on the PHY type and the enumeration speed of the device.

+  * @param  USBx  Selected device

+  * @param  speed  device speed

+  * @retval  Hal status

+  */

+HAL_StatusTypeDef USB_SetDevSpeed(USB_TypeDef *USBx, uint8_t speed)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(USBx);

+  UNUSED(speed);

+

+  /* NOTE : - This function is not required by USB Device FS peripheral, it is used

+              only by USB OTG FS peripheral.

+            - This function is added to ensure compatibility across platforms.

+   */

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_FlushTxFifo : Flush a Tx FIFO

+  * @param  USBx : Selected device

+  * @param  num : FIFO number

+  *         This parameter can be a value from 1 to 15

+            15 means Flush all Tx FIFOs

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_FlushTxFifo(USB_TypeDef *USBx, uint32_t num)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(USBx);

+  UNUSED(num);

+

+  /* NOTE : - This function is not required by USB Device FS peripheral, it is used

+              only by USB OTG FS peripheral.

+            - This function is added to ensure compatibility across platforms.

+   */

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_FlushRxFifo : Flush Rx FIFO

+  * @param  USBx : Selected device

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_FlushRxFifo(USB_TypeDef *USBx)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(USBx);

+

+  /* NOTE : - This function is not required by USB Device FS peripheral, it is used

+              only by USB OTG FS peripheral.

+            - This function is added to ensure compatibility across platforms.

+   */

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  Activate and configure an endpoint

+  * @param  USBx : Selected device

+  * @param  ep: pointer to endpoint structure

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_ActivateEndpoint(USB_TypeDef *USBx, USB_EPTypeDef *ep)

+{

+  HAL_StatusTypeDef ret = HAL_OK;

+  uint16_t wEpRegVal;

+

+  wEpRegVal = PCD_GET_ENDPOINT(USBx, ep->num) & USB_EP_T_MASK;

+

+  /* initialize Endpoint */

+  switch (ep->type)

+  {

+    case EP_TYPE_CTRL:

+      wEpRegVal |= USB_EP_CONTROL;

+      break;

+

+    case EP_TYPE_BULK:

+      wEpRegVal |= USB_EP_BULK;

+      break;

+

+    case EP_TYPE_INTR:

+      wEpRegVal |= USB_EP_INTERRUPT;

+      break;

+

+    case EP_TYPE_ISOC:

+      wEpRegVal |= USB_EP_ISOCHRONOUS;

+      break;

+

+    default:

+      ret = HAL_ERROR;

+      break;

+  }

+

+  PCD_SET_ENDPOINT(USBx, ep->num, wEpRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX);

+

+  PCD_SET_EP_ADDRESS(USBx, ep->num, ep->num);

+

+  if (ep->doublebuffer == 0U)

+  {

+    if (ep->is_in != 0U)

+    {

+      /*Set the endpoint Transmit buffer address */

+      PCD_SET_EP_TX_ADDRESS(USBx, ep->num, ep->pmaadress);

+      PCD_CLEAR_TX_DTOG(USBx, ep->num);

+

+      if (ep->type != EP_TYPE_ISOC)

+      {

+        /* Configure NAK status for the Endpoint */

+        PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_NAK);

+      }

+      else

+      {

+        /* Configure TX Endpoint to disabled state */

+        PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS);

+      }

+    }

+    else

+    {

+      /*Set the endpoint Receive buffer address */

+      PCD_SET_EP_RX_ADDRESS(USBx, ep->num, ep->pmaadress);

+      /*Set the endpoint Receive buffer counter*/

+      PCD_SET_EP_RX_CNT(USBx, ep->num, ep->maxpacket);

+      PCD_CLEAR_RX_DTOG(USBx, ep->num);

+      /* Configure VALID status for the Endpoint*/

+      PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_VALID);

+    }

+  }

+  /*Double Buffer*/

+  else

+  {

+    /* Set the endpoint as double buffered */

+    PCD_SET_EP_DBUF(USBx, ep->num);

+    /* Set buffer address for double buffered mode */

+    PCD_SET_EP_DBUF_ADDR(USBx, ep->num, ep->pmaaddr0, ep->pmaaddr1);

+

+    if (ep->is_in == 0U)

+    {

+      /* Clear the data toggle bits for the endpoint IN/OUT */

+      PCD_CLEAR_RX_DTOG(USBx, ep->num);

+      PCD_CLEAR_TX_DTOG(USBx, ep->num);

+

+      /* Reset value of the data toggle bits for the endpoint out */

+      PCD_TX_DTOG(USBx, ep->num);

+

+      PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_VALID);

+      PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS);

+    }

+    else

+    {

+      /* Clear the data toggle bits for the endpoint IN/OUT */

+      PCD_CLEAR_RX_DTOG(USBx, ep->num);

+      PCD_CLEAR_TX_DTOG(USBx, ep->num);

+      PCD_RX_DTOG(USBx, ep->num);

+

+      if (ep->type != EP_TYPE_ISOC)

+      {

+        /* Configure NAK status for the Endpoint */

+        PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_NAK);

+      }

+      else

+      {

+        /* Configure TX Endpoint to disabled state */

+        PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS);

+      }

+

+      PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS);

+    }

+  }

+

+  return ret;

+}

+

+/**

+  * @brief  De-activate and de-initialize an endpoint

+  * @param  USBx : Selected device

+  * @param  ep: pointer to endpoint structure

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_DeactivateEndpoint(USB_TypeDef *USBx, USB_EPTypeDef *ep)

+{

+  if (ep->doublebuffer == 0U)

+  {

+    if (ep->is_in != 0U)

+    {

+      PCD_CLEAR_TX_DTOG(USBx, ep->num);

+      /* Configure DISABLE status for the Endpoint*/

+      PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS);

+    }

+    else

+    {

+      PCD_CLEAR_RX_DTOG(USBx, ep->num);

+      /* Configure DISABLE status for the Endpoint*/

+      PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS);

+    }

+  }

+  /*Double Buffer*/

+  else

+  {

+    if (ep->is_in == 0U)

+    {

+      /* Clear the data toggle bits for the endpoint IN/OUT*/

+      PCD_CLEAR_RX_DTOG(USBx, ep->num);

+      PCD_CLEAR_TX_DTOG(USBx, ep->num);

+

+      /* Reset value of the data toggle bits for the endpoint out*/

+      PCD_TX_DTOG(USBx, ep->num);

+

+      PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS);

+      PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS);

+    }

+    else

+    {

+      /* Clear the data toggle bits for the endpoint IN/OUT*/

+      PCD_CLEAR_RX_DTOG(USBx, ep->num);

+      PCD_CLEAR_TX_DTOG(USBx, ep->num);

+      PCD_RX_DTOG(USBx, ep->num);

+      /* Configure DISABLE status for the Endpoint*/

+      PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS);

+      PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS);

+    }

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_EPStartXfer : setup and starts a transfer over an EP

+  * @param  USBx : Selected device

+  * @param  ep: pointer to endpoint structure

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_EPStartXfer(USB_TypeDef *USBx, USB_EPTypeDef *ep)

+{

+  uint16_t pmabuffer;

+  uint32_t len;

+

+  /* IN endpoint */

+  if (ep->is_in == 1U)

+  {

+    /*Multi packet transfer*/

+    if (ep->xfer_len > ep->maxpacket)

+    {

+      len = ep->maxpacket;

+      ep->xfer_len -= len;

+    }

+    else

+    {

+      len = ep->xfer_len;

+      ep->xfer_len = 0U;

+    }

+

+    /* configure and validate Tx endpoint */

+    if (ep->doublebuffer == 0U)

+    {

+      USB_WritePMA(USBx, ep->xfer_buff, ep->pmaadress, (uint16_t)len);

+      PCD_SET_EP_TX_CNT(USBx, ep->num, len);

+    }

+    else

+    {

+      /* Write the data to the USB endpoint */

+      if ((PCD_GET_ENDPOINT(USBx, ep->num) & USB_EP_DTOG_TX) != 0U)

+      {

+        /* Set the Double buffer counter for pmabuffer1 */

+        PCD_SET_EP_DBUF1_CNT(USBx, ep->num, ep->is_in, len);

+        pmabuffer = ep->pmaaddr1;

+      }

+      else

+      {

+        /* Set the Double buffer counter for pmabuffer0 */

+        PCD_SET_EP_DBUF0_CNT(USBx, ep->num, ep->is_in, len);

+        pmabuffer = ep->pmaaddr0;

+      }

+      USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, (uint16_t)len);

+      PCD_FreeUserBuffer(USBx, ep->num, ep->is_in);

+    }

+

+    PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_VALID);

+  }

+  else /* OUT endpoint */

+  {

+    /* Multi packet transfer*/

+    if (ep->xfer_len > ep->maxpacket)

+    {

+      len = ep->maxpacket;

+      ep->xfer_len -= len;

+    }

+    else

+    {

+      len = ep->xfer_len;

+      ep->xfer_len = 0U;

+    }

+

+    /* configure and validate Rx endpoint */

+    if (ep->doublebuffer == 0U)

+    {

+      /*Set RX buffer count*/

+      PCD_SET_EP_RX_CNT(USBx, ep->num, len);

+    }

+    else

+    {

+      /*Set the Double buffer counter*/

+      PCD_SET_EP_DBUF_CNT(USBx, ep->num, ep->is_in, len);

+    }

+

+    PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_VALID);

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_WritePacket : Writes a packet into the Tx FIFO associated

+  *         with the EP/channel

+  * @param  USBx : Selected device

+  * @param  src :  pointer to source buffer

+  * @param  ch_ep_num : endpoint or host channel number

+  * @param  len : Number of bytes to write

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_WritePacket(USB_TypeDef *USBx, uint8_t *src, uint8_t ch_ep_num, uint16_t len)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(USBx);

+  UNUSED(src);

+  UNUSED(ch_ep_num);

+  UNUSED(len);

+  /* NOTE : - This function is not required by USB Device FS peripheral, it is used

+              only by USB OTG FS peripheral.

+            - This function is added to ensure compatibility across platforms.

+   */

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_ReadPacket : read a packet from the Tx FIFO associated

+  *         with the EP/channel

+  * @param  USBx : Selected device

+  * @param  dest : destination pointer

+  * @param  len : Number of bytes to read

+  * @retval pointer to destination buffer

+  */

+void *USB_ReadPacket(USB_TypeDef *USBx, uint8_t *dest, uint16_t len)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(USBx);

+  UNUSED(dest);

+  UNUSED(len);

+  /* NOTE : - This function is not required by USB Device FS peripheral, it is used

+              only by USB OTG FS peripheral.

+            - This function is added to ensure compatibility across platforms.

+   */

+  return ((void *)NULL);

+}

+

+/**

+  * @brief  USB_EPSetStall : set a stall condition over an EP

+  * @param  USBx : Selected device

+  * @param  ep: pointer to endpoint structure

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_EPSetStall(USB_TypeDef *USBx, USB_EPTypeDef *ep)

+{

+  if (ep->is_in != 0U)

+  {

+    PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_STALL);

+  }

+  else

+  {

+    PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_STALL);

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_EPClearStall : Clear a stall condition over an EP

+  * @param  USBx : Selected device

+  * @param  ep: pointer to endpoint structure

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_EPClearStall(USB_TypeDef *USBx, USB_EPTypeDef *ep)

+{

+  if (ep->doublebuffer == 0U)

+  {

+    if (ep->is_in != 0U)

+    {

+      PCD_CLEAR_TX_DTOG(USBx, ep->num);

+

+      if (ep->type != EP_TYPE_ISOC)

+      {

+        /* Configure NAK status for the Endpoint */

+        PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_NAK);

+      }

+    }

+    else

+    {

+      PCD_CLEAR_RX_DTOG(USBx, ep->num);

+

+      /* Configure VALID status for the Endpoint*/

+      PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_VALID);

+    }

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_StopDevice : Stop the usb device mode

+  * @param  USBx : Selected device

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_StopDevice(USB_TypeDef *USBx)

+{

+  /* disable all interrupts and force USB reset */

+  USBx->CNTR = USB_CNTR_FRES;

+

+  /* clear interrupt status register */

+  USBx->ISTR = 0;

+

+  /* switch-off device */

+  USBx->CNTR = (USB_CNTR_FRES | USB_CNTR_PDWN);

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_SetDevAddress : Stop the usb device mode

+  * @param  USBx : Selected device

+  * @param  address : new device address to be assigned

+  *          This parameter can be a value from 0 to 255

+  * @retval HAL status

+  */

+HAL_StatusTypeDef  USB_SetDevAddress(USB_TypeDef *USBx, uint8_t address)

+{

+  if (address == 0U)

+  {

+    /* set device address and enable function */

+    USBx->DADDR = USB_DADDR_EF;

+  }

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_DevConnect : Connect the USB device by enabling the pull-up/pull-down

+  * @param  USBx : Selected device

+  * @retval HAL status

+  */

+HAL_StatusTypeDef  USB_DevConnect(USB_TypeDef *USBx)

+{

+  /* Enabling DP Pull-UP bit to Connect internal PU resistor on USB DP line */

+  USBx->BCDR |= USB_BCDR_DPPU;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_DevDisconnect : Disconnect the USB device by disabling the pull-up/pull-down

+  * @param  USBx : Selected device

+  * @retval HAL status

+  */

+HAL_StatusTypeDef  USB_DevDisconnect(USB_TypeDef *USBx)

+{

+  /* Disable DP Pull-Up bit to disconnect the Internal PU resistor on USB DP line */

+  USBx->BCDR &= (uint16_t)(~(USB_BCDR_DPPU));

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_ReadInterrupts: return the global USB interrupt status

+  * @param  USBx : Selected device

+  * @retval HAL status

+  */

+uint32_t  USB_ReadInterrupts(USB_TypeDef *USBx)

+{

+  uint32_t tmpreg;

+

+  tmpreg = USBx->ISTR;

+  return tmpreg;

+}

+

+/**

+  * @brief  USB_ReadDevAllOutEpInterrupt: return the USB device OUT endpoints interrupt status

+  * @param  USBx : Selected device

+  * @retval HAL status

+  */

+uint32_t USB_ReadDevAllOutEpInterrupt(USB_TypeDef *USBx)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(USBx);

+  /* NOTE : - This function is not required by USB Device FS peripheral, it is used

+              only by USB OTG FS peripheral.

+            - This function is added to ensure compatibility across platforms.

+   */

+  return (0);

+}

+

+/**

+  * @brief  USB_ReadDevAllInEpInterrupt: return the USB device IN endpoints interrupt status

+  * @param  USBx : Selected device

+  * @retval HAL status

+  */

+uint32_t USB_ReadDevAllInEpInterrupt(USB_TypeDef *USBx)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(USBx);

+  /* NOTE : - This function is not required by USB Device FS peripheral, it is used

+              only by USB OTG FS peripheral.

+            - This function is added to ensure compatibility across platforms.

+   */

+  return (0);

+}

+

+/**

+  * @brief  Returns Device OUT EP Interrupt register

+  * @param  USBx : Selected device

+  * @param  epnum : endpoint number

+  *          This parameter can be a value from 0 to 15

+  * @retval Device OUT EP Interrupt register

+  */

+uint32_t USB_ReadDevOutEPInterrupt(USB_TypeDef *USBx, uint8_t epnum)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(USBx);

+  UNUSED(epnum);

+  /* NOTE : - This function is not required by USB Device FS peripheral, it is used

+              only by USB OTG FS peripheral.

+            - This function is added to ensure compatibility across platforms.

+   */

+  return (0);

+}

+

+/**

+  * @brief  Returns Device IN EP Interrupt register

+  * @param  USBx : Selected device

+  * @param  epnum : endpoint number

+  *          This parameter can be a value from 0 to 15

+  * @retval Device IN EP Interrupt register

+  */

+uint32_t USB_ReadDevInEPInterrupt(USB_TypeDef *USBx, uint8_t epnum)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(USBx);

+  UNUSED(epnum);

+  /* NOTE : - This function is not required by USB Device FS peripheral, it is used

+              only by USB OTG FS peripheral.

+            - This function is added to ensure compatibility across platforms.

+   */

+  return (0);

+}

+

+/**

+  * @brief  USB_ClearInterrupts: clear a USB interrupt

+  * @param  USBx  Selected device

+  * @param  interrupt  interrupt flag

+  * @retval None

+  */

+void  USB_ClearInterrupts(USB_TypeDef *USBx, uint32_t interrupt)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(USBx);

+  UNUSED(interrupt);

+  /* NOTE : - This function is not required by USB Device FS peripheral, it is used

+              only by USB OTG FS peripheral.

+            - This function is added to ensure compatibility across platforms.

+   */

+}

+

+/**

+  * @brief  Prepare the EP0 to start the first control setup

+  * @param  USBx  Selected device

+  * @param  psetup  pointer to setup packet

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_EP0_OutStart(USB_TypeDef *USBx, uint8_t *psetup)

+{

+  /* Prevent unused argument(s) compilation warning */

+  UNUSED(USBx);

+  UNUSED(psetup);

+  /* NOTE : - This function is not required by USB Device FS peripheral, it is used

+              only by USB OTG FS peripheral.

+            - This function is added to ensure compatibility across platforms.

+   */

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_ActivateRemoteWakeup : active remote wakeup signalling

+  * @param  USBx  Selected device

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_ActivateRemoteWakeup(USB_TypeDef *USBx)

+{

+  USBx->CNTR |= USB_CNTR_RESUME;

+

+  return HAL_OK;

+}

+

+/**

+  * @brief  USB_DeActivateRemoteWakeup : de-active remote wakeup signalling

+  * @param  USBx  Selected device

+  * @retval HAL status

+  */

+HAL_StatusTypeDef USB_DeActivateRemoteWakeup(USB_TypeDef *USBx)

+{

+  USBx->CNTR &= ~(USB_CNTR_RESUME);

+  return HAL_OK;

+}

+

+/**

+  * @brief Copy a buffer from user memory area to packet memory area (PMA)

+  * @param   USBx USB peripheral instance register address.

+  * @param   pbUsrBuf pointer to user memory area.

+  * @param   wPMABufAddr address into PMA.

+  * @param   wNBytes: no. of bytes to be copied.

+  * @retval None

+  */

+void USB_WritePMA(USB_TypeDef *USBx, uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes)

+{

+  uint32_t n = ((uint32_t)wNBytes + 1U) >> 1;

+  uint32_t BaseAddr = (uint32_t)USBx;

+  uint32_t i, temp1, temp2;

+  uint16_t *pdwVal;

+  uint8_t *pBuf = pbUsrBuf;

+

+  pdwVal = (uint16_t *)(BaseAddr + 0x400U + ((uint32_t)wPMABufAddr * PMA_ACCESS));

+

+  for (i = n; i != 0U; i--)

+  {

+    temp1 = (uint16_t) * pBuf;

+    pBuf++;

+    temp2 = temp1 | ((uint16_t)((uint16_t) * pBuf << 8));

+    *pdwVal = (uint16_t)temp2;

+    pdwVal++;

+

+#if PMA_ACCESS > 1U

+    pdwVal++;

+#endif

+

+    pBuf++;

+  }

+}

+

+/**

+  * @brief Copy a buffer from user memory area to packet memory area (PMA)

+  * @param   USBx: USB peripheral instance register address.

+  * @param   pbUsrBuf pointer to user memory area.

+  * @param   wPMABufAddr address into PMA.

+  * @param   wNBytes: no. of bytes to be copied.

+  * @retval None

+  */

+void USB_ReadPMA(USB_TypeDef *USBx, uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes)

+{

+  uint32_t n = (uint32_t)wNBytes >> 1;

+  uint32_t BaseAddr = (uint32_t)USBx;

+  uint32_t i, temp;

+  uint16_t *pdwVal;

+  uint8_t *pBuf = pbUsrBuf;

+

+  pdwVal = (uint16_t *)(BaseAddr + 0x400U + ((uint32_t)wPMABufAddr * PMA_ACCESS));

+

+  for (i = n; i != 0U; i--)

+  {

+    temp = *pdwVal;

+    pdwVal++;

+    *pBuf = (uint8_t)((temp >> 0) & 0xFFU);

+    pBuf++;

+    *pBuf = (uint8_t)((temp >> 8) & 0xFFU);

+    pBuf++;

+

+#if PMA_ACCESS > 1U

+    pdwVal++;

+#endif

+  }

+

+  if ((wNBytes % 2U) != 0U)

+  {

+    temp = *pdwVal;

+    *pBuf = (uint8_t)((temp >> 0) & 0xFFU);

+  }

+}

+#endif /* defined (USB) */

+

+/**

+  * @}

+  */

+

+/**

+  * @}

+  */

+#endif /* defined (USB) || defined (USB_OTG_FS) */

+#endif /* defined (HAL_PCD_MODULE_ENABLED) || defined (HAL_HCD_MODULE_ENABLED) */

+

+/**

+  * @}

+  */

+

+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/