STM Урок 219. HAL. STM32F4. FLASH память W25Q. Запись данных. Подключаем LCD

Продолжая тему программирования контроллера STM32F4 и также работу с последовательной FLASH-памятью серии W25Q, мы попытаемся с помощью программы для ПК записать данные в память микросхемы. Причём запишем мы данные из файла, подготовленного для прошивки.

Хочу заверить, что данная работа несложная, так как у нас почти всё для этого в библиотеке уже готово, поэтому было принято решение также для большей информативности задействовать дисплей LCD, который у нас на плате присутствует. Подключим мы его, используя также шину SPI, так как есть планы продолжить данную тему в LL, а там работа с интерфейсом LTDC не предусмотрена.

Схема урока не изменилась, осталась такая же, как и в прошлом занятии

 

 

И проект мы за основу также возьмём из прошлого урока с именем SPI_25Q32_CLEAR и присвоим ему новое имя SPI_25Q32_LCD.

Откроем проект в Cube MX и, так как дисплей на нашей плате подключен к шине SPI5, то её мы сейчас и задействуем. Дисплей по шине SPI мы уже подключали в уроке 179. Также мы подключали дисплей по SPI и на плате F429 в уроке 208, правда использовали мы библиотеку LL.

Включим SPI и настроим битрейт

 

 

Включим ножку PC2 на выход

 

 

То же самое проделаем и с ножками PD12 и PD13

 

 

Скорость им настроим максимальную, такую же как и у ножек SPI

 

 

Также кое-что поправим из существующего.

Во-первых, давайте поднимем ножку выбора микросхемы, иначе она сразу же начнёт работать

 

 

Добавим скорость на SPI1, так как микросхема у нас быстрая, и думаю справится

 

 

Также добавим размер стека и кучи

 

 

Сгенерируем проект и откроем его в Keil.

Подключим файл w25q_spi.c, настроим программатор на автоперезагрузку и отключим оптимизацию.

Из проекта урока 179 с именем ILI9341_SPI скопируем файлы spi_ili9341.c, spi_ili9341.h, а также файлы шрифтов font8.c, font12.c, font16.c, font20.c, font24.c и fonts.h в соответствующие каталоги нашего нового проекта. Файл spi_ili9341.c добавим в дерево проекта.

В файле main.c подключим нашу библиотеку дисплея

 

 

В файле spi_ili9341.h внесём следующие изменения.

Здесь добавим расширение и уберём первую букву в имени

 

#include <cstdlib.h>

 

Здесь изменим ножки

 

#define RESET_ACTIVE() HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_RESET)
#define RESET_IDLE() HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_SET)
#define CS_ACTIVE() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_RESET)
#define CS_IDLE() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET)
#define DC_COMMAND() HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,GPIO_PIN_RESET)
#define DC_DATA() HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,GPIO_PIN_SET)

 

Данный прототип функции удалим

 

uint16_t TFT9341_RandColor(void);

 

Перейдём в файл spi_ili9341.c и удалим одноимённую функцию вместе с телом.

Удалим также подключение библиотеки для генератора случайных чисел

 

extern RNG_HandleTypeDef hrng;

 

Выше в подключении библиотеки для SPI, а также ниже во всех местах, где попадётся hspi1, исправим на hspi5.

В функции TFT9341_DrawLine уберём здесь плюс, получится

 

err=dx;

 

 

Перейдём в файл main.c и в функции main() произведём инициализацию дисплея

 

 

Теперь займёмся записью в память микросхемы.

Для этого идём в файл w25q_spi.c и добавим макрос для команды записи

 

 

Из тел функций W25_Write_Enable и W25_Write_Disable удалим задержку

 

cs_reset();
HAL_Delay(1);

 

Ниже функции W25_Write_Disable добавим функцию включения и отключения защитных битов

 

 

Ничего особенного в данной функции нет, она сначала разрешает запись в статусный регистр, а затем включает или отключает нужные биты в нём.

Теперь в функции W25_Erase_Sector мы сначала разблокируем защиту

 

 

Затем внизу тела функции мы сначала удалим задержку

 

W25_Wait_Write_End();
HAL_Delay(1);

 

А вместо этого мы отключим запись и включим защиту

 

 

Затем ровно то же самое проделаем с функциями W25_Erase_Block и W25_Erase_Chip.

Ниже функции W25_Erase_Chip добавим функцию записи данных, в которой мы сначала дождёмся готовности микросхемы к операции изменения данных, разблокируем защиту, включим возможность записи и опустим ножку выбора

 

 

Далее отправляем в нашу микросхему команду на запись и адрес, с которого пишем, и затем сразу же отправляем наши данные

 

 

