01_STM32CubeIDE_F103C8T6_GPIO

01 STM32F108C8T6 GPIO với STM32CubeIDE

Chào anh em, sau thời gian dài vắng mặt nay mình đã trợ lại. Tìm kiếm trên mạng mình thấy STM32CubeIDE của nhà sản xuất cung cấp khá ngon và điều quan trọng là free license. Nay mới giới thiệu đến anh em để cùng học tập. Trước đó mình dùng Keil C và cũng khá ổn, gần đây vấn đề đánh bản quyền ở Việt Nam khá nghiêm trọng và đây là phương thức thay thê hợp lí. Dựa vào quan điểm cá nhân một số ưu khuyết điếm của tool so với Keil c như sau.

Tiêu chí STM32CubeIDE Keil C / MDK-ARM
Chi Phí Miễn phí Bản đầy đủ cần license(giới hạn code build cho bản free).
Tương thích với STM32 Do ST cung cấp nên độ tương thích nhỉnh hơn Keil C(⭐ ⭐ ⭐ ⭐⭐) (⭐ ⭐ ⭐ ⭐)
Cấu hình MCU Tương thích với MXCube gen code. Tương thích với MXCube gen code nhưng nếu cấu hình bằng tay thì khá phức tạp.
Tính năng Nhiều tính năng tích hợp nhưng đôi khi cũng là nhược điểm.
IDE Eclipse-based µVision
Compiler GCC/LLVM tùy cấu hình/toolchain Arm Compiler / GCC tùy phiên bản
Debug Tốt (⭐ ⭐ ⭐ ⭐) Rất tốt (⭐ ⭐ ⭐ ⭐⭐)
Tốc độ build Tốt (⭐ ⭐ ⭐ ⭐) Rất tốt (⭐ ⭐ ⭐ ⭐⭐)
Tối ưu code Tốt (⭐ ⭐ ⭐ ⭐) Rất tốt (⭐ ⭐ ⭐ ⭐⭐)
Quản lí project Tốt (⭐ ⭐ ⭐ ⭐) Rất tốt (⭐ ⭐ ⭐ ⭐⭐)
Phù hợp để học Rất tốt (⭐ ⭐ ⭐ ⭐⭐) Tốt (⭐ ⭐ ⭐ ⭐)
Phù hợp để làm dự án Tốt (⭐ ⭐ ⭐ ⭐) Rất tốt (⭐ ⭐ ⭐ ⭐⭐)

Dưới đây là một số step cơ bản để cấu hình + build một project đơn giản, chi tiết các bạn có thể tham khảo tài liệu hoặc video hướng dẫn của nhà sản xuất. Tài liệu cũng khá nhiều và mình chủ yếu dựa trên tài liệu của nhà sản xuất.

  1. Cấu hình bằng STM32MXCube.

STM32MxCube mình cài đặt hiện tại là 6.18.1. Link tải mình có để ở cuối bài.

  1. Mở STM32Cube, giao diện đầu tiên phải chọn là loại MCU cần sử dụng. (1) là loại hardware mà tự phát triển, (2) là một số board mẫu của nhà sản xuất ST – chứa đựng các chân cấu hình mặc định như board Discovery, Nucleo... (3) chứa các example + code cấu hình sẵn. Thông thường mình sẽ chọn (1) vì mình sử dụng hardware mà mình tự thiết kế.

  1. Cấu hình Pinout & Configuration.

Phần SYS mình sẽ chọn sử dụng debug devide là Serial wire(sử dụng 2 chân kiểu dạng StlinkV2) phần SysTick cho hàm delay.

Phần RCC mình sẽ chọn là sử dụng thạch anh ngoài cho HSE và LSE vì phần cứng của mình đã hỗ trợ sẵn, các bạn có thể cấu hình dựa trên phần cứng có sẵn.

Phần GPIO mình chọn chân tương ứng và chức năng sử dụng, tương tự là phần cấu chi tiết cho chân IO đó: là mode input hay output, mức logic default là thấp hay cao, có pull-up hay pull-down, tần số điều khiển tối đa là cao hay thấp.

  1. Clock configuration.

Vì phần cứng mình đã có Crystal lên mình sẽ chọn sử thạch anh ngoài, clock hệ thống luôn là maximum vì thời gian điều khiển từng câu lệnh sẽ là nhanh nhất.

  1. Project manager.

Điền tên project name, thư mục lưu trữ, chọn IDE sử dụng, version của thư viện. Các phần khác có thể để mặc định hoặc tùy chỉnh dựa vào mục đích cá nhân. Sau đó nhấn nút generate code.

  1. Open source code.

Sau khi nhấn generate code, phần thông báo mở lên và chọn open project. Nếu máy bạn đã cài STM32CubeIDE thì hệ thống sẽ tự động mở source code generate ra. Nếu có lỗi thì bạn kiểm tra phần cài đặt STM32CubeIDE của mình.

  1. Edit, build và Flash.

STM32CubeIDE mình cài đặt hiện tại là 2.2.0. Link tải mình có để ở cuối bài.

  1. Open main.c và bắt đầu edit code như hình. Câu lệnh điều khiển mình có thể tham khảo trong file thư viện kèm.

  1. Build.

Sau khi sửa code, bạn có thể chọn build bằng cách nhấn vào biểu tượng cây búa(1) hoặc vào project -> build All hoặc phím tắt Ctrl + B để build. Kiểm thông báo trên cửa sổ Console.

  1. Flash.

Kiểm tra debuger và hardware trước khi flash. Nhấn vào biểu tượng trên trace (1) hoặc chọn Run -> Run để nạp chương trình xuống phần cứng. Kiêm tra thông báo trên Console xem có lỗi hoặc đã thành công hay chưa.

  1. Chọn debug option nếu bạn muốn debug.

STM32CubeIDE đã hỗ trợ sẵn mode debug, bạn có thể chọn debug/ đặt break point/ xem biến, run step by step.... nếu muốn.

  1. Kết quả.

Đèn led ở chân PB9 sẽ đảo trạng thái mỗi 1s.

Chúc các bạn thành công.

  1. Một số lưu ý tiện lợi phổ biến cho người mới dùng.

    1. Nếu bạn chưa cài đặt các gói package cho STM32Mxcube hoặc cập nhật driver mới nhất cho debugger, lần đầu gen code hoặc flashing sẽ có thông báo yêu cầu cài đặt.

    2. Nhấn Ctrl+ H hoặc Search trên task bar, cửa sổ tìm kiếm sẽ hiện ra, ở đây mình sẽ có nhiều lựa chọn tìm kiếm file, key word.

  1. Một số bạn thích giao diện tối, các bạn có thể tùy chỉnh về giao diện tối. Window -> Preference -> Appearance-> Theme -> dard mode.

  1. Tùy chỉnh phím tắt. Window -> Preference -> General -> Keys.

  1. Cửa sổ Outline hiển thị tất cả define + function trong file được chọn.

  1. Build hex file. Configuration để tạo được hex file khi build. Mục đích để release, share file build

  1. Thông tin tìm hiểu thêm.

4.1 Cấu hình MXCube + gen code:

+ Video/tài liệu từ nhà sản xuất:

4.2 Edit code, build + flashing:

+ Video/tài liệu từ nhà sản xuất:

4.3 Link project create.

https://github.com/xuanminhblog/01_STM32CubeIDE_F108C8T6_GPIO

10. MXCUBE HAL STM32F407 SIMULATE EEPROM

Document

