stm32f4 usart+DMA

Кто любит RISC в жизни, заходим, не стесняемся.
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: stm32f4 usart+DMA

Сообщение tonyk »

Dimon456 писал(а):Как ваш dma сюда прикрутить?
Использование DMA предполагает асинхронное программирование, построенное на обработке событий, а не тупое ожидание установки бита.

Например, Модбас-клиент. Пришёл пакет, UART принял его, через DMA переслал в буфер, по RTO или IDLE просигналил о новом пакете, запросив прерывание CPU. У меня RTOS, поэтому обработчик прерывания будит задачу-обработчик запроса, которая обрабатывает запрос, формирует в буфере ответ, запускает передачу ответа в UART через DMA и засыпает.

Если же речь идёт о консольном вводе-выводе, то добавляются два кольцевых буфера, один на приём, другой на передачу. Пример выше привёл AlanDrakes.
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: stm32f4 usart+DMA

Сообщение Аlex »

В общем, всё работает. Впрочем, всё как обычно :tea:
Спойлер

Код: Выделить всё

/********************************************************************************/
uint8_t		uart_rx_buf[1000];
uint32_t	uart_rx_cnt = 0;

/********************************************************************************/
extern "C" {
void UART5_IRQHandler(void) {

	//----------------
	if(UART5->SR & USART_SR_IDLE) {
		UART5->SR &= ~USART_SR_IDLE;

		uart_rx_cnt = sizeof(uart_rx_buf) - DMA1_Stream0->NDTR;
		if(uart_rx_cnt > sizeof(uart_rx_buf))	uart_rx_cnt = 0;

		GPIO_ResetBits(GPIOG, GPIO_Pin_13);

		UART5->CR1 &= ~USART_CR1_RXNEIE;
		UART5->CR1 &= ~USART_CR1_IDLEIE;
		UART5->CR1 &= ~USART_CR1_RE;
	}
	//----------------
}
}
/********************************************************************************/

Код: Выделить всё

/********************************************************************************/
void UART5_Recive(void) {

	uart_rx_cnt = 0;

	UART5->CR1 &= ~USART_CR1_RE;

	while((UART5->SR & USART_SR_ORE)) {
		UART5->DR;		// Clear ORE flag
	}
	if(UART5->SR & USART_SR_IDLE) {
		UART5->DR;		// Clear IDLE flag
	}
	UART5->SR &= ~USART_SR_RXNE;

	//UART5->CR1 |= USART_CR1_RXNEIE;
	UART5->CR1 |= USART_CR1_IDLEIE;
	UART5->CR1 |= USART_CR1_RE;

	DMA_Cmd(DMA1_Stream0, DISABLE);
	dma_u5_rx.DMA_Memory0BaseAddr = (uint32_t)uart_rx_buf;
	dma_u5_rx.DMA_BufferSize = sizeof(uart_rx_buf);
	DMA_Init(DMA1_Stream0, &dma_u5_rx);
	DMA_ClearFlag(DMA1_Stream0, DMA_IT_TCIF0);
	DMA_Cmd(DMA1_Stream0, ENABLE);

}
/********************************************************************************/
void UART5_Send(void *p_data, uint16_t size) {

	DMA_Cmd(DMA1_Stream7, DISABLE);
	dma_u5_tx.DMA_Memory0BaseAddr = (uint32_t)p_data;
	dma_u5_tx.DMA_BufferSize = size;
	DMA_Init(DMA1_Stream7, &dma_u5_tx);
	DMA_ClearFlag(DMA1_Stream7, DMA_IT_TCIF7);
	DMA_Cmd(DMA1_Stream7, ENABLE);

}
/********************************************************************************/

Код: Выделить всё

uint8_t		uart_tx_buf[] = "Bla-bla";

/********************************************************************************/
int main(void){

  LedsInit();

  UART5_Init();
  UART5_DMA_Init();

  NVIC_EnableIRQ(UART5_IRQn);

  while (1)
  {
	  Delay(250000);

	  GPIO_SetBits(GPIOG, GPIO_Pin_13);
	  UART5_Recive();

	  Delay(2000);

	  UART5_Send(uart_tx_buf, sizeof(uart_tx_buf));

//	  GPIO_ResetBits(GPIOG, GPIO_Pin_13);


  }
}
/********************************************************************************/
СпойлерИзображение
1.png
(46.42 КБ) 347 скачиваний
СпойлерИзображение
2.png
(30.77 КБ) 329 скачиваний
IDLE устанавливается через 10 бит, т.е. время одного байта.

