реклама на сайте
подробности

 
 
> stm32f100 USART задержка передачи и потеря символов, Физически передача начинается с задержкой. Теряется 1 или 2 байт.
firstvald
сообщение Mar 6 2016, 12:58
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 580
Регистрация: 3-06-08
Пользователь №: 38 041



Кристалл stm32f100. Плата Discovery.

Вижу, что передача по USART начинается с задержкой. Т е после записи в DR, на ножке процессора посылка появляется примерно через время равное передачи байта (без стопов и паритета) на выбранной скорости. Для 115200 физически передача начинается через 8 микросекунд, для 19200 - через 400, для 1200 - через 10 миллисекунд. Т е такое впечатление, что после записи в DR автомат вхолостую отрабатывает сдвиг регистра ничего не выдавая на ножку и после одного холостого цикла уже забирает данные из DR.

При одновременной работе нескольких портов теряется первый или второй байт в передаваемой последовательности или даже первый со вторым переставляются местами (во всех портах или в каком то одном , картина может меняться при изменении кода). Причем, даже в длинной последовательности все остальные байты передаются нормально. Это возникает при как при одновременной работе нескольких портов так и если оставить один порт.


Инициирование USART

CODE
//Инициируем UARTы

void USART1_INI(unsigned char spd, unsigned char par, unsigned char stp)
//spd - скорости обмена
// 10 115200
// 9 57600
// 8 38400
// 7 19200
// 6 9600
// 5 4800
// 4 2400
// 3 1200
// 2 600
//par - паритет
// 0 без паритета
// 1 нечетный паритет
// 2 четный паритет
//stp - число стоп битов
// 0, 1 - 1
// 2 - 2
//
//
//
{
GPIO_InitTypeDef GPIO_InitStructure;
short unsigned int i;



//*********************************************************
//Конфигурируем ножки под ввод вывод


//включаем тактирование портов
RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;//GPIOA


//TX1 PA9
//Ножка назначается на вывод пуш пуль
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init( GPIOA , &GPIO_InitStructure);
//RX1 PA10
//Ножка назначается на ввод
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init( GPIOA , &GPIO_InitStructure);

USART1->CR1=0;
USART1->CR1|=USART_CR1_UE;//включили UART
USART1->CR1&=~USART_CR1_M;//8 бит
USART1->CR1&=~USART_CR1_WAKE;// пробуждение по IDLE LINE

//if(par==0){
USART1->CR1&=~USART_CR1_PCE;//без паритета
USART1->CR1&=~USART_CR1_PS;// нечетный паритет
USART1->CR1&=~USART_CR1_M;//8 бит
// }
if(par==1){
USART1->CR1|=USART_CR1_PCE;//паритет
USART1->CR1|=USART_CR1_PS;// нечетный паритет
USART1->CR1|=USART_CR1_M;//9 бит
}
if(par==2){
USART1->CR1|=USART_CR1_PCE;//паритет
USART1->CR1&=~USART_CR1_PS;// четный паритет
USART1->CR1|=USART_CR1_M;//9 бит
}



USART1->CR1|=USART_CR1_PEIE;//общее разрешение прерывания
// USART1->CR1|=USART_CR1_TXEIE;//разрешение прерывания по опустошению буфера передачи
USART1->CR1&=~USART_CR1_TXEIE;//запрещение прерывания по опустошению буфера передачи
USART1->CR1&=~USART_CR1_TCIE;//запрещено прерывание от "передача закончена"
//USART1->CR1|=USART_CR1_TCIE;// прерывание от "передача закончена"
USART1->CR1|=USART_CR1_RXNEIE;// разрешение прерывания по приему
USART1->CR1&=~USART_CR1_IDLEIE;//запрещено прерывание от IDLE
USART1->CR1|=USART_CR1_TE;//передатчик включен
USART1->CR1|=USART_CR1_RE;//приемник включен
USART1->CR1&=~USART_CR1_RWU;//приемник в активном режиме
USART1->CR1&=~USART_CR1_SBK;//запрос передачи длинного 0 выключен

USART1->CR2=0;
//if(stp<=1){//1 стоп
USART1->CR2&=~USART_CR2_STOP;//1 стоп
// }
if(stp==2){//2 стоп
USART1->CR2&=~USART_CR2_STOP;//1 стоп
USART1->CR2|=USART_CR2_STOP_1;//2 стоп
}

USART1->CR3=0;

USART1->SR&=0;//Флаги всех прерываний сбросили


USART1->BRR=0X0480;//19200
if(spd==10){
USART1->BRR=0X00C0;//115200
}

// готовим буферы обмена

//#define rx_buf_long 256
//#define tx_buf_long 256


i=0;
while(i<rx_buf_long){
rx_buf1[i]=0;
i++;
}
i=0;
while(i<tx_buf_long){
tx_buf1[i]=0;
i++;
}

USART1->SR=0;//СБРАСЫВАЕМ ФЛАГИ
// CTS
// LBD
// TC
// RXNE
// IDLE
// NE
//

rx_ptr1=0;
tx_ptr1=0;
//индекс последнего передаваемого элемента буфера
tx_last1=0;

rx_state1=0;
tx_state1=0;

}


