🌱 MPU GUI App: Tạo Cấu Hình User cho STM32F4

🌱 MPU GUI App: Tạo Cấu Hình User cho STM32F4

    Bài trước mình đã giới thiệu với các bạn về lập trình cấu hình MPU sử dụng MPU Driver và cấu trúc Driver MPU. Bài viết này mình sẽ giới thiệu về App Gen Region Config phục vụ cho người dùng MPU để gen các bộ config tiện cho quá trình sử dụng MPU. App của mình cũng tương tự các giao diện trong thực tế.

ARM Cortex M4 Memory Protection Unit

Mục lục


👉 Phần cứng sử dụng

    STM32F401RE - NUCLEO Board.

STM32F401 NUCLEO Board

👉 Phần mềm sử dụng

👉 Hướng dẫn lập trình MPU Register

Xem tại đây!

👉 Hướng dẫn lập trình MPU Driver

Xem Bài 1 - Xem Bài 2

👉 Ứng dụng MPU GUI App

    Dưới đây là code minh họa cho MPU GUI App bằng Python (PyQt5 + Qt Designer) để tạo cấu hình MPU, tương thích với MPU Driver từ các phần trước:

# mpu_gui.py
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QComboBox, QPushButton, QTextEdit
from PyQt5.QtCore import Qt

class MPUConfigApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("MPU Config Generator")
        self.setGeometry(100, 100, 600, 400)

        # Widget chính
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        self.layout = QVBoxLayout(self.central_widget)

        # Region Config
        self.region_layout = QVBoxLayout()
        self.layout.addLayout(self.region_layout)

        # Region Number
        self.region_num_layout = QHBoxLayout()
        self.region_num_label = QLabel("Region Number (0-7):")
        self.region_num_input = QLineEdit()
        self.region_num_layout.addWidget(self.region_num_label)
        self.region_num_layout.addWidget(self.region_num_input)
        self.region_layout.addLayout(self.region_num_layout)

        # Start Address
        self.start_addr_layout = QHBoxLayout()
        self.start_addr_label = QLabel("Start Address (Hex):")
        self.start_addr_input = QLineEdit("0x40000000")
        self.start_addr_layout.addWidget(self.start_addr_label)
        self.start_addr_layout.addWidget(self.start_addr_input)
        self.region_layout.addLayout(self.start_addr_layout)

        # Region Size
        self.size_layout = QHBoxLayout()
        self.size_label = QLabel("Region Size (log2):")
        self.size_input = QComboBox()
        self.size_input.addItems([str(i) for i in range(5, 32)])  # 32B đến 4GB
        self.size_input.setCurrentText("9")  # 1KB mặc định
        self.size_layout.addWidget(self.size_label)
        self.size_layout.addWidget(self.size_input)
        self.region_layout.addLayout(self.size_layout)

        # Memory Type
        self.mem_type_layout = QHBoxLayout()
        self.mem_type_label = QLabel("Memory Type:")
        self.mem_type_input = QComboBox()
        self.mem_type_input.addItems(["Strong Order", "Normal Cacheable", "Normal Non-Cacheable"])
        self.mem_type_layout.addWidget(self.mem_type_label)
        self.mem_type_layout.addWidget(self.mem_type_input)
        self.region_layout.addLayout(self.mem_type_layout)

        # Access Right
        self.access_layout = QHBoxLayout()
        self.access_label = QLabel("Access Right:")
        self.access_input = QComboBox()
        self.access_input.addItems(["No Access", "Full Access", "Read Only"])
        self.access_layout.addWidget(self.access_label)
        self.access_layout.addWidget(self.access_input)
        self.region_layout.addLayout(self.access_layout)

        # Enable
        self.enable_layout = QHBoxLayout()
        self.enable_label = QLabel("Enable Region:")
        self.enable_input = QComboBox()
        self.enable_input.addItems(["Yes", "No"])
        self.enable_layout.addWidget(self.enable_label)
        self.enable_layout.addWidget(self.enable_input)
        self.region_layout.addLayout(self.enable_layout)

        # Nút Generate
        self.generate_btn = QPushButton("Generate Config")
        self.generate_btn.clicked.connect(self.generate_config)
        self.layout.addWidget(self.generate_btn)

        # Kết quả
        self.result_text = QTextEdit()
        self.result_text.setReadOnly(True)
        self.layout.addWidget(self.result_text)

    def generate_config(self):
        region_num = self.region_num_input.text()
        start_addr = self.start_addr_input.text()
        size = self.size_input.currentText()
        mem_type = self.mem_type_input.currentIndex()  # 0: Strong, 1: Cacheable, 2: Non-Cacheable
        access = self.access_input.currentIndex()      # 0: No Access, 1: Full, 2: Read Only
        enable = self.enable_input.currentIndex()      # 0: Yes, 1: No

        # Chuyển đổi sang định dạng MPU Driver
        mem_type_map = {0: "MPU_MEM_STRONG_ORDER", 1: "MPU_MEM_NORMAL_CACHEABLE", 2: "MPU_MEM_NORMAL_NONCACHE"}
        access_map = {0: "MPU_ACCESS_NO_ACCESS", 1: "MPU_ACCESS_FULL", 2: "MPU_ACCESS_READ_ONLY"}
        enable_map = {0: 1, 1: 0}

        config = (
            f"MPU_RegionConfig_t region_{region_num} = {{\n"
            f"    .RegionNumber = {region_num},\n"
            f"    .StartAddress = {start_addr},\n"
            f"    .Size = {size},\n"
            f"    .MemoryType = {mem_type_map[mem_type]},\n"
            f"    .AccessRight = {access_map[access]},\n"
            f"    .Enable = {enable_map[enable]}\n"
            f"}};"
        )
        self.result_text.setText(config)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MPUConfigApp()
    window.show()
    sys.exit(app.exec_())
    

Giải thích:

  • Ứng dụng GUI dùng PyQt5 và Qt Designer để tạo giao diện nhập thông tin MPU Region.
  • Người dùng nhập: Region Number, Start Address, Size (log2), Memory Type, Access Right, Enable.
  • Nút "Generate Config" tạo code cấu hình dạng `MPU_RegionConfig_t` tương thích với MPU Driver (Phần 4, 5).
  • Ví dụ: Tạo Region 1 (0x4000.0000, 1KB, Normal Non-Cacheable, Read Only, Enable).

👉 Video thực hành

    Chi tiết các bạn xem Video thực hành bên dưới của mình:


Video 3: Thực hành MPU GUI App

>>>>>> Follow ngay <<<<<<<

Để nhận được những bài học miễn phí mới nhất nhé 😊
Chúc các bạn học tập tốt 😊

Nguyễn Văn Nghĩa

Mình là một người thích học hỏi và chia sẻ các kiến thức về Nhúng IOT.

Đăng nhận xét

Mới hơn Cũ hơn
//