реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F103 USB Mass Storage - как сделать автоперезагрузку, Когда я отключаю диск в ОС, нужно вызвать в МК NVIC_SystemReset
IanPo
сообщение Dec 29 2014, 18:51
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 14-10-10
Пользователь №: 60 152



Здравствуйте!
С наступающим вас!

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


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

Как сделать автоматическую перезагрузку МК при отключении?
Или скажите, хотя бы, в какую часть кода МК я попадаю при отключении диска в ОС (может, в прерывание или исключение какое-нибудь) !
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Dec 30 2014, 03:19
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



A должна по идее реагировать и с отключенным диском, мне кажется.
Да, в прерывание USB попадаете, причем многократно.
Надо смотреть USB код.


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
IanPo
сообщение Jan 1 2015, 09:45
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 14-10-10
Пользователь №: 60 152



Цитата(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

Сообщение отредактировал IanPo - Jan 1 2015, 09:49
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jan 2 2015, 02:12
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



A при чем здесь Suspend()? Если в main loop кнопка по прежнему опрашивается?


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
IanPo
сообщение Jan 2 2015, 09:01
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 14-10-10
Пользователь №: 60 152



Цитата(A. Fig Lee @ Jan 2 2015, 05:12) *
A при чем здесь Suspend()? Если в main loop кнопка по прежнему опрашивается?

Кнопка опрашивается только до отключения диска в ОС - проверено.
Потом suspend и, если диск был отключен, оттуда уже не выходит.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 22:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01485 секунд с 7
ELECTRONIX ©2004-2016