清枫城主 发表于 2016-9-1 09:54

GPIO操作问题

void P0 (unsigned char dat)
{
        unsigned char ax;
        unsigned char i=0;
        for(i=0;i<8;i++)
        {
                if(dat&(1<<i))
                        ax = 1;
                else
                        ax = 0;
        }
        GpioDataRegs.GPBDAT.bit.GPIO39 = ax;
        GpioDataRegs.GPADAT.bit.GPIO30 = ax;
        GpioDataRegs.GPADAT.bit.GPIO1 = ax;
        GpioDataRegs.GPADAT.bit.GPIO3 = ax;
        GpioDataRegs.GPBDAT.bit.GPIO49 = ax;
        GpioDataRegs.GPBDAT.bit.GPIO51 = ax;
        GpioDataRegs.GPCDAT.bit.GPIO71 = ax;
        GpioDataRegs.GPCDAT.bit.GPIO73 = ax;
}
如上子函数,我想实现给一个8位的字节数据,然后将各位分配给各个IO口,实现8位并行数据处理。但是,全速运行的时候,用LED检测这8个IO口,结果是错误的,但是我断点单步调试调试时,一步一步走下去,8个IO的结果却对了。这是什么原因?单步调试结果对,全速运行或直接调用一次这个子函数,然后其他的操作结果却是错的。

清枫城主 发表于 2016-9-1 09:54

void InitGpio(void)
{

        EALLOW;

        GpioCtrlRegs.GPAMUX1.all = 0x00000000;// A组0-15配置为数字
        GpioCtrlRegs.GPAMUX2.all = 0x00000000;// A组0-15配置为数字
        GpioCtrlRegs.GPAPUD.all = 0x00000000;// A组0-31使能上拉
        GpioCtrlRegs.GPADIR.all = 0xFFFFFFFF;   // A组0-31配置输出

        GpioCtrlRegs.GPBMUX1.all = 0x00000000;// A组0-15配置为数字
        GpioCtrlRegs.GPBMUX2.all = 0x00000000;// A组0-15配置为数字
        GpioCtrlRegs.GPBPUD.all = 0x00000000;// A组0-31使能上拉
        GpioCtrlRegs.GPBDIR.all = 0xFFFFFFFF;   // A组0-31配置输出

        GpioCtrlRegs.GPCMUX1.all = 0x00000000;// A组0-15配置为数字
        GpioCtrlRegs.GPCMUX2.all = 0x00000000;// A组0-15配置为数字
        GpioCtrlRegs.GPCPUD.all = 0x00000000;// A组0-31使能上拉
        GpioCtrlRegs.GPCDIR.all = 0xFFFFFFFF;   // A组0-31配置输出
/*
        GpioDataRegs.GPASET.all = 0xFFFFFFFF;
        GpioDataRegs.GPBSET.all = 0xFFFFFFFF;
        GpioDataRegs.GPCSET.all = 0xFFFFFFFF;
*/
    EDIS;

}这是我的GPIO初始化。

清枫城主 发表于 2016-9-1 10:00

void P0 (unsigned char dat)
{
/*        unsigned char ax;
        unsigned char i=0;
        for(i=0;i<8;i++)
        {
                if(dat&(1<<i))
                        ax = 1;
                else
                        ax = 0;
        }
        GpioDataRegs.GPBDAT.bit.GPIO39 = ax;
        GpioDataRegs.GPADAT.bit.GPIO30 = ax;
        GpioDataRegs.GPADAT.bit.GPIO1 = ax;
        GpioDataRegs.GPADAT.bit.GPIO3 = ax;
        GpioDataRegs.GPBDAT.bit.GPIO49 = ax;
        GpioDataRegs.GPBDAT.bit.GPIO51 = ax;
        GpioDataRegs.GPCDAT.bit.GPIO71 = ax;
        GpioDataRegs.GPCDAT.bit.GPIO73 = ax;
*/
        GpioDataRegs.GPBDAT.bit.GPIO39 = dat&0x01;
        GpioDataRegs.GPADAT.bit.GPIO30 = dat&0x02;
        GpioDataRegs.GPADAT.bit.GPIO1 = dat&0x04;
        GpioDataRegs.GPADAT.bit.GPIO3 = dat&0x08;
        GpioDataRegs.GPBDAT.bit.GPIO49 = dat&0x10;
        GpioDataRegs.GPBDAT.bit.GPIO51 = dat&0x20;
        GpioDataRegs.GPCDAT.bit.GPIO71 = dat&0x40;
        GpioDataRegs.GPCDAT.bit.GPIO73 = dat&0x80;
}
这是我原始的子函数,发现这样语句并没有任何报错,但是结果却也是不行。

