打印
[STM32F1]

普通GPIO管脚分配

[复制链接]
1789|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
黎释注册|  楼主 | 2016-12-2 09:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个16位的data数据经16个并行端口(PC和PD)传输,但是IO口不是成组分配,而且很乱,想问下这种情况该怎么赋值
使用寄存器GPIOC->ODR=(GPIOC->ODR&0xe23f)|data
               GPIOD->ODR=(GPIOC->ODR&0xe23f)|data
好像这样只能赋值成组的IO口,
想过用位带操作,
有遇到这种情况的吗?希望可以指导下,谢谢!
沙发
xyz549040622| | 2016-12-2 12:53 | 只看该作者
读取每个IO的电平,然后移位,进行或运算,组成新的虚拟IO就好了。

使用特权

评论回复
板凳
mmuuss586| | 2016-12-2 13:10 | 只看该作者
写之前可以把IO数据都读出来,做些运算再写入端口

使用特权

评论回复
地板
黎释注册|  楼主 | 2016-12-2 13:12 | 只看该作者
xyz549040622 发表于 2016-12-2 12:53
读取每个IO的电平,然后移位,进行或运算,组成新的虚拟IO就好了。

谢谢!能不能给举个例子?例如我想要把:
data_0——PD5
data_1——PD6
data_7——PC8
data_8——PC10
改怎么设置?
谢谢你!

使用特权

评论回复
5
黎释注册|  楼主 | 2016-12-2 13:16 | 只看该作者
mmuuss586 发表于 2016-12-2 13:10
写之前可以把IO数据都读出来,做些运算再写入端口

谢谢!什么意思?因为我是16位数据并口输出,您的意思是要每一位都要读出来吗?然后再连接端口。可以给我举个例子吗?谢谢!

使用特权

评论回复
6
皈依| | 2016-12-2 16:23 | 只看该作者
读取引脚电平,一位一位的判断高低,然后移位

使用特权

评论回复
7
Xflyan| | 2016-12-2 18:00 | 只看该作者
16位一位一位判断,对应管脚 BITBAND 操作,可以省略读步骤

使用特权

评论回复
8
xyz549040622| | 2016-12-2 20:29 | 只看该作者
黎释注册 发表于 2016-12-2 13:16
谢谢!什么意思?因为我是16位数据并口输出,您的意思是要每一位都要读出来吗?然后再连接端口。可以给我 ...

比如要判断并行端口的数据是否为0xABCD,这个时候如何判断呢?假设这个16个并行口为PC4 PC6 PD3 PD4 PC0 PC5 PD0 PD2  PC1 PD6 PC2 PD1 PC3 PD5 PC7 PD7
那么组合后的并行口数据为  PC4的位电平<<15|PC6的位电平<<14|PD3的位电平<<13  ......以此类推,这样就好了。

使用特权

评论回复
9
右岸| | 2016-12-3 12:20 | 只看该作者
逐个IO读,再做运算

使用特权

评论回复
10
黎释注册|  楼主 | 2016-12-3 18:30 | 只看该作者
xyz549040622 发表于 2016-12-2 20:29
比如要判断并行端口的数据是否为0xABCD,这个时候如何判断呢?假设这个16个并行口为PC4 PC6 PD3 PD4 PC0  ...

谢谢!这样得到的是输入数据吧,现在是要把数据DATA分配到并口输出,是不是应该这么写?
先定义
define  PCout(4)  = DATA_1;
define  PCout(6)  = DATA_2;
..........
DATA_1 = data<<15;
DATA_2 = data<<14;
是不是这样数据就可以并口输出了?

使用特权

评论回复
11
xyz549040622| | 2016-12-3 18:51 | 只看该作者
黎释注册 发表于 2016-12-3 18:30
谢谢!这样得到的是输入数据吧,现在是要把数据DATA分配到并口输出,是不是应该这么写?
先定义
define  ...

