Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.74/89: Рейтинг темы: голосов - 89, средняя оценка - 4.74
0 / 0 / 0
Регистрация: 09.02.2016
Сообщений: 5

STM32F429 USB Mass Storage из внутренней flash

31.07.2018, 14:56. Показов 18028. Ответов 56

Студворк — интернет-сервис помощи студентам
Ребят, можете помочь, нужно реализовать usb Mass Storage на stm32f429, используя внутреннюю флеш память контроллера. Устройство в системе опознается как Mass Storage, при попытке на него зайти, ОС просит его отформатировать, при форматировании выскакивает ошибка. проект прикладываю
Вложения
Тип файла: 7z USB_mass2copy_data_to_comp_30.07.2018.7z (9.77 Мб, 79 просмотров)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.07.2018, 14:56
Ответы с готовыми решениями:

STM32 USB MASS STORAGE in FLASH memory
Привет! Есть программа, которая заставляет плату с МК STM32F103RET7 работать в режиме USB MASS STORAGE, причем по USB он отдает куски...

STM32f429 mass storage device + sdram
Здравствуйте, можете помочь с решением проблемы. Пытаюсь сделать usb mass storage device из sdram на stm32f429- плата waveshare, устройство...

LPC1788 Mass Storage device на базе SPI Flash
Пытаюсь реализовать Mass Storage. К контроллеру подключена флэш sst25vf016. За основу взял пример USBDEV, идущий с CMSIS library для...

56
Эксперт .NET
 Аватар для Rius
13824 / 7867 / 1703
Регистрация: 25.05.2015
Сообщений: 23,893
Записей в блоге: 14
03.10.2018, 12:18
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Voland_ Посмотреть сообщение
Есть подозрение, что FAT16 Ваш может быть не совсем правильно сформирован. В итоге в нем есть какая-то предполагаемая ссылка на теневой FAT (дублирующий), или на какую-то существующую, но не сформированную область. В итоге получается, что файлы пытаются читаться одновременно, но оффсет второго (или может даже нескольких, учитывая рандомные оффсеты) выбирается неправильно.
Указано наличие двух FAT, но чтение программно переадресуется на одну ту же виртуальную FAT. Разойтись не должны.

Проблему пока подавил установкой флага FILE_FLAG_NO_BUFFERING в функции CreateFile, т.е. отключением File Buffering, при чтении файла с накопителя.
1
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
03.10.2018, 13:46
Цитата Сообщение от Rius Посмотреть сообщение
подавил установкой флага FILE_FLAG_NO_BUFFERING
звучит фантастично ). Вроде винда ж не настолько тупая, чтобы рандомно кешировать страницы FLASH'а? . Потому что адреса выглядят снаскоку - вполне хаотично...

PS: File buffering для съемных вроде по умолчанию отключен в системе. Разве нет?
0
Эксперт .NET
 Аватар для Rius
13824 / 7867 / 1703
Регистрация: 25.05.2015
Сообщений: 23,893
Записей в блоге: 14
03.10.2018, 14:03
Можно предположить, что винда излишне умная. Увидев, что кластер читается медленно, запрашивает какой-то другой кластер по неизвестному алгоритму. Адреса вроде и случайно выглядят, но повторяемость их отличная. Но точно причину не знаю.
Также замечено, что если в отладке приостановить (breakpoint) чтение первого перескакивающего блока, то всё считывается нормально.

Про отключение не знаю. До настроек кеширования флешки не добраться - прав не хватает.

Добавлено через 2 минуты
Как запасной вариант рассматриваю один-два мелких файла, в которые можно записать команду и считать ответ.
1
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
03.10.2018, 16:33
Цитата Сообщение от Rius Посмотреть сообщение
один-два мелких файла, в которые можно записать команду и считать ответ.
...имея такой инструмент можно вообще сделать запрос-ответ интерфейс, как при работе с доступом "read-write". Так что это классный хинт. В принципе я делал управление через имена файлов. То есть как только система пытается создать определенный файл - происходит реакция. Но ваш вариант с распарсиванием контента даже лучше.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
03.10.2018, 18:14
Господа! я уже ничего не понимаю о чем вы говорите, но система FAT имеет одну таблицу FAT в которой расписаны все клястеры
и еще одну таблицу имен, где расписано какой файл али директория в каком клястере начало энтой сущности лежит
или вы о чем то другом?
0
Эксперт .NET
 Аватар для Rius
