Marco Zecchini / Mbed OS Example_RTOS
Committer:
marcozecchini
Date:
Sat Feb 23 12:13:36 2019 +0000
Revision:
0:9fca2b23d0ba
final commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcozecchini 0:9fca2b23d0ba 1 /* mbed Microcontroller Library
marcozecchini 0:9fca2b23d0ba 2 *******************************************************************************
marcozecchini 0:9fca2b23d0ba 3 * Copyright (c) 2016, STMicroelectronics
marcozecchini 0:9fca2b23d0ba 4 * All rights reserved.
marcozecchini 0:9fca2b23d0ba 5 *
marcozecchini 0:9fca2b23d0ba 6 * Redistribution and use in source and binary forms, with or without
marcozecchini 0:9fca2b23d0ba 7 * modification, are permitted provided that the following conditions are met:
marcozecchini 0:9fca2b23d0ba 8 *
marcozecchini 0:9fca2b23d0ba 9 * 1. Redistributions of source code must retain the above copyright notice,
marcozecchini 0:9fca2b23d0ba 10 * this list of conditions and the following disclaimer.
marcozecchini 0:9fca2b23d0ba 11 * 2. Redistributions in binary form must reproduce the above copyright notice,
marcozecchini 0:9fca2b23d0ba 12 * this list of conditions and the following disclaimer in the documentation
marcozecchini 0:9fca2b23d0ba 13 * and/or other materials provided with the distribution.
marcozecchini 0:9fca2b23d0ba 14 * 3. Neither the name of STMicroelectronics nor the names of its contributors
marcozecchini 0:9fca2b23d0ba 15 * may be used to endorse or promote products derived from this software
marcozecchini 0:9fca2b23d0ba 16 * without specific prior written permission.
marcozecchini 0:9fca2b23d0ba 17 *
marcozecchini 0:9fca2b23d0ba 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
marcozecchini 0:9fca2b23d0ba 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
marcozecchini 0:9fca2b23d0ba 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
marcozecchini 0:9fca2b23d0ba 21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
marcozecchini 0:9fca2b23d0ba 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
marcozecchini 0:9fca2b23d0ba 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
marcozecchini 0:9fca2b23d0ba 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
marcozecchini 0:9fca2b23d0ba 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
marcozecchini 0:9fca2b23d0ba 26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
marcozecchini 0:9fca2b23d0ba 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
marcozecchini 0:9fca2b23d0ba 28 *******************************************************************************
marcozecchini 0:9fca2b23d0ba 29 */
marcozecchini 0:9fca2b23d0ba 30 #include "port_api.h"
marcozecchini 0:9fca2b23d0ba 31 #include "pinmap.h"
marcozecchini 0:9fca2b23d0ba 32 #include "gpio_api.h"
marcozecchini 0:9fca2b23d0ba 33 #include "mbed_error.h"
marcozecchini 0:9fca2b23d0ba 34
marcozecchini 0:9fca2b23d0ba 35 #if DEVICE_PORTIN || DEVICE_PORTOUT
marcozecchini 0:9fca2b23d0ba 36
marcozecchini 0:9fca2b23d0ba 37 extern GPIO_TypeDef *Set_GPIO_Clock(uint32_t port_idx);
marcozecchini 0:9fca2b23d0ba 38
marcozecchini 0:9fca2b23d0ba 39 // high nibble = port number (0=A, 1=B, 2=C, 3=D, 4=E, 5=F, ...)
marcozecchini 0:9fca2b23d0ba 40 // low nibble = pin number
marcozecchini 0:9fca2b23d0ba 41 PinName port_pin(PortName port, int pin_n)
marcozecchini 0:9fca2b23d0ba 42 {
marcozecchini 0:9fca2b23d0ba 43 return (PinName)(pin_n + (port << 4));
marcozecchini 0:9fca2b23d0ba 44 }
marcozecchini 0:9fca2b23d0ba 45
marcozecchini 0:9fca2b23d0ba 46 void port_init(port_t *obj, PortName port, int mask, PinDirection dir)
marcozecchini 0:9fca2b23d0ba 47 {
marcozecchini 0:9fca2b23d0ba 48 uint32_t port_index = (uint32_t)port;
marcozecchini 0:9fca2b23d0ba 49
marcozecchini 0:9fca2b23d0ba 50 // Enable GPIO clock
marcozecchini 0:9fca2b23d0ba 51 GPIO_TypeDef *gpio = Set_GPIO_Clock(port_index);
marcozecchini 0:9fca2b23d0ba 52
marcozecchini 0:9fca2b23d0ba 53 // Fill PORT object structure for future use
marcozecchini 0:9fca2b23d0ba 54 obj->port = port;
marcozecchini 0:9fca2b23d0ba 55 obj->mask = mask;
marcozecchini 0:9fca2b23d0ba 56 obj->direction = dir;
marcozecchini 0:9fca2b23d0ba 57 obj->reg_in = &gpio->IDR;
marcozecchini 0:9fca2b23d0ba 58 obj->reg_out = &gpio->ODR;
marcozecchini 0:9fca2b23d0ba 59
marcozecchini 0:9fca2b23d0ba 60 port_dir(obj, dir);
marcozecchini 0:9fca2b23d0ba 61 }
marcozecchini 0:9fca2b23d0ba 62
marcozecchini 0:9fca2b23d0ba 63 void port_dir(port_t *obj, PinDirection dir)
marcozecchini 0:9fca2b23d0ba 64 {
marcozecchini 0:9fca2b23d0ba 65 uint32_t i;
marcozecchini 0:9fca2b23d0ba 66 obj->direction = dir;
marcozecchini 0:9fca2b23d0ba 67 for (i = 0; i < 16; i++) { // Process all pins
marcozecchini 0:9fca2b23d0ba 68 if (obj->mask & (1 << i)) { // If the pin is used
marcozecchini 0:9fca2b23d0ba 69 if (dir == PIN_OUTPUT) {
marcozecchini 0:9fca2b23d0ba 70 pin_function(port_pin(obj->port, i), STM_PIN_DATA(STM_MODE_OUTPUT_PP, GPIO_NOPULL, 0));
marcozecchini 0:9fca2b23d0ba 71 } else { // PIN_INPUT
marcozecchini 0:9fca2b23d0ba 72 pin_function(port_pin(obj->port, i), STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0));
marcozecchini 0:9fca2b23d0ba 73 }
marcozecchini 0:9fca2b23d0ba 74 }
marcozecchini 0:9fca2b23d0ba 75 }
marcozecchini 0:9fca2b23d0ba 76 }
marcozecchini 0:9fca2b23d0ba 77
marcozecchini 0:9fca2b23d0ba 78 void port_mode(port_t *obj, PinMode mode)
marcozecchini 0:9fca2b23d0ba 79 {
marcozecchini 0:9fca2b23d0ba 80 uint32_t i;
marcozecchini 0:9fca2b23d0ba 81 for (i = 0; i < 16; i++) { // Process all pins
marcozecchini 0:9fca2b23d0ba 82 if (obj->mask & (1 << i)) { // If the pin is used
marcozecchini 0:9fca2b23d0ba 83 pin_mode(port_pin(obj->port, i), mode);
marcozecchini 0:9fca2b23d0ba 84 }
marcozecchini 0:9fca2b23d0ba 85 }
marcozecchini 0:9fca2b23d0ba 86 }
marcozecchini 0:9fca2b23d0ba 87
marcozecchini 0:9fca2b23d0ba 88 void port_write(port_t *obj, int value)
marcozecchini 0:9fca2b23d0ba 89 {
marcozecchini 0:9fca2b23d0ba 90 *obj->reg_out = (*obj->reg_out & ~obj->mask) | (value & obj->mask);
marcozecchini 0:9fca2b23d0ba 91 }
marcozecchini 0:9fca2b23d0ba 92
marcozecchini 0:9fca2b23d0ba 93 int port_read(port_t *obj)
marcozecchini 0:9fca2b23d0ba 94 {
marcozecchini 0:9fca2b23d0ba 95 if (obj->direction == PIN_OUTPUT) {
marcozecchini 0:9fca2b23d0ba 96 return (*obj->reg_out & obj->mask);
marcozecchini 0:9fca2b23d0ba 97 } else { // PIN_INPUT
marcozecchini 0:9fca2b23d0ba 98 return (*obj->reg_in & obj->mask);
marcozecchini 0:9fca2b23d0ba 99 }
marcozecchini 0:9fca2b23d0ba 100 }
marcozecchini 0:9fca2b23d0ba 101
marcozecchini 0:9fca2b23d0ba 102 #endif