STM32
直播中

麦特拉布

12年用户 1074经验值
私信 关注
[问答]

如何使用stm32去模拟IO口呢

IO口模拟的原理是什么?

如何使用STM32去模拟IO口呢?

回帖(1)

张艳梅

2021-9-29 15:09:42
  前言
  大家应该使用过很多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(“硬件初始化OKrn”);
  }
  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口全部初始化一边。不初始化是不能用的(相关的可以看代码注释。)
举报

更多回帖

发帖
×
20
完善资料,
赚取积分