From c4ec2b64cd58ca986a3cd56fe10634175f02f899 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sat, 27 Jun 2026 00:39:04 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B2=D0=B0=D1=8F=20=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 232 +++++++++---------------------------- docs/DS_BMP180.md | 81 +++++++++++++ docs/DS_Button.md | 84 ++++++++++++++ docs/DS_Encoder.md | 98 ++++++++++++++++ docs/DS_I2CScanner.md | 41 +++++++ docs/DS_ILI9341.md | 74 ++++++++++++ docs/DS_INA226.md | 69 +++++++++++ docs/DS_MAX7219.md | 72 ++++++++++++ docs/DS_TMP112.md | 85 ++++++++++++++ docs/DS_UpdateCMakeList.md | 76 ++++++++++++ docs/DS_VirtualComPort.md | 110 ++++++++++++++++++ docs/DS_W25X40CL.md | 109 +++++++++++++++++ 12 files changed, 951 insertions(+), 180 deletions(-) create mode 100644 docs/DS_BMP180.md create mode 100644 docs/DS_Button.md create mode 100644 docs/DS_Encoder.md create mode 100644 docs/DS_I2CScanner.md create mode 100644 docs/DS_ILI9341.md create mode 100644 docs/DS_INA226.md create mode 100644 docs/DS_MAX7219.md create mode 100644 docs/DS_TMP112.md create mode 100644 docs/DS_UpdateCMakeList.md create mode 100644 docs/DS_VirtualComPort.md create mode 100644 docs/DS_W25X40CL.md diff --git a/README.md b/README.md index 466cf87..29fd3d6 100644 --- a/README.md +++ b/README.md @@ -1,204 +1,76 @@ -### πŸ“š ЦСнтрализованная Π±Π°Π·Π° Π·Π½Π°Π½ΠΈΠΉ DS\_Library +# πŸ“š ЦСнтрализованная Π±Π°Π·Π° Π·Π½Π°Π½ΠΈΠΉ DS_Library -Π”ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ Π² Π΅Π΄ΠΈΠ½Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΌ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°ΠΌ, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°ΠΌ для ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² (STM32). +Π•Π΄ΠΈΠ½Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΌ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°ΠΌ, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°ΠΌ для STM32. -> **Навигация:** Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ, Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Π΅Π³ΠΎ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… Π½ΠΈΠΆΠ΅. Бсылка Π½Π° Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ с исходным ΠΊΠΎΠ΄ΠΎΠΌ находится Π² ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅. +> **Навигация:** Бсылки Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ Π²Π΅Π΄ΡƒΡ‚ Π½Π° Ρ„Π°ΠΉΠ»Ρ‹ Π² ΠΏΠ°ΠΏΠΊΠ΅ `docs/`, Π° ссылки Π² ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅ β€” Π½Π° Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ https://git.domstudent.ru/Library. -* * * +## πŸ“¦ Как ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΊ своим ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌ -### πŸ“Ί ДисплСи ΠΈ Π“Ρ€Π°Ρ„ΠΈΠΊΠ° (Displays) +ВсС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ нСзависимыС Git-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ любой Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ Π² свой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΠΎΠ΄ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ **Git Submodules**: -Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с TFT ΠΈ LCD ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π²Ρ‹Π²ΠΎΠ΄ Π³Π΅ΠΎΠΌΠ΅Ρ‚Ρ€ΠΈΠΈ, тСкста ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. +```bash +# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ добавлСния Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ° Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ TMP112 +git submodule add https://git.domstudent.ru/Library/DS_TMP112 Library/DS_TMP112 -ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ +# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ добавлСния дисплСя ST7789V +git submodule add https://domstudent.ru Library/DS_ST7789V +``` -ОписаниС +ПослС добавлСния подмодуля запуститС скрипт ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ `DS_UpdateCMakeList`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ автоматичСски прописал Π½ΠΎΠ²Ρ‹Π΅ ΠΏΠ°ΠΏΠΊΠΈ `Inc` ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ `Src` Π² ваш Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ `CMakeLists.txt`. -ДокумСнтация +--- -Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ +## πŸ“Ί ДисплСи ΠΈ Π“Ρ€Π°Ρ„ΠΈΠΊΠ° (Displays) -**DS\_ST7789V** +| ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ | ДокумСнтация | Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ | +| :--- | :--- | :--- | +| **DS_ST7789V** | [Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ](./docs/DS_ST7789V.md) | [Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ](https://git.domstudent.ru/Library/DS_ST7789V) | +| **DS_ILI9341** | [Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ](./docs/DS_ILI9341.md) | [Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ](https://git.domstudent.ru/Library/DS_ILI9341) | +| **DS_MAX7219** | [Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ](./docs/DS_MAX7219.md) | [Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ](https://git.domstudent.ru/Library/DS_MAX7219) | -TFT дисплСй 240x320 (SPI / DMA) +--- -\[Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ\] +## 🌑 Π”Π°Ρ‚Ρ‡ΠΈΠΊΠΈ (Sensors) -Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ +| ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ | ДокумСнтация | Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ | +| :--- | :--- | :--- | +| **DS_TMP112** | [Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ](./docs/DS_TMP112.md) | [Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ](https://git.domstudent.ru/Library/DS_TMP112) | +| **DS_BMP180** | [Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ](./docs/DS_BMP180.md) | [Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ](https://git.domstudent.ru/Library/DS_BMP180) | +| **DS_INA226** | [Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ](./docs/DS_INA226.md) | [Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ](https://git.domstudent.ru/Library/DS_INA226) | -**DS\_ILI9341** +--- -TFT дисплСй 240x320 (SPI) +## πŸ’Ύ ΠŸΠ°ΠΌΡΡ‚ΡŒ ΠΈ Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ -\[Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ\] +| ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ | ДокумСнтация | Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ | +| :--- | :--- | :--- | +| **DS_SN65HVD230**| [Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ](./docs/DS_SN65HVD230.md) | [Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ](https://git.domstudent.ru/Library/DS_SN65HVD230) | +| **DS_W25X40CL** | [Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ](./docs/DS_W25X40CL.md) | [Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ](https://git.domstudent.ru/Library/DS_W25X40CL) | +| **DS_VirtualComPort**| [Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ](./docs/DS_VirtualComPort.md) | [Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ](https://git.domstudent.ru/Library/DS_VirtualComPort) | -Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ +--- -**DS\_MAX7219** +## πŸ•Ή Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ (HMI) -Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½Ρ‹Ρ… свСтодиодных дисплССв / сСмисСгмСнтных ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² (SPI) +| ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ | ДокумСнтация | Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ | +| :--- | :--- | :--- | +| **DS_Button** | [Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ](./docs/DS_Button.md) | [Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ](https://git.domstudent.ru/Library/DS_Button) | +| **DS_Encoder** | [Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ](./docs/DS_Encoder.md) | [Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ](https://git.domstudent.ru/Library/DS_Encoder) | -\[Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ\] +--- -Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ +## πŸ›  Π£Ρ‚ΠΈΠ»ΠΈΡ‚Ρ‹ -* * * +| ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ | ДокумСнтация | Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ | +| :--- | :--- | :--- | +| **DS_I2CScanner** | [Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ](./docs/DS_I2CScanner.md) | [Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ](https://git.domstudent.ru/Library/DS_I2CScanner) | +| **DS_UpdateCMakeList**| [Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ](./docs/DS_UpdateCMakeList.md) | [Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ](https://git.domstudent.ru/Library/DS_UpdateCMakeList) | -### 🌑 Π”Π°Ρ‚Ρ‡ΠΈΠΊΠΈ ΠΈ Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΡ (Sensors & Power) - -Π”Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹ Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Ρ… Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅ΠΉ срСды, Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ ΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° питания. - -ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ - -Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ - -ОписаниС - -ДокумСнтация - -Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ - -**DS\_TMP112** - -I2C - -Высокоточный Π΄Π°Ρ‚Ρ‡ΠΈΠΊ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ - -\[Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ\] - -Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ - -**DS\_BMP180** - -I2C - -Π”Π°Ρ‚Ρ‡ΠΈΠΊ атмосфСрного давлСния ΠΈ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ - -\[Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ\] - -Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ - -**DS\_INA226** - -I2C - -ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ Ρ‚ΠΎΠΊΠ°, напряТСния ΠΈ мощности (Bi-directional Current/Power Monitor) - -\[Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ\] - -Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ - -* * * - -### πŸ’Ύ ΠŸΠ°ΠΌΡΡ‚ΡŒ ΠΈ Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ (Memory & Communication) - -Π”Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹ Π²Π½Π΅ΡˆΠ½ΠΈΡ… микросхСм памяти ΠΈ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½Ρ‹Ρ… интСрфСйсов связи. - -ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ - -Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ - -ОписаниС - -ДокумСнтация - -Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ - -**DS\_SN65HVD230** - -FDCAN / CAN - -ВрансивСр физичСского уровня CAN-ΡˆΠΈΠ½Ρ‹ для STM32G0 - -\[Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ\] - -Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ - -**DS\_W25X40CL** - -SPI - -Π’Π½Π΅ΡˆΠ½ΡΡ Flash-ΠΏΠ°ΠΌΡΡ‚ΡŒ (NOR Flash, 4 ΠœΠ±ΠΈΡ‚ / 512 ΠšΠ‘) - -\[Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ\] - -Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ - -**DS\_VirtualComPort** - -USB - -РСализация Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ COM-ΠΏΠΎΡ€Ρ‚Π° (VCP) - -\[Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ\] - -Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ - -* * * - -### πŸ•Ή Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ управлСния (Human-Machine Interface) - -Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° (ΠΊΠ½ΠΎΠΏΠΊΠΈ, ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΠΈ, энкодСры). - -ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ - -ОписаниС - -ДокумСнтация - -Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ - -**DS\_Button** - -ΠžΠΏΡ€ΠΎΡ ΠΊΠ½ΠΎΠΏΠΎΠΊ: Π°Π½Ρ‚ΠΈΠ΄Ρ€Π΅Π±Π΅Π·Π³, фиксация ΠΊΠ»ΠΈΠΊΠΎΠ², Π΄Π»ΠΈΠ½Π½Ρ‹Ρ… ΠΈ Π΄Π²ΠΎΠΉΠ½Ρ‹Ρ… Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ - -\[Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ\] - -Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ - -**DS\_Encoder** - -ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ энкодСра (ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ направлСния, шагов) - -\[Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ\] - -Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ - -* * * - -### πŸ›  Π£Ρ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΈ Π‘ΠΊΡ€ΠΈΠΏΡ‚Ρ‹ (Tools & Utilities) - -Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ПО, автоматизация сборки ΠΈ систСмныС инструмСнты. - -ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ - -Π’ΠΈΠΏ / Π―Π·Ρ‹ΠΊ - -ОписаниС - -ДокумСнтация - -Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ - -**DS\_I2CScanner** - -C (STM32) - -Π‘ΠΊΠ°Π½Π΅Ρ€ ΡˆΠΈΠ½Ρ‹ I2C для автоматичСского опрСдСлСния адрСсов ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… устройств - -\[Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ\] - -Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ - -**DS\_UpdateCMakeList** - -PowerShell / Python - -Π‘ΠΊΡ€ΠΈΠΏΡ‚ автоматичСского обновлСния ΠΏΡƒΡ‚Π΅ΠΉ ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ исходного ΠΊΠΎΠ΄Π° Π² `CMakeLists.txt` - -\[Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ\] - -Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ - -* * * +--- +## πŸ“ Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° +```text +DS_Library_Docs/ +β”œβ”€β”€ README.md +└── docs/ # Π€Π°ΠΉΠ»Ρ‹ тСхничСского описания +``` diff --git a/docs/DS_BMP180.md b/docs/DS_BMP180.md new file mode 100644 index 0000000..e38e768 --- /dev/null +++ b/docs/DS_BMP180.md @@ -0,0 +1,81 @@ +# Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ° давлСния ΠΈ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ DS_BMP180 + +Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ Π½Π° Π‘ΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹ΠΌ баромСтричСским Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠΌ **BMP180** (Π° Ρ‚Π°ΠΊΠΆΠ΅ совмСстимым BMP085) ΠΏΠΎ интСрфСйсу I2C. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° обСспСчиваСт Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ заводских ΠΊΠ°Π»ΠΈΠ±Ρ€ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… коэффициСнтов ΠΈΠ· EEPROM Ρ‡ΠΈΠΏΠ° ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠ°Ρ†ΠΈΡŽ нСлинСйности ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈΠΉ. + +## πŸ“Œ ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ +* **Полная аппаратная компСнсация**: Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ содСрТит Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ структуру `Calibration` для хранСния 11 ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… заводских коэффициСнтов (`AC1`–`MD`) ΠΈ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΊΡ‚ΠΎΡ€Π° `B5`. +* **ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Oversampling (OSS)**: Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€Π° точности измСрСния давлСния ΠΎΡ‚ экономичного (0) Π΄ΠΎ свСрхвысокого Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ (3) Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ конфигурирования. +* **ЦСлочислСнная ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ°**: ВсС Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρ‹ вычислСния ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΏΠΎΠ΄ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ сдвиги ΠΈ цСлочислСнныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… `long`/`uint32_t`, Ρ‡Ρ‚ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π½Π° Π±Π»ΠΎΠΊ ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ (FPU) ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°. + +--- + +## πŸ”Œ Π‘Ρ…Π΅ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (I2C) + +АдрСс устройства Π½Π° шинС I2C фиксирован Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎ ΠΈ Ρ€Π°Π²Π΅Π½ `0x77` (Π² функциях HAL адрСс Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ со сдвигом: `0x77 << 1`). + +| Π’Ρ‹Π²ΠΎΠ΄ Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ° BMP180 | Π’Ρ‹Π²ΠΎΠ΄ STM32 | НазначСниС | +| :--- | :--- | :--- | +| **VCC** | 3.3V / 5V | ΠŸΠΈΡ‚Π°Π½ΠΈΠ΅ модуля (зависит ΠΎΡ‚ наличия стабилизатора Π½Π° ΠΏΠ»Π°Ρ‚Π΅) | +| **GND** | GND | ΠžΠ±Ρ‰Π°Ρ зСмля | +| **SCL** | I2Cx_SCL | Вактовая линия ΡˆΠΈΠ½Ρ‹ I2C | +| **SDA** | I2Cx_SDA | Линия Π΄Π°Π½Π½Ρ‹Ρ… ΡˆΠΈΠ½Ρ‹ I2C | + +--- + +## πŸ’» ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Π² `main.c` + +Π”Π°Ρ‚Ρ‡ΠΈΠΊ являСтся асинхронным: сначала подаСтся ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π° запуск прСобразования, Π·Π°Ρ‚Π΅ΠΌ выдСрТиваСтся ΠΏΠ°ΡƒΠ·Π° Π½Π° Π·Π°ΠΌΠ΅Ρ€, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС этого считываСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. + +```c +#include "DS_BMP180.h" + +extern I2C_HandleTypeDef hi2c1; +DS_BMP180 barometer; + +int main(void) { + // ... АвтоматичСская инициализация HAL, GPIO, I2C ... + + /* 1. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚ΠΊΠ° ΠΊΠ°Π»ΠΈΠ±Ρ€ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… коэффициСнтов */ + // ΠŸΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ сдвинутый адрСс: 0x77 << 1 = 0xEE + DS_BMP180_Init(&barometer, &hi2c1, 0xEE); + + while (1) { + /* 2. Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π’Π•ΠœΠŸΠ•Π ΠΠ’Π£Π Π« */ + DS_BMP180_StartConversionTemperature(&barometer); + HAL_Delay(5); // ΠŸΠ°ΡƒΠ·Π° Π½Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ ΠΏΠΎ Π΄Π°Ρ‚Π°ΡˆΠΈΡ‚Ρƒ (min 4.5 мс) + long raw_temp = DS_BMP180_GetTemperature(&barometer); + float real_temp = raw_temp / 10.0f; // Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ возвращаСтся Π² дСсятых долях градуса + + /* 3. Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π”ΠΠ’Π›Π•ΠΠ˜Π― */ + // Запуск Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΡƒΠ»ΡŒΡ‚Ρ€Π°Π²Ρ‹ΡΠΎΠΊΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ OSS = 3 + DS_BMP180_StartConversionPressure(&barometer, 3); + HAL_Delay(26); // ΠŸΠ°ΡƒΠ·Π° для Ρ€Π΅ΠΆΠΈΠΌΠ° OSS=3 (min 25.5 мс) + long pressure_pa = DS_BMP180_GetPressure(&barometer); // Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² ΠŸΠ°ΡΠΊΠ°Π»ΡΡ… (Па) + float pressure_mmhg = pressure_pa / 133.3224f; // ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π² ΠΌΠΌ Ρ€Ρ‚ΡƒΡ‚Π½ΠΎΠ³ΠΎ столба + + // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ real_temp ΠΈ pressure_mmhg Π³ΠΎΡ‚ΠΎΠ²Ρ‹ для Π²Ρ‹Π²ΠΎΠ΄Π° + HAL_Delay(1000); + } +} +``` + +--- + +## πŸ“‹ Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ API Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ + +### `void DS_BMP180_Init(DS_BMP180 *DS_BMP180, I2C_HandleTypeDef *hi2c, uint8_t address)` +ВыполняСт ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ привязку дСскриптора ΠΊ шинС I2C ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ массив ΠΈΠ· 22 Π±Π°ΠΉΡ‚ ΠΈΠ· рСгистра `0xAA` для заполнСния Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΊΠ°Π»ΠΈΠ±Ρ€ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… констант. + +### `void DS_BMP180_StartConversionTemperature(DS_BMP180 *DS_BMP180)` +ЗаписываСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ `0x2E` Π² ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ рСгистр `0xF4`, запуская Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Π°Π½Π°Π»ΠΎΠ³ΠΎ-Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ Π·Π°ΠΌΠ΅Ρ€ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹. + +### `long DS_BMP180_GetTemperature(DS_BMP180 *DS_BMP180)` +Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ рСгистры Π΄Π°Π½Π½Ρ‹Ρ… `0xF6`-`0xF7`, рассчитываСт ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΊΡ‚ΠΎΡ€ компСнсации `B5` ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρƒ. +* **Π’Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅**: Π¦Π΅Π»ΠΎΠ΅ число (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `245` соотвСтствуСт Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π΅ `24.5 Β°C`). + +### `void DS_BMP180_StartConversionPressure(DS_BMP180 *DS_BMP180, uint8_t OversamplingRatio)` +ЗапускаСт Π·Π°ΠΌΠ΅Ρ€ давлСния с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ коэффициСнтом аппроксимации `OversamplingRatio` (значСния ΠΎΡ‚ `0` Π΄ΠΎ `3`). + +### `long DS_BMP180_GetPressure(DS_BMP180 *DS_BMP180)` +Π’Ρ‹Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ 3 Π±Π°ΠΉΡ‚Π° сырых Π΄Π°Π½Π½Ρ‹Ρ… давлСния, выполняСт ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠ°Ρ†ΠΈΡŽ нСлинСйности ΠΏΠΎ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π°ΠΌ Bosch с использованиСм Ρ€Π°Π½Π΅Π΅ рассчитанного Ρ„Π°ΠΊΡ‚ΠΎΡ€Π° `B5`. +* **Π’Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅**: Π”Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² ΠŸΠ°ΡΠΊΠ°Π»ΡΡ… (`Pa`). diff --git a/docs/DS_Button.md b/docs/DS_Button.md new file mode 100644 index 0000000..e7e7fe1 --- /dev/null +++ b/docs/DS_Button.md @@ -0,0 +1,84 @@ +# Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ Ρ‚Π°ΠΊΡ‚ΠΎΠ²Ρ‹Ρ… ΠΊΠ½ΠΎΠΏΠΎΠΊ DS_Button + +ЛСгковСсная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π° Π‘ΠΈ для ΠΎΡ†ΠΈΡ„Ρ€ΠΎΠ²ΠΊΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° Ρ‡Π΅Ρ€Π΅Π· Ρ‚Π°ΠΊΡ‚ΠΎΠ²Ρ‹Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ. Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ **Π½Π°ΠΊΠΎΠΏΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π°Π½Ρ‚ΠΈΠ΄Ρ€Π΅Π±Π΅Π·Π³Π°**, Ρ‡Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π·Π°Ρ‰ΠΈΡ‚Ρƒ ΠΎΡ‚ Π»ΠΎΠΆΠ½Ρ‹Ρ… срабатываний ΠΈ Π΄Ρ€Π΅Π±Π΅Π·Π³Π° ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ΠΎΠ² Π±Π΅Π· использования Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ Ρ‚ΠΈΠΏΠ° `HAL_Delay`. + +## πŸ“Œ ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ +* **Π˜Π½Ρ‚Π΅Π³Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ Π°Π½Ρ‚ΠΈΠ΄Ρ€Π΅Π±Π΅Π·Π³Π°**: БостояниС ΠΊΠ½ΠΎΠΏΠΊΠΈ опрСдСляСтся ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ «кондСнсатора» (счСтчик `Storage` ΠΎΡ‚ 0 Π΄ΠΎ 10). ИзмСнСниС состояния фиксируСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС сСрии ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… Ρ‡Ρ‚Π΅Π½ΠΈΠΉ ΠΏΠΈΠ½Π°. +* **Π’Ρ€ΠΈ уровня фиксации Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ**: ВстроСнная ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠΊΠ°, Π΄Π»ΠΈΠ½Π½ΠΎΠ³ΠΎ удСрТания (**>1000 мс**) ΠΈ свСрхдлинного удСрТания (**>5000 мс**). +* **Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠΉΠ½Ρ‹Π΅ Ρ„Ρ€ΠΎΠ½Ρ‚Ρ‹ (Edges)**: Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ `RisingEdge` ΠΈ `FallingEdge` Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΊΠ°ΠΊ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Ρ‹ β€” ΠΎΠ½ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ истину строго ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ наТатия ΠΈΠ»ΠΈ отпускания ΠΊΠ½ΠΎΠΏΠΊΠΈ, автоматичСски сбрасывая свой Ρ„Π»Π°Π³. + +--- + +## πŸ”Œ ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΈ Π² STM32CubeMX + +Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ, Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‰ΠΈΠΌΠΈΡΡ Π½Π° высокий ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ (**VCC**). + +1. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΠΈΠ½ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° ΠΈ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄ΠΈΡ‚Π΅ Π΅Π³ΠΎ Π² Ρ€Π΅ΠΆΠΈΠΌ `GPIO_Input`. +2. Π’ ΠΎΠΊΠ½Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΠΈΠ½Π° Π² ΠΏΠΎΠ»Π΅ **Pull-up/Pull-down** ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ **Pull-down** (внутрСнняя подтяТка ΠΊ Π·Π΅ΠΌΠ»Π΅). +3. Π€ΠΈΠ·ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ Π½Π° ΠΏΠ»Π°Ρ‚Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΠΉΡ‚Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΌ ΠΏΠΈΠ½ΠΎΠΌ STM32 ΠΈ шиной питания **3.3V**. + +--- + +## πŸ’» ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Π² `main.c` + +Для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° функция обновлСния Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ цикличСски с фиксированным ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΎΠΌ (рСкомСндуСтся **10 мс**). + +```c +#include "DS_Button.h" + +DS_Button user_button; + +int main(void) { + // ... АвтоматичСская инициализация HAL, GPIO ... + + /* 1. ΠŸΠ΅Ρ€Π²ΠΈΡ‡Π½Π°Ρ привязка Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΠΈΠ½Π° ΠΊ структурС */ + DS_ButtonInit(&user_button, GPIOA, GPIO_PIN_0); + + while (1) { + /* 2. ΠžΠΏΡ€ΠΎΡ состояния ΠΊΠ½ΠΎΠΏΠΊΠΈ. ВстроСнный Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ + выполняСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 10 мс Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ */ + DS_ButtonUpdate(&user_button); + + /* 3. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ„Ρ€ΠΎΠ½Ρ‚ΠΎΠ² (вызываСтся строго ΠžΠ”Π˜Π Ρ€Π°Π· Π·Π° Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅/отпусканиС) */ + if (DS_ButtonRisingEdge(&user_button)) { + // ΠšΠ½ΠΎΠΏΠΊΡƒ физичСски Π½Π°ΠΆΠ°Π»ΠΈ (ΠΌΠΎΠΌΠ΅Π½Ρ‚ замыкания ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ΠΎΠ²) + } + + if (DS_ButtonFalingEdge(&user_button)) { + // ΠšΠ½ΠΎΠΏΠΊΡƒ физичСски отпустили (ΠΌΠΎΠΌΠ΅Π½Ρ‚ размыкания ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ΠΎΠ²) + } + + /* 4. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΡƒΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠΉ */ + if (DS_ButtonPressedLong(&user_button)) { + // ΠšΠ½ΠΎΠΏΠΊΡƒ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ большС 1 сСкунды. + // Ѐункция Π²Π΅Ρ€Π½Π΅Ρ‚ true, сбросит Ρ„Π»Π°Π³ ΠΈ сгСнСрируСт ΠΏΠΎΠ²Ρ‚ΠΎΡ€ Ρ‡Π΅Ρ€Π΅Π· 500 мс + } + + if (DS_ButtonPressedLongLong(&user_button)) { + // ΠšΠ½ΠΎΠΏΠΊΡƒ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ большС 5 сСкунд. + } + + // НСбольшая Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° основного Ρ†ΠΈΠΊΠ»Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Update Ρ€Π°Π±ΠΎΡ‚Π°Π» ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ + HAL_Delay(10); + } +} +``` + +--- + +## πŸ“‹ Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ API Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ + +### `void DS_ButtonInit(DS_Button* Button, GPIO_TypeDef *Port, uint16_t Pin)` +БбрасываСт всС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹, устанавливаСт Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ заряд ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ‚ΠΎΡ€Π° `Storage` Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `5` ΠΈ привязываСт GPIO ΠΏΠΎΡ€Ρ‚ ΠΈ ΠΏΠΈΠ½. + +### `void DS_ButtonUpdate(DS_Button *Button)` +ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Ρ€Π΅Π±Π΅Π·Π³Π° ΠΈ ΡƒΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠΉ. ΠžΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ физичСский ΠΏΠΈΠ½. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ отсСчку Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ `if ((CurrentTick - Button->PrevTick) < 10) return;`, благодаря Ρ‡Π΅ΠΌΡƒ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ с любой частотой Ρ‡Π°Ρ‰Π΅ 10 мс. + +### `bool DS_ButtonPressed(DS_Button *Button)` +Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ состояниС ΠΊΠ½ΠΎΠΏΠΊΠΈ. `true` β€” ΠΊΠ½ΠΎΠΏΠΊΠ° Π·Π°ΠΆΠ°Ρ‚Π° Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. + +### `bool DS_ButtonRisingEdge(DS_Button *Button)` / `bool DS_ButtonFalingEdge(DS_Button *Button)` +Π€ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚ наТатия ΠΈΠ»ΠΈ отпускания ΠΊΠ½ΠΎΠΏΠΊΠΈ соотвСтствСнно. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ `true` ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π·Π° событиС. + +### `bool DS_ButtonPressedLong(DS_Button *Button)` / `bool DS_ButtonPressedLongLong(DS_Button *Button)` +Π€ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ ΡƒΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ клавиши Π½Π° 1 ΠΈ 5 сСкунд соотвСтствСнно. АвтоматичСски ΡΠ΄Π²ΠΈΠ³Π°ΡŽΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ Π²ΠΏΠ΅Ρ€Π΅Π΄ Π½Π° 500 мс для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π°Π²Ρ‚ΠΎΠΏΠΎΠ²Ρ‚ΠΎΡ€Π° события ΠΏΡ€ΠΈ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠΌ ΡƒΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠΈ. diff --git a/docs/DS_Encoder.md b/docs/DS_Encoder.md new file mode 100644 index 0000000..3cd8d58 --- /dev/null +++ b/docs/DS_Encoder.md @@ -0,0 +1,98 @@ +# Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ энкодСра DS_Encoder + +Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ для подсчСта шагов ΠΈ опрСдСлСния направлСния вращСния ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ энкодСра (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, популярного EC11). ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Π²Π° нСзависимых Ρ€Π΅ΠΆΠΈΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹: **Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΉ** (Ρ‡Π΅Ρ€Π΅Π· Encoder Mode Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° STM32) ΠΈ **ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ** (Ρ‡Π΅Ρ€Π΅Π· Ρ€ΡƒΡ‡Π½ΠΎΠΉ опрос ΠΏΠΈΠ½ΠΎΠ² GPIO). + +## πŸ“Œ ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ +* **Двойная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°**: Π²Ρ‹Π±ΠΎΡ€ ΠΌΠ΅ΠΆΠ΄Ρƒ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΌ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠΌ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ сканированиСм ΠΏΠΈΠ½ΠΎΠ² Π½Π° Π»Π΅Ρ‚Ρƒ. +* **АппаратноС ΠΏΠΎΠ΄Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Ρ€Π΅Π±Π΅Π·Π³Π°**: ΠΏΡ€ΠΈ использовании Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ΡΡ встроСнныС Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ STM32. +* **ΠšΠ²Π°Π½Ρ‚ΠΎΠ²Π°Π½ΠΈΠ΅ шага**: Π² Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΡƒΡ‡Ρ‚Π΅Π½Π° спСцифика энкодСров EC11 β€” счСтчик автоматичСски дСлится Π½Π° 4, возвращая Ρ€ΠΎΠ²Π½ΠΎ 1 шаг Π·Π° ΠΎΠ΄ΠΈΠ½ физичСский Ρ‰Π΅Π»Ρ‡ΠΎΠΊ Ρ€ΡƒΡ‡ΠΊΠΈ. + +--- + +## πŸ›  Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 1: Аппаратный Ρ€Π΅ΠΆΠΈΠΌ (Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹ΠΉ) + +Π”Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΡŽ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°. ΠŸΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ Π½Π΅ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ рСсурсы Π½Π° опрос ΠΏΠΈΠ½ΠΎΠ². + +### Настройка Π² STM32CubeMX: +1. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, `TIM1` ΠΈΠ»ΠΈ `TIM2`). +2. Π’ ΠΏΠΎΠ»Π΅ **Combined Channels** установитС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ **Encoder Mode**. +3. Π’ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° (`Parameter Settings`): + * **Encoder Mode**: `Encoder Mode TI1 and TI2` (подсчСт ΠΏΠΎ ΠΎΠ±ΠΎΠΈΠΌ ΠΊΠ°Π½Π°Π»Π°ΠΌ для максимальной точности). + * **Input Filter**: установитС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚ `8` Π΄ΠΎ `15` для Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ подавлСния Π΄Ρ€Π΅Π±Π΅Π·Π³Π° ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ΠΎΠ². +4. НастройтС ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠΈΠ½Ρ‹ `TIMx_CH1` ΠΈ `TIMx_CH2` Π² Ρ€Π΅ΠΆΠΈΠΌ `GPIO_AF`. + +### ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° Π² `main.c`: +```c +#include "Encoder.h" + +extern TIM_HandleTypeDef htim1; +DS_Encoder volume_encoder; + +int main(void) { + // ... Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ HAL, GPIO, TIM ... + + /* Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ энкодСр Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° */ + DS_EncoderInitTim(&volume_encoder, &htim1); + + while (1) { + /* ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ полоТСния с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ опроса */ + int8_t diff = DS_EncoderGetState(&volume_encoder); + + if (diff != 0) { + // Π ΡƒΡ‡ΠΊΡƒ ΠΏΠΎΠ²Π΅Ρ€Π½ΡƒΠ»ΠΈ! diff ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π΅Π½ +1, -1, +2 ΠΈ Ρ‚.Π΄. + // ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: volume += diff; + } + + HAL_Delay(50); // ΠžΠΏΡ€ΠΎΡ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ с любой Ρ€Π΅Π΄ΠΊΠΎΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ + } +} +``` + +--- + +## πŸ•Ή Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 2: ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ (Polling) + +Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Ссли Π½Π° ΠΏΠ»Π°Ρ‚Π΅ Π½Π΅Ρ‚ свободных ΠΊΠ°Π½Π°Π»ΠΎΠ² Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Encoder Mode. Пин 1 ΠΈ Пин 2 Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ `GPIO_Input` с подтяТкой `Pull-up`. + +### ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° Π² `main.c`: +```c +#include "Encoder.h" + +DS_Encoder manual_encoder; + +int main(void) { + // ... Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ... + + /* Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ структуры ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌΠΈ ΠΏΠΈΠ½Π°ΠΌΠΈ */ + DS_EncoderInit(&manual_encoder, GPIOB, GPIO_PIN_4, GPIOB, GPIO_PIN_5); + + while (1) { + /* Π’ΠΠ–ΠΠž: Ѐункция обновлСния состояния Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Ρ‡Π°Ρ‰Π΅ + (Π² основном Ρ†ΠΈΠΊΠ»Π΅ Π±Π΅Π· Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ ΠΈΠ»ΠΈ Π² быстром Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π΅) */ + DS_EncoderUpdate(&manual_encoder); + + /* ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, накопились Π»ΠΈ шаги вращСния */ + int8_t steps = DS_EncoderGetState(&manual_encoder); + if (steps != 0) { + // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π° Ρ€ΡƒΡ‡ΠΊΠΈ + } + } +} +``` + +--- + +## πŸ“‹ Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ API Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ + +### `void DS_EncoderInitTim(DS_Encoder *Encoder, TIM_HandleTypeDef *hTim)` +Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈ запускаСт Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€Π° энкодСра. +* **`hTim`**: Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° структуру Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° HAL (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, `&htim1`). + +### `void DS_EncoderInit(DS_Encoder *Encoder, GPIO_TypeDef *PortEncSignal1, uint16_t PinEncSignal1, GPIO_TypeDef *PortEncSignal2, uint16_t PinEncSignal2)` +ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ структуру для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ отслСТивания ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… GPIO ΠΏΠΎΡ€Ρ‚Π°Ρ… ΠΈ ΠΏΠΈΠ½Π°Ρ…. + +### `void DS_EncoderUpdate(DS_Encoder *Encoder)` +ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ парсинга ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΡƒΡ€Π½ΠΎΠ³ΠΎ сигнала. ΠžΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ физичСскоС состояниС ΠΏΠΈΠ½ΠΎΠ². Π’Ρ€Π΅Π±ΡƒΠ΅Ρ‚ высокой частоты Π²Ρ‹Π·ΠΎΠ²Π°. + +### `int8_t DS_EncoderGetState(DS_Encoder *Encoder)` +Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ полоТСния энкодСра (количСство шагов) с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° послСднСго Π²Ρ‹Π·ΠΎΠ²Π° этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ **автоматичСски обнуляСт** Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Π½Π°ΠΊΠΎΠΏΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ счСтчик. diff --git a/docs/DS_I2CScanner.md b/docs/DS_I2CScanner.md new file mode 100644 index 0000000..090b659 --- /dev/null +++ b/docs/DS_I2CScanner.md @@ -0,0 +1,41 @@ +# ДиагностичСская ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° DS_I2CScanner + +ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для автоматичСского сканирования ΡˆΠΈΠ½Ρ‹ I2C Π½Π° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°Ρ… STM32 (HAL). ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ 7-Π±ΠΈΡ‚Π½Ρ‹Π΅ адрСса всСх физичСски ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΊ шинС Π²Π΅Π΄ΠΎΠΌΡ‹Ρ… устройств (Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠ², дисплССв, памяти) Π±Π΅Π· использования Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ логирования Π²Ρ€ΠΎΠ΄Π΅ `printf`. + +## πŸ“Œ ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹ +Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° ΠΎΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ устройства Π½Π° шинС I2C с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ `HAL_I2C_IsDeviceReady`. Если устройство присутствуСт ΠΏΠΎ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΠΎΠΌΡƒ адрСсу, ΠΎΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ сигнал подтвСрТдСния (ACK). НайдСнныС адрСса заносятся Π² ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ массив. + +## πŸ’» ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Π² `main.c` + +```c +#include "DS_I2CScanner.h" + +extern I2C_HandleTypeDef hi2c1; + +// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π±ΡƒΡ„Π΅Ρ€ для хранСния Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… адрСсов +#define MAX_I2C_DEVICES 10 +uint8_t discovered_addresses[MAX_I2C_DEVICES]; + +int main(void) { + // ... АвтоматичСская инициализация HAL, SystemClock, I2C ... + + /* Запуск сканирования ΡˆΠΈΠ½Ρ‹ I2C1 */ + DS_I2CScan(&hi2c1, discovered_addresses, MAX_I2C_DEVICES); + + /* ПослС выполнСния Π² массивС discovered_addresses Π±ΡƒΠ΄ΡƒΡ‚ Π»Π΅ΠΆΠ°Ρ‚ΡŒ адрСса. + НапримСр, Ссли ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ Π΄Π°Ρ‚Ρ‡ΠΈΠΊ TMP112, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· элСмСнтов Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ 0x48. + ΠšΠΎΠ½Π΅Ρ† списка ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. */ + + while (1) { + // Основной Ρ†ΠΈΠΊΠ» ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ + } +} +``` + +## πŸ“‹ Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ API Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ + +### `void DS_I2CScan(I2C_HandleTypeDef *I2C, uint8_t *Result, uint8_t maxNumResults)` +ВыполняСт ΠΏΠΎΠ»Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° адрСсов Π½Π° Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΉ шинС. +* **`I2C`**: Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° структуру управлСния `I2C_HandleTypeDef` (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, `&hi2c1`). +* **`Result`**: Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив `uint8_t`, ΠΊΡƒΠ΄Π° Π±ΡƒΠ΄ΡƒΡ‚ записаны адрСса Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… устройств. +* **`maxNumResults`**: Π Π°Π·ΠΌΠ΅Ρ€ массива `Result` Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ пСрСполнСния Π±ΡƒΡ„Π΅Ρ€Π°. diff --git a/docs/DS_ILI9341.md b/docs/DS_ILI9341.md new file mode 100644 index 0000000..d4363f8 --- /dev/null +++ b/docs/DS_ILI9341.md @@ -0,0 +1,74 @@ +# Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ дисплСя DS_ILI9341 (ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс 8080) + +Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для управлСния Ρ†Π²Π΅Ρ‚Π½Ρ‹ΠΌΠΈ TFT-дисплСями Π½Π° Π±Π°Π·Π΅ популярного ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° **ILI9341** (Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ 240x320, 16-Π±ΠΈΡ‚Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ RGB565). + +Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ стандартных SPI-Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, Π΄Π°Π½Π½Ρ‹ΠΉ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ **8-Π±ΠΈΡ‚Π½ΡƒΡŽ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΡƒΡŽ ΡˆΠΈΠ½Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… (Intel 8080)**, Ρ‡Ρ‚ΠΎ обСспСчиваСт ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ обновлСния ΠΊΠ°Π΄Ρ€ΠΎΠ² (FPS) Π·Π° счСт ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ†Π΅Π»ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π° Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ‚Π°ΠΊΡ‚ Π»ΠΈΠ½ΠΈΠΈ `WR`. + +## πŸ“Œ ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ +* **ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Π°Ρ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°**: ΠŸΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ шиной Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· нСзависимыС ΠΏΠΈΠ½Ρ‹ `D0`–`D7`. +* **ООП-ΡΡ‚ΠΈΠ»ΡŒ управлСния**: ВсС дСскрипторы ΠΏΠΎΡ€Ρ‚ΠΎΠ² ΠΈ ΠΏΠΈΠ½ΠΎΠ² ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΅Π΄ΠΈΠ½ΠΎΠΉ структуры дисплСя, позволяя Π³ΠΈΠ±ΠΊΠΎ ΠΏΠ΅Ρ€Π΅Π½Π°Π·Π½Π°Ρ‡Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄Ρ‹ Π±Π΅Π· измСнСния ΠΊΠΎΠ΄Π° самой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. +* **Π‘Ρ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ запуск**: ВстроСнная аппаратная Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° `HAL_Delay(500)` ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΡƒΡŽ ΡΡ‚Π°Π±ΠΈΠ»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… Ρ†Π΅ΠΏΠ΅ΠΉ питания ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° дисплСя ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠΎΠ΄Π°Ρ‡Π΅ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄. + +--- + +## πŸ”Œ Π‘Ρ…Π΅ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (8-Π±ΠΈΡ‚Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ) + +Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ **13 свободных GPIO-Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ²** ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° STM32. ВсС ΠΏΠΈΠ½Ρ‹ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² CubeMX ΠΊΠ°ΠΊ `GPIO_Output` (High Speed). + +| Π’Ρ‹Π²ΠΎΠ΄ дисплСя | ОписаниС ΡˆΠΈΠ½Ρ‹ | НазначСниС | +| :--- | :--- | :--- | +| **CS** | Chip Select | Π’Ρ‹Π±ΠΎΡ€ Ρ‡ΠΈΠΏΠ° (Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ Π² 0) | +| **RS / DC** | Register Select | Π’Ρ‹Π±ΠΎΡ€: 0 β€” Команда, 1 β€” Π”Π°Π½Π½Ρ‹Π΅ | +| **WR** | Write Echo | Π‘Ρ‚Ρ€ΠΎΠ± записи Π΄Π°Π½Π½Ρ‹Ρ… (ΠΏΠΎ спаду/ΠΏΠΎΠ΄ΡŠΠ΅ΠΌΡƒ) | +| **RD / RQ** | Read Request | Π‘Ρ‚Ρ€ΠΎΠ± чтСния Π΄Π°Π½Π½Ρ‹Ρ… (Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ) | +| **RST** | Reset | Аппаратный сброс ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° дисплСя | +| **D0 ... D7** | Data Bus 0-7 | 8-битная ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Π°Ρ шина Π΄Π°Π½Π½Ρ‹Ρ… | + +--- + +## πŸ’» ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Π² `main.c` + +Из-Π·Π° ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ интСрфСйса Π²Ρ‹Π·ΠΎΠ² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ явного указания всСх ΠΏΠΎΡ€Ρ‚ΠΎΠ² ΠΈ ΠΏΠΈΠ½ΠΎΠ², Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎΠ΄ ΡˆΠΈΠ½Ρƒ: + +```c +#include "DS_ILI9341.h" + +DS_ILI9341 tft_display; + +int main(void) { + // ... АвтоматичСская инициализация HAL, SystemClock, GPIO ... + + /* ВысокоуровнСвоС связываниС ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ интСрфСйса дисплСя с STM32 */ + DS_ILI9341_Init(&tft_display, + GPIOC, GPIO_PIN_9, // Port & Pin CS + GPIOA, GPIO_PIN_0, // D0 + GPIOA, GPIO_PIN_1, // D1 + GPIOA, GPIO_PIN_2, // D2 + GPIOA, GPIO_PIN_3, // D3 + GPIOA, GPIO_PIN_4, // D4 + GPIOA, GPIO_PIN_5, // D5 + GPIOA, GPIO_PIN_6, // D6 + GPIOA, GPIO_PIN_7, // D7 + GPIOC, GPIO_PIN_10, // RQ (Read) + GPIOC, GPIO_PIN_11, // RS (Command/Data) + GPIOC, GPIO_PIN_12, // RST (Reset) + GPIOC, GPIO_PIN_8 // WR (Write) + ); + + // ПослС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°Π»ΠΈΠ²ΠΊΠΈ ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° тСкста: + // DS_ILI9341_Clear(&tft_display, 0x0000); + + while (1) { + // Основной Ρ†ΠΈΠΊΠ» + } +} +``` + +--- + +## πŸ“‹ Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ API Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ + +### `void DS_ILI9341_Init(DS_ILI9341 *Display, ... 25 ΠΏΠΈΠ½ΠΎΠ² ...)` +ВыполняСт ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ привязку структуры управлСния ΠΊ физичСским Π½ΠΎΠΆΠΊΠ°ΠΌ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° STM32. +* ΠžΡ‡ΠΈΡ‰Π°Π΅Ρ‚ Π»ΠΈΠ½ΠΈΠΈ связи ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ ΡˆΠΈΠ½Ρƒ ΠΊ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. +* Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ ΡΡ‚Π°Ρ€Ρ‚ΠΎΠ²ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ Π½Π° 500 мс для бСзопасного Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ экрана. diff --git a/docs/DS_INA226.md b/docs/DS_INA226.md new file mode 100644 index 0000000..88bd33b --- /dev/null +++ b/docs/DS_INA226.md @@ -0,0 +1,69 @@ +# Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ ΠΏΡ€Π΅Ρ†ΠΈΠ·ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π° питания DS_INA226 + +Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ Π½Π° Π‘ΠΈ для микросхСмы **INA226**, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΉ ΠΏΠΎ интСрфСйсу I2C. Π§ΠΈΠΏ позволяСт с высокой Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ·ΠΌΠ΅Ρ€ΡΡ‚ΡŒ ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ напряТСния Π½Π° Ρ‚ΠΎΠΊΠΎΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΡˆΡƒΠ½Ρ‚Π΅, напряТСниС Π½Π° шинС питания (Π΄ΠΎ 36Π’), автоматичСски Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‚Π΅ΠΊΠ°ΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΠΊ ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΠ΅ΠΌΡƒΡŽ ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ Π² Π²Π°Ρ‚Ρ‚Π°Ρ…. + +## πŸ“Œ ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ +* **ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ LSB**: ВстроСнный расчСт ΠΊΠ°Π»ΠΈΠ±Ρ€ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ коэффициСнта ΠΏΠΎΠ΄ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΎΠΊ 1 АмпСр ΠΈ сопротивлСниС ΡˆΡƒΠ½Ρ‚Π° 100 мОм. +* **ΠŸΡ€ΡΠΌΠΎΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ физичСских Π²Π΅Π»ΠΈΡ‡ΠΈΠ½**: Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ напряТСниС ΡˆΠΈΠ½Ρ‹ Π² ΠΌΠΈΠ»Π»ΠΈΠ²ΠΎΠ»ΡŒΡ‚Π°Ρ… (`mV`), напряТСниС ΡˆΡƒΠ½Ρ‚Π° Π² ΠΌΠΈΠΊΡ€ΠΎΠ²ΠΎΠ»ΡŒΡ‚Π°Ρ… (`uV`), Π° Ρ‚ΠΎΠΊ ΠΈ ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ (`float`). +* **ΠšΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ памяти**: Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ содСрТит массив `SensorData` для хранСния сырых ΠΎΠ±Ρ€Π°Π·ΠΎΠ² всСх дСвяти Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… 16-Π±ΠΈΡ‚Π½Ρ‹Ρ… рСгистров Ρ‡ΠΈΠΏΠ°. + +--- + +## πŸ”Œ Π‘Ρ…Π΅ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (I2C) + +| Π’Ρ‹Π²ΠΎΠ΄ модуля INA226 | Π’Ρ‹Π²ΠΎΠ΄ STM32 | НазначСниС | +| :--- | :--- | :--- | +| **VCC** | 3.3V | ΠŸΠΈΡ‚Π°Π½ΠΈΠ΅ Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ части | +| **GND** | GND | ΠžΠ±Ρ‰Π°Ρ зСмля | +| **SCL** | TIMx_SCL / I2Cx_SCL | Вактовая линия ΡˆΠΈΠ½Ρ‹ I2C | +| **SDA** | TIMx_SDA / I2Cx_SDA | Линия Π΄Π°Π½Π½Ρ‹Ρ… ΡˆΠΈΠ½Ρ‹ I2C | +| **IN+** | К источнику питания | Π’Ρ…ΠΎΠ΄ контроля Ρ‚ΠΎΠΊΠ° (Π΄ΠΎ ΡˆΡƒΠ½Ρ‚Π°) | +| **IN-** | К Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ | Π’Ρ‹Ρ…ΠΎΠ΄ контроля Ρ‚ΠΎΠΊΠ° (послС ΡˆΡƒΠ½Ρ‚Π°) | + +--- + +## πŸ’» ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Π² `main.c` + +```c +#include "DS_INA226.h" + +extern I2C_HandleTypeDef hi2c1; +DS_INA226 power_monitor; + +int main(void) { + // ... АвтоматичСская инициализация HAL, GPIO, I2C ... + + /* 1. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ INA226. АдрСс ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ 0x40 (зависит ΠΎΡ‚ ΠΏΠΈΠ½ΠΎΠ² A0, A1) */ + DS_INA226_Init(&power_monitor, &hi2c1, 0x40); + + while (1) { + /* 2. Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ */ + uint16_t bus_voltage_mv = DS_INA226_GetBusVoltage(&power_monitor); + float current_amps = DS_INA226_GetCurrent(&power_monitor); + float power_watts = DS_INA226_GetPower(&power_monitor); + + // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° дисплСй ΠΈΠ»ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π² UART/USB + HAL_Delay(250); + } +} +``` + +--- + +## πŸ“‹ Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ API Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ + +### `void DS_INA226_Init(DS_INA226 *DS_INA226, I2C_HandleTypeDef *hi2c, uint8_t DevAddr)` +ВыполняСт ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ привязку ΠΊ шинС I2C, Π²Ρ‹Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ всС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ рСгистры Π² кэш-ΠΏΠ°ΠΌΡΡ‚ΡŒ структуры ΠΈ рассчитываСт ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ ΠΊΠ°Π»ΠΈΠ±Ρ€ΠΎΠ²ΠΊΠΈ `CAL` для рСгистра `05h`. + +### `uint16_t DS_INA226_GetBusVoltage(DS_INA226 *DS_INA226)` +ВыполняСт Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ рСгистра `02h` ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ напряТСниС Π½Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ шинС питания. +* **Π¦Π΅Π½Π° дСлСния (LSB)**: 1.25 ΠΌΠ’. +* **Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅**: НапряТСниС Π² ΠΌΠΈΠ»Π»ΠΈΠ²ΠΎΠ»ΡŒΡ‚Π°Ρ… (`mV`). + +### `float DS_INA226_GetCurrent(DS_INA226 *DS_INA226)` +Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎ рассчитанноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΊΠ° ΠΈΠ· рСгистра `04h`. +* **Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅**: Π’ΠΎΠΊ Π² АмпСрах (`float`). + +### `float DS_INA226_GetPower(DS_INA226 *DS_INA226)` +Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎΠΉ потрСбляСмой мощности ΠΈΠ· рСгистра `03h`. +* **Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅**: ΠœΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ Π² Π’Π°Ρ‚Ρ‚Π°Ρ… (`float`). diff --git a/docs/DS_MAX7219.md b/docs/DS_MAX7219.md new file mode 100644 index 0000000..cf6fb9e --- /dev/null +++ b/docs/DS_MAX7219.md @@ -0,0 +1,72 @@ +# Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ сСмисСгмСнтного ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° DS_MAX7219 + +Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ Π½Π° Π‘ΠΈ для управлСния многоразрядными сСмисСгмСнтными LED-ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ (Π΄ΠΎ 8 разрядов) Π½Π° Π±Π°Π·Π΅ каскадируСмого ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° **MAX7219** Ρ‡Π΅Ρ€Π΅Π· Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΉ интСрфСйс SPI. + +Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎ задСйствуСт встроСнный Π² Ρ‡ΠΈΠΏ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ **Code B**, Ρ‡Ρ‚ΠΎ позволяСт Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ†ΠΈΡ„Ρ€Ρ‹ ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ символы (`-`, `E`, `H`, `L`, `P`) ΠΏΡƒΡ‚Π΅ΠΌ прямой записи Π΄Π°Π½Π½Ρ‹Ρ… Π² рСгистры Π±Π΅Π· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ формирования Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… масок ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сСгмСнта. + +## πŸ“Œ ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ +* **ΠŸΡ€ΡΠΌΠΎΠΉ Π²Ρ‹Π²ΠΎΠ΄ чисСл**: Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ `Print` ΠΈ `PrintFloat` Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎ Ρ€Π°Π·Π±ΠΈΠ²Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π½Π° разряды, экономя ΠΏΠ°ΠΌΡΡ‚ΡŒ Π·Π° счСт ΠΎΡ‚ΠΊΠ°Π·Π° ΠΎΡ‚ тяТСлой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ `sprintf`. +* **Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ**: Битовая маска `Dots` позволяСт динамичСски Π·Π°ΠΆΠΈΠ³Π°Ρ‚ΡŒ дСсятичныС Ρ‚ΠΎΡ‡ΠΊΠΈ Π½Π° любом ΠΈΠ· 8 разрядов. +* **БСзопасныС Π³Ρ€Π°Π½ΠΈΡ†Ρ‹**: ΠŸΡ€ΠΈ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΠΈ максимального Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° отобраТСния (Π±ΠΎΠ»Π΅Π΅ 7 Π·Π½Π°ΠΊΠΎΠ²) Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ автоматичСски Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² Π²ΠΈΠ΄Π΅ заполнСния ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° дСвятками (`99999999`). + +--- + +## πŸ”Œ Π‘Ρ…Π΅ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (SPI) + +| Π’Ρ‹Π²ΠΎΠ΄ модуля MAX7219 | Π’Ρ‹Π²ΠΎΠ΄ STM32 | НазначСниС | +| :--- | :--- | :--- | +| **VCC** | 5V / 3.3V | ΠŸΠΈΡ‚Π°Π½ΠΈΠ΅ модуля (рСкомСндуСтся 5Π’ для яркого свСчСния) | +| **GND** | GND | ΠžΠ±Ρ‰Π°Ρ зСмля | +| **DIN** | SPIx_MOSI | Линия Π΄Π°Π½Π½Ρ‹Ρ… | +| **CLK** | SPIx_SCK | Вактовая линия ΡˆΠΈΠ½Ρ‹ SPI | +| **CS / LOAD** | Π›ΡŽΠ±ΠΎΠΉ GPIO_Output | Π’Ρ‹Π±ΠΎΡ€ Ρ‡ΠΈΠΏΠ° / Π—Π°Ρ‰Π΅Π»ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… | + +--- + +## πŸ’» ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Π² `main.c` + +```c +#include "DS_MAX7219.h" + +extern SPI_HandleTypeDef hspi1; +DS_MAX7219 led_display; + +int main(void) { + // ... АвтоматичСская инициализация HAL, GPIO, SPI ... + + /* 1. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ дисплСя */ + DS_MAX7219_Init(&led_display, &hspi1, GPIOB, GPIO_PIN_6); + + /* 2. Настройка яркости (0x0F - максимум, 0x01 - ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ) */ + DS_MAX7219_ConfigureDisplay(&led_display, 0, 0x08, 7); + + /* 3. Π’Ρ‹Π²ΠΎΠ΄ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа со Π·Π½Π°ΠΊΠΎΠΌ */ + DS_MAX7219_Print(&led_display, -12345); + DS_MAX7219_UpdataDisplay(&led_display); + HAL_Delay(2000); + + /* 4. Π’Ρ‹Π²ΠΎΠ΄ числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ ΠΈ автоматичСской Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠ΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ */ + DS_MAX7219_PrintFloat(&led_display, 36.6f); + DS_MAX7219_UpdataDisplay(&led_display); + + while (1) { + // Основной Ρ†ΠΈΠΊΠ» + } +} +``` + +--- + +## πŸ“‹ Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ API Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ + +### `void DS_MAX7219_Init(DS_MAX7219* Display, SPI_HandleTypeDef* SPI, GPIO_TypeDef* Port_CS, uint16_t Pin_CS)` +ВыполняСт сброс Π±ΡƒΡ„Π΅Ρ€ΠΎΠ², привязываСт SPI интСрфСйс ΠΈ CS ΠΏΠΈΠ½, отправляСт Π±Π°Π·ΠΎΠ²ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ (Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π΅ΠΆΠΈΠΌΠ° Code B дСкодирования, Π»ΠΈΠΌΠΈΡ‚ сканирования 8 Π΄ΠΈΠΎΠ΄ΠΎΠ²) ΠΈ ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ дисплСй. + +### `void DS_MAX7219_Print(DS_MAX7219* Display, int64_t Number)` +Π Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ разряды ΠΈ заполняСт Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ тСкстовый Π±ΡƒΡ„Π΅Ρ€ `DisplayData`. АвтоматичСски ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π·Π½Π°ΠΊ `-`. + +### `void DS_MAX7219_PrintFloat(DS_MAX7219* Display, float Number)` +Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ вСщСствСнныС числа, вычисляя ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой ΠΈ автоматичСски гСнСрируя Π±Π°ΠΉΡ‚ΠΎΠ²ΡƒΡŽ маску для заТигания Ρ‚ΠΎΡ‡ΠΊΠΈ Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ `DS_MAX7219_EnableDots`. + +### `void DS_MAX7219_UpdataDisplay(DS_MAX7219 *Display)` +ЀизичСски ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π° структуры Π² рСгистры Ρ‡ΠΈΠΏΠ° MAX7219 ΠΏΠΎ SPI. diff --git a/docs/DS_TMP112.md b/docs/DS_TMP112.md new file mode 100644 index 0000000..cabb660 --- /dev/null +++ b/docs/DS_TMP112.md @@ -0,0 +1,85 @@ +# Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ высокоточного Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ° Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ DS_TMP112 + +НизкоуровнСвый Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ Π½Π° Π‘ΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΡƒΠ»ΡŒΡ‚Ρ€Π°ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΌ Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹ΠΌ Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠΌ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ **TMP112** (Π° Ρ‚Π°ΠΊΠΆΠ΅ совмСстимыми TMP102 / TMP112A/B) ΠΏΠΎ интСрфСйсу I2C. Π”Π°Ρ‚Ρ‡ΠΈΠΊ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ высокой Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ (Π΄ΠΎ 0.5Β°C) ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² 12-Π±ΠΈΡ‚Π½ΠΎΠΌ ΠΈΠ»ΠΈ 13-Π±ΠΈΡ‚Π½ΠΎΠΌ (Extended) Ρ€Π΅ΠΆΠΈΠΌΠ°Ρ…. + +## πŸ“Œ ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ +* **ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ дСскриптор**: Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ инкапсулируСт ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡˆΠΈΠ½Ρƒ I2C, позволяя ΠΎΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ нСсколько физичСских Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠ² TMP112 Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… адрСсах. +* **ΠŸΡ€ΡΠΌΠ°Ρ ΠΎΡ†ΠΈΡ„Ρ€ΠΎΠ²ΠΊΠ°**: Ѐункция чтСния автоматичСски собираСт Π΄Π²Π° Π±Π°ΠΉΡ‚Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· рСгистра Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ (`0x00`), учитывая Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Big-Endian ΠΈ Π·Π½Π°ΠΊΠΎΠ²Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹ (Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎ Π΄Π²ΡƒΡ…), возвращая Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ΅ вСщСствСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹. +* **МинимальноС энСргопотрСблСниС**: ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ° Π² Ρ€Π΅ΠΆΠΈΠΌ Shutdown Mode для экономии Π±Π°Ρ‚Π°Ρ€Π΅ΠΉΠ½ΠΎΠ³ΠΎ питания ΠΌΠ΅ΠΆΠ΄Ρƒ Π·Π°ΠΌΠ΅Ρ€Π°ΠΌΠΈ. + +--- + +## πŸš€ Бпособ добавлСния Π² ваш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ (Git Submodule) + +Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Git. Π­Ρ‚ΠΎ позволяСт Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Π΅Ρ‘ нСзависимо ΠΎΡ‚ основного ΠΊΠΎΠ΄Π°. + +### 1. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ подмодуля +ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ: +```bash +git submodule add https://git.domstudent.ru/Library/DS_TMP112 Library/DS_TMP112 +``` +*ПослС этого Git создаст Π² ΠΏΠ°ΠΏΠΊΠ΅ `Library/` Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ `DS_TMP112` ΠΈ скачаСт Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°.* + +### 2. АвтоматичСскоС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ сборки CMake +ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² ΠΏΠ°ΠΏΠΊΡƒ с вашими Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°ΠΌΠΈ ΠΈ запуститС PowerShell-скрипт обновлСния (ΠΈΠ· рСпозитория `DS_UpdateCMakeList`): +```powershell +cd tools/ +./UpdateCMakeList.ps1 +``` +Π‘ΠΊΡ€ΠΈΠΏΡ‚ рСкурсивно ΠΎΠ±ΠΎΠΉΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ подмодуля, автоматичСски Π½Π°ΠΉΠ΄Π΅Ρ‚ ΠΏΡƒΡ‚ΠΈ ΠΊ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ `Library/DS_TMP112/Inc` ΠΈ исходному ΠΊΠΎΠ΄Ρƒ `DS_TMP112.c`, интСгрируя ΠΈΡ… Π² ваш `CMakeLists.txt`. + +--- + +## πŸ”Œ Π‘Ρ…Π΅ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (I2C) + +Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ 7-Π±ΠΈΡ‚Π½Ρ‹ΠΉ адрСс Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ° Π½Π° шинС I2C ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π΅Π½ `0x48` (Ссли ΠΏΠΈΠ½ `ADD0` ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΊ GND). Для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ HAL адрСс Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π²Π»Π΅Π²ΠΎ Π½Π° 1 Π±ΠΈΡ‚ (`0x48 << 1 = 0x90`). + +| Π’Ρ‹Π²ΠΎΠ΄ Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ° TMP112 | Π’Ρ‹Π²ΠΎΠ΄ STM32 | НазначСниС | +| :--- | :--- | :--- | +| **V+ / VCC** | 3.3V | ΠŸΠΈΡ‚Π°Π½ΠΈΠ΅ Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ° (1.4V β€” 3.6V) | +| **GND** | GND | ΠžΠ±Ρ‰Π°Ρ зСмля | +| **SCL** | I2Cx_SCL | Вактовая линия ΡˆΠΈΠ½Ρ‹ I2C | +| **SDA** | I2Cx_SDA | Линия Π΄Π°Π½Π½Ρ‹Ρ… ΡˆΠΈΠ½Ρ‹ I2C | +| **ALT** | Π›ΡŽΠ±ΠΎΠΉ GPIO_Input | Π’Ρ‹Ρ…ΠΎΠ΄ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ оповСщСния ALERT (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ) | + +--- + +## πŸ’» ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Π² `main.c` + +```c +#include "DS_TMP112.h" + +extern I2C_HandleTypeDef hi2c1; +DS_TMP112 cabinet_sensor; + +int main(void) { + // ... АвтоматичСская инициализация HAL, GPIO, I2C ... + + /* 1. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ° (адрСс 0x48 сдвигаСм для HAL: 0x90) */ + DS_TMP112_Init(&cabinet_sensor, &hi2c1, 0x90); + + /* 2. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ 12-Π±ΠΈΡ‚Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ°, частота обновлСния 4 Π“Ρ†) */ + DS_TMP112_Configure(&cabinet_sensor); + + while (1) { + /* 3. Π§Ρ‚Π΅Π½ΠΈΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ Π² градусах ЦСльсия */ + float current_temp = DS_TMP112_ReadTemperature(&cabinet_sensor); + + // ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ current_temp Π³ΠΎΡ‚ΠΎΠ²Π° для логирования ΠΈΠ»ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° дисплСй + HAL_Delay(1000); + } +} +``` + +--- + +## πŸ“‹ Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ API Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ + +### `void DS_TMP112_Init(DS_TMP112 *sensor, I2C_HandleTypeDef *hi2c, uint8_t DevAddr)` +ВыполняСт ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ привязку дСскриптора Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ° ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΉ шинС I2C ΠΈ I2C-адрСсу Ρ‡ΠΈΠΏΠ° Π½Π° ΠΏΠ»Π°Ρ‚Π΅. + +### `void DS_TMP112_Configure(DS_TMP112 *sensor)` +ЗаписываСт Π±Π°Π·ΠΎΠ²Ρ‹Π΅ настройки Π² 16-Π±ΠΈΡ‚Π½Ρ‹ΠΉ рСгистр ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ `0x01` (установка шага ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΠΈ, Ρ€Π΅ΠΆΠΈΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ² ΠΊΠΎΠΌΠΏΠ°Ρ€Π°Ρ‚ΠΎΡ€Π°). + +### `float DS_TMP112_ReadTemperature(DS_TMP112 *sensor)` +ВыполняСт Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ рСгистра Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ `0x00`, сдвигаСт 12-Π±ΠΈΡ‚Π½ΠΎΠ΅/13-Π±ΠΈΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, восстанавливаСт матСматичСский Π·Π½Π°ΠΊ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ для ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π²Π΅Π»ΠΈΡ‡ΠΈΠ½ ΠΈ ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅Ρ‚ сыроС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° шаг ΡˆΠΊΠ°Π»Ρ‹ (`0.0625 Β°C`). Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ‚ΠΈΠΏΠ° `float`. diff --git a/docs/DS_UpdateCMakeList.md b/docs/DS_UpdateCMakeList.md new file mode 100644 index 0000000..db2152c --- /dev/null +++ b/docs/DS_UpdateCMakeList.md @@ -0,0 +1,76 @@ +# Π‘ΠΊΡ€ΠΈΠΏΡ‚ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ сборки DS_UpdateCMakeList + +Π‘ΠΊΡ€ΠΈΠΏΡ‚ Π½Π° языкС **PowerShell**, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ добавлСния ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° `Library` Π² систСму сборки **CMake** ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² STM32 (Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· STM32CubeMX). + +Π‘ΠΊΡ€ΠΈΠΏΡ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΏΡƒΡ‚ΠΈ ΠΊ Π½ΠΎΠ²Ρ‹ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹ΠΌ Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ°ΠΌ, дисплСям ΠΈΠ»ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°ΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² `CMakeLists.txt`. + +## πŸ“Œ ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹ + +1. **ΠŸΠ°Ρ€ΡΠΈΠ½Π³ ΠΌΠ΅Ρ‚ΠΎΠΊ**: Π‘ΠΊΡ€ΠΈΠΏΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Π²Π½ΡƒΡ‚Ρ€ΠΈ `cmake/stm32cubemx/CMakeLists.txt` ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ `# Library folder` ΠΈ `# Library folder end`. +2. **ΠžΡ‡ΠΈΡΡ‚ΠΊΠ°**: ВсС строки ΠΌΠ΅ΠΆΠ΄Ρƒ этими ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π°ΠΌΠΈ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ дублирования Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Ρ… запусках. +3. **Π‘ΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΉ**: Π‘ΠΊΡ€ΠΈΠΏΡ‚ рСкурсивно ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠ°ΠΏΠΊΡƒ `Library`: + * Находит всС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ (`*.h`), ΡƒΠ½ΠΈΠΊΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡƒΡ‚ΠΈ ΠΊ ΠΈΡ… ΠΏΠ°ΠΏΠΊΠ°ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ…ΡΡˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ заносит ΠΈΡ… Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ `DS_Include_Dirs`. + * Находит всС Ρ„Π°ΠΉΠ»Ρ‹ исходного ΠΊΠΎΠ΄Π° (`*.c`) ΠΈ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ· Π½ΠΈΡ… список `DS_Application_Src`. +4. **Π—Π°ΠΏΠΈΡΡŒ**: ΠŸΡƒΡ‚ΠΈ автоматичСски ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ ΠΈΠ· Windows-Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° (`\`) Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΏΡƒΡ‚Π΅ΠΉ CMake (`/`), ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊ макросу `\${CMAKE_SOURCE_DIR}` ΠΈ Π΄ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. + +--- + +## πŸ“ ВрСбования ΠΊ структурС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° + +Π‘ΠΊΡ€ΠΈΠΏΡ‚ ТСстко завязан Π½Π° ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ располоТСниС Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ структуру ΠΏΠ°ΠΏΠΎΠΊ Π² вашСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅: + +```text +Имя_ΠŸΡ€ΠΎΠ΅ΠΊΡ‚Π°/ +β”œβ”€β”€ cmake/ +β”‚ └── stm32cubemx/ +β”‚ └── CMakeLists.txt # Π¦Π΅Π»Π΅Π²ΠΎΠΉ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ сборки +β”œβ”€β”€ Library/ # ΠšΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ всСх Π²Π°ΡˆΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ +β”‚ β”œβ”€β”€ DS_ST7789V/ +β”‚ β”œβ”€β”€ DS_I2CScanner/ +β”‚ └── ... +└── tools/ + └── UpdateCMakeList.ps1 # Π”Π°Π½Π½Ρ‹ΠΉ скрипт Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ +``` + +--- + +## πŸ’» Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΈ запуск + +### 1. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° `CMakeLists.txt` +ΠŸΠ΅Ρ€Π΅Π΄ самым ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ запуском скрипта ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π² вашСм Ρ„Π°ΠΉΠ»Π΅ `cmake/stm32cubemx/CMakeLists.txt` ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π½Ρ‹Π΅ строки. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΈΡ… Π² ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°: + +```cmake +# Library folder +# Library folder end +``` + +### 2. Запуск скрипта +Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ скрипт Ρ‡Π΅Ρ€Π΅Π· Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» PowerShell: +```powershell +cd tools/ +./UpdateCMakeList.ps1 +``` + +*ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:* Если опСрационная систСма Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ запуск Π²Π½Π΅ΡˆΠ½ΠΈΡ… скриптов, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π»Π΅Ρ‚ΠΎΠΌ: `Set-ExecutionPolicy RemoteSigned -Scope Process`. + +--- + +## πŸ“‹ Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ скрипта + +ПослС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ выполнСния скрипта ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ Π² Ρ„Π°ΠΉΠ»Π΅ `CMakeLists.txt` автоматичСски заполнится Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ путями: + +```cmake +# Library folder +set(DS_Include_Dirs + \${CMAKE_SOURCE_DIR}/Library/DS_I2CScanner/Inc + \${CMAKE_SOURCE_DIR}/Library/DS_ST7789V/Inc +) +target_include_directories(stm32cubemx INTERFACE \${DS_Include_Dirs}) + +set(DS_Application_Src + \${CMAKE_SOURCE_DIR}/Library/DS_I2CScanner/Src/DS_I2CScanner.c + \${CMAKE_SOURCE_DIR}/Library/DS_ST7789V/Src/DS_ST7789V.c +) +target_sources(\${CMAKE_PROJECT_NAME} PRIVATE \${DS_Application_Src}) +# Library folder end +``` diff --git a/docs/DS_VirtualComPort.md b/docs/DS_VirtualComPort.md new file mode 100644 index 0000000..7316415 --- /dev/null +++ b/docs/DS_VirtualComPort.md @@ -0,0 +1,110 @@ +# ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ USB Virtual COM Port (DS_VirtualComPort) + +Π“ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΊ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π½Π° Π±Π°Π·Π΅ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ стСка **STMicroelectronics USB Device Middleware** (класс CDC β€” Communication Device Class). + +Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½: ΠΈΠ· Π½Π΅Π³ΠΎ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ всС Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ USB-классы (Audio, HID, MSC), Π° Ρ„Π°ΠΉΠ»Ρ‹ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ (`usbd_conf.c/.h`) ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса (`usbd_cdc_if.c/.h`) пСрСнСсСны прямо Π²Π½ΡƒΡ‚Ρ€ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°. Π­Ρ‚ΠΎ позволяСт Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ COM-ΠΏΠΎΡ€Ρ‚ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… с любой Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ (HAL/LL) Π±Π΅Π· CubeMX-Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° самого USB. + +## πŸ“Œ Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° +```text +Library/DS_VirtualComPort/ +β”œβ”€β”€ Class/ +β”‚ └── CDC/ +β”‚ β”œβ”€β”€ Inc/usbd_cdc.h, usbd_cdc_if.h +β”‚ └── Src/usbd_cdc.c, usbd_cdc_if.c # Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ ΠΏΡ€ΠΈΠ΅ΠΌΠ°/ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… +└── Core/ + β”œβ”€β”€ Inc/usbd_core.h, usbd_conf.h ... + └── Src/usbd_core.c, usbd_conf.c # ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ USB-Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° +``` + +--- + +## πŸš€ Бпособ добавлСния Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ (Git Submodule) + +### 1. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ подмодуля +Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°: +```bash +git submodule add https://domstudent.ru Library/DS_VirtualComPort +``` + +### 2. АвтоматичСскоС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ сборки CMake +ЗапуститС PowerShell-скрипт Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ· вашСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ (`DS_UpdateCMakeList`): +```powershell +cd tools/ +./UpdateCMakeList.ps1 +``` +Π‘ΠΊΡ€ΠΈΠΏΡ‚ автоматичСски Π½Π°ΠΉΠ΄Π΅Ρ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ исходный ΠΊΠΎΠ΄ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ `usbd_cdc_if.c` ΠΈ `usbd_conf.c`), послС Ρ‡Π΅Π³ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΏΡ€ΠΎΠΏΠΈΡˆΠ΅Ρ‚ ΠΈΡ… Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ вашСго `CMakeLists.txt`. + +--- + +## πŸ›  Настройка тактирования (Clock Configuration) + +Для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ USB трСбуСтся ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Π°Ρ частота тактирования ΡˆΠΈΠ½Ρ‹ строго **48 MHz**. Π’ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°Ρ… с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Π±Π΅Π·ΠΊΠ²Π°Ρ€Ρ†Π΅Π²ΠΎΠ³ΠΎ USB (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, STM32F042 / STM32G4) это рСализуСтся Ρ‡Π΅Ρ€Π΅Π· Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ осциллятор **HSI48**. + +ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ тактирования Ρ‡Π΅Ρ€Π΅Π· LL-Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹: +```c +void SystemClock_Config(void) +{ + LL_FLASH_SetLatency(LL_FLASH_LATENCY_1); + LL_RCC_HSI48_Enable(); // Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ 48 ΠœΠ“Ρ† + + while(LL_RCC_HSI48_IsReady() != 1) {} // ОТидаСм стабилизации + + LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); + LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); + LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSI48); // НазначаСм систСмным источником + + LL_SetSystemCoreClock(48000000); + LL_RCC_SetUSBClockSource(LL_RCC_USB_CLKSOURCE_HSI48); // НазначаСм источником Ρ‚Π°ΠΊΡ‚ΠΎΠ² USB +} +``` + +--- + +## πŸ’» Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования Π² `main.c` + +ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ конфигурация скрыта Π²Π½ΡƒΡ‚Ρ€ΠΈ подмодуля, запуск USB-стСка Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ ΠΊΠΎΠ΄Π΅ сводится ΠΊ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² сСкции ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΈ. + +```c +#include "usbd_core.h" +#include "usbd_cdc_if.h" + +/* Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ хэндлСры управлСния стСком */ +USBD_HandleTypeDef hUsbDeviceFS; +extern USBD_DescriptorsTypeDef Class_Desc; + +int main(void) +{ + // Π‘ΡƒΡ„Π΅Ρ€ сообщСния (символ ΠΊΠΎΠ½Ρ†Π° строки \n обязатСлСн для Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ²) + uint8_t TxMessageBuffer[] = "MY USB IS WORKING! \r\n"; + + HAL_Init(); + SystemClock_Config(); + + // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π²Π°ΡˆΠΈΡ… Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠ² ΠΈ ΠΏΠΎΡ€Ρ‚ΠΎΠ² Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° (MX_GPIO_Init, MX_TIM2_Init...) + + /* --- Π Π£Π§ΠΠžΠ™ Π—ΠΠŸΠ£Π‘Πš Π‘Π’Π•ΠšΠ USB VCP --- */ + USBD_Init(&hUsbDeviceFS, &Class_Desc, DEVICE_FS); // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ядра USB + USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC); // РСгистрация класса CDC + USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS); // ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ интСрфСйса + USBD_Start(&hUsbDeviceFS); // ЀизичСский старт USB-устройства + + while (1) + { + /* ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ПК */ + // ΠŸΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π±ΡƒΡ„Π΅Ρ€ ΠΈ Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Ρƒ (ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ Π½ΡƒΠ»ΡŒ-Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ‚ΠΎΡ€ строки) + CDC_Transmit_FS(TxMessageBuffer, sizeof(TxMessageBuffer) - 1); + + HAL_Delay(500); // ΠŸΠ΅Ρ€ΠΈΠΎΠ΄ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² + } +} +``` + +--- + +## πŸ“‹ Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ API Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ + +### `uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)` +Основная функция Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ массива Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ПК. +* **`Buf`**: Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив Π±Π°ΠΉΡ‚ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ. +* **`Len`**: Π Π°Π·ΠΌΠ΅Ρ€ отправляСмого ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π΄Π°Π½Π½Ρ‹Ρ… Π² Π±Π°ΠΉΡ‚Π°Ρ…. +* **Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅**: `USBD_OK` (0) ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ постановкС ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ, ΠΈΠ»ΠΈ `USBD_BUSY` (1), Ссли ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ Π΅Ρ‰Π΅ Π½Π΅ успСл ΡƒΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ ΠΏΠΎ шинС. diff --git a/docs/DS_W25X40CL.md b/docs/DS_W25X40CL.md new file mode 100644 index 0000000..73b7d6a --- /dev/null +++ b/docs/DS_W25X40CL.md @@ -0,0 +1,109 @@ +# Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ внСшнСй Flash-памяти DS_W25X40CL + +НизкоуровнСвая Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π° Π‘ΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с энСргонСзависимой NOR Flash-ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ **Winbond W25X40CL** (объСм 4 ΠœΠ±ΠΈΡ‚ / 512 ΠšΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚) ΠΏΠΎ интСрфСйсу SPI. ΠŸΠ°ΠΌΡΡ‚ΡŒ Ρ€Π°Π·Π±ΠΈΡ‚Π° Π½Π° 8 Π±Π»ΠΎΠΊΠΎΠ², 128 сСкторов ΠΏΠΎ 4 ΠšΠ‘ ΠΈ 2048 страниц ΠΏΠΎ 256 Π±Π°ΠΉΡ‚. + +## πŸ“Œ ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ +* **Блочная очистка ΠΈ запись**: Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° постраничной записи (Page Program, Π΄ΠΎ 256 Π±Π°ΠΉΡ‚) ΠΈ посСкторного стирания (Sector Erase, 4 ΠšΠ‘), Ρ‡Ρ‚ΠΎ являСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ для NOR Flash Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹. +* **ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ занятости (Busy Checking)**: Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ записи ΠΈ стирания автоматичСски ΠΎΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ рСгистр статуса памяти (Status Register 1, Π±ΠΈΡ‚ `BUSY`), блокируя Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Ρ‡ΠΈΠΏ физичСски Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ памяти. +* **Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ Ρ‡ΠΈΠΏΠ°**: НаличиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ чтСния JEDEC ID позволяСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π»ΠΈΠ½Π½ΠΎΡΡ‚ΡŒ микросхСмы ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠΎ шинС SPI ΠΏΡ€ΠΈ стартС систСмы. + +--- + +## πŸš€ Бпособ добавлСния Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ (Git Submodule) + +Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Git, изолируя ΠΊΠΎΠ΄ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΎΡ‚ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ. + +### 1. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ подмодуля +Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ вашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°: +```bash +git submodule add https://domstudent.ru Library/DS_W25X40CL +``` + +### 2. АвтоматичСскоС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ CMake +ЗапуститС PowerShell-скрипт для автоматичСского добавлСния ΠΏΡƒΡ‚Π΅ΠΉ `Inc` ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² `Src` подмодуля памяти Π² структуру сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°: +```powershell +cd tools/ +./UpdateCMakeList.ps1 +``` + +--- + +## πŸ”Œ Π‘Ρ…Π΅ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (SPI) + +Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ SPI настраиваСтся Π² CubeMX Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ `Full-Duplex Master` (ΠΈΠ»ΠΈ `Transmit Only`, Ссли Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π½Π΅ трСбуСтся, Π½ΠΎ для памяти Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ), `Data Size: 8 Bits`, `First Bit: MSB First`. Π Π΅ΠΆΠΈΠΌ SPI: `CPOL = Low (0)`, `CPHA = 1 Edge (0)` (SPI Mode 0) ΠΈΠ»ΠΈ `CPOL = High`, `CPHA = 2 Edge` (SPI Mode 3). + +| Π’Ρ‹Π²ΠΎΠ΄ микросхСмы W25X40CL | Π’Ρ‹Π²ΠΎΠ΄ STM32 | НазначСниС | +| :--- | :--- | :--- | +| **/CS** (Pin 1) | Π›ΡŽΠ±ΠΎΠΉ GPIO_Output | Π’Ρ‹Π±ΠΎΡ€ Ρ‡ΠΈΠΏΠ° (Chip Select, Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ Π² 0) | +| **DO (IO1)** (Pin 2) | SPIx_MISO | Π’Ρ‹Ρ…ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ… (Master Input Slave Output) | +| **/WP** (Pin 3) | 3.3V ΠΈΠ»ΠΈ GPIO | Π—Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ записи (Write Protect, ΠΏΡ€ΠΈΡ‚ΡΠ½ΡƒΡ‚ΡŒ ΠΊ 3.3Π’) | +| **GND** (Pin 4) | GND | ΠžΠ±Ρ‰Π°Ρ зСмля | +| **DI (IO0)** (Pin 5) | SPIx_MOSI | Π’Ρ…ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ… (Master Output Slave Input) | +| **CLK** (Pin 6) | SPIx_SCK | Вактовая линия ΡˆΠΈΠ½Ρ‹ SPI | +| **/HOLD** (Pin 7) | 3.3V ΠΈΠ»ΠΈ GPIO | Π£Π΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ ΡˆΠΈΠ½Ρ‹ (Hold, ΠΏΡ€ΠΈΡ‚ΡΠ½ΡƒΡ‚ΡŒ ΠΊ 3.3Π’) | +| **VCC** (Pin 8) | 3.3V | ΠŸΠΈΡ‚Π°Π½ΠΈΠ΅ микросхСмы (2.3V β€” 3.6V) | + +--- + +## πŸ’» ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Π² `main.c` + +ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅ спСцифику NOR Flash: ΠΏΠ΅Ρ€Π΅Π΄ записью Π΄Π°Π½Π½Ρ‹Ρ… Π² Π»ΡŽΠ±ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти, этот сСктор **ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΡ‚Π΅Ρ€Π΅Ρ‚ΡŒ**, ΠΈΠ½Π°Ρ‡Π΅ Π½ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ логичСски ΡΠΌΠ΅ΡˆΠ°ΡŽΡ‚ΡΡ со старыми. + +```c +#include "DS_W25X40CL.h" + +extern SPI_HandleTypeDef hspi1; +DS_W25X40CL external_flash; + +uint8_t write_buffer[256]; +uint8_t read_buffer[256]; + +int main(void) { + // ... АвтоматичСская инициализация HAL, GPIO, SPI ... + + /* 1. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ дСскриптора памяти */ + DS_W25X40CL_Init(&external_flash, &hspi1, GPIOA, GPIO_PIN_4); + + /* 2. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° связи с Ρ‡ΠΈΠΏΠΎΠΌ (Π§Ρ‚Π΅Π½ΠΈΠ΅ Manufacturer ΠΈ Device ID) */ + uint32_t jedec_id = DS_W25X40CL_ReadID(&external_flash); + if (jedec_id == 0xEF3013) { // 0xEF - Winbond, 0x3013 - W25X40CL + // ΠŸΠ°ΠΌΡΡ‚ΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΠΏΠΎΠ·Π½Π°Π½Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠΌ! + } + + /* 3. Π—Π°ΠΏΠΈΡΡŒ ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… (ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π‘Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ 0, АдрСс 0x000000) */ + // ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° тСстовых Π΄Π°Π½Π½Ρ‹Ρ… + for(uint16_t i=0; i<256; i++) write_buffer[i] = i; + + // ШАГ A: Π‘Ρ‚ΠΈΡ€Π°Π΅ΠΌ сСктор (4 ΠšΠ‘) ΠΏΠ΅Ρ€Π΅Π΄ записью + DS_W25X40CL_EraseSector(&external_flash, 0x000000); + + // ШАГ Π‘: ЗаписываСм страницу памяти (макс 256 Π±Π°ΠΉΡ‚) + DS_W25X40CL_WritePage(&external_flash, 0x000000, write_buffer, 256); + + // ШАГ Π’: Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ + DS_W25X40CL_ReadData(&external_flash, 0x000000, read_buffer, 256); + + while (1) { + // Основной Ρ†ΠΈΠΊΠ» + } +} +``` + +--- + +## πŸ“‹ Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΈΠΊ API Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ + +### `void DS_W25X40CL_Init(DS_W25X40CL *flash, SPI_HandleTypeDef *hspi, GPIO_TypeDef *CS_Port, uint16_t CS_Pin)` +ВыполняСт Π»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ структуры Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°, привязываСт ΠΊ Π½Π΅ΠΉ ΡˆΠΈΠ½Ρƒ SPI ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΏΠΈΠ½ управлСния Π·Π°Ρ‰Π΅Π»ΠΊΠΎΠΉ `/CS`. + +### `uint32_t DS_W25X40CL_ReadID(DS_W25X40CL *flash)` +ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ `0x9F` (Read JEDEC ID) ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ 3 Π±Π°ΠΉΡ‚Π° ΠΎΡ‚Π²Π΅Ρ‚Π°. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½ΠΎΠ΅ 24-Π±ΠΈΡ‚Π½ΠΎΠ΅ число, содСрТащСС ID производитСля ΠΈ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ Ρ‡ΠΈΠΏΠ°. + +### `void DS_W25X40CL_EraseSector(DS_W25X40CL *flash, uint32_t SectorAddress)` +ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ записи `0x06` (Write Enable), Π·Π°Ρ‚Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ стирания сСктора `0x20` ΠΈ Π΅Π³ΠΎ 24-Π±ΠΈΡ‚Π½Ρ‹ΠΉ адрСс. ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ окончания процСсса стирания Ρ‡Π΅Ρ€Π΅Π· опрос рСгистра статуса. + +### `void DS_W25X40CL_WritePage(DS_W25X40CL *flash, uint32_t PageAddress, uint8_t *pData, uint16_t Size)` +ЗаписываСт массив Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π΄ΠΎ 256 Π±Π°ΠΉΡ‚ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ΄Π½ΠΎΠΉ физичСской страницы памяти (ΠΊΠΎΠΌΠ°Π½Π΄Π° `0x02`). АвтоматичСски ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Π±ΠΈΡ‚ готовности Ρ‡ΠΈΠΏΠ°. + +### `void DS_W25X40CL_ReadData(DS_W25X40CL *flash, uint32_t Address, uint8_t *pData, uint16_t Size)` +ВыполняСт Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… любого объСма, начиная с ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ 24-Π±ΠΈΡ‚Π½ΠΎΠ³ΠΎ адрСса памяти (ΠΊΠΎΠΌΠ°Π½Π΄Π° `0x03`). АвтоматичСски ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ адрСс Π½Π° сторонС Ρ‡ΠΈΠΏΠ° Π²ΠΎ врСмя удСрТания Π»ΠΈΠ½ΠΈΠΈ `/CS`.