You are on page 1of 12

BÀI THỰC HÀNH SỐ 2

Clock và Timer (phần 1: Clock)


Mục tiêu:

 Hiểu được cấu trúc Clock của vi điều khiển STM32F103


 Có khả năng lập trình thay đổi clock theo yêu cầu được đặt ra.

Mục Lục
1. Khối Clock của STM32F103 ................................................................................................................ 2
1.1. Các clock trong hệ thống. ............................................................................................................. 2
1.2. Chân MCO (Microcontroller Clock Output)................................................................................. 5
2. Các hàm của thư viện STM32F1xx HAL thao tác lên Clock. .............................................................. 5
3. Chương trình mẫu ................................................................................................................................. 6
4. Bài tập ................................................................................................................................................... 7
Bài tập 1 (3đ) ............................................................................................................................................ 7
Bài tập 2 (3đ) ............................................................................................................................................ 7
Bài tập 3 (2đ) ............................................................................................................................................ 7
Bài tập 4 (2đ) ............................................................................................................................................ 7
Phụ lục .......................................................................................................................................................... 8
1. Khối Clock của STM32F103

PL2303 Serial Wire


Reset button (USB2COM) debug connector
Power LED(s)
USB2COM
GND testpoint Clock testpoint
connector
Bi-Color (R/G)
debugging LED Native USB
connector
Btn0 STM32F103RCT6
microcontroller
Jack DC, VDC >
Btn1 7V

Tên chức năng


Hình 1. HLib - BBoard revision 1.2
chuẩn hoá
1.1. Các clock trong hệ thống.
Các dòng vi điều khiển ARM luôn có khả năng hỗ trợ nhiều nguồn clock và khả năng cấu hình các bộ
nhân tần số để đạt được tần số hoạt động mong muốn. Có 4 nguồn clock đầu vào cho STM32F103 được
định nghĩa như sau:

 HSE oscillator clock: dao động ngoài tốc độ cao, 4-16 MHz.
 HSI oscillator clock: dao động RC nội tốc độ cao. Tốc độ cố định ở 8MHz.
 LSE oscillator clock: dao động ngoài tốc độ thấp, nối với thạch anh 32.768 KHz.
 LSI oscillator clock: dao động RC nội tốc độ thấp. Tốc độ cố định ở 40MHz.

Trong đó HSE hoặc HSI sẽ được sử dụng để cấp clock chính cho toàn bộ hệ thống (SYSCLK –
System clock). LSE hoặc LSI được sử dụng để cấp clock cho khối Real time clock nội bên trong
STM32F103. Trong bài lab ta sẽ tìm hiểu về HSE, HSI, SYSCLK, và các clock được cấp thực sự đến các
ngoại vi.

Tổ chức khối clock của STM32F103 được thể hiện ở hình sau:
Hình 2. STM32F103 Clock tree. (Reference Manual, tr. 93)

Trong đó ta thấy System clock (SYSCLK) được cấp từ một trong 3 nguồn là: trực tiếp từ HSE, HSI
hoặc thông qua bộ nhân tần số PLL (PLLCLK). Bộ nhân tần PLL (phase-locked loop) của STM32F103
có thể hỗ trợ việc nhân 2 – 16 lần tần số đầu vào tuỳ thuộc vào việc cấu hình trong code. Sau khi đã có
được SYSCLK, SYSCLK sẽ được chia thành các nhánh khác nhau để cấp đến các ngoại vi:
 AHB clock (HCLK): hình thành bằng cách chia tần của SYSCLK thông qua AHB prescaler
(/1 - /512). AHB được cấp cho lõi ARM, khối bộ nhớ, DMA và các ngoại vi tốc độ cao như
SDIO, FSMC …
 AHB clock tiếp tục được chia tần thành 2 kênh clock APB1 (PCLK1) và APB2 (PCLK2) để
cấp cho các ngoại vi khác. Trong đó APB1 có tốc độ tối đa 36MHz và APB2 là 72MHz. Các
ngoại vi được cấp bởi APB1 và APB2 được thể hiện ở hình sau.

Hình 3. APB1 và APB2 trong hệ thống. (Datasheet, tr. 12)


1.2. Chân MCO (Microcontroller Clock Output)
STM32 cung cấp khả năng xuất clock bên trong hệ thống ra ngoài thông qua chân MCO (PA8). Dựa
vào Hình 2, MCO có thể có khả năng xuất ra một trong 4 clock sau:

 PLLCLK
 HSI
 HSE
 SYSCLOCK.

Trên board (Hình 1), vị trí Clock testpoint được nối với chân MCO của STM32.

2. Các hàm của thư viện STM32F1xx HAL thao tác lên Clock.
Các hàm để thao tác lên Clock nằm ở Module RCC của thư viện: Home => Modules => RCC
(STM32F103xG_User_Manual.chm). Một số hàm cần chú ý:

 HAL_StatusTypeDef HAL_RCC_OscConfig (RCC_OscInitTypeDef


*RCC_OscInitStruct);
(Home => Modules => RCC => PWR Exported Functions => Initialization and de-initialization
functions)

