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

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

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

Студворк — интернет-сервис помощи студентам
Принимаю по юсарт2, побайтно, на скрости 115200.
Пытаюсь передавать по юсарт3 через DMA, скорость 115200.
На выходе юсарт3, получаю вот такое:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$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
Прошу помощи у сообщества, где у меня косяк, с ДМА прежде не работал.
А теперь код, дефайны:
Code
1
2
3
4
uint8_t USORT2_Buf1_IDLE [ 2048 ];
uint8_t USORT2_Buf2_IDLE [ 2048 ];
volatile uint16_t USORT2IDLE1_Idx = 0;
volatile uint16_t USORT2IDLE2_Idx = 0;
ф-ция собственно передачи:
Code
1
2
3
4
5
6
7
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 );
}
ф-ция инициализации дма на передачу:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//=============================================================================
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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.06.2016, 16:38
Ответы с готовыми решениями:

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

USART DMA IDLE
Всем салют! Решил по-разбирать работу DMA из снипета от ST: __INLINE void Configure_DMA1(void) { /* Enable the peripheral...

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

27
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
09.06.2016, 13:26
На выходе юсарт3, получаю вот такое:
Какое такое?
Обрывки строк и новые строки не в том месте?
Ну так дожидайтесь пока предыдущая передача по DMA+USORT3 завершиться и только тогда начинайте следующую.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
09.06.2016, 13:36
Так же сильно много телодвижений в прерывании усарт2. Там должно быть примерно так:
Если флаг приема байта, то запихнуть его в буфер. Что-то вроде:
Code
1
2
3
4
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
А как это корректно реализовать? Если не использовать while ?
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
09.06.2016, 16:08
Цитата Сообщение от Vottdymor
А как это корректно реализовать? Если не использовать while ?
Прерывание DMA EOT (end-of-transmission)
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
09.06.2016, 16:18
Цитата Сообщение от otixsom
Прерывание DMA EOT (end-of-transmission)
Эт по каковски? :))))))))
Вообще-то TCIF ,

TCIFx: Channel x transfer somplete flag
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
09.06.2016, 16:32
Цитата Сообщение от 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
Немножко переделал, вот так прерывание дма:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 );
}
}
в задаче поставил передачу по получению семафора:
Code
1
2
3
xSemaphoreTake ( xSemaphore_usart3TX, portMAX_DELAY );
 
DMA1toUSORT3TX_Put ( USORT2_Buf_local, strlen (USORT2_Buf_local) );
результат: тот-же, т.е. происхоит затирание
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
09.06.2016, 17:10
У вас перезатирание происходит не там где вывод в ДМА, а там где формирование массива для него.
Я же вам дал направление для движения - нельзя перезаписывать буффер который выводите пока все не ушло.
Другими словами - нельзя делать
Code
1
2
memcpy ( USORT2_Buf2_IDLE, USORT2_Buf1_IDLE, USORT2IDLE1_Idx );
USORT2IDLE2_Idx = USORT2IDLE1_Idx;
пока не сработало прерывание по
Code
1
2
if ( DMA_GetITStatus ( DMA1_Stream3, DMA_IT_TCIF3 ) == SIT )
...
после предыдущей отправки.

UPD: Раз уж используете FriiRTOS то работайте с памятью через их методы pvPortMalloc и т.д.
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
09.06.2016, 17:13
[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
у меня используется три буфера, два в прерывании по IDLE и один в задаче, из которой и происходит выдача в юсарт по дма.
В прерывании RXNE складывается в буфер USORT2_Buf1_IDLE.
В прерывании IDLE всё накопленное копируется в USORT2_Buf2_IDLE, и после этого обнуляется USORT2_Buf1_IDLE.
В задаче, которая осуществляет выдачу в юсарт, содержимое USORT2_Buf2_IDLE копируется в локальный буфер, с обнулением USORT2_Buf2_IDLE, и уже из локального выдаётся для передачи в дма.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
09.06.2016, 17:30
Да хоть 100 буферов. Чем больше буферов, тем больше накладных расходов после события idle и ДО конца отправки в уарт с дма.
темболее там freertos и непонятно что с приоритетами задач.
Прерывания могут прервать любые ваши операции, даже внутри memcpy. Так что...
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
09.06.2016, 17:56
Vottdymor, так не делают. Если копирование из основного буфера в IDLE чем-то оправдано (но и здесь надо еще посмотреть), то копирование "дальше" = пустая трата драгоценного времени... которого может и не быть. Для этого делают _несколько_ буферов и их _переключают_. Записали №1, передали его контроллеру DMA для отправки. При этом сами пишем в №2. DMA закончил передачу - подсовываем ему буфер №2 и начинаем писать в №1. Иногда буферов не 2, а 3, если имеет смысл в тройном буферизировании.
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
09.06.2016, 21:46
Кстати какой камень? В некоторых есть прерывание по определенному символу...
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 261
10.06.2016, 12:48
Цитата Сообщение от dosykus_2
Кстати какой камень? В некоторых есть прерывание по определенному символу...
STM32F205
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 261
13.06.2016, 13:11
Цитата Сообщение от u37
Vottdymor, так не делают. Если копирование из основного буфера в IDLE чем-то оправдано (но и здесь надо еще посмотреть), то копирование "дальше" = пустая трата драгоценного времени... которого может и не быть. Для этого делают _несколько_ буферов и их _переключают_. Записали №1, передали его контроллеру DMA для отправки. При этом сами пишем в №2. DMA закончил передачу - подсовываем ему буфер №2 и начинаем писать в №1. Иногда буферов не 2, а 3, если имеет смысл в тройном буферизировании.
Подскажите, как это реализовать, простенький примерчик.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
13.06.2016, 13:27
Code
1
2
3
4
5
#define MAX_BUF_COUNT 2
#define MAX_BUF_LENKTH 100
 
uint8_t buf[MAX_BUF_COUNT][MAX_BUF_LENKTH];
uint8_t currentBuf = 0;
в прерывании по получению данных:
Code
1
2
3
4
5
buf[currentBuf][pos] = char;
pos++;
if (pos == MAX_BUF_LENKTH) {
................ как-то реагируем на переполнение
}
в этом же прерывании по IDLE:
Code
1
2
3
4
currentBuf++
if (currentBuf == MAX_BUF_COUNT ) {
currentBuf = 0;
}
ну а какой массив подсунуть в ДМА - думаю уже сами догадаетесь :)
P.s. Книги "Д. Э. Кнут: Искусство Программирования" обязательны к прочтению!!!
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 261
15.06.2016, 16:33
Такс, переделал на переключаемых массивах,
задача выдачи по ДМА:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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 );
}
прерывание поокончании передачи ДМА:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
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:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 сбиваются предложения:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$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
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 553
15.06.2016, 17:23
Я когда общался с GPS приемниками (на разных MTK чипсетах), обнаружил у них общую черту: данные в UART выдаются порциями в определенное количество байт, между которыми влезает мелкий, но заметный на высоких скоростях (57600bps и выше) промежуток, которого достаточно для срабатывания IDLE. Может быть и здесь имеется нечто подобное? Можо попробовать настроить GPS на меньшую скорость...
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 261
15.06.2016, 18:14
В ф-ции выдачи кое что изменил, ошибок меньше, но всё равно есть:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
      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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.06.2016, 18:14
Помогаю со студенческими работами здесь

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

stm32f407+ADC+DMA. Проблема с DMA
Доброго дня! Новичок в stm, первый проект, начальные наброски, не понимаю,почему не работает эта связка(в заголовке). Есть несколько...

ADC->DMA->SDIO (или NAND через FSMC) без остановки в обработчике прерываний DMA на STM32F407VG, реально или нет?
Добрый день. Столкнулся с необходимостью писать большой объём данных АЦП с высокой скоростью. Каналов 8. Частота АЦП максимальная. ...

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

Понимание связки PCIe + DMA и Host + Linux + DMA
Всем привет. Друзья расскажите, пожалуйста, как должна работает ниже описанная схема. Есть платка с артиксом7, на ней я смог...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru