Skip to content

Công nghệ 9 giây

“Website hướng dẫn, thử nghiệm và giải thích công nghệ theo cách dễ hiểu cho mọi người.”

Menu
  • Home
  • Công nghệ
  • STM32
  • ESP32
  • Altium Desinger
  • Kiến thức điện máy
Menu

BÀI 13 – STRUCT + ENUM + TYPEDEF: GHÉP CÁC MẢNH LẠI VỚI NHAU

Posted on August 20, 2026August 23, 2026 by congnghe9s
bài 13

BÀI 13 – STRUCT + ENUM + TYPEDEF: GHÉP CÁC MẢNH LẠI VỚI NHAU

Ở Bài 10–12, bạn đã học:

  • enum → tạo tập hợp các trạng thái có tên
  • typedef → đặt tên mới cho kiểu dữ liệu
  • struct → gom nhiều biến khác kiểu thành một đối tượng

Hôm nay chúng ta ghép cả 3 lại. Đây là bài rất quan trọng nếu mục tiêu của bạn là lập trình C cho STM32.


1. Tại sao STM32 rất cần struct + enum?

Hãy tưởng tượng ta có một động cơ:

int speed;
int direction;
int enabled;

Nhìn riêng lẻ thì không biết biến nào thuộc về động cơ nào.

Ta có thể gom chúng lại:

struct Motor
{
int speed;
int direction;
int enabled;
};

Nhưng direction mà dùng 0, 1, 2 thì rất khó đọc.

Thay vào đó:

enum Direction
{
DIR_STOP,
DIR_CW,
DIR_CCW
};

Bây giờ:

struct Motor
{
int speed;
enum Direction direction;
int enabled;
};

Đọc code sẽ dễ hiểu hơn rất nhiều.


2. enum làm cho trạng thái có ý nghĩa

Ví dụ:

enum Direction
{
STOP,
CW,
CCW
};

Compiler hiểu:

STOP = 0
CW = 1
CCW = 2

Ta có:

enum Direction dir;
dir = CW;

Thay vì:

dir = 1;

Hai cách có thể tạo ra cùng giá trị, nhưng:

dir = CW;

con người đọc hiểu ngay.


3. Đưa enum vào struct

Ví dụ hoàn chỉnh:

enum Direction
{
STOP,
CW,
CCW
};
struct Motor
{
int speed;
enum Direction direction;
int enabled;
};

Tạo một biến:

struct Motor motor1;

Gán dữ liệu:

motor1.speed = 100;
motor1.direction = CW;
motor1.enabled = 1;

Ta có một đối tượng:

motor1
│
├── speed = 100
├── direction = CW
└── enabled = 1

4. typedef giúp code gọn hơn

Nếu không dùng typedef, mỗi lần khai báo phải viết:

struct Motor motor1;
struct Motor motor2;
struct Motor motor3;

Có thể dùng:

typedef struct
{
int speed;
enum Direction direction;
int enabled;
} Motor;

Bây giờ chỉ cần:

Motor motor1;
Motor motor2;
Motor motor3;

Đây chính là kiểu code bạn sẽ gặp rất nhiều trong STM32.


5. Có thể typedef luôn cả enum

Thay vì:

enum Direction
{
STOP,
CW,
CCW
};

ta viết:

typedef enum
{
STOP,
CW,
CCW
} Direction;

Bây giờ:

Direction dir;

thay vì:

enum Direction dir;

6. Ghép cả typedef + enum + struct

Đây là mẫu rất quan trọng:

typedef enum
{
STOP,
CW,
CCW
} Direction;
typedef struct
{
int speed;
Direction direction;
int enabled;
} Motor;

Sau đó:

Motor motor1;
motor1.speed = 100;
motor1.direction = CW;
motor1.enabled = 1;

Đọc code:

motor1.direction = CW;

rất tự nhiên.


7. struct có thể chứa nhiều enum

Ví dụ một thiết bị STM32:

typedef enum
{
LED_OFF,
LED_ON
} LedState;
typedef enum
{
MODE_AUTO,
MODE_MANUAL
} ControlMode;
typedef struct
{
LedState led;
ControlMode mode;
int value;
} Device;

Tạo:

Device device1;

Gán:

device1.led = LED_ON;
device1.mode = MODE_MANUAL;
device1.value = 500;

Ta đang mô tả một thiết bị hoàn chỉnh bằng một biến device1.


8. Đây chính là tư duy lập trình Embedded

Ví dụ một hệ thống điều khiển động cơ:

typedef enum
{
MOTOR_STOP,
MOTOR_RUNNING,
MOTOR_ERROR
} MotorState;
typedef enum
{
DIR_CW,
DIR_CCW
} MotorDirection;
typedef struct
{
int speed;
MotorState state;
MotorDirection direction;
} Motor;

Khai báo:

Motor motor1;

Điều khiển:

motor1.speed = 500;
motor1.state = MOTOR_RUNNING;
motor1.direction = DIR_CW;

Bây giờ motor1 chứa toàn bộ trạng thái của động cơ.


9. Đặc biệt quan trọng: STM32 thường dùng kiểu này

Ví dụ bạn có nút nhấn:

typedef enum
{
BUTTON_RELEASED,
BUTTON_PRESSED
} ButtonState;

Sau đó:

typedef struct
{
ButtonState state;
int counter;
} Button;

Khai báo:

Button button1;

Trong chương trình:

button1.state = BUTTON_PRESSED;
button1.counter++;

Đây là tư duy rất gần với cách xây dựng driver/module trong Embedded C.


10. Bài tập thực hành

Hãy tự viết chương trình quản lý STM32 LED.

Yêu cầu:

Bước 1

Tạo enum:

LED_OFF
LED_ON
LED_BLINK

Bước 2

Tạo enum:

MODE_AUTO
MODE_MANUAL

Bước 3

Tạo struct Led gồm:

state
mode
brightness

Trong đó:

state → enum
mode → enum
brightness → int

Bước 4

Tạo:

Led led1;

Bước 5

Thiết lập:

state = LED_BLINK
mode = MODE_AUTO
brightness = 80

Bước 6

In ra màn hình:

LED state: BLINK
Mode: AUTO
Brightness: 80

11. Một câu hỏi rất quan trọng

Hãy nhìn đoạn này:

typedef enum
{
LED_OFF,
LED_ON,
LED_BLINK
} LedState;
typedef enum
{
MODE_AUTO,
MODE_MANUAL
} LedMode;
typedef struct
{
LedState state;
LedMode mode;
int brightness;
} Led;

Bạn hãy thử trả lời:

Led là gì?

A. Một biến

B. Một kiểu dữ liệu mới

C. Một hàm

D. Một giá trị enum

👉 Đáp án: B.

Led là một kiểu dữ liệu mới do chúng ta tự định nghĩa.

Sau đó:

Led led1;

thì led1 mới là một biến thuộc kiểu Led.


12. Điều cực kỳ quan trọng cần nhớ

Bạn hãy phân biệt:

typedef struct
{
int speed;
} Motor;

với:

Motor motor1;

Dòng đầu:

Motor

→ kiểu dữ liệu

Dòng sau:

motor1

→ biến

Tương tự:

typedef enum
{
OFF,
ON
} State;

State → kiểu dữ liệu

State state1;

state1 → biến


13. Và đây là cầu nối sang STM32

Sau này bạn sẽ gặp kiểu như:

typedef struct
{
uint8_t state;
uint16_t counter;
uint32_t timeout;
} Button;

hoặc:

typedef enum
{
IDLE,
RUNNING,
ERROR
} SystemState;

rồi:

SystemState systemState;

và chương trình có thể chạy theo:

if (systemState == IDLE)
{
// hệ thống đang chờ
}
else if (systemState == RUNNING)
{
// hệ thống đang chạy
}
else if (systemState == ERROR)
{
// có lỗi
}

Đây chính là nền tảng của state machine (máy trạng thái) trong lập trình STM32.


🎯 Sau Bài 13, bạn cần nắm chắc 5 thứ

struct
↓
gom nhiều biến thành một đối tượng
enum
↓
đặt tên cho các trạng thái/giá trị
typedef
↓
đặt tên mới cho kiểu dữ liệu
typedef + enum
↓
tạo kiểu trạng thái dễ đọc
typedef + struct + enum
↓
xây dựng đối tượng điều khiển Embedded

Bài 14 chúng ta nên chuyển sang một chủ đề cực kỳ quan trọng: con trỏ + struct (struct *) và toán tử ->. Đây là chỗ C bắt đầu trở thành công cụ thực sự mạnh cho STM32.***

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Recent Posts

  • Bạn có thể hướng dẫn tôi quy trình sửa chữa một mainboard laptop cũng như mainboard của máy tính để bàn không?
  • Có những mức nguồn DC nào trên một bo mạch mainboard laptop?Kỹ thuật đốt dòng để kiểm tra nguồn laptop được thực hiện như thế nào?
  • bài tiếp theo hợp lý là: BÀI 63 – SENSOR FUSION THỰC CHIẾN: ENCODER + IMU MPU6050 + EKF + ODOMETRY X,Y,θ TRÊN STM32F103
  • BÀI 62 – EKF (EXTENDED KALMAN FILTER) CHO ROBOT 2 BÁNH: FUSION ENCODER + IMU + ƯỚC LƯỢNG X, Y, θ, V, ω
  • BÀI 61 – KALMAN FILTER CHO ENCODER + IMU: ƯỚC LƯỢNG TỐC ĐỘ, GÓC θ VÀ SENSOR FUSION

Recent Comments

No comments to show.

Archives

  • September 2026
  • August 2026
  • July 2026
  • June 2026
  • May 2026
  • February 2026

Categories

  • Altium Desinger
  • Công nghệ
  • ESP32
  • Khác
  • Kiến thức điện máy
  • STM32
Live 3D Globes Visitor
©2026 Công nghệ 9 giây | Design: Newspaperly WordPress Theme