Само прерывание от одного порта

CODE
void USART1_IRQHandler(void)
{
//прием
if((USART1->SR&USART_SR_RXNE)!=0) {//что то пришло
USART1->SR&=~USART_SR_RXNE;//сбросим флаг
rx_buf1[rx_ptr1]=USART1->DR;
if(rx_ptr1<rx_buf_long){
rx_ptr1++;
}

}//что то пришло

//передача

if((USART1->SR&USART_SR_TC)!=0) {//данные переписались из буфера в сдвиговый регистр и ушли из него
if(tx_state1==1){//идет передача
USART1->SR&=~USART_SR_TC;//сбросим флаг
if(tx_ptr1>=tx_last1){//ушел последний байт
tx_state1=0;
GPIOC->ODR &= ~GPIO_ODR_ODR4;// смотрим этой ножкой момент, когда закончилась передача
USART1->CR1&=~USART_CR1_TCIE ;
}//ушел последний байт
else{//передаем дальше
tx_ptr1++;
USART1->DR=tx_buf1[tx_ptr1];
}//передаем дальше
}//идет передача
else{//фантомное прерывание- мы ничего не должны передавать
USART1->CR1&=~USART_CR1_TCIE ;//сбросим разрешение этого прерывания
}//фантомное прерывание- мы ничего не должны передавать
}//данные переписались из буфера в сдвиговый регистр
USART1->SR=0;

}



и затравка которая начинает передачу:

CODE
InitGPIO();
Init_OSC_my();//инициализация и переключение синхронизации

USART1_INI(3,2,2);//1200







tx_buf1[0]=0x30;
tx_buf1[1]=0x31;
tx_buf1[2]=0x32;
tx_buf1[3]=0x33;
tx_buf1[4]=0x34;
tx_buf1[5]=0x35;
tx_buf1[6]=0x36;
tx_buf1[7]=0x37;
tx_buf1[8]=0x38;
tx_buf1[9]=0x39;
tx_buf1[10]=0x41;
tx_buf1[11]=0x42;
tx_buf1[12]=0x43;
tx_buf1[13]=0x44;
tx_buf1[14]=0x45;
tx_buf1[15]=0x46;
tx_buf1[16]=0x47;
tx_buf1[17]=0x48;
tx_buf1[18]=0x49;
tx_buf1[19]=0x4a;
tx_buf1[20]=0x4b;

tx_state1=1;
tx_last1=20;
tx_ptr1=0;


__NOP();



USART1->CR1|=USART_CR1_TCIE ;
GPIOC->ODR |= GPIO_ODR_ODR4;// между выставлением этой ножки и началом передачи на ножке - выдержка времени
USART1->DR=tx_buf1[tx_ptr1];


Сообщение отредактировал IgorKossak - Mar 6 2016, 14:00
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!! форматирование
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- firstvald   stm32f100 USART задержка передачи и потеря символов   Mar 6 2016, 12:58
- - AlanDrakes   На кристалле STM32F107 работает следующий код: COD...   Mar 6 2016, 14:43
|- - firstvald   спасибо огромное! это очень пригодится !   Mar 6 2016, 16:22
- - AlanDrakes   Да не за что. Хотя, я просмотрел ваш код и тоже не...   Mar 6 2016, 16:37
|- - firstvald   ну это важно если мы каким то подпиленным sprintf ...   Mar 6 2016, 16:44
- - AlanDrakes   А нуль-терминированая строка может оказаться удобн...   Mar 6 2016, 16:46
|- - firstvald   это если передаем символы. последний раз у меня эт...   Mar 6 2016, 16:49
- - Genadi Zawidowski   О, сколько раз уже можно просить читать документац...   Mar 6 2016, 18:57
|- - firstvald   Цитата(Genadi Zawidowski @ Mar 6 2016, 22...   Mar 6 2016, 20:45
- - IgorKossak   firstvald, при ответе на крайнее сообщение нет нуж...   Mar 6 2016, 19:56
- - Genadi Zawidowski   ЦитатаПри поочередной передаче флаг приема не може...   Mar 6 2016, 20:47
- - firstvald   да нет. по флагу от передатчика сбрасывается флаг ...   Mar 6 2016, 21:03
- - Genadi Zawidowski   При наличии других флагов прерывания (если они поя...   Mar 6 2016, 21:15
- - firstvald   да сбросятся, но они мне тут не нужны . не в прием...   Mar 6 2016, 21:28
- - Genadi Zawidowski   Кодacc = SR 0x01 interrupt! SR=0x03 - появился...   Mar 6 2016, 21:31
- - firstvald   вот что удалось понять. не зря обратил внимание, ...   Mar 7 2016, 10:10
- - ViKo   Все не так, ребята! (с) ВВС Проверьте все свои...   Mar 7 2016, 10:49
- - firstvald   а что значит проверить? скорости обмена соответст...   Mar 7 2016, 10:55
|- - ViKo   Цитата(firstvald @ Mar 7 2016, 13:55) и э...   Mar 7 2016, 11:02
|- - firstvald   Цитата(ViKo @ Mar 7 2016, 15:02) Я приним...   Mar 7 2016, 14:22
|- - SasaVitebsk   Цитата(firstvald @ Mar 7 2016, 17:22) я -...   Mar 9 2016, 06:17
|- - firstvald   Цитата(SasaVitebsk @ Mar 9 2016, 10:17) С...   Mar 9 2016, 09:01
|- - ViKo   Цитата(firstvald @ Mar 9 2016, 12:01) да ...   Mar 9 2016, 09:22
- - firstvald   мне не нужно TXE , мне нужно TC. фокусы с ...   Mar 7 2016, 11:18
|- - ViKo   Цитата(firstvald @ Mar 7 2016, 14:18) мне...   Mar 7 2016, 11:21
- - firstvald   вот на самом деле именно обратно! чтобы понять...   Mar 7 2016, 12:02
- - adnega   TXE и TC - это две большие разницы. Записывать в б...   Mar 7 2016, 12:11
|- - ViKo   Цитата(adnega @ Mar 7 2016, 15:11) ... а ...   Mar 7 2016, 13:49
- - firstvald   TC поднимается когда TXE выставлен -> записыва...   Mar 7 2016, 12:42
|- - Сергей Борщ   Цитата(firstvald @ Mar 7 2016, 14:42) TC ...   Mar 7 2016, 12:54
- - firstvald   сразу не сообразил. чтение модификация запись - к...   Mar 7 2016, 12:59
|- - AHTOXA   Ну какой же вы тупой! (с) Цитата(firstvald ...   Mar 7 2016, 13:32
|- - firstvald   Цитата(AHTOXA @ Mar 7 2016, 17:32) Ну как...   Mar 7 2016, 14:16
|- - ViKo   Цитата(firstvald @ Mar 7 2016, 17:12) это...   Mar 7 2016, 14:19
- - Genadi Zawidowski   Цитатанаписал как обойти Вы понимаете, что последо...   Mar 9 2016, 09:33
- - SasaVitebsk   Цитата(Genadi Zawidowski @ Mar 9 2016, 12...   Mar 9 2016, 09:51


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 22:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016