mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Mon Sep 28 14:00:11 2015 +0100
Revision:
632:7687fb9c4f91
Parent:
385:be64abf45658
Child:
634:ac7d6880524d
Synchronized with git revision f7ce4ed029cc611121464252ff28d5e8beb895b0

Full URL: https://github.com/mbedmicro/mbed/commit/f7ce4ed029cc611121464252ff28d5e8beb895b0/

NUCLEO_F303K8 - add support of the STM32F303K8

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 632:7687fb9c4f91 5 * @version V1.1.1
mbed_official 632:7687fb9c4f91 6 * @date 19-June-2015
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 632:7687fb9c4f91 104 * <h2><center>&copy; COPYRIGHT(c) 2015 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****/