mbed library sources

Fork of mbed-src by mbed official

Committer:
lzbpli
Date:
Thu Jul 07 06:48:59 2016 +0000
Revision:
636:b0d178e9fa10
Parent:
634:ac7d6880524d
l053

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 330:c80ac197fa6a 1 /**
mbed_official 330:c80ac197fa6a 2 ******************************************************************************
mbed_official 330:c80ac197fa6a 3 * @file stm32f3xx_hal_gpio.c
mbed_official 330:c80ac197fa6a 4 * @author MCD Application Team
mbed_official 634:ac7d6880524d 5 * @version V1.1.0
mbed_official 634:ac7d6880524d 6 * @date 12-Sept-2014
mbed_official 330:c80ac197fa6a 7 * @brief GPIO HAL module driver.
mbed_official 330:c80ac197fa6a 8 *
mbed_official 330:c80ac197fa6a 9 * This file provides firmware functions to manage the following
mbed_official 330:c80ac197fa6a 10 * functionalities of the General Purpose Input/Output (GPIO) peripheral:
mbed_official 330:c80ac197fa6a 11 * + Initialization/de-initialization functions
mbed_official 330:c80ac197fa6a 12 * + IO operation functions
mbed_official 330:c80ac197fa6a 13 *
mbed_official 330:c80ac197fa6a 14 @verbatim
mbed_official 330:c80ac197fa6a 15 ==============================================================================
mbed_official 330:c80ac197fa6a 16 ##### GPIO specific features #####
mbed_official 330:c80ac197fa6a 17 ==============================================================================
mbed_official 330:c80ac197fa6a 18 [..]
mbed_official 330:c80ac197fa6a 19 Each port bit of the general-purpose I/O (GPIO) ports can be individually
mbed_official 330:c80ac197fa6a 20 configured by software in several modes:
mbed_official 330:c80ac197fa6a 21 (+) Input mode
mbed_official 330:c80ac197fa6a 22 (+) Analog mode
mbed_official 330:c80ac197fa6a 23 (+) Output mode
mbed_official 330:c80ac197fa6a 24 (+) Alternate function mode
mbed_official 330:c80ac197fa6a 25 (+) External interrupt/event lines
mbed_official 330:c80ac197fa6a 26
mbed_official 330:c80ac197fa6a 27 [..]
mbed_official 330:c80ac197fa6a 28 During and just after reset, the alternate functions and external interrupt
mbed_official 330:c80ac197fa6a 29 lines are not active and the I/O ports are configured in input floating mode.
mbed_official 330:c80ac197fa6a 30
mbed_official 330:c80ac197fa6a 31 [..]
mbed_official 330:c80ac197fa6a 32 All GPIO pins have weak internal pull-up and pull-down resistors, which can be
mbed_official 330:c80ac197fa6a 33 activated or not.
mbed_official 330:c80ac197fa6a 34
mbed_official 330:c80ac197fa6a 35 [..]
mbed_official 330:c80ac197fa6a 36 In Output or Alternate mode, each IO can be configured on open-drain or push-pull
mbed_official 330:c80ac197fa6a 37 type and the IO speed can be selected depending on the VDD value.
mbed_official 330:c80ac197fa6a 38
mbed_official 330:c80ac197fa6a 39 [..]
mbed_official 330:c80ac197fa6a 40 The microcontroller IO pins are connected to onboard peripherals/modules through a
mbed_official 330:c80ac197fa6a 41 multiplexer that allows only one peripheral’s alternate function (AF) connected
mbed_official 330:c80ac197fa6a 42 to an IO pin at a time. In this way, there can be no conflict between peripherals
mbed_official 330:c80ac197fa6a 43 sharing the same IO pin.
mbed_official 330:c80ac197fa6a 44
mbed_official 330:c80ac197fa6a 45 [..]
mbed_official 330:c80ac197fa6a 46 All ports have external interrupt/event capability. To use external interrupt
mbed_official 330:c80ac197fa6a 47 lines, the port must be configured in input mode. All available GPIO pins are
mbed_official 330:c80ac197fa6a 48 connected to the 16 external interrupt/event lines from EXTI0 to EXTI15.
mbed_official 330:c80ac197fa6a 49
mbed_official 330:c80ac197fa6a 50 [..]
mbed_official 330:c80ac197fa6a 51 The external interrupt/event controller consists of up to 23 edge detectors
mbed_official 330:c80ac197fa6a 52 (16 lines are connected to GPIO) for generating event/interrupt requests (each
mbed_official 330:c80ac197fa6a 53 input line can be independently configured to select the type (interrupt or event)
mbed_official 330:c80ac197fa6a 54 and the corresponding trigger event (rising or falling or both). Each line can
mbed_official 330:c80ac197fa6a 55 also be masked independently.
mbed_official 330:c80ac197fa6a 56
mbed_official 330:c80ac197fa6a 57 ##### How to use this driver #####
mbed_official 330:c80ac197fa6a 58 ==============================================================================
mbed_official 330:c80ac197fa6a 59 [..]
mbed_official 330:c80ac197fa6a 60 (#) Enable the GPIO AHB clock using the following function : __GPIOx_CLK_ENABLE().
mbed_official 330:c80ac197fa6a 61
mbed_official 330:c80ac197fa6a 62 (#) Configure the GPIO pin(s) using HAL_GPIO_Init().
mbed_official 330:c80ac197fa6a 63 (++) Configure the IO mode using "Mode" member from GPIO_InitTypeDef structure
mbed_official 330:c80ac197fa6a 64 (++) Activate Pull-up, Pull-down resistor using "Pull" member from GPIO_InitTypeDef
mbed_official 330:c80ac197fa6a 65 structure.
mbed_official 330:c80ac197fa6a 66 (++) In case of Output or alternate function mode selection: the speed is
mbed_official 330:c80ac197fa6a 67 configured through "Speed" member from GPIO_InitTypeDef structure,
mbed_official 330:c80ac197fa6a 68 the speed is configurable: 2 MHz, 10 MHz and 50 MHz.
mbed_official 330:c80ac197fa6a 69 (++) If alternate mode is selected, the alternate function connected to the IO
mbed_official 330:c80ac197fa6a 70 is configured through "Alternate" member from GPIO_InitTypeDef structure
mbed_official 330:c80ac197fa6a 71 (++) Analog mode is required when a pin is to be used as ADC channel
mbed_official 330:c80ac197fa6a 72 or DAC output.
mbed_official 330:c80ac197fa6a 73 (++) In case of external interrupt/event selection the "Mode" member from
mbed_official 330:c80ac197fa6a 74 GPIO_InitTypeDef structure select the type (interrupt or event) and
mbed_official 330:c80ac197fa6a 75 the corresponding trigger event (rising or falling or both).
mbed_official 330:c80ac197fa6a 76
mbed_official 330:c80ac197fa6a 77 (#) In case of external interrupt/event mode selection, configure NVIC IRQ priority
mbed_official 330:c80ac197fa6a 78 mapped to the EXTI line using HAL_NVIC_SetPriority() and enable it using
mbed_official 330:c80ac197fa6a 79 HAL_NVIC_EnableIRQ().
mbed_official 330:c80ac197fa6a 80
mbed_official 330:c80ac197fa6a 81 (#) To get the level of a pin configured in input mode use HAL_GPIO_ReadPin().
mbed_official 330:c80ac197fa6a 82
mbed_official 330:c80ac197fa6a 83 (#) To set/reset the level of a pin configured in output mode use
mbed_official 330:c80ac197fa6a 84 HAL_GPIO_WritePin()/HAL_GPIO_TogglePin().
mbed_official 330:c80ac197fa6a 85
mbed_official 330:c80ac197fa6a 86 (#) To lock pin configuration until next reset use HAL_GPIO_LockPin().
mbed_official 330:c80ac197fa6a 87
mbed_official 330:c80ac197fa6a 88 (#) During and just after reset, the alternate functions are not
mbed_official 330:c80ac197fa6a 89 active and the GPIO pins are configured in input floating mode (except JTAG
mbed_official 330:c80ac197fa6a 90 pins).
mbed_official 330:c80ac197fa6a 91
mbed_official 330:c80ac197fa6a 92 (#) The LSE oscillator pins OSC32_IN and OSC32_OUT can be used as general purpose
mbed_official 330:c80ac197fa6a 93 (PC14 and PC15, respectively) when the LSE oscillator is off. The LSE has
mbed_official 330:c80ac197fa6a 94 priority over the GPIO function.
mbed_official 330:c80ac197fa6a 95
mbed_official 330:c80ac197fa6a 96 (#) The HSE oscillator pins OSC_IN/OSC_OUT can be used as
mbed_official 330:c80ac197fa6a 97 general purpose Px0 and Px1, respectively, when the HSE oscillator is off.
mbed_official 330:c80ac197fa6a 98 The HSE has priority over the GPIO function.
mbed_official 330:c80ac197fa6a 99
mbed_official 330:c80ac197fa6a 100 @endverbatim
mbed_official 330:c80ac197fa6a 101 ******************************************************************************
mbed_official 330:c80ac197fa6a 102 * @attention
mbed_official 330:c80ac197fa6a 103 *
mbed_official 634:ac7d6880524d 104 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
mbed_official 330:c80ac197fa6a 105 *
mbed_official 330:c80ac197fa6a 106 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 330:c80ac197fa6a 107 * are permitted provided that the following conditions are met:
mbed_official 330:c80ac197fa6a 108 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 330:c80ac197fa6a 109 * this list of conditions and the following disclaimer.
mbed_official 330:c80ac197fa6a 110 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 330:c80ac197fa6a 111 * this list of conditions and the following disclaimer in the documentation
mbed_official 330:c80ac197fa6a 112 * and/or other materials provided with the distribution.
mbed_official 330:c80ac197fa6a 113 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 330:c80ac197fa6a 114 * may be used to endorse or promote products derived from this software
mbed_official 330:c80ac197fa6a 115 * without specific prior written permission.
mbed_official 330:c80ac197fa6a 116 *
mbed_official 330:c80ac197fa6a 117 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 330:c80ac197fa6a 118 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 330:c80ac197fa6a 119 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 330:c80ac197fa6a 120 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 330:c80ac197fa6a 121 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 330:c80ac197fa6a 122 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 330:c80ac197fa6a 123 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 330:c80ac197fa6a 124 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 330:c80ac197fa6a 125 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 330:c80ac197fa6a 126 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 330:c80ac197fa6a 127 *
mbed_official 330:c80ac197fa6a 128 ******************************************************************************
mbed_official 330:c80ac197fa6a 129 */
mbed_official 330:c80ac197fa6a 130
mbed_official 330:c80ac197fa6a 131 /* Includes ------------------------------------------------------------------*/
mbed_official 330:c80ac197fa6a 132 #include "stm32f3xx_hal.h"
mbed_official 330:c80ac197fa6a 133
mbed_official 330:c80ac197fa6a 134 /** @addtogroup STM32F3xx_HAL_Driver
mbed_official 330:c80ac197fa6a 135 * @{
mbed_official 330:c80ac197fa6a 136 */
mbed_official 330:c80ac197fa6a 137
mbed_official 330:c80ac197fa6a 138 /** @defgroup GPIO GPIO HAL module driver
mbed_official 330:c80ac197fa6a 139 * @brief GPIO HAL module driver
mbed_official 330:c80ac197fa6a 140 * @{
mbed_official 330:c80ac197fa6a 141 */
mbed_official 330:c80ac197fa6a 142
mbed_official 330:c80ac197fa6a 143 #ifdef HAL_GPIO_MODULE_ENABLED
mbed_official 330:c80ac197fa6a 144
mbed_official 330:c80ac197fa6a 145 /* Private typedef -----------------------------------------------------------*/
mbed_official 330:c80ac197fa6a 146 /* Private define ------------------------------------------------------------*/
mbed_official 330:c80ac197fa6a 147 /* Private macro -------------------------------------------------------------*/
mbed_official 330:c80ac197fa6a 148 /** @defgroup GPIO_Private_Macros GPIO Private Macros
mbed_official 330:c80ac197fa6a 149 * @{
mbed_official 330:c80ac197fa6a 150 */
mbed_official 330:c80ac197fa6a 151 #define GET_GPIO_SOURCE(__GPIOx__) \
mbed_official 330:c80ac197fa6a 152 (((uint32_t)(__GPIOx__) == ((uint32_t)GPIOA_BASE))? 0U :\
mbed_official 330:c80ac197fa6a 153 ((uint32_t)(__GPIOx__) == ((uint32_t)(GPIOA_BASE + 0x0400)))? 1U :\
mbed_official 330:c80ac197fa6a 154 ((uint32_t)(__GPIOx__) == ((uint32_t)(GPIOA_BASE + 0x0800)))? 2U :\
mbed_official 330:c80ac197fa6a 155 ((uint32_t)(__GPIOx__) == ((uint32_t)(GPIOA_BASE + 0x0C00)))? 3U :\
mbed_official 330:c80ac197fa6a 156 ((uint32_t)(__GPIOx__) == ((uint32_t)(GPIOA_BASE + 0x1000)))? 4U :\
mbed_official 330:c80ac197fa6a 157 ((uint32_t)(__GPIOx__) == ((uint32_t)(GPIOA_BASE + 0x1400)))? 5U : 6U)
mbed_official 330:c80ac197fa6a 158
mbed_official 330:c80ac197fa6a 159 #define GPIO_MODE ((uint32_t)0x00000003)
mbed_official 330:c80ac197fa6a 160 #define EXTI_MODE ((uint32_t)0x10000000)
mbed_official 330:c80ac197fa6a 161 #define GPIO_MODE_IT ((uint32_t)0x00010000)
mbed_official 330:c80ac197fa6a 162 #define GPIO_MODE_EVT ((uint32_t)0x00020000)
mbed_official 330:c80ac197fa6a 163 #define RISING_EDGE ((uint32_t)0x00100000)
mbed_official 330:c80ac197fa6a 164 #define FALLING_EDGE ((uint32_t)0x00200000)
mbed_official 330:c80ac197fa6a 165 #define GPIO_OUTPUT_TYPE ((uint32_t)0x00000010)
mbed_official 330:c80ac197fa6a 166
mbed_official 330:c80ac197fa6a 167 #define GPIO_NUMBER ((uint32_t)16)
mbed_official 330:c80ac197fa6a 168 /**
mbed_official 330:c80ac197fa6a 169 * @}
mbed_official 330:c80ac197fa6a 170 */
mbed_official 330:c80ac197fa6a 171
mbed_official 330:c80ac197fa6a 172 /* Private variables ---------------------------------------------------------*/
mbed_official 330:c80ac197fa6a 173 /* Private function prototypes -----------------------------------------------*/
mbed_official 330:c80ac197fa6a 174 /* Exported functions ---------------------------------------------------------*/
mbed_official 330:c80ac197fa6a 175 /** @defgroup GPIO_Exported_Functions GPIO Exported Functions
mbed_official 330:c80ac197fa6a 176 * @{
mbed_official 330:c80ac197fa6a 177 */
mbed_official 330:c80ac197fa6a 178
mbed_official 330:c80ac197fa6a 179 /** @defgroup GPIO_Exported_Functions_Group1 Initialization and de-initialization functions
mbed_official 330:c80ac197fa6a 180 * @brief Initialization and Configuration functions
mbed_official 330:c80ac197fa6a 181 *
mbed_official 330:c80ac197fa6a 182 @verbatim
mbed_official 330:c80ac197fa6a 183 ===============================================================================
mbed_official 330:c80ac197fa6a 184 ##### Initialization and de-initialization functions #####
mbed_official 330:c80ac197fa6a 185 ===============================================================================
mbed_official 330:c80ac197fa6a 186
mbed_official 330:c80ac197fa6a 187 @endverbatim
mbed_official 330:c80ac197fa6a 188 * @{
mbed_official 330:c80ac197fa6a 189 */
mbed_official 330:c80ac197fa6a 190
mbed_official 330:c80ac197fa6a 191 /**
mbed_official 330:c80ac197fa6a 192 * @brief Initializes the GPIOx peripheral according to the specified parameters in the GPIO_Init.
mbed_official 330:c80ac197fa6a 193 * @param GPIOx: where x can be (A..F) to select the GPIO peripheral for STM32F3 family devices
mbed_official 330:c80ac197fa6a 194 * @param GPIO_Init: pointer to a GPIO_InitTypeDef structure that contains
mbed_official 330:c80ac197fa6a 195 * the configuration information for the specified GPIO peripheral.
mbed_official 330:c80ac197fa6a 196 * @retval None
mbed_official 330:c80ac197fa6a 197 */
mbed_official 330:c80ac197fa6a 198 void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
mbed_official 330:c80ac197fa6a 199 {
mbed_official 330:c80ac197fa6a 200 uint32_t position;
mbed_official 330:c80ac197fa6a 201 uint32_t ioposition = 0x00;
mbed_official 330:c80ac197fa6a 202 uint32_t iocurrent = 0x00;
mbed_official 330:c80ac197fa6a 203 uint32_t temp = 0x00;
mbed_official 330:c80ac197fa6a 204
mbed_official 330:c80ac197fa6a 205 /* Check the parameters */
mbed_official 330:c80ac197fa6a 206 assert_param(IS_GPIO_PIN(GPIO_Init->Pin));
mbed_official 330:c80ac197fa6a 207 assert_param(IS_GPIO_MODE(GPIO_Init->Mode));
mbed_official 330:c80ac197fa6a 208 assert_param(IS_GPIO_PULL(GPIO_Init->Pull));
mbed_official 330:c80ac197fa6a 209
mbed_official 330:c80ac197fa6a 210 /* Configure the port pins */
mbed_official 330:c80ac197fa6a 211 for (position = 0; position < GPIO_NUMBER; position++)
mbed_official 330:c80ac197fa6a 212 {
mbed_official 330:c80ac197fa6a 213 /* Get the IO position */
mbed_official 330:c80ac197fa6a 214 ioposition = ((uint32_t)0x01) << position;
mbed_official 330:c80ac197fa6a 215 /* Get the current IO position */
mbed_official 330:c80ac197fa6a 216 iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition;
mbed_official 330:c80ac197fa6a 217
mbed_official 330:c80ac197fa6a 218 if (iocurrent == ioposition)
mbed_official 330:c80ac197fa6a 219 {
mbed_official 330:c80ac197fa6a 220 /*--------------------- GPIO Mode Configuration ------------------------*/
mbed_official 330:c80ac197fa6a 221 /* In case of Alternate function mode selection */
mbed_official 330:c80ac197fa6a 222 if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD))
mbed_official 330:c80ac197fa6a 223 {
mbed_official 330:c80ac197fa6a 224 /* Check the Alternate function parameter */
mbed_official 330:c80ac197fa6a 225 assert_param(IS_GPIO_AF(GPIO_Init->Alternate));
mbed_official 330:c80ac197fa6a 226 /* Configure Alternate function mapped with the current IO */
mbed_official 330:c80ac197fa6a 227 temp = GPIOx->AFR[position >> 3];
mbed_official 330:c80ac197fa6a 228 temp &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ;
mbed_official 330:c80ac197fa6a 229 temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4));
mbed_official 330:c80ac197fa6a 230 GPIOx->AFR[position >> 3] = temp;
mbed_official 330:c80ac197fa6a 231 }
mbed_official 330:c80ac197fa6a 232
mbed_official 330:c80ac197fa6a 233 /* Configure IO Direction mode (Input, Output, Alternate or Analog) */
mbed_official 330:c80ac197fa6a 234 temp = GPIOx->MODER;
mbed_official 330:c80ac197fa6a 235 temp &= ~(GPIO_MODER_MODER0 << (position * 2));
mbed_official 330:c80ac197fa6a 236 temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2));
mbed_official 330:c80ac197fa6a 237 GPIOx->MODER = temp;
mbed_official 330:c80ac197fa6a 238
mbed_official 330:c80ac197fa6a 239 /* In case of Output or Alternate function mode selection */
mbed_official 330:c80ac197fa6a 240 if ((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) ||
mbed_official 330:c80ac197fa6a 241 (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD))
mbed_official 330:c80ac197fa6a 242 {
mbed_official 330:c80ac197fa6a 243 /* Check the Speed parameter */
mbed_official 330:c80ac197fa6a 244 assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));
mbed_official 330:c80ac197fa6a 245 /* Configure the IO Speed */
mbed_official 330:c80ac197fa6a 246 temp = GPIOx->OSPEEDR;
mbed_official 330:c80ac197fa6a 247 temp &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2));
mbed_official 330:c80ac197fa6a 248 temp |= (GPIO_Init->Speed << (position * 2));
mbed_official 330:c80ac197fa6a 249 GPIOx->OSPEEDR = temp;
mbed_official 330:c80ac197fa6a 250
mbed_official 330:c80ac197fa6a 251 /* Configure the IO Output Type */
mbed_official 330:c80ac197fa6a 252 temp = GPIOx->OTYPER;
mbed_official 330:c80ac197fa6a 253 temp &= ~(GPIO_OTYPER_OT_0 << position) ;
mbed_official 330:c80ac197fa6a 254 temp |= (((GPIO_Init->Mode & GPIO_OUTPUT_TYPE) >> 4) << position);
mbed_official 330:c80ac197fa6a 255 GPIOx->OTYPER = temp;
mbed_official 330:c80ac197fa6a 256 }
mbed_official 330:c80ac197fa6a 257
mbed_official 330:c80ac197fa6a 258 /* Activate the Pull-up or Pull down resistor for the current IO */
mbed_official 330:c80ac197fa6a 259 temp = GPIOx->PUPDR;
mbed_official 330:c80ac197fa6a 260 temp &= ~(GPIO_PUPDR_PUPDR0 << (position * 2));
mbed_official 330:c80ac197fa6a 261 temp |= ((GPIO_Init->Pull) << (position * 2));
mbed_official 330:c80ac197fa6a 262 GPIOx->PUPDR = temp;
mbed_official 330:c80ac197fa6a 263
mbed_official 330:c80ac197fa6a 264 /*--------------------- EXTI Mode Configuration ------------------------*/
mbed_official 330:c80ac197fa6a 265 /* Configure the External Interrupt or event for the current IO */
mbed_official 330:c80ac197fa6a 266 if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE)
mbed_official 330:c80ac197fa6a 267 {
mbed_official 330:c80ac197fa6a 268 /* Enable SYSCFG Clock */
mbed_official 330:c80ac197fa6a 269 __SYSCFG_CLK_ENABLE();
mbed_official 330:c80ac197fa6a 270
mbed_official 330:c80ac197fa6a 271 temp = SYSCFG->EXTICR[position >> 2];
mbed_official 330:c80ac197fa6a 272 temp &= ~(((uint32_t)0x0F) << (4 * (position & 0x03)));
mbed_official 330:c80ac197fa6a 273 temp |= ((uint32_t)(GET_GPIO_SOURCE(GPIOx)) << (4 * (position & 0x03)));
mbed_official 330:c80ac197fa6a 274 SYSCFG->EXTICR[position >> 2] = temp;
mbed_official 330:c80ac197fa6a 275
mbed_official 330:c80ac197fa6a 276 /* Clear EXTI line configuration */
mbed_official 330:c80ac197fa6a 277 temp = EXTI->IMR;
mbed_official 330:c80ac197fa6a 278 temp &= ~((uint32_t)iocurrent);
mbed_official 330:c80ac197fa6a 279 if((GPIO_Init->Mode & GPIO_MODE_IT) == GPIO_MODE_IT)
mbed_official 330:c80ac197fa6a 280 {
mbed_official 330:c80ac197fa6a 281 temp |= iocurrent;
mbed_official 330:c80ac197fa6a 282 }
mbed_official 330:c80ac197fa6a 283 EXTI->IMR = temp;
mbed_official 330:c80ac197fa6a 284
mbed_official 330:c80ac197fa6a 285 temp = EXTI->EMR;
mbed_official 330:c80ac197fa6a 286 temp &= ~((uint32_t)iocurrent);
mbed_official 330:c80ac197fa6a 287 if((GPIO_Init->Mode & GPIO_MODE_EVT) == GPIO_MODE_EVT)
mbed_official 330:c80ac197fa6a 288 {
mbed_official 330:c80ac197fa6a 289 temp |= iocurrent;
mbed_official 330:c80ac197fa6a 290 }
mbed_official 330:c80ac197fa6a 291 EXTI->EMR = temp;
mbed_official 330:c80ac197fa6a 292
mbed_official 330:c80ac197fa6a 293 /* Clear Rising Falling edge configuration */
mbed_official 330:c80ac197fa6a 294 temp = EXTI->RTSR;
mbed_official 330:c80ac197fa6a 295 temp &= ~((uint32_t)iocurrent);
mbed_official 330:c80ac197fa6a 296 if((GPIO_Init->Mode & RISING_EDGE) == RISING_EDGE)
mbed_official 330:c80ac197fa6a 297 {
mbed_official 330:c80ac197fa6a 298 temp |= iocurrent;
mbed_official 330:c80ac197fa6a 299 }
mbed_official 330:c80ac197fa6a 300 EXTI->RTSR = temp;
mbed_official 330:c80ac197fa6a 301
mbed_official 330:c80ac197fa6a 302 temp = EXTI->FTSR;
mbed_official 330:c80ac197fa6a 303 temp &= ~((uint32_t)iocurrent);
mbed_official 330:c80ac197fa6a 304 if((GPIO_Init->Mode & FALLING_EDGE) == FALLING_EDGE)
mbed_official 330:c80ac197fa6a 305 {
mbed_official 330:c80ac197fa6a 306 temp |= iocurrent;
mbed_official 330:c80ac197fa6a 307 }
mbed_official 330:c80ac197fa6a 308 EXTI->FTSR = temp;
mbed_official 330:c80ac197fa6a 309 }
mbed_official 330:c80ac197fa6a 310 }
mbed_official 330:c80ac197fa6a 311 }
mbed_official 330:c80ac197fa6a 312 }
mbed_official 330:c80ac197fa6a 313
mbed_official 330:c80ac197fa6a 314 /**
mbed_official 330:c80ac197fa6a 315 * @brief De-initializes the GPIOx peripheral registers to their default reset values.
mbed_official 330:c80ac197fa6a 316 * @param GPIOx: where x can be (A..F) to select the GPIO peripheral for STM32F30X device or STM32F37X device
mbed_official 330:c80ac197fa6a 317 * @param GPIO_Pin: specifies the port bit to be written.
mbed_official 330:c80ac197fa6a 318 * This parameter can be one of GPIO_PIN_x where x can be (0..15).
mbed_official 330:c80ac197fa6a 319 * @retval None
mbed_official 330:c80ac197fa6a 320 */
mbed_official 330:c80ac197fa6a 321 void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
mbed_official 330:c80ac197fa6a 322 {
mbed_official 330:c80ac197fa6a 323 uint32_t position;
mbed_official 330:c80ac197fa6a 324 uint32_t ioposition = 0x00;
mbed_official 330:c80ac197fa6a 325 uint32_t iocurrent = 0x00;
mbed_official 330:c80ac197fa6a 326 uint32_t tmp = 0x00;
mbed_official 330:c80ac197fa6a 327
mbed_official 330:c80ac197fa6a 328 /* Configure the port pins */
mbed_official 330:c80ac197fa6a 329 for (position = 0; position < GPIO_NUMBER; position++)
mbed_official 330:c80ac197fa6a 330 {
mbed_official 330:c80ac197fa6a 331 /* Get the IO position */
mbed_official 330:c80ac197fa6a 332 ioposition = ((uint32_t)0x01) << position;
mbed_official 330:c80ac197fa6a 333 /* Get the current IO position */
mbed_official 330:c80ac197fa6a 334 iocurrent = (GPIO_Pin) & ioposition;
mbed_official 330:c80ac197fa6a 335
mbed_official 330:c80ac197fa6a 336 if (iocurrent == ioposition)
mbed_official 330:c80ac197fa6a 337 {
mbed_official 330:c80ac197fa6a 338 /*------------------------- GPIO Mode Configuration --------------------*/
mbed_official 330:c80ac197fa6a 339 /* Configure IO Direction in Input Floting Mode */
mbed_official 330:c80ac197fa6a 340 GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (position * 2));
mbed_official 330:c80ac197fa6a 341
mbed_official 330:c80ac197fa6a 342 /* Configure the default Alternate Function in current IO */
mbed_official 330:c80ac197fa6a 343 GPIOx->AFR[position >> 3] &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ;
mbed_official 330:c80ac197fa6a 344
mbed_official 330:c80ac197fa6a 345 /* Configure the default value for IO Speed */
mbed_official 330:c80ac197fa6a 346 GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2));
mbed_official 330:c80ac197fa6a 347
mbed_official 330:c80ac197fa6a 348 /* Configure the default value IO Output Type */
mbed_official 330:c80ac197fa6a 349 GPIOx->OTYPER &= ~(GPIO_OTYPER_OT_0 << position) ;
mbed_official 330:c80ac197fa6a 350
mbed_official 330:c80ac197fa6a 351 /* Deactivate the Pull-up oand Pull-down resistor for the current IO */
mbed_official 330:c80ac197fa6a 352 GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2));
mbed_official 330:c80ac197fa6a 353
mbed_official 330:c80ac197fa6a 354
mbed_official 330:c80ac197fa6a 355 /*------------------------- EXTI Mode Configuration --------------------*/
mbed_official 330:c80ac197fa6a 356 /* Configure the External Interrupt or event for the current IO */
mbed_official 330:c80ac197fa6a 357 tmp = ((uint32_t)0x0F) << (4 * (position & 0x03));
mbed_official 330:c80ac197fa6a 358 SYSCFG->EXTICR[position >> 2] &= ~tmp;
mbed_official 330:c80ac197fa6a 359
mbed_official 330:c80ac197fa6a 360 /* Clear EXTI line configuration */
mbed_official 330:c80ac197fa6a 361 EXTI->IMR &= ~((uint32_t)iocurrent);
mbed_official 330:c80ac197fa6a 362 EXTI->EMR &= ~((uint32_t)iocurrent);
mbed_official 330:c80ac197fa6a 363
mbed_official 330:c80ac197fa6a 364 /* Clear Rising Falling edge configuration */
mbed_official 330:c80ac197fa6a 365 EXTI->RTSR &= ~((uint32_t)iocurrent);
mbed_official 330:c80ac197fa6a 366 EXTI->FTSR &= ~((uint32_t)iocurrent);
mbed_official 330:c80ac197fa6a 367 }
mbed_official 330:c80ac197fa6a 368 }
mbed_official 330:c80ac197fa6a 369 }
mbed_official 330:c80ac197fa6a 370
mbed_official 330:c80ac197fa6a 371 /**
mbed_official 330:c80ac197fa6a 372 * @}
mbed_official 330:c80ac197fa6a 373 */
mbed_official 330:c80ac197fa6a 374
mbed_official 330:c80ac197fa6a 375 /** @defgroup GPIO_Exported_Functions_Group2 Input and Output operation functions
mbed_official 330:c80ac197fa6a 376 * @brief GPIO Read and Write
mbed_official 330:c80ac197fa6a 377 *
mbed_official 330:c80ac197fa6a 378 @verbatim
mbed_official 330:c80ac197fa6a 379 ===============================================================================
mbed_official 330:c80ac197fa6a 380 ##### IO operation functions #####
mbed_official 330:c80ac197fa6a 381 ===============================================================================
mbed_official 330:c80ac197fa6a 382
mbed_official 330:c80ac197fa6a 383 @endverbatim
mbed_official 330:c80ac197fa6a 384 * @{
mbed_official 330:c80ac197fa6a 385 */
mbed_official 330:c80ac197fa6a 386
mbed_official 330:c80ac197fa6a 387 /**
mbed_official 330:c80ac197fa6a 388 * @brief Reads the specified input port pin.
mbed_official 330:c80ac197fa6a 389 * @param GPIOx: where x can be (A..F) to select the GPIO peripheral for STM32F3 family
mbed_official 330:c80ac197fa6a 390 * @param GPIO_Pin: specifies the port bit to read.
mbed_official 330:c80ac197fa6a 391 * This parameter can be GPIO_PIN_x where x can be (0..15).
mbed_official 330:c80ac197fa6a 392 * @retval The input port pin value.
mbed_official 330:c80ac197fa6a 393 */
mbed_official 330:c80ac197fa6a 394 GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
mbed_official 330:c80ac197fa6a 395 {
mbed_official 330:c80ac197fa6a 396 GPIO_PinState bitstatus;
mbed_official 330:c80ac197fa6a 397
mbed_official 330:c80ac197fa6a 398 /* Check the parameters */
mbed_official 330:c80ac197fa6a 399 assert_param(IS_GPIO_PIN(GPIO_Pin));
mbed_official 330:c80ac197fa6a 400
mbed_official 330:c80ac197fa6a 401 if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET)
mbed_official 330:c80ac197fa6a 402 {
mbed_official 330:c80ac197fa6a 403 bitstatus = GPIO_PIN_SET;
mbed_official 330:c80ac197fa6a 404 }
mbed_official 330:c80ac197fa6a 405 else
mbed_official 330:c80ac197fa6a 406 {
mbed_official 330:c80ac197fa6a 407 bitstatus = GPIO_PIN_RESET;
mbed_official 330:c80ac197fa6a 408 }
mbed_official 330:c80ac197fa6a 409 return bitstatus;
mbed_official 330:c80ac197fa6a 410 }
mbed_official 330:c80ac197fa6a 411
mbed_official 330:c80ac197fa6a 412 /**
mbed_official 330:c80ac197fa6a 413 * @brief Sets or clears the selected data port bit.
mbed_official 330:c80ac197fa6a 414 *
mbed_official 330:c80ac197fa6a 415 * @note This function uses GPIOx_BSRR register to allow atomic read/modify
mbed_official 330:c80ac197fa6a 416 * accesses. In this way, there is no risk of an IRQ occurring between
mbed_official 330:c80ac197fa6a 417 * the read and the modify access.
mbed_official 330:c80ac197fa6a 418 *
mbed_official 330:c80ac197fa6a 419 * @param GPIOx: where x can be (A..F) to select the GPIO peripheral for STM32F3 family
mbed_official 330:c80ac197fa6a 420 * @param GPIO_Pin: specifies the port bit to be written.
mbed_official 330:c80ac197fa6a 421 * This parameter can be one of GPIO_PIN_x where x can be (0..15).
mbed_official 330:c80ac197fa6a 422 * @param PinState: specifies the value to be written to the selected bit.
mbed_official 330:c80ac197fa6a 423 * This parameter can be one of the GPIO_PinState enum values:
mbed_official 330:c80ac197fa6a 424 * @arg GPIO_PIN_RESET: to clear the port pin
mbed_official 330:c80ac197fa6a 425 * @arg GPIO_PIN_SET: to set the port pin
mbed_official 330:c80ac197fa6a 426 * @retval None
mbed_official 330:c80ac197fa6a 427 */
mbed_official 330:c80ac197fa6a 428 void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
mbed_official 330:c80ac197fa6a 429 {
mbed_official 330:c80ac197fa6a 430 /* Check the parameters */
mbed_official 330:c80ac197fa6a 431 assert_param(IS_GPIO_PIN(GPIO_Pin));
mbed_official 330:c80ac197fa6a 432 assert_param(IS_GPIO_PIN_ACTION(PinState));
mbed_official 330:c80ac197fa6a 433
mbed_official 330:c80ac197fa6a 434 if (PinState != GPIO_PIN_RESET)
mbed_official 330:c80ac197fa6a 435 {
mbed_official 330:c80ac197fa6a 436 GPIOx->BSRRL = GPIO_Pin;
mbed_official 330:c80ac197fa6a 437 }
mbed_official 330:c80ac197fa6a 438 else
mbed_official 330:c80ac197fa6a 439 {
mbed_official 330:c80ac197fa6a 440 GPIOx->BSRRH = GPIO_Pin ;
mbed_official 330:c80ac197fa6a 441 }
mbed_official 330:c80ac197fa6a 442 }
mbed_official 330:c80ac197fa6a 443
mbed_official 330:c80ac197fa6a 444 /**
mbed_official 330:c80ac197fa6a 445 * @brief Toggles the specified GPIO pin
mbed_official 330:c80ac197fa6a 446 * @param GPIOx: where x can be (A..F) to select the GPIO peripheral for STM32F3 family
mbed_official 330:c80ac197fa6a 447 * @param GPIO_Pin: specifies the pins to be toggled.
mbed_official 330:c80ac197fa6a 448 * @retval None
mbed_official 330:c80ac197fa6a 449 */
mbed_official 330:c80ac197fa6a 450 void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
mbed_official 330:c80ac197fa6a 451 {
mbed_official 330:c80ac197fa6a 452 /* Check the parameters */
mbed_official 330:c80ac197fa6a 453 assert_param(IS_GPIO_PIN(GPIO_Pin));
mbed_official 330:c80ac197fa6a 454
mbed_official 330:c80ac197fa6a 455 GPIOx->ODR ^= GPIO_Pin;
mbed_official 330:c80ac197fa6a 456 }
mbed_official 330:c80ac197fa6a 457
mbed_official 330:c80ac197fa6a 458 /**
mbed_official 330:c80ac197fa6a 459 * @brief Locks GPIO Pins configuration registers.
mbed_official 330:c80ac197fa6a 460 * @note The locked registers are GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR,
mbed_official 330:c80ac197fa6a 461 * GPIOx_PUPDR, GPIOx_AFRL and GPIOx_AFRH.
mbed_official 330:c80ac197fa6a 462 * @note The configuration of the locked GPIO pins can no longer be modified
mbed_official 330:c80ac197fa6a 463 * until the next reset.
mbed_official 330:c80ac197fa6a 464 * @param GPIOx: where x can be (A..F) to select the GPIO peripheral for STM32F3 family
mbed_official 330:c80ac197fa6a 465 * @param GPIO_Pin: specifies the port bit to be locked.
mbed_official 330:c80ac197fa6a 466 * This parameter can be any combination of GPIO_Pin_x where x can be (0..15).
mbed_official 330:c80ac197fa6a 467 * @retval None
mbed_official 330:c80ac197fa6a 468 */
mbed_official 330:c80ac197fa6a 469 HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
mbed_official 330:c80ac197fa6a 470 {
mbed_official 330:c80ac197fa6a 471 __IO uint32_t tmp = GPIO_LCKR_LCKK;
mbed_official 330:c80ac197fa6a 472
mbed_official 330:c80ac197fa6a 473 /* Check the parameters */
mbed_official 330:c80ac197fa6a 474 assert_param(IS_GPIO_PIN(GPIO_Pin));
mbed_official 330:c80ac197fa6a 475
mbed_official 330:c80ac197fa6a 476 /* Apply lock key write sequence */
mbed_official 330:c80ac197fa6a 477 tmp |= GPIO_Pin;
mbed_official 330:c80ac197fa6a 478 /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */
mbed_official 330:c80ac197fa6a 479 GPIOx->LCKR = tmp;
mbed_official 330:c80ac197fa6a 480 /* Reset LCKx bit(s): LCKK='0' + LCK[15-0] */
mbed_official 330:c80ac197fa6a 481 GPIOx->LCKR = GPIO_Pin;
mbed_official 330:c80ac197fa6a 482 /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */
mbed_official 330:c80ac197fa6a 483 GPIOx->LCKR = tmp;
mbed_official 330:c80ac197fa6a 484 /* Read LCKK bit*/
mbed_official 330:c80ac197fa6a 485 tmp = GPIOx->LCKR;
mbed_official 330:c80ac197fa6a 486
mbed_official 330:c80ac197fa6a 487 if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET)
mbed_official 330:c80ac197fa6a 488 {
mbed_official 330:c80ac197fa6a 489 return HAL_OK;
mbed_official 330:c80ac197fa6a 490 }
mbed_official 330:c80ac197fa6a 491 else
mbed_official 330:c80ac197fa6a 492 {
mbed_official 330:c80ac197fa6a 493 return HAL_ERROR;
mbed_official 330:c80ac197fa6a 494 }
mbed_official 330:c80ac197fa6a 495 }
mbed_official 330:c80ac197fa6a 496
mbed_official 330:c80ac197fa6a 497 /**
mbed_official 330:c80ac197fa6a 498 * @brief This function handles EXTI interrupt request.
mbed_official 330:c80ac197fa6a 499 * @param GPIO_Pin: Specifies the pins connected EXTI line
mbed_official 330:c80ac197fa6a 500 * @retval None
mbed_official 330:c80ac197fa6a 501 */
mbed_official 330:c80ac197fa6a 502 void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
mbed_official 330:c80ac197fa6a 503 {
mbed_official 330:c80ac197fa6a 504 /* EXTI line interrupt detected */
mbed_official 330:c80ac197fa6a 505 if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
mbed_official 330:c80ac197fa6a 506 {
mbed_official 330:c80ac197fa6a 507 __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
mbed_official 330:c80ac197fa6a 508 HAL_GPIO_EXTI_Callback(GPIO_Pin);
mbed_official 330:c80ac197fa6a 509 }
mbed_official 330:c80ac197fa6a 510 }
mbed_official 330:c80ac197fa6a 511
mbed_official 330:c80ac197fa6a 512 /**
mbed_official 330:c80ac197fa6a 513 * @brief EXTI line detection callbacks.
mbed_official 330:c80ac197fa6a 514 * @param GPIO_Pin: Specifies the pins connected EXTI line
mbed_official 330:c80ac197fa6a 515 * @retval None
mbed_official 330:c80ac197fa6a 516 */
mbed_official 330:c80ac197fa6a 517 __weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
mbed_official 330:c80ac197fa6a 518 {
mbed_official 330:c80ac197fa6a 519 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 330:c80ac197fa6a 520 the HAL_GPIO_EXTI_Callback could be implemented in the user file
mbed_official 330:c80ac197fa6a 521 */
mbed_official 330:c80ac197fa6a 522 }
mbed_official 330:c80ac197fa6a 523
mbed_official 330:c80ac197fa6a 524 /**
mbed_official 330:c80ac197fa6a 525 * @}
mbed_official 330:c80ac197fa6a 526 */
mbed_official 330:c80ac197fa6a 527
mbed_official 330:c80ac197fa6a 528
mbed_official 330:c80ac197fa6a 529 /**
mbed_official 330:c80ac197fa6a 530 * @}
mbed_official 330:c80ac197fa6a 531 */
mbed_official 330:c80ac197fa6a 532
mbed_official 330:c80ac197fa6a 533 #endif /* HAL_GPIO_MODULE_ENABLED */
mbed_official 330:c80ac197fa6a 534 /**
mbed_official 330:c80ac197fa6a 535 * @}
mbed_official 330:c80ac197fa6a 536 */
mbed_official 330:c80ac197fa6a 537
mbed_official 330:c80ac197fa6a 538 /**
mbed_official 330:c80ac197fa6a 539 * @}
mbed_official 330:c80ac197fa6a 540 */
mbed_official 330:c80ac197fa6a 541
mbed_official 330:c80ac197fa6a 542 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/