stm32 чтение и запись Nand Flash

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]

Acho que você gosta

Origin blog.csdn.net/joyopirate/article/details/131743763
Recomendado
Clasificación