请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430G2333 你(们)好
我使用的是 msp430g2333、并尝试使用32KHz 晶振校准 DCO。 但我的代码似乎不执行任何操作。 我出了什么问题? 谢谢
此致
James
int main (void){ initialIoes(); /*等待晶振稳定*/ _DELAY_CYCLES (1000000); DCOCalibrate (DCO_CAL_8MHZ); //BCSCTL1 |= CALBC1_8MHZ;//将校准率信息复制到寄存器 中// DCOCTL |= CALDCO_8MHZ;//将校准率信息复制到寄存器中 while (1){ LED2_HIGH (); delay_ms (1000); LED2_LOW (); delay_ms (1000); } }
#include "DCOCalibration.h" void DCOCalibrate (unsigned int data) { 无符号 int 比较、Oldcapture = 0; unsigned char Old_BCSCTL1; unsigned int Old_TACCTL0; unsigned int Old_TACTL; OLD_BCSCTL1 = BCSCTL1;//进行备份 OLD_TACCTL0 = TACCTL0;//进行备份 OLD_TACTL = TACTL;//进行备份 BCSCTL1 |= DIV_3;// ACLK = LFXT1CLK/8 TACCTL0 = CM_1 + CCIS_1 + CAP;// CAP、ACLK TACTL = tassel_2 + MC_2 + TACLR;// SMCLK、CONT 模式、清除 while (1){ while (!(CCIFG 和 TACCTL0)); //等待捕获发生 TACCTL0 &=~CCIFG; //捕获发生,清除标志 比较= TACCR0; //获取捕获的电流 SMCLK 比较=比较- Oldcapture;// SMCLK 差异 Oldcapture = TACCR0; //保存捕获的电流 SMCLK if (data == Compare){ 中断;//如果相等,则保留"while (1) "} 否则、如果(data < Compare){ DCOCTL--; // DCO 太快,减慢它的速度 如果(DCOCTL = 0xFF) // DCO 是否滚入? IF (BCSCTL1 & 0x0F) BCSCTL1---; //选择下部 RSEL } 否则{ DCOCTL++; // DCO 太慢,加速它 如果(DCOCTL = 0x00) // DCO 是否回滚? 如果((BCSCTL1 & 0x0F)!= 0x0F) BCSCTL1++; //选择更高的 RSEL } } TACCTL0 = Old_TACCTL0; //恢复寄存器 TACTL = OLE_TACTL; //恢复寄存器 BCSCTL1 = Old_BCSCTL1; //恢复寄存器 }
//DOC 校准常数 #define DCO_CAL_500kHz122// 122 * 4096 = 499.7KHz #define DCO_CAL_1MHz244// 244 * 4096 = 0.999MHz #define DCO_CAL_2MHz488// 488 * 4096 = 1.999MHz #define DCO_CAL_8MHZ1953//* 4096 = 129930MHz #define DCO_30MHz #2930MHz 450// 450 * 4096 = 1.843200MHz,适合使用 UART