13824 / 7867 / 1703
Регистрация: 25.05.2015
Сообщений: 23,893
Записей в блоге: 14
03.10.2018, 18:17
ValeryS, в FAT16 эта FAT имеется в количестве N штук, а N прописано в загрузочном секторе. Обычно принято, что оно == 2.
1
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
04.10.2018, 15:05
Rius, спасибо, давно не работал не помню
Цитата Сообщение от Rius Посмотреть сообщение
в FAT16 эта FAT имеется в количестве N штук, а N прописано в загрузочном секторе.
я так понял, отсюда http://piclist.ru/S-FAT-MMC-RUS/S-FAT-MMC-RUS.html
что не только в FAT16 а в любых FAT
0
0 / 0 / 0
Регистрация: 06.12.2017
Сообщений: 8
13.10.2018, 16:47
А для того чтобы всякая периферия работала в бутоладере, надо ли её деинициализировать на основной прошивке перед переходом в бутлоадер?
Хочу прошиваться через UART, но в бутоладере он у меня не работает.
0
Эксперт .NET
 Аватар для Rius
13824 / 7867 / 1703
Регистрация: 25.05.2015
Сообщений: 23,893
Записей в блоге: 14
13.10.2018, 16:59
Ну... я, для захода в загрузчик из основной прошивки, ставлю флаг в области памяти, сбросом и инициализацией не затрагиваемой, и вызываю сброс через AIRCR и SYSRESETREQ. В загрузчике периферия инициализируется заново, по своему, и работает.

Если же речь о встроенном в МК загрузчике по UART, а не самодельном, то он иначе запускается.
0
0 / 0 / 0
Регистрация: 06.12.2017
Сообщений: 8
13.10.2018, 17:11
Rius, можешь пример из кода скинуть,где ты вызываешь сброс?
0
Эксперт .NET
 Аватар для Rius
13824 / 7867 / 1703
Регистрация: 25.05.2015
Сообщений: 23,893
Записей в блоге: 14
13.10.2018, 17:17
В произвольном месте пользовательской прошивки вызывается HAL_NVIC_SystemReset(). Вообще ничего особенного.
0
0 / 0 / 0
Регистрация: 06.12.2017
Сообщений: 8
16.10.2018, 15:26
Rius, Можешь пожалуйста обьяснить что просходит в твоей функции
C
1
2
3
4
5
6
7
8
9
10
11
12
13
void bootloaderRunFirmware(void)
{
  typedef void (*pFunction)(void);
  pFunction Jump_To_Application;
  volatile uint32_t *vectorsTable = (volatile uint32_t *)BOOTLOADER_FW_AREA_START;
 
  uint32_t JumpAddress = vectorsTable[1];
  Jump_To_Application = (pFunction) JumpAddress;
 
  /* Initialize user application's Stack Pointer */
  __set_MSP(vectorsTable[0]);
  Jump_To_Application();
}
Видел несколько реализаций аналогичных функций в других проектах, но только с твоей после перехода в бутлоадер и обратно корректно работает вся перифирия, хотелось бы разобраться.
1)Для чего смешать адрес на 4?
C
1
2
3
4
5
6
7
8
9
10
11
void GoToUserApp(void)
{
    u32 appJumpAddress;
    void (*GoToApp)(void);
 
    appJumpAddress = *((volatile u32*)(FLASH_USER_START_ADDR + 4));
    GoToApp = (void (*)(void))appJumpAddress;
    SCB->VTOR = FLASH_USER_START_ADDR;
    __set_MSP(*((volatile u32*) FLASH_USER_START_ADDR)); //stack pointer (to RAM) for USER app in this address
    GoToApp();
}
2)Не совсем понимаю операции с этим регистром, пишут что смещают через него таблицу векторов.
C
1
SCB->VTOR = FLASH_USER_START_ADDR;
3) Еще видел что перед смещением таблицы векторов отключают прерывания,необходимо ли это?
C
1
__disable_irq();
Понимаю что немного нагло и врядли вы можете ответить за авторов этих функций, но хотелось бы детальнее разобраться с темой бутлоадера,подскажите, если не сложно)
0
Эксперт .NET
 Аватар для Rius
