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

 
 
> как организовать передачу данных по USB из прерывания
NikP
сообщение Sep 18 2014, 13:01
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 25-08-05
Пользователь №: 7 944



Есть устройство на STM32F207, которое периодически вводит данные с датчика (внешний АЦП) и передаёт во внешний ПК по виртуальному COM порту , фирмвара - на базе примера для STM322хG-EVAL. Когда передача идёт из главного модуля программы - всё работает, но передача происходит через разные интервалы времени - видно зависит от занятости шины USB.

Программа примерно такая:
CODE

app.c
{
....
int main(void)
{
while (1) {..DataIN_OUT_toUSB(...) }
}
....
}

usbd_cdc_vcp.c
{
....
DataIN_OUT_toUSB(...){...}
....
}



Чтобы опрос АЦП и передача шли через равные интервалы, я решил сделать прерывание от таймера ( с интервалом ~ 2 мс - времени должно с запасом хватить на преобразование ) и из него вызывать функцию передачи :

CODE

app.c
{
....
int main(void)
{
while (1) {}
}
....
}

usbd_cdc_vcp.c
{
....
DataIN_OUT_toUSB(...){...}
....

void TIM7_IRQHandler(void)
{
TIM7->SR &= ~TIM_SR_UIF; // reset interrupt flag

DataIN_OUT_toUSB(...)

TIM_Cmd(TIM7, ENABLE); // start TIM7
}
}


В результате передача по USB вообще прекратилась. По осциллографу вижу синхроимпульсы, т.е. прерывания происходят, по отладчику вижу, что программа заходит в функцию DataIN_OUT_toUSB. А вот передачи по шине просто нет. В чём может быть дело? Ведь таймер на время выполнения функции остановлен.






Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
NikP
сообщение Sep 18 2014, 17:43
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 168
Регистрация: 25-08-05
Пользователь №: 7 944



Согласен, что вопрос сформулирован достаточно косноязычно, но подробно расписывать (мне кажется) нет смысла - только место занимать.
Суть в следующем.
Написана фирмвара на основе примера STM. В программе есть функция DataIN_OUT_toUSB, которая опрашивает АЦП , пихает данные в массив на передачу по USB. Функция вызывается в модуле app.c ( обычно именуется main.с, но так сделано в примере - менять не стал), определена в модуле usbd_cdc_vcp.c. При этом всё работает - АЦП опрашивается, данные пихаются в буфер и идут наружу в ПК.
Изменил фирмвару - в модуле app.c оставил пустой цикл, а функцию стал вызывать из прерывания по таймеру из модуля usbd_cdc_vcp.c . Таймер сработал - вызвал функцию опроса АЦП, функция отработала, данные в буфере, снова запускается таймер. Всё прекрасно крутится - АЦП опрашивается, в буфер данные идут, а вот из буфера в USB не уходят. В чём может быть причина? Изменилось только то, что функция стала вызываться из другого места, сама она не изменилась.
Go to the top of the page
 
+Quote Post



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

 


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


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