下面是所涉及的代码、对于我调用的函数、它们都可以在 DriverLib (http://dev.ti.com/tirex/content/msp/MSP430Ware_3_60_00_10/driverlib/doc/MSP430F5xx_6xx/html/index.html)( http://dev.ti.com/tirex/content/msp430ware_3_80_07_00/driverlib/doc/MSP430FR5xx_6xx/MSP430FR5xx_6xx_DriverLib_Users_Guide-2_91_11_01.pdf 上的指南)中找到。
总之、代码熔断:我们成功进入功率模式3、X2始终超时、然后 X1超时、将 ACLK 和 FLLREF 设置为 REFO 工作正常、然后 FLLSettle 因 DCOFFG 故障锁定。
由于每个时钟都发生故障、我希望我做了一些错误、而不是在这个定制板上出现如此糟糕的硬件故障。
X2为19.2MHz、X1为32并改变 kHz、虽然我最终希望通过 DCO 使 MCLK 以20运行、但这只是我的初始"振荡器工作"测试。
那么、有人看到我在这里缺少什么吗?
我将努力制作一个不使用 DriverLib 的版本。
int main (void) { WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器 uint8_t working_crystals = init_crystals (); //其代码如下所示,但在我的实际项目中,它位于另一个顶部包含的文件中。 while (1){ test_math(); test_freq(); } 返回0; }
uint8_t init_crystals (){ uint8_t working_crystals =(BIT1 | BIT2); //位1表示 X1,位2表示 X2 uint8_t VCORE = 0; uint8_t core_set_counter = 17; //从一开始,PMMVCore 为0,我们要将其移动到3,每次发生一个。 while ((VCORE < 3)&&(CORE_SET_COUNTER > 0)){ //虽然我们低于所需的 VCORE、但我们尝试了不到16次来更改它 core_set_counter--; //取消一次尝试 if (PMM_setVCoreUp (VCORE + 1)){ //尝试将其上调一个,如果您成功 VCORe++; //更新您的 VCORE 跟踪器,从而更新您的目标 CORE_SET_COUNTER = 17; //并重置您的尝试次数 } } //注意,由于制造商的勘误表,不使用此函数的 driverlib 版本可能会导致故障。 //测试此系统是否能够以16、12、8 MHz 运行。 //TODO:使用以下信息更好地设置时钟。 uint8_t MaxCPU = 8 +(VCORE << 2); //MaxCPU 速度、单位为 MHz = 8 + VCORE * 4. UCS_setExternalClockSource (32768、 //X1频率、32.768kHz 19200000); //X2频率、19.2MHz //UCS TurnOnXT2 (UCS_XT2_DRIVE_16MHz_24MHZ); int16_t 外部; int16_t 内部; _no_operation(); //延迟循环 for (Outer = 24000;Outer > 0;Outer -){ for (inner = 10;inner > 0;inner--){ _no_operation(); } } //~~~~~~~~~~~~~~~~~~~~~~~ 这条线以上的所有内容都有效~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //此 if 语句始终失败(始终发生超时) if (UCS_TurnOnXT2WithTimeout (UCS_XT2_DRIVE_16MHz_24MHZ、0xFFFF)){//将 XT2设置为正确的频率范围 //但如果某些错误位需要65536个周期才能清除,则返回到另一个时钟。 //Anyway、这种情况适用于 IT 正常工作和继续。 UCS_initClockSignal (UCS_MCLK、UCS_XT2CLK_select、UCS_Clock_divider); //主时钟目前以基本的19.2MHz 运行 UCS_initClockSignal (UCS_SMCLK、UCS_XT2CLK_select、UCS_Clock_divider); //Submain 现在以19.2运行、但我们稍后可能会对此进行更改 if (UCS_TurnOnLFXT1WithTimeout (UCS_XT1_DRIVE_3、UCS_XCAP_0、0xFFFF)){ //drive_3为高稳定性高功率、drive_0为低稳定性低功率 //Cap 为0、因为我们有自己的外部电容器、因此我们不需要使用内部电容器。 尽管如此、如果需要、我们可以进一步调整内部电阻器。 //同样、如果某些错误位占用65536个完整周期、但仍未清除、我们将返回到另一个计时器。 //但这是正常工作的情况,我们继续正常进行。 UCS_initClockSignal (UCS_ACLK、UCS_XT1CLK_select、UCS_Clock_divider); //和辅助时钟以32.768kHz 标准运行,用于... 原因 。} 否则{ //这是 X2工作正常但 X1不工作的情况。 在本例中、我们对 ACLK 使用 REFO UCS_initClockSignal (UCS_ACLK、UCS_REFOCLK_select、UCS_Clock_divider); //并显式关闭 X1。 UCS_TurnOffXT1 (); working_crystals &=!(BIT1); } } 否则{ //这是 X2不工作的情况(现在始终发生) //SO 第一步、关闭 X2 UCS_TurnOffXT2 (); working_crystals &=!(BIT2); //然后处理 X1 //现在它也总是超时 if (UCS_TurnOnLFXT1WithTimeout (UCS_XT1_DRIVE_3、UCS_XCAP_0、0xFFFF)){ //drive_3为高稳定性高功率、drive_0为低稳定性低功率 //Cap 为0、因为我们有自己的外部电容器、因此我们不需要使用内部电容器。 尽管如此、如果需要、我们可以进一步调整内部电阻器。 //同样、如果某些错误位占用65536个完整周期、但仍未清除、我们将返回到另一个计时器。 //但这是正常工作的情况,我们继续正常进行。 UCS_initClockSignal (UCS_ACLK、UCS_XT1CLK_select、UCS_Clock_divider); //和辅助时钟以32.768kHz 标准运行,用于... 原因。 //现在我们有 X1设置并通过 ACLK 运行,我们还通过 FLL 运行它, UCS_initClockSignal (UCS_FLLREF、UCS_XT1CLK_select、UCS_Clock_divider); } 否则{ //这是 X2发生故障和 X1发生故障的情况。 在本例中、我们对 ACLK 使用 REFO //现在这种情况总是发生的,这些时钟信号输入似乎正常工作 UCS_initClockSignal (UCS_ACLK、UCS_REFOCLK_select、UCS_Clock_divider); //然后通过 FLL 运行它 UCS_initClockSignal (UCS_FLLREF、UCS_REFOCLK_SELECT、UCS_CLOCK _divider); //并显式关闭 X1 UCS_TurnOffXT1 (); working_crystals &=!(BIT1); } //现在这两者中的一个已经设置了 ACLK 和 FLL,我们使用 FLL 来设置 DCO,我们将其用于 MCLK 和 SMCLK //但该 FLLSettle 始终挂起在 DCOFFG 比较循环中 UCS_initFLSettle (19200、59); UCS_initClockSignal (UCS_MCLK、UCS_DCOCLK_select、UCS_Clock_divider); //从技术上讲,这个是冗余的,因为 initFLL 将 MCLK 和 SCLK 设置为 DCO,但我们仍将在此处写入它。 while (HWREG8 (UCS_BASE + OFS_UCSCTL7_L)& DCOFFG); UCS_initClockSignal (UCS_SMCLK、UCS_DCOCLK_select、UCS_Clock_divider); //Submain 目前以19.2MHz 运行、但我们稍后可能会对此进行更改。 //另请注意,当我们需要知道时钟频率时,我们使用方法来测量时钟频率,而不是仅仅假设,这实际上得出19.33312MHz } 返回 working_crystals; }