嗯嗯。思路就是这样的,但是要注意两点
1.数据类型之间的转换和匹配
2.思路大概是这样,还可以结合实际的库函数或者硬件进行优化这个算法

使用特权

评论回复
12
黎释注册|  楼主 | 2016-12-3 22:59 | 只看该作者
xyz549040622 发表于 2016-12-3 18:51
嗯嗯。思路就是这样的,但是要注意两点
1.数据类型之间的转换和匹配
2.思路大概是这样,还可以结合实际的 ...

十分感谢!硬件暂时是改不了,因为我学习的是寄存器版本的,所以对库函数了解的少,
还有没有其他的方便的方法,例如配置寄存器。

使用特权

评论回复
13
xyz549040622| | 2016-12-3 23:01 | 只看该作者
黎释注册 发表于 2016-12-3 22:59
十分感谢!硬件暂时是改不了,因为我学习的是寄存器版本的,所以对库函数了解的少,
还有没有其他的方便 ...

直接操作寄存器的话,那更方便了。可以用你的位带的方式实现读取每个IO的电平状态。

使用特权

评论回复
14
黎释注册|  楼主 | 2016-12-3 23:10 | 只看该作者
xyz549040622 发表于 2016-12-3 23:01
直接操作寄存器的话,那更方便了。可以用你的位带的方式实现读取每个IO的电平状态。 ...

是不是只有成组的IO口才可以用寄存器操作,这种杂乱的IO分配就只能有位带方法配置每一个IO口。
我就是想用配置寄存器的方法,苦于硬件上限制。也没找到类似的例子,

使用特权

评论回复
15
xyz549040622| | 2016-12-4 10:49 | 只看该作者
黎释注册 发表于 2016-12-3 23:10
是不是只有成组的IO口才可以用寄存器操作,这种杂乱的IO分配就只能有位带方法配置每一个IO口。
我就是想 ...

STM32除了位带外,确实无法操作某个位了。但是你可以用寄存器整体取值,然后把某一位分离出来,再进行操作就好了。

使用特权

评论回复
16
黎释注册|  楼主 | 2016-12-4 17:43 | 只看该作者
xyz549040622 发表于 2016-12-4 10:49
STM32除了位带外,确实无法操作某个位了。但是你可以用寄存器整体取值,然后把某一位分离出来,再进行操 ...

谢谢你!下回有问题希望还可以请教你。

使用特权

评论回复
17
黎释注册|  楼主 | 2016-12-5 08:40 | 只看该作者
xyz549040622 发表于 2016-12-4 10:49
STM32除了位带外,确实无法操作某个位了。但是你可以用寄存器整体取值,然后把某一位分离出来,再进行操 ...

你好,不好意思有打扰到你,你看看是不是这么写是否可以?
在.h文件中先定义:
#define DATA0        PDout(5)
#define DATA1        PDout(6)
#define DATA2        PDout(7)
#define DATA3        PDout(13)
#define DATA4        PDout(14)
#define DATA5        PDout(15)
#define DATA6        PDout(12)
#define DATA7        PCout(8)
#define DATA8        PCout(10)
#define DATA9        PCout(11)
#define DATA10       PDout(10)
#define DATA11       PDout(11)
#define DATA12       PCout(6)
#define DATA13       PCout(7)
#define DATA14       PCout(12)
#define DATA15       PDout(2)
然后在.c文件中
DATA0 = data>>15;
        DATA1 = data>>14;
        DATA2 = data>>13;
        DATA3 = data>>12;
        DATA4 = data>>11;
        DATA5 = data>>10;
        DATA6 = data>>9;
        DATA7 = data>>8;
        DATA8 = data>>7;
        DATA9 = data>>6;
        DATA10 = data>>5;
        DATA11 = data>>4;
        DATA12 = data>>3;
        DATA13 = data>>2;
        DATA14 = data>>1;
        DATA15 = data;
有个疑惑,是不这里定义的DATA0-15都是一位的数据类型。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

37

帖子

0

粉丝