Всем привет!
Нужен пинок в правильном направлении, надеюсь у кого-то нога не дрогнет)).
Столкнулся с такой проблеммой:
Цепляю к своему девайсу USB в режиме вертуального СОМ-порта.
Проект который взят за основу тут:
https://disk.yandex.ru/d/GLNuOZ8iJHjQIwПроект рабочий и эхо посылок в VCP работает.
Но стоит только сместить старт программы и перенести вектора прерываний на другой адрес
(в девайсе у меня есть загрузчик, рабочая программа запускается с 0х08003000),
как USB отваливается (не определяется VCP).
Причем все мои прерывания работают как и положено, т.е. таблица прерываний переносится корректно.
Что еще я не учитываю?
Еще раз:
Этот пример полностью рабочий, если закомментарить код:
Код:
__disable_irq();//__set_PRIMASK(1); //отключить все прерывания
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000); //перенести таблицу векторов прерываний по адресу START_ADDRESS_WITH_BOOTLOADER
__enable_irq();//__set_PRIMASK(0); //включить все прерывания
ps
при переносе старта программы и векторов на 0х08003000 не попадаю в условие
(не срабатывает точка останова)
из функции void USB_Istr(void)
Код:
if (wIstr & ISTR_SOF & wInterrupt_Mask)
{
_SetISTR((uint16_t)CLR_SOF);
bIntPackSOF++;
#ifdef SOF_CALLBACK
SOF_Callback();
#endif
}
проект делаю в Keil для STM32L151
Добавлено after 2 hours 19 minutes 42 seconds:"при переносе старта программы и векторов на 0х08003000 не попадаю в условие
(не срабатывает точка останова)"
Если быть точным, поведение софта после смещения векторов странное.
Если я ставлю точку останова внутри if (wIstr & ISTR_SOF & wInterrupt_Mask){},
то без смещения векторов она отрабатывается без проблем.
Смещаю на 0х08003000, то "на лету" она уже не срабатывает,
но если перед ним, например на строке wIstr = _GetISTR();
то после останова вхожу в это условие if (wIstr & ISTR_SOF & wInterrupt_Mask){}
...
как будто, скорость реакции не позволяет.... да не бред какой-то
ниже код void USB_Istr(void)