请教C语言代码架构

2019-07-21 07:17发布



使用STM32F103做MCU,在项目中用到6个称重模块,除了IO引脚不同,程序的其它是完全相同的。
现在是用define定义的
//////////////称重传感器IO口定义///////////////////
#define HX711R1CC       RCC_APB2Periph_GPIOD
#define HX711_PORT1      GPIOD
#define PSCK1   PDout(1)
#define DOUT1   PDin(0)

#define HX711R2CC       RCC_APB2Periph_GPIOA
#define HX711_PORT2      GPIOA

#define HX711R3CC       RCC_APB2Periph_GPIOC
#define HX711_PORT3      GPIOC

#define HX711R4CC       RCC_APB2Periph_GPIOD
#define HX711_PORT24     GPIOD

代码写了相似的6个



void Init_HX711pin(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);         //使能端口时钟

        //PSCK1
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                 // 端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                 //IO口速度为2MHz
        GPIO_Init(GPIOD, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOB
       
        //DOUT1
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOD, &GPIO_InitStructure);  
       
        GPIO_SetBits(GPIOD,GPIO_Pin_0);                                        //初始化设置为0
}



//****************************************************
//读取HX711
//****************************************************
unsigned long HX711_Read(void)
{
        unsigned long count;
        unsigned char i;
          DOUT1=1;
        delay_us(1);
          PSCK1=0;
          count=0;
          while(DOUT1);
          for(i=0;i<24;i++)
        {
                  PSCK1=1;
                  count=count<<1;
                delay_us(1);
                PSCK1=0;
                  if(DOUT1)
                        count++;
                delay_us(1);
        }
        PSCK1=1;
        delay_us(1);
        PSCK1=0;
       
        delay_us(1);
        PSCK1=1;
        delay_us(1);
        PSCK1=0;
       
        delay_us(1);
        PSCK1=1;
        count=count^0x800000;
        delay_us(1);
        PSCK1=0;
       
       
        return(count);
}


有没有办法能用统一的函数来实现功能,把IO口的定义当做参数传进去?这样就可以避免写6个相似Init和read的代码了。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
ufbycd
1楼-- · 2019-07-21 09:33
就是将IO的底层封装一下嘛,给你看看下我的项目上的做法

头文件
[mw_shl_code=c,true]
#ifndef HW_H_
#define HW_H_


#include "main.h"
#include "message_queue.h"

typedef enum
{
    HW_Level_Low = Bit_RESET,
    HW_Level_High = Bit_SET
}HW_Level_t;

typedef enum
{
    HW_Status_Inactive = DISABLE,
    HW_Status_Active =  ENABLE
}HW_Status_t;

typedef enum
{
    HW_In_S1,
    HW_In_S2,
    HW_In_S3,
    HW_In_S4,
    HW_In_S5,
    HW_In_1FB,
    HW_In_2FB,
    HW_In_3FB,
    HW_In_4FB,
    HW_In_5FB,
    HW_In_6FB,
    HW_In_7FB,
    HW_In_ALM1,
    HW_In_ALM3,
    HW_In_Arrival1,
    HW_In_Arrival3,
    HW_In_None,
}HW_In_t;

typedef enum
{
    HW_Out_Led,
    HW_Out_Rs485De1,
    HW_Out_EN1,
    HW_Out_EN2,
    HW_Out_EN3,
    HW_Out_DIR1,
    HW_Out_DIR2,
    HW_Out_DIR3,
    HW_Out_Brak1,
    HW_Out_Brak3,
    HW_Out_Magnet,
    HW_Out_1_2D,
    HW_Out_3_4D,
    HW_Out_5_6D,
    HW_Out_7D,
    HW_Out_None,
}HW_Out_t;

typedef enum
{
    HW_Exti_1,
    HW_Exti_2,
    HW_Exti_3,
    HW_Exti_4,
    HW_Exti_5,
    HW_Exti_6,
    HW_Exti_7,
    HW_Exti_8,

    HW_Exti_Max = HW_Exti_8
}HW_Exti_t;

