打印

关于GPXDAT寄存器的一点疑问

[复制链接]
1481|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
apple武|  楼主 | 2017-3-19 16:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚开始接触dsp,用的芯片是TMS320F28335,开发环境是CCS6.0 ,从通用GPIO看起,进行了点灯实验,发现了一个很怪的问题
问题描述如下:
    通过三个I/O分别控制3个LED,刚开始定义如下
#define LED2_ON GpioDataRegs.GPADAT.bit.GPIO0
#define LED3_ON GpioDataRegs.GPADAT.bit.GPIO1
#define LED4_ON GpioDataRegs.GPADAT.bit.GPIO2

然后在while(1)里面让3个LED闪烁
        while(1)
        {

                LED2_ON = 1;
                LED3_ON = 1;
                LED4_ON = 1;

                delay();

                LED2_ON = 0;
                LED3_ON = 0;
                LED4_ON = 0;

                delay();


        }
但是,硬件仿真时,全速执行只有两个LED闪烁,单步执行的话,可以看到LED2也是在间断性地置一、清零,但是,只要全速执行,就不能出现预期的效果,LED2保持在常亮的状态



后来就把程序改了下
#define LED2_ON GpioDataRegs.GPASET.bit.GPIO0
#define LED3_ON GpioDataRegs.GPASET.bit.GPIO1
#define LED4_ON GpioDataRegs.GPASET.bit.GPIO2

#define LED2_OFF GpioDataRegs.GPACLEAR.bit.GPIO0
#define LED3_OFF GpioDataRegs.GPACLEAR.bit.GPIO1
#define LED4_OFF GpioDataRegs.GPACLEAR.bit.GPIO2


然后主函数里面是
        while(1)
        {

                LED2_ON = 1;
                LED3_ON = 1;
                LED4_ON = 1;

                delay();

                LED2_OFF = 1;
                LED3_OFF = 1;
                LED4_OFF = 1;

                delay();


        }

这样全速执行,三个LED进行闪烁,如预期所料,于是乎就发现问题出在GPXDAT寄存器上面,这个寄存器明明是可以写也可以读的 ,通过他对各个位进行写1 写0 都是可以的,那为何不行了那???????看官方手册找到这句话
When using the GPxDAT register to change the level of an output pin, you should be cautious not to
accidentally change the level of another pin. For example, if you mean to change the output latch level
of GPIOA0 by writing to the GPADAT register bit 0, using a read-modify-write instruction. The problem
can occur if another I/O port A signal changes level between the read and the write stage of the
instruction. You can also change the state of that output latch. You can avoid this scenario by using
the GPxSET, GPxCLEAR, and GPxTOGGLE registers to load the output latch instead.
他也说到会出现错误,但是我没有读这个寄存器,只是对他进行了简单的写操作。请问大神们,这个问题出在那里??谢谢了

相关帖子

沙发
angerbird| | 2017-3-19 21:30 | 只看该作者
这个跟你的delay时间的密切相关的,,看下你的延时多长了

使用特权

评论回复
板凳
angerbird| | 2017-3-19 21:31 | 只看该作者
还有像这种的 LED2_ON = 1;
                LED3_ON = 1;
                LED4_ON = 1;,,,能否改成或运算赋值的会更好。。

使用特权

评论回复
地板
angerbird| | 2017-3-19 21:32 | 只看该作者
也就是按位置一操作的,,直接赋值的有可能是把其他位的给清零了

使用特权

评论回复
5
apple武|  楼主 | 2017-3-23 15:50 | 只看该作者
angerbird 发表于 2017-3-19 21:30
这个跟你的delay时间的密切相关的,,看下你的延时多长了

现在这个delay  有将近500ms

使用特权

评论回复
6
apple武|  楼主 | 2017-3-23 15:52 | 只看该作者
angerbird 发表于 2017-3-19 21:32
也就是按位置一操作的,,直接赋值的有可能是把其他位的给清零了

我去试试总体分别置一,谢谢了

使用特权

评论回复
7
sdlls| | 2017-3-24 15:51 | 只看该作者
delay时间太短了吧。

使用特权

评论回复
8
sdlls| | 2017-3-24 15:59 | 只看该作者
把延时弄的长一些。

使用特权

评论回复
9
apple武|  楼主 | 2017-4-1 08:48 | 只看该作者
知道这种方法不行,就不用它了,直接用set clear toggle  这三个也行,此路不通走别路,条条大路通罗马!!谢谢各位大神了

使用特权

评论回复
10
xiaoyaodz| | 2017-4-1 21:54 | 只看该作者
这个不是定义好的,在哪里还有操作?

使用特权

评论回复
11
xiaoyaodz| | 2017-4-1 21:54 | 只看该作者
angerbird 发表于 2017-3-19 21:30
这个跟你的delay时间的密切相关的,,看下你的延时多长了

延时都是一样的,应该是IO有问题。

使用特权

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

本版积分规则

4

主题

59

帖子

4

粉丝