阿豪博士 发表于 2023-12-13 10:59:50

请教C语言,如何写一个不同IO操作的通用函数?

本帖最后由 阿豪博士 于 2023-12-13 19:04 编辑

请教C语言,如何写一个不同IO操作的通用函数?


这么说吧,例如 8路模拟的SPI,划分了8组模拟IO,如何写1个函数,达到控制8组IO的目的?
而不是写8个子函数。。。

例如:
void IO_SET(int *p)
{
IO1H;
IO2L;
}

如何操作一下可以使IO操作指向不同的IO口?
我知道可以用宏定义的写法,但是感觉有点繁琐,不知道各位有没有什么好的办法?

例如:
IO1H PA1=1
IO2LPA2=1

IO1H PA3=1
IO2LPA4=1

这样 可以指向不同的IO口,难道只能一个 一个的 IO口进行宏定义,写不同的函数了吗?

qianj1986 发表于 2023-12-13 11:04:30

你把IO端口,状态(开或关) 传递进去呀

阿豪博士 发表于 2023-12-13 11:12:44

这么说吧,例如 8路模拟的SPI,划分了8组模拟IO,如何写1个函数,达到控制8组IO的目的?
而不是写8个子函数。。。

asj1989 发表于 2023-12-13 11:17:26

我这样写

#defineGPIO_0   GPIO_Pin_0
#defineGPIO_1   GPIO_Pin_1
#defineGPIO_2   GPIO_Pin_2
#defineGPIO_3   GPIO_Pin_3
#defineGPIO_4   GPIO_Pin_4
#defineGPIO_5   GPIO_Pin_5
#defineGPIO_6   GPIO_Pin_6
#defineGPIO_7   GPIO_Pin_7
#defineGPIO_8   GPIO_Pin_8
#defineGPIO_9   GPIO_Pin_9
#defineGPIO_10    GPIO_Pin_10
#defineGPIO_11    GPIO_Pin_11
#defineGPIO_12    GPIO_Pin_12
#defineGPIO_13    GPIO_Pin_13
#defineGPIO_14    GPIO_Pin_14
#defineGPIO_15    GPIO_Pin_15

GPIO_TypeDef *OUTPORT={
    GPIOF,GPIOF,GPIOC,GPIOE,GPIOE,GPIOE,GPIOE,GPIOE,
    GPIOF,GPIOF,GPIOF,GPIOF,GPIOF,GPIOF,GPIOF,GPIOE
};

uint16_t OUTPIN=
{
    GPIO_1,GPIO_0,GPIO_13,GPIO_6,GPIO_5,GPIO_4,GPIO_3,GPIO_2,
    GPIO_4,GPIO_5,GPIO_6,GPIO_7,GPIO_8,GPIO_9,GPIO_10,GPIO_1
};


GPIO_TypeDef *INPORT=
{
    GPIOB,GPIOB,GPIOA,GPIOA,GPIOE,GPIOE,GPIOE,GPIOE,
    GPIOE,GPIOE,GPIOE,GPIOE,GPIOE,GPIOG,GPIOG,GPIOF,
    GPIOF,GPIOF,GPIOF,GPIOF,GPIOB,GPIOB,GPIOD,GPIOD,
    GPIOG,GPIOG,GPIOG,GPIOG,GPIOG,GPIOG,GPIOG,GPIOA,
    GPIOD,GPIOD,GPIOD,GPIOD,GPIOD,GPIOD,GPIOG,GPIOG
};

uint16_t INPIN=
{
    GPIO_6,GPIO_7,GPIO_0,GPIO_1,GPIO_15,GPIO_14,GPIO_13,GPIO_12,
    GPIO_11,GPIO_10,GPIO_9,GPIO_8,GPIO_7,GPIO_1,GPIO_0,GPIO_15,
    GPIO_14,GPIO_13,GPIO_12,GPIO_11,GPIO_1,GPIO_0,GPIO_10,GPIO_11,   
    GPIO_2,GPIO_3,GPIO_4,GPIO_5,GPIO_6,GPIO_7,GPIO_8,GPIO_8,   
    GPIO_0,GPIO_1,GPIO_2,GPIO_3,GPIO_4,GPIO_7,GPIO_10,GPIO_11
};


