Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по контроллеру прерывания STM32F103
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
misyachniy
Предисловие:
Микроконтроллер с помощью прерывания таймера и АЦП оцифровывает сигнал, вычисляет его амплитуду и фазу.
Для проверки алгоритма и статистической обработки введена функция съема данных в компьютер.
Съем данных через 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 не мешал?
Golikov A.
Ну можно сигналы АЦП забирать не по прерыванию, а через ДМА. А оттуда выгребать. В случае если повисаете в USB у вас там будет 2 отсчета, так будите видеть там 1 отсчет. Сделайте буфер с запасом, и пусть туда складываются данные. Время от время от времени проверяйте буфер, забирайте все оттуда и перезапускайте ДМА.

А так критическая секция не есть круто, это фактически запрет прерывания, но после нее прерывание должно сработать. Неужели программа сидит в критической секции дольше чем время между отсчетами? Тогда не сделав буфер вы от проблемы не избавитесь.

Лучше сразу на 2 каналах ДМА делать буфер кольцевым чтобы их не перенастраивать и следить какие значения вы уже считали и двигать указатель на свободные данные
Сергей Борщ
Цитата(Golikov A. @ Feb 5 2015, 18:59) *
Лучше сразу на 2 каналах ДМА делать буфер кольцевым
Сложно слишком. Кольевой на одном канале строится. Делится пополам и обработка каждой половины по флагам TCIF и HTIF. Даже указатель не нужен.
Golikov A.
как на одном? А как его с начала запустить?
Я знаю решение связанного запуска двух каналов, первый в конце запускает второй с начала, а второй опять первый, и так они по очереди как запустили в начале так и едут до конца. Можно как-то иначе?
Я не очень пока искушен в ДМА STM
Сергей Борщ
Цитата(Golikov A. @ Feb 5 2015, 20:26) *
как на одном? А как его с начала запустить?
У него битик есть "циклическая работа". Он сам перезапустится, наше дело только данные выгребать.
Golikov A.
спасибо, не знал. Так действительно гораздо удобнее.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.