打印

GPIO控制问题

[复制链接]
784|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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;
}
我用这个子函数想实现任意8个IO口实现8位数据并行处理,但是调试结果是错误的。单看程序语句,并没有错误,编译也没有检测出错误,但是结果不行。

相关帖子

沙发
清枫城主|  楼主 | 2016-9-1 10:03 | 只看该作者
随后我换了个方式,编写了下面的子函数。
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];
}
全速运行的时候,用LED检测这8个IO口,结果是错误的,但是我断点单步调试调试时,一步一步走下去,8个IO的结果却对了。这是什么原因?单步调试结果对,全速运行或直接调用一次这个子函数,然后其他的操作结果却是错的。

使用特权

评论回复
板凳
清枫城主|  楼主 | 2016-9-1 10:04 | 只看该作者

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 11:17 | 只看该作者
目测加几个delay应该就行,你试下吧,

使用特权

评论回复
5
joing1999| | 2016-9-1 11:19 | 只看该作者
加几个delay,楼上说得没错。

使用特权

评论回复
6
清枫城主|  楼主 | 2016-9-1 14:34 | 只看该作者
清枫城主 发表于 2016-9-1 10:03
随后我换了个方式,编写了下面的子函数。
void P0 (unsigned char dat)
{

调试窗口数据监测是对的  但是就是对GPIO幅值就不行

QQ截图20160901143713.png (334.28 KB )

QQ截图20160901143713.png

使用特权

评论回复
7
zhangmangui| | 2016-9-1 22:29 | 只看该作者
你的while(1)P0(0x55);
表示一直在循环  里面的8位GPIO一直在移位  也就是在切换
这个速度折合到GPIO上   假如150M主频   GPIO是响应不过来的

使用特权

评论回复
8
gygp| | 2016-9-3 11:04 | 只看该作者
你可以宏定义试试。

使用特权

评论回复
9
gygp| | 2016-9-3 11:09 | 只看该作者
怎么不用连续的IO呢

使用特权

评论回复
10
清枫城主|  楼主 | 2016-9-19 17:26 | 只看该作者
gygp 发表于 2016-9-3 11:09
怎么不用连续的IO呢

我知道可以用连续的IO  但是 如果我刚好没有连续的IO可用的情况下呢

使用特权

评论回复
11
尤彼卡| | 2016-9-20 19:49 | 只看该作者
这个速度折合到GPIO上   假如150M主频   GPIO是响应不过来的

GPIO最快有多高的处理速度

使用特权

评论回复
12
309030| | 2016-9-25 21:16 | 只看该作者
假如150M主频   GPIO是响应不过来的

GPIO的响应速度是多少呢

使用特权

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

本版积分规则

6

主题

70

帖子

1

粉丝