Предисловие:
Микроконтроллер с помощью прерывания таймера и АЦП оцифровывает сигнал, вычисляет его амплитуду и фазу.
Для проверки алгоритма и статистической обработки введена функция съема данных в компьютер.
Съем данных через USB, переделан из примера USB CDC.
Суть вопроса:
При частоте сигнала около 6,5 кГц, обычно работает.
Если поднять частоту в 3 раза, соответственно и объем данных в три раза, то сбои становятся заметны.
Сбои проявляются в скачках фазы при обмене по USB.
Понятно что конфликт в прерываниях.
Поиск решения:
Почитал документацию на микроконтроллер.
Контроллер прерывания поддерживает вложенные прерывания с приоритетами, решения очевидно и стандартно.
Назначил прерываниям от USB более низкий приоритет(прописал большее число в регистр) - не помогло.
Нашел "особенность"
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
Как я понял, разрешается манипуляция приоритету по всему диапазону от 0 до 15
http://caxapa.ru/527021.htmlПредположил, что виноваты критические секции встречающиеся в USB
Код
ENTR_CRT_SECTION();
EXT_CRT_SECTION();
Отключать их в примерах от производителя не хочется.
теперь сижу и думаю - как организовать съем данных с АЦП, чтобы USB не мешал?