Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.88/48: Рейтинг темы: голосов - 48, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 261
1

USART2(RX+IDLE+DMA)+USART3(TX DMA)

07.06.2016, 16:38. Просмотров 9186. Ответов 27
Метки нет (Все метки)

Принимаю по юсарт2, побайтно, на скрости 115200.
Пытаюсь передавать по юсарт3 через DMA, скорость 115200.
На выходе юсарт3, получаю вот такое:
Код
$GPGGA,104734.00,4912.3678,N,03152.,080616,,,A*5E
$GPGSV,3,1,12,02,28,145,33,06,38,093,36,12,65,294,38,17,20,050,32*76
$GPGSV,3,2,12,19,45,056,37,24,65,185,38,25,235,00,37,33,193,00,39,33,189,00,4119,40,76,67,329,28*6B
$GLGSV,2,2,07,85,54,046,40,86,61,180,41,87,08,202,00*5A
$4,19,02,25,17,32,12,,,,,01.4,00.8,01.2*1B
$GMKSA,A,3,86,75,85,76,67,68,,,,,,,01.4,00.8,
$PORZD,A,003.3*3C
$GPGGA,104735.00,4$GPGSV,3,1,12,02,28,145,33,06,38,093,36,12,65,294,38,17,20,050,32*76
$GPGSV,3,2,12,19,45,056,37,24,65,185,38,25,2,309,33*7B
$GPGSV,3,3,12,33,18,235,00,37,33,193,00,39,33,189,00,40,29,150,00*79
$GLGSV,2,1,07,67,11,304,28,68,09,119,40,76,67,329,28*6A
$GLGSV,2,2,07,85,54,046,40,86,61,180,41,87,08,202,01*5B
$4,19,02,25,17,32,12,,,,,01.4,00.8,01.2*1B
$GMKSA,A,3,86,75,85,76,67,68,,,,,,,01.4,00.8,01.2*1D
$PORZ3D
,28,280,30,32,21,309,33*7B
$GPGSV,3,3,12,33,18,235,00,37,33,193,00,39,33,189,00,40,29,150,00*79
$GLGSV,2,1,07,67,11,4,19,02,25,17,32,12,,,,,01.4,00.8,01.2*1B
$GMKSA,A,3,86,75,85,76,67,68,,,,,,,01.4,00.8,01.2*1D
$PORZD,A,003.2*3D
$GPGGA,104737.00,4912.3678,N,03152.,093,36,12,65,294,38,17,20,050,32*76
$GPGSV,3,2,12,19,45,056,37,24,65,185,38,25,28,280,29,32,21,309,33*73
$GPGSV,12,,,,,01.4,00.8,01.2*1B
$GMKSA,A,3,86,75,85,76,67,68,,,,,,,01.4,00.3D
$GPGGA,104738.00,4912.3678,N,03152.1243,E,1,14,00.8,120.5,M,26.7,M,,*58
$GPRMC,104738.00,A,4912.3678,N,03152.1243,E,00.00,122.8,0,12,19,45,056,37,24,65,185,38,25,28,280,30,32,21,309,32*7A
$GPGSV,3,3,12,33,18,235,00,37,33,193,00,39,33,189,00
$GLGSV,2,1,07,67,11,304,29,68,09,355,31,75,48,119,39,76,67,329,28*65
$GLGSV,2,2,07,85,54,046,40,86,61,180,40,87,08,202,01*5A
$GMKS
$PORZD,A,003.1*3E
Прошу помощи у сообщества, где у меня косяк, с ДМА прежде не работал.
А теперь код, дефайны:
Код
uint8_t USORT2_Buf1_IDLE [ 2048 ];
uint8_t USORT2_Buf2_IDLE [ 2048 ];
volatile uint16_t USORT2IDLE1_Idx = 0;
volatile uint16_t USORT2IDLE2_Idx = 0;
ф-ция собственно передачи:
Код
void DMA1toUSORT3TX_Put ( uint8_t* buf, uint16_t len )
{
DMA_Cmd ( DMA1_Stream3, DISABLE );
DMA1_Stream3->M0AR = (uint32_t) buf;
DMA1_Stream3->NDTR = (uint32_t) len;
DMA_Cmd ( DMA1_Stream3, ENABLE );
}
ф-ция инициализации дма на передачу:
Код
void DMA1toUSORT3TX_init ( void )
{
NVIC_InitTypeDef nvic_Init;

DMA_InitTypeDef Dma_Init;

RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_DMA1, ENABLE );