typedef void (*HW_ExtiCallback_t)(int data);

void HW_Init(void);
void HW_SetExtiCallback(HW_Exti_t exti, HW_ExtiCallback_t cb, int data);

void HW_Set(HW_Out_t out, HW_Level_t level);
HW_Level_t HW_GetSetted(HW_Out_t out);
void HW_Config(HW_Out_t out, HW_Status_t status);
HW_Status_t HW_IsConfigedActive(HW_Out_t out);
void HW_Trigger(HW_Out_t out);

HW_Level_t HW_Get(HW_In_t in);
int HW_IsActive(HW_In_t in);
int HW_IsExtiActive(HW_Exti_t exti);

unsigned int HW_ReadBoardAddres(void);
int HW_IoInCmd(int argc, char *argv[]);
int HW_IoOutCmd(int argc, char *argv[]);
void HW_OnExtiMsg(MsgQueue_Msg_t *msg);

#endif /* HW_H_ */[/mw_shl_code]

源文件
[mw_shl_code=c,true]#include "hw.h"

#include <stdlib.h>
#include <string.h>
#include <ctype.h>

static const struct
{
    GPIO_TypeDef *port;
    uint16_t pin;
    HW_Level_t activeLevel;
} _ins[] =
{
        {GPIOB, GPIO_Pin_3,  HW_Level_Low},  // HW_In_S1,
        {GPIOD, GPIO_Pin_2,  HW_Level_Low},  // HW_In_S2,
        {GPIOC, GPIO_Pin_12, HW_Level_Low},  // HW_In_S3,
        {GPIOC, GPIO_Pin_11, HW_Level_Low},  // HW_In_S4,
        {GPIOC, GPIO_Pin_10, HW_Level_Low},  // HW_In_S5,
        {GPIOB, GPIO_Pin_9,  HW_Level_Low},  // HW_In_1FB,
        {GPIOB, GPIO_Pin_8,  HW_Level_Low},  // HW_In_2FB,
        {GPIOA, GPIO_Pin_0,  HW_Level_Low},  // HW_In_3FB,
        {GPIOB, GPIO_Pin_4,  HW_Level_Low},  // HW_In_4FB,
        {GPIOB, GPIO_Pin_5,  HW_Level_Low},  // HW_In_5FB,
        {GPIOB, GPIO_Pin_6,  HW_Level_Low},  // HW_In_6FB,
        {GPIOB, GPIO_Pin_7,  HW_Level_Low},  // HW_In_7FB,
        {GPIOB, GPIO_Pin_13, HW_Level_Low},  // HW_In_ALM1,
        {GPIOB, GPIO_Pin_15, HW_Level_Low},  // HW_In_ALM3,
        {GPIOB, GPIO_Pin_14, HW_Level_High}, // HW_In_Arrival1,
        {GPIOC, GPIO_Pin_8,  HW_Level_High}, // HW_In_Arrival3,
        {GPIOD, GPIO_Pin_1,  HW_Level_High}, // HW_In_None,
};

