This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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

Other Parts Discussed in Thread: CONTROLSUITE, TMS320F28027

我执行以下代码:
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;
}
}
}

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

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

  • 您好,

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

     

  • 我是XDS100v2的JTAG.

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

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

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

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

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

    GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;

    GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;

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

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

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

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

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

    GpioCtrlRegs.GPADIR.all = 0x0003;

    GpioCtrlRegs.GPADIR.all = 0x0005;

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

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

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

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

  • (1)如果打开 EALLOW 问题是否能够解决?

    (2)另外,可以尝试在GpioCtrlRegs.GPADIR.all = 0x0003;  和 GpioCtrlRegs.GPADIR.all = 0x0005; 两条语句之间添加若干个 NOP 指令,观察问题能够解决。

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