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

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

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

Author24 — интернет-сервис помощи студентам
Ребят, можете помочь, нужно реализовать usb Mass Storage на stm32f429, используя внутреннюю флеш память контроллера. Устройство в системе опознается как Mass Storage, при попытке на него зайти, ОС просит его отформатировать, при форматировании выскакивает ошибка. проект прикладываю
Вложения
Тип файла: 7z USB_mass2copy_data_to_comp_30.07.2018.7z (9.77 Мб, 74 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.07.2018, 14:56
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

Добавлено через 2 минуты
Как запасной вариант рассматриваю один-два мелких файла, в которые можно записать команду и считать ответ.
1
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
03.10.2018, 16:33 44
Цитата Сообщение от Rius Посмотреть сообщение
один-два мелких файла, в которые можно записать команду и считать ответ.
...имея такой инструмент можно вообще сделать запрос-ответ интерфейс, как при работе с доступом "read-write". Так что это классный хинт. В принципе я делал управление через имена файлов. То есть как только система пытается создать определенный файл - происходит реакция. Но ваш вариант с распарсиванием контента даже лучше.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
03.10.2018, 18:14 45
Господа! я уже ничего не понимаю о чем вы говорите, но система FAT имеет одну таблицу FAT в которой расписаны все клястеры
и еще одну таблицу имен, где расписано какой файл али директория в каком клястере начало энтой сущности лежит
или вы о чем то другом?
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,662
Записей в блоге: 14
03.10.2018, 18:17 46
ValeryS, в FAT16 эта FAT имеется в количестве N штук, а N прописано в загрузочном секторе. Обычно принято, что оно == 2.
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
04.10.2018, 15:05 47
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 48
А для того чтобы всякая периферия работала в бутоладере, надо ли её деинициализировать на основной прошивке перед переходом в бутлоадер?
Хочу прошиваться через UART, но в бутоладере он у меня не работает.
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,662
Записей в блоге: 14
13.10.2018, 16:59 49
Ну... я, для захода в загрузчик из основной прошивки, ставлю флаг в области памяти, сбросом и инициализацией не затрагиваемой, и вызываю сброс через AIRCR и SYSRESETREQ. В загрузчике периферия инициализируется заново, по своему, и работает.

Если же речь о встроенном в МК загрузчике по UART, а не самодельном, то он иначе запускается.
0
0 / 0 / 0
Регистрация: 06.12.2017
Сообщений: 8
13.10.2018, 17:11 50
Rius, можешь пример из кода скинуть,где ты вызываешь сброс?
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,662
Записей в блоге: 14
13.10.2018, 17:17 51
В произвольном месте пользовательской прошивки вызывается HAL_NVIC_SystemReset(). Вообще ничего особенного.
0
0 / 0 / 0
Регистрация: 06.12.2017
Сообщений: 8
16.10.2018, 15:26 52
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
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,662
Записей в блоге: 14
16.10.2018, 15:55 53
Цитата Сообщение от 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 54
Rius, а почему вы не смещает е на 4?

И не работаете с данным регистром ?
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,662
Записей в блоге: 14
16.10.2018, 16:11 55
Цитата Сообщение от 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 56
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
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,662
Записей в блоге: 14
16.10.2018, 16:54 57
Элементы 32-битные, поэтому нулевой элемент находится по смещению 0x0000, а первый - 0x0004 (если в байтах считать).
0
16.10.2018, 16:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.10.2018, 16:54
Помогаю со студенческими работами здесь

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

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

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

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

Вопрос по HAL USB MASS STORAGE.
Сгенрил проект с freertos и MSC. Эмулирую файловую систему с с помощью библиотеки и программирую...

stm32f407 + SPI MMC + usb mass storage
Прошу не ругать, за то что так часто создаю темы (вторая за 2 дня). К stm32f407 подключена карта...

STM32F1 Проблемы с USB Mass Storage Device
Здравствуйте. Имеется плата с контроллером STM32F103RET6, mini-usb разъёмом, и держателем для...


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

Или воспользуйтесь поиском по форуму:
57
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru