搜索
bottom↓
回复: 13
打印 上一主题 下一主题

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

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2023-12-13 10:59:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 阿豪博士 于 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口进行宏定义,写不同的函数了吗?

出20入12汤圆

2
发表于 2023-12-13 11:04:30 | 只看该作者
你把IO端口,状态(开或关) 传递进去呀

出0入0汤圆

3
 楼主| 发表于 2023-12-13 11:12:44 | 只看该作者
这么说吧,例如 8路模拟的SPI,划分了8组模拟IO,如何写1个函数,达到控制8组IO的目的?
而不是写8个子函数。。。

出0入131汤圆

4
发表于 2023-12-13 11:17:26 | 只看该作者
我这样写

#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;
}

出0入0汤圆

5
 楼主| 发表于 2023-12-13 11:22:01 | 只看该作者
asj1989 发表于 2023-12-13 11:17
我这样写

#define  GPIO_0     GPIO_Pin_0
(引用自4楼)

感谢 老兄的分享!

学习了!

谢谢!

出0入228汤圆

6
发表于 2023-12-13 11:48:51 | 只看该作者
去参考下arduino吧

出420入0汤圆

7
发表于 2023-12-13 16:04:51 | 只看该作者
写的挺好,就是看不懂。。。

出0入0汤圆

8
发表于 2023-12-13 16:16:22 来自手机 | 只看该作者
把io的信息作为参数传进去

出0入16汤圆

9
发表于 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;
}

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

出0入0汤圆

10
 楼主| 发表于 2023-12-13 19:03:39 | 只看该作者
初音之恋 发表于 2023-12-13 17:14
typedef struct
{
      GPIO * io;
(引用自9楼)

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

我学习学习!谢谢!

出0入442汤圆

11
发表于 2023-12-13 19:31:13 | 只看该作者
asj1989 发表于 2023-12-13 11:17
我这样写

#define  GPIO_0     GPIO_Pin_0
(引用自4楼)

你这把自己写死了

出0入42汤圆

12
发表于 2023-12-13 19:42:27 | 只看该作者
库的方式:
  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. }
复制代码

出0入0汤圆

13
 楼主| 发表于 2023-12-13 19:53:50 | 只看该作者

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

出0入0汤圆

14
 楼主| 发表于 2023-12-13 19:54:09 | 只看该作者
albert_w 发表于 2023-12-13 19:42
库的方式:

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

感谢指点!学习学习!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 12:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表