Sử dụng để cấu hình (bật/ tắt/ các thông số chia/ nhân tần) các bộ dao động HSE, HSI, LSE, LSI và
PLL. Khi muốn cấu hình một bộ dao động ta phải chọn bộ dao động nào bằng cách gán vào trường:
OscillatorType của struct RCC_OscInitTypeDef, và đưa các thông số tương ứng vào các trường
còn lại. Ta có thể cấu hình nhiều bộ dao động cùng 1 lúc bằng cách or ( | ) các tham số của trường
OscillatorType. Chú ý rằng khi không muốn cấu hình PLL thì cũng phải gán trường
PLL.PLL_State = RCC_PLL_NONE

Ví dụ: Cấu hình bật bộ dao động HSI và LSI:

RCC_OscInitTypeDef rcc_osc_init_s = {0};


rcc_osc_init_s.OscillatorType = RCC_OSCILLATORTYPE_HSI |
RCC_OSCILLATORTYPE_LSI;
rcc_osc_init_s.HSIState = RCC_HSI_ON;
rcc_osc_init_s.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
rcc_osc_init_s.LSIState = RCC_LSI_ON;
rcc_osc_init_s.PLL.PLLState = RCC_PLL_NONE;

HAL_RCC_OscConfig(&rcc_osc_init_s);

 HAL_StatusTypeDef HAL_RCC_ClockConfig (RCC_ClkInitTypeDef


*RCC_ClkInitStruct, uint32_t FLatency)
(Home => Modules => RCC => PWR Exported Functions => Initialization and de-initialization
functions)
Sử dụng để cấu hình SYSCLK, AHB, APB1, APB2. Cách sử dụng hoàn toàn tương tự
HAL_RCC_OscConfig.

Tham số FLatency được gán tuỳ thuộc vào tốc độ chạy của SYSCLK. Việc cấu hình không đúng
FLatency sẽ dẫn đến việc đọc/ghi dữ liệu từ Flash sẽ sai.

FLatency = FLASH_LATENCY_0; /* SYSCLK <= 24MHz */


FLatency = FLASH_LATENCY_1; /* 24MHz < SYSCLK <= 48MHz */
FLatency = FLASH_LATENCY_1; /* 48MHz < SYSCLK <= 72MHz */

 void HAL_RCC_MCOConfig (uint32_t RCC_MCOx, uint32_t RCC_MCOSource,


uint32_t RCC_MCODiv)
(Home => Modules => RCC => PWR Exported Functions => Peripheral Control functions)

Cấu hình clock sẽ được xuất ra từ chân MCO. Đối với STM32F1xx chỉ có duy nhất chân PA8 có khả
năng xuất clock nên tham số RCC_MCOx chỉ có 1 lựa chọn là RCC_MCO. Clock nào được xuất ra sẽ được
cấu hình ở tham số RCC_MCOSource. Chú ý rằng STM32F103 thuộc dòng High-density nên chỉ có 4
nguồn clock có thể được lựa chọn (HSE, HSI, PLLCLK/2, SYSCLK). Tham số RCC_MCODiv chỉ có một
lựa chọn là RCC_MCODIV_1 nghĩa là clock được xuất ra không qua 1 bộ chia tần nào cả.

Chú ý: chân PA8 phải được cấu hình với Mode là GPIO_MODE_AF_PP và tốc độ GPIO_SPEED_HIGH
(50MHz) để có thể xuất được clock.

 uint32_t HAL_RCC_GetSysClockFreq (void)


 uint32_t HAL_RCC_GetHCLKFreq (void)
 uint32_t HAL_RCC_GetPCLK1Freq (void)
 uint32_t HAL_RCC_GetPCLK2Freq (void)
(Home => Modules => RCC => PWR Exported Functions => Peripheral Control functions)

Các hàm trên tương ứng để lấy giá trị SYSCLK, HCLK, PCLK1, PCLK2.

Chú ý: bản thân chương trình không thể nào biết được tần số thạch anh được cấp vào cho bộ dao động
HSE là bao nhiêu. Nên tần số HSE là một giá trị được định nghĩa sẵn bởi chương trình. Toàn bộ quá trình
tính toán để lấy về SYSCLK, HCLK, PCLK1, PCLK2 đều dựa trên giá trị này.

3. Chương trình mẫu


Chương trình mẫu () được đính kèm cùng bài lab. Trong đó:

Giá trị SYSCLK sẽ được đọc về bằng hàm HAL_RCC_GetSysClockFreq và được xuất ra USART1
(baud rate: 115200, 8 bits data, no flow control).

HSI clock sẽ được xuất ra trên chân Clock testpoint của board (MCO).
4. Bài tập
Bài tập 1 (3đ)
Sinh viên nạp chương trình mẫu và sử dụng máy dao động kí để kiểm tra tần số clock (HSI) hiện tại đang
là bao nhiêu. So sánh với kết quả hiển thị trên UART.

Bài tập 2 (3đ)


