主题中讨论的其他部件:MSP-TS430PZ100USB
工具/软件:Code Composer Studio
TI社区您好,
我对焊接在MSP-TS430PZ100USB评估板的XT1垫上的20 MHz晶体有严重问题。
我有第二个高频晶体,在XT2上焊接4MHz。
4Mhz晶体工作正常,20MHz晶体不工作。 我已根据公式C1=C2=(2*Cload)-CM寄 生=(2*12pF)-2pF添加了2个22pF的电容器
我已经购买了带有XT2的ACLK,并将其分配给了WFP 1.0 :我可以在那里测量一个漂亮的4Mhz波浪。
我已经购买了带有XT1的SMCLK,并将其传送到了WFP 3.4 :只要运行代码,我就可以看到直流电压,并且在针脚上有一些随机振荡(非常小)。
另一个问题是MCLK:当我想手动修改UCSCTL4寄存器的SELM位时,程序崩溃。 此外,当我使用库函数和TI示例代码时,这些问题仍然存在。
请帮助我,我已经忙了一个星期了,也有同样的问题,我的时间已经不多了。
代码如下:
#include "driverlib.h"
//*********************************************************************************************************
/////
MCLK的目标频率(单位:kHz
)////*********************************************************************************************************
#define UCS_Desired (定义UCS_Desired) MCLK_FREQUENCY IN_kHz 2万
//*************************************************************************************************
//////MCLK/FLLRef
比率(所需频率/FLL参考时钟频率)
//////*****************************************************************************************************************
#define UCS_MCLK_FLLREF_Ratio 609
//*************************************************************************************´
//*************************************************************************************************
/////XT
正在使用的晶体频率
//////*************************************************************************************************
#define UCS_XT1_CRYSTAL_FREQUENCY 2000万
#define UCS_XT2_CRYSTLE_FREQUENCY 400万
//用于存储当前时钟值
的Variable UINT32_t clockValue =0;
//用于存储振荡器故障标记
uint16_t状态的Variable;
//用于存储返回的STATUS_SUCCESS或STATUS_FAIL
uint8_t returnValue =0;
void set_clock_frequences()
{
//端口3.4 上的SMCLK (插针#46)
GPIO_setAsPeripheralModuleFunctionOutputPin (
GPIO端口P3,
GPIO _PIN4
);
//在WFP 1.0 上安装ACLK (针脚34)
GPIO_setAsPeripheralModuleFunctionOutputPin (
GPIO端口P1,
GPIO_PIN0
);
//启动HF XT2晶体端口选择XT2
GPIO_setAsPeripheralModuleFunctionInputPin (
GPIO端口P7,
GPIO _PIN2 + GPIO _PIN3
);
//将VCORE =3设置为20MHz时钟
PMM_setVCore (PMM_Core_LEVEL_3);
//设置DCO;FLL参考= REFO
UCS_initClockSignal(.
UCS_FLLREF,
UCS_REFOCLK_SELECT,
UCS_CLOCK分隔符_1
);
//设置比率和所需MCLK频率并初始化DCO
UCS_INITFLLSettle(.
UCS_Desired MCLK_FREQUENCY IN_kHz,
UCS_MCLK_FLLREF_Ratio
);
状态= UCS_TRENONHFXT1WithTimeout (UCS_XT1_DRIVE_25000);
状态= UCS_TRENONXT2WithTimeout (UCS_XT2_DRIVE_4MHz_8MHZ,5000);
#IF 0
//使用库函数设置MCLK
UCS_initClockSignal(. //在功能内,程序崩溃
UCS_MCLK,
UCS_DCOCLK_SELECT,
UCS_CLOCK分隔符_1
);
#endif
#if 0
//手动设置MCLK -->问题仍然存在
//清除寄存器
UCSCTL4 &=~(SELM_7);
//将XT1 CLK设置为MCLK源
UCSCTL4 |= SELM__XT1CLK; //此处程序崩溃
// MCLK源除法器f (MCLK)/1
UCSCTL5 |= DIVM_0;
//此处为断点
状态=状态;
#endif
//设置SMCLK
UCS_initClockSignal(.
UCS_SMCLK,
UCS_XT1CLK_SELECT,
UCS_CLOCK分隔符_1
);
//设置ACLK
UCS_initClockSignal(.
UCS_ACLK,
UCS_XT2CLK_SELECT,
UCS_CLOCK分隔符_1
);
//启用全局振荡器故障标志
SFR_clearInterrupt (SFR_--振荡器----故障----中断);
sfr_enableInterrupt (sfr_st荡 器_fault_interrupt);
//启用全局中断
__bis_sr_register (GIE);
//验证时钟设置是否符合预期
UCS_setExternalClockSource (UCS_XT1_CRYSTAL_Frequency,UCS_XT2_CRYSTAL_Frequency);
clockValue = UCS_getSMCLK();
clockValue = UCS_getMCLK();
clockValue = UCS_getACLK();
}
#if defined(__TI_Compiler_version__)|| defined(__IAR_systems_ICC__)
#pragma vector=UNMI_vector
__interrupt
#Elif defined(__GNUC__)
__attribute___(interrupt (UNMI_vector))
#endife) ISR_{nifvoid
做
{
//如果在超时后仍无法清除振荡器故障标志,
//在这里设置陷阱并等待。
状态= UCS_clearAllOscar FlagsWithTimeout(1000);
}
while (status !=0);
}
作废NMI_ISR(void)
{
做
{
//如果在超时后仍无法清除振荡器故障标志,
//在这里设置陷阱并等待。
状态= UCS_clearAllOscar FlagsWithTimeout(1000);
}
while (status !=0);
}
附注:
当我评论MCLK修改时,正如您在代码中看到的那样,程序不会崩溃。
如果我将DCO时钟应用到SMCLK (引脚3.4),我可以测量20MHz。 问题:抖动太大,这就是为什么我在XT1上急需使用20MHz晶体的原因。
感谢您的事先帮助,
谨致问候,
Stefan