- fix F411 F334 systeminit when HSI used - portinout always read IDR regardless of port direction

Fork of mbed-src by mbed official

Committer:
Geremia
Date:
Sat Sep 27 11:16:28 2014 +0000
Revision:
332:e299ae530e63
Parent:
327:a7562ccfb9d5
- fix F411 F334 systeminit when HSI used; - STMs PortInOut port.read() always read input data register (real external pin state) even if direction is output (same as other platforms)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 133:d4dda5c437f0 1 /* mbed Microcontroller Library
mbed_official 133:d4dda5c437f0 2 *******************************************************************************
mbed_official 133:d4dda5c437f0 3 * Copyright (c) 2014, STMicroelectronics
mbed_official 133:d4dda5c437f0 4 * All rights reserved.
mbed_official 133:d4dda5c437f0 5 *
mbed_official 133:d4dda5c437f0 6 * Redistribution and use in source and binary forms, with or without
mbed_official 133:d4dda5c437f0 7 * modification, are permitted provided that the following conditions are met:
mbed_official 133:d4dda5c437f0 8 *
mbed_official 133:d4dda5c437f0 9 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 133:d4dda5c437f0 10 * this list of conditions and the following disclaimer.
mbed_official 133:d4dda5c437f0 11 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 133:d4dda5c437f0 12 * this list of conditions and the following disclaimer in the documentation
mbed_official 133:d4dda5c437f0 13 * and/or other materials provided with the distribution.
mbed_official 133:d4dda5c437f0 14 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 133:d4dda5c437f0 15 * may be used to endorse or promote products derived from this software
mbed_official 133:d4dda5c437f0 16 * without specific prior written permission.
mbed_official 133:d4dda5c437f0 17 *
mbed_official 133:d4dda5c437f0 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 133:d4dda5c437f0 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 133:d4dda5c437f0 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 133:d4dda5c437f0 21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 133:d4dda5c437f0 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 133:d4dda5c437f0 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 133:d4dda5c437f0 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 133:d4dda5c437f0 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 133:d4dda5c437f0 26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 133:d4dda5c437f0 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 133:d4dda5c437f0 28 *******************************************************************************
mbed_official 133:d4dda5c437f0 29 */
mbed_official 227:7bd0639b8911 30 #include "mbed_assert.h"
mbed_official 133:d4dda5c437f0 31 #include "pinmap.h"
mbed_official 242:7074e42da0b2 32 #include "PortNames.h"
mbed_official 285:31249416b6f9 33 #include "mbed_error.h"
mbed_official 133:d4dda5c437f0 34
mbed_official 133:d4dda5c437f0 35 // GPIO mode look-up table
mbed_official 327:a7562ccfb9d5 36 static const uint32_t gpio_mode[13] = {
mbed_official 133:d4dda5c437f0 37 0x00000000, // 0 = GPIO_MODE_INPUT
mbed_official 133:d4dda5c437f0 38 0x00000001, // 1 = GPIO_MODE_OUTPUT_PP
mbed_official 133:d4dda5c437f0 39 0x00000011, // 2 = GPIO_MODE_OUTPUT_OD
mbed_official 133:d4dda5c437f0 40 0x00000002, // 3 = GPIO_MODE_AF_PP
mbed_official 133:d4dda5c437f0 41 0x00000012, // 4 = GPIO_MODE_AF_OD
mbed_official 133:d4dda5c437f0 42 0x00000003, // 5 = GPIO_MODE_ANALOG
mbed_official 133:d4dda5c437f0 43 0x10110000, // 6 = GPIO_MODE_IT_RISING
mbed_official 133:d4dda5c437f0 44 0x10210000, // 7 = GPIO_MODE_IT_FALLING
mbed_official 133:d4dda5c437f0 45 0x10310000, // 8 = GPIO_MODE_IT_RISING_FALLING
mbed_official 133:d4dda5c437f0 46 0x10120000, // 9 = GPIO_MODE_EVT_RISING
mbed_official 133:d4dda5c437f0 47 0x10220000, // 10 = GPIO_MODE_EVT_FALLING
mbed_official 327:a7562ccfb9d5 48 0x10320000, // 11 = GPIO_MODE_EVT_RISING_FALLING
mbed_official 327:a7562ccfb9d5 49 0x10000000 // 12 = Reset GPIO_MODE_IT_EVT
mbed_official 133:d4dda5c437f0 50 };
mbed_official 133:d4dda5c437f0 51
mbed_official 133:d4dda5c437f0 52 // Enable GPIO clock and return GPIO base address
mbed_official 133:d4dda5c437f0 53 uint32_t Set_GPIO_Clock(uint32_t port_idx) {
mbed_official 133:d4dda5c437f0 54 uint32_t gpio_add = 0;
mbed_official 133:d4dda5c437f0 55 switch (port_idx) {
mbed_official 133:d4dda5c437f0 56 case PortA:
mbed_official 133:d4dda5c437f0 57 gpio_add = GPIOA_BASE;
mbed_official 133:d4dda5c437f0 58 __GPIOA_CLK_ENABLE();
mbed_official 133:d4dda5c437f0 59 break;
mbed_official 133:d4dda5c437f0 60 case PortB:
mbed_official 133:d4dda5c437f0 61 gpio_add = GPIOB_BASE;
mbed_official 133:d4dda5c437f0 62 __GPIOB_CLK_ENABLE();
mbed_official 133:d4dda5c437f0 63 break;
mbed_official 133:d4dda5c437f0 64 case PortC:
mbed_official 133:d4dda5c437f0 65 gpio_add = GPIOC_BASE;
mbed_official 133:d4dda5c437f0 66 __GPIOC_CLK_ENABLE();
mbed_official 133:d4dda5c437f0 67 break;
mbed_official 133:d4dda5c437f0 68 case PortD:
mbed_official 133:d4dda5c437f0 69 gpio_add = GPIOD_BASE;
mbed_official 133:d4dda5c437f0 70 __GPIOD_CLK_ENABLE();
mbed_official 133:d4dda5c437f0 71 break;
mbed_official 286:46a3fe348d1d 72 case PortE:
mbed_official 286:46a3fe348d1d 73 gpio_add = GPIOE_BASE;
mbed_official 286:46a3fe348d1d 74 __GPIOE_CLK_ENABLE();
mbed_official 286:46a3fe348d1d 75 break;
mbed_official 286:46a3fe348d1d 76 case PortF:
mbed_official 286:46a3fe348d1d 77 gpio_add = GPIOF_BASE;
mbed_official 286:46a3fe348d1d 78 __GPIOF_CLK_ENABLE();
mbed_official 286:46a3fe348d1d 79 break;
mbed_official 286:46a3fe348d1d 80 case PortG:
mbed_official 286:46a3fe348d1d 81 gpio_add = GPIOG_BASE;
mbed_official 286:46a3fe348d1d 82 __GPIOG_CLK_ENABLE();
mbed_official 286:46a3fe348d1d 83 break;
mbed_official 133:d4dda5c437f0 84 case PortH:
mbed_official 133:d4dda5c437f0 85 gpio_add = GPIOH_BASE;
mbed_official 133:d4dda5c437f0 86 __GPIOH_CLK_ENABLE();
mbed_official 133:d4dda5c437f0 87 break;
mbed_official 286:46a3fe348d1d 88 case PortI:
mbed_official 286:46a3fe348d1d 89 gpio_add = GPIOI_BASE;
mbed_official 286:46a3fe348d1d 90 __GPIOI_CLK_ENABLE();
mbed_official 286:46a3fe348d1d 91 break;
mbed_official 133:d4dda5c437f0 92 default:
mbed_official 133:d4dda5c437f0 93 error("Pinmap error: wrong port number.");
mbed_official 227:7bd0639b8911 94 break;
mbed_official 133:d4dda5c437f0 95 }
mbed_official 133:d4dda5c437f0 96 return gpio_add;
mbed_official 133:d4dda5c437f0 97 }
mbed_official 133:d4dda5c437f0 98
mbed_official 133:d4dda5c437f0 99 /**
mbed_official 133:d4dda5c437f0 100 * Configure pin (mode, speed, output type and pull-up/pull-down)
mbed_official 133:d4dda5c437f0 101 */
mbed_official 133:d4dda5c437f0 102 void pin_function(PinName pin, int data) {
mbed_official 227:7bd0639b8911 103 MBED_ASSERT(pin != (PinName)NC);
mbed_official 133:d4dda5c437f0 104 // Get the pin informations
mbed_official 133:d4dda5c437f0 105 uint32_t mode = STM_PIN_MODE(data);
mbed_official 133:d4dda5c437f0 106 uint32_t pupd = STM_PIN_PUPD(data);
mbed_official 133:d4dda5c437f0 107 uint32_t afnum = STM_PIN_AFNUM(data);
mbed_official 133:d4dda5c437f0 108
mbed_official 133:d4dda5c437f0 109 uint32_t port_index = STM_PORT(pin);
mbed_official 133:d4dda5c437f0 110 uint32_t pin_index = STM_PIN(pin);
mbed_official 133:d4dda5c437f0 111
mbed_official 133:d4dda5c437f0 112 // Enable GPIO clock
mbed_official 133:d4dda5c437f0 113 uint32_t gpio_add = Set_GPIO_Clock(port_index);
mbed_official 133:d4dda5c437f0 114 GPIO_TypeDef *gpio = (GPIO_TypeDef *)gpio_add;
mbed_official 133:d4dda5c437f0 115
mbed_official 133:d4dda5c437f0 116 // Configure GPIO
mbed_official 133:d4dda5c437f0 117 GPIO_InitTypeDef GPIO_InitStructure;
mbed_official 133:d4dda5c437f0 118 GPIO_InitStructure.Pin = (uint32_t)(1 << pin_index);
mbed_official 133:d4dda5c437f0 119 GPIO_InitStructure.Mode = gpio_mode[mode];
mbed_official 133:d4dda5c437f0 120 GPIO_InitStructure.Pull = pupd;
mbed_official 133:d4dda5c437f0 121 GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
mbed_official 133:d4dda5c437f0 122 GPIO_InitStructure.Alternate = afnum;
mbed_official 133:d4dda5c437f0 123 HAL_GPIO_Init(gpio, &GPIO_InitStructure);
mbed_official 133:d4dda5c437f0 124
mbed_official 133:d4dda5c437f0 125 // [TODO] Disconnect JTAG-DP + SW-DP signals.
mbed_official 133:d4dda5c437f0 126 // Warning: Need to reconnect under reset
mbed_official 133:d4dda5c437f0 127 //if ((pin == PA_13) || (pin == PA_14)) {
mbed_official 133:d4dda5c437f0 128 //
mbed_official 133:d4dda5c437f0 129 //}
mbed_official 133:d4dda5c437f0 130 //if ((pin == PA_15) || (pin == PB_3) || (pin == PB_4)) {
mbed_official 133:d4dda5c437f0 131 //
mbed_official 227:7bd0639b8911 132 //}
mbed_official 133:d4dda5c437f0 133 }
mbed_official 133:d4dda5c437f0 134
mbed_official 133:d4dda5c437f0 135 /**
mbed_official 133:d4dda5c437f0 136 * Configure pin pull-up/pull-down
mbed_official 133:d4dda5c437f0 137 */
mbed_official 133:d4dda5c437f0 138 void pin_mode(PinName pin, PinMode mode) {
mbed_official 227:7bd0639b8911 139 MBED_ASSERT(pin != (PinName)NC);
mbed_official 133:d4dda5c437f0 140 uint32_t port_index = STM_PORT(pin);
mbed_official 133:d4dda5c437f0 141 uint32_t pin_index = STM_PIN(pin);
mbed_official 133:d4dda5c437f0 142
mbed_official 133:d4dda5c437f0 143 // Enable GPIO clock
mbed_official 133:d4dda5c437f0 144 uint32_t gpio_add = Set_GPIO_Clock(port_index);
mbed_official 133:d4dda5c437f0 145 GPIO_TypeDef *gpio = (GPIO_TypeDef *)gpio_add;
mbed_official 133:d4dda5c437f0 146
mbed_official 133:d4dda5c437f0 147 // Configure pull-up/pull-down resistors
mbed_official 133:d4dda5c437f0 148 uint32_t pupd = (uint32_t)mode;
mbed_official 227:7bd0639b8911 149 if (pupd > 2)
mbed_official 227:7bd0639b8911 150 pupd = 0; // Open-drain = No pull-up/No pull-down
mbed_official 133:d4dda5c437f0 151 gpio->PUPDR &= (uint32_t)(~(GPIO_PUPDR_PUPDR0 << (pin_index * 2)));
mbed_official 133:d4dda5c437f0 152 gpio->PUPDR |= (uint32_t)(pupd << (pin_index * 2));
mbed_official 133:d4dda5c437f0 153
mbed_official 133:d4dda5c437f0 154 }