static const struct
{
    GPIO_TypeDef *port;
    uint16_t pin;
    HW_Level_t activeLevel;
    HW_Status_t defaultStatus;
}_outs[] =
{
#ifdef BOARD_WAR_SHIP
        {GPIOB, GPIO_Pin_5,  HW_Level_Low,  HW_Status_Active},  // HW_Out_Led
#else
        {GPIOD, GPIO_Pin_0, HW_Level_Low,  HW_Status_Active},  // HW_Out_Led
#endif
        {GPIOA, GPIO_Pin_1,  HW_Level_High, HW_Status_Inactive}, // HW_Out_Rs485ReDe1,
        {GPIOB, GPIO_Pin_12, HW_Level_High, HW_Status_Inactive}, // HW_Out_EN1,
        {GPIOA, GPIO_Pin_11, HW_Level_High, HW_Status_Inactive}, // HW_Out_EN2,
        {GPIOC, GPIO_Pin_6,  HW_Level_High, HW_Status_Inactive}, // HW_Out_EN3,
        {GPIOB, GPIO_Pin_2,  HW_Level_High, HW_Status_Inactive}, // HW_Out_DIR1,
        {GPIOA, GPIO_Pin_12, HW_Level_High, HW_Status_Inactive}, // HW_Out_DIR2,
        {GPIOC, GPIO_Pin_7,  HW_Level_High, HW_Status_Inactive}, // HW_Out_DIR3,
        {GPIOA, GPIO_Pin_5,  HW_Level_High, HW_Status_Inactive}, // HW_Out_Brak1,
        {GPIOA, GPIO_Pin_4,  HW_Level_High, HW_Status_Inactive}, // HW_Out_Brak3,
        {GPIOC, GPIO_Pin_1,  HW_Level_High, HW_Status_Inactive}, // HW_Out_Magnet,
        {GPIOC, GPIO_Pin_15, HW_Level_High, HW_Status_Inactive}, // HW_Out_1_2D,
        {GPIOC, GPIO_Pin_14, HW_Level_High, HW_Status_Inactive}, // HW_Out_3_4D,
        {GPIOC, GPIO_Pin_13, HW_Level_High, HW_Status_Inactive}, // HW_Out_5_6D,
        {GPIOC, GPIO_Pin_0,  HW_Level_High, HW_Status_Inactive}, // HW_Out_7D,
        {GPIOD, GPIO_Pin_0,  HW_Level_High, HW_Status_Inactive}, // HW_Out_None
};