Поднимем ножку, дождёмся окончания процесса записи, запретим запись и включим защиту

 

 

По такому же принципу сочиним функцию для записи целой страницы памяти и добавим её ниже

 

 

В заголовочном файле добавим прототипы на наши обе функции, вернёмся в файл main.c и в функции main() объявим три целочисленные локальные переменные

 

 

В бесконечном цикле в той ветке условия, где происходит процесс чтения служебной информации, объявим на дисплее о данном процессе

 

 

 

Затем в конце ветви отчитаемся об окончании процесса

 

 

В следующей ветви, предназначенной для чтения из памяти, добавим аналогичный код

 

 

В конце ветви отчитаемся об окончании процесса чтения

 

 

Выше в данной ветви была ошибка в момент отправки последней порции байтов, смещение было только в количестве переданных уже порций, но надо это количество умножить на сто, иначе мы отправляем порцию не из того места буфера

 

HAL_UART_Transmit(&huart1,rx_buf + w25_info.PageSize / 100 * 100, w25_info.PageSize % 100,0x1000);

 

В следующей ветви, предназначенной для стирания чипа, добавим также аналогичный код

 

 

В конце ветви также отчитаемся об окончании процесса

 

 

Далее добавим в наш оператор следующее условие, которое будет срабатывать, когда компьютер пришлёт команду на запись в память, в котором для начала погасим светодиоды

 

 

После того, как погасим светодиоды, примем ещё 8 байтов с информацией от компьютера и также на дисплее напишем о начале процедуры записи

 

 

Присвоим из буфера количество страниц и размер страницы соответствующим переменным и пошлём компьютеру команду на начало передачи данных для записи в микросхему

 

 

Затем добавим бесконечный цикл, в котором примем от компьютера номер записываемой страницы, байты страницы, запишем эти байты в микросхему и отправим компьютеру команду об окончании записи страницы, а если это последняя страница, то выйдем из бесконечного цикла.

 

 

После данного цикла, как обычно, отчитаемся об окончании процесса и зажжём светодиоды

 

 

Ну и наконец-то пришло время проверить наши труды.

Программу для ПК, как вы, думаю, поняли, я доработал и её вы также можете скачать по ссылке внизу данной страницы.

Запустим нашу программу, соответственно, перед этим собрав наш код для контроллера и прошив его, и сначала считаем, как всегда, служебную информацию, чтобы нужные нам кнопки стали активными.

Как мы видим на дисплее, информация о начале и об окончании процесса из за его быстрого срабатывания появилась практически мгновенно

 

 

Попробуем считать данные из микросхемы, нажав кнопку Read.

Вот начало процесса

 

 

А вот окончание

 

 

Так как на прошлом занятии мы стёрли всю информацию из памяти микросхемы, мы видим вот это

 

 

Заново прочитаем служебную информацию, чтобы кнопки вновь стали активными.

С помощью кнопки Open File откроем файл с прошивкой

 

 

 

 

Мы видим, что файл открылся и кнопка Write стала активной, нажмём её для начала процесса записи прошивки в микросхему.

Сначала мы получим соответствующее предупреждение, что вся информация будет перезаписана. Соглашаемся и процесс записи начнётся, о чем будет ясно по прогресс-индикатору, а также по надписи на дисплее отладочной платы

 

 

По окончанию процесса на дисплее мы получим соответствующее сообщение, а также увидим зажжённые светодиоды

 

 

Мы можем считать прошивку из платы, записать её в файл и сравнить тот файл, который мы писали в микросхему со считанным. Они должны быть одинаковыми. Я неоднократно в этом уже убедился, так что можете поверить мне на слово.

Итак, на данном занятии мы научились прошивать микросхему серии W25Q, то есть записывать в неё данные. Также нам удалось задействовать дисплей, после чего мы можем выводить на него нужную нам информацию.

Всем спасибо за внимание!

 

 

 

Исходный код

 

Программа для работы с микросхемой

 

Отладочную плату можно приобрести здесь STM32F429I-DISCO

Микросхему FLASH-памяти W25Q32FVSSIG SOP8 (10 штук) можно приобрести здесь W25Q32FVSSIG

 

 

Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)

STM HAL. STM32F4. FLASH память W25Q. Запись данных. Подключаем LCD

 

Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)

STM HAL. STM32F4. FLASH память W25Q. Запись данных. Подключаем LCD

1 комментарий к “STM Урок 219. HAL. STM32F4. FLASH память W25Q. Запись данных. Подключаем LCD

  1. Добрый день.
    А возможно ли прикрепить исходный файл виндовс программы для работы с данным контроллером?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*