打印
[DSP编程]

GPIO操作问题

[复制链接]
3078|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
清枫城主|  楼主 | 2016-9-1 09:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void P0 (unsigned char dat)
{
        unsigned char ax[8];
        unsigned char i=0;
        for(i=0;i<8;i++)
        {
                if(dat&(1<<i))
                        ax[i] = 1;
                else
                        ax[i] = 0;
        }
        GpioDataRegs.GPBDAT.bit.GPIO39 = ax[0];
        GpioDataRegs.GPADAT.bit.GPIO30 = ax[1];
        GpioDataRegs.GPADAT.bit.GPIO1 = ax[2];
        GpioDataRegs.GPADAT.bit.GPIO3 = ax[3];
        GpioDataRegs.GPBDAT.bit.GPIO49 = ax[4];
        GpioDataRegs.GPBDAT.bit.GPIO51 = ax[5];
        GpioDataRegs.GPCDAT.bit.GPIO71 = ax[6];
        GpioDataRegs.GPCDAT.bit.GPIO73 = ax[7];
}
如上子函数,我想实现给一个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[8];
        unsigned char i=0;
        for(i=0;i<8;i++)
        {
                if(dat&(1<<i))
                        ax[i] = 1;
                else
                        ax[i] = 0;
        }
        GpioDataRegs.GPBDAT.bit.GPIO39 = ax[0];
        GpioDataRegs.GPADAT.bit.GPIO30 = ax[1];
        GpioDataRegs.GPADAT.bit.GPIO1 = ax[2];
        GpioDataRegs.GPADAT.bit.GPIO3 = ax[3];
        GpioDataRegs.GPBDAT.bit.GPIO49 = ax[4];
        GpioDataRegs.GPBDAT.bit.GPIO51 = ax[5];
        GpioDataRegs.GPCDAT.bit.GPIO71 = ax[6];
        GpioDataRegs.GPCDAT.bit.GPIO73 = ax[7];
*/
        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

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
清枫城主 + 1 很给力!
5
玄德| | 2016-9-1 11:30 | 只看该作者

时序。

使用特权

评论回复
6
清枫城主|  楼主 | 2016-9-1 12:23 | 只看该作者

时序?什么意思

使用特权

评论回复
7
清枫城主|  楼主 | 2016-9-1 12:25 | 只看该作者
JY-DX-JY 发表于 2016-9-1 10:36
加延时,或者用SET、CLEAR

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

使用特权

评论回复
8
玄德| | 2016-9-1 13:52 | 只看该作者

用LED检测这8个IO口

怎么检测的?


使用特权

评论回复
9
清枫城主|  楼主 | 2016-9-1 14:10 | 只看该作者
玄德 发表于 2016-9-1 13:52
用LED检测这8个IO口

怎么检测的?

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

使用特权

评论回复
10
yu515301489| | 2016-9-1 14:49 | 只看该作者
mark 等待解决办法

使用特权

评论回复
11
玄德| | 2016-9-1 15:13 | 只看该作者

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

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

使用特权

评论回复
12
Harvard| | 2016-9-1 18:28 | 只看该作者
估计全速运行没有加延时 一直在刷新io 怎么可能亮呢. 单步 ,等于是长时间点亮了

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
清枫城主 + 1 很给力!
13
charrijon| | 2016-9-1 21:38 | 只看该作者
IO的执行速度是很慢的,如果很快的话,那要总线干什么?

使用特权

评论回复
14
zhangmangui| | 2016-9-1 22:41 | 只看该作者
主要的还是在while哪里

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
清枫城主 + 1 很给力!
15
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;

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
清枫城主 + 1 很给力!
16
gregy_cn| | 2016-9-2 08:55 | 只看该作者
28335吗?
你的这种赋值方式,赋值前CPU会回读端口状态,然后位与/位或完成bit操作。
全速运行的时候一个设定指令运行完成,到CPU回读状态时,IO口翻转确没有完成,所以就错了。

使用特权

评论回复
17
清枫城主|  楼主 | 2016-9-19 17:51 | 只看该作者
玄德 发表于 2016-9-1 15:13
全速运行的时候,用LED检测这8个IO口,结果是错误的

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

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

使用特权

评论回复
18
清枫城主|  楼主 | 2016-9-19 17:52 | 只看该作者
Harvard 发表于 2016-9-1 18:28
估计全速运行没有加延时 一直在刷新io 怎么可能亮呢. 单步 ,等于是长时间点亮了 ...

应该是这样

使用特权

评论回复
19
清枫城主|  楼主 | 2016-9-19 17:52 | 只看该作者
charrijon 发表于 2016-9-1 21:38
IO的执行速度是很慢的,如果很快的话,那要总线干什么?

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

使用特权

评论回复
评论
charrijon 2016-9-20 19:27 回复TA
150M是主频,执行一个IO操作需要的CLK也耗的很多 
20
清枫城主|  楼主 | 2016-9-19 17:53 | 只看该作者
zhangmangui 发表于 2016-9-1 22:41
主要的还是在while哪里

我已经把while改了

使用特权

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

本版积分规则

6

主题

70

帖子

1

粉丝