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.

产品急于量产;遇到问题紧急求助!

Other Parts Discussed in Thread: MOTORWARE, TMS320F28069F

我用的是TMS320F28069F ;TI例程Motorware中用的是内部RC时钟;用RC时钟做CAN通信时出现不能正常接收;有可能是RC时钟精度问题,现在想改成片载晶振;程序中怎么改?我这样改怎么不行!!!!

void HAL_setupClks(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;


// enable internal oscillator 1
CLK_disableOsc1(obj->clkHandle);

// set the oscillator source
CLK_setOscSrc(obj->clkHandle,CLK_OscSrc_External);

// disable the external clock in
CLK_disableClkIn(obj->clkHandle);

// disable the crystal oscillator
CLK_enableCrystalOsc(obj->clkHandle);

// disable oscillator 2
CLK_disableOsc2(obj->clkHandle);

CLK_setOsc2Src(obj->clkHandle,CLK_Osc2Src_Internal);

// set the low speed clock prescaler
CLK_setLowSpdPreScaler(obj->clkHandle,CLK_LowSpdPreScaler_SysClkOut_by_4);

// set the clock out prescaler
CLK_setClkOutPreScaler(obj->clkHandle,CLK_ClkOutPreScaler_SysClkOut_by_1);

return;
} // end of HAL_setupClks() function

  • 时钟源选了后   还需要使能

  • 哥们。使能在哪选?那段程序给贴出来

  • 参考一下代码

    CLK_enableCrystalOsc(obj->clkHandle); // Turn on XTALOSC
    usDelay(1000); // Wait for 1ms while XTAL starts up
    CLK_setOsc2Src(obj->clkHandle,CLK_Osc2Src_External)
    CLK_setOscSrc(obj->clkHandle,CLK_OscSrc_External);
    // disable the external clock in
    CLK_disableClkIn(obj->clkHandle);

  • void HAL_setupClks(HAL_Handle handle)
    {
    HAL_Obj *obj = (HAL_Obj *)handle;


    // enable internal oscillator 1
    CLK_disableOsc1(obj->clkHandle);

    // set the oscillator source
    CLK_setOscSrc(obj->clkHandle,CLK_OscSrc_External);

    // disable the external clock in
    CLK_disableClkIn(obj->clkHandle);

    // disable the crystal oscillator
    CLK_enableCrystalOsc(obj->clkHandle);
    usDelay(1000);//

    // disable oscillator 2
    CLK_disableOsc2(obj->clkHandle);

    CLK_setOsc2Src(obj->clkHandle,CLK_Osc2Src_External);

    // set the low speed clock prescaler
    CLK_setLowSpdPreScaler(obj->clkHandle,CLK_LowSpdPreScaler_SysClkOut_by_1);

    // set the clock out prescaler
    CLK_setClkOutPreScaler(obj->clkHandle,CLK_ClkOutPreScaler_SysClkOut_by_1);

    return;
    } // end of HAL_setupClks() function

    这样改后试了还是不行!

  • 参考下面代码,来改对应的Motorware版本的代码

    //---------------------------------------------------------------------------
    // Example: XtalOscSel:
    //---------------------------------------------------------------------------
    // This function switches to External CRYSTAL oscillator and turns off all other clock
    // sources to minimize power consumption. This option may not be available on all
    // device packages

    void XtalOscSel (void) {
    EALLOW;
    SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 0; // Turn on XTALOSC
    DELAY_US(1000L); // 1mS delay to ensure crystal
    // oscillator is up and running.
    // Adjust as needed.
    SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 1; // Turn off 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; //Switch Watchdog Clk Src to internal clock 1
    SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1; // Turn off INTOSC2
    SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0; // Turn on INTOSC1
    EDIS;

    }

  • 这个我之前参考试过,还是不能运行。我认为别的地方应该还需要改...

  • // disable oscillator 2
    CLK_disableOsc2(obj->clkHandle);

    不要加这句。

    另外你外部晶振多少M。

    ERIC

  • 您好 试试下面的代码

    void HAL_setupClks(HAL_Handle handle)

    {

    HAL_Obj *obj = (HAL_Obj *)handle;

    CLK_enableCrystalOsc(obj->clkHandle);

    usDelay(1000);

    CLK_setOscSrc(obj->clkHandle,CLK_OscSrc_External);

    CLK_disableOsc1(obj->clkHandle);

    CLK_disableOsc2(obj->clkHandle);

    CLK_disableClkIn(obj->clkHandle); // set the low speed clock prescaler

    CLK_setLowSpdPreScaler(obj->clkHandle,CLK_LowSpdPreScaler_SysClkOut_by_1); // set the clock out prescaler

    CLK_setClkOutPreScaler(obj->clkHandle,CLK_ClkOutPreScaler_SysClkOut_by_1);

    return;

    } // end of HAL_setupClks() function

    另外你还需要根据你用的晶振的频率来改PLL的倍频,我用的是20MHz的晶体所以我把以前根据10M的振荡器定的倍频减半。

    // Setup the PLL
    HAL_setupPll(handle,PLL_ClkFreq_45_MHz);

  • 感谢Victor Zheng,在我自己设计的板子上验证过这段代码是可以正常使用的。