初始化
for( i=0; i<16; i++ )
    {
      GPIO_InitStructure.GPIO_Pin = OUTPIN;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
      GPIO_Init(OUTPORT, &GPIO_InitStructure);
      
      GPIO_SetBits(OUTPORT,OUTPIN);
    }
   
    for( i=0; i<40; i++ )
    {
      GPIO_InitStructure.GPIO_Pin = INPIN;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
      GPIO_Init(INPORT, &GPIO_InitStructure);
    }

操作输出

void YOut( int num, int state )
{
      if( state )
            GPIO_ResetBits(OUTPORT,OUTPIN);
      else
            GPIO_SetBits(OUTPORT,OUTPIN);
}

读输入
int Xin( int num )
{
    if( GPIO_ReadInputDataBit(INPORT,INPIN) )
      return 0;
    else
      return 1;
}

阿豪博士 发表于 2023-12-13 11:22:01

asj1989 发表于 2023-12-13 11:17
我这样写

#defineGPIO_0   GPIO_Pin_0
(引用自4楼)

感谢 老兄的分享!

学习了!

谢谢!

wxws 发表于 2023-12-13 11:48:51

去参考下arduino吧

asma 发表于 2023-12-13 16:04:51

写的挺好,就是看不懂。。。

dz46316740 发表于 2023-12-13 16:16:22

把io的信息作为参数传进去

初音之恋 发表于 2023-12-13 17:14:13

typedef struct
{
      GPIO * io;
}GPIOM,*pGPIOM;

初始化
GPIOM mio;
mio.io=GPIO1;

调用
void setio(pGPIOM io,byte state)
{
    io->io=state;
}

结构体还可以放其他东西,面向对象编程

阿豪博士 发表于 2023-12-13 19:03:39

初音之恋 发表于 2023-12-13 17:14
typedef struct
{
      GPIO * io;
(引用自9楼)

这个 结构体的写法,我需要好好 理解一下了。
C语言不太好。之前也没有经常接触单片机。

我学习学习!谢谢!

wye11083 发表于 2023-12-13 19:31:13

asj1989 发表于 2023-12-13 11:17
我这样写

#defineGPIO_0   GPIO_Pin_0
(引用自4楼)

你这把自己写死了{:lol:} {:lol:}

albert_w 发表于 2023-12-13 19:42:27

库的方式:
GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
楼主是嫌弃调用时候提供port, pin太麻烦?
那就是pinHigh(xpin), pinSet(xPin, state)这样咯?

那要把pin封装起来吧.
这是一些模式, 别的语言的, 不过搞成c也大同小异了, 把port封装到pin一起.

它出场就给单片机所有pin都排了顺序的
func (p Pin) Set(high bool) {
        port := p.getPort()
        pin := uint8(p) % 16
        if high {
                port.BSRR.Set(1 << pin)
        } else {
                port.BSRR.Set(1 << (pin + 16))
        }
}

阿豪博士 发表于 2023-12-13 19:53:50

wye11083 发表于 2023-12-13 19:31
你这把自己写死了
(引用自11楼)

我感觉 这位老兄这样写 用数组 提前编号 比较适合我
我感觉 简单易懂。。。因为我本身水平就很一般啊!

阿豪博士 发表于 2023-12-13 19:54:09

albert_w 发表于 2023-12-13 19:42
库的方式:

楼主是嫌弃调用时候提供port, pin太麻烦?
(引用自12楼)

感谢指点!学习学习!
页: [1]
查看完整版本: 请教C语言,如何写一个不同IO操作的通用函数?