10. MXCUBE HAL STM32F407 SIMULATE EEPROM


  1. Introduce
  2. Hello everyone, today I introduce using simulate EEPROM(using flash memory) instead real EEPROM. In history, i have some doubt how to save data in ECU before power off and load it again after power on again. Data in here we can change during run, not fixed constant value. After search in google, I see it and I think it may be useful if someone need it.

    Reference link

    In STM32, to save cost, manufacturer usually provide flash memory and skip EEPROM. For flash memory, they only support erase follow sector or page and we need erase before write. It difference with EEPROM, we can erase/write/read follow byte and we can overwrite. Below is comparison from my understand between flash memory and EEPROM.

    Advantage and disadvantage use Simulate EEPROM:

    Advantage:

    • To save cost.
    • Hardware for EEPROM not available.
    • To save IO pin or communication pin.

    Disadvantage:

    • Complexity code use for development.
    • If we write over full memory, we need take time to erase and processing – it just small.
    • We write follow sequence, address in flash is not fixed.
  3. Explanation.
    1. Memory use.
    2. Below is example flash memory use, we can select another memory but need take note:

      For code build, we need takes care code need in site range. If it out range, it will overwrite locations simulate EEPROM.

      For simulate we need using 2 sectors with same size and need configuration in library.

    3. Format data in simulate EEPROM.
    4. We use 2 sectors because if first sector is full => we will erase first sector and move to second sector => it will avoid lost or missing data. 4 bytes first sector indication sector is use or not, next 2 bytes is address, more next 2 bytes is data. We will define how many address and data write. Every time trigger write, we need all address and data or apart data (it will more code processing to handle).

      For detail how to read/write/erase, please find in reference link, put debug point and see.

  4. Example and detail code.
  5. Example: using simulate EEPROM library in reference to save number time of reset STM32 with format data: 2 first bytes data is number time reset, 2 next bytes are MSB bytes of Random number generate, 2 end bytes are LSB of Random number generate.

    Hint:

    • Format:
    • Using RGN feature in STM32 to generate random number, we need configuration by STM32CUBEMX and get data.
    1. Open STM32CUBEMX and select STM32F407VGTx, every version of this tool we have UI difference, in here I use 6.10.0. We can search how to use it in google, in this guide line, only mention some main step and main code change.
      1. Configuration RCC are use HSE and LSE external.
      2. Configuration use debugger is Serial wire and System tick timer.
      3. Configuration GPIO for led are PD12, PD13, PD14, PD15.
      4. Configuration RNG feature.
      5. Configuration clock use.
      6. Configuration generate code and click generate code.
    2. Open project by Keil C and start modify code generate
    3. Note: Build project first to confirm no issue for generate code, add library download github or download source code directly in below:

      1. Add some variable use for simulate EERPOM with mandatory address, date read, data write.
      2. Define some function call for Initial, read, write which we call from library for personal purpose.
      3. Process data follow chart: (1)Read first time after reset(If we read failed it mean we don’t initial EEPROM before, it will trigger Inital) => (2) Get data we save via some global variable to view in debug => (3)Get data in current time and write it for next time read => If no error we will toggle 4 led with 1000ms, if failed we toggle with 200ms.
      4. Some note need take care:
        • We need unlock and lock flash every time access read or write => It define by some register control Flash.
        • HAL_FLASH_Unlock(); HAL_FLASH_Lock();

        • Function Protocol_InitialEEPROM(),ReadEEPROM(),WriteEEPROM() are handle by user, we can modify for some personal purpose but need take care of use case
        • We can select option Reset and Run in Keil after first time download, if no select it, you need press button reset or power off/on again. Make sure location memory flash for simulate EEPROM not access by another part. We can use option Erase full chip in configuration and next time disable it.
        • Use debug feature to see data every time reset or STM32-STLINK Utility to view memory of location Simulate EEPROM.
    4. Link source code and reference github.
    5. If you have doubt or concern, you can contact me by contact page or write down comment. I will update ASAP. Sorry to change to English content for some Vietnamses because English is importance with everyone for study and learning new thing easier. Event my English is not good, i will try enhanced and improve it.

      Reference link Source code link

Bài 04. Giao tiếp với OLED 0.96 inch SSD1306.

Bài 04. Giao tiếp với OLED 0.96 inch SSD1306.

Bài 04. Giao tiếp với OLED 0.96 inch SSD1306.

  1. LÝ THUYẾT.
  2. Xin chào các bạn,

    Hôm nay mình xin chia sẻ một số thông tin và hướng dẫn sử dụng OLed 0.96 inch SSD1306. Hiện tại trên thị trường có rất nhiều loại oled 0.96 inch với các thông số như chip điều khiển(SSD1306, SSD1325, SSD1331, SSH1106..) và chuẩn khác nhau(I2C, SPI..). Ở đây mình xin chia sẻ thông tin về oled 0.96 inch sử dụng chip điều khiển là SSD1306 và sử dụng chuẩn giao tiếp I2C.

    Mục đích chính của oled là để hiển thị thông tin với màn hình nhỏ và thông tin tương đối rõ ràng, chúng ta có thể sử dụng chúng với một số ứng dụng như: hiển thị thời gian, hiển thị thông số nhiệt độ, độ ẩm để theo dõi, hiển thị thông tin cho robot, các thiết bị cầm tay nhỏ gọn… Một vài thông số cơ bản :

    • Sử dụng chip điều khiển SSD1306.
    • Sử dụng chuẩn giao tiếp thông dụng I2C nên tương thích với hầu hết các loại MCU có trên thị trường.
    • Kích thước màn hình 0.96inch(128x64 điểm).
    • Công suất tiêu thụ 0.08W.
    • Điện áp cung cấp 3 - 5VDC.
    • Góc hiển thị > 160 độ.
    • Màu hiển thị trắng/xanh dương.
  3. Code với MX cube.
  4. Sơ đồ kết nối:

    Một số lưu ý khi sử dụng module:

    • Loại ARM sử dụng là STM32F103C8T6, 48 pin out, clock là 72Mhz, Flash memory 64 Kbytes.
    • OlED 0.96 inch , giao tiếp I2C.
    • Địa chỉ của OLED này khi giao tiếp I2C là 0x78.
    • Giao tiếp I2C với mode Standard speed (100 Khz).
    • Trình biên dịch là Kiel C V5, thư viện sử dụng là thư viện HAL( HAL libraries).
    • Hàm ssd1306_refresh_gram(); được sử dụng để làm mới màn hình, hiển thị những thông tin mới ghi vào bộ nhớ.
    • Sử dụng hàm ssd1306_draw_bitmap() để vẽ các kí tự, ssd1306_draw_3216char() hoặc ssd1306_draw_1616char() để ghi các kí tự với font khác nhau, ssd1306_display_string() để hiển thị chuỗi kí tự với các thông số input tương ứng.
    • Bộ thư viện mình tìm được trên mạng và đã chỉnh sửa lại. Để xem thêm các function liên quan về OLED thì các bạn có thể vào tab Function như hình ở dưới.
    1. Cấu hình dung Mx Cube:
      • Cấu hình xung clock:
      • Cấu hình chân debug.
      • Cấu hình I2C ở chế độ standard mode, tốc độ là 100khz, port I2C2.
      • Cấu hình xung clock hệ thống Max là 72Mhz, giúp tốc độ xử lý lệnh là nhanh nhất.
      • Cấu hình trình Ide và code generate -> click button generate code.
    2. Modify code generate:
      • Copy thư viện từ project download sang project của bạn trong thư mục src and inc. Thư mục src : file Fonts.c, SSD1306.c. Thư mục inc: MacroAndConst.h, Fonts.c, SSD1306.c.
      • Add các file .c vào project của bạn.
      • Include các thư viện vào file main.c, lưu ý add vào giữa các dòng command code BEGIN và END để tránh mất code khi generate code lại tự Mxcube.
      • Modify code để ghi một số ký tự mẫu lên oled.
      • Cấu hình reset and run để code được thực thi khi flashing code mà không cần nhấn nút reset.

      Note: Đây chỉ là ví dụ cơ bản để hiện thị một số ký tự lên oled, các bạn có thể tự tìm hiểu và modify code để có những ứng dụng riêng của mình. Mọi thắc mắc các bạn có thể comment hoặc inbox mình, mình sẽ trả lời nhanh nhất trong thời gian có thể.

  5. Một số link tham khảo.
    1. Một số link mua hàng các bạn có thể tham khảo.
    2. Link 1 Link 2 Link 3
    3. Link download tài liệu.
    4. Download datasheet của chip điều khiển SSD1306 : Download các file thư viện :

