Trước hết trước khi bắt đầu các bạn nếu chưa có datasheet của dùng MSP430 thì có thể download tại đây : http://www.ti.com/general/docs/lit/getliterature.tsp?baseLiteratureNumber=slaa559&fileType=pdf.
Lưu ý Datasheet vẫn luôn là tài liệu quan trọng nhất khi bạn tiếp cận bất cứ dòng vi điều khiển nào , nên việc thành thạo tiếng Anh và khả năng đọc Datasheet vẫn là quan trọng nhất.
Tài liệu được viết cho MSP430G2553,các chip khác có module khác mã sẽ không sử dụng được thư viện đi kèm.
Khi lập trình cho một con vi điều khiển nào đó, một trong những điều quan trọng đầu tiên chúng ta phải làm đó là config clock (chọn nguồn xung nhịp sử dụng) . Đây là một việc rất quan trọng, đặc biệt khi các bạn làm các project liên quan đến xử lý thời gian thực. Yêu cầu độ chính xác cao về clock. Mục tiêu của tài liệu này:
Khi lập trình cho một con vi điều khiển nào đó, một trong những điều quan trọng đầu tiên chúng ta phải làm đó là config clock (chọn nguồn xung nhịp sử dụng) . Đây là một việc rất quan trọng, đặc biệt khi các bạn làm các project liên quan đến xử lý thời gian thực. Yêu cầu độ chính xác cao về clock. Mục tiêu của tài liệu này:
1. Các bạn sẽ hiểu về các thanh ghi điều khiển
việc cấp xung clock
2. Cấu hình chúng để phù hợp với project của
mình
3. Hiểu rõ các đặc điểm về nguồn xung DCO có sẵn
bên trong VĐK(xung nội).
(dùng cho khi các bạn chưa sử dụng đến nguồn xung ngoại
như thạch anh).
Tài liệu đầu tiên mà mình muốn
các bạn xem ở đây là User guide của dòng Valueline. (VĐK trên kit launchpad thuộc dòng value line).
Các bạn có thể down ở đường link
sau : http://www.ti.com/lit/pdf/slau144
Chú ý đến phần: 5. Basic Clock Module +
1.Giới thiệu:
Nguồn xung Clock của MSP430 được
chia làm 2 lớp.
-
Lớp đầu tiên là các nguồn tạo ra xung clock:
o LFXT1CLK: Bộ dao động tần số thấp/ tần số cao, nó có thể
được sử dụng với tần số
thạch anh 32768 Hz hoặc tần số
thạch anh chuẩn, hoặc bộ cộng hưởng từ
450 KHz đến 8 MHz.
o XT2CLK: Bộ dao động tần số cao. Bộ dao động này có thể
được sử dụng với thạch
anh chuẩn, bộ cộng hưởng, hoặc
nguồn xung Clock bên ngoài có tần số từ 450 KHz đến 8 MHz.
o DCOCLK: Bộ dao động được điều khiển bằng kĩ thuật số (
DCO).
o VLOCLK : Bộ dao động tần số thấp giống DCOCLK
-
Có 3 tín hiệu clock đầu ra cơ bản là :
o ACLK (Auxiliary clock ) : Có thể sử dụng nguồn
LFX1CLK và VLOCLK. Có thể tạo được tần số nhỏ hơn nữa bằng cách sử dụng các bộ
chia 1, 2, 4, 8. Dùng cho các module ngoại vi.
o MCLK (Master clock) : Có thể sử dụng
nguồn LFX1CLK, VLOCLK, XT2CLK và DCOCLK. Dùng cho hệ thống
và CPU.
o SMCLK (Sub-main clock) : Cũng có thể sử dụng
4 nguồn trên và dùng cho các module ngoại vi.
Clock của MSP430 có thể coi là bước cải tiếp lớn so với
các dòng VĐK khác với rất nhiều ưu điểm như:
o Xung
nội có sai số nhỏ ( 1 – 3% tùy dòng)
o Chỉnh
tần số bằng phần mềm
o Chế
độ ngủ thông minh,có thể ngủ hoặc thức dậy rất nhanh,không bị treo khi ngủ
o Có
nhiều lựa chọn nguồn xung clock riêng biệt cho từng module
2.Hoạt động :
Ở trạng thái mặc định cơ bản
chúng ta có 2 tín hiệu SMCLK và MCLK lấy nguồn từ xung nội DCO tần số f khoảng
1.1MHz. Về sau các bạn sẽ hiểu được vì sao ta lại có tần số này.
Để cấu hình module clock chúng
ta sẽ sử dụng 4 thanh ghi :
DCOCTL : DCO
control register
BCSCTL1: Basic
clock system control register
BCSCTL2: Basic
clock system control register
BCSCTL3: Basic
clock system control register
Và 1 thanh ghi cũng được sử dụng
nhưng mình không nói đến ở đây đó là Status register. Với 4 bit SCG1,
SCG0,OSCOFF,CPUOFF nó sẽ quyết định các chế độ hoạt động của basic clock
system.Trạng thái mặc định là 4 bit này đều bằng 0.
Mình sẽ giới thiệu sơ về cấu tạo
và hoạt động của từng thanh ghi này. Và ở đây mình sẽ nói về hoạt động của DCO,
các phần khác như LFXT1CLK hay XT2CLK và 1 phần cũng rất hay đó là đồng bộ
clock mình sẽ nói ở các bài khác.
2.1.DCO control register:
-
DCOx : tần
số DCO được lựa chọn. Có 3 bit nên ta sẽ có 8 mức được lựa chọn, nó sẽ kết hợp
với range của nó (RSELx) xác định ở thanh ghi BCSCTL1, ta sẽ có được một tần số
xác định.
-
MODx : điều
chế tần số, sẽ có công thức tính được tần số mà chúng ta sẽ có được khi sử dụng
điều chế. Công thức này có ghi trong tài liệu user guide.Nhưng ở đây mình sẽ bỏ
qua phần này do đó các bạn để MOD = 0;
Minh họa về tần số được lựa chọn :
Như có thể thấy, ứng với mỗi mức
DCO và RSEL ta sẽ xác định được 1 tần số xác định. Về con số cụ thể cho từng
con thì các bạn có thể down datasheet của từng con để theo dõi,hoặc có thể dùng
phần mềm để tính toán dựa trên thạch anh ngoài.
Ví dụ như con MSP430 G2553 : (có trong kit
launchpad )
Các bạn có thể thấy ví dụ với
RSELx = 0 , DCOx = 3, MODx = 0 thì ta có f = 0.12Mhz.Chú
ý là tần số này phụ thuộc vào điện áp nên với mỗi nguồn cấp khác nhau điện áp
ra sẽ khác nhau.
Basic clock system
control register 1 : BCSCTL1
Nhìn vào đây các bạn có thể thấy
được hoàn toàn đơn giản thôi, ví dụ như chúng ta đang muốn sử dụng DCOCLK (việc
chọn này sẽ có ở BCSCTL2 ) thì chúng ta sẽ bật bit 7; chọn range để xác định được
tần số sẽ được sử dụng, có 4 bit nên ta sẽ có 16 mức range (có thể xem lại hình
vẽ trước). Mình có thể đưa ra 1 ví dụ :
Ta đặt :
DCOCTL = 0x60; \\ hay DCOCTL =
8’b01100000 ;
\\ hay DCOCTL |= DCO1 + DCO0 + MOD0;
\\ DCOx = 3;
MODx =0
BCSCTL1 = 0x80 \\ hay BCSCTL1
= 8’b10000000 ;
\\ RSELx = 0
Ta vừa cấu hình để cho DCOCLK phát ra xung nhịp là
0.12Mhz.
Basic clock system control register 2: BCSCTL2
-
SELMx : Lựa chọn source cho MCLK.
-
DIVMx : hệ số chia , tần số clock của MCLK sẽ
được chia cho hệ số chia tương ứng.
-
SELS : Chọn source cho SMCLK.
-
DIVSx : hệ số chia của SMCLK.
Basic clock system
control register 3 :
Bây giờ mình sẽ giải thích vì sao ban đầu mặc định clock
là khoảng 1.1Mhz và clock source là DCO
Các bạn chú ý đến cột cuối cùng
initial state : Thế các giá trị tương ứng vào các thanh ghi và các bạn sẽ tạo
ra xung 1.1Mhz
Thực hành:
Bây giờ mình sẽ làm 1 ví dụ đơn
giản về việc tạo xung clock đúng 1s. Tất nhiên không thể chính xác 100% và người
ta cũng không hay sử dụng nguồn xung nội cho các ứng dụng thời gian thực vì sự
không ổn định của nó. Nhưng ví dụ này sẽ giúp cho các bạn hiểu được basic clock
module và cách vận hành nó, dễ dàng tiếp cận hơn khi chúng ta làm việc với nguồn
xung ngoại. Hầu hết các tên thanh ghi, các bit quan trọng của 1 số thanh đều được
defined trong file thư viện của nó, các bạn có thể tìm hiểu thêm trong file thư
viện để có thể dễ dàng viết hơn.
Ví dụ như thay vì viết :
DCOCTL
= 0xC0 ;
Ta có thể viết :
DCOCTL
= DCO1 + DCO2 + MOD0 ;
Code :
#include "msp430g2553.h"
/* Khai báo loại chip đang dùng
* Thư
viện này chứa các khai báo tên #define cho địa
* chỉ
các thanh ghi
*/
void main(void)
{
WDTCTL
= WDTPW + WDTHOLD; // watchdog timer setup
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
{
while(1); // If cal constants
erased,
} // trap CPU!!
BCSCTL1 = 0x80; // Set range = 0x80 ; RSEL = 0;
// DCOCTL = 0xC0;
// DCO=3; MOD = 0
DCOCTL |= DCO1 + DCO0 + MOD0; // DCO=3; MOD = 0
//=======> f = 0.12Mhz
P1DIR = 0x40;
// I/O setup
P1OUT = 0;
BCSCTL2 |= SELM_0 + DIVM_3; // select DCOCLK ; divide = 8
// ===> f = 0.12 / 8 MHz
while(1)
{
P1OUT = ~P1OUT; // LED on
// ta có f =1/15000 Hz để
có xung 1s thì ta
//khởi tạo delay với số chu kì là15000.
_delay_cycles(15000); // delay 15000 cycles
// tuong ung neu de divider = 1 (DIVM_0) thi so delay cycle =
120000
//==========> f_out = 1Hz
}
}
|
Các bạn hãy chọn thử tìm 1 tần số khác và số chu kì phù hợp
để tạo được chu kì 1s
để kiểm tra lại điều này.
Chú ý: MSP430 được cung cấp các define cái giá trị DCOCTL và BCSCTL1 cho phép nhanh chóng chỉnh tần số có sẵn là 1MHZ , 8MHZ , 12MHZ , 16MHZ . Ví dụ để chỉnh tần số 8Mhz,có thể viết:
Các giá trị này được lưu ở SegmentA của Flash nên cần hết sức chú ý khi ghi dữ liệu vào FlashDCOCTL = CALDCO_8MHZ;
BCSCTL1 = CALBC1_8MHZ;
Minh họa khả năng thay đổi tần số linh
hoạt của MSP430:
#include "msp430g2553.h"
#include "Library/Clock.h"
#include "Library/UART.h"
/* Khai báo loại chip đang dùng
* Thư
viện này chứa các khai báo tên #define cho địa
* chỉ
các thanh ghi
*/
unsigned char i=0;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // watchdog timer setup
P1DIR|=BIT0;
Select_Clock(DCO_1MHZ);
SMCLK_F=1000000;
UART_Init();
for(i=0;i<2;i++)
{
P1OUT ^= BIT0; // LED on
_delay_cycles(1000000); // delay 15000 cycles
}
UART_Write_Char(10);
UART_Write_Char(10);
UART_Write_String("Test
CLK 1Mhz");
Select_Clock(DCO_12MHZ);
SMCLK_F=12000000;
UART_Init();
for(i=0;i<2;i++)
{
P1OUT ^= BIT0; // LED on
_delay_cycles(12000000); // delay 15000 cycles
}
UART_Write_Char(10);
UART_Write_String("Test
CLK 12Mhz");
Select_Clock(DCO_8MHZ);
SMCLK_F=8000000;
UART_Init();
for(i=0;i<2;i++)
{
P1OUT ^= BIT0; // LED on
_delay_cycles(8000000); // delay 15000 cycles
}
UART_Write_Char(10);
UART_Write_String("Test
CLK 8Mhz");
Select_Clock(DCO_16MHZ);
SMCLK_F=16000000;
UART_Init();
UART_Write_Char(10);
UART_Write_String("Test
CLK 16Mhz");
while(1)
{
P1OUT ^= BIT0; // LED on
_delay_cycles(16000000); // delay 15000 cycles
}
}
|
Ngoài ra các bạn cũng cần biết khi sử dụng xung nội là xung nội của MSP430 phụ thuộc vào điện áp,tức là cùng 1 thông số DCOCTL và BCSCTL thì ở các điện áp khác nhau sẽ ra tần số khác nhau,hoặc trong một số trường hợp các bạn xóa Flash ở SegmentA,có thể chỉnh lại tần số chuẩn bằng chương trình sau : Calib_Clock
Download thư viện Clock tại đây
No comments:
Post a Comment