完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前言
大家应该使用过很多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口全部初始化一边。不初始化是不能用的(相关的可以看代码注释。) |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1936浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
729浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
569浏览 3评论
594浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
552浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 22:29 , Processed in 0.851419 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号