Rareyee 发表于 2018-3-14 10:48:50

STM32F7 GPIO同时控制?

本帖最后由 Rareyee 于 2018-3-14 11:12 编辑

GPIOD->ODR 0-8和9-15管脚同时控制
下面程序的时候0-8有波形 但写GPIOD->ODR|=2*i + 16*j; 9-15有波形 0-8就无输出了

for(i=0;i<(Capture_Line/16);i++)//12个使能(Capture_Line/16) 行片选
                {
                        
                        for(j=0;j<16;j++)//16*(Capture_Line/16) =192行   16个地址      
                        {
                              GPIOD->ODR =2*i + 16*j;

bargagebaobei 发表于 2018-3-14 10:53:54

GPIOD->ODR =2*i + 16*j; 楼主 这是你写的代码 但是你又说GPIOD->ODR|=2*i + 16*j
那么到底是赋值还是或值呢

Rareyee 发表于 2018-3-14 11:11:46

bargagebaobei 发表于 2018-3-14 10:53
GPIOD->ODR =2*i + 16*j; 楼主 这是你写的代码 但是你又说GPIOD->ODR|=2*i + 16*j
那么到底是赋值还是或值 ...

赋值但需要和GPIO9-15的口不影响

bargagebaobei 发表于 2018-3-14 11:14:37

楼主你要是这样赋值的话 就是意味着在同一时间只有一个io口是被置位的 其余io口都被复位了

发表于 2018-3-14 11:15:34

那应该是
GPIOD->ODR=(GPIOD->ODR & 0xFF00) | (2*i + 16*j);

bargagebaobei 发表于 2018-3-14 11:17:53

那要看楼主你的目的是什么 如果你想要就是同一个时间只有指定io口输出高电平 那么就用GPIOD->ODR =2*i + 16*j;,那么如果你想要在原来基础上再增加指定的io口输出高电平 那么就用GPIOD->ODR|=2*i + 16*j

wenyangzeng 发表于 2018-3-14 11:33:29

本帖最后由 wenyangzeng 于 2018-3-14 12:38 编辑

楼主应该补习一下布尔代数了。

1、GPIOD->ODR|=
等号后面的值应该用一个运算过的变量来表达。
况且“ |=”运算如果原来某位为1,就保持不变。所以要或运算,应该先进行与运算,清零该位。

2、(Capture_Line/16) =192行   16个地址
STM32最多16位IO口,如何一次进行192的或运算?

butterflyspring 发表于 2018-3-14 11:42:41

这个问题,有两方面
首先:建议你用一个uint32_t xx = 2*i + 16*j;作为一个缓存,因为我不知道你的i是什么类型,如果是8位,我没看到有类型的强制转换呀...那会爆了呀.然后也可以通过xx看看你计算的值是什么,对比一下结果.查看无误了,再恢复成你现在的形式也型.
其次:你可以直接调试状态下,控制ODR寄存器,看看硬件输出是否正常...
最后.......如无意外......就可以下班了:lol

toofree 发表于 2018-3-14 13:06:32

楼主,你想怎么搞?想0到15一起赋值呢,还是0到8赋值不影响8到15,或9到15赋值不影响0到8呢?
体会一下,下面这两条
GPIOD->ODR = (GPIOD->ODR & 0xFE00) | (a & 0x1FF);
GPIOD->ODR = (GPIOD->ODR & 0x01FF) | (b & 0xFE00);
页: [1]
查看完整版本: STM32F7 GPIO同时控制?