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

 
 
 
Reply to this topicStart new topic
> Вопрос по контроллеру прерывания STM32F103
misyachniy
сообщение Feb 5 2015, 16:42
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 716
Регистрация: 27-05-05
Из: Kyiv
Пользователь №: 5 454



Предисловие:
Микроконтроллер с помощью прерывания таймера и АЦП оцифровывает сигнал, вычисляет его амплитуду и фазу.
Для проверки алгоритма и статистической обработки введена функция съема данных в компьютер.
Съем данных через 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 не мешал?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 5 2015, 16:59
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Ну можно сигналы АЦП забирать не по прерыванию, а через ДМА. А оттуда выгребать. В случае если повисаете в USB у вас там будет 2 отсчета, так будите видеть там 1 отсчет. Сделайте буфер с запасом, и пусть туда складываются данные. Время от время от времени проверяйте буфер, забирайте все оттуда и перезапускайте ДМА.

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

Лучше сразу на 2 каналах ДМА делать буфер кольцевым чтобы их не перенастраивать и следить какие значения вы уже считали и двигать указатель на свободные данные
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 5 2015, 18:05
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Golikov A. @ Feb 5 2015, 18:59) *
Лучше сразу на 2 каналах ДМА делать буфер кольцевым
Сложно слишком. Кольевой на одном канале строится. Делится пополам и обработка каждой половины по флагам TCIF и HTIF. Даже указатель не нужен.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 5 2015, 18:26
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



как на одном? А как его с начала запустить?
Я знаю решение связанного запуска двух каналов, первый в конце запускает второй с начала, а второй опять первый, и так они по очереди как запустили в начале так и едут до конца. Можно как-то иначе?
Я не очень пока искушен в ДМА STM
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 5 2015, 18:32
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Golikov A. @ Feb 5 2015, 20:26) *
как на одном? А как его с начала запустить?
У него битик есть "циклическая работа". Он сам перезапустится, наше дело только данные выгребать.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 5 2015, 18:37
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



спасибо, не знал. Так действительно гораздо удобнее.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:08
Рейтинг@Mail.ru


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