中级会员
 
- 积分
- 213
- 金钱
- 213
- 注册时间
- 2018-2-1
- 在线时间
- 40 小时
|

楼主 |
发表于 2018-4-1 17:00:45
|
显示全部楼层
stm32f4xx_xgpio.cpp 文件
[mw_shl_code=cpp,true]/**
******************************************************************************
* \file stm32f4xx_xgpio.cpp
* \author XinLi
* \version v1.0
* \date 20-March-2018
* \brief General purpose I/O module driver.
******************************************************************************
* \attention
*
* <h2><center>Copyright © 2018 XinLi</center></h2>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
******************************************************************************
*/
#include "stm32f4xx_xgpio.h"
#include "stm32f4xx_ll_bus.h"
static __IO uint16_t openFlagPortA = 0;
static __IO uint16_t openFlagPortB = 0;
static __IO uint16_t openFlagPortC = 0;
#ifdef GPIOD
static __IO uint16_t openFlagPortD = 0;
#endif // GPIOD
#ifdef GPIOE
static __IO uint16_t openFlagPortE = 0;
#endif // GPIOE
#ifdef GPIOF
static __IO uint16_t openFlagPortF = 0;
#endif // GPIOF
#ifdef GPIOG
static __IO uint16_t openFlagPortG = 0;
#endif // GPIOG
#ifdef GPIOH
static __IO uint16_t openFlagPortH = 0;
#endif // GPIOH
#ifdef GPIOI
static __IO uint16_t openFlagPortI = 0;
#endif // GPIOI
#ifdef GPIOJ
static __IO uint16_t openFlagPortJ = 0;
#endif // GPIOJ
#ifdef GPIOK
static __IO uint16_t openFlagPortK = 0;
#endif // GPIOK
/*!
\brief Open the general purpose I/O clock.
\param port: GPIO port.
*/
static void OpenGpioClock(XGpio::GpioPort port)
{
if(port == XGpio: ortA)
{
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
}
else if(port == XGpio: ortB)
{
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB);
}
else if(port == XGpio: ortC)
{
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOC);
}
#ifdef GPIOD
else if(port == XGpio: ortD)
{
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOD);
}
#endif // GPIOD
#ifdef GPIOE
else if(port == XGpio: ortE)
{
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOE);
}
#endif // GPIOE
#ifdef GPIOF
else if(port == XGpio: ortF)
{
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOF);
}
#endif // GPIOF
#ifdef GPIOG
else if(port == XGpio: ortG)
{
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOG);
}
#endif // GPIOG
#ifdef GPIOH
else if(port == XGpio: ortH)
{
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOH);
}
#endif // GPIOH
#ifdef GPIOI
else if(port == XGpio: ortI)
{
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOI);
}
#endif // GPIOI
#ifdef GPIOJ
else if(port == XGpio: ortJ)
{
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOJ);
}
#endif // GPIOJ
#ifdef GPIOK
else if(port == XGpio::PortK)
{
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOK);
}
#endif // GPIOK
}
/*!
\brief Close the general purpose I/O clock.
\param port: GPIO port.
*/
static void CloseGpioClock(XGpio::GpioPort port)
{
if(port == XGpio::PortA)
{
LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
}
else if(port == XGpio::PortB)
{
LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOB);
}
else if(port == XGpio::PortC)
{
LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOC);
}
#ifdef GPIOD
else if(port == XGpio::PortD)
{
LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOD);
}
#endif // GPIOD
#ifdef GPIOE
else if(port == XGpio::PortE)
{
LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOE);
}
#endif // GPIOE
#ifdef GPIOF
else if(port == XGpio::PortF)
{
LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOF);
}
#endif // GPIOF
#ifdef GPIOG
else if(port == XGpio::PortG)
{
LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOG);
}
#endif // GPIOG
#ifdef GPIOH
else if(port == XGpio::PortH)
{
LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOH);
}
#endif // GPIOH
#ifdef GPIOI
else if(port == XGpio::PortI)
{
LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOI);
}
#endif // GPIOI
#ifdef GPIOJ
else if(port == XGpio::PortJ)
{
LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOJ);
}
#endif // GPIOJ
#ifdef GPIOK
else if(port == XGpio::PortK)
{
LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_GPIOK);
}
#endif // GPIOK
}
/*!
\brief Set the general purpose I/O pin flag.
\param port: GPIO port.
\param pin: GPIO pin.
*/
static void SetGpioPinFlag(XGpio::GpioPort port, XGpio::GpioPin pin)
{
if(port == XGpio::PortA)
{
openFlagPortA |= pin;
}
else if(port == XGpio::PortB)
{
openFlagPortB |= pin;
}
else if(port == XGpio::PortC)
{
openFlagPortC |= pin;
}
#ifdef GPIOD
else if(port == XGpio::PortD)
{
openFlagPortD |= pin;
}
#endif // GPIOD
#ifdef GPIOE
else if(port == XGpio::PortE)
{
openFlagPortE |= pin;
}
#endif // GPIOE
#ifdef GPIOF
else if(port == XGpio::PortF)
{
openFlagPortF |= pin;
}
#endif // GPIOF
#ifdef GPIOG
else if(port == XGpio::PortG)
{
openFlagPortG |= pin;
}
#endif // GPIOG
#ifdef GPIOH
else if(port == XGpio::PortH)
{
openFlagPortH |= pin;
}
#endif // GPIOH
#ifdef GPIOI
else if(port == XGpio::PortI)
{
openFlagPortI |= pin;
}
#endif // GPIOI
#ifdef GPIOJ
else if(port == XGpio::PortJ)
{
openFlagPortJ |= pin;
}
#endif // GPIOJ
#ifdef GPIOK
else if(port == XGpio::PortK)
{
openFlagPortK |= pin;
}
#endif // GPIOK
}
/*!
\brief Reset the general purpose I/O pin flag.
\param port: GPIO port.
\param pin: GPIO pin.
*/
static void ResetGpioPinFlag(XGpio::GpioPort port, XGpio::GpioPin pin)
{
if(port == XGpio::PortA)
{
openFlagPortA &= ~pin;
}
else if(port == XGpio::PortB)
{
openFlagPortB &= ~pin;
}
else if(port == XGpio::PortC)
{
openFlagPortC &= ~pin;
}
#ifdef GPIOD
else if(port == XGpio::PortD)
{
openFlagPortD &= ~pin;
}
#endif // GPIOD
#ifdef GPIOE
else if(port == XGpio::PortE)
{
openFlagPortE &= ~pin;
}
#endif // GPIOE
#ifdef GPIOF
else if(port == XGpio::PortF)
{
openFlagPortF &= ~pin;
}
#endif // GPIOF
#ifdef GPIOG
else if(port == XGpio::PortG)
{
openFlagPortG &= ~pin;
}
#endif // GPIOG
#ifdef GPIOH
else if(port == XGpio::PortH)
{
openFlagPortH &= ~pin;
}
#endif // GPIOH
#ifdef GPIOI
else if(port == XGpio::PortI)
{
openFlagPortI &= ~pin;
}
#endif // GPIOI
#ifdef GPIOJ
else if(port == XGpio::PortJ)
{
openFlagPortJ &= ~pin;
}
#endif // GPIOJ
#ifdef GPIOK
else if(port == XGpio::PortK)
{
openFlagPortK &= ~pin;
}
#endif // GPIOK
}
/*!
\brief Is a general purpose I/O pin flag set?
\param port: GPIO port.
\param pin: GPIO pin.
\retval true: General purpose I/O pin flag are set.
\retval false: General purpose I/O pin flag is not set.
*/
static bool IsSetGpioPinFlag(XGpio::GpioPort port, XGpio::GpioPin pin)
{
if(port == XGpio::PortA)
{
return ((openFlagPortA & pin) == pin);
}
else if(port == XGpio::PortB)
{
return ((openFlagPortB & pin) == pin);
}
else if(port == XGpio::PortC)
{
return ((openFlagPortC & pin) == pin);
}
#ifdef GPIOD
else if(port == XGpio::PortD)
{
return ((openFlagPortD & pin) == pin);
}
#endif // GPIOD
#ifdef GPIOE
else if(port == XGpio::PortE)
{
return ((openFlagPortE & pin) == pin);
}
#endif // GPIOE
#ifdef GPIOF
else if(port == XGpio::PortF)
{
return ((openFlagPortF & pin) == pin);
}
#endif // GPIOF
#ifdef GPIOG
else if(port == XGpio::PortG)
{
return ((openFlagPortG & pin) == pin);
}
#endif // GPIOG
#ifdef GPIOH
else if(port == XGpio::PortH)
{
return ((openFlagPortH & pin) == pin);
}
#endif // GPIOH
#ifdef GPIOI
else if(port == XGpio::PortI)
{
return ((openFlagPortI & pin) == pin);
}
#endif // GPIOI
#ifdef GPIOJ
else if(port == XGpio::PortJ)
{
return ((openFlagPortJ & pin) == pin);
}
#endif // GPIOJ
#ifdef GPIOK
else if(port == XGpio::PortK)
{
return ((openFlagPortK & pin) == pin);
}
#endif // GPIOK
else
{
return true;
}
}
/*!
\brief Is there a general purpose I/O pin set flag?
\param port: GPIO port.
\retval true: There is a general purpose I/O pin set flag.
\retval false: There is no general purpose I/O pin set flag.
*/
static bool IsHaveSetGpioPinFlag(XGpio::GpioPort port)
{
if(port == XGpio::PortA)
{
return (openFlagPortA != 0);
}
else if(port == XGpio::PortB)
{
return (openFlagPortB != 0);
}
else if(port == XGpio::PortC)
{
return (openFlagPortC != 0);
}
#ifdef GPIOD
else if(port == XGpio::PortD)
{
return (openFlagPortD != 0);
}
#endif // GPIOD
#ifdef GPIOE
else if(port == XGpio::PortE)
{
return (openFlagPortE != 0);
}
#endif // GPIOE
#ifdef GPIOF
else if(port == XGpio::PortF)
{
return (openFlagPortF != 0);
}
#endif // GPIOF
#ifdef GPIOG
else if(port == XGpio::PortG)
{
return (openFlagPortG != 0);
}
#endif // GPIOG
#ifdef GPIOH
else if(port == XGpio::PortH)
{
return (openFlagPortH != 0);
}
#endif // GPIOH
#ifdef GPIOI
else if(port == XGpio::PortI)
{
return (openFlagPortI != 0);
}
#endif // GPIOI
#ifdef GPIOJ
else if(port == XGpio::PortJ)
{
return (openFlagPortJ != 0);
}
#endif // GPIOJ
#ifdef GPIOK
else if(port == XGpio::PortK)
{
return (openFlagPortK != 0);
}
#endif // GPIOK
else
{
return true;
}
}
/*!
\brief General purpose I/O module constructor.
\param port: GPIO port.
\param pin: GPIO pin.
\param mode: GPIO mode.
*/
XGpio::XGpio(GpioPort port, GpioPin pin, GpioMode mode)
{
this->port = port;
this->pin = pin;
this->mode = mode;
this->output = OutputPushPull;
this->speed = SpeedLow;
this->pull = PullNo;
this->alternate = Alternate0;
this->level = LevelLow;
this->openFlag = false;
}
/*!
\brief General purpose I / O module destructor.
\details Restore generic I/O to its default state(input mode, push-pull output,
low output speed, no pull, alternate function 0, low level).
*/
XGpio::~XGpio()
{
close();
}
/*!
\brief Set general purpose I/O port.
\param port: GPIO port.
*/
void XGpio::setPort(GpioPort port)
{
if(openFlag != true)
{
this->port = port;
}
}
/*!
\brief Get general purpose I/O port.
\return GPIO port.
*/
XGpio::GpioPort XGpio::getPort() const
{
return port;
}
/*!
\brief Set general purpose I/O pin.
\param pin: GPIO pin.
*/
void XGpio::setPin(GpioPin pin)
{
if(openFlag != true)
{
this->pin = pin;
}
}
/*!
\brief Get general purpose I/O pin.
\return GPIO pin.
*/
XGpio::GpioPin XGpio::getPin() const
{
return pin;
}
/*!
\brief Set general purpose I/O mode.
\param mode: GPIO mode.
*/
void XGpio::setMode(GpioMode mode)
{
this->mode = mode;
if(openFlag == true)
{
LL_GPIO_SetPinMode((GPIO_TypeDef *)port, pin, mode);
}
}
/*!
\brief Get general purpose I/O mode.
\return GPIO mode.
*/
XGpio::GpioMode XGpio::getMode() const
{
return mode;
}
/*!
\brief Set general purpose I/O output type.
\param output: GPIO output type.
*/
void XGpio::setOutput(GpioOutput output)
{
this->output = output;
if(openFlag == true)
{
LL_GPIO_SetPinOutputType((GPIO_TypeDef *)port, pin, output);
}
}
/*!
\brief Get general purpose I/O output type.
\return GPIO output type.
*/
XGpio::GpioOutput XGpio::getOutput() const
{
return output;
}
/*!
\brief Set general purpose I/O output speed.
\param speed: GPIO output speed.
*/
void XGpio::setSpeed(GpioSpeed speed)
{
this->speed = speed;
if(openFlag == true)
{
LL_GPIO_SetPinSpeed((GPIO_TypeDef *)port, pin, speed);
}
}
/*!
\brief Get general purpose I/O output speed.
\return GPIO output speed.
*/
XGpio::GpioSpeed XGpio::getSpeed() const
{
return speed;
}
/*!
\brief Set general purpose I/O pull-up/pull-down.
\param pull: GPIO pull-up/pull-down.
*/
void XGpio::setPull(GpioPull pull)
{
this->pull = pull;
if(openFlag == true)
{
LL_GPIO_SetPinPull((GPIO_TypeDef *)port, pin, pull);
}
}
/*!
\brief Get general purpose I/O pull-up/pull-down.
\return GPIO pull-up/pull-down.
*/
XGpio::GpioPull XGpio::getPull() const
{
return pull;
}
/*!
\brief Set general purpose I/O alternate function.
\param alternate: GPIO alternate function.
*/
void XGpio::setAlternate(GpioAlternate alternate)
{
this->alternate = alternate;
if(openFlag == true)
{
if(pin < Pin8)
{
LL_GPIO_SetAFPin_0_7((GPIO_TypeDef *)port, pin, alternate);
}
else
{
LL_GPIO_SetAFPin_8_15((GPIO_TypeDef *)port, pin, alternate);
}
}
}
/*!
\brief Get general purpose I/O alternate function.
\return GPIO alternate function.
*/
XGpio::GpioAlternate XGpio::getAlternate() const
{
return alternate;
}
/*!
\brief Set general purpose I/O level status.
\param level: GPIO level status.
*/
void XGpio::setLevel(GpioLevel level)
{
this->level = level;
if(openFlag == true)
{
if(level != LevelLow)
{
LL_GPIO_SetOutputPin((GPIO_TypeDef *)port, pin);
}
else
{
LL_GPIO_ResetOutputPin((GPIO_TypeDef *)port, pin);
}
}
}
/*!
\brief Get general purpose I/O level status.
\return GPIO level status.
*/
XGpio::GpioLevel XGpio::getLevel()
{
if(openFlag == true)
{
level = (GpioLevel)LL_GPIO_IsInputPinSet((GPIO_TypeDef *)port, pin);
}
return level;
}
/*!
\brief Toggle general purpose I/O level status.
*/
void XGpio::toggle()
{
level = level != LevelLow ? LevelLow : LevelHigh;
if(openFlag == true)
{
LL_GPIO_TogglePin((GPIO_TypeDef *)port, pin);
}
}
/*!
\brief Open general purpose I/O pin.
\retval true: General purpose I/O pin open success.
\retval false: General purpose I/O pin open failure.
*/
bool XGpio: pen()
{
if(IsSetGpioPinFlag(port, pin) != true)
{
if(IsHaveSetGpioPinFlag(port) != true)
{
OpenGpioClock(port);
}
SetGpioPinFlag(port, pin);
LL_GPIO_SetPinMode((GPIO_TypeDef *)port, pin, mode);
LL_GPIO_SetPinOutputType((GPIO_TypeDef *)port, pin, output);
LL_GPIO_SetPinSpeed((GPIO_TypeDef *)port, pin, speed);
LL_GPIO_SetPinPull((GPIO_TypeDef *)port, pin, pull);
if(pin < Pin8)
{
LL_GPIO_SetAFPin_0_7((GPIO_TypeDef *)port, pin, alternate);
}
else
{
LL_GPIO_SetAFPin_8_15((GPIO_TypeDef *)port, pin, alternate);
}
if(level != LevelLow)
{
LL_GPIO_SetOutputPin((GPIO_TypeDef *)port, pin);
}
else
{
LL_GPIO_ResetOutputPin((GPIO_TypeDef *)port, pin);
}
openFlag = true;
return true;
}
else
{
return false;
}
}
/*!
\brief Close general purpose I/O pin.
\details Restore generic I/O to its default state(input mode, push-pull output,
low output speed, no pull, alternate function 0, low level).
*/
void XGpio::close()
{
if(openFlag == true)
{
LL_GPIO_SetPinMode((GPIO_TypeDef *)port, pin, ModeInput);
LL_GPIO_SetPinOutputType((GPIO_TypeDef *)port, pin, OutputPushPull);
LL_GPIO_SetPinSpeed((GPIO_TypeDef *)port, pin, SpeedLow);
LL_GPIO_SetPinPull((GPIO_TypeDef *)port, pin, PullNo);
if(pin < Pin8)
{
LL_GPIO_SetAFPin_0_7((GPIO_TypeDef *)port, pin, Alternate0);
}
else
{
LL_GPIO_SetAFPin_8_15((GPIO_TypeDef *)port, pin, Alternate0);
}
LL_GPIO_ResetOutputPin((GPIO_TypeDef *)port, pin);
ResetGpioPinFlag(port, pin);
if(IsHaveSetGpioPinFlag(port) != true)
{
CloseGpioClock(port);
}
openFlag = false;
}
}
/*!
\brief Is the general purpose I/O pin open?
\retval true: General purpose I/O pin open.
\retval false: General purpose I/O pin not open.
*/
bool XGpio::isOpen() const
{
return openFlag;
}
[/mw_shl_code]
|
|