01. Giao tiếp với cảm biến ánh sáng BH1750.

Giao tiếp với cảm biến ánh sáng BH1750.

01. Giao tiếp với cảm biến ánh sáng BH1750.

  1. LÝ THUYẾT.
  2. Với BH1750 chúng ta có thể tạo được nhiều ứng dụng tiện lợi trong đời sống như bật tắt đèn ngoài sân khi trời tối, ứng dụng bật đèn cho nông nghiệp… , là ic dùng trong điện thoại, tivi. So với quang trở(điện trở thay đổi theo ánh sáng) thì BH1750 có độ chính xác và dải đo rộng hơn, tuy nhiên quá trình đo đạc cũng phức tạp hơn.

    BH1750 dùng chuẩn giao tiếp I2C, dải đo từ 1 – 65535 lux. Lux là đơn vị đo ánh sáng. Dành cho những bạn chưa biết về đơn vị lux : https://vi.wikipedia.org/wiki/Lux

    Một số tính năng của IC:

    • Giao tiếp bằng chuẩn I2C.
    • Dải quang phổ gần với tần số mắt người nhìn thấy.
    • Tín hiệu đầu ra là tín hiệu số.
    • Thang đo từ 1 – 65535 lux.
    • Mức độ tiêu thụ điện năng thấp.
    • Lọc nhiễu trong dải tần 50 – 60 Hz.
    • Mức logic giao tiếp có thể đến 1.8V.
    • Không cần các thiết bị bên ngoài để hỗ trợ chạy Ic như thạch anh …
    • Có thể tương thích với nhiều nguồn sáng như mặt trời, đèn led trắng, đèn halogen…
    • Có thể thay đổi địa chỉ giao tiếp(địa chỉ I2C).
    • Có thể config để đọc được giá trị nhỏ nhất là 0.23 lux.
    • Sai số nhỏ (20%).
    • Ảnh hưởng của tia hồng ngoại đến việc đo lường là nhỏ.

    Nếu bạn dùng module GY-30 BH1750 thì một số thông số đầu vào như sau:

    • VCC : chân cấp nguồn, điện áp đầu vào từ khoảng 3.3 -> 6VDC.
    • ADD: chân này là chân thay đổi địa chỉ nếu cần thiết, default nó sẽ là mức thấp: địa chỉ I2C sẽ là 0x23, nếu ở mức cao sẽ là 0x5C.
    • SCL : chân clock của giao tiếp I2C.
    • SDA: chân Data của giao tiếp I2C.
    • GND: chân nối mass của module.

    Một số command thông dụng khi giao tiếp với IC:

    • Power down(0x00) : Set IC ở chế độ không hoạt động.
    • Power on(0x01) : Set IC ở chế độ hoạt động.
    • Reset(0x07) : Reset giá trị các thanh ghi của IC. Command này không hoạt động khi IC ở mode Power down.
    • Continuously H-Resolution Mode(0x10): Cài đặt IC ở chế độ đo liên tục với độ phân giải là 1 lux. Thời gian đo cập nhật giá trị trung bình sẽ là 120ms.
    • Continuously H-Resolution Mode2(0x11): Cài đặt IC ở chế độ đo liên tục với độ phân giải là 0.5 lux. Thời gian đo cập nhật giá trị trung bình sẽ là 120ms.
    • Continuously L-Resolution Mode(0x13): Cài đặt IC ở chế độ đo liên tục với độ phân giải là 4 lux. Thời gian đo cập nhật giá trị trung bình sẽ là 16ms.
    • One Time H-Resolution Mode(0x20): Cài đặt IC ở chế độ đo 1 lần với độ phân giải là 0.5 lux, thời gian đo cập nhật giá trị trung bình sẽ là 120ms. Sau khi cập nhật giá trị IC sẽ chuyển sang power down, muốn đo lại thì chúng ta phải gửi command power on để tiếp tục.
    • One Time H-Resolution Mode2(0x21): Cài đặt IC ở chế độ đo 1 lần với độ phân giải là 0.5 lux, thời gian đo cập nhật giá trị trung bình sẽ là 120ms. Sau khi cập nhật giá trị IC sẽ chuyển sang power down, muốn đo lại thì chúng ta phải gửi command power on để tiếp tục.
    • One Time L-Resolution Mode(0x23): Cài đặt IC ở chế độ đo 1 lần với độ phân giải là 4 lux, thời gian đo cập nhật giá trị trung bình sẽ là 16ms. Sau khi cập nhật giá trị IC sẽ chuyển sang power down, muốn đo lại thì chúng ta phải gửi command power on để tiếp tục.
    • Change Measurement time(01000_MT[7,6,5], 011_MT[4,3,2,1,0]): Thay đổi độ phân giải trong quá trình đo lường, muốn tăng độ chính xác thì thời gian đo sẽ chậm hơn và ngược lại.

    Note : Nhà sản xuất khuyến cáo chúng ta nên sử dụng mode H-resolution Mode, Với những môi trường tối chúng ta có thể sử dụng H-resolution Mode2 thay cho H-resolution Mode hoặc có thể thay đổi độ phân giải để đo được các giá trị nhỏ hơn.

    Cách tính toán giá trị đo lường. Với H-resolution Mode và thanh ghi độ phân giải có giá trị mặc định.

    Output = Value_Read/1.2/Mode.

    • Output là giá trị của độ sáng đơn vị là lux.
    • Value_Read : là giá trị đọc ra từ command read, giá trị này có 16 bit.
    • 1.2 là hệ số mặc định trong datasheet.
    • Mode: với H-resolution Mode2 thì Mode = 0.5 còn H-resolution Mode thì Mode = 1.
  3. Code với MX cube.
  4. Lưu đồ giải thuật:

    Call function reset -> Set sensitive with default value(MTreg) -> Set mode sensor -> read and process data.

    Sơ đồ kết nối.

    1. Cấu hình dung Mx Cube:
      • Cấu hình xung clock:
      • Cấu hình chân debug.
      • Cấu hình I2C.
      • Cấu hình clock hệ thống.
      • Cấu hình và generate code.
    2. Modify code generate:
      • Copy file thư viện là bh1750.h và main.h từ thư mục download vào project mà các bạn vừa generate ra, tương tự với file bh1750.c và main.c. Link download mình sẽ để ở dưới.
      • Thêm file thư viện bh1750.c trước khi build.
      • Build code.
      • Download Firmware.
      • Debug to view change.
    3. Note:
      • Để debug, các bạn cần có mạnh nạp có chức năng debug và đã được cài driver để máy tính nhận được mạch nạp này.
      • Ở trên mình sử dụng MCU là STM32F103C8T6, khi sử dụng các loại MCU khác thì cần chú ý các define, import, các chân chức năng…
      • Chú ý chọn reset and run trong chế độ config mạch nạp + chọn đúng loại mạch nạp.
      • Ở đây mình chỉ hướng dẫn cách lấy data, tùy vào ứng dụng khác nhau mà các bạn có thể sử dụng linh hoạt.
      • Source code gốc mình lấy từ github và có chỉnh sửa. Link source code gốc : https://github.com/lamik/Light_Sensors_STM32.
      • Ở đây mình chỉ hướng dẫn một số bước để lấy thư viện và thực thi code, để hiểu rõ hơn về cảm biến và cách thức xử lí các bạn cần đọc hiểu datasheet đồng đời debug thêm trong code, chúc các bạn thành công. Nếu có thắc mắc gì các bạn cứ để comment mình sẽ trả lời nhanh nhất trong thời gian có thể.
  5. Một số link tham khảo.
    1. Một số link mua hàng các bạn có thể tham khảo.
    2. Link 1 Link 2 Link 3 Link 4
    3. Link download tài liệu.
    4. Link datasheet Link manual Link thư viện cảm biến