#if 0
static const uint8_t _bitMap[] = {
        0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
#endif

static const char* _inNames[] =
{
        "S1",
        "S2",
        "S3",
        "S4",
        "S5",
        "1FB",
        "2FB",
        "3FB",
        "4FB",
        "5FB",
        "6FB",
        "7FB",
        "ALM1",
        "ALM3",
        "ARR1",
        "ARR3",
};

static const char* _outNames[] =
{
        "LED",
        "RS485DE",
        "EN1",
        "EN2",
        "EN3",
        "DIR1",
        "DIR2",
        "DIR3",
        "BRAKE1",
        "BRAkE3",
        "MAGNET",
        "1_2D",
        "3_4D",
        "5_6D",
        "7D",
};

static const struct
{
    uint16_t pin;
    uint8_t pinSource;
    uint32_t extiLine;
    IRQn_Type IRQn;
}_pinAttribs[] =
{
        {GPIO_Pin_0,  GPIO_PinSource0,  EXTI_Line0,  EXTI0_IRQn},
        {GPIO_Pin_1,  GPIO_PinSource1,  EXTI_Line1,  EXTI1_IRQn},
        {GPIO_Pin_2,  GPIO_PinSource2,  EXTI_Line2,  EXTI2_IRQn},
        {GPIO_Pin_3,  GPIO_PinSource3,  EXTI_Line3,  EXTI3_IRQn},
        {GPIO_Pin_4,  GPIO_PinSource4,  EXTI_Line4,  EXTI4_IRQn},
        {GPIO_Pin_5,  GPIO_PinSource5,  EXTI_Line5,  EXTI9_5_IRQn},
        {GPIO_Pin_6,  GPIO_PinSource6,  EXTI_Line6,  EXTI9_5_IRQn},
        {GPIO_Pin_7,  GPIO_PinSource7,  EXTI_Line7,  EXTI9_5_IRQn},
        {GPIO_Pin_8,  GPIO_PinSource8,  EXTI_Line8,  EXTI9_5_IRQn},
        {GPIO_Pin_9,  GPIO_PinSource9,  EXTI_Line9,  EXTI9_5_IRQn},
        {GPIO_Pin_10, GPIO_PinSource10, EXTI_Line10, EXTI15_10_IRQn},
        {GPIO_Pin_11, GPIO_PinSource11, EXTI_Line11, EXTI15_10_IRQn},
        {GPIO_Pin_12, GPIO_PinSource12, EXTI_Line12, EXTI15_10_IRQn},
        {GPIO_Pin_13, GPIO_PinSource13, EXTI_Line13, EXTI15_10_IRQn},
        {GPIO_Pin_14, GPIO_PinSource14, EXTI_Line14, EXTI15_10_IRQn},
        {GPIO_Pin_15, GPIO_PinSource15, EXTI_Line15, EXTI15_10_IRQn},
};

enum _Port
{
    _PortA,
    _PortB,
    _PortC,
    _PortD,
    _PortE,
};

static GPIO_TypeDef * const _ports[] =
{
        GPIOA,
        GPIOB,
        GPIOC,
        GPIOD,
        GPIOE,
};

static const struct
{
    GPIO_TypeDef *port;
    uint8_t portSource;
}_portSources[] =
{
        {GPIOA, GPIO_PortSourceGPIOA},
        {GPIOB, GPIO_PortSourceGPIOB},
        {GPIOC, GPIO_PortSourceGPIOC},
        {GPIOD, GPIO_PortSourceGPIOD},
        {GPIOE, GPIO_PortSourceGPIOE},
};

static const struct _Exti
{
    enum _Port portIndex;
    int pinIndex;
    HW_Level_t activeLevel;
    EXTITrigger_TypeDef trigger;
}_extis[] =
{
        {_PortC, 3, HW_Level_Low, EXTI_Trigger_Rising_Falling}, // HW_Exti_1,
        {_PortC, 2, HW_Level_Low, EXTI_Trigger_Rising_Falling}, // HW_Exti_2,
        {_PortA, 6, HW_Level_Low, EXTI_Trigger_Rising_Falling}, // HW_Exti_3,
        {_PortA, 7, HW_Level_Low, EXTI_Trigger_Rising_Falling}, // HW_Exti_4,
        {_PortC, 4, HW_Level_Low, EXTI_Trigger_Rising_Falling}, // HW_Exti_5,
        {_PortC, 5, HW_Level_Low, EXTI_Trigger_Rising_Falling}, // HW_Exti_6,
        {_PortB, 0, HW_Level_Low, EXTI_Trigger_Rising_Falling}, // HW_Exti_7,
        {_PortB, 1, HW_Level_Low, EXTI_Trigger_Rising_Falling}, // HW_Exti_8,
};

static struct
{
    HW_ExtiCallback_t cb;
    int data;
}_extiCbProfiles[ARRAY_SIZE(_extis)];

static void _ExtiInit(const struct _Exti *exti);
static void _ExtiDefaultHandler(int data);

void HW_Init(void)
{
    unsigned int i;
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |
            RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, ENABLE);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    for(i = 0; i < ARRAY_SIZE(_ins); i++)
    {
        GPIO_InitStructure.GPIO_Pin = _ins.pin;
        GPIO_Init(_ins.port, & GPIO_InitStructure);
    }

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    for(i = 0; i < ARRAY_SIZE(_outs); i++)
    {
        GPIO_InitStructure.GPIO_Pin = _outs.pin;
        GPIO_Init(_outs.port, & GPIO_InitStructure);
        HW_Config(i, _outs.defaultStatus);
    }

    /* Enable AFIO clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    for(i = 0; i < ARRAY_SIZE(_extis); i++)
    {
        _ExtiInit(& _extis);
        HW_SetExtiCallback((HW_Exti_t)i, _ExtiDefaultHandler, _extis.pinIndex);
    }

#if defined(__DEBUG__)
//    HW_SetLight(HW_Light_Stop, HW_Status_Flash);
#endif
}

static void _ExtiInit(const struct _Exti *exti)
{
    EXTI_InitTypeDef   EXTI_InitStructure;
    GPIO_InitTypeDef   GPIO_InitStructure;
    NVIC_InitTypeDef   NVIC_InitStructure;

    /* Configure PG.08 pin as input floating */
    GPIO_InitStructure.GPIO_Pin = _pinAttribs[exti->pinIndex].pin;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(_portSources[exti->portIndex].port, &GPIO_InitStructure);

    /* Connect EXTI Line to  pin */
    GPIO_EXTILineConfig(_portSources[exti->portIndex].portSource,
            _pinAttribs[exti->pinIndex].pinSource);

    /* Configure EXTI line */
    EXTI_InitStructure.EXTI_Line = _pinAttribs[exti->pinIndex].extiLine;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = exti->trigger;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    /* Enable and set EXTI Interrupt priority */
    NVIC_InitStructure.NVIC_IRQChannel = _pinAttribs[exti->pinIndex].IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);
}

