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, то есть записывать в неё данные. Также нам удалось задействовать дисплей, после чего мы можем выводить на него нужную нам информацию.

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

 

 

Предыдущий урок Программирование МК STM32 Следующий урок

 

Исходный код

 

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

 

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

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

 

 

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

 

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

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

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

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

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

*