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.
87 lines
2.1 KiB
87 lines
2.1 KiB
|
|
#pragma once
|
|
#include <functional>
|
|
|
|
#include "../chip/iflytop_no_os.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;
|
|
|
|
private:
|
|
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;
|
|
|
|
onirq_t m_onirq;
|
|
|
|
public:
|
|
ZGPIO(){};
|
|
|
|
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 regListener(onirq_t listener);
|
|
|
|
bool isMirror();
|
|
bool isItRisingEXITGPIO();
|
|
bool isItFallingEXITGPIO();
|
|
bool isItRisingAndItFallingEXITGPIO();
|
|
|
|
/*******************************************************************************
|
|
* 基本状态读写 *
|
|
*******************************************************************************/
|
|
|
|
bool getState();
|
|
uint32_t getStateUint32();
|
|
bool setState(bool state);
|
|
void toggleState();
|
|
|
|
/*******************************************************************************
|
|
* 辅助方法 *
|
|
*******************************************************************************/
|
|
IRQn_Type getEXTIIRQn();
|
|
GPIO_TypeDef *getPort() { return m_gpio; }
|
|
uint16_t getPin() { return m_pinoff; }
|
|
|
|
bool tryTriggerIRQ(uint16_t GPIO_Pin);
|
|
|
|
private:
|
|
bool enableClock();
|
|
};
|
|
|
|
class STM32_GPIO_LISTENER {
|
|
public:
|
|
virtual void STM32_GPIO_onIRQ(ZGPIO *GPIO_Pin, ZGPIO::IrqTypeEvent_t irqevent) {}
|
|
};
|
|
|
|
} // namespace iflytop
|