PS: Осталось немного причесать код, добавить обработку на переполнение приёма и закинуть всё в отдельный модуль.
Реклама
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 usart+DMA

Сообщение ivan dimir »

Alex. Меня заинтерисовали 3 последние строчки. Вы можете их прокоментировать?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: stm32f4 usart+DMA

Сообщение Аlex »

Какие конкретно ?
Реклама
Эиком - электронные компоненты и радиодетали
jcxz
Мудрый кот
Сообщения: 1725
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: stm32f4 usart+DMA

Сообщение jcxz »

[uquote="AlanDrakes",url="/forum/viewtopic.php?p=4171591#p4171591"][uquote="jcxz",url="/forum/viewtopic.php?p=4171336#p4171336"]А как именно работает это прерывание IDLE - знаете? А то в мануале оно очень туманно описано. И не факт, что удастся использовать его совместно с DMA.
И причём (насколько знаю): в разных STM32 есть разные средства обнаружения таймаута на UART.RXD. В младших, слыхал, есть RTOF, который похож, но не совсем.[/uquote]
По RM - 30.3.1
An Idle character is interpreted as an entire frame of “1”s followed by the start bit of the next frame which contains data (The number of “1” ‘s will include the number of stop bits).
Символ IDLE - целый фрейм из таймслотов в состоянии "1", за которым следует стартовый бит следующего фрейма, содержащий данные (Количество единиц включает так же стоп-биты).

Мне кажется, здесь не совсем корректно описан принцип работы события. Поскольку, собственно, детектирование свободной линии (Idle line) происходит после принятия IDLE фрейма. Внятных диаграмм не привели, но код работает с тем, что есть.[/uquote]Вот именно об этом месте мануала STM32F4 я и говорил. Судя по нему: IDLE должно наступать не после таймаута неактивности на RXD, а после таймаута неактивности, сопровождаемого старт-битом следующего байта. Т.е. - в начале следующего байта следующего кадра после паузы. Кроме того, в самом начале описания USART мануала есть такое:
Ten interrupt sources with flags:
– CTS changes
– LIN break detection
– Transmit data register empty
– Transmission complete
– Receive data register full
– Idle line received
– Overrun error
– Framing error
– Noise error
– Parity error
• Multiprocessor communication - enter into mute mode if address match does not occur
Wake up from mute mode (by idle line detection or address mark detection)
• Two receiver wakeup modes: Address bit (MSB, 9th bit), Idle line
Т.е. говорится, что есть прерывание "Idle line received" и что оно служит для "Wake up from mute mode" - пробуждения из сна, которое очевидно должно происходить при возникновении активности на шине после паузы. А значит опять-же - косвенно намекает на то, что возникать прерывание должно после неактивности сопровождаемой старт-битом.

PS: Хотя вы правы - описание ОЧЕНЬ туманное и косноязычное. И возможно имелось в виду что-то другое. А также есть подозрение, что в разных STM32 оно работает несколько по-разному.

Добавлено after 3 minutes 2 seconds:
[uquote="tonyk",url="/forum/viewtopic.php?p=4171606#p4171606"]IDLE задуман как детектор ошибок приёма для Модбас. Устанавливается строго после 20 идущих подряд единичных бит в линии. Отсюда и выстраивайте логику работы.[/uquote]Приведите пожалуйста мануал и страницу в котором это написано.

Добавлено after 3 minutes 31 second:
[uquote="Dimon456",url="/forum/viewtopic.php?p=4172203#p4172203"]А я что, где-то сказал, что я программист? Я уголь в топку кидаю.
Как ваш dma сюда прикрутить?[/uquote]Если вы не программист - то никак. :dont_know:

Добавлено after 29 minutes 34 seconds:
[uquote="Аlex",url="/forum/viewtopic.php?p=4172288#p4172288"]В общем, всё работает. Впрочем, всё как обычно :tea:

Код: Выделить всё

/********************************************************************************/
uint8_t		uart_rx_buf[1000];
uint32_t	uart_rx_cnt = 0;

