/** @defgroup syscon_file SYSCON peripheral API * @ingroup peripheral_apis * @brief SWM050 SYSCON API. * LGPL License Terms @ref lgpl_license * @author @htmlonly © @endhtmlonly 2019 * Icenowy Zheng * @author @htmlonly © @endhtmlonly 2019 * Caleb Szalacinski */ /* * This file is part of the libopencm3 project. * * Copyright (C) 2019 Icenowy Zheng * Copyright (C) 2019 Caleb Szalacinski * * This library is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library. If not, see . */ /**@{*/ #include #include /*---------------------------------------------------------------------------*/ /** @brief Select the alternative function of a Group of Pins Select the alternative function of one or more pins of GPIO. @param[in] gpios Pin identifiers @ref gpio_pin_id If multiple pins are to be changed, use bitwise OR '|' to separate them. @param[in] af_en Whether alternative function is selected */ void syscon_sel_af(uint16_t gpios, bool af_en) { uint32_t masked_reg32; if (gpios & GPIO0) { masked_reg32 = SYSCON_PORTA_SEL & (~0x3); SYSCON_PORTA_SEL = masked_reg32 | (af_en ? 0x1 : 0x0); } if (gpios & GPIO1) { masked_reg32 = SYSCON_PORTA_SEL & (~0xc); SYSCON_PORTA_SEL = masked_reg32 | (af_en ? 0x4 : 0x0); } if (gpios & GPIO2) { masked_reg32 = SYSCON_PORTA_SEL & (~0x30); SYSCON_PORTA_SEL = masked_reg32 | (af_en ? 0x10 : 0x0); } if (gpios & GPIO7) { masked_reg32 = SYSCON_PORTA_SEL & (~0xc000); SYSCON_PORTA_SEL = masked_reg32 | (af_en ? 0x4000 : 0x0); } } /*---------------------------------------------------------------------------*/ /** @brief Enable the internal pull-up of a Group of Pins Enable or disable the internal pull-up of one or more pins of GPIO. @param[in] gpios Pin identifiers @ref gpio_pin_id If multiple pins are to be changed, use bitwise OR '|' to separate them. @param[in] en True to enable pull-up, false to disable. */ void syscon_pullup(uint16_t gpios, bool en) { if (en) { SYSCON_PORTA_PULLUP |= gpios; } else { SYSCON_PORTA_PULLUP &= ~gpios; } } /*---------------------------------------------------------------------------*/ /** @brief Enable the input function of a Group of Pins Enable or disable the input function of one or more pins of GPIO. Disabling the input function of pins decreases the power usage of the MCU. @param[in] gpios Pin identifiers @ref gpio_pin_id If multiple pins are to be changed, use bitwise OR '|' to separate them. @param[in] en True to enable input function. */ void syscon_input_enable(uint16_t gpios, bool en) { if (en) { SYSCON_PORTA_INEN &= ~gpios; } else { SYSCON_PORTA_INEN |= gpios; } } /*---------------------------------------------------------------------------*/ /** @brief Select the SWD function of GPIO 1/2 Enable or disable the SWD debugging port at GPIO 1/2. When SWD debugging port is enabled, GPIO and AF of the SWD pins will be both unavailable. @param[in] en True to enable SWD. */ void syscon_sel_swd(bool en) { SYSCON_SWD_SEL = en; } /**@}*/