TMS320F28069使用内部振荡或者使用外部晶体工作均正常,使用外部时钟输入出现问题,具体情况如下:
硬件连接:X1——接地;X2——悬空,有源晶振产生的时钟从GPIO19或GPIO38输入。
软件设置如下:InitSysCtrl();中采用ExtOscSel()
// IntOsc1Sel();
ExtOscSel();
//XtalOscSel ();
其中ExtOscSel()代码如下:
void ExtOscSel (void) {
EALLOW;
SysCtrlRegs.XCLK.bit.XCLKINSEL = 1; // 1-GPIO19 = XCLKIN, 0-GPIO38 = XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 1; // Turn on XTALOSC
SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 0; // Turn on XCLKIN
SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0; // Switch to external clock
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1; // Switch from INTOSC1 to INTOSC2/ext clk
SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 1; // Switch Watchdog Clk Src to external clock
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1; // Turn off INTOSC2
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 1; // Turn off INTOSC1
EDIS;
}
现在的问题是:如果时钟从GPIO38接入,工作正常,但是从GPIO19接入,就不能工作。当然,以上ExtOscSel()函数中SysCtrlRegs.XCLK.bit.XCLKINSEL都做好了相应的设置。
更为奇怪的是:如果时钟从GPIO38接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL设置为0或者1,都可以正常工作;而如果时钟从GPIO19接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL怎么设置,都不能正常工作。仿佛这个设置从来就没有起作用!?
从手册上看,28069默认的外部时钟输入口是GPIO38,如果使用GPIO38就会和JTAG时钟冲突,怎么把它切换到GPIO19呢?除了上述的SysCtrlRegs.XCLK.bit.XCLKINSEL设置以外,是否还需要其他的硬件或软件设置。
谢谢大家!
Eric Ma:
Hi Jie,
目前没有发现过有GPIO19不能作为外部时钟引脚的问题。
我想问Jie是如何判断GPIO19不能用的。
时钟切换到GPIO19后,失败,那应该会有时钟丢失的情况,那么芯片会复位,并进入下面的代码
void InitPll(Uint16 val, Uint16 divsel){ volatile Uint16 iVol;
// Make sure the PLL is not running in limp mode if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0) { EALLOW; // OSCCLKSRC1 failure detected. PLL running in limp mode. // Re-enable missing clock logic. SysCtrlRegs.PLLSTS.bit.MCLKCLR = 1; EDIS; // Replace this line with a call to an appropriate // SystemShutdown(); function. __asm(" ESTOP0"); // Uncomment for debugging purposes }
Eric
TMS320F28069使用内部振荡或者使用外部晶体工作均正常,使用外部时钟输入出现问题,具体情况如下:
硬件连接:X1——接地;X2——悬空,有源晶振产生的时钟从GPIO19或GPIO38输入。
软件设置如下:InitSysCtrl();中采用ExtOscSel()
// IntOsc1Sel();
ExtOscSel();
//XtalOscSel ();
其中ExtOscSel()代码如下:
void ExtOscSel (void) {
EALLOW;
SysCtrlRegs.XCLK.bit.XCLKINSEL = 1; // 1-GPIO19 = XCLKIN, 0-GPIO38 = XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 1; // Turn on XTALOSC
SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 0; // Turn on XCLKIN
SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0; // Switch to external clock
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1; // Switch from INTOSC1 to INTOSC2/ext clk
SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 1; // Switch Watchdog Clk Src to external clock
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1; // Turn off INTOSC2
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 1; // Turn off INTOSC1
EDIS;
}
现在的问题是:如果时钟从GPIO38接入,工作正常,但是从GPIO19接入,就不能工作。当然,以上ExtOscSel()函数中SysCtrlRegs.XCLK.bit.XCLKINSEL都做好了相应的设置。
更为奇怪的是:如果时钟从GPIO38接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL设置为0或者1,都可以正常工作;而如果时钟从GPIO19接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL怎么设置,都不能正常工作。仿佛这个设置从来就没有起作用!?
从手册上看,28069默认的外部时钟输入口是GPIO38,如果使用GPIO38就会和JTAG时钟冲突,怎么把它切换到GPIO19呢?除了上述的SysCtrlRegs.XCLK.bit.XCLKINSEL设置以外,是否还需要其他的硬件或软件设置。
谢谢大家!
Jie Hu2:
回复 Eric Ma:
目前情况是这样的:
我事先将程序通过JTAG烧录到DSP。
当把时钟线连到GPIO19,开机没有任何反应。
当把时钟线连到GPIO38,开机即正常运行。而且,即便是SysCtrlRegs.XCLK.bit.XCLKINSEL = 1; // 1-GPIO19 = XCLKIN, 0-GPIO38 = XCLKIN,仍然可以正常运行,所以我判断是这切换时钟线的话根本没有起作用。为了避免意外失误,我用了两块板子做实验,情况完全一致。可是GPIO38是JTAG的TCK引脚,不太适合当外部时钟使用。请问:
外部时钟输入线默认为GPIO38,要切换到GPIO19除了上述的这行代码,还需要其他的软件或者硬件设置吗?
项目需要,急待解决,谢谢各位!
TMS320F28069使用内部振荡或者使用外部晶体工作均正常,使用外部时钟输入出现问题,具体情况如下:
硬件连接:X1——接地;X2——悬空,有源晶振产生的时钟从GPIO19或GPIO38输入。
软件设置如下:InitSysCtrl();中采用ExtOscSel()
// IntOsc1Sel();
ExtOscSel();
//XtalOscSel ();
其中ExtOscSel()代码如下:
void ExtOscSel (void) {
EALLOW;
SysCtrlRegs.XCLK.bit.XCLKINSEL = 1; // 1-GPIO19 = XCLKIN, 0-GPIO38 = XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 1; // Turn on XTALOSC
SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 0; // Turn on XCLKIN
SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0; // Switch to external clock
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1; // Switch from INTOSC1 to INTOSC2/ext clk
SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 1; // Switch Watchdog Clk Src to external clock
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1; // Turn off INTOSC2
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 1; // Turn off INTOSC1
EDIS;
}
现在的问题是:如果时钟从GPIO38接入,工作正常,但是从GPIO19接入,就不能工作。当然,以上ExtOscSel()函数中SysCtrlRegs.XCLK.bit.XCLKINSEL都做好了相应的设置。
更为奇怪的是:如果时钟从GPIO38接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL设置为0或者1,都可以正常工作;而如果时钟从GPIO19接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL怎么设置,都不能正常工作。仿佛这个设置从来就没有起作用!?
从手册上看,28069默认的外部时钟输入口是GPIO38,如果使用GPIO38就会和JTAG时钟冲突,怎么把它切换到GPIO19呢?除了上述的SysCtrlRegs.XCLK.bit.XCLKINSEL设置以外,是否还需要其他的硬件或软件设置。
谢谢大家!
Jie Hu2:
回复 Eric Ma:
附件是JTAG连接图,请帮助看看是否有问题。
TMS320F28069使用内部振荡或者使用外部晶体工作均正常,使用外部时钟输入出现问题,具体情况如下:
硬件连接:X1——接地;X2——悬空,有源晶振产生的时钟从GPIO19或GPIO38输入。
软件设置如下:InitSysCtrl();中采用ExtOscSel()
// IntOsc1Sel();
ExtOscSel();
//XtalOscSel ();
其中ExtOscSel()代码如下:
void ExtOscSel (void) {
EALLOW;
SysCtrlRegs.XCLK.bit.XCLKINSEL = 1; // 1-GPIO19 = XCLKIN, 0-GPIO38 = XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 1; // Turn on XTALOSC
SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 0; // Turn on XCLKIN
SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0; // Switch to external clock
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1; // Switch from INTOSC1 to INTOSC2/ext clk
SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 1; // Switch Watchdog Clk Src to external clock
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1; // Turn off INTOSC2
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 1; // Turn off INTOSC1
EDIS;
}
现在的问题是:如果时钟从GPIO38接入,工作正常,但是从GPIO19接入,就不能工作。当然,以上ExtOscSel()函数中SysCtrlRegs.XCLK.bit.XCLKINSEL都做好了相应的设置。
更为奇怪的是:如果时钟从GPIO38接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL设置为0或者1,都可以正常工作;而如果时钟从GPIO19接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL怎么设置,都不能正常工作。仿佛这个设置从来就没有起作用!?
从手册上看,28069默认的外部时钟输入口是GPIO38,如果使用GPIO38就会和JTAG时钟冲突,怎么把它切换到GPIO19呢?除了上述的SysCtrlRegs.XCLK.bit.XCLKINSEL设置以外,是否还需要其他的硬件或软件设置。
谢谢大家!
Eric Ma:
回复 Jie Hu2:
Jie,
JTAG没什么问题。
1. 如果是用GPIO38,对你工程仿真造成什么样的影响?
2. 如果是用GPIO19失效,我建议是要带仿真器调试一下,看一下是什么问题,是否是真的出现时钟失效?
Eric
TMS320F28069使用内部振荡或者使用外部晶体工作均正常,使用外部时钟输入出现问题,具体情况如下:
硬件连接:X1——接地;X2——悬空,有源晶振产生的时钟从GPIO19或GPIO38输入。
软件设置如下:InitSysCtrl();中采用ExtOscSel()
// IntOsc1Sel();
ExtOscSel();
//XtalOscSel ();
其中ExtOscSel()代码如下:
void ExtOscSel (void) {
EALLOW;
SysCtrlRegs.XCLK.bit.XCLKINSEL = 1; // 1-GPIO19 = XCLKIN, 0-GPIO38 = XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 1; // Turn on XTALOSC
SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 0; // Turn on XCLKIN
SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0; // Switch to external clock
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1; // Switch from INTOSC1 to INTOSC2/ext clk
SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 1; // Switch Watchdog Clk Src to external clock
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1; // Turn off INTOSC2
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 1; // Turn off INTOSC1
EDIS;
}
现在的问题是:如果时钟从GPIO38接入,工作正常,但是从GPIO19接入,就不能工作。当然,以上ExtOscSel()函数中SysCtrlRegs.XCLK.bit.XCLKINSEL都做好了相应的设置。
更为奇怪的是:如果时钟从GPIO38接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL设置为0或者1,都可以正常工作;而如果时钟从GPIO19接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL怎么设置,都不能正常工作。仿佛这个设置从来就没有起作用!?
从手册上看,28069默认的外部时钟输入口是GPIO38,如果使用GPIO38就会和JTAG时钟冲突,怎么把它切换到GPIO19呢?除了上述的SysCtrlRegs.XCLK.bit.XCLKINSEL设置以外,是否还需要其他的硬件或软件设置。
谢谢大家!
Jie Hu2:
回复 Eric Ma:
谢谢您的答复。
按照手册上的描述,如果用GPIO38,会和仿真时钟TCK造成时钟竞争。
接GPIO19带仿真器运行时是正常的,大概是因为此时使用的是仿真器提供的时钟,但是停止仿真后系统就不运行了。
InitPll函数内容如下:单步仿真运行过程正常,不会进入您上文讲到的丢失时钟的选项。void InitPll(Uint16 val, Uint16 divsel){ volatile Uint16 iVol;
// Make sure the PLL is not running in limp mode if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0) { EALLOW; // OSCCLKSRC1 failure detected. PLL running in limp mode. // Re-enable missing clock logic. SysCtrlRegs.PLLSTS.bit.MCLKCLR = 1; EDIS; // Replace this line with a call to an appropriate // SystemShutdown(); function. asm(" ESTOP0"); // Uncomment for debugging purposes }
// DIVSEL MUST be 0 before PLLCR can be changed from // 0x0000. It is set to 0 by an external reset XRSn // This puts us in 1/4 if (SysCtrlRegs.PLLSTS.bit.DIVSEL != 0) { EALLOW; SysCtrlRegs.PLLSTS.bit.DIVSEL = 0; EDIS; }
// Change the PLLCR if (SysCtrlRegs.PLLCR.bit.DIV != val) {
EALLOW; // Before setting PLLCR turn off missing clock detect logic SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1; SysCtrlRegs.PLLCR.bit.DIV = val; EDIS;
// Optional: Wait for PLL to lock. // During this time the CPU will switch to OSCCLK/2 until // the PLL is stable. Once the PLL is stable the CPU will // switch to the new PLL value. // // This time-to-lock is monitored by a PLL lock counter. // // Code is not required to sit and wait for the PLL to lock. // However, if the code does anything that is timing critical, // and requires the correct clock be locked, then it is best to // wait until this switching has completed.
// Wait for the PLL lock bit to be set.
// The watchdog should be disabled before this loop, or fed within // the loop via ServiceDog().
// Uncomment to disable the watchdog DisableDog();
while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1) { // Uncomment to service the watchdog // ServiceDog(); }
EALLOW; SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0; EDIS; }
// If switching to 1/2 if((divsel == 1)||(divsel == 2)) { EALLOW; SysCtrlRegs.PLLSTS.bit.DIVSEL = divsel; EDIS; }
// If switching to 1/1 // * First go to 1/2 and let the power settle // The time required will depend on the system, this is only an example // * Then switch to 1/1 if(divsel == 3) { EALLOW; SysCtrlRegs.PLLSTS.bit.DIVSEL = 2; DELAY_US(50L); SysCtrlRegs.PLLSTS.bit.DIVSEL = 3; EDIS; }}
TMS320F28069使用内部振荡或者使用外部晶体工作均正常,使用外部时钟输入出现问题,具体情况如下:
硬件连接:X1——接地;X2——悬空,有源晶振产生的时钟从GPIO19或GPIO38输入。
软件设置如下:InitSysCtrl();中采用ExtOscSel()
// IntOsc1Sel();
ExtOscSel();
//XtalOscSel ();
其中ExtOscSel()代码如下:
void ExtOscSel (void) {
EALLOW;
SysCtrlRegs.XCLK.bit.XCLKINSEL = 1; // 1-GPIO19 = XCLKIN, 0-GPIO38 = XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 1; // Turn on XTALOSC
SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 0; // Turn on XCLKIN
SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0; // Switch to external clock
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1; // Switch from INTOSC1 to INTOSC2/ext clk
SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 1; // Switch Watchdog Clk Src to external clock
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1; // Turn off INTOSC2
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 1; // Turn off INTOSC1
EDIS;
}
现在的问题是:如果时钟从GPIO38接入,工作正常,但是从GPIO19接入,就不能工作。当然,以上ExtOscSel()函数中SysCtrlRegs.XCLK.bit.XCLKINSEL都做好了相应的设置。
更为奇怪的是:如果时钟从GPIO38接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL设置为0或者1,都可以正常工作;而如果时钟从GPIO19接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL怎么设置,都不能正常工作。仿佛这个设置从来就没有起作用!?
从手册上看,28069默认的外部时钟输入口是GPIO38,如果使用GPIO38就会和JTAG时钟冲突,怎么把它切换到GPIO19呢?除了上述的SysCtrlRegs.XCLK.bit.XCLKINSEL设置以外,是否还需要其他的硬件或软件设置。
谢谢大家!
yanhui fu:
jie hu2 你好
我28069设置外部时钟输入是这样的。
首先硬件和你设置的一样X1——接地;X2——悬空。
软件我只实验过使用外部有源时钟源输入到GPIO19时钟和使用内部时钟源的情况。使用内部时钟源既然你能用,我就不多说了,说说我使用外部时钟源的情况,我是这么设置的,
//—————————————————————————
// Example: ExtOscSel:
//—————————————————————————
// This function switches to External oscillator and turns off all other clock // sources to minimize power consumption.
void ExtOscSel (void)
{
EALLOW;
SysCtrlRegs.XCLK.bit.XCLKINSEL = 1; // 1-GPIO19 = XCLKIN, 0-GPIO38 = XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 1; // Turn on XTALOSC
SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 0; // Turn on XCLKIN
SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0; // Switch to external clock
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1; // Switch from INTOSC1 to INTOSC2/ext clk
SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 0; // Clock Watchdog off of INTOSC1 always
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1; // Turn off INTOSC2
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0; // Leave INTOSC1 on
EDIS;
}
黄色背景颜色是咱俩不同的地方,我是按TI提供源程序做的,我想你是修改了这两行,我当时没有考虑看门狗这块,你不妨修改后试试,我这块没有仔细研究。如果还不行,咱有空再细细研究这一块。
TMS320F28069使用内部振荡或者使用外部晶体工作均正常,使用外部时钟输入出现问题,具体情况如下:
硬件连接:X1——接地;X2——悬空,有源晶振产生的时钟从GPIO19或GPIO38输入。
软件设置如下:InitSysCtrl();中采用ExtOscSel()
// IntOsc1Sel();
ExtOscSel();
//XtalOscSel ();
其中ExtOscSel()代码如下:
void ExtOscSel (void) {
EALLOW;
SysCtrlRegs.XCLK.bit.XCLKINSEL = 1; // 1-GPIO19 = XCLKIN, 0-GPIO38 = XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 1; // Turn on XTALOSC
SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 0; // Turn on XCLKIN
SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0; // Switch to external clock
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1; // Switch from INTOSC1 to INTOSC2/ext clk
SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 1; // Switch Watchdog Clk Src to external clock
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1; // Turn off INTOSC2
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 1; // Turn off INTOSC1
EDIS;
}
现在的问题是:如果时钟从GPIO38接入,工作正常,但是从GPIO19接入,就不能工作。当然,以上ExtOscSel()函数中SysCtrlRegs.XCLK.bit.XCLKINSEL都做好了相应的设置。
更为奇怪的是:如果时钟从GPIO38接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL设置为0或者1,都可以正常工作;而如果时钟从GPIO19接入,无论SysCtrlRegs.XCLK.bit.XCLKINSEL怎么设置,都不能正常工作。仿佛这个设置从来就没有起作用!?
从手册上看,28069默认的外部时钟输入口是GPIO38,如果使用GPIO38就会和JTAG时钟冲突,怎么把它切换到GPIO19呢?除了上述的SysCtrlRegs.XCLK.bit.XCLKINSEL设置以外,是否还需要其他的硬件或软件设置。
谢谢大家!
jim lee1:
本人遇到同样问题, 你的设置没有问题,但是你必须保证后面初始化GPIO的时候,一定不能,配置GPIO19,我的最后解决就是,初始化GPIO时,不初始化,GPIO19,结果就正确了,