static void _ExtiDefaultHandler(int data)
{
    HW_Exti_t exti;

    exti = (HW_Exti_t)data;
    MsgQueue_Send(MsgQueue_Id_ExtiTest, & exti, sizeof(exti));
}

void HW_OnExtiMsg(MsgQueue_Msg_t *msg)
{
    HW_Exti_t exti;

    exti = *((HW_Exti_t *)msg->data);
    printf("EXTI%d Trigger ", (int) exti);
}

void HW_Set(HW_Out_t out, HW_Level_t level)
{
    if(level == HW_Level_Low)
    {
        _outs[out].port->BRR = _outs[out].pin;
    }
    else
    {
        _outs[out].port->BSRR = _outs[out].pin;
    }
}

HW_Level_t HW_GetSetted(HW_Out_t out)
{
    return ((_outs[out].port->ODR & _outs[out].pin) == 0) ? HW_Level_Low : HW_Level_High;
}

HW_Level_t HW_Get(HW_In_t in)
{
    return ((_ins[in].port->IDR & _ins[in].pin) == 0) ? HW_Level_Low : HW_Level_High;
}

void HW_Trigger(HW_Out_t out)
{
    _outs[out].port->ODR ^= _outs[out].pin;
}

void HW_Config(HW_Out_t out, HW_Status_t status)
{
    HW_Level_t level;

    level = status ? _outs[out].activeLevel : ! _outs[out].activeLevel;
    HW_Set(out, level);
}

HW_Status_t HW_IsConfigedActive(HW_Out_t out)
{
    HW_Level_t level;

    level = HW_GetSetted(out);
    return (level == _outs[out].activeLevel) ? HW_Status_Active : HW_Status_Inactive;
}

int HW_IsActive(HW_In_t in)
{
    HW_Level_t level;

    level = HW_Get(in);
    return level == _ins[in].activeLevel;
}

int HW_IsExtiActive(HW_Exti_t exti)
{
    GPIO_TypeDef *port;
    uint16_t pin;
    HW_Level_t level;

    port = _ports[_extis[exti].portIndex];
    pin = _pinAttribs[_extis[exti].pinIndex].pin;
    level = ((port->IDR & pin) == 0) ? HW_Level_Low : HW_Level_High;
    return (level == _extis[exti].activeLevel) ? HW_Status_Active : HW_Status_Inactive;
}

unsigned int HW_ReadBoardAddres(void)
{
    HW_In_t sn;
    unsigned int addr, d;

    addr = 0;
    d = 0x01;
    for(sn = HW_In_S2; sn <= HW_In_S3; sn++)
    {
        if(HW_IsActive(sn))
        {
            addr |= d;
        }

        d <<= 1;
    }

    return addr;
}

void HW_SetExtiCallback(HW_Exti_t exti, HW_ExtiCallback_t cb, int data)
{
    _extiCbProfiles[exti].cb = cb;
    _extiCbProfiles[exti].data = data;
}

static void _ExtiIRQHandler(int pinIndexFrom, int pinIndexTo)
{
    HW_Exti_t exti;
    int pinIndex;

    for(exti = 0; exti < ARRAY_SIZE(_extis); exti++)
    {
        pinIndex = _extis[exti].pinIndex;
        if((pinIndex >= pinIndexFrom) && (pinIndex <= pinIndexTo))
        {
            if(EXTI_GetITStatus(_pinAttribs[pinIndex].extiLine) != RESET)
            {
                _extiCbProfiles[exti].cb(exti);
                EXTI_ClearITPendingBit(_pinAttribs[pinIndex].extiLine);
                break;
            }
        }
    }
}

void EXTI0_IRQHandler(void)
{
    _ExtiIRQHandler(0, 0);
}

void EXTI1_IRQHandler(void)
{
    _ExtiIRQHandler(1, 1);
}

void EXTI2_IRQHandler(void)
{
    _ExtiIRQHandler(2, 2);
}

void EXTI3_IRQHandler(void)
{
    _ExtiIRQHandler(3, 3);
}

void EXTI4_IRQHandler(void)
{
    _ExtiIRQHandler(4, 4);
}

void EXTI9_5_IRQHandler(void)
{
    _ExtiIRQHandler(5, 9);
}

void EXTI15_10_IRQHandler(void)
{
    _ExtiIRQHandler(10, 15);
}

int HW_IoInCmd(int argc, char *argv[])
{
    HW_In_t in;
    char name[8];
    unsigned int len, i;
    bool isExist;

    if(argc == 1)
    {
        for(in = 0; in < ARRAY_SIZE(_inNames); in++)
        {
            printf("%s: %s ", _inNames[in], HW_Get(in) == HW_Level_High ? "1" : "0");
        }
    }
    else if(argc == 2)
    {
        len = strlen(argv[1]);
        if(len >= ARRAY_SIZE(name))
        {
            printf("Unknown IO name! ");
            return -1;
        }

        for(i = 0; i < len; i++)
        {
            name = toupper(argv[1]);
        }
        name = '';

        isExist = FALSE;
        for(in = 0; in < ARRAY_SIZE(_inNames); in++)
        {
            if(strcmp(name, _inNames[in]) == 0)
            {
                printf("%s: %s ", _inNames[in], HW_Get(in) == HW_Level_High ? "1" : "0");
                isExist = TRUE;
                break;
            }
        }

        if(! isExist)
        {
            printf("Unknown IO name! ");
        }
    }

    return 0;
}

int HW_IoOutCmd(int argc, char *argv[])
{
    HW_Out_t out;
    char name[8];
    unsigned int len, i;
    bool isExist;
    int l;

    if(argc == 1)
    {
        for(out = 0; out < ARRAY_SIZE(_outNames); out++)
        {
            printf("%s: %s ", _outNames[out],
                    HW_GetSetted(out) == HW_Level_High ? "1" : "0");
        }
    }
    else if(argc >= 2)
    {
        len = strlen(argv[1]);
        if(len >= ARRAY_SIZE(name))
        {
            printf("Unknown IO name! ");
            return -1;
        }

        for(i = 0; i < len; i++)
        {
            name = toupper(argv[1]);
        }
        name = '';

        isExist = FALSE;
        for(out = 0; out < ARRAY_SIZE(_outNames); out++)
        {
            if(strcmp(name, _outNames[out]) == 0)
            {
                isExist = TRUE;
                break;
            }
        }

        if(isExist)
        {
            if(argc == 2)
            {
                printf("%s: %s ", _outNames[out],
                        HW_GetSetted(out) == HW_Level_High ? "1" : "0");
            }
            else
            {
                l = atoi(argv[2]);
                HW_Set(out, l ? HW_Level_High : HW_Level_Low);
                printf("%s: Set to %s ", _outNames[out], l ? "1" : "0");
            }
        }
        else
        {
            printf("Unknown IO name! ");
        }
    }

    return 0;
}[/mw_shl_code]
正点原子
2楼-- · 2019-07-21 15:15
当然可以,你写好代码即可。
biglu
3楼-- · 2019-07-21 17:04
可以用GPIO_InitTypeDef结构体指针作Init函数的形参,不过这样还是得写外面, 或者Init函数的形参可以用IO的端口号和引脚号,但是其实你要初始化的IO功能并不一致,有的要输入,有的要复用,其实弄成一个Init函数调用,反而复杂也没啥用,不如按模块或类型拆封这些Init()。

一周热门 更多>