Есть устройство на 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. А вот передачи по шине просто нет. В чём может быть дело? Ведь таймер на время выполнения функции остановлен.