TI中文支持网
TI专业的中文技术问题搜集分享网站

使用结构体编程,修改bit的时候无效.

我执行以下代码:
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
最后GPADIR寄存器的值是0x0001.如果我使用如下代码:
GpioCtrlRegs.GPADIR.all = 0x0003;
则可以正常赋值.我使用ControlSuite的v210版本,TMS320F28027.
完整代码:

#include "DSP28x_Project.h"

#ifdef TOFLASH
extern void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr);
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;

#endif

void main(void)
{

InitSysCtrl();
InitGpio();

GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO1 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0x02;
GpioCtrlRegs.GPACTRL.bit.QUALPRD1 = 0xFF;
#ifdef TOFLASH

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
#endif

for (;;)
{
if(GpioDataRegs.GPADAT.bit.GPIO12){
GpioDataRegs.GPASET.bit.GPIO1 = 1;
GpioDataRegs.GPASET.bit.GPIO0 = 1;
}
}
}

Jason Wang83:

‘最后GPADIR寄存器的值是0x0001’,你是通过哪种方式获取的寄存器的值?

有没有可能是已经正确写入寄存器的值了,但是读取的时候存在问题?

我执行以下代码:
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
最后GPADIR寄存器的值是0x0001.如果我使用如下代码:
GpioCtrlRegs.GPADIR.all = 0x0003;
则可以正常赋值.我使用ControlSuite的v210版本,TMS320F28027.
完整代码:

#include "DSP28x_Project.h"

#ifdef TOFLASH
extern void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr);
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;

#endif

void main(void)
{

InitSysCtrl();
InitGpio();

GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO1 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0x02;
GpioCtrlRegs.GPACTRL.bit.QUALPRD1 = 0xFF;
#ifdef TOFLASH

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
#endif

for (;;)
{
if(GpioDataRegs.GPADAT.bit.GPIO12){
GpioDataRegs.GPASET.bit.GPIO1 = 1;
GpioDataRegs.GPASET.bit.GPIO0 = 1;
}
}
}

Blake Ma:

您好,

在技术手册中可以看到,GPADIR 属于 EALLOW-Protected 寄存器,而在您的代码中并没有相应的 EALLOW 操作试试。

 

我执行以下代码:
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
最后GPADIR寄存器的值是0x0001.如果我使用如下代码:
GpioCtrlRegs.GPADIR.all = 0x0003;
则可以正常赋值.我使用ControlSuite的v210版本,TMS320F28027.
完整代码:

#include "DSP28x_Project.h"

#ifdef TOFLASH
extern void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr);
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;

#endif

void main(void)
{

InitSysCtrl();
InitGpio();

GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO1 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0x02;
GpioCtrlRegs.GPACTRL.bit.QUALPRD1 = 0xFF;
#ifdef TOFLASH

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
#endif

for (;;)
{
if(GpioDataRegs.GPADAT.bit.GPIO12){
GpioDataRegs.GPASET.bit.GPIO1 = 1;
GpioDataRegs.GPASET.bit.GPIO0 = 1;
}
}
}

DeDeBug:

回复 Jason Wang83:

我是XDS100v2的JTAG.

我执行以下代码:
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
最后GPADIR寄存器的值是0x0001.如果我使用如下代码:
GpioCtrlRegs.GPADIR.all = 0x0003;
则可以正常赋值.我使用ControlSuite的v210版本,TMS320F28027.
完整代码:

#include "DSP28x_Project.h"

#ifdef TOFLASH
extern void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr);
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;

#endif

void main(void)
{

InitSysCtrl();
InitGpio();

GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO1 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0x02;
GpioCtrlRegs.GPACTRL.bit.QUALPRD1 = 0xFF;
#ifdef TOFLASH

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
#endif

for (;;)
{
if(GpioDataRegs.GPADAT.bit.GPIO12){
GpioDataRegs.GPASET.bit.GPIO1 = 1;
GpioDataRegs.GPASET.bit.GPIO0 = 1;
}
}
}

DeDeBug:

回复 Blake Ma:

但也不应该是0x0001啊,JTAG读的.

我执行以下代码:
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
最后GPADIR寄存器的值是0x0001.如果我使用如下代码:
GpioCtrlRegs.GPADIR.all = 0x0003;
则可以正常赋值.我使用ControlSuite的v210版本,TMS320F28027.
完整代码:

#include "DSP28x_Project.h"

#ifdef TOFLASH
extern void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr);
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;

#endif

void main(void)
{

InitSysCtrl();
InitGpio();

GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO1 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0x02;
GpioCtrlRegs.GPACTRL.bit.QUALPRD1 = 0xFF;
#ifdef TOFLASH

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
#endif

for (;;)
{
if(GpioDataRegs.GPADAT.bit.GPIO12){
GpioDataRegs.GPASET.bit.GPIO1 = 1;
GpioDataRegs.GPASET.bit.GPIO0 = 1;
}
}
}

Blake Ma:

回复 DeDeBug:

正如之前提到的,这种初始化方式本身并不符合 EALLOW-Protected 寄存器操作方法,所以请先按照技术手册中的操作方法对代码进行修改,看看能否解决问题。

至于为什么结果是 0x0001,请问您是否在代码的其他初始化函数中对 GPADIR 进行过修改操作?

我执行以下代码:
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
最后GPADIR寄存器的值是0x0001.如果我使用如下代码:
GpioCtrlRegs.GPADIR.all = 0x0003;
则可以正常赋值.我使用ControlSuite的v210版本,TMS320F28027.
完整代码:

#include "DSP28x_Project.h"

#ifdef TOFLASH
extern void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr);
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;

#endif

void main(void)
{

InitSysCtrl();
InitGpio();

GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO1 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0x02;
GpioCtrlRegs.GPACTRL.bit.QUALPRD1 = 0xFF;
#ifdef TOFLASH

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
#endif

for (;;)
{
if(GpioDataRegs.GPADAT.bit.GPIO12){
GpioDataRegs.GPASET.bit.GPIO1 = 1;
GpioDataRegs.GPASET.bit.GPIO0 = 1;
}
}
}

DeDeBug:

回复 Blake Ma:

使用controlSuite的v210的结构体编程头文件.

我执行以下代码:
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
最后GPADIR寄存器的值是0x0001.如果我使用如下代码:
GpioCtrlRegs.GPADIR.all = 0x0003;
则可以正常赋值.我使用ControlSuite的v210版本,TMS320F28027.
完整代码:

#include "DSP28x_Project.h"

#ifdef TOFLASH
extern void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr);
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;

#endif

void main(void)
{

InitSysCtrl();
InitGpio();

GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO1 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0x02;
GpioCtrlRegs.GPACTRL.bit.QUALPRD1 = 0xFF;
#ifdef TOFLASH

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
#endif

for (;;)
{
if(GpioDataRegs.GPADAT.bit.GPIO12){
GpioDataRegs.GPASET.bit.GPIO1 = 1;
GpioDataRegs.GPASET.bit.GPIO0 = 1;
}
}
}

Jason Wang83:

(1)首先,个人觉得您这个对比替换实验室很好的,是基本可以排除其他地方对 GPADIR 进行过修改操作带来的影响的:

GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;

GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;

原处修改替换掉: GpioCtrlRegs.GPADIR.all = 0x0003;

(2)您不妨可以尝试将对其他寄存器的操作也用这种替换方式替换掉,再用仿真观察,理论上来讲这两种写法的输出结果应该是一样的;

(3)如果还是找不到原因,如楼上所说请考虑EALLOW权限问题,您也不妨尝试把做个小实验把寄存器的值取出来,例如写给一个变量再去读取变量值,如果变量值反而是正确的这就说明程序本身是没有问题的,考虑是不是可能是程序内部有访问权限仿真器访问的不正确,基本可以跳过;

如果还是找不到结果,对于您这款芯片寄存器具体的操作方法,请按照技术手册中的操作方法进行修改,没有具体用过你那块片子只能提供一点思路,加油!

我执行以下代码:
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
最后GPADIR寄存器的值是0x0001.如果我使用如下代码:
GpioCtrlRegs.GPADIR.all = 0x0003;
则可以正常赋值.我使用ControlSuite的v210版本,TMS320F28027.
完整代码:

#include "DSP28x_Project.h"

#ifdef TOFLASH
extern void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr);
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;

#endif

void main(void)
{

InitSysCtrl();
InitGpio();

GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO1 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0x02;
GpioCtrlRegs.GPACTRL.bit.QUALPRD1 = 0xFF;
#ifdef TOFLASH

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
#endif

for (;;)
{
if(GpioDataRegs.GPADAT.bit.GPIO12){
GpioDataRegs.GPASET.bit.GPIO1 = 1;
GpioDataRegs.GPASET.bit.GPIO0 = 1;
}
}
}

DeDeBug:

回复 Jason Wang83:

我刚才试了一下,在JTAG模式下,第一个GPADIR语句是可以修改,第二个不可以.

GpioCtrlRegs.GPADIR.all = 0x0003;

GpioCtrlRegs.GPADIR.all = 0x0005;

如果单步执行,两个都可以修改.

我修改ADCSOC0CTL时候也是,第一次有效.

当然,上面的实验全部没有打开EALLOW.

然后我烧写到Flash,运行在GetMode,却不能修改,是JTAG的BUG么?XDS100v2.

我执行以下代码:
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
最后GPADIR寄存器的值是0x0001.如果我使用如下代码:
GpioCtrlRegs.GPADIR.all = 0x0003;
则可以正常赋值.我使用ControlSuite的v210版本,TMS320F28027.
完整代码:

#include "DSP28x_Project.h"

#ifdef TOFLASH
extern void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr);
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;

#endif

void main(void)
{

InitSysCtrl();
InitGpio();

GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO1 = 1;
GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0x02;
GpioCtrlRegs.GPACTRL.bit.QUALPRD1 = 0xFF;
#ifdef TOFLASH

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
#endif

for (;;)
{
if(GpioDataRegs.GPADAT.bit.GPIO12){
GpioDataRegs.GPASET.bit.GPIO1 = 1;
GpioDataRegs.GPASET.bit.GPIO0 = 1;
}
}
}

DeDeBug:

回复 Blake Ma:

加了NOP后即时没有用EALLOW也能改变GPADIR的数值.打开EALLOW一直能修改.

赞(0)
未经允许不得转载:TI中文支持网 » 使用结构体编程,修改bit的时候无效.
分享到: 更多 (0)