刚开始接触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.
他也说到会出现错误,但是我没有读这个寄存器,只是对他进行了简单的写操作。请问大神们,这个问题出在那里??谢谢了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
LED3_ON = 1;
LED4_ON = 1;,,,能否改成或运算赋值的会更好。。
我去试试总体分别置一,谢谢了
一周热门 更多>