Каталог статей
1. Введение
В настоящее время я использую stm32f407ZGT6 для чтения и записи флэш-памяти Samsung NAND [K9F1G08U0E].
Я купил здесь плату
[минимальная системная плата STM32F407ZGT6/основная плата/плата адаптера/плата разработки/плюс 128M FLASH],
которую можно дополнительно оснастить K9F1G08U0E.
Для этой флэш-памяти NAND вы можете использовать stm32 FSMC для чтения и записи.
Программу stm32 я написал с использованием stm32cubeide, что очень удобно.
2. Ссылка на данные
Вы можете найти эту информацию, выполнив поиск AN2784 на официальном сайте.
[AN2784: Использование периферийного устройства FSMC высокой плотности STM32F10xxx для управления внешней памятью]
Ниже приведены адреса каждого банка для справки. Этот адрес очень важен для настройки следующих параметров.
3. Настройка частоты
После настройки проекта вам необходимо настроить кварцевый генератор и установить частоту процессора 168 МГц.
4.Настройки параметров FSMC
Затем установите конфигурацию nand flash.Обратите внимание, что лучше всего установить параметры точно такие же, как показано ниже.Возможны и другие параметры, но я еще не проверял.
На этот раз прерывание RB не используется, проверка ECC не выполняется и т. д. На самом деле, лучше использовать его, но у меня возникают проблемы, как только я им пользуюсь, поэтому я его на время забываю.
После последующего тестирования необходимо включить дополнительную команду включения, иначе считанные данные будут неправильными и будут иметь значение 0x30. [STM32F767 NAND FLASH MT29F4G08 чтение и запись данных]
После настройки нужно переключиться в режим кода и проверить, соответствуют ли параметры на стороне кода скриншоту ниже: Видно,
что есть отличие от параметров ui на 1. Не знаю почему. Но параметры кода — это то, что нам нужно.
5. Измените определение макроса NAND_DEVICE.
Тогда самое главное — вам нужно изменить определение NAND_DEVICE в заголовочном файле stm32f4xx_hal_nand.h.
Потому что сейчас мы выбираем банк2, а банк2 начинается с 0x70000000UL, а не с 0x80000000UL.
Я не знаю, как с этим справляется библиотека stm32cubeide.При использовании FSMC для чтения и записи nand flash, независимо от того, выбираете ли вы банк2 или банк3, по умолчанию она использует 0x80000000UL. Я не знаю, что это за бредовая логика (возможно, я прозвучал немного грубо, но если вас, как и меня, мучила эта проблема четыре или пять дней, вы сможете понять мои чувства).
Что еще отвратительнее, так это то, что каждый раз после изменения каких-то данных в интерфейсе IOC система перегенерирует код и меняет stm32f4xx_hal_nand.h обратно на исходный 0x80000000UL, а значит, нужно менять его заново. . . .
- #define NAND_DEVICE 0x80000000UL
+ #define NAND_DEVICE 0x70000000UL
6. Тестирование программы
6.1. Простой тест
Затем вы можете написать программу для ее тестирования:
Пока чтение NAND_ID равно [0xec 0xf1 0x00 0x95], оно в основном оказывается успешным.
[K9F1G08U0E Руководство]
Это результат моей отладки. Вы можете видеть, что он соответствует.
6.2. Стереть, записать, прочитать тест
Не забудьте немного подождать перед чтением или записью после стирания, иначе могут возникнуть проблемы.
HAL_StatusTypeDef ret = HAL_OK;
NAND_IDTypeDef info;
ret = HAL_NAND_Read_ID(&hnand1, &info);
int nand_status = HAL_NAND_Read_Status(&hnand1);
NAND_AddressTypeDef addr = {
0, 0, 0};
ret = HAL_NAND_Erase_Block(&hnand1, &addr);
uint8_t buffer_write[2 * 1024];
for(int i = 0; i < 2048; i++)
{
buffer_write[i] = i;
}
ret = HAL_NAND_Write_Page(&hnand1, &addr, buffer_write, 1);
nand_status = HAL_NAND_Read_Status(&hnand1);
uint8_t buffer[2 * 1024] = {
0};
ret = HAL_NAND_Read_Page(&hnand1, &addr, buffer, 1);
Уведомление
а. Иногда с программой проблем нет, но когда я использую st-link для отладки, она всегда вылетает, не знаю почему. Это потому, что мой st-link — подражатель?
Ссылка:
[Плата NandFlash (A)]
[Драйвер STM32F407 FSMC MT29F4G08A Совместное использование исходного кода NAND FLASH]