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

 
 
> STM32 Прерывание UART, Странное поведение
Vladimir Prokofi...
сообщение Feb 20 2014, 10:37
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 9-03-11
Пользователь №: 63 481



Простой модуль чтения данных с GPS, из проекта выкинул все, кроме uart драйвера и парсера сообщений UBX. (Ublox gps protocol), STM415 стоит, но софт везде работает с ним как с 215 ( Это не влияет, я это ловил и на настоящих 215 )

Настройка порта:
CODE
case USART6_BASE:

#ifdef USE_IN_UART6_BUFFER
UART6_InputBufWR = 0;
UART6_InputBufRD = 0;
#endif

#ifdef USE_OUT_UART6_BUFFER
UART6_OutputBufWR = 0;
UART6_OutputBufRD = 0;
#endif

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE);

GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_USART6);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USART6);

GPIO_Init_Struct.GPIO_Pin = GPIO_Pin_6;
GPIO_Init_Struct.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init_Struct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init_Struct.GPIO_OType = GPIO_OType_PP;
GPIO_Init_Struct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_Init_Struct);

GPIO_Init_Struct.GPIO_Pin = GPIO_Pin_7;
GPIO_Init_Struct.GPIO_OType = GPIO_OType_OD;
GPIO_Init_Struct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_Init_Struct);

#if defined (USE_IN_UART6_BUFFER) || defined (USE_OUT_UART6_BUFFER)
NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = UART6_PreemptionPriority;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = UART6_SubPriority;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
#endif
#ifdef USE_IN_UART6_BUFFER
USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);
//USART_ITConfig(USARTx, USART_IT_ORE, ENABLE);
#endif

break;
}

USART_Init_Struct.USART_BaudRate = Baudrate;
USART_Init_Struct.USART_WordLength = USART_WordLength_8b;
USART_Init_Struct.USART_StopBits = USART_StopBits_1;
USART_Init_Struct.USART_Parity = USART_Parity_No;
USART_Init_Struct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init_Struct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USARTx, &USART_Init_Struct);

USART_Cmd(USARTx,ENABLE);


Прерывание:
CODE
void USART6_IRQHandler(void)
{
if(USART_GetITStatus(USART6, USART_IT_TXE) != RESET)
{
#ifdef USE_OUT_UART6_BUFFER

if(UART6_out_counter != 0)
{
UART6_out_counter--;
USART_SendData(USART6,(uint16_t) UART6_OutputBuf[UART6_OutputBufRD]);

if(UART6_OutputBufRD >= (UART6_OutputBuf_size - 1))
{
UART6_OutputBufRD = 0;
}
else
{
UART6_OutputBufRD++;
}
} else {
USART_ITConfig(USART6, USART_IT_TXE, DISABLE);
isTxDone6 = 1;
#endif
}
} else if(USART_GetITStatus(USART6, USART_IT_RXNE) != RESET)
{
USART6->SR;
#ifdef USE_IN_UART6_BUFFER

uint8_t read_UART;

read_UART = USART_ReceiveData(USART6);
#ifdef FATFS_ON
GPSLOGGER_PushByte( read_UART );
#endif



if(UART6_in_counter < UART6_InputBuf_size)
{
UART6_InputBuf[UART6_InputBufWR] = read_UART;

if(UART6_InputBufWR == (UART6_InputBuf_size - 1))
{
UART6_InputBufWR = 0;
}
else
{
UART6_InputBufWR++;
}
UART6_in_counter++;
}
#endif
}else {
USART6->SR;
USART6->DR;
}

USART_ClearFlag( USART6, USART_FLAG_CTS | USART_FLAG_LBD | USART_FLAG_RXNE | USART_IT_TC );
}


Ну тык вот, есть странности (скорость 200к). Самый главный вопрос, почему мы иногда попадаем в последний else, выполняя
USART6->SR;
USART6->DR;


При этом, это должно было быть прерывание RX, НО RXNEIE = 0! Все остальные биты такие-же как и при нормальном прерывании.

