MSP430F5510外围外接XT1=32.768KHz,XT2=12MHz。现目前要使用USB功能,但是之前有问题是XT2只能被USB使用,导致系统的主时钟MCLK和SMCLK 只能使用内部的DCO=12MHz,但是系统跑起来很不稳定,配置时钟输出来看到了SMCLK和MCLK系统在12.4MHz左右,方波的过冲很大。我么AD采样,定时器都是一SMCLK作为时钟源进行的分频,请问是否有什么方式既能USB工作,又能系统工作稳定?期待您们的回复!
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.
MSP430F5510外围外接XT1=32.768KHz,XT2=12MHz。现目前要使用USB功能,但是之前有问题是XT2只能被USB使用,导致系统的主时钟MCLK和SMCLK 只能使用内部的DCO=12MHz,但是系统跑起来很不稳定,配置时钟输出来看到了SMCLK和MCLK系统在12.4MHz左右,方波的过冲很大。我么AD采样,定时器都是一SMCLK作为时钟源进行的分频,请问是否有什么方式既能USB工作,又能系统工作稳定?期待您们的回复!
USB的时钟是通过外部时钟进行倍频的,当芯片包括XT2,那么会将XT2作为USB时钟的参考时钟源。CLKref>1.5MHz. 而SMCLK是来源于DCO, FLL也可以以XT1为参考时钟源。所以DCO的精度也很高。不存在系统不稳定的问题。
我利用的就是USB开发包里面的系统时钟设置,配置如下。
#ifndef _USB_
static U8 Init_Clock(void)
{
P5SEL |= BIT2+BIT3; // Port select XT2
P5SEL |= BIT4+BIT5; // Port select XT1
UCSCTL6 &= ~(XT2OFF+XT1OFF); // Set XT2 XT1 On
#if defined ( _XTAL_32M)
UCSCTL6 |= XCAP_3; // Internal load cap
UCSCTL5 |= 0x0011; //SMCL=MCLK=16Mhz
#elif defined (_XTAL_16M)
//UCSCTL6 |= XCAP_3;
UCSCTL5 |= 0x0000; //16/1=16Mhz
#elif defined (_XTAL_12M)
//UCSCTL6 |= XCAP_3;
UCSCTL5 |= 0x0000; //SMCL=MCLK=12Mhz
#endif
do{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
#if defined(_XTAL_32M)
UCSCTL6 |= XT2DRIVE_3; // Decrease XT2 Drive according to,16~24 expected frequency
#elif defined(_XTAL_16M)
UCSCTL6 |= XT2DRIVE_2; // Decrease XT2 Drive according to,16~24 expected frequency
#elif defined (_XTAL_12M)
UCSCTL6 |= XT2DRIVE0; // Decrease XT2 Drive according to,16~8 expected frequency
#endif
UCSCTL4 |= SELA__XT1CLK + SELS_5 + SELM_5; // ACLK=XT1 SMCLK = MCLK = XT2
return 0;
}
#else
static U8 Init_Clock(void)
{
//Initialization of clock module
//PIN Select
P5SEL |= BIT2+BIT3; // Port select XT2
P5SEL |= BIT4+BIT5; // Port select XT1
//Open XT1
UCSCTL6 &= ~(XT1OFF);
do{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
//use REFO for FLL and ACLK
UCSCTL3 = (UCSCTL3 & ~(SELREF_7)) | (SELREF__REFOCLK); //
UCSCTL4 = (UCSCTL4 & ~(SELA_7)) | (SELA__XT1CLK); //ACLK driven by XT1
//MCLK will be driven by the FLL (not by XT2), referenced to the REFO
Init_FLL_Settle(USB_MCLK_FREQ / 1000, USB_MCLK_FREQ / 32768); //Start the FLL, at the freq indicated by the config
//constant USB_MCLK_FREQ
XT2_Start(XT2DRIVE_0); //Start the "USB crystal"
return 0;
}
#endif
我把ACLK、MCLK还有SMCLK 通过PIN映射出来,用示波器测试发现MCLK和SMCLK极其不稳定,如11.5MHZ、12.6MHz摆动。并且测试出SMCLK的幅度只有50mv。系统很多时钟源都来源于SMCLK,所以如Timer和ADC都相继出现问题。
在使用USB功能时,建议采用内部DCO作为系统的MCLK或ACLK,否则有可能在USB初始化时失败,造成USB不能正常工作。