#pragma once #include #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 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(); }; } // namespace iflytop