Nội Dung Bài Viết
Dưới đây là hướng dẫn chi tiết nhất để tạo một project lập trình STM32 thanh ghi trên Keil uVision5 hoàn toàn, không dùng HAL, không dùng Standard Peripheral Library, không dùng CMSIS-Core (chỉ dùng startup file và thao tác trực tiếp với thanh ghi). Mục tiêu: STM32F103RCT6 (256 KB Flash – High Density).
Tạo project mới cho lập trình STM32 thanh ghi trên Keil
- Mở Keil uVision5 → Project → New µVision Project…
- Chọn thư mục lưu → Đặt tên project (ví dụ: STM32F103RCT6_Register)
- Chọn chip: STMicroelectronics → STM32F1 Series → STM32F103 → STM32F103RC (đúng với RCT6)
Manage Run-Time Environment
- Cửa sổ hiện ra → Không tick bất kỳ thành phần nào (đặc biệt không tick CMSIS → Core và Device → Startup)
- Nhấn OK → Khi hỏi “Add Startup code?” → chọn No
Thêm file startup chính xác cho High-Density
STM32F103RCT6 thuộc dòng High-Density → phải dùng file startup_stm32f10x_hd.s

Cách lấy file:
1 | C:\Keil_v5\ARM\PACK\Keil\STM32F1xx_DFP\2.3.0\Device\Source\ARM\startup_stm32f10x_hd.s |
- Copy file này vào thư mục dự án, ví dụ: .\startup\startup_stm32f10x_hd.s
- Trong Keil: chuột phải Target → Add Group → đặt tên “Startup”
- Chuột phải group Startup → Add Existing Files → chọn file vừa copy → Add

Tạo cấu trúc thư mục và file nguồn
- Tạo 2 group: Source và Include
- Group Source → Add New Item → C File → tên main.c

- Group Include → Add New Item → Header File → tên registers.h

File registers.h (định nghĩa thanh ghi cơ bản)
1 2 3 4 5 6 7 8 9 10 11 12 13 | #ifndef REGISTERS_H #define REGISTERS_H #include <stdint.h> #define __I volatile const #define __O volatile #define __IO volatile #define __IM volatile const #define __OM volatile #define __IOM volatile #endif /* REGISTERS_H */ |
Cấu hình Project Options (Alt+F7)
Tab Target
- Xtal (MHz): 8.0
- Tick: Use MicroLIB

Tab C/C++
- Define: STM32F10X_HD
- Additional Include Directories: .\Include
Tab Output
- Tick: Create HEX File
Tab Linker
- Tick: Use Memory Layout from Target Dialog

main.c
1 2 3 4 5 6 7 8 9 10 11 12 | #include "registers.h" #include "system.h" int main(void) { SystemClock_Config(); // Initialize system clock // Peripheral configurations while (1) { // Application code } } |
Build & nạp
- F7 → Build → Không lỗi → sinh file .hex
- Dùng ST-Link nạp

Lưu ý khi lập trình STM32 thanh ghi trên Keil
- Lần đầu build có thể cảnh báo SystemInit không định nghĩa → bỏ qua hoặc thêm hàm rỗng:1void SystemInit(void) { }
- Tất cả mọi thứ giờ đây đều do bạn tự thao tác trực tiếp với thanh ghi – đúng nghĩa lập trình STM32 thanh ghi keil!
Chúc bạn thành công với cách lập trình STM32 thanh ghi trên Keil uVision5! Đây là nền tảng vững chắc nhất trước khi học HAL hay LL.
