BÀ I THỰ C HÀ NH SỐ 2 Clock và Timer (phần 1: Clock

12
BÀI THỰ C HÀNH SỐ 2 Clock và Timer (phn 1: Clock) Mc tiêu: Hiểu được cu trúc Clock của vi điều khin STM32F103 Có khnăng lập trình thay đổi clock theo yêu cầu được đặt ra. Mục Lục 1. Khi Clock ca STM32F103 ................................................................................................................ 2 1.1. Các clock trong hthng. ............................................................................................................. 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 tp ................................................................................................................................................... 7 Bài tp 1 (3đ) ............................................................................................................................................ 7 Bài tập 2 (3đ) ............................................................................................................................................ 7 Bài tập 3 (2đ) ............................................................................................................................................ 7 Bài tập 4 (2đ) ............................................................................................................................................ 7 Phlc .......................................................................................................................................................... 8

Transcript of BÀ I THỰ C HÀ NH SỐ 2 Clock và Timer (phần 1: Clock

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

Hình 1. HLib - BBoard revision 1.2

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:

PL2303

(USB2COM)

USB2COM

connector

Native USB

connector

Serial Wire

debug connector

Jack DC, VDC >

7V

Reset button

Btn0

Btn1

STM32F103RCT6

microcontroller

Bi-Color (R/G)

debugging LED

Power LED(s)

GND testpoint Clock testpoint

Tên chức năng

chuẩn hoá

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).