Subversion Repositories DashDisplay

Rev

Rev 56 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /**
  2.   ******************************************************************************
  3.   * @file    stm32l1xx_ll_gpio.c
  4.   * @author  MCD Application Team
  5.   * @brief   GPIO LL module driver.
  6.   ******************************************************************************
  7.   * @attention
  8.   *
  9.   * Copyright (c) 2017 STMicroelectronics.
  10.   * All rights reserved.
  11.   *
  12.   * This software is licensed under terms that can be found in the LICENSE file
  13.   * in the root directory of this software component.
  14.   * If no LICENSE file comes with this software, it is provided AS-IS.
  15.   *
  16.   ******************************************************************************
  17.   */
  18. #if defined(USE_FULL_LL_DRIVER)
  19.  
  20. /* Includes ------------------------------------------------------------------*/
  21. #include "stm32l1xx_ll_gpio.h"
  22. #include "stm32l1xx_ll_bus.h"
  23. #ifdef  USE_FULL_ASSERT
  24. #include "stm32_assert.h"
  25. #else
  26. #define assert_param(expr) ((void)0U)
  27. #endif
  28.  
  29. /** @addtogroup STM32L1xx_LL_Driver
  30.   * @{
  31.   */
  32.  
  33. #if defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) || defined (GPIOH)
  34.  
  35. /** @addtogroup GPIO_LL
  36.   * @{
  37.   */
  38.  
  39. /* Private types -------------------------------------------------------------*/
  40. /* Private variables ---------------------------------------------------------*/
  41. /* Private constants ---------------------------------------------------------*/
  42. /* Private macros ------------------------------------------------------------*/
  43. /** @addtogroup GPIO_LL_Private_Macros
  44.   * @{
  45.   */
  46. #define IS_LL_GPIO_PIN(__VALUE__)          (((0x00000000U) < (__VALUE__)) && ((__VALUE__) <= (LL_GPIO_PIN_ALL)))
  47.  
  48. #define IS_LL_GPIO_MODE(__VALUE__)         (((__VALUE__) == LL_GPIO_MODE_INPUT)     ||\
  49.                                             ((__VALUE__) == LL_GPIO_MODE_OUTPUT)    ||\
  50.                                             ((__VALUE__) == LL_GPIO_MODE_ALTERNATE) ||\
  51.                                             ((__VALUE__) == LL_GPIO_MODE_ANALOG))
  52.  
  53. #define IS_LL_GPIO_OUTPUT_TYPE(__VALUE__)  (((__VALUE__) == LL_GPIO_OUTPUT_PUSHPULL)  ||\
  54.                                             ((__VALUE__) == LL_GPIO_OUTPUT_OPENDRAIN))
  55.  
  56. #define IS_LL_GPIO_SPEED(__VALUE__)        (((__VALUE__) == LL_GPIO_SPEED_FREQ_LOW)       ||\
  57.                                             ((__VALUE__) == LL_GPIO_SPEED_FREQ_MEDIUM)    ||\
  58.                                             ((__VALUE__) == LL_GPIO_SPEED_FREQ_HIGH)      ||\
  59.                                             ((__VALUE__) == LL_GPIO_SPEED_FREQ_VERY_HIGH))
  60.  
  61. #define IS_LL_GPIO_PULL(__VALUE__)         (((__VALUE__) == LL_GPIO_PULL_NO)   ||\
  62.                                             ((__VALUE__) == LL_GPIO_PULL_UP)   ||\
  63.                                             ((__VALUE__) == LL_GPIO_PULL_DOWN))
  64.  
  65. #define IS_LL_GPIO_ALTERNATE(__VALUE__)    (((__VALUE__) == LL_GPIO_AF_0  )   ||\
  66.                                             ((__VALUE__) == LL_GPIO_AF_1  )   ||\
  67.                                             ((__VALUE__) == LL_GPIO_AF_2  )   ||\
  68.                                             ((__VALUE__) == LL_GPIO_AF_3  )   ||\
  69.                                             ((__VALUE__) == LL_GPIO_AF_4  )   ||\
  70.                                             ((__VALUE__) == LL_GPIO_AF_5  )   ||\
  71.                                             ((__VALUE__) == LL_GPIO_AF_6  )   ||\
  72.                                             ((__VALUE__) == LL_GPIO_AF_7  )   ||\
  73.                                             ((__VALUE__) == LL_GPIO_AF_8  )   ||\
  74.                                             ((__VALUE__) == LL_GPIO_AF_9  )   ||\
  75.                                             ((__VALUE__) == LL_GPIO_AF_10 )   ||\
  76.                                             ((__VALUE__) == LL_GPIO_AF_11 )   ||\
  77.                                             ((__VALUE__) == LL_GPIO_AF_12 )   ||\
  78.                                             ((__VALUE__) == LL_GPIO_AF_13 )   ||\
  79.                                             ((__VALUE__) == LL_GPIO_AF_14 )   ||\
  80.                                             ((__VALUE__) == LL_GPIO_AF_15 ))
  81. /**
  82.   * @}
  83.   */
  84.  
  85. /* Private function prototypes -----------------------------------------------*/
  86.  
  87. /* Exported functions --------------------------------------------------------*/
  88. /** @addtogroup GPIO_LL_Exported_Functions
  89.   * @{
  90.   */
  91.  
  92. /** @addtogroup GPIO_LL_EF_Init
  93.   * @{
  94.   */
  95.  
  96. /**
  97.   * @brief  De-initialize GPIO registers (Registers restored to their default values).
  98.   * @param  GPIOx GPIO Port
  99.   * @retval An ErrorStatus enumeration value:
  100.   *          - SUCCESS: GPIO registers are de-initialized
  101.   *          - ERROR:   Wrong GPIO Port
  102.   */
  103. ErrorStatus LL_GPIO_DeInit(GPIO_TypeDef *GPIOx)
  104. {
  105.   ErrorStatus status = SUCCESS;
  106.  
  107.   /* Check the parameters */
  108.   assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));
  109.  
  110.   /* Force and Release reset on clock of GPIOx Port */
  111.   if (GPIOx == GPIOA)
  112.   {
  113.     LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPIOA);
  114.     LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPIOA);
  115.   }
  116.   else if (GPIOx == GPIOB)
  117.   {
  118.     LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPIOB);
  119.     LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPIOB);
  120.   }
  121.   else if (GPIOx == GPIOC)
  122.   {
  123.     LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPIOC);
  124.     LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPIOC);
  125.   }
  126. #if defined(GPIOD)
  127.   else if (GPIOx == GPIOD)
  128.   {
  129.     LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPIOD);
  130.     LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPIOD);
  131.   }
  132. #endif /* GPIOD */
  133. #if defined(GPIOE)
  134.   else if (GPIOx == GPIOE)
  135.   {
  136.     LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPIOE);
  137.     LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPIOE);
  138.   }
  139. #endif /* GPIOE */
  140. #if defined(GPIOF)
  141.   else if (GPIOx == GPIOF)
  142.   {
  143.     LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPIOF);
  144.     LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPIOF);
  145.   }
  146. #endif /* GPIOF */
  147. #if defined(GPIOG)
  148.   else if (GPIOx == GPIOG)
  149.   {
  150.     LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPIOG);
  151.     LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPIOG);
  152.   }
  153. #endif /* GPIOG */
  154. #if defined(GPIOH)
  155.   else if (GPIOx == GPIOH)
  156.   {
  157.     LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_GPIOH);
  158.     LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_GPIOH);
  159.   }
  160. #endif /* GPIOH */
  161.   else
  162.   {
  163.     status = ERROR;
  164.   }
  165.  
  166.   return (status);
  167. }
  168.  
  169. /**
  170.   * @brief  Initialize GPIO registers according to the specified parameters in GPIO_InitStruct.
  171.   * @param  GPIOx GPIO Port
  172.   * @param  GPIO_InitStruct pointer to a @ref LL_GPIO_InitTypeDef structure
  173.   *         that contains the configuration information for the specified GPIO peripheral.
  174.   * @retval An ErrorStatus enumeration value:
  175.   *          - SUCCESS: GPIO registers are initialized according to GPIO_InitStruct content
  176.   *          - ERROR:   Not applicable
  177.   */
  178. ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStruct)
  179. {
  180.   uint32_t pinpos     = 0x00000000U;
  181.   uint32_t currentpin = 0x00000000U;
  182.  
  183.   /* Check the parameters */
  184.   assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));
  185.   assert_param(IS_LL_GPIO_PIN(GPIO_InitStruct->Pin));
  186.   assert_param(IS_LL_GPIO_MODE(GPIO_InitStruct->Mode));
  187.   assert_param(IS_LL_GPIO_PULL(GPIO_InitStruct->Pull));
  188.  
  189.   /* ------------------------- Configure the port pins ---------------- */
  190.   /* Initialize  pinpos on first pin set */
  191.   pinpos = POSITION_VAL(GPIO_InitStruct->Pin);
  192.  
  193.   /* Configure the port pins */
  194.   while (((GPIO_InitStruct->Pin) >> pinpos) != 0x00000000U)
  195.   {
  196.     /* Get current io position */
  197.     currentpin = (GPIO_InitStruct->Pin) & (0x00000001U << pinpos);
  198.  
  199.     if (currentpin)
  200.     {
  201.  
  202.       if ((GPIO_InitStruct->Mode == LL_GPIO_MODE_OUTPUT) || (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE))
  203.       {
  204.         /* Check Speed mode parameters */
  205.         assert_param(IS_LL_GPIO_SPEED(GPIO_InitStruct->Speed));
  206.  
  207.         /* Speed mode configuration */
  208.         LL_GPIO_SetPinSpeed(GPIOx, currentpin, GPIO_InitStruct->Speed);
  209.  
  210.         /* Check Output mode parameters */
  211.         assert_param(IS_LL_GPIO_OUTPUT_TYPE(GPIO_InitStruct->OutputType));
  212.  
  213.         /* Output mode configuration*/
  214.         LL_GPIO_SetPinOutputType(GPIOx, currentpin, GPIO_InitStruct->OutputType);
  215.       }
  216.  
  217.       /* Pull-up Pull down resistor configuration*/
  218.       LL_GPIO_SetPinPull(GPIOx, currentpin, GPIO_InitStruct->Pull);
  219.  
  220.       if (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE)
  221.       {
  222.         /* Check Alternate parameter */
  223.         assert_param(IS_LL_GPIO_ALTERNATE(GPIO_InitStruct->Alternate));
  224.  
  225.         /* Speed mode configuration */
  226.         if (POSITION_VAL(currentpin) < 0x00000008U)
  227.         {
  228.           LL_GPIO_SetAFPin_0_7(GPIOx, currentpin, GPIO_InitStruct->Alternate);
  229.         }
  230.         else
  231.         {
  232.           LL_GPIO_SetAFPin_8_15(GPIOx, currentpin, GPIO_InitStruct->Alternate);
  233.         }
  234.       }
  235.  
  236.       /* Pin Mode configuration */
  237.       LL_GPIO_SetPinMode(GPIOx, currentpin, GPIO_InitStruct->Mode);
  238.     }
  239.     pinpos++;
  240.   }
  241.  
  242.   return (SUCCESS);
  243. }
  244.  
  245. /**
  246.   * @brief Set each @ref LL_GPIO_InitTypeDef field to default value.
  247.   * @param GPIO_InitStruct: pointer to a @ref LL_GPIO_InitTypeDef structure
  248.   *                          whose fields will be set to default values.
  249.   * @retval None
  250.   */
  251.  
  252. void LL_GPIO_StructInit(LL_GPIO_InitTypeDef *GPIO_InitStruct)
  253. {
  254.   /* Reset GPIO init structure parameters values */
  255.   GPIO_InitStruct->Pin        = LL_GPIO_PIN_ALL;
  256.   GPIO_InitStruct->Mode       = LL_GPIO_MODE_ANALOG;
  257.   GPIO_InitStruct->Speed      = LL_GPIO_SPEED_FREQ_LOW;
  258.   GPIO_InitStruct->OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  259.   GPIO_InitStruct->Pull       = LL_GPIO_PULL_NO;
  260.   GPIO_InitStruct->Alternate  = LL_GPIO_AF_0;
  261. }
  262.  
  263. /**
  264.   * @}
  265.   */
  266.  
  267. /**
  268.   * @}
  269.   */
  270.  
  271. /**
  272.   * @}
  273.   */
  274.  
  275. #endif /* defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) || defined (GPIOH) */
  276.  
  277. /**
  278.   * @}
  279.   */
  280.  
  281. #endif /* USE_FULL_LL_DRIVER */
  282.  
  283.