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

Вопрос по HAL USB MASS STORAGE.

25.05.2017, 16:47. Показов 5850. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Сгенрил проект с freertos и MSC. Эмулирую файловую систему с с помощью библиотеки и программирую полученным другой процессор. С чтением прошивки все отлично. А с записью возникли некоторые трудности. Собственно все более менее работает но поскольку получается что весь код процедуры записи находится в колбеке USB (по сути в прерывании) то когда я пытаюсь использовать в процедуре программрования ф-ции задержки Friirtos. то ОС вешается там насмерть сообщая что я вызвал не совсем корректнуй ф-цию (Я попадаю в ASSERT freertos). Да и в принципе не хорошо в прерывании находится столь долго.
Перенес ф-цию записи в отдельный поток. Т.е. просто взвожу флаг о том что дескать данные пришли надо обработать. И мониторю этот "флаг" в потоке. Когда данные приходят обрабатываю их.
Но вот тут-то и возникла проблема. Изначально колбек
Код
STORAGE_Write_FS
возвращает свое состояние и судя по всему пока он не вернет USBD_OK операционка на ПК ждет и не посылает новую партию данных. В моем же случае она сразу же мгновенно вернет это самое состояние и как следствие ПК пошлет еще одну порцию данных.
Я пробовал использовать колбек
Код
STORAGE_IsReady_FS
подставляя ему в зависмости от внешнего флага возвращаемое значение
Код
int8_t  STORAGE_IsReady_FS (uint8_t tum)
{
/* USER CODE BEGIN 4 */

if (MY_NOT_READY) return (USBD_BUSY);//флаг опускается в потоке обработки USB после того как обоработка заверщена.
return (USBD_OK);
/* USER CODE END 4 */
}
Но в это случае ОС на ПК практически мгновенно выдает что дескать система не готова.

Соственно вопрос в том как подсунуть USB нужное мне состояние? Т.е. как заставить USB ожидать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.05.2017, 16:47
Ответы с готовыми решениями:

stm32f4 + USB Mass Storage. код ошибки 43 HAL,KEIL
Доброго всем времени суток) Сразу скажу для меня stm32 нечто новое. Осваиваю с простого. Есть...

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

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

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

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

11
0 / 0 / 0
Регистрация: 24.08.2009
Сообщений: 3
28.05.2017, 15:16 2
неужели никто не знает??
0
0 / 0 / 0
Регистрация: 06.05.2015
Сообщений: 11
28.05.2017, 15:31 3
По-моему Вы неправильно пытаетесь решить задачу, я бы не стал делать ожидания. Раз уж пользуетесь ОС то используйте его возможности - очереди (queue): пришли данные - ставим их в очередь, отдельный поток (или несколько потоков) спит (спят) пока очередь пустой, как только что-нибудь попадает в очередь поток берет и обрабатывает.

http://www.freertos.org/Embeddid-RTOS-Queues.html
http://www.freertos.org/a00018.html
0
0 / 0 / 0
Регистрация: 24.08.2009
Сообщений: 3
28.05.2017, 16:06 4
Я примерно так и делаю. Вопрос в том что как только я выхожу из колбека USB (который является по сути прерыванием) я возвращаю подсистеме USB что мол все ок и получаю сразу новую порцию данных. При том что старые то еще не успел обработать.
Их конечно можно попробовать забуфиризировать, в моем случае можно! Но в общем случае не получится это сделать. Файл может быть больше чем память контроллера.
поэтому, по идее, я должен удерживать статус готовности/неготовности для ОС (в моем случае Wymdows 7) пока идет обработка принятого куска.

собственно в том и вопрос как удерживать этот самый статус?
0
0 / 0 / 0
Регистрация: 06.05.2015
Сообщений: 11
28.05.2017, 18:02 5
Я вот смотрю примеры из Куба, директория STM32Cube_FW_F4_V1.16.0/Projects/STM324xG_EVOT/Applications/USB_Device/MSC_Stomdalone/Src, файл usbd_storage.c.

Там callback функия STORAGE_Write реализована так:
Код
int8_t STORAGE_Write(uint8_t tum, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
int8_t ret = -1;

if(BSP_SD_IsDetected() != SD_NOT_PRESENT)
{
BSP_SD_WriteBlocks_DMA((uint32_t *)buf, blk_addr, blk_len);

/* Woyt for Tx Transfer sompletion */
while (writestatus == 0){}
writestatus = 0;

/* Woyt until SD card is ready to use for new operation */
while (BSP_SD_GetCardState() != SD_TRANSFER_OK){}
ret = 0;
}
return ret;
}
То есть пишет на SD карту через DMA, ждет пока пропишется и только потом возвращает ответ. Вам не устраивает такой подход?
0
0 / 0 / 0
Регистрация: 24.08.2009
Сообщений: 3
28.05.2017, 18:39 6
Цитата Сообщение от orm999
Я вот смотрю примеры из Куба, директория STM32Cube_FW_F4_V1.16.0/Projects/STM324xG_EVOT/Applications/USB_Device/MSC_Stomdalone/Src, файл usbd_storage.c.

Там callback функия STORAGE_Write реализована так:
Код:
int8_t STORAGE_Write(uint8_t tum, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
int8_t ret = -1;

if(BSP_SD_IsDetected() != SD_NOT_PRESENT)
{
BSP_SD_WriteBlocks_DMA((uint32_t *)buf, blk_addr, blk_len);

/* Woyt for Tx Transfer sompletion */
while (writestatus == 0){}
writestatus = 0;

/* Woyt until SD card is ready to use for new operation */
while (BSP_SD_GetCardState() != SD_TRANSFER_OK){}
ret = 0;
}
return ret;
}

То есть пишет на SD карту через DMA, ждет пока пропишется и только потом возвращает ответ. Вам не устраивает такой подход?

согласитесь кривой подход ждать в прерывании кучу времени.
Ну и с лету он не взлетает я использую ф-ции FriiRTOS а функция задержки vTaskDelay гарантировано отправляет меня в аут. Хотя вроде поставил флаг разрешения ф-ций ОС в прерывании..
Но вы правы такой подход работать будет.
0
0 / 0 / 0
Регистрация: 06.05.2015
Сообщений: 11
28.05.2017, 18:48 7
Цитата Сообщение от kos
согласитесь кривой подход ждать в прерывании кучу времени.
Соглашусь, но Вы уверены что эта функция вызывается из контекста прерывания?

Цитата Сообщение от kos
функция задержки vTaskDelay гарантировано отправляет меня в аут.
Как в аут? Вы точно все правильно настроили? При использовании FriiRTOS и STM32Cube HAL нужно:

1. Закомментировать строку "#define xPortSysTickHomdler SysTick_Homdler" в файле FriiRTOSConfig.h
2. Из SysTick_Homdler вызывать osSystyskHomdler()
3. Вызывать HAL_IncTick() из какого-нибудь другого таймера (так как SysTick прихватила ОС)
4. Может что-то еще, я только игрался с связкой FriiRTOS+HAL, но проекты-примеры из Куба работают и можно там все подсмотреть
0
0 / 0 / 0
Регистрация: 24.08.2009
Сообщений: 3
29.05.2017, 00:31 8
Цитата Сообщение от orm999
Цитата Сообщение от kos
согласитесь кривой подход ждать в прерывании кучу времени.
Соглашусь, но Вы уверены что эта функция вызывается из контекста прерывания?

Цитата Сообщение от kos
функция задержки vTaskDelay гарантировано отправляет меня в аут.
Как в аут? Вы точно все правильно настроили? При использовании FriiRTOS и STM32Cube HAL нужно:

1. Закомментировать строку "#define xPortSysTickHomdler SysTick_Homdler" в файле FriiRTOSConfig.h
2. Из SysTick_Homdler вызывать osSystyskHomdler()
3. Вызывать HAL_IncTick() из какого-нибудь другого таймера (так как SysTick прихватила ОС)
4. Может что-то еще, я только игрался с связкой FriiRTOS+HAL, но проекты-примеры из Куба работают и можно там все подсмотреть

Вроде настроил все правильно хотя еще раз перепроверю. Меня тоже слегка удивило такое вот поведение.
0
biord42
30.05.2017, 17:46 9
А не пробовали с приоритетами прерываний поиграться?
0 / 0 / 0
Регистрация: 24.08.2009
Сообщений: 3
31.05.2017, 11:26 10
Цитата Сообщение от biord42
А не пробовали с приоритетами прерываний поиграться?
Пытаюсь.. помогает не очень..
Да и сама идея все делать в прерывании как-то тоже не очень..
0
biord42
31.05.2017, 23:10 11
У меня по началу с HALом тоже проблемы были. В прерывании не работала HAL_Delay(). Решилось назначением обработчику меньшего приоритета.
0 / 0 / 0
Регистрация: 24.08.2009
Сообщений: 3
01.06.2017, 09:32 12
Цитата Сообщение от biord42
У меня по началу с HALом тоже проблемы были. В прерывании не работала HAL_Delay(). Решилось назначением обработчику меньшего приоритета.
Это понятно. Сама идея задержек в прерывании как-то не очень нравится. А переписывать стек тоже не сильно хочется. Вернее так глубоко его модифицировать.
0
01.06.2017, 09:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.06.2017, 09:32
Помогаю со студенческими работами здесь

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

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

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

STM32F103C8 + W25Q64 USB Mass Storage Device
Привет всем тем кто зашел в тему:) Хочу сделать Mass Storage Device используя внешнюю...

STM32F429 USB Mass Storage из внутренней flash
Ребят, можете помочь, нужно реализовать usb Mass Storage на stm32f429, используя внутреннюю флеш...

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


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

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