主题中讨论的其他器件:MSP430WARE
/*edit:未来的线程读取器,导致此问题的实际原因是我缺少这行代码
* PJSEL0 |= BIT4 | BIT5 | BIT6 | BIT7; //用于 XT1和 XT2
*用于设置 GPIO 引脚振荡器作为晶体输入打开、而不仅仅是 GPIO。 当端口到达名为 ports 的字母时,我就停止了对端口的读取。
*
因此、我使用的是最新的 CCS、我使用的是独立的 MSP430FET 编程器、而不是内置在开发板中的编程器、并且我在 Y1中添加了自己的12MHz 振荡器。 我从 msp430ware 驱动程序中构建了时钟初始化程序、特别是 CS.c 当我运行下面的代码时、我总是会在两个晶振上都超时。
uint8_t init_crystals (){
//此函数初始化 X2上的高频晶振和 X1上的低频晶振
//此外,它可以适当地设置和提供每个系统时钟源。 (请参阅其他文档、了解其中包含的内容)
//最后,此函数返回一个状态向量,指示是否发生了任何错误
uint8_t crystal_errors = 0;
///---------------- LF 频率、HF 频率
cs_setExternalClockSource (32768、12000000);//这告诉将来函数低频和高频是什么频率
if (CS_TurnOnHFXTWithTimeout (CS_HFXT_DRIVE_8MHZ_16MHz、0xFFF)){
//"STATUS_SUCCESS = 1、STATUS_FAILURE = 0、因此、如果晶体上的过程正常工作、则会发生这种情况
if (CS_TurnOnLFXTWithTimeout (CS_LFXT_DRIVE_3、0xFFF)){
//"STATUS_SUCCESS = 1、STATUS_FAILURE = 0、因此、如果晶体上的过程正常工作、则会发生这种情况
//在这种状态下,两个晶振都已成功激活,现在是时候设置时钟源了。
FRAMCTL_configureWaitStateControl (FRAMCTL_ACCESS_TIME_CYCESS_1); //effective Frequency = Nominal * 1/(1+cycles)、因此我们在这里仅使用一个。
CS_initClockSignal (CS_MCLK、CS_HFXTCLK_select、CS_Clock_divider _1);//Errata 注释:切勿单步将 SMCLK 升高到 MCLK 以上、它们必须在某个点同步
CS_initClockSignal (CS_SMCLK、CS_HFXTCLK_select、CS_clock_divider);//出于我猜测的原因将这个小数设置为1.5MHz。
CS_initClockSignal (CS_ACLK、CS_LFXTCLK_select、CS_Clock_divider);
}否则{
//"STATUS_SUCCESS = 1、STATUS_FAILURE = 0、因此这会导致晶体无法初始化
//在此状态下,12MHz 晶体已成功激活,但32.768KHz 没有激活。
//我们应首先将所有内容放在工作晶体上
//then we need to set the DCO to Emulate the 32.768KHz,but then do does do does do does do it do does do it do LF Modclock?
//并使用它来获取相关的时钟
FRAMCTL_configureWaitStateControl (FRAMCTL_ACCESS_TIME_CYCESS_1); //effective Frequency = Nominal * 1/(1+cycles)、因此我们在这里仅使用一个。 CS_initClockSignal (CS_MCLK、CS_HFXTCLK_select、CS_Clock_divider _1);//Errata 注释:切勿单步将 SMCLK 升高到 MCLK 以上、它们必须在某个点同步
CS_initClockSignal (CS_SMCLK、CS_HFXTCLK_select、CS_clock_divider);//出于我猜测的原因将这个小数设置为1.5MHz。
CS_initClockSignal (CS_ACLK、CS_LFMODOSC_select、CS_clock_divider);
crystal_errors |= 0x0A;
}
}否则{
//"STATUS_SUCCESS = 1、STATUS_FAILURE = 0、因此这会导致晶体无法初始化
crystal_errors |= 0x50;
if (CS_TurnOnLFXTWithTimeout (CS_LFXT_DRIVE_3、0xFFF)){
//"STATUS_SUCCESS = 1、STATUS_FAILURE = 0、因此、如果晶体上的过程正常工作、则会发生这种情况
//在此状态下,32.768 KHz 晶振已成功激活,但12MHz 没有激活
//此器件缺少 FLL,因此我们无法使用32kHz 来改进内部振荡器
//so、我们首先需要将 DCO 设置为12MHz、然后设置时钟源
//为此、我们首先将 DCO 设置为24MHz、然后在进入 MCLK 时进行半分
//---- 高频模式、最大频率
CS_setDCOFreq (CS_DCORSEL_1、CS_DCOFSEL_6);
FRAMCTL_configureWaitStateControl (FRAMCTL_ACCESS_TIME_CYCESS_1); //effective Frequency = Nominal * 1/(1+cycles)、因此我们在这里仅使用一个。
CS_initClockSignal (CS_MCLK、CS_DCOCLK_select、CS_clock_divider _2);//Errata 注释:切勿单步将 SMCLK 升高到 MCLK 以上、它们必须在某个点同步
CS_initClockSignal (CS_SMCLK、CS_DCOCLK_select、CS_clock_divider _16);//出于我猜测的原因将这个小数设置为1.5MHz。
CS_initClockSignal (CS_ACLK、CS_LFXTCLK_select、CS_Clock_divider);
}否则{
//"STATUS_SUCCESS = 1、STATUS_FAILURE = 0、因此这会导致晶体无法初始化
//在这种状态下,两个时钟都失败。 这非常糟糕、但我们会尽力而为。
//so、我们首先需要将 DCO 设置为12MHz、然后设置时钟源
//为此、我们首先将 DCO 设置为24MHz、然后在进入 MCLK 时进行半分
//---- 高频模式、最大频率
CS_setDCOFreq (CS_DCORSEL_1、CS_DCOFSEL_6);
FRAMCTL_configureWaitStateControl (FRAMCTL_ACCESS_TIME_CYCESS_1); //effective Frequency = Nominal * 1/(1+cycles)、因此我们在这里仅使用一个。
CS_initClockSignal (CS_MCLK、CS_DCOCLK_select、CS_clock_divider _2);//Errata 注释:切勿单步将 SMCLK 升高到 MCLK 以上、它们必须在某个点同步
CS_initClockSignal (CS_SMCLK、CS_DCOCLK_select、CS_clock_divider _16);//出于我猜测的原因将这个小数设置为1.5MHz。
CS_initClockSignal (CS_ACLK、CS_LFMODOSC_select、CS_clock_divider);
crystal_errors |= 0x0A;
}
}
返回 crystal_errors;
}
我还尝试在没有这些计时器的情况下运行、并查看它是否会在以下代码中稳定下来、也没有效果。
void crystal_hard_loop (uint8_t crystal_errors){
if (crystal_errors & 0x0A){
CS_TurnOnLFXT (CS_LFXT_DRIVE_3);
crystal_errors &=~0x0A;
}
if (crystal_errors & 0x50){
CS_TurnOnHFXT (CS_HFXT_DRIVE_8MHZ_16MHz);
crystal_errors &=~0x50;
}
}
在我的主循环中、它按如下方式运行
int main (空)
{
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式
//启用中断
_enable_interrupt ();
//初始化全局变量
uint8_t crystal_errors;
crystal_errors = init_crystels();
__no_operation();
//crystal_hard_loop (crystal_errors);
while (crystal_errors== 0x50);
while (crystal_errors== 0x0A);
while (crystal_errors== 0x5A);
while (crystal_errors=0);
while (1);
返回0;
}
我有一点损失、因为我主要只在 TI 设计的电路板上使用 TI 提供的时钟系统代码。 尝试确保我现在在该开发板上获得了此信息、因此当我在其他板上使用此芯片时、我可以正确诊断它是否是硬件问题。