STM Урок 218. HAL. STM32F4. FLASH память W25Q. Стираем информацию



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

Для удобства работы мы также будем использовать программу для Windows, ссылка на которую будет внизу страницы.

Схема наше также не изменилась

 

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

Откроем проект в Cube MX и, ничего в нём не меняя, сгенерируем проект и откроем его в Keil.

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

В стирании памяти в микросхемах серии w26q есть свои тонкости. Мы не можем стереть один байт, причём мы не можем стереть даже целую страницу. Минимум, что мы можем сделать, так это стереть сектор. Также мы можем стереть блок. Есть команда, с помощью которой стирается сразу вся информация из памяти микросхемы. Попробуем мы сегодня все три команды. Мало того, чтобы данные команды использовать, нужно кое-что подготовить. Поэтому было принято решение не объединять урок по стиранию и записи, а сделать их отдельными.

Перейдём в файл w25q_spi.c и добавим некоторые макросы, связанные с командами

 

 

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

Ниже добавим ещё несколько макроподстановок для команд чтения статусных регистров

 

 

Перейдём непосредственно к обработке команд. Прежде всего, мы должны знать о том, что для того, чтобы вносить любые изменения в микросхеме (чтение, запись), нужно их разрешить. для этого существует команда Write Enable. Добавим для неё функцию после функции W25_Read_Info

 

 

Мы, как обычно, сначала опускаем ножку выбора, передаём команду и поднимаем ножку, затем ждём одну милисекунду, чтобы дать команде выполниться.

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

 

 

Операции стирания и записи занимают определённое время и мы должны знать, когда они завершатся, чтобы продолжать дальше работать с чипом. Для этого мы должны прочитать определённый бит определённого статусного регистра. Перейдём в файл w25q_spi.h и в теле структуры w25_info_t объявим ещё три поля для всех трёх статусных регистров

 

 

Вернёмся в файл w25q_spi.c и ниже функции W25_Write_Disable добавим функцию для ожидания завершения операции стирания или записи

 

 

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

Вот данный регистр и этот бит

 

 

А вот так происходит операция чтения любого регистра статуса

 

 

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

Ну и, наконец-то, дело дошло до операции стирания данных.

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

 

 

Далее мы вычисляем адрес, в котором находится данный сектор, так как команда стирания устроена так, что мы в неё отправляем не номер сектора, а его адрес

 

 

 

Разрешаем запись и опускаем ножку выбора

 

 

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

 

 

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

 

 

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

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

 

 

 

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

 

 

Добавим на наши три функции прототипы в файле w25q_spi.h

 

 

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

 

 

Сначала объявим переменную

 

 

И ниже вернём код идентификации и инициализации полей переменной структуры информации о микросхеме

 

 

Теперь перейдём в файл main.c и в бесконечном цикле функции main() отреагируем на команду стирания микросхемы, пришедшую по UART от компьютера, в бесконечном цикле, продолжая наше условие. Для начала мы погасим оба светодиода

 

 

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

 

 

Попробуем пока стереть, например, третий сектор

 

 

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

 

 

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

 

 

Нажмём данную кнопку, дождёмся окончания процесса и увидим, что у нас снова стали неактивными кнопки чтения и стирания. Активной осталась только кнопка Info

 

 

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

 

 

Давайте проверим, что 3 сектор у нас действительно стёрт. Адрес его будет 3×4096=12288 или в шестнадцатеричном выражении 0x3000, то есть с данного адреса по адрес 0x3FFF у нас будут все биты установлены, то есть все байты будут иметь значение 0xFF. Считаем заново служебную информацию, чтобы кнопка Read активировалась, нажмём её и, дождавшись завершения убедимся, в том что данный диапазон у нас действительно стёрт

 

 

 

Информация действительно удалена.

Вернёмся в проект, закомментируем пока вызов функции стирания сектора и вызовем функцию стирания блока и попытаемся стереть, например 5 блок

 

 

Соберём проект, прошьём контроллер и в программе, считав служебную информацию опять нажмём кнопку Clear.

Опять прочитаем память нашей микросхемы. У нас теперь также информация в памяти должна быть стёрта с адреса 5×65536=327680 или в шестнадцатеричном выражении 0x50000 по адрес 0x5FFFF. Убедимся в этом, просмотрев информацию в ListView

 

 

 

Информация в данном диапазоне действительно стёрта.

Теперь в нашем проекте закомментируем функцию стирания блока и вызовем функцию стирания всей памяти микросхемы

 

 

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

Если мы всё правильно написали, то вся память микросхем будет стёрта

 

 

 

Информация действительно вся стёрта из памяти.

Итак, на данном уроке мы научились стирать информацию из памяти микросхемы серии W25q посекторно, поблочно, а также полностью.

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

 

 

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

 

Исходный код

 

 

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

 

 

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

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

 

 

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

 

STM Урок 218. HAL. STM32F4. FLASH память W25Q. Стираем информацию

3 комментария на “STM Урок 218. HAL. STM32F4. FLASH память W25Q. Стираем информацию
  1. Александр:

    Добрый день! Сделайте пожалуйста урок, как на основе этой микросхемы W25Qxxx прикрутить файловую систему Little FS, говорят это очень просто. Данная файловая система увеличивает срок службы таких флэшек за счет записи данных каждый раз в новое место, плюс имеет защиту от пропадания питания. Заранее спасибо!

  2. Artem:

    Уважаемый автор публикации! А нету у Вас примера использования usb mass storage device + 25Q32 ? Чтобы файловая система была именно на этой флешке. И с ПК чтобы можно было закидывать файлы ну и со стороны МК чтобы можно было с файлами работать.

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

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

*