JY-DX-JY 发表于 2016-9-1 10:36

加延时,或者用SET、CLEAR

玄德 发表于 2016-9-1 11:30


时序。

清枫城主 发表于 2016-9-1 12:23

玄德 发表于 2016-9-1 11:30
时序。

时序?什么意思

清枫城主 发表于 2016-9-1 12:25

JY-DX-JY 发表于 2016-9-1 10:36
加延时,或者用SET、CLEAR

为什么你们都说要加延时呢?用SET或CLEAR这个我要知道我给的是0或1才能处理,整体耗时又增加了。

玄德 发表于 2016-9-1 13:52


用LED检测这8个IO口

怎么检测的?


清枫城主 发表于 2016-9-1 14:10

玄德 发表于 2016-9-1 13:52
用LED检测这8个IO口

怎么检测的?

你焊8个LED啊共阳接法 然后阳极接在D3.3V阴极接在相应的GPIO上

yu515301489 发表于 2016-9-1 14:49

mark 等待解决办法

玄德 发表于 2016-9-1 15:13


全速运行的时候,用LED检测这8个IO口,结果是错误的

我想知道,这个检测过程是怎么操作的,送的什么数,灯是什么效果。
这里可能情况太多。

Harvard 发表于 2016-9-1 18:28

估计全速运行没有加延时 一直在刷新io 怎么可能亮呢. 单步 ,等于是长时间点亮了

charrijon 发表于 2016-9-1 21:38

IO的执行速度是很慢的,如果很快的话,那要总线干什么?

zhangmangui 发表于 2016-9-1 22:41

主要的还是在while哪里

lnulibin 发表于 2016-9-1 23:04

本帖最后由 lnulibin 于 2016-9-1 23:06 编辑

把一个无符号的字节型变量,赋值给一个位,一般是将该字节的最低位送至目标。
处理时,要仔细。例如,DAT=0XF0;
下面的程序
GpioDataRegs.GPBDAT.bit.GPIO39 = dat&0x01;
      GpioDataRegs.GPADAT.bit.GPIO30 = dat&0x02;
      GpioDataRegs.GPADAT.bit.GPIO1 = dat&0x04;
      GpioDataRegs.GPADAT.bit.GPIO3 = dat&0x08;
      GpioDataRegs.GPBDAT.bit.GPIO49 = dat&0x10;
      GpioDataRegs.GPBDAT.bit.GPIO51 = dat&0x20;
      GpioDataRegs.GPCDAT.bit.GPIO71 = dat&0x40;
      GpioDataRegs.GPCDAT.bit.GPIO73 = dat&0x80;
相当于
GpioDataRegs.GPBDAT.bit.GPIO39 = 0;
      GpioDataRegs.GPADAT.bit.GPIO30 = 0;
      GpioDataRegs.GPADAT.bit.GPIO1 = 0;
      GpioDataRegs.GPADAT.bit.GPIO3 = 0;
      GpioDataRegs.GPBDAT.bit.GPIO49 = 0;
      GpioDataRegs.GPBDAT.bit.GPIO51 = 0;
      GpioDataRegs.GPCDAT.bit.GPIO71 = 0;
      GpioDataRegs.GPCDAT.bit.GPIO73 = 0;

gregy_cn 发表于 2016-9-2 08:55

28335吗?
你的这种赋值方式,赋值前CPU会回读端口状态,然后位与/位或完成bit操作。
全速运行的时候一个设定指令运行完成,到CPU回读状态时,IO口翻转确没有完成,所以就错了。

清枫城主 发表于 2016-9-19 17:51

玄德 发表于 2016-9-1 15:13
全速运行的时候,用LED检测这8个IO口,结果是错误的

我想知道,这个检测过程是怎么操作的,送的什么数, ...

比如我送0x55那么就是2 4 6 8这四个LED量 其他四个熄灭

清枫城主 发表于 2016-9-19 17:52

Harvard 发表于 2016-9-1 18:28
估计全速运行没有加延时 一直在刷新io 怎么可能亮呢. 单步 ,等于是长时间点亮了 ...

应该是这样

清枫城主 发表于 2016-9-19 17:52

charrijon 发表于 2016-9-1 21:38
IO的执行速度是很慢的,如果很快的话,那要总线干什么?

速度很快啊 150M怎么会慢呢

清枫城主 发表于 2016-9-19 17:53

zhangmangui 发表于 2016-9-1 22:41
主要的还是在while哪里

我已经把while改了
页: [1] 2
查看完整版本: GPIO操作问题