/********************************************************************************/
extern "C" {
void UART5_IRQHandler(void) {

	//----------
	if(UART5->SR & USART_SR_IDLE) {
		UART5->SR &= ~USART_SR_IDLE;

		uart_rx_cnt = sizeof(uart_rx_buf) - DMA1_Stream0->NDTR;
		if(uart_rx_cnt > sizeof(uart_rx_buf))	uart_rx_cnt = 0;

		GPIO_ResetBits(GPIOG, GPIO_Pin_13);

		UART5->CR1 &= ~USART_CR1_RXNEIE;
		UART5->CR1 &= ~USART_CR1_IDLEIE;
		UART5->CR1 &= ~USART_CR1_RE;
	}
	//----------
}
}
/********************************************************************************/
[/uquote]
Имхо: здесь во-первых - неоптимально; во-вторых - не корректно.
Операция UART5->SR &= ~USART_SR_IDLE; - непонятно для чего? Флаг IDLE в SR - read-only и не может быть сброшен записью в SR (по-крайней мере в RM STM32F4). Опять же в RM написано как его сбрасывать:
It is cleared by a software sequence (an read to the USART_SR register followed by a read to the USART_DR register).
А вот UART5->SR &= ~USART_SR_IDLE; сбросит не IDLE, а может сбросить совсем другие соседние флаги в SR. Писали уже об этом неоднократно.

И зачем 3 отдельные транзакции чтения-записи?:

Код: Выделить всё

     UART5->CR1 &= ~USART_CR1_RXNEIE;
      UART5->CR1 &= ~USART_CR1_IDLEIE;
      UART5->CR1 &= ~USART_CR1_RE;
Всё это можно (и нужно) делать одной транзакцией чтения-модификации-записи CR1.
Во-вторых: 1-й из этих строк Вы маскируете прерывание RXNIE, и только последней - выключаете приёмник. Если между этими 2-мя событиями в RX.FIFO UART придёт очередной символ, то он там зависнет. Так как выключение UART не очищает его FIFO. И после нового разрешения UART этот символ вдруг выскочит в прерывание RXNE, как будто он пришёл с новым кадром.
Корректный порядок выключения: UART5->CR1 = UART5->CR1 & ~(USART_CR1_RXNEIE | USART_CR1_IDLEIE | USART_CR1_RE);
После которого нужно считать SR и DR (чтобы сбросить потенциально возникшее за время обработки RXNE) и, если успел прийти новый символ - возможно здесь-же заново разрешить прерывания для нового кадра.

В UART5_Recive(void) аналогичные проблемы при манипуляции с флажками/регистрами. Прочитайте RM внимательнее!
Кроме того: непонятно - зачем Вы в каждом прерывании RXNE выключаете приёмник чтобы сразу его включить? Определённо будут проблемы, если выключите приёмник, а в этот момент начнёт поступать новый символ, потом его включите, и как стартовый бит будет воспринят один из информационных битов символа. Будет ошибка.
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: stm32f4 usart+DMA

Сообщение Аlex »

jcxz, код не идеален, не стоит к нему цепляться. Он создавался в процессе теста и отладки, по этому там много лишнего. Я указал, что его нужно причёсывать.
Реклама
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 usart+DMA

Сообщение ivan dimir »

Спойлер

Код: Выделить всё

UART5->CR1 &= ~USART_CR1_RXNEIE;
      UART5->CR1 &= ~USART_CR1_IDLEIE;
      UART5->CR1 &= ~USART_CR1_RE;
Ну вы отключаете биты прерывания в прерывании.Бит разрешения чтения тоже отключаете в прерывании.Как стабильно этот код будет работать.?Вы замете.Ваш код читаем.Но вот этот вопрос.Я не говорю говнокод.Потому что только наверное профи может такое говорить.Я же любитель.И ученик.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: stm32f4 usart+DMA

Сообщение Аlex »

Код: Выделить всё

UART5->CR1 &= ~USART_CR1_RXNEIE;
Это осталось от запуска приёма байт по прерыванию. Изначально я запускал без DMA.
Эту строчку можно вычеркнуть. Я закомментированный код удалил, а эту строку забыл.

Код: Выделить всё

