amobbs.com 阿莫电子技术论坛

标题: 请教C语言,如何写一个不同IO操作的通用函数? [打印本页]

作者: 阿豪博士    时间: 2023-12-13 10:59
标题: 请教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
IO2L  PA2=1

IO1H PA3=1
IO2L  PA4=1

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


作者: qianj1986    时间: 2023-12-13 11:04
你把IO端口,状态(开或关) 传递进去呀
作者: 阿豪博士    时间: 2023-12-13 11:12
这么说吧,例如 8路模拟的SPI,划分了8组模拟IO,如何写1个函数,达到控制8组IO的目的?
而不是写8个子函数。。。
作者: asj1989    时间: 2023-12-13 11:17
我这样写

#define  GPIO_0     GPIO_Pin_0
#define  GPIO_1     GPIO_Pin_1
#define  GPIO_2     GPIO_Pin_2
#define  GPIO_3     GPIO_Pin_3
#define  GPIO_4     GPIO_Pin_4
#define  GPIO_5     GPIO_Pin_5
#define  GPIO_6     GPIO_Pin_6
#define  GPIO_7     GPIO_Pin_7
#define  GPIO_8     GPIO_Pin_8
#define  GPIO_9     GPIO_Pin_9
#define  GPIO_10    GPIO_Pin_10
#define  GPIO_11    GPIO_Pin_11
#define  GPIO_12    GPIO_Pin_12
#define  GPIO_13    GPIO_Pin_13
#define  GPIO_14    GPIO_Pin_14
#define  GPIO_15    GPIO_Pin_15

GPIO_TypeDef *OUTPORT[16]={
    GPIOF,GPIOF,GPIOC,GPIOE,GPIOE,GPIOE,GPIOE,GPIOE,
    GPIOF,GPIOF,GPIOF,GPIOF,GPIOF,GPIOF,GPIOF,GPIOE
};

uint16_t OUTPIN[16]=
{
    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[40]=
{
    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[40]=
{
    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[i];
        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[i], &GPIO_InitStructure);
        
        GPIO_SetBits(OUTPORT[i],OUTPIN[i]);
    }
   
    for( i=0; i<40; i++ )
    {
        GPIO_InitStructure.GPIO_Pin = INPIN[i];
        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[i], &GPIO_InitStructure);
    }

操作输出

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

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

作者: 阿豪博士    时间: 2023-12-13 11:22
asj1989 发表于 2023-12-13 11:17
我这样写

#define  GPIO_0     GPIO_Pin_0
(引用自4楼)

感谢 老兄的分享!

学习了!

谢谢!
作者: wxws    时间: 2023-12-13 11:48
去参考下arduino吧
作者: asma    时间: 2023-12-13 16:04
写的挺好,就是看不懂。。。
作者: dz46316740    时间: 2023-12-13 16:16
把io的信息作为参数传进去
作者: 初音之恋    时间: 2023-12-13 17:14
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
初音之恋 发表于 2023-12-13 17:14
typedef struct
{
      GPIO * io;
(引用自9楼)

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

我学习学习!谢谢!
作者: wye11083    时间: 2023-12-13 19:31
asj1989 发表于 2023-12-13 11:17
我这样写

#define  GPIO_0     GPIO_Pin_0
(引用自4楼)

你这把自己写死了
作者: albert_w    时间: 2023-12-13 19:42
库的方式:
  1. GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
复制代码

楼主是嫌弃调用时候提供port, pin太麻烦?
那就是pinHigh(xpin), pinSet(xPin, state)这样咯?

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

它出场就给单片机所有pin都排了顺序的
  1. func (p Pin) Set(high bool) {
  2.         port := p.getPort()
  3.         pin := uint8(p) % 16
  4.         if high {
  5.                 port.BSRR.Set(1 << pin)
  6.         } else {
  7.                 port.BSRR.Set(1 << (pin + 16))
  8.         }
  9. }
复制代码

作者: 阿豪博士    时间: 2023-12-13 19:53
wye11083 发表于 2023-12-13 19:31
你这把自己写死了
(引用自11楼)

我感觉 这位老兄这样写 用数组 提前编号 比较适合我
我感觉 简单易懂。。。因为我本身水平就很一般啊!
作者: 阿豪博士    时间: 2023-12-13 19:54
albert_w 发表于 2023-12-13 19:42
库的方式:

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

感谢指点!学习学习!




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4