Sinh viên sử
dụng hàm HAL_RCC_GetHCLKFreq, HAL_RCC_GetPCLK1Freq,
HAL_RCC_GetPCLK2Freq và viết vào report cho biết tần số hiện tại của các clock này là bao nhiêu.

Bài tập 3 (2đ)


Sử dụng hàm HAL_RCC_OscConfig() với thông số phù hợp để cấu hình PLLCLK = 36MHz (có thể sử
dụng HSI hay HSE làm đầu vào cho bộ nhân tần PLL). Cấu hình MCO xuất PLLCLK và kiểm tra. Sử
dụng dao động kí để kiểm tra.

Sinh viên thử nghiệm các tổ hợp khác của PCLK và dao động kí để so sánh với kết quả.

Bài tập 4 (2đ)


Cấu hình để SYSCLK hoạt động 72MHz, AHB = 72MHz, APB1 = 36MHz, APB2 = 36MHz. Xuất
SYSCLK ra dao động ký, sử dụng printf và các hàm lấy giá trị clock để kiểm tra tính đúng đắn của
chương trình.

Good luck and may the odds be ever in your favor! 


Phụ lục
Cách sử dụng dao động ký

Dao động ký là một loại thiết bị điện tử được sử dụng để quan sát mức điện thế của các tín hiệu điện,
thường được hiển thị lên trên đồ thị 2 chiều. Trục ngang biểu thị thời gian và trục dọc có thể biểu diễn
mức điện thế của tín hiệu hoặc độ chênh lệch điện thế của tín hiệu với tín hiệu khác.

Hình 4 là hình chụp một oscilloscope, bao gồm Nút nguồn, Màn hình và Các nút chức năng.

Hình 4. Dao động ký

Đối với oscilloscope này ta có 2 đầu đo tín hiệu tương ứng với 2 kênh input, Hình 5. Mỗi đầu đo gồm có
một kẹp dùng để nối mass, đầu còn lại tham khảo nối mass này để đo tín hiệu hiển thị ra màn hình LCD.
Hình 5. Đầu đo tín hiệu của oscilloscope.

Khởi động OSC và đo thử:

- Cắm dây nguồn và bật nút Power ở phía trên của OSC.
- Chờ cho đến khi màn hình hiện thông báo quá trình self test thành công và nhấn nút
SAVE/RECALL ở mặt trước bên tay phải của OSC.
- Chú ý menu Setup đang được chọn và nhấn nút bên cạnh menu “Recall Factory”. Osc sẽ quay trở
lại các thông số ban đầu của nhà sản xuất. Sau này, bất kì khi nào không hiểu Osc đang hiển thị
cái gì, ta có thể lặp lại các bước trên để thiết lập lại các thông số mặc định cho Osc.
Hình 6. Các nút chức năng của oscilloscope.

Đo test thử:

- Nối đầu dò của kênh 1 vào probe comp phía trên, đất của kênh 1 vào ground ngay phía dưới, xem
Hình 6 ở góc dưới bên trái.
- Nhấn nút AUTOSET ở góc phía trên bên phải. Lúc này Osc sẽ tự động chỉnh chiều ngang, dọc,
và tự động điều khiển trigger và hiển thị ra màn hình LCD dạng sóng vuông mẫu.
- Nếu muốn hiển thị hai kênh cùng lúc, nhấn CH 2 MENU để cho phép hiển thị kênh 2 và nhấn
AUTOSET lại.
- Ở bước này, ta chỉ xem xét kênh 1 và các nút điều chỉnh cho kênh 1, kênh 2 cũng điều chỉnh
tương tự.

Điều chỉnh kênh 1:

- Điều chỉnh vị trí hiển thị theo chiều đứng (Hình 7): xoay nút Cursor1 bên menu VERTICAL. Ở
đây ta xoay Cursor 1 sao cho dạng sóng nằm ngay chính giữa màn hình.
Hình 7. Các nút điều khiển hiển thị theo chiều đứng.

- Điều chỉnh vị trí hiển thị theo chiều ngang (Hình 8): xoay nút ở menu HORIZONTAL để điều
chỉnh vị trí của dạng sóng hiển thị. Ở đây ta xoay cho dạng sóng nằm chính giữa màn hình.

Hình 8. Các nút điều khiển hiển thị theo chiều ngang.
- Điều chỉnh bước chia điện thế: nút VOLTS/DIV cho phép điều chỉnh bước chia điện thế. Xoay về
bên phải sẽ làm tăng độ nhạy (làm giảm độ lớn hiệu điện thế giữa hai bước chia).
- Điều chỉnh bước chia thời gian: nút SEC/DIV điều khiển bước chia thời gian. Xoay nút về bên
phải sẽ làm giảm khoảng thời gian giữa hai bước chia.

Hình 9.Các nút chức năng khác.

Xem dạng sóng ở một thời điểm nào đó:

- Đôi khi ta muốn quan sát dạng sóng hiển thị tại một thời điểm nào đó, điều này được thực hiện
bằng cách sử dụng nút Run/Stops nằm ở góc trên bên phải (Hình 9).

You might also like