Bài viết 15 thuộc series STM32F103C8T6 tập trung theo hướng “học để làm được việc”. Với chủ đề Clock Tree STM32F103C8T6: HSI, HSE, PLL và cấu hình 72MHz, bạn sẽ đi từ lý thuyết cốt lõi đến quy trình triển khai thực tế trong phòng lab. Nội dung được thiết kế để sinh viên, kỹ thuật viên bảo trì và người mới chuyển từ PLC sang Embedded đều có thể áp dụng ngay vào project mẫu.
Clock là nền tảng của mọi phép đo và điều khiển trong MCU. Cấu hình clock sai không chỉ làm sai timing mà còn gây lỗi truyền thông, lỗi ADC và hành vi khó đoán toàn hệ thống.
1. Mục tiêu bài học
Bài giúp bạn đọc clock tree như một kỹ sư hệ thống: biết nguồn xung nào đang dùng, nhánh nào ảnh hưởng ngoại vi nào và cách kiểm chứng bằng phép đo thực.
- Hiểu vai trò HSI, HSE, PLL trong tạo SYSCLK.
- Cấu hình 72MHz ổn định cho STM32F103C8T6.
- Nắm ảnh hưởng APB1/APB2 tới timer và ngoại vi.
- Biết cách kiểm tra và xác thực clock thực tế.
Sau khi hoàn thành, bạn nên tự trả lời được ba câu hỏi: hệ thống cần đo/điều khiển đại lượng gì, vòng đời xử lý dữ liệu chạy theo chu kỳ nào, và cơ chế bảo vệ lỗi nào cần có để hệ thống ổn định khi chạy liên tục ngoài hiện trường.
2. Kiến thức nền tảng
STM32F103C8T6 dùng lõi ARM Cortex-M3, phù hợp để học đồng thời kiến trúc MCU và phương pháp lập trình thời gian thực. Khi học theo lộ trình chuẩn, bạn nên nắm đồng thời phần cứng (clock, GPIO, bus, nguồn), firmware (HAL/LL, ngắt, timer), và phương pháp test (scope, logic analyzer, UART log). Việc kết hợp đủ ba lớp kiến thức giúp quá trình debug nhanh hơn nhiều so với chỉ học code thuần.
- Clock source và startup time.
- PLL multiplier và giới hạn tần số hệ thống.
- Prescaler các miền HCLK, PCLK1, PCLK2.
- Mối liên hệ clock và baudrate UART.
Trong quá trình thực hành, bạn nên duy trì checklist kiểm thử ở từng vòng: xác nhận wiring, xác nhận xung clock, xác nhận trạng thái ngoại vi, sau đó mới kiểm tra thuật toán. Cách làm này giảm đáng kể lỗi dây chuyền và giúp nhóm dự án phối hợp hiệu quả giữa phần cứng và phần mềm.
3. Phân tích kỹ thuật
Chọn nguồn xung hệ thống
HSI tiện cho khởi động nhanh và bài test đơn giản, trong khi HSE + PLL thường cho độ chính xác tốt hơn trong ứng dụng cần truyền thông ổn định. Chọn nguồn xung cần dựa vào yêu cầu timing của toàn hệ.
- Ưu tiên HSE cho ứng dụng cần baudrate chính xác.
- Dự phòng cơ chế fallback nếu HSE lỗi khởi động.
- Tài liệu hóa rõ nguồn xung dùng cho từng bản firmware.
Thiết lập 72MHz và giới hạn bus
Khi đặt SYSCLK 72MHz, cần bảo đảm APB1 không vượt giới hạn khuyến nghị. Đồng thời phải kiểm tra lại timer clock vì ở một số trường hợp timer nhận xung nhân đôi từ APB domain.
- Theo dõi kỹ prescaler của APB1/APB2.
- Đối chiếu công thức timer clock với tài liệu RM0008.
- Kiểm tra UART/ADC sau khi đổi clock.
Kiểm chứng clock trong thực tế
Sau cấu hình, nên dùng UART print tần số, hoặc xuất MCO để đo bằng scope. Cách kiểm chứng thực tế giúp phát hiện sớm sai lệch do cấu hình hoặc do phần cứng dao động ngoài dự kiến.
- In thông số SYSCLK/HCLK/PCLK qua UART ở lúc boot.
- Dùng MCO đo tần số trên chân xuất clock.
- Lưu kết quả đo làm baseline cho project.
Từ góc nhìn hệ thống, chủ đề này không chỉ là “chạy được chức năng”, mà còn là bài toán tối ưu độ tin cậy, độ trễ xử lý, khả năng mở rộng khi thêm cảm biến hoặc thêm kênh truyền thông. Nếu ngay từ đầu bạn chuẩn hóa cấu trúc code theo module driver/app/service thì giai đoạn mở rộng về sau sẽ nhẹ hơn rất nhiều.
4. Các bước thực hiện
Mọi cấu hình clock cần được kiểm tra bằng giá trị thực đo, không chỉ tin vào con số trên công cụ.
- Xác định mục tiêu tần số hệ thống và yêu cầu ngoại vi.
- Cấu hình HSE + PLL trong CubeMX để đạt 72MHz.
- Thiết lập prescaler HCLK/PCLK1/PCLK2 phù hợp giới hạn.
- Generate code và kiểm tra tần số bằng API RCC.
- Đo thực bằng MCO hoặc đối chiếu baudrate UART.
- Khóa cấu hình clock chuẩn trong tài liệu dự án.
Ở mỗi bước, bạn nên lưu log kỹ thuật (ảnh wiring, ảnh cấu hình CubeMX, thông số timer/UART/ADC, snapshot kết quả đo). Bộ log này giúp giảng viên hoặc trưởng nhóm đánh giá tiến độ nhanh và giảm thời gian trao đổi khi cần hỗ trợ từ xa.
5. Ví dụ in thông số clock sau khi khởi động
Code dưới đây là mẫu rút gọn theo HAL Library, tập trung phần cốt lõi để bạn nhìn rõ luồng xử lý. Khi đưa vào dự án thực, hãy tách code thành các module rõ ràng, thêm kiểm tra lỗi trả về và timeout cho mọi giao tiếp ngoại vi.
void Clock_Dump(void)
{
printf("SYSCLK=%lu\r\n", HAL_RCC_GetSysClockFreq());
printf("HCLK=%lu\r\n", HAL_RCC_GetHCLKFreq());
printf("PCLK1=%lu\r\n", HAL_RCC_GetPCLK1Freq());
printf("PCLK2=%lu\r\n", HAL_RCC_GetPCLK2Freq());
}
Nguyên tắc quan trọng: giữ hàm ngắt ngắn gọn, xử lý nặng chuyển về vòng lặp chính hoặc task nền; dùng biến trạng thái rõ ràng để tránh race condition; thêm timeout cho mọi thao tác có thể block. Đây là nền tảng để firmware ổn định khi chạy lâu dài.
6. Lỗi thường gặp
Phần lớn lỗi trong STM32F103C8T6 đến từ cấu hình chưa đồng bộ giữa clock, ngoại vi và wiring thực tế. Nếu bạn xử lý theo thứ tự “đọc triệu chứng -> khoanh vùng lớp lỗi -> test độc lập từng khối”, thời gian debug sẽ giảm rất rõ.
- Đặt APB1 vượt giới hạn khi nâng SYSCLK.
- Nhầm timer clock dẫn tới PWM/timer sai tần số.
- Quên cập nhật baudrate UART khi đổi clock.
- Không kiểm chứng thực tế sau khi generate code.
- Thiếu cơ chế fallback khi HSE không ổn định.
Giữ một file cấu hình clock chuẩn cho toàn bộ team để tránh sai khác môi trường.
7. Bài tập thực hành
Để chuyển từ mức “hiểu lý thuyết” sang “làm chủ kỹ năng”, bạn nên làm các bài tập sau theo đúng thứ tự từ dễ đến khó, sau mỗi bài đều ghi lại tiêu chí đạt/chưa đạt và thông số đo thực tế.
- Cấu hình 3 profile clock khác nhau và so sánh hiệu năng.
- Đo sai số baudrate khi dùng HSI vs HSE.
- Thiết kế tài liệu clock profile cho project nhiều module.
- Chứng minh tác động clock tới chu kỳ PWM bằng phép đo thực.
Khuyến nghị chấm bài theo rubric: đúng chức năng (40%), độ ổn định 30 phút chạy liên tục (30%), chất lượng cấu trúc code (20%), tài liệu kỹ thuật và báo cáo đo kiểm (10%).
Tài liệu tham khảo
- STMicroelectronics, STM32F103x8/B Datasheet.
- STMicroelectronics, RM0008 Reference Manual: STM32F10xxx advanced ARM-based 32-bit MCUs.
- STMicroelectronics, UM1850 STM32CubeMX user manual và tài liệu STM32Cube liên quan.
- ARM, Cortex-M3 Technical Reference Manual.
- STMicroelectronics Application Notes về GPIO, ADC, Timer, UART, I2C, SPI, DMA và Watchdog.