13824 / 7867 / 1703
Регистрация: 25.05.2015
Сообщений: 23,893
Записей в блоге: 14
16.10.2018, 15:55
Цитата Сообщение от lenagibe Посмотреть сообщение
1)Для чего смешать адрес на 4?
В таблице векторов прерываний вектор Reset находится по смещению 0x0004: Cortex-M4 Devices Generic User Guide - 2.3.4. Vector table.
Цитата Сообщение от lenagibe Посмотреть сообщение
2)Не совсем понимаю операции с этим регистром, пишут что смещают через него таблицу векторов.
Да, смещают: Cortex-M4 Devices Generic User Guide - 4.3.4. Vector Table Offset Register
Цитата Сообщение от lenagibe Посмотреть сообщение
3) Еще видел что перед смещением таблицы векторов отключают прерывания,необходимо ли это?
Вероятно, да.
В другом своём загрузчике я вызываю HAL_NVIC_SystemReset и сразу после сброса проверяю, надо ли перейти на адрес прошивки.
0
0 / 0 / 0
Регистрация: 06.12.2017
Сообщений: 8
16.10.2018, 15:57
Rius, а почему вы не смещает е на 4?

И не работаете с данным регистром ?
0
Эксперт .NET
 Аватар для Rius
13824 / 7867 / 1703
Регистрация: 25.05.2015
Сообщений: 23,893
Записей в блоге: 14
16.10.2018, 16:11
Цитата Сообщение от lenagibe Посмотреть сообщение
а почему вы не смещает е на 4?
C++
1
2
volatile uint32_t *vectorsTable = (volatile uint32_t *)BOOTLOADER_FW_AREA_START;
uint32_t JumpAddress = vectorsTable[1]; // <<<<<<<<<<<<<<<<<
Добавлено через 8 минут
Цитата Сообщение от lenagibe Посмотреть сообщение
И не работаете с данным регистром ?
Так удачно сложилось, что выполняемая пользовательская прошивка вызывает функцию SystemInit() после сброса, ещё до main(). А уже в SystemInit() прописана установка VTOR.
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
Reset_Handler:
  ldr   sp, =_estack
 
  ...
 
/* Call the clock system intitialization function.*/
    bl  SystemInit
/* Call static constructors */
    bl __libc_init_array
/* Call the application's entry point.*/
    bl  main
C++
1
2
3
4
5
6
7
8
9
void SystemInit(void)
{
  ...
  /* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif

Тоже можно поправить. Но вроде не принципиально. Пользовательская прошивка запускается с выключенными прерываниями, поэтому до установки ею VTOR доходит своим ходом.
0
0 / 0 / 0
Регистрация: 06.12.2017
Сообщений: 8
16.10.2018, 16:44
Rius, Спасибо большое за ответ, буду разбираться .
Я с этим не мог сообразить так как думал, что если к адресу прибавить 4 то это будет четвертый элемент массива например vectorsTable[4], а у вас первый)
C
1
2
volatile uint32_t *vectorsTable = (volatile uint32_t *)BOOTLOADER_FW_AREA_START;
uint32_t JumpAddress = vectorsTable[1]; // <<<<<<<<<<<<<<<<<
Сейчас взглянул на таблицу векторов и все понял)
0
Эксперт .NET
 Аватар для Rius
13824 / 7867 / 1703
Регистрация: 25.05.2015
Сообщений: 23,893
Записей в блоге: 14
16.10.2018, 16:54
Элементы 32-битные, поэтому нулевой элемент находится по смещению 0x0000, а первый - 0x0004 (если в байтах считать).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.10.2018, 16:54

USB mass storage class
Я пытаюсь сделать вот что - всунуть STM32f4 по USB в комп, что бы он работал как mass storage divice, ну то есть чтобы виндой он...

USB on stm32f107 + mass storage
Прошу помочь новичку. Задача-сделать хост на stm32f107, подключить к нему флэшку и определить, что она подлючена. В наличии имеется плата...

Stm32 USB host Mass Storage
Приветствую. Столкнулся с проблемой. Пытаюсь заюзать STM32f207 как хост. Сгенерировал проект в CUBE MX v4.27.0, где стмка будет в роли...

Вопрос по USB Mass storage на stm32f103
с помощью CubeMX прикрутил стандартную библиотеку к процессору. И собственно возник вопрос.. Насколько я понимаю, я должен реализовать...

USB Mass Storage Device на STM32F4
Использую микроконтроллер STM32F407. Сделал в своем устройстве поддержку USB Mass Storage Device чтобы лишний раз не вынимать карту памяти....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
57
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru