请教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口进行宏定义,写不同的函数了吗?
你把IO端口,状态(开或关) 传递进去呀 这么说吧,例如 8路模拟的SPI,划分了8组模拟IO,如何写1个函数,达到控制8组IO的目的?
而不是写8个子函数。。。 我这样写
#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;
}
asj1989 发表于 2023-12-13 11:17
我这样写
#defineGPIO_0 GPIO_Pin_0
(引用自4楼)
感谢 老兄的分享!
学习了!
谢谢! 去参考下arduino吧 写的挺好,就是看不懂。。。 把io的信息作为参数传进去 typedef struct
{
GPIO * io;
}GPIOM,*pGPIOM;
初始化
GPIOM mio;
mio.io=GPIO1;
调用
void setio(pGPIOM io,byte state)
{
io->io=state;
}
结构体还可以放其他东西,面向对象编程
初音之恋 发表于 2023-12-13 17:14
typedef struct
{
GPIO * io;
(引用自9楼)
这个 结构体的写法,我需要好好 理解一下了。
C语言不太好。之前也没有经常接触单片机。
我学习学习!谢谢! asj1989 发表于 2023-12-13 11:17
我这样写
#defineGPIO_0 GPIO_Pin_0
(引用自4楼)
你这把自己写死了{:lol:} {:lol:} 库的方式:
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))
}
}
wye11083 发表于 2023-12-13 19:31
你这把自己写死了
(引用自11楼)
我感觉 这位老兄这样写 用数组 提前编号 比较适合我
我感觉 简单易懂。。。因为我本身水平就很一般啊! albert_w 发表于 2023-12-13 19:42
库的方式:
楼主是嫌弃调用时候提供port, pin太麻烦?
(引用自12楼)
感谢指点!学习学习!
页:
[1]