mấy anh cho em hỏi khai báo như thế nào trong timer để có thể dùng dao động trong thạch anh !
cái bộ đếm DCO của chíp em có vấn đề ! đếm không đúng thời gian !
thank you
Em chú ý xem qua
Basic Clock Module+ Block Diagram, trang 279 trong
User's Guide.
Clock DCO có ưu điểm là bộ đếm nội, tốc độ cao, nhưng chu kỳ không được chuẩn. Clock DCO thường là clock chính để chạy MCU, trong khi để căn chỉnh đúng thời gian thì ta thường dùng clock thạch anh ngoài thông qua Clock ACLK\LFXT1CLK.
Để sử dụng thạch anh, ta để
P2.6 & P2.7 ở trạng thái mặc định khi reset (
XIN & XOUT, không config thành GPIO).
Config bằng hàm
Config_Clocks() trong lib
Basic_config:
Code:
//*****************************************************************************
// Clocks Configurations
//*****************************************************************************
void Config_Clocks(void)
{
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF) // Check if constants cleared
{
while(1); // If cal constants erased, trap CPU!!
}
BCSCTL1 = CALBC1_1MHZ; // Set DCO range & ACLK prescaler
// BCSCTL1 - Basic Clock System Control Register 1
// XT2OFF = XT2 off. This bit turns off the XT2 oscillator
// XTS = LFXT1 mode select. 1: High-frequency mode
// DIVAx = Divider for ACLK
// RSELx = Range select
DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation
// DCOCTL - DCO Control Register
// DCOx = DCO frequency select
// MODx = Modulator selection
BCSCTL3 |= LFXT1S_2 + XCAP_3; // configure ACLK Source
// BCSCTL3 - Basic Clock System Control Register 3
// XT2Sx = XT2 range select
// LFXT1Sx = Low-frequency clock select and LFXT1 range select
// When XTS=0: 00 32768-Hz crystal on LFXT1
//10 VLOCLK 12 KHz
// When XTS=1: 01 1-to 3-MHz crystal or resonator
//10 3-to 16-MHz crystal or resonator
// XCAPx = Oscillator capacitor selection. 11 ~12.5pF
// XT2OF = XT2 oscillator fault
// LFXT1OF = LFXT1 oscillator fault
while(IFG1 & OFIFG) // wait for OSCFault to clear
{
IFG1 &= ~OFIFG;
__delay_cycles(100000);
}
// IFG1 - Interrupt Flag Register 1
// OFIFG = Oscillator fault interrupt flag
// _bis_SR_register(SCG1 + SCG0); // Stop DCO
BCSCTL2 |= SELM_0 + DIVM_0; // select MCLK, SMCLK clock and prescaler
// BCSCTL2 - Basic Clock System Control Register 2
// SELMx = Select MCLK. These bits select the MCLK source.
//00 DCOCLK
//01 DCOCLK
//10 XT2CLK when XT2 present. LFXT1CLK or VLOCLK when XT2 not present
//11 LFXT1CLK or VLOCLK
// DIVMx = Divider for MCLK
// SELS = Select SMCLK.This bit selects the SMCLK source.
//0 DCOCLK
//1 LFXT1CLK or VLOCLK when XT2 not present. XT2CLK when XT2 present.
// DIVSx = Divider for SMCLK
// DCOR = DCO resistor select
}
Hướng dẫn chi tiết có sẵn trong comment của hàm này. Sau đây là hướng dẫn sơ bộ:
- BCSCTL1, DCOCTL dùng config cho clock DCO (1->16MHz).
- BCSCTL3 cấu hình cho clock ACLK: gồm clock vào và tụ lọc. Ứng với XTS=0 (mặc định) thì:
+ LFXT1S_0 (00): clock vào là thạch anh 32768Hz (LFXT1CLK)
+ LFXT1S_2 (10): clock vào là xung nội 12KHz (VLOCLK)
- BCSCTL2: chọn clock vào và bộ chia tần số cho MCLK và SMCLK. Thường chọn đầu vào là DCO do tốc độ cao. MCLK là clock chính để chạy MCU nên thường không chia tần để không nhỏ hơn SMCLK.
Như vậy là xong phần clock nguồn, khi config các ngoại vi (Timer, ADC, ...) ta đều phải config clock đầu vào là MCLK, SMCLK hay ACLK. Chọn ngồn LFXT1CLK->ACLK->Ngoại vi thì ta sẽ dùng được dao động thạch anh cho ngoại vi.