UART5->CR1 &= ~USART_CR1_IDLEIE;
UART5->CR1 &= ~USART_CR1_RE;
Ну а это - просто отключение прерываний по IDLE и выключение приёмника UART.

PS: Напомню. Этот код был написан за вечер, как пробный пуск UART+DMA. Он не идеален и имеет недочёты, о которых я знаю и потом для себя (а может и вас) всё поправлю. Я тупо убедился, что всё работает, убрал всё в ящик и занялся другим делом. Ну и выложил сюда результаты, вдруг кому пригодится.
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 usart+DMA

Сообщение ivan dimir »

Вы мне напишите полжайлуста функцию по приёму и и передачи без прерывания?

Добавлено after 5 minutes 57 seconds:
Спойлер

Код: Выделить всё

 DMA2_Stream7->M0AR |=(uint32_t)&buf;

 	       // DMA2_Stream7->NDTR =3;
Я знаю что нужно канал(или стрим) отключить потом один из этих битов выставить.А может оба.А потом включить?.А как вы считаете.Или как правильно.И по приёму как?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: stm32f4 usart+DMA

Сообщение Аlex »

ivan dimir писал(а):Вы мне напишите полжайлуста функцию по приёму и и передачи без прерывания?
В моём коде обе функции без прерывания.
Прерывание нужно только по таймауту приёма (IDLE), чтобы поймать конец принимаемого пакета (массива байт).
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32f4 usart+DMA

Сообщение Dimon456 »

AlanDrakes, провел я сравнительный тест с вашим кодом.
В качестве теста использовал переменную ms_tick из SysTick_Handler, в общем результат впечатляющий, 24 против 5637 (по идеи это милли секунды должны, но мне кажется что тестовый светодиод быстрее в два раза моргает), но мне потребовалось 3кБайта буфер, 2к мало было. Весь упор в оперативную память, хорошо когда ее много.
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 usart+DMA

Сообщение ivan dimir »

Спойлер[codevoid UART5_Send(void *p_data, uint16_t size) {

DMA_Cmd(DMA1_Stream7, DISABLE);
dma_u5_tx.DMA_Memory0BaseAddr = (uint32_t)p_data;
dma_u5_tx.DMA_BufferSize = size;
DMA_Init(DMA1_Stream7, &dma_u5_tx);
DMA_ClearFlag(DMA1_Stream7, DMA_IT_TCIF7);
DMA_Cmd(DMA1_Stream7, ENABLE);][/code]
Вот это она?Может тут есть лишние строки?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: stm32f4 usart+DMA

Сообщение Аlex »

ivan dimir писал(а):Может тут есть лишние строки?
Не знаю, может для Вашего случая и есть.
Это как спросить "Есть ли в даташите лишние строки ?" :)))

Вы бы лучше сказали, что Вас смущает.
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 usart+DMA

Сообщение ivan dimir »

SPL Написан код.Флаг очищения прерывания?+ инециализация DMA_Stream?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: stm32f4 usart+DMA

Сообщение Аlex »

Да, там SPL. На нём было проще накидать код. Естественно, всё это дело нужно исправлять.
Но он достаточно читабелен. Вопросов возникнуть не должно.
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: stm32f4 usart+DMA

Сообщение tonyk »

Аlex, передача через DMA у тебя сделана не правильно! Я ведь говорил, что при передаче должны обрабатываться ДВА прерывания, но не уточнил каких. Уточняю: первое от DMA, второе от UART. Пока у тебя линии TX и RX есть с обеих сторон, участвующих в обмене, ты эту ошибку не_увидишь.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32f4 usart+DMA

Сообщение Dimon456 »

Аlex, передача не будет работать, это на один раз, хотя можно сделать как у Eddy_Em(вроде у него), то есть обойтись меньшим буфером и ждать завершения передачи буфера, но у вас же куча оперативки.
Мой тест состоял из следующего
СпойлерF100 32МГц 19200

Код: Выделить всё

void SysTick_Handler(void) {
	ms_tick++;
};

void usart_send_str(const char* str)
{
    while(*str) {
    while ((USART1->SR & USART_SR_TXE) == 0) {}
    	USART1->DR = *str++;
    }
}