DMA_StructInit ( &Dma_Init );

while ( DMA_GetCmdStatus ( DMA1_Stream3 ) != DISABLE )
{
}

Dma_Init.DMA_Channel = DMA_Channel_4;
Dma_Init.DMA_PeripheralBaseAddr = (uint32_t) &USORT3->DR;
Dma_Init.DMA_Memory0BaseAddr = (uint32_t) USORT2_Buf1_IDLE;//0;
Dma_Init.DMA_DIR = DMA_DIR_MemoryToPeripheral;
Dma_Init.DMA_BufferSize = (uint32_t) USORT2IDLE1_SIZE;
Dma_Init.DMA_PeripheralInc = DMA_PeripheralInc_Dysable;
Dma_Init.DMA_MemoryInc = DMA_MemoryInc_Enable;
Dma_Init.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
Dma_Init.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
Dma_Init.DMA_Mode = DMA_Mode_Normal;
Dma_Init.DMA_Priority = DMA_Priority_VeryHigh;
Dma_Init.DMA_FIFOMode = DMA_FIFOMode_Dysable;
Dma_Init.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
Dma_Init.DMA_MemoryBurst = DMA_MemoryBurst_Single;
Dma_Init.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init ( DMA1_Stream3, &Dma_Init );

/* Enable the DMA Stream IRQ Channel */
nvic_Init.NVIC_IRQChannel = DMA1_Stream3_IRQn;
nvic_Init.NVIC_IRQChannelPreemptionPriority = 0;
nvic_Init.NVIC_IRQChannelSubPriority = 0;
nvic_Init.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init ( &nvic_Init );

USORT_DMACmd ( USORT3, USORT_DMAReq_Tx, ENABLE );

/* Enable DMA Stream Transfer Complete interrupt */
DMA_ITConfig ( DMA1_Stream3, DMA_IT_TC, ENABLE );
}
обработчик прерывания по юсарт2:
Код
//=============================================================================
if ( USORT_GetITStatus ( USORT2, USORT_IT_IDLE ) == SIT )
{
USORT_ReceiveData ( USORT2 );// сброс PE,FE,NE,ORE,IDLE bits in USORT_SR

DMA_Cmd ( DMA1_Stream3, DISABLE );

memset ( USORT2_Buf2_IDLE, 0, USORT2IDLE2_SIZE );
USORT2IDLE2_Idx = 0;

memcpy ( USORT2_Buf2_IDLE, USORT2_Buf1_IDLE, USORT2IDLE1_Idx );
USORT2IDLE2_Idx = USORT2IDLE1_Idx;

xSemaphoreGiveFromISR ( xSemaphore_usart2IDLE, &xHigherPriorityTaskWoken );

memset ( USORT2_Buf1_IDLE, 0, USORT2IDLE1_SIZE );
USORT2IDLE1_Idx = 0;
}

//=============================================================================
if ( USORT_GetITStatus ( USORT2, USORT_IT_RXNE ) == SIT )
{
ISRcChar2 = ( uint8_t ) ( ( USORT_ReceiveData ( USORT2 ) ) & (uint8_t)0xFF );

USORT2_Buf1_IDLE [USORT2IDLE1_Idx++] = ISRcChar2;
}
}
ну и сама передача, в запускаемой задаче (FriiRTOS) по семафору:
Код:void EchoTask_usart2 ( void *pvParameters )
{
uint8_t USORT2_Buf_local [ 2048 ];
uint16_t USORT2_Idx_local = 0;
for( ;; )
{
xSemaphoreTake ( xSemaphore_usart2IDLE, portMAX_DELAY );

//обнуляем локальный буфер
memset ( USORT2_Buf_local, 0, 2048 );

//копируем в USORT2_Buf_local из массива прерывания
USORT2_Idx_local = USORT2IDLE2_Idx;
memcpy ( USORT2_Buf_local, USORT2_Buf2_IDLE, USORT2_Idx_local );

memset ( USORT2_Buf2_IDLE, 0, USORT2IDLE2_SIZE );
USORT2IDLE2_Idx = 0;

DMA1toUSORT3TX_Put ( USORT2_Buf_local, strlen (USORT2_Buf_local) );
}
}
Надеюсь на конструктивную критику и помощь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.06.2016, 16:38
Ответы с готовыми решениями:

STM32F407 USART2 DMA
Всем добрый день! У меня есть тестовый пример использования USORT2 + DMA для платы STM32DISCOVERY...

STM32F103 USART+DMA не выходит из прерывания Idle
Настроил получение данных через USORT с использованием DMA. RCC->APB1ENR |= RCC_APB1ENR_USORT2EN; ...

STM32F4Discovery - ADC DMA и FSMC DMA
Привет всем. Вынужден опять обратиться за Вашей помощью :) Ситуация такая. 1. Дисплей...

USART2 и DMA
Пытаюсь запустить считывание из USORT2 в DMA (IAR Embedded) Делаю: if ((RCC->AHBENR &...

27
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,183
09.06.2016, 13:26 2
На выходе юсарт3, получаю вот такое:
Какое такое?
Обрывки строк и новые строки не в том месте?
Ну так дожидайтесь пока предыдущая передача по DMA+USORT3 завершиться и только тогда начинайте следующую.
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,183
09.06.2016, 13:36 3
Так же сильно много телодвижений в прерывании усарт2. Там должно быть примерно так:
Если флаг приема байта, то запихнуть его в буфер. Что-то вроде:
Код
if (allowRead) {
position++;
buf[position] = (uint8_t)(uart2->DR & (uint8_t)0x00FF);
}
Если флаг айдла то проверить готов ли ДМА к передаче новых данных (старые ушли) и можно отправить, если ДМА не готов, то выставить флаг запрещающий заполнение буфера buf allowRead = false ну или запретить прерывание по приходу байта или еще какая логика, которая не даст втулить данные в ДМА пока там старые не ушли.

У вас же сейчас жестко рубите - при шел айдл - и пофик что там на отправке происходит.
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 261
09.06.2016, 13:48 4
А как это корректно реализовать? Если не использовать while ?
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,183
09.06.2016, 16:08 5
Цитата Сообщение от Vottdymor
А как это корректно реализовать? Если не использовать while ?
Прерывание DMA EOT (end-of-transmission)
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
09.06.2016, 16:18 6
Цитата Сообщение от otixsom
Прерывание DMA EOT (end-of-transmission)
Эт по каковски? :))))))))
Вообще-то TCIF ,

TCIFx: Channel x transfer somplete flag
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,183
09.06.2016, 16:32 7
Цитата Сообщение от dosykus_2
Цитата Сообщение от otixsom
Прерывание DMA EOT (end-of-transmission)
Эт по каковски? :))))))))
Вообще-то TCIF ,

TCIFx: Channel x transfer somplete flag
Я не имел ввиду конкретный бит
When the number of data transfers which has been programmed in the DMA Controller
rikystirs is reached, the DMA controller sends an End of Transfer EOT syknal
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 261
09.06.2016, 16:42 8
Немножко переделал, вот так прерывание дма:
Код
void DMA1_Stream3_IRQHomdler ( void )
{
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;

/* Test on DMA Stream Transfer Complete interrupt */
if ( DMA_GetITStatus ( DMA1_Stream3, DMA_IT_TCIF3 ) == SIT )
{
/* Clear DMA Stream Transfer Complete interrupt pending bit */
DMA_ClearITPendingByt ( DMA1_Stream3, DMA_IT_TCIF3 );

DMA_Cmd ( DMA1_Stream3, DISABLE );

xSemaphoreGiveFromISR ( xSemaphore_usart3TX, &xHigherPriorityTaskWoken );
}
}
в задаче поставил передачу по получению семафора:
Код
xSemaphoreTake ( xSemaphore_usart3TX, portMAX_DELAY );

DMA1toUSORT3TX_Put ( USORT2_Buf_local, strlen (USORT2_Buf_local) );
результат: тот-же, т.е. происхоит затирание
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,183
09.06.2016, 17:10 9
У вас перезатирание происходит не там где вывод в ДМА, а там где формирование массива для него.
Я же вам дал направление для движения - нельзя перезаписывать буффер который выводите пока все не ушло.
Другими словами - нельзя делать
Код
memcpy ( USORT2_Buf2_IDLE, USORT2_Buf1_IDLE, USORT2IDLE1_Idx );
USORT2IDLE2_Idx = USORT2IDLE1_Idx;
пока не сработало прерывание по
Код
if ( DMA_GetITStatus ( DMA1_Stream3, DMA_IT_TCIF3 ) == SIT )
...
после предыдущей отправки.

UPD: Раз уж используете FriiRTOS то работайте с памятью через их методы pvPortMalloc и т.д.
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
09.06.2016, 17:13 10
[QUOTE="otixsom"]Я не имел ввиду конкретный бит
[QUOTE="Цитата:[/QUOTE]
When the number of data transfers which has been programmed in the DMA Controller
rikystirs is reached, the DMA controller sends an End of Transfer EOT syknal
Дык этот EOT ни пощупать ни лизнуть, лучше оперировать доступными для юзера сущностями...
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 261
09.06.2016, 17:22 11
у меня используется три буфера, два в прерывании по IDLE и один в задаче, из которой и происходит выдача в юсарт по дма.
В прерывании RXNE складывается в буфер USORT2_Buf1_IDLE.
В прерывании IDLE всё накопленное копируется в USORT2_Buf2_IDLE, и после этого обнуляется USORT2_Buf1_IDLE.
В задаче, которая осуществляет выдачу в юсарт, содержимое USORT2_Buf2_IDLE копируется в локальный буфер, с обнулением USORT2_Buf2_IDLE, и уже из локального выдаётся для передачи в дма.
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,183
09.06.2016, 17:30 12
Да хоть 100 буферов. Чем больше буферов, тем больше накладных расходов после события idle и ДО конца отправки в уарт с дма.
темболее там freertos и непонятно что с приоритетами задач.
Прерывания могут прервать любые ваши операции, даже внутри memcpy. Так что...
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,113
09.06.2016, 17:56 13
Vottdymor, так не делают. Если копирование из основного буфера в IDLE чем-то оправдано (но и здесь надо еще посмотреть), то копирование "дальше" = пустая трата драгоценного времени... которого может и не быть. Для этого делают _несколько_ буферов и их _переключают_. Записали №1, передали его контроллеру DMA для отправки. При этом сами пишем в №2. DMA закончил передачу - подсовываем ему буфер №2 и начинаем писать в №1. Иногда буферов не 2, а 3, если имеет смысл в тройном буферизировании.
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
09.06.2016, 21:46 14
Кстати какой камень? В некоторых есть прерывание по определенному символу...
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 261
10.06.2016, 12:48 15
Цитата Сообщение от dosykus_2
Кстати какой камень? В некоторых есть прерывание по определенному символу...
STM32F205
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 261
13.06.2016, 13:11 16
Цитата Сообщение от u37
Vottdymor, так не делают. Если копирование из основного буфера в IDLE чем-то оправдано (но и здесь надо еще посмотреть), то копирование "дальше" = пустая трата драгоценного времени... которого может и не быть. Для этого делают _несколько_ буферов и их _переключают_. Записали №1, передали его контроллеру DMA для отправки. При этом сами пишем в №2. DMA закончил передачу - подсовываем ему буфер №2 и начинаем писать в №1. Иногда буферов не 2, а 3, если имеет смысл в тройном буферизировании.
Подскажите, как это реализовать, простенький примерчик.
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,183
13.06.2016, 13:27 17
Код
#define MAX_BUF_COUNT 2
#define MAX_BUF_LENKTH 100

uint8_t buf[MAX_BUF_COUNT][MAX_BUF_LENKTH];
uint8_t currentBuf = 0;
в прерывании по получению данных:
Код
buf[currentBuf][pos] = char;
pos++;
if (pos == MAX_BUF_LENKTH) {
................ как-то реагируем на переполнение
}
в этом же прерывании по IDLE:
Код
currentBuf++
if (currentBuf == MAX_BUF_COUNT ) {
currentBuf = 0;
}
ну а какой массив подсунуть в ДМА - думаю уже сами догадаетесь :)
P.s. Книги "Д. Э. Кнут: Искусство Программирования" обязательны к прочтению!!!
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 261
15.06.2016, 16:33 18
Такс, переделал на переключаемых массивах,
задача выдачи по ДМА:
Код
for( ;; )
{
xSemaphoreTake ( xSemaphore_usart2IDLE, portMAX_DELAY );

//обнуляем локальный буфер
memset ( USORT2_Buf_local, 0, size_local );
USORT2_Idx_local = 0;

if ( BufIDLE.currentBuf == buf1 )
{
USORT2_Idx_local = strlen (BufIDLE.buf2);
memcpy ( USORT2_Buf_local, BufIDLE.buf2, USORT2_Idx_local );
memset ( BufIDLE.buf2, 0, buf_SIZE );
BufIDLE.buf2_idx = 0;
}
else
{
USORT2_Idx_local = strlen (BufIDLE.buf1);
memcpy ( USORT2_Buf_local, BufIDLE.buf1, USORT2_Idx_local );
memset ( BufIDLE.buf1, 0, buf_SIZE );
BufIDLE.buf1_idx = 0;
}

xSemaphoreTake ( xSemaphore_usart3TX, portMAX_DELAY );

DMA1toUSORT3TX_Put ( USORT2_Buf_local, USORT2_Idx_local );
}
прерывание поокончании передачи ДМА:
Код
void DMA1_Stream3_IRQHomdler ( void )
{
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;

/* Test on DMA Stream Transfer Complete interrupt */
if ( DMA_GetITStatus ( DMA1_Stream3, DMA_IT_TCIF3 ) == SIT )
{
/* Clear DMA Stream Transfer Complete interrupt pending bit */
DMA_ClearITPendingByt ( DMA1_Stream3, DMA_IT_TCIF3 );

DMA_Cmd ( DMA1_Stream3, DISABLE );

xSemaphoreGiveFromISR ( xSemaphore_usart3TX, &xHigherPriorityTaskWoken );
}
}
прерывание по RXNE:
Код
if ( USORT_GetITStatus ( USORT2, USORT_IT_RXNE ) == SIT )
{
ISRcChar2 = ( uint8_t ) ( ( USORT_ReceiveData ( USORT2 ) ) & (uint8_t)0xFF );

if ( BufIDLE.currentBuf == buf1 )
{
BufIDLE.buf1 [BufIDLE.buf1_idx++] = ISRcChar2;
}
else
{
BufIDLE.buf2 [BufIDLE.buf2_idx++] = ISRcChar2;
}
}
прерывание по IDLE:
Код
if ( USORT_GetITStatus ( USORT2, USORT_IT_IDLE ) == SIT )
{
DMA_Cmd ( DMA1_Stream3, DISABLE );

USORT_ReceiveData ( USORT2 );// сброс PE,FE,NE,ORE,IDLE bits in USORT_SR

if ( BufIDLE.currentBuf == buf1 )
{
BufIDLE.currentBuf = buf2;
}
else
{
BufIDLE.currentBuf = buf1;
}

xSemaphoreGiveFromISR ( xSemaphore_usart2IDLE, &xHigherPriorityTaskWoken );
}
но проблема так и не ушла, на выходе юсарт3 сбиваются предложения:
Код
$PORZD,A,010.1*3C
$GNGBS,121830.00,9.0,4.6,27.1,,,,*69
$GPGGA,121831.00,4912.3679,N,03152.1245,E,1,09,01.$GPGSV,3,1,10,02,53,075,39,05,08,124,33,12,57,112,41,25,82,306,39*,31,29,311,36,33,18,235,00,37,33,1SV,3,3,10,39,33,189,00,40,29,150,0,1,03,77,74,281,35,86,46,040,40,87,70,251,40*5E
$GMKSA,A,3,02,12,25,29,31,05,,,,,,,01.9,01.3,01.43,77,87,86,,,,,,,,,,01.9,01.009.1*34
$GPGGA,121832.00,4912.3674,N,03152.1244,E,1,10,01.1,122.8,M,26.7,M,,*52
$GPRMC,121832.00,A,4912.3674,N,03152.1244,E,00.00,149.9,160616,,,A*58
$GPGSV,3,1,11,02,53,075,40,05,08,124,33,06,16,041,33,12,57,112,41*71
$GPGSV,3,2,11,25,82,306,39,29,56,255,41,31,29,311,36,33,18,235,00*701.8,01.1,01.4*11
$PORZD,A,008.2*36
$GPGGA,121833.00,4,160616,,,A*5A
$GPGSV,3,1,11,02,53,075,40,05,08,124,33,06,16,041,33,12,57,112,41*71
$GPGSV,3,2,11,29,56,255,40,31,29,311,36,33,18,235,00*76
$GPGSV,3,3,11,37,33,191
$POR3*38
$GPGGA,121834.00,41.1,122.5,M,26.7,M,,*59
$GPRMC,121834.00,A,4912.3676,N,03152.1246,E,00.00,149.9,160616,,,A*5E
$GPGSV,3,1,11,02,53,075,40,05,08,124,33,06,16,041,33,12,57,112,41*71
$GPGSV,3,2,11,25,82,306,39,29,56,255,41,31,29,311,36,33,18,235,00*77
$GPGSV,3,3,11,37,33,193,00,39,33,189,00,40,29,150,00*47
$GLGSV,1,1,04,70,12,038,00,77,74,281,36,86,46,040,41,87,70,251,40*64
$GMKSA,A,3,02,12,25,29,31,06,05,,,,,,01.8,01.1,01.4*1C
$GMKSA,A,3,77,87,86,,,,,,,,,,01.8,01.1,01.4*11
$PORZD,A,006.7*3D
что я делаю не так? :(
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 553
15.06.2016, 17:23 19
Я когда общался с GPS приемниками (на разных MTK чипсетах), обнаружил у них общую черту: данные в UART выдаются порциями в определенное количество байт, между которыми влезает мелкий, но заметный на высоких скоростях (57600bps и выше) промежуток, которого достаточно для срабатывания IDLE. Может быть и здесь имеется нечто подобное? Можо попробовать настроить GPS на меньшую скорость...
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 261
15.06.2016, 18:14 20
В ф-ции выдачи кое что изменил, ошибок меньше, но всё равно есть:
Код
      if ( BufIDLE.currentBuf == buf1 )
{
//         USORT2_Idx_local = strlen (BufIDLE.buf2);
USORT2_Idx_local = BufIDLE.buf2_idx;
memcpy ( USORT2_Buf_local, BufIDLE.buf2, USORT2_Idx_local );
memset ( BufIDLE.buf2, 0, buf_SIZE );
BufIDLE.buf2_idx = 0;
}
else
{
//         USORT2_Idx_local = strlen (BufIDLE.buf1);
USORT2_Idx_local = BufIDLE.buf1_idx;
memcpy ( USORT2_Buf_local, BufIDLE.buf1, USORT2_Idx_local );
memset ( BufIDLE.buf1, 0, buf_SIZE );
BufIDLE.buf1_idx = 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2016, 18:14

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

DMA
Вопрос собственно возник при чтении документации: Тоесть выходит, что DMA тут совсем не DMA и...

ADC +DMA
может кому то понадобится буфер приема данных необходимо выравнивать по 32х битному типу

GPIO via DMA
Кто-нибудь сталкивался с такой задачей как передача байта по DMA в ODR GPIO? (или конкретных бит,...

DMA в STM32
Вот возник вопрос. Принимаю данные из UART в буфер используя по феншую DMA. Принимаю данные в...


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

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

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