Hướng dẫn tạo project với STM32CubeMX.

BÀI 01:
Hướng dẫn tạo project với STM32CubeMX.

  1. Giới thiệu sơ lược.
  2. STM32CubeMX là một phần mềm được cung cấp miễn phí giúp ích cho việc cấu hình ngoại vi, clock, tính toán dòng tiêu thụ, tạo project với nhiều dòng chip ARM STM32… Việc tạo project trở nên đơn giản bằng việc lựa chọn các ngoại vi cần thiết, cấp lock tùy chỉnh mà không cần liên quan đến code.

    Việc tạo project với thư viện chuẩn (standard library) là khá khó khăn vì cần nhiều bước để tạo ra project mới. STM32CubeMX ra đời như một lựa chọn để thay thế điều đó, với giao diện trực quan chúng ta sẽ dể dàng lập trình và có cái nhìn tổng quan hơn.

    Thư viện đi kèm với phần mềm này là STM32Cube HAL, gọi tắt là thư viện HAL, bộ thư viện này được chuẩn hóa, giúp đồng nhất giữa các dòng F0,F1,F2,F3,F4… Nhà sản xuất cũng cung cấp đầy đủ các ví dụ mẫu đi kèm với thư viện này. Cách tốt nhất để tự học là tự tìm hiểu các ví dụ mẫu này.

    Lưu ý: STM32CubeMX không phải là một trình biên dịch, nó chỉ là công cụ để sinh ra code, chúng ta vẫn phải dùng các trình biên dịch thông thường để quan sát, debug, lập trình, sửa lỗi…. Nếu bạn muốn tìm hiều sâu về vi điều khiển hãy bắt đầu nó bằng thư viện chuẩn(standard library) và ngược lai, nếu bạn muốn sử dụng một cách nhanh chóng hãy sử dụng thư viện HAL(STM32Cube HAL).

    Một số tính năng chính:

    • Dễ dàng quan sát các tính năng, thông số của IC.
    • Có cái nhìn tổng quan, bao quát hơn về lựa chọn, cấu hình chân, clock, ngoại vi.
    • Lựa chọn các board thí nghiệm của ST với các thông số cài đặt trước hoặc một MCU cụ thể.
    • Dễ dàng cấu hình ngoại vi, clock, các thông số và tự động sinh ra code.
    • Dễ dàng chuyển đổi giữa các loại MCU STM32 bằng cách tạo project mới một cách nhanh chóng.
    • Dễ dàng xuất file PDF các chân, tính năng… đã cấu hình.
    • Dễ dàng tạo ra project với nhiều trình biên dịch được lựa chọn.
    • Tính toán, quản lí năng lượng dễ dàng hơn.
    • Tự động cập nhật thư viện khi có bản cài đặt mới.
    • Thư viện được đồng nhất nên sẽ không có quá nhiều thay đổi khi chuyển đổi giữa các loại MCU. Ví dụ chuyển từ F1 qua F3, hay F4 và ngược lại.
  3. Cấu hình cơ bản GPIO.
  4. Dòng MCU mà mình sử dụng ở đây là  STM32F303CCT6 nên các ví dụ sẽ sử dụng loại MCU này luôn. Một vài thông số quan trọng mà dòng chip này có là  :

    • Thuộc dòng chip lập trình ARM cortex M4, 32 bit.
    • 48 chân, tốc độ lock tối đa là 72Mhz, bộ nhớ chương trình(flash) 256kbytes, SRAM 40kbytes.
    • Đầy đủ các chức năng như:
      • 4 bộ ADC 12 bit với nhiều channel, 2 kênh DAC 12 bit.
      • 13 timer :  2 watchdog timer, 1 systemtick timer, 10 timer thường với nhiều mode cấu hình.
      • Các giao tiếp : 1 CAN, 1 USB, 3 UART, 3 SPI, 2 I2C , 2 I2S.
      • 1 bộ RTC với đầy đủ chức năng.
      • Các cổng vào OPAMP, COMP.
      • Có touch sensing với 6 group với nhiều kiểu thiết kế để nâng cao hơn số nút nhấn có thể - cái này mình đã thử, khá ngon.
    1. B1 : mở STM32CubeMX, chọn new project để tạo project mới, load project để mở 1 project đã tạo.
    2. B2: Cửa sổ mới được mở ra, có 2 lựa chọn là :
      • Chọn MCU : chọn loại MCU theo 4 lựa chọn là họ(F1,F2…), dòng (STM32F0x1, STM32F103…), loại package(LQFP32, LQFP64….) hoặc more filters(theo bộ nhớ, theo số lượng IO…).
      • Chọn theo board thí nghiệm mà nhà sản xuất cung cấp : Nucleo, discovery….
      • Ở đây mình chọn theo MCU, loại MCU là STM32F303CCT6 nên lần lượt sẽ là F3, STM32F303, LQFP48. Double click vào loại MCU hoặc nhấn OK.

    3. B3 : cửa sổ mới được mở ra, đây chính là loại MCU mà bạn đã lựa chọn. Có 4 tab cần cấu hình chính đó là:
      • Pinout : cấu hình các chân ngoại vi, chức năng.
      • Clock Configuration : cấu hình clock hệ thống, clock ngoại vi..
      • Configuration: cấu hình ngắt, mode, thông số cho các chức năng ngoại vi.
      • Power consumption Caculator : quản lí năng lượng, hiển thi mức năng lượng sử dụng. Tab này ít được quan tâm khi mới bắt đầu sử dụng và thường là không cấu hình gì.

      Cấu hình thạch anh sử dụng và chân nạp(vì mình sử dụng debug) là quan trọng. Ở đây mình sử dụng thạch anh 8Mhz, và mạch nạp là st-link. Chân GPIO mình sử dụng là chân PB9, mode output. 3 điểm cần cấu hình ở Tab Pinout như sau:

    4. B4: Tiếp đến là Tab clock. Tab này chứa sơ đồ clock hệ thống của IC, nếu sử dụng thạch anh ngoài 8Mhz bạn có thể chính clock tối đa của hệ thống là 72Mhz nếu không clock tối đa chỉnh được là 64Mhz. Đối với clock hệ thống, tần số càng cao thì hệ quá trình xử lí càng nhanh.
    5. Điền clock hệ thống mong muốn vào và chương trình sẽ tự xử lí xem clock đó có được chấp nhận hay không.

    6. B5: Tab Configuration : Ở tab này chúng ta sẽ chọn lựa ngoại vi mà mình muốn cấu hình, Ở đây chỉ liên quan đến GPIO nên chỉ chọn tab GPIO. Click vào để mở nó nên. Cài đặt trạng thái mong muốn của ngõ ra GPIO. Nhấn OK để kết thúc.
    7. B6 : cài đặt các thông số cho chương trình xuất ra. Vào Project-> setting hoặc click vào biểu tượng để cài đặt. Chú ý trong việc lựa chọn Firmware Package name and version nếu chúng đã được cài đặt, nếu chưa thì thôi.
      • Tab Project:
        • Project name : đặt tên cho project.
        • Project location: trỏ đến nơi lưu giữ chương trình.
        • Toolchain/IDE: chọn trình biên dịch mà file code sử dụng. Ở đây mình sử dụng keil V5.
      • Tab Code generator:
        • STM32Cube Firmware Library package: chọn thư viện có được copy những file cần thiết, tất các các file, hoặc chỉ là đường dẫn đến thư viện gốc.
        • Generated files: cài đặt số file sinh ra, lưu giữ code  cho lần sinh ra code tiếp theo…
        • HAL settings: cài đặt tất cả các chân không sử dụng ở trạng thái analog để tiết kiệm năng lương..
        • Template Settings: khai báo biến sử dụng trong chương trình.
      • Tab Advanced Settings : Tab này tạm thời chưa quan tâm.
    8. B7: Vào Setting - > generate code để sinh ra code. Nếu STM32CubeMX chưa có thư viện được tải thì nó sẽ tải ở lần đầu tiên sinh ra code. File cấu hình Mx cube sẽ tự động lưu theo project được sinh ra.
    9. B8: Mở chương trình nên và thiết lập thông số sau:
      • Click vào biểu tượng Options of Target -> Utilities -> Flash download -> reset and run-> OK -> OK:  để chương trình tự chạy khi nạp code xong.
      • Mở file Main.c, thêm code vào giữa Begin và end trong vòng lặp while để hiển thị Led.
      • Nhấn biểu tượng build ở lần đầu tiên, rebuild(F7) ở lần tiếp theo và load(F8) code vào để chạy(lưu ý đã cắm board và driver cho mạch nạp).
      • Thế là xong một ví dụ cơ bản. Chúc các bạn thành công.

  5. Phần mềm cài đặt và một số lưu ý khi sử dụng phần mềm.
    1. Phần mềm cài đặt
      • STM32CUBEMX  V1.0 Version 4.26.0. Phần mềm này do hãng ST cung cấp free. Link tải mình để ở dưới..
      • Cài đặt thư viện cho STM32CUBEMX. Ở đây mình sử dụng version 1.9.0.
      • Keil C V5 version 5.25.0. Link tải mình để ở dưới.
      • Package cho Keil C : STM32F3xx_DFP version 2.1.0. Link tải mình để ở dưới.
    2. Các lưu ý khi sử dụng.
      • Các version STM32CUBEMX  mới nhất(cao hơn) có thể mở được các version cũ và ngược lại thì không. Điều đó sẽ xảy ra lỗi khi mở file STM32CUBEMX  download khác version của người khác.
      • Mỗi dòng MCU chỉ nên cài đặt 1 version trong STM32CUBEMX  và version cài đặt thì chọn gần nhất(tránh mới nhất – mình installed 1.9.0 thay vì 1.9.1 – cài này do ý kiến cá nhân của mình) để hạn chế tối đa lỗi xảy ra. Vào help -> Manage embedded software packages (Alt + U) để xem version packages đã cài đặt.
      • Nếu thư viện HAL chưa được tải về thì lần đầu sử dụng chương trình sẽ tự động được tải.
      • Khi bấm generate code ở lần thứ 2 trở đi, các dòng code của chương trình cũ sẽ được lưu giữ nếu chúng ta đặt nó trong mỗi cặp thẻ /* USER CODE BEGIN x */ và /* USER CODE END x */.
      • File cấu hình STM32CUBEMX   sẽ tự động được lưu khi generate code thành công cùng thư mục với nơi lưu trữ project được sinh ra.
      • Việc đầu tiên là phải cấu hình chân nạp và chân sử dụng thạch anh khi cấu hình Pinout để tránh các tình trạng lỗi xảy ra ở sau.
      • Việc cấu hình clock cũng quan trong vì nó là trái tim để MCU hoạt động, và cũng là thông số để tính toán tần số timer, RTC, tốc độ các giao tiếp SPI, I2C, UART, CAN, USB… cũng như tốc độ các ngoại vi khác.
      • Vì chương trình tự động sinh ra code nên đôi lúc sẽ xảy ra lỗi ngoài dự kiến. Tuy nhiên các loại lỗi khá ít xảy ra.
      • Còn bị lỗi Remap ở một số dòng chip khi sử dụng kèm với debug St-link.
      • Thư mục sinh ra code và file thư viện có kích thước lớn hơn nhiều so với standar library. Nên để hạn chế size của code sinh ra chọn : Project -> Setting…. -> Code generate -> Tích chọn ô Copy only the necessary library files.
      • Các ví dụ mẫu các bạn có thể tham khảo trên trang chủ ST hoặc trong gói package mà chúng ta đã cài đặt kèm theo trong STM32CUBEMX. Đây là đường dẫn của mình với gói package F3 cho board STM32F303RE – nucleo  : C:\Users\MINH\STM32Cube\Repository\STM32Cube_FW_F3_V1.9.0\Projects\STM32F303RE-Nucleo\Examples.

    Có thể còn nhiều vấn đề xảy ra nữa mà mình chưa thể biết hết. Mong sự đóng góp của mọi người để chúng ta có tìm hiểu rõ ràng, sâu hơn về dòng chip ARM của ST. Chúc các bạn thành công.

    Link tải phần mềm STM32CUBEMX   : từ google driver hoặc từ trang chủ ST. Link tải Keil C V5: từ google driver hoặc từ trang chủ Keil C. Link tải package cho keil C : từ google driver hoặc từ trang chủ Keil C. Link tải project mẫu. Link tải driver cho stlink V2.