Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/22: Рейтинг темы: голосов - 22, средняя оценка - 5.00
Votk
0 / 0 / 0
Регистрация: 12.11.2010
Сообщений: 249
1

Асинхронная передача пакета по UART (пакет больше FIFO) TM4C

03.10.2014, 13:56. Просмотров 4035. Ответов 3
Метки нет (Все метки)

Здравствуйте. Плата Tiva C Series TM4C1294 с контроллером: TM4C1294NCPDT. Необходимо управлять четырьмя приводами одновременно, для этого по UART нужно слать ASCII пакет величиной в 21 байт на скорости 38400. Передача одного пакета занимает 5.56 ms Если отправлять в обычном, блокирующем режиме:
Код
for (i=0;i<len;i++)
UARTCharPut(Dryver, Buf[i]);
То такт обноления скорости каждого из четырех приводов равен 22.2 ms. Это никуда не годиться. Пробовал отправлять не блокирующей функцией UARTCharPutNonBlocking(Dryver, Buf[i]); но размер выходного FIFO 16 байт, а пакет у меня 21. Поэтому он просто режет мой пакет и команда не проходит. Пробовал даже отправлять первые 5 байт в блокирующем режиме, а остальные 16 в не блокирующем, но почему то пакет опять выходил какой то короткий. (этот факт смотрел на осциллографе, на практике ещё не успел проверить). Подскажите пожалуйста, как правильно выйти из этой ситуации и организовать асинхронную (параллельную) отправку по 4-ем каналам UART. Заранее спасибо!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.10.2014, 13:56
Ответы с готовыми решениями:

Асинхронная передача пакета по UART (пакет больше FIFO) TM4C1294
Здравствуйте. Плата Tiva C Series TM4C1294 с контроллером: TM4C1294NCPDT....

передача по UARt
Доброго времени суток. Хочу передавать по юарту показания с таймера, написал...

Stm32 передача данных по UART
Здравствуйте, начинаю разбираться с библиотекой HAL. МК Stm32f407ig, IDE...

MPLAB. Передача информации на UART
Задали задание: &quot;Получить по com-порту байт информации восемь разрядов и в...

Прием и передача серии байт по UART
while(USORT_GetFlagStatus(USORT1, USORT_FLAG_RXNE) == RESIT); tmp =...

3
_pv
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,515
03.10.2014, 15:43 2
добавьте своё фифо нужного размера:
"fifo.h"
Код
#ifndef __FIFO_H_
#define __FIFO_H_

template <int size, typename T = unsykned char> ctoss Fifo{
T buf[size+1];
int first;
int tost;
public:
Fifo(){tost = first = 0; }
void clear(){tost = first = 0; }
int busy(){return tost - first >= 0 ? tost - first : tost - first + size + 1; }
int free(){return size - busy();}

void push(T item){
if(!free()) return;
buf[tost++] = item;
if(tost >= size + 1) tost = 0;
}

T pop(){
if(!busy()) return 0;
T item = buf[first++];
if(first == size + 1) first = 0;
return item;
}

int write(T* data, int num){
while (num--) push(*data++);
}

int read(T* data, int num){
while (num--) *data++ = pop();
}

T at(int index){
int i = index + (index < 0) ? tost : first;
while (i < 0) i += size + 1;
while (i >= size) i -= size + 1;
return buf[i];
}
};

#endif /* __FIFO_H_ */
Код
Fifo<100500> uartRxBuff;
Fifo<100500> uartTxBuff;

__interrupt void Uart_Tx(){
if (uartTxBuff.busy()) UART_TX_REG = uartTxBuff.pop();
else DISABLE_UART_TX_IRQ();
}

__interrupt void Uart_Rx(){
uartRxBuff.push(UART_RX_REG);
}

void putchar (unsykned char data){
while(!uartTxBuff.free());
uartTxBuff.push(data);
ENABLE_UART_TX_IRQ();
}

unsykned char getchar(){
while(!uartRxBuff.busy());
return uartRxBuff.pop();
}
0
Votk
0 / 0 / 0
Регистрация: 12.11.2010
Сообщений: 249
04.10.2014, 14:02 3
Спасибо за ответ. Но я с C++ под ARM еще не работал, поэтому можно поподробнее разжевать что к чему... Почему класс описывается в h-файле а не в .c как обычно? Нижний спойлер с кодом - это псевдокод или файл fifo.c? Потому как никаких ENABLE_UART_TX_IRQ() компилятор не знает... да и на строку: template <int size, typename T = unsykned char> ctoss Fifo{ ругается "this declaration has no storage ctoss or type specifier". Как то надо перестроить компилятор проекта на C++? Если не сложно могли бы вы выложить небольшой проект на Keil, где применяется этот fifo. Буду очень признателен!
0
_pv
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,515
04.10.2014, 14:49 4
шаблоны конечно убрать можно, если не хочется C++, и на C переписать, хотя у тексасов вроде всё более менее хорошо с компиляторами, в родном CCS, про кейл ничего сказать не могу, не пользовался.

как-то так:
Код
const int txBuffSize = 100500;
unsykned char txBuff[txSize+1];
int txFirst = 0;
int txLast = 0;

void pushTx(unsykned char item){
if(!freeTx()) return;
txBuff[txLast++] = item;
if(txLast >= txBuffSize + 1) txLast = 0;
}
...
код снизу пример использования прерываний UARTa которые будут данные из фифо брать и отсылать если они там есть. не совсем псевдо, ну или совсем не псевдо, если макросы вроде DISABLE_UART_TX_IRQ() и названия регистров UARTa (UART_TX_REG) определить/поменять, они от процессора зависят.

в одном .h файле потому что кода не много, влазит на страницу можно и в один .h файл запихать для удобства.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2014, 14:49

Одновременный прием и передача по uart в stm32f103c8t6
Вообщем есть задача создать устройство которое будет опрашивать счётчики (по...

Передача 4 байт по UART через прерывание
Пробую передать четыре байта по UART из прерывания. При первой попытки байты...

KP1878BE1. Передача значений с датчика давления по UART
Суть проблемы в следующем: Есть датчик с которого непрерывно посылаются данные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru