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

 
 
> 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

Сообщений в этой теме
- 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
|- - KnightIgor   Цитата(adnega @ Apr 30 2014, 10:38) Насче...   Apr 30 2014, 10:11
|- - adnega   Цитата(KnightIgor @ Apr 30 2014, 14:11) Ж...   Apr 30 2014, 10:34
- - 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 - 16:25
Рейтинг@Mail.ru


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