打印
[STM32F1]

STM32 想把一个u8变量的某一位赋值给一个GPIO怎么办

[复制链接]
8012|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Robert_zheng|  楼主 | 2014-10-23 14:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32用并行信号驱动一个液晶屏,一个u8变量赋给几个GPIO口,一个GPIO对应其中的一位
沙发
清风致影| | 2014-10-23 14:34 | 只看该作者
GPIOE->ODR = 0xffff;这是把GPIOE全部设置为1,  你的问题可以解决了么?

使用特权

评论回复
板凳
Robert_zheng|  楼主 | 2014-10-23 14:43 | 只看该作者
清风致影 发表于 2014-10-23 14:34
GPIOE->ODR = 0xffff;这是把GPIOE全部设置为1,  你的问题可以解决了么?

NO,我现在有一个u8的数据,用八个GPIO并行的表示出来,传出去

使用特权

评论回复
地板
清风致影| | 2014-10-23 14:46 | 只看该作者
Robert_zheng 发表于 2014-10-23 14:43
NO,我现在有一个u8的数据,用八个GPIO并行的表示出来,传出去

。。。。。晕   可以置位16个GPIO  就不能想办法置位8个GPIO么。。。。

使用特权

评论回复
5
Robert_zheng|  楼主 | 2014-10-23 14:50 | 只看该作者
清风致影 发表于 2014-10-23 14:46
。。。。。晕   可以置位16个GPIO  就不能想办法置位8个GPIO么。。。。

u8 有0有1啊,而且,八个GPIO不全是一起的,有的在A,有的在B,E。有个GPIO_WriteBit(),就是不知道怎么把u8 的某一位提取出来一个BIT数据。

使用特权

评论回复
6
Rain_King| | 2014-10-23 14:51 | 只看该作者
很简单.....用一个16位的变量读出来....把需要的8位置零,然后或上去.....就OK了嘛

使用特权

评论回复
7
Rain_King| | 2014-10-23 14:55 | 只看该作者
写成C语言就是:
int a;
char b;
a = GPIOE->ODR;//假如是后8位
a = a &0XFF00;
b = 0;//需要的赋的值
a = a | b;
GPIOE->ODR = a;

使用特权

评论回复
8
Rain_King| | 2014-10-23 14:56 | 只看该作者
本帖最后由 Rain_King 于 2014-10-23 14:57 编辑

之所以要a来过度,大家都懂得...............如果是其他位,就需要移位.....如果是不连续的.....呃,还是一位一位的来吧..............

使用特权

评论回复
9
Robert_zheng|  楼主 | 2014-10-23 15:04 | 只看该作者
Rain_King 发表于 2014-10-23 14:56
之所以要a来过度,大家都懂得...............如果是其他位,就需要移位.....如果是不连续的.....呃,还是一 ...

你的意思我大概明白了,但是我想库函数既然有现成的GPIO_WriteBit(),把u8分成8个bit数据,写个八次,这样会不会简单一点,后面的人看起来也会比较容易明白。

使用特权

评论回复
10
Robert_zheng|  楼主 | 2014-10-23 15:07 | 只看该作者
Robert_zheng 发表于 2014-10-23 15:04
你的意思我大概明白了,但是我想库函数既然有现成的GPIO_WriteBit(),把u8分成8个bit数据,写个八次,这样 ...

定义一个联合体,由8个bit变量组成,在赋一下u8变量的地址,行不行。

使用特权

评论回复
11
Rain_King| | 2014-10-23 15:38 | 只看该作者
Robert_zheng 发表于 2014-10-23 15:07
定义一个联合体,由8个bit变量组成,在赋一下u8变量的地址,行不行。

我还以为,你是想如何快速搞定....不讲效率啊....那就随便啦,可以使用位域,或者直接调用库.........都可以

使用特权

评论回复
12
amanda_s| | 2014-10-23 16:41 | 只看该作者
可以使用位带操作。
分别为u8变量的每一位,以及你用到的GPIO口(用ODR寄存器)定义一个别名。
赋值的时候,直接把u8某一位的别名赋值给对应的GPIO口的别名就可以了。
速度也比用库函数快。

使用特权

评论回复
13
SLHSu37| | 2014-10-23 16:48 | 只看该作者
移位赋值吧·

使用特权

评论回复
14
huatong| | 2014-10-23 17:32 | 只看该作者
Rain_King 发表于 2014-10-23 14:55
写成C语言就是:
int a;
char b;

GPIOE->BSRR = 0x00FF0000 | b;      //这样GPIOE的低8位就是你要的结果,高8位不变

使用特权

评论回复
15
huatong| | 2014-10-23 17:34 | 只看该作者
可以使用端口的BSRR寄存器啊

使用特权

评论回复
16
mmuuss586| | 2014-10-23 19:05 | 只看该作者
Robert_zheng 发表于 2014-10-23 14:50
u8 有0有1啊,而且,八个GPIO不全是一起的,有的在A,有的在B,E。有个GPIO_WriteBit(),就是不知道怎 ...

不同的端口,只能位指令了;

使用特权

评论回复
17
mohanwei| | 2014-10-23 20:27 | 只看该作者
Flash这么大,主频这么高,最笨的方法可能就是最靠谱的方法:
//bit0:
if(dat & (1<<0))
   GPIO_SetBits(Port_LCD_SCL, Pin_LCD_SCL);
else
   GPIO_ResetBits(Port_LCD_SCL, Pin_LCD_SCL);

//bit1:
if(dat & (1<<1))
   GPIO_SetBits(Port_LCD_SDA, Pin_LCD_SDA);
else
   GPIO_ResetBits(Port_LCD_SDA, Pin_LCD_SDA);

//bit2:
……

使用特权

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

本版积分规则

5

主题

23

帖子

0

粉丝