Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F103 USB Mass Storage - как сделать автоперезагрузку
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
IanPo
Здравствуйте!
С наступающим вас!

Собственно, такой код:
Код
Set_System();
Set_USBClock();
USB_Interrupts_Config();
USB_Init();
while ( bDeviceState != CONFIGURED );
while ( pBUTTs2->IDR & FE_BUT_UM );    // крутим, пока кнопка не нажата
NVIC_SystemReset();


МК перезагружается по кнопке, только пока диск подключен в Windows.
Как только я его отключаю, на кнопку уже не реагирует sad.gif

Как сделать автоматическую перезагрузку МК при отключении?
Или скажите, хотя бы, в какую часть кода МК я попадаю при отключении диска в ОС (может, в прерывание или исключение какое-нибудь) !
A. Fig Lee
A должна по идее реагировать и с отключенным диском, мне кажется.
Да, в прерывание USB попадаете, причем многократно.
Надо смотреть USB код.
IanPo
Цитата(A. Fig Lee @ Dec 30 2014, 06:19) *
A должна по идее реагировать и с отключенным диском, мне кажется.

Нет, не должна, девайс уходит в Suspend.
Куда уходит управление, описано тут: http://forum.easyelectronics.ru/viewtopic....542&start=0
Коротко: в usb_istr.c есть переход в Suspend, если нет пакетов от хоста.
Решение:
main.c
Код
__IO bool DevWasConfigured = false;

Set_System();
Set_USBClock();
USB_Interrupts_Config();
USB_Init();
while ( bDeviceState != CONFIGURED );
DevWasConfigured = true;
while ( 1 );


usb_istr.c
extern __IO bool DevWasConfigured;

Код
#if (IMR_MSK & ISTR_SUSP)
  if (wIstr & ISTR_SUSP & wInterrupt_Mask)
  {
     if ( DevWasConfigured )    NVIC_SystemReset(); // <<<<<< вот это добавляем
    /* check if SUSPEND is possible */
    if (fSuspendEnabled)
    {
      Suspend();
    }
    else
    {
      /* if not possible then resume after xx ms */
      Resume(RESUME_LATER);
    }


Т.е., если девайс был сконфигурирован, а потом отключился, то МК перезагружается.
В случае сбоев он тоже перезагружается, что, наверное, неплохой вариант.

З.Ы. Альтернативное "решение" менять fSuspendEnabled на false приведет к тому, что USB-кабель надо будет подключать ДО переключения в режим USB (мой девайс переводится в режим флешки по кнопке). А так можно и до, и после, что удобнее и не приводит к появлению неопознанных USB-устройств.
З.Ы.2. Теперь девайс уже не перезагружается по кнопке, но у меня на случай сбоев есть еще кнопка Reset
A. Fig Lee
A при чем здесь Suspend()? Если в main loop кнопка по прежнему опрашивается?
IanPo
Цитата(A. Fig Lee @ Jan 2 2015, 05:12) *
A при чем здесь Suspend()? Если в main loop кнопка по прежнему опрашивается?

Кнопка опрашивается только до отключения диска в ОС - проверено.
Потом suspend и, если диск был отключен, оттуда уже не выходит.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.