我执行以下代码:
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一直能修改.
TI中文支持网



