You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
235 lines
6.2 KiB
235 lines
6.2 KiB
#pragma once
|
|
#include <functional>
|
|
|
|
#include "stm32/stm32.hpp"
|
|
extern "C" {
|
|
#include "logger.h"
|
|
}
|
|
namespace iflytop {
|
|
using namespace std;
|
|
|
|
#define STM32_GPIO_LISTENER_NUM 10
|
|
class ZGPIO {
|
|
public:
|
|
typedef enum {
|
|
kRisingIrqEvent,
|
|
kFallingIrqEvent,
|
|
} IrqTypeEvent_t;
|
|
|
|
typedef enum {
|
|
kMode_nopull, //
|
|
kMode_pullup, //
|
|
kMode_pulldown, //
|
|
kMode_od, //
|
|
} GPIOMode_t;
|
|
|
|
typedef enum { kType_AIN, kType_Input, kType_Output } GPIOType_t;
|
|
|
|
typedef enum {
|
|
kIRQ_noIrq,
|
|
kIRQ_risingIrq,
|
|
kIRQ_fallingIrq,
|
|
kIRQ_risingAndFallingIrq,
|
|
} GPIOIrqType_t;
|
|
|
|
typedef function<void(ZGPIO *GPIO_Pin, IrqTypeEvent_t irqevent)> onirq_t;
|
|
|
|
typedef struct {
|
|
Pin_t pin;
|
|
GPIOMode_t mode;
|
|
GPIOIrqType_t irqtype;
|
|
bool mirror;
|
|
} InputGpioCfg_t;
|
|
|
|
typedef struct {
|
|
Pin_t pin;
|
|
GPIOMode_t mode;
|
|
bool mirror;
|
|
bool initLevel;
|
|
bool log_when_setstate;
|
|
} OutputGpioCfg_t;
|
|
|
|
private:
|
|
Pin_t m_pin = PinNull;
|
|
GPIO_TypeDef *m_gpio;
|
|
uint16_t m_pinoff;
|
|
GPIOType_t m_gpiotype;
|
|
GPIOMode_t m_mode;
|
|
GPIOIrqType_t m_irqtype;
|
|
bool m_mirror;
|
|
bool lastLevel;
|
|
bool m_log_when_setstate = false;
|
|
|
|
onirq_t m_onirq;
|
|
bool m_initflag;
|
|
bool m_preset_pin = false;
|
|
|
|
public:
|
|
ZGPIO(){};
|
|
ZGPIO(Pin_t pin) {
|
|
m_pin = pin;
|
|
m_preset_pin = true;
|
|
};
|
|
|
|
void initAsInput(Pin_t pin, GPIOMode_t mode, GPIOIrqType_t irqtype, bool mirror);
|
|
void initAsOutput(Pin_t pin, GPIOMode_t mode, bool mirror, bool initLevel);
|
|
void initAsOutput(OutputGpioCfg_t *outputcfg) {
|
|
m_log_when_setstate = outputcfg->log_when_setstate;
|
|
initAsOutput(outputcfg->pin, outputcfg->mode, outputcfg->mirror, outputcfg->initLevel);
|
|
}
|
|
void initAsInput(InputGpioCfg_t *inputcfg) { initAsInput(inputcfg->pin, inputcfg->mode, inputcfg->irqtype, inputcfg->mirror); }
|
|
|
|
void initAsInput(GPIOMode_t mode, GPIOIrqType_t irqtype, bool mirror) {
|
|
ZASSERT(m_preset_pin);
|
|
initAsInput(m_pin, mode, irqtype, mirror);
|
|
}
|
|
|
|
|
|
void initAsOutput(GPIOMode_t mode, bool mirror, bool initLevel) {
|
|
ZASSERT(m_preset_pin);
|
|
initAsOutput(m_pin, mode, mirror, initLevel);
|
|
}
|
|
|
|
void enableTrace(bool enable) { m_log_when_setstate = enable; }
|
|
void regListener(onirq_t listener);
|
|
|
|
bool isMirror();
|
|
bool isItRisingEXITGPIO();
|
|
bool isItFallingEXITGPIO();
|
|
bool isItRisingAndItFallingEXITGPIO();
|
|
|
|
bool getState();
|
|
uint32_t getStateUint32();
|
|
bool setState(bool state);
|
|
void toggleState();
|
|
|
|
bool isNull() { return m_pin == PinNull; }
|
|
|
|
Pin_t getPin() { return m_pin; }
|
|
|
|
IRQn_Type getEXTIIRQn();
|
|
GPIO_TypeDef *getHalPinPort() { return m_gpio; }
|
|
uint16_t getHalPin() { return m_pinoff; }
|
|
|
|
bool tryTriggerIRQ(uint16_t GPIO_Pin);
|
|
|
|
bool isInit() { return m_initflag; }
|
|
|
|
private:
|
|
bool enableClock();
|
|
};
|
|
|
|
} // namespace iflytop
|
|
|
|
extern iflytop::ZGPIO IO_PA0;
|
|
extern iflytop::ZGPIO IO_PA1;
|
|
extern iflytop::ZGPIO IO_PA2;
|
|
extern iflytop::ZGPIO IO_PA3;
|
|
extern iflytop::ZGPIO IO_PA4;
|
|
extern iflytop::ZGPIO IO_PA5;
|
|
extern iflytop::ZGPIO IO_PA6;
|
|
extern iflytop::ZGPIO IO_PA7;
|
|
extern iflytop::ZGPIO IO_PA8;
|
|
extern iflytop::ZGPIO IO_PA9;
|
|
extern iflytop::ZGPIO IO_PA10;
|
|
extern iflytop::ZGPIO IO_PA11;
|
|
extern iflytop::ZGPIO IO_PA12;
|
|
extern iflytop::ZGPIO IO_PA13;
|
|
extern iflytop::ZGPIO IO_PA14;
|
|
extern iflytop::ZGPIO IO_PA15;
|
|
extern iflytop::ZGPIO IO_PB0;
|
|
extern iflytop::ZGPIO IO_PB1;
|
|
extern iflytop::ZGPIO IO_PB2;
|
|
extern iflytop::ZGPIO IO_PB3;
|
|
extern iflytop::ZGPIO IO_PB4;
|
|
extern iflytop::ZGPIO IO_PB5;
|
|
extern iflytop::ZGPIO IO_PB6;
|
|
extern iflytop::ZGPIO IO_PB7;
|
|
extern iflytop::ZGPIO IO_PB8;
|
|
extern iflytop::ZGPIO IO_PB9;
|
|
extern iflytop::ZGPIO IO_PB10;
|
|
extern iflytop::ZGPIO IO_PB11;
|
|
extern iflytop::ZGPIO IO_PB12;
|
|
extern iflytop::ZGPIO IO_PB13;
|
|
extern iflytop::ZGPIO IO_PB14;
|
|
extern iflytop::ZGPIO IO_PB15;
|
|
extern iflytop::ZGPIO IO_PC0;
|
|
extern iflytop::ZGPIO IO_PC1;
|
|
extern iflytop::ZGPIO IO_PC2;
|
|
extern iflytop::ZGPIO IO_PC3;
|
|
extern iflytop::ZGPIO IO_PC4;
|
|
extern iflytop::ZGPIO IO_PC5;
|
|
extern iflytop::ZGPIO IO_PC6;
|
|
extern iflytop::ZGPIO IO_PC7;
|
|
extern iflytop::ZGPIO IO_PC8;
|
|
extern iflytop::ZGPIO IO_PC9;
|
|
extern iflytop::ZGPIO IO_PC10;
|
|
extern iflytop::ZGPIO IO_PC11;
|
|
extern iflytop::ZGPIO IO_PC12;
|
|
extern iflytop::ZGPIO IO_PC13;
|
|
extern iflytop::ZGPIO IO_PC14;
|
|
extern iflytop::ZGPIO IO_PC15;
|
|
extern iflytop::ZGPIO IO_PD0;
|
|
extern iflytop::ZGPIO IO_PD1;
|
|
extern iflytop::ZGPIO IO_PD2;
|
|
extern iflytop::ZGPIO IO_PD3;
|
|
extern iflytop::ZGPIO IO_PD4;
|
|
extern iflytop::ZGPIO IO_PD5;
|
|
extern iflytop::ZGPIO IO_PD6;
|
|
extern iflytop::ZGPIO IO_PD7;
|
|
extern iflytop::ZGPIO IO_PD8;
|
|
extern iflytop::ZGPIO IO_PD9;
|
|
extern iflytop::ZGPIO IO_PD10;
|
|
extern iflytop::ZGPIO IO_PD11;
|
|
extern iflytop::ZGPIO IO_PD12;
|
|
extern iflytop::ZGPIO IO_PD13;
|
|
extern iflytop::ZGPIO IO_PD14;
|
|
extern iflytop::ZGPIO IO_PD15;
|
|
extern iflytop::ZGPIO IO_PE0;
|
|
extern iflytop::ZGPIO IO_PE1;
|
|
extern iflytop::ZGPIO IO_PE2;
|
|
extern iflytop::ZGPIO IO_PE3;
|
|
extern iflytop::ZGPIO IO_PE4;
|
|
extern iflytop::ZGPIO IO_PE5;
|
|
extern iflytop::ZGPIO IO_PE6;
|
|
extern iflytop::ZGPIO IO_PE7;
|
|
extern iflytop::ZGPIO IO_PE8;
|
|
extern iflytop::ZGPIO IO_PE9;
|
|
extern iflytop::ZGPIO IO_PE10;
|
|
extern iflytop::ZGPIO IO_PE11;
|
|
extern iflytop::ZGPIO IO_PE12;
|
|
extern iflytop::ZGPIO IO_PE13;
|
|
extern iflytop::ZGPIO IO_PE14;
|
|
extern iflytop::ZGPIO IO_PE15;
|
|
extern iflytop::ZGPIO IO_PF0;
|
|
extern iflytop::ZGPIO IO_PF1;
|
|
extern iflytop::ZGPIO IO_PF2;
|
|
extern iflytop::ZGPIO IO_PF3;
|
|
extern iflytop::ZGPIO IO_PF4;
|
|
extern iflytop::ZGPIO IO_PF5;
|
|
extern iflytop::ZGPIO IO_PF6;
|
|
extern iflytop::ZGPIO IO_PF7;
|
|
extern iflytop::ZGPIO IO_PF8;
|
|
extern iflytop::ZGPIO IO_PF9;
|
|
extern iflytop::ZGPIO IO_PF10;
|
|
extern iflytop::ZGPIO IO_PF11;
|
|
extern iflytop::ZGPIO IO_PF12;
|
|
extern iflytop::ZGPIO IO_PF13;
|
|
extern iflytop::ZGPIO IO_PF14;
|
|
extern iflytop::ZGPIO IO_PF15;
|
|
extern iflytop::ZGPIO IO_PG0;
|
|
extern iflytop::ZGPIO IO_PG1;
|
|
extern iflytop::ZGPIO IO_PG2;
|
|
extern iflytop::ZGPIO IO_PG3;
|
|
extern iflytop::ZGPIO IO_PG4;
|
|
extern iflytop::ZGPIO IO_PG5;
|
|
extern iflytop::ZGPIO IO_PG6;
|
|
extern iflytop::ZGPIO IO_PG7;
|
|
extern iflytop::ZGPIO IO_PG8;
|
|
extern iflytop::ZGPIO IO_PG9;
|
|
extern iflytop::ZGPIO IO_PG10;
|
|
extern iflytop::ZGPIO IO_PG11;
|
|
extern iflytop::ZGPIO IO_PG12;
|
|
extern iflytop::ZGPIO IO_PG13;
|
|
extern iflytop::ZGPIO IO_PG14;
|
|
extern iflytop::ZGPIO IO_PG15;
|