重构输入输出端口Port的设计,F1与F0/F4的端口初始化结构体大小不一样,导致F0/F4不能仿照F1那样取巧

This commit is contained in:
大石头X2 2017-02-18 12:18:21 +08:00
parent fd612d1054
commit 8007f1d1fb
7 changed files with 76 additions and 79 deletions

View File

@ -13,10 +13,10 @@ static bool Port_Reserve(Pin pin, bool flag);
#ifdef REGION_Port
Port::Port()
{
_Pin = P0;
Opened = false;
Index = 0;
State = nullptr;
_Pin = P0;
Opened = false;
Index = 0;
State = nullptr;
}
#ifndef TINY
@ -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() {}
@ -167,9 +166,9 @@ OutputPort::OutputPort() : Port() { }
OutputPort::OutputPort(Pin pin) : OutputPort(pin, 2) { }
OutputPort::OutputPort(Pin pin, byte invert, bool openDrain, byte speed) : Port()
{
OpenDrain = openDrain;
Speed = speed;
Invert = invert;
OpenDrain = openDrain;
Speed = speed;
Invert = invert;
if (pin != P0)
{
@ -182,12 +181,12 @@ OutputPort& OutputPort::Init(Pin pin, bool invert)
{
Port::Set(pin);
Invert = invert;
Invert = 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);
}

View File

@ -3,18 +3,12 @@
#include "Kernel\Sys.h"
#ifdef STM32F4
#define GPIO_MAX_SPEED 100
#else
#define GPIO_MAX_SPEED 50
#endif
/******** 端口打开关闭流程 ********/
/*
Port::Open
#Port::Opening
OutputPort::OnOpen
#Port::OnOpen
OutputPort::OnOpen
#Port::OnOpen
#OutputPort::OpenPin
Port::Close
@ -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,12 +173,12 @@ public:
operator bool() const { return Read(); }
protected:
virtual void OnOpen();
virtual void OnOpen(void* param);
virtual void OnClose();
private:
bool _IRQ = false;
uint _task = 0; // 输入任务
UInt64 _Start = 0; // 开始按下时间
UInt64 _Last = 0; // 最后一次触发时间
@ -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 ********************************/

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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; //

View File

@ -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 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;