Bài viết 3 thuộc series STM32F103C8T6 tập trung theo hướng “học để làm được việc”. Với chủ đề Cài đặt môi trường STM32CubeMX, Keil C và nạp chương trình cho STM32F103C8T6, 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.
Nhiều người mới mất hàng giờ chỉ vì lỗi toolchain, trong khi bản thân code không sai. Thiết lập môi trường đúng chuẩn ngay từ đầu là điều kiện bắt buộc để học nhanh và tránh bế tắc khi debug.
1. Mục tiêu bài học
Bài hướng dẫn theo quy trình chuẩn lớp học thực hành: cài đặt, kiểm tra driver, tạo project mẫu, nạp thử, xác nhận log và lưu template dùng lại.
- Cài và cấu hình STM32CubeMX, Keil C, ST-Link Utility đúng phiên bản.
- Tạo project STM32F103C8T6 chuẩn HAL và build không lỗi.
- Nạp chương trình qua ST-Link, đọc được log UART xác nhận chạy thật.
- Nắm các lỗi thường gặp và quy trình xử lý có hệ thống.
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.
- Vai trò của file startup, linker script, system clock config.
- Khác biệt giữa generate code từ CubeMX và code người dùng.
- Cách Keil quản lý target, include path, macro compile.
- Cơ chế nạp SWD và reset target của ST-Link.
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
Quy trình cài đặt có kiểm soát
Cài tool theo thứ tự CubeMX -> compiler/toolchain -> ST-Link driver giúp giảm xung đột. Sau mỗi bước, cần test bằng project blink nhỏ để xác định môi trường đang ở trạng thái tốt.
- Ghi lại version và checksum installer khi làm cho phòng lab.
- Tắt auto-update nếu lớp học cần đồng bộ môi trường.
- Sao lưu project mẫu để test nhanh sau khi update máy.
Tạo project chuẩn cho STM32F103C8T6
Trong CubeMX, cần xác nhận đúng package chip, clock và pinout trước khi generate code. Chỉ bật ngoại vi đang học để code gọn và dễ kiểm thử. Keil target cần thiết lập đúng device và optimization phù hợp giai đoạn học.
- Đặt tên project theo quy ước để dễ quản lý version.
- Giữ cấu hình clock cố định khi đang kiểm thử ngoại vi cơ bản.
- Bật warning level phù hợp để phát hiện lỗi sớm.
Nạp và xác minh chương trình
Sau khi nạp, không nên chỉ nhìn LED sáng/tắt mà cần xác minh thêm log UART, kiểm tra timing hoặc tín hiệu chân I/O. Điều này giúp loại trừ tình trạng chạy “ảo” do wiring nhầm hoặc cấu hình pin chưa đúng.
- Kiểm tra nguồn target trước khi nạp.
- Đảm bảo đúng chế độ reset trong cấu hình ST-Link.
- Lưu biên bản test sau mỗi lần thay đổi toolchain.
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 bước cài đặt cần được kiểm tra bằng bài test nhỏ ngay sau khi hoàn thành, không dồn tất cả kiểm tra vào cuối buổi.
- Cài STM32CubeMX và chọn toolchain MDK-ARM (Keil).
- Cài Keil C, cài thêm device pack STM32F1 đầy đủ.
- Cài driver ST-Link và xác nhận thiết bị nhận trong Device Manager.
- Tạo project blink LED trong CubeMX, generate code và build trong Keil.
- Nạp code bằng ST-Link, xác minh bằng LED + log UART.
- Lưu project làm template chuẩn cho các bài học tiếp theo.
Ở 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ụ khung main kiểm tra nạp chương trình
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.
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
const char *msg = "STM32F103 toolchain OK\r\n";
while (1)
{
HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), 100);
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
HAL_Delay(1000);
}
}
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õ.
- Keil thiếu device pack STM32F1 nên build báo lỗi startup file.
- ST-Link nhận thiết bị nhưng không connect do wiring SWDIO/SWCLK sai.
- Project generate lại làm mất code vì đặt sai vùng USER CODE.
- Clock UART sai dẫn tới terminal hiển thị ký tự rác.
- Không đồng bộ version CubeMX giữa các máy trong lớp.
Sau khi cài thành công, hãy đóng gói “hồ sơ môi trường” gồm version tool, driver và cấu hình project mẫu để tái dùng cho các máy khác.
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ế.
- Tạo script checklist cài đặt cho phòng máy 10 PC.
- Build cùng một project ở 2 máy khác nhau và so sánh output.
- Tạo project UART echo và chứng minh nạp/chạy ổn định 30 phút.
- Viết tài liệu hướng dẫn 1 trang cho sinh viên mới vào lab.
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.