Первая итерация

This commit is contained in:
2026-06-27 00:39:04 +03:00
parent 2009035bb4
commit c4ec2b64cd
12 changed files with 951 additions and 180 deletions
+52 -180
View File
@@ -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/ # Файлы технического описания
```
+81
View File
@@ -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`).
+84
View File
@@ -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 мс для поддержки автоповтора события при непрерывном удержании.
+98
View File
@@ -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)`
Возвращает относительное изменение положения энкодера (количество шагов) с момента последнего вызова этой функции и **автоматически обнуляет** внутренний накопительный счетчик.
+41
View File
@@ -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` во избежание переполнения буфера.
+74
View File
@@ -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 мс для безопасного включения экрана.
+69
View File
@@ -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`).
+72
View File
@@ -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.
+85
View File
@@ -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`.
+76
View File
@@ -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
```
+110
View File
@@ -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), если предыдущий пакет еще не успел улететь по шине.
+109
View File
@@ -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`.