56 lines
1.4 KiB
C++
56 lines
1.4 KiB
C++
#ifndef _GPIO_CLASS_H_
|
|
#define _GPIO_CLASS_H_
|
|
#include "CH32V00xxx.h"
|
|
|
|
enum GPIO_MODE : uint32_t {
|
|
GPIO_Speed_In = 0u,
|
|
GPIO_Speed_10MHz = 1u,
|
|
GPIO_Speed_2MHz = 2u,
|
|
GPIO_Speed_50MHz = 3u,
|
|
};
|
|
enum GPIO_CNF : uint32_t {
|
|
GPIO_AI_PPO = 0u,
|
|
GPIO_FI_ODO = 1u << 2,
|
|
GPIO_UPDI_MPPO = 2u << 2,
|
|
GPIO_none_MPDO = 3u << 2,
|
|
};
|
|
enum GPIOPuPd_TypeDef {
|
|
GPIO_PuPd_NOPULL = 0x00,
|
|
GPIO_PuPd_UP = 0x01,
|
|
GPIO_PuPd_DOWN = 0x02
|
|
};
|
|
|
|
class GpioClass {
|
|
GPIOA_Type & port;
|
|
const uint32_t pin;
|
|
public:
|
|
explicit constexpr GpioClass (GPIOA_Type & _port, const uint32_t _pin, const uint32_t _mode = GPIO_AI_PPO | GPIO_Speed_10MHz) noexcept
|
|
: port(_port), pin(_pin) {
|
|
/* Zapneme vše, ono je to dost jedno. */
|
|
RCC.APB2PCENR.modify([](RCC_Type::APB2PCENR_DEF & r)->auto {
|
|
r.B.IOPAEN = SET;
|
|
r.B.IOPCEN = SET;
|
|
r.B.IOPDEN = SET;
|
|
return r.R;
|
|
});
|
|
const uint32_t pos = pin << 2;
|
|
port.CFGLR.modify([=](GPIOA_Type::CFGLR_DEF & r)->auto {
|
|
uint32_t t = r.R;
|
|
t &= ~(0xFu << pos);
|
|
t |= _mode << pos;
|
|
return t;
|
|
});
|
|
}
|
|
void operator<< (const bool b) const {
|
|
port.BSHR.R = b ? 1u << pin : 1u << (pin + 16);
|
|
}
|
|
operator bool () const {
|
|
return port.INDR.R & (1u << pin);
|
|
}
|
|
void setPuPd (GPIOPuPd_TypeDef p) {
|
|
if (p != GPIO_PuPd_UP) return;
|
|
port.OUTDR.R |= 1u << pin;
|
|
}
|
|
};
|
|
|
|
#endif // _GPIO_CLASS_H_
|