stm32模拟IO并行

前言

大家应该使用过很多IO模拟的协议常见的有SPI、IIC,也有些不常见的比如8080,但是一般8080端口的模拟的协议中,传送并口数据的都是连续的IO口,例如从A0-A7,8个连续的IO口,但是连线真的烦,还有就是布线的时候更烦,那么为啥不把这8个IO口也模拟一下呢????

原理

说道这个原理那确实是很简单的,例如PA=0xffff,就学那相当于把它的IO口全部置1,所以我们可以按照这个特性来模拟它,也就是按照16进制数的每一个位的高低来依次将指定的IO口置0或者1。

代码实现

#include "parallel_soft.h"
//全局IO并口数组
struct pin_info_s pin_ary[IO_ARY_LEN];
int parallel_i;
													
GPIO_type 	GPIO_info[IO_ARY_LEN]=
{
	GPIOA,
	GPIOA,
	GPIOA,
	GPIOA,
	GPIOA,
	GPIOA,
	GPIOA,
	GPIOA
};//GPIO_x
GPIO_PIN_type 	GPIO_PIN_info[IO_ARY_LEN]=
{
	GPIO_Pin_0,
	GPIO_Pin_1,
	GPIO_Pin_2,
	GPIO_Pin_3,
	GPIO_Pin_4,
	GPIO_Pin_5,
	GPIO_Pin_6,
	GPIO_Pin_7
}; //GPIO_PIN

/*
	硬件初始化IO
*/
void Init_Config_IO()
{
	//printf("硬件初始化OK\r\n");
}


void Init_IO()
{
	int i;
	/*需要先初始化每一个IO口*/
	Init_Config_IO();
	/*初始化模拟并口,可定义所有IO口的顺序*/
	for (i = 0; i < IO_ARY_LEN; i++)
	{
		GPIO(i) = GPIO_info[i];
		GPIO_PIN(i) = GPIO_PIN_info[i];
	}
}

#ifndef __PARALLEL_SOFT_H
#define __PARALLEL_SOFT_H		  	
/*所需包含的头文件,一般为gpio相关的*/
#include "stm32f10x_gpio.h"

/*并口长度,可以为	8 16,只需要修改为对应的线数即可*/
#define IO_ARY_LEN 8		//8  16  

/*定义GPIO相关的类型方便修改*/
#define GPIO_type						GPIO_TypeDef* 
#define GPIO_PIN_type					uint16_t
/*配置高低电平函数,建议使用寄存器*/
#define HIGHT_level(GPIOx,GPIO_Pin)		GPIOx->BSRR = GPIO_Pin//高电平
#define LOW_level(GPIOx,GPIO_Pin)		GPIOx->BRR = GPIO_Pin//低电平


struct pin_info_s
{
	GPIO_type GPIO_x;
	GPIO_PIN_type GPIO_PIN_x;
};

#define GPIO(i)			pin_ary[i].GPIO_x
#define GPIO_PIN(i)		pin_ary[i].GPIO_PIN_x
#define BIT(num, n)  	((num & (1 << n)) > 0)  // 直接用一个宏就行了(兼容8位16位)

extern int parallel_i;//数组循环变量
#define parallel_write_data(data)	for (parallel_i = 0; parallel_i < IO_ARY_LEN; parallel_i++)\
									{\
										if (BIT(data, parallel_i))\
											HIGHT_level(GPIO(parallel_i), GPIO_PIN(parallel_i));\
										else \
											LOW_level(GPIO(parallel_i), GPIO_PIN(parallel_i));\
									}\

extern void Init_IO(void);
extern struct pin_info_s pin_ary[IO_ARY_LEN];
#endif  

以上就是C、H文件了。

使用方法

使用方法很简单,
(1)需要先将H文件中的

#ifndef __PARALLEL_SOFT_H
#define __PARALLEL_SOFT_H		  	
/*所需包含的头文件,一般为gpio相关的*/
#include "stm32f10x_gpio.h"

/*并口长度,可以为	8 16,只需要修改为对应的线数即可*/
#define IO_ARY_LEN 8		//8  16  

/*定义GPIO相关的类型方便修改*/
#define GPIO_type						GPIO_TypeDef* 
#define GPIO_PIN_type					uint16_t
/*配置高低电平函数,建议使用寄存器*/
#define HIGHT_level(GPIOx,GPIO_Pin)		GPIOx->BSRR = GPIO_Pin//高电平
#define LOW_level(GPIOx,GPIO_Pin)		GPIOx->BRR = GPIO_Pin//低电平

需要修改相应的头文件,GPIO 定义类型,不同的单片机是不一样的,这里使用stm32做例子的,还需要修改 对IO口拉高拉低的宏定义。
修改完以上的就OK了。
(2)初始化
初始化的时候需要先将所用的IO口

													
GPIO_type 	GPIO_info[IO_ARY_LEN]=
{
	GPIOA,
	GPIOA,
	GPIOA,
	GPIOA,
	GPIOA,
	GPIOA,
	GPIOA,
	GPIOA
};//GPIO_x
GPIO_PIN_type 	GPIO_PIN_info[IO_ARY_LEN]=
{
	GPIO_Pin_0,
	GPIO_Pin_1,
	GPIO_Pin_2,
	GPIO_Pin_3,
	GPIO_Pin_4,
	GPIO_Pin_5,
	GPIO_Pin_6,
	GPIO_Pin_7
}; //GPIO_PIN

对应的填在这里就好。
最重要的是需要按照使用的单片机初始化IO口的方式先将数组里面的IO口全部初始化一边。不初始化是不能用的(相关的可以看代码注释。)

到此就再也不用担心IO口不连续的问题了,想用那个用哪个是不是很爽!!!

在这里插入图片描述
点个赞再走吧
我会定期更新好用,好玩的教程视频
你的关注是我更新的动力
需要例子的可以加扣扣哈
本人扣扣849067797

  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值