重构输入输出端口Port的设计,F1与F0/F4的端口初始化结构体大小不一样,导致F0/F4不能仿照F1那样取巧
This commit is contained in:
parent
fd612d1054
commit
8007f1d1fb
|
@ -85,7 +85,6 @@ bool Port::Open()
|
|||
#endif
|
||||
|
||||
Opening();
|
||||
OnOpen();
|
||||
|
||||
Opened = true;
|
||||
|
||||
|
@ -110,8 +109,8 @@ void Port::Close()
|
|||
Opened = false;
|
||||
}
|
||||
|
||||
WEAK void Port::Opening() {}
|
||||
WEAK void Port::OnOpen() {}
|
||||
WEAK void Port::Opening() { OnOpen(nullptr); }
|
||||
WEAK void Port::OnOpen(void* param) {}
|
||||
|
||||
WEAK void Port::OnClose() {}
|
||||
|
||||
|
@ -187,7 +186,7 @@ OutputPort& OutputPort::Init(Pin pin, bool invert)
|
|||
return *this;
|
||||
}
|
||||
|
||||
void OutputPort::OnOpen()
|
||||
void OutputPort::OnOpen(void* param)
|
||||
{
|
||||
TS("OutputPort::OnOpen");
|
||||
|
||||
|
@ -224,9 +223,9 @@ void OutputPort::OnOpen()
|
|||
debug_printf(" 初始电平=%d \r\n", rs);
|
||||
#endif
|
||||
|
||||
Port::OnOpen();
|
||||
Port::OnOpen(param);
|
||||
|
||||
OpenPin();
|
||||
OpenPin(param);
|
||||
}
|
||||
|
||||
WEAK bool OutputPort::ReadInput() const
|
||||
|
@ -289,7 +288,7 @@ AlternatePort::AlternatePort(Pin pin, byte invert, bool openDrain, byte speed)
|
|||
}
|
||||
}
|
||||
|
||||
WEAK void AlternatePort::OpenPin() { OutputPort::OpenPin(); }
|
||||
WEAK void AlternatePort::OpenPin(void* param) { OutputPort::OpenPin(param); }
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -400,7 +399,7 @@ void InputPort::InputNoIRQTask(void* param)
|
|||
port->OnPress(val);
|
||||
}
|
||||
|
||||
void InputPort::OnOpen()
|
||||
void InputPort::OnOpen(void* param)
|
||||
{
|
||||
TS("InputPort::OnOpen");
|
||||
|
||||
|
@ -420,8 +419,8 @@ void InputPort::OnOpen()
|
|||
bool fg = false;
|
||||
#endif
|
||||
|
||||
Port::OnOpen();
|
||||
OpenPin();
|
||||
Port::OnOpen(param);
|
||||
OpenPin(param);
|
||||
|
||||
// 根据倒置情况来获取初始状态,自动判断是否倒置
|
||||
bool rs = Port::Read();
|
||||
|
@ -480,13 +479,13 @@ bool InputPort::UsePress()
|
|||
|
||||
/******************************** AnalogInPort ********************************/
|
||||
|
||||
void AnalogInPort::OnOpen()
|
||||
void AnalogInPort::OnOpen(void* param)
|
||||
{
|
||||
#if DEBUG
|
||||
debug_printf("\r\n");
|
||||
#endif
|
||||
|
||||
Port::OnOpen();
|
||||
Port::OnOpen(param);
|
||||
|
||||
OpenPin();
|
||||
OpenPin(param);
|
||||
}
|
||||
|
|
|
@ -3,12 +3,6 @@
|
|||
|
||||
#include "Kernel\Sys.h"
|
||||
|
||||
#ifdef STM32F4
|
||||
#define GPIO_MAX_SPEED 100
|
||||
#else
|
||||
#define GPIO_MAX_SPEED 50
|
||||
#endif
|
||||
|
||||
/******** 端口打开关闭流程 ********/
|
||||
/*
|
||||
Port::Open
|
||||
|
@ -68,7 +62,7 @@ public:
|
|||
|
||||
protected:
|
||||
// 配置过程
|
||||
virtual void OnOpen();
|
||||
virtual void OnOpen(void* param);
|
||||
virtual void OnClose();
|
||||
|
||||
private:
|
||||
|
@ -83,11 +77,11 @@ class OutputPort : public Port
|
|||
public:
|
||||
byte Invert = 2; // 是否倒置输入输出。默认2表示自动检测
|
||||
bool OpenDrain = false; // 是否开漏输出
|
||||
byte Speed = GPIO_MAX_SPEED; // 速度
|
||||
byte Speed = 50; // 速度
|
||||
|
||||
OutputPort();
|
||||
OutputPort(Pin pin);
|
||||
OutputPort(Pin pin, byte invert, bool openDrain = false, byte speed = GPIO_MAX_SPEED);
|
||||
OutputPort(Pin pin, byte invert, bool openDrain = false, byte speed = 50);
|
||||
|
||||
OutputPort& Init(Pin pin, bool invert);
|
||||
|
||||
|
@ -109,8 +103,8 @@ public:
|
|||
operator bool() const { return Read(); }
|
||||
|
||||
protected:
|
||||
virtual void OnOpen();
|
||||
virtual void OpenPin();
|
||||
virtual void OnOpen(void* param);
|
||||
virtual void OpenPin(void* param);
|
||||
|
||||
private:
|
||||
};
|
||||
|
@ -123,11 +117,11 @@ class AlternatePort : public OutputPort
|
|||
public:
|
||||
AlternatePort();
|
||||
AlternatePort(Pin pin);
|
||||
AlternatePort(Pin pin, byte invert, bool openDrain = false, byte speed = GPIO_MAX_SPEED);
|
||||
AlternatePort(Pin pin, byte invert, bool openDrain = false, byte speed = 50);
|
||||
|
||||
protected:
|
||||
//virtual void OnOpen();
|
||||
virtual void OpenPin();
|
||||
virtual void OpenPin(void* param);
|
||||
|
||||
private:
|
||||
};
|
||||
|
@ -179,7 +173,7 @@ public:
|
|||
operator bool() const { return Read(); }
|
||||
|
||||
protected:
|
||||
virtual void OnOpen();
|
||||
virtual void OnOpen(void* param);
|
||||
virtual void OnClose();
|
||||
|
||||
private:
|
||||
|
@ -192,7 +186,7 @@ private:
|
|||
static void InputNoIRQTask(void* param);
|
||||
|
||||
private:
|
||||
void OpenPin();
|
||||
void OpenPin(void* param);
|
||||
void ClosePin();
|
||||
bool OnRegister();
|
||||
byte _Value = 0; // 当前值
|
||||
|
@ -209,10 +203,10 @@ public:
|
|||
AnalogInPort(Pin pin) : Port() { Set(pin); Open(); }
|
||||
|
||||
protected:
|
||||
virtual void OnOpen();
|
||||
virtual void OnOpen(void* param);
|
||||
|
||||
private:
|
||||
void OpenPin();
|
||||
void OpenPin(void* param);
|
||||
};
|
||||
|
||||
/******************************** PortScope ********************************/
|
||||
|
|
|
@ -43,16 +43,20 @@ void Port::Opening()
|
|||
|
||||
//auto gpio = new GPIO_InitTypeDef();
|
||||
// 刚好4字节,不用申请内存啦
|
||||
auto gpio = (GPIO_InitTypeDef*)&State;
|
||||
//auto gpio = (GPIO_InitTypeDef*)param;
|
||||
// 该结构体在F1与F0/F4的大小不一样
|
||||
GPIO_InitTypeDef gpio;
|
||||
// 特别要慎重,有些结构体成员可能因为没有初始化而酿成大错
|
||||
GPIO_StructInit(gpio);
|
||||
GPIO_StructInit(&gpio);
|
||||
|
||||
OnOpen(&gpio);
|
||||
}
|
||||
|
||||
WEAK void Port_OnOpen(Pin pin) {}
|
||||
|
||||
void Port::OnOpen()
|
||||
void Port::OnOpen(void* param)
|
||||
{
|
||||
auto gpio = (GPIO_InitTypeDef*)&State;
|
||||
auto gpio = (GPIO_InitTypeDef*)param;
|
||||
gpio->GPIO_Pin = 1 << (_Pin & 0x0F);
|
||||
|
||||
Port_OnOpen(_Pin);
|
||||
|
|
|
@ -40,11 +40,11 @@ void Port::AFConfig(GPIO_AF GPIO_AF) const
|
|||
#define REGION_Output 1
|
||||
#ifdef REGION_Output
|
||||
|
||||
void OutputPort::OpenPin()
|
||||
void OutputPort::OpenPin(void* param)
|
||||
{
|
||||
assert(Speed == 2 || Speed == 10 || Speed == 50, "Speed");
|
||||
|
||||
auto gpio = (GPIO_InitTypeDef*)&State;
|
||||
auto gpio = (GPIO_InitTypeDef*)param;
|
||||
|
||||
switch(Speed)
|
||||
{
|
||||
|
@ -61,9 +61,9 @@ void OutputPort::OpenPin()
|
|||
|
||||
/******************************** AlternatePort ********************************/
|
||||
|
||||
void AlternatePort::OpenPin()
|
||||
void AlternatePort::OpenPin(void* param)
|
||||
{
|
||||
auto gpio = (GPIO_InitTypeDef*)&State;
|
||||
auto gpio = (GPIO_InitTypeDef*)param;
|
||||
|
||||
gpio->GPIO_Mode = GPIO_Mode_AF;
|
||||
gpio->GPIO_OType = OpenDrain ? GPIO_OType_OD : GPIO_OType_PP;
|
||||
|
@ -84,9 +84,9 @@ extern bool InputPort_HasEXTI(int line, const InputPort& port);
|
|||
extern void GPIO_ISR(int num);
|
||||
extern void SetEXIT(int pinIndex, bool enable, InputPort::Trigger mode);
|
||||
|
||||
void InputPort::OpenPin()
|
||||
void InputPort::OpenPin(void* param)
|
||||
{
|
||||
auto gpio = (GPIO_InitTypeDef*)&State;
|
||||
auto gpio = (GPIO_InitTypeDef*)param;
|
||||
|
||||
gpio->GPIO_Mode = GPIO_Mode_IN;
|
||||
//gpio->GPIO_OType = !Floating ? GPIO_OType_OD : GPIO_OType_PP;
|
||||
|
@ -159,9 +159,9 @@ void InputPort_OpenEXTI(InputPort& port)
|
|||
|
||||
/******************************** AnalogInPort ********************************/
|
||||
|
||||
void AnalogInPort::OpenPin()
|
||||
void AnalogInPort::OpenPin(void* param)
|
||||
{
|
||||
auto gpio = (GPIO_InitTypeDef*)&State;
|
||||
auto gpio = (GPIO_InitTypeDef*)param;
|
||||
|
||||
gpio->GPIO_Mode = GPIO_Mode_AN;
|
||||
//gpio->GPIO_OType = !Floating ? GPIO_OType_OD : GPIO_OType_PP;
|
||||
|
|
|
@ -40,11 +40,11 @@ void Port::AFConfig(GPIO_AF GPIO_AF) const
|
|||
#define REGION_Output 1
|
||||
#ifdef REGION_Output
|
||||
|
||||
void OutputPort::OpenPin()
|
||||
void OutputPort::OpenPin(void* param)
|
||||
{
|
||||
assert(Speed == 2 || Speed == 10 || Speed == 50, "Speed");
|
||||
|
||||
auto gpio = (GPIO_InitTypeDef*)&State;
|
||||
auto gpio = (GPIO_InitTypeDef*)param;
|
||||
|
||||
switch(Speed)
|
||||
{
|
||||
|
@ -61,9 +61,9 @@ void OutputPort::OpenPin()
|
|||
|
||||
/******************************** AlternatePort ********************************/
|
||||
|
||||
void AlternatePort::OpenPin()
|
||||
void AlternatePort::OpenPin(void* param)
|
||||
{
|
||||
auto gpio = (GPIO_InitTypeDef*)&State;
|
||||
auto gpio = (GPIO_InitTypeDef*)param;
|
||||
|
||||
gpio->GPIO_Mode = GPIO_Mode_AF;
|
||||
gpio->GPIO_OType = OpenDrain ? GPIO_OType_OD : GPIO_OType_PP;
|
||||
|
@ -84,9 +84,9 @@ extern bool InputPort_HasEXTI(int line, const InputPort& port);
|
|||
extern void GPIO_ISR(int num);
|
||||
extern void SetEXIT(int pinIndex, bool enable, InputPort::Trigger mode);
|
||||
|
||||
void InputPort::OpenPin()
|
||||
void InputPort::OpenPin(void* param)
|
||||
{
|
||||
auto gpio = (GPIO_InitTypeDef*)&State;
|
||||
auto gpio = (GPIO_InitTypeDef*)param;
|
||||
|
||||
gpio->GPIO_Mode = GPIO_Mode_IN;
|
||||
//gpio->GPIO_OType = !Floating ? GPIO_OType_OD : GPIO_OType_PP;
|
||||
|
@ -159,9 +159,9 @@ void InputPort_OpenEXTI(InputPort& port)
|
|||
|
||||
/******************************** AnalogInPort ********************************/
|
||||
|
||||
void AnalogInPort::OpenPin()
|
||||
void AnalogInPort::OpenPin(void* param)
|
||||
{
|
||||
auto gpio = (GPIO_InitTypeDef*)&State;
|
||||
auto gpio = (GPIO_InitTypeDef*)param;
|
||||
|
||||
gpio->GPIO_Mode = GPIO_Mode_AN;
|
||||
//gpio->GPIO_OType = !Floating ? GPIO_OType_OD : GPIO_OType_PP;
|
||||
|
|
|
@ -57,11 +57,11 @@ void Port::RemapConfig(uint param, bool sta)
|
|||
#define REGION_Output 1
|
||||
#ifdef REGION_Output
|
||||
|
||||
void OutputPort::OpenPin()
|
||||
void OutputPort::OpenPin(void* param)
|
||||
{
|
||||
assert(Speed == 2 || Speed == 10 || Speed == 50, "Speed");
|
||||
|
||||
auto gpio = (GPIO_InitTypeDef*)&State;
|
||||
auto gpio = (GPIO_InitTypeDef*)param;
|
||||
|
||||
switch(Speed)
|
||||
{
|
||||
|
@ -77,9 +77,9 @@ void OutputPort::OpenPin()
|
|||
|
||||
/******************************** AlternatePort ********************************/
|
||||
|
||||
void AlternatePort::OpenPin()
|
||||
void AlternatePort::OpenPin(void* param)
|
||||
{
|
||||
auto gpio = (GPIO_InitTypeDef*)&State;
|
||||
auto gpio = (GPIO_InitTypeDef*)param;
|
||||
|
||||
gpio->GPIO_Mode = OpenDrain ? GPIO_Mode_AF_OD : GPIO_Mode_AF_PP;
|
||||
|
||||
|
@ -99,9 +99,9 @@ extern bool InputPort_HasEXTI(int line, const InputPort& port);
|
|||
extern void GPIO_ISR(int num);
|
||||
extern void SetEXIT(int pinIndex, bool enable, InputPort::Trigger mode);
|
||||
|
||||
void InputPort::OpenPin()
|
||||
void InputPort::OpenPin(void* param)
|
||||
{
|
||||
auto gpio = (GPIO_InitTypeDef*)&State;
|
||||
auto gpio = (GPIO_InitTypeDef*)param;
|
||||
|
||||
if(Floating)
|
||||
gpio->GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
||||
|
@ -181,9 +181,9 @@ void InputPort_OpenEXTI(InputPort& port)
|
|||
|
||||
/******************************** AnalogInPort ********************************/
|
||||
|
||||
void AnalogInPort::OpenPin()
|
||||
void AnalogInPort::OpenPin(void* param)
|
||||
{
|
||||
auto gpio = (GPIO_InitTypeDef*)&State;
|
||||
auto gpio = (GPIO_InitTypeDef*)param;
|
||||
|
||||
gpio->GPIO_Mode = GPIO_Mode_AIN; //
|
||||
|
||||
|
|
|
@ -39,18 +39,18 @@ void Port::AFConfig(GPIO_AF GPIO_AF) const
|
|||
#define REGION_Output 1
|
||||
#ifdef REGION_Output
|
||||
|
||||
void OutputPort::OpenPin()
|
||||
void OutputPort::OpenPin(void* param)
|
||||
{
|
||||
assert(Speed == 2 || Speed == 25 || Speed == 50 || Speed == 100, "Speed");
|
||||
|
||||
auto gpio = (GPIO_InitTypeDef*)&State;
|
||||
auto gpio = (GPIO_InitTypeDef*)param;
|
||||
|
||||
switch(Speed)
|
||||
{
|
||||
case 2: gpio->GPIO_Speed = GPIO_Speed_2MHz; break;
|
||||
case 25: gpio->GPIO_Speed = GPIO_Speed_25MHz; break;
|
||||
case 100: gpio->GPIO_Speed = GPIO_Speed_100MHz;break;
|
||||
case 50: gpio->GPIO_Speed = GPIO_Speed_50MHz; break;
|
||||
case 100: gpio->GPIO_Speed = GPIO_Speed_100MHz; break;
|
||||
}
|
||||
|
||||
gpio->GPIO_Mode = GPIO_Mode_OUT;
|
||||
|
@ -61,9 +61,9 @@ void OutputPort::OpenPin()
|
|||
|
||||
/******************************** AlternatePort ********************************/
|
||||
|
||||
void AlternatePort::OpenPin()
|
||||
void AlternatePort::OpenPin(void* param)
|
||||
{
|
||||
auto gpio = (GPIO_InitTypeDef*)&State;
|
||||
auto gpio = (GPIO_InitTypeDef*)param;
|
||||
|
||||
gpio->GPIO_Mode = GPIO_Mode_AF;
|
||||
gpio->GPIO_OType = OpenDrain ? GPIO_OType_OD : GPIO_OType_PP;
|
||||
|
@ -84,9 +84,9 @@ extern bool InputPort_HasEXTI(int line, const InputPort& port);
|
|||
extern void GPIO_ISR(int num);
|
||||
extern void SetEXIT(int pinIndex, bool enable, InputPort::Trigger mode);
|
||||
|
||||
void InputPort::OpenPin()
|
||||
void InputPort::OpenPin(void* param)
|
||||
{
|
||||
auto gpio = (GPIO_InitTypeDef*)&State;
|
||||
auto gpio = (GPIO_InitTypeDef*)param;
|
||||
|
||||
gpio->GPIO_Mode = GPIO_Mode_IN;
|
||||
//gpio->GPIO_OType = !Floating ? GPIO_OType_OD : GPIO_OType_PP;
|
||||
|
@ -162,9 +162,9 @@ void InputPort_OpenEXTI(InputPort& port)
|
|||
|
||||
/******************************** AnalogInPort ********************************/
|
||||
|
||||
void AnalogInPort::OpenPin()
|
||||
void AnalogInPort::OpenPin(void* param)
|
||||
{
|
||||
auto gpio = (GPIO_InitTypeDef*)&State;
|
||||
auto gpio = (GPIO_InitTypeDef*)param;
|
||||
|
||||
gpio->GPIO_Mode = GPIO_Mode_AN;
|
||||
//gpio->GPIO_OType = !Floating ? GPIO_OType_OD : GPIO_OType_PP;
|
||||
|
|
Loading…
Reference in New Issue