Еще странность что ORE почти всегда 1.

В GPSLOGGER_PushByte есть глобальное разрешение и запрещение прерывания, но функция просто просто байт сохраняет:
CODE
inline void GPSLOGGER_PushByte( uint8_t b ){
__disable_irq();
if( sizebuf[curBuf] < LOGBUFSIZE ){
logbuf[ curBuf ][ sizebuf[curBuf] ] = b;
}
sizebuf[ curBuf ] ++;
__enable_irq();
}


Сообщение отредактировал Vladimir Prokofiev - Feb 20 2014, 10:40
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
adnega
сообщение Apr 29 2014, 21:40
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



С USART_SR_RXNE Вы правы - он у меня определен как номер бита, а не как маска.
По сложности могу усилить и другими блоками, но они будут работать параллельно и вряд ли это окажет влияния.
Можно DMA врубить для усложнения, но насколько я понял, гипотеза была в том, что флаг не успевает за периферией.
Я даже на асме хотел написать обработчик, чтоб было максимально быстрое обращение к USART->SR.
Насчет разброса частоты UART согласен, что ошибка нулевая. Но как мне кажется при допустимом уровне рассогласования все будет работать,
при превышении уровня - все перестанет работать. У меня тоже на тестовой плате USART2 тактруется от 36МГц. На второй стороне у Вас
какое устройство? С какой расчетной частотой? Могу добавить еще одну отладку с "удачным" кварцем на 11.0592МГц, который даст точные
115200. Я за то, что USART у STM32F103 не глючит, хотя в более поздних процах USART заметно поменялся, но это скорее усовершенствование
блока, чем латание дыр. Может все-таки в программе (или компиляторе) проблемы, а может железо сбоит. Заметил, что преобразователь USB-COM TTL
работает стабильнее, если подключать его через последовательные сопротивления (иначе на осциллографе вижу выбросы вверх или вниз аж под 1.5В).
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Apr 30 2014, 07:51
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(adnega @ Apr 29 2014, 22:40) *
С USART_SR_RXNE Вы правы - он у меня определен как номер бита, а не как маска.

Интересно, зачем. Это же конфликт с CMSIS-согласованным файлом stm32f10x.h
Цитата
На второй стороне у Вас какое устройство? С какой расчетной частотой?

WiFi-"модем" HLK-RM04. Там внутри Ralink RT5350F и кварц, по которому не видно, сколько MHz. Но еще раз: после добавления заплатки, действие которой заключается либо в задержке, либо в предварительном "тупом" чтении регистра SR, ошибка спорадической потери байтов забилась в угол до такой степени, что мы вчера в течение долгих тестов не смогли ее обнаружить.
Go to the top of the page
 
+Quote Post
adnega
сообщение Apr 30 2014, 09:38
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(KnightIgor @ Apr 30 2014, 11:51) *
Интересно, зачем. Это же конфликт с CMSIS-согласованным файлом stm32f10x.h

WiFi-"модем" HLK-RM04. Там внутри Ralink RT5350F и кварц, по которому не видно, сколько MHz. Но еще раз: после добавления заплатки, действие которой заключается либо в задержке, либо в предварительном "тупом" чтении регистра SR, ошибка спорадической потери байтов забилась в угол до такой степени, что мы вчера в течение долгих тестов не смогли ее обнаружить.

Насчет битиков ответ простой: я не пользуюсь сторонними библиотеками.

Насчет UARTа я пока уверен, что накакие заплатки не нужны, т.к. железо работает отлично. Но если у Вас есть желание переубедить меня, то
я с радостью помогу. Ибо я лучше сейчас огребу, чем в будущем. В свое время я сталкивался с потерей байт, но не придавал этому особого значения.
Старался писать код не чувствительным к таким потерям (точнее допускающим редкие потери с гарантированным восстановлением за конкретное время/
число перепосылок). Сейчас, когда начал копаться детально (где-то месяц назад), понял, что так или иначе аппаратура не виновата в потерях - виноват
исключительно софт. Если Вы считаете вопрос решенным (для своего круга задач), то, думаю, и копать дальше не стоит (меня тоже сейчас все устраивает).
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Apr 30 2014, 10:11
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(adnega @ Apr 30 2014, 10:38) *
Насчет битиков ответ простой: я не пользуюсь сторонними библиотеками.

Жесть sm.gif.
Цитата
Насчет UARTа я пока уверен, что накакие заплатки не нужны, т.к. железо работает отлично. Но если у Вас есть желание переубедить меня, то
я с радостью помогу.

Нет, я никого переубеждать не хочу, тем более человека, который даже библиотеками производителя процессоров не пользуется. Просто поделился информацией на случай, если кто сталкивался, но не понял, что происходит.
Go to the top of the page
 
+Quote Post
adnega
сообщение Apr 30 2014, 10:34
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(KnightIgor @ Apr 30 2014, 14:11) *
Жесть sm.gif.

Нет, я никого переубеждать не хочу, тем более человека, который даже библиотеками производителя процессоров не пользуется. Просто поделился информацией на случай, если кто сталкивался, но не понял, что происходит.

Да, все нормально: просто я с STM практически с самого начала (тогда и библиотеки никакой не было), поэтому библиотеки у меня свои.
Библиотеками производителя я пользуюсь, но только в ознакомительных целях. И документацию читаю внимательно.
Если честно, то до сих пор не понятно, в чем собственно проблема UART на STM32 и почему только у Вас UART теряет байты.
За информацию спасибо: если что-то не работает в сложной системе, то нужно вставлять задержки и дополнительные чтения статусных регистров.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Vladimir Prokofiev   STM32 Прерывание UART   Feb 20 2014, 10:37
- - AHTOXA   У STM-ок это довольно часто бывает - "ложное...   Feb 20 2014, 18:06
|- - demiurg_spb   А зачем этот участок кода? Ведь по приходу нового ...   Apr 30 2014, 06:55
|- - KnightIgor   Цитата(demiurg_spb @ Apr 30 2014, 07:55) ...   Apr 30 2014, 08:57
|- - AHTOXA   Да, эта часть бесполезна. Видимо, наследие какого-...   Apr 30 2014, 09:31
- - KnightIgor   Цитата(Vladimir Prokofiev @ Feb 20 2014, 11...   Feb 24 2014, 08:24
|- - Vladimir Prokofiev   Цитата(KnightIgor @ Feb 24 2014, 12:24) К...   Feb 26 2014, 09:47
- - KnightIgor   Цитата(Vladimir Prokofiev @ Feb 20 2014, 11...   Apr 29 2014, 09:19
|- - adnega   Цитата(KnightIgor @ Apr 29 2014, 13:19) Ч...   Apr 29 2014, 10:03
|- - demiurg_spb   Цитата(KnightIgor @ Apr 29 2014, 13:19) М...   Apr 29 2014, 10:48
|- - KnightIgor   Цитата(demiurg_spb @ Apr 29 2014, 11:48) ...   Apr 29 2014, 12:07
|- - adnega   Цитата(KnightIgor @ Apr 29 2014, 16:07) П...   Apr 29 2014, 13:22
|- - KnightIgor   Цитата(adnega @ Apr 29 2014, 14:22) Что з...   Apr 29 2014, 13:56
|- - adnega   Цитата(KnightIgor @ Apr 29 2014, 17:56) Д...   Apr 29 2014, 17:25
|- - KnightIgor   Цитата(adnega @ Apr 29 2014, 18:25) Собра...   Apr 29 2014, 18:38
- - Golikov A.   Да библиотеки производителя все (ну большинство то...   Apr 30 2014, 11:03
- - KnightIgor   Цитата(Golikov A. @ Apr 30 2014, 12:03) Д...   Apr 30 2014, 16:54


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 12:29
Рейтинг@Mail.ru


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