//#define SEND(str) usart_send_str(str)
#define SEND(str) console_put(str)

		SEND("\r\n");
		printu(ms_tick);
		SEND("\r\n");

	    print_line('=', 38);
	    SEND("\r\n STM32F100RB USART DMA-tx !!! \r\n");

	    printu(SystemCoreClock);
	    SEND(" MHz \r\n");
	    print_line('=', 38);

	    SEND("\r\n");
		printu(ms_tick);
		SEND("\r\n");

		for (uint16_t i = 1000; i<(1000+BUFFER_SIZE); i++){
			Buffer[i-1000] = i;
		}

	    SEND("\r\n");
		printu(ms_tick);
		SEND("\r\n");

		for (uint16_t i = 0; i<BUFFER_SIZE; i++){
			printu(Buffer[i]);
			SEND(" ");
		}
		SEND("\r\n");

	    SEND("\r\n");
		printu(ms_tick);
		SEND("\r\n");

    while(1)
    {
    	if((millis() - previousMillis) > 1000){
    		previousMillis = millis();
    		GPIOC->ODR ^= GPIO_Pin_9;
    	}
    }
и выхлоп с временными отметками

Код: Выделить всё

2 (0)
====================
 STM32F100RB USART DMA-tx !!!
32000000 MHz
====================
272 (0)

287 (1)
1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 
1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 
1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 
1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 
1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 
1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 
1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 
1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 
1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 
1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 
1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 
1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 
1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 
1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 
1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 
1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 
1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 
1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 
1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 
1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 
1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 
1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 
1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 
1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 
1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 
1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 
1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 
1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 
1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 
1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 
1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 
1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511

5637 (24)
Условное время, без скобочек usart_send_str, в скобочках указано время console_put
Добавлено after 41 minute 15 seconds:
С передачей разобрались, теперь попытаемся осилить прием.
Думаю здесь бесполезно говорить, что человек не осилит скорость 19200, средняя скорость набора текста 260 знаков в минуту, а это что-то около 32 бит в секунду, так что ваша IDLE будет срабатывать после каждого набора символа.

Отсюда следует, что буду принимать потоковое сообщения, к dwdmу я подключаться не буду, единственный вариант который есть это gsm neo модуль. Необходим парсер строк.
У кого что есть, кто что может предложить из готового?
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: stm32f4 usart+DMA

Сообщение tonyk »

Dimon456 писал(а):С передачей разобрались, теперь попытаемся осилить прием.
Повторяю, с передачей не разобрались. Неправильно обрабатывается момент окончания передачи. Последний байт будет искажаться. Особенно когда дойдёте до управления трансивером интерфейса EIA-485, тогда сразу эта ошибка вылезет.
Dimon456 писал(а):Думаю здесь бесполезно говорить, что человек не осилит скорость 19200, средняя скорость набора текста 260 знаков в минуту, а это что-то около 32 бит в секунду, так что ваша IDLE будет срабатывать после каждого набора символа.
Частота отправки символов зависит от настройки терминала. Можно включить отправку по нажатию клавшши "Ввод", и тогда к тебе может прилетеь строка на скорости, например, 451К. Понял, о чём речь?
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32f4 usart+DMA

Сообщение Dimon456 »

tonyk, у мну нет трансивера с интерфейсом EIA-485, и навряд ли когда будет.
tonyk писал(а):например, 451К. Понял, о чём речь?
Ну не знаю, может быть какие нибудь эксклюзивные адаптеры и выдают 451К, но китайский ширпотреб кое как 115К держит, а некоторые в синий экран вываливаются.
По этому изначально мной вопрос ставился для чего, а потом уже как. А вы сразу как.

И что же ivan dimir упустил такое, i2c lcd то же надо было бы в DMA засунуть.
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: stm32f4 usart+DMA

Сообщение tonyk »

Ты всё-таки не понял. Дело не в скорости, а в том, что на тебя может пойти сплошной поток, который без DMA, да ещё и с нескольких UART одновременно, ты вряд ли примешь без шибок. Не знаю, чем пользуешься ты, но те китайцы, которых пользу я, спокойно держат 451К. Это раз.
Взялся делать, так делай сразу как полагается, чтобы потом снова не возвращаться к вопросу приёма-передачи с DMA. Захочешь Модбас- сядешь в лужу. И снова будешь сношаться с мануалами. Это два.
Ответить

Вернуться в «ARM»