Easyelectronics.ru

Электроника для всех
Текущее время: 14 окт 2019, 03:50

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
 Заголовок сообщения: Грабли с USART_FLAG_RXNE
СообщениеДобавлено: 29 июл 2010, 18:54 
Старожил
Аватара пользователя

Зарегистрирован: 11 мар 2010, 12:44
Сообщения: 1117
Откуда: Default city
Решил тут создать сообщение, чтобы поделиться ошибкой, что я ловил пол дня.

Есть у арма регистр, куда падает приходящая инфа в УАРТ.
И, как всегда
Код:
   
if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE))
{
        char data
        uart_rx_count ++;
        data = USART_ReceiveData(USART1);
}

Начинается бесконечный приём. Он флаг USART_FLAG_RXNE не сбрасывает, хотя написано, что
Цитата:
It is cleared by a read to the USART_DR register.

Пытался и сбрасывать флаг вручную, и ещё что.
И каково же было моё удивление, когда я догадался сделать временную переменную 32-битной, и всё прошло.
Код:
   
if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE))
{
        u32 tmp
        char data
        uart_rx_count ++;
        tmp = USART_ReceiveData(USART1);
        data = tmp &0xFF;
}

С точки зрения С - нонсанс, но заработало!

_________________
Не дай Бог увидеть нубский ЛУТ, бессмысленный и беспощадный
В МК "на порядок" - это "в два раза"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Грабли с USART_FLAG_RXNE
СообщениеДобавлено: 29 июл 2010, 19:57 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3995
а мона описание USART_ReceiveData()?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Грабли с USART_FLAG_RXNE
СообщениеДобавлено: 29 июл 2010, 22:24 
Старожил

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
Не у арма, а у конкретных кристаллов/семейств, а всякие магические функции - в говнобиблиотеках.
Хоть бы уточнили что за кристалл и какая версия этих самых библиотек.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Грабли с USART_FLAG_RXNE
СообщениеДобавлено: 30 июл 2010, 00:59 
Старожил
Аватара пользователя

Зарегистрирован: 11 мар 2010, 12:44
Сообщения: 1117
Откуда: Default city
Ink писал(а):
а мона описание USART_ReceiveData()?

просто возврат UARTn.DR

amx писал(а):
Не у арма, а у конкретных кристаллов/семейств, а всякие магические функции - в говнобиблиотеках.
Хоть бы уточнили что за кристалл и какая версия этих самых библиотек.

свойство архетектуры. Ибо 32 битная. И. к стати. очень логичное - там тригер на сдвиговик стоит. А сдвиговик - 32 битный.

Кристалл - 3 кпртекс.

_________________
Не дай Бог увидеть нубский ЛУТ, бессмысленный и беспощадный
В МК "на порядок" - это "в два раза"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Грабли с USART_FLAG_RXNE
СообщениеДобавлено: 30 июл 2010, 10:41 
Старожил

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
dekar писал(а):
свойство архетектуры. Ибо 32 битная. И. к стати. очень логичное - там тригер на сдвиговик стоит. А сдвиговик - 32 битный.
Ничего подобного, просто использование магических функций не избавляет от чтения описания на кристалл, а лишь отодвигает до первых граблей, которые некоторые лечат магическими действия аля "временная 32-битная переменная".

dekar писал(а):
Кристалл - 3 кпртекс.

Кортексы производят STMicro, TI, Thompson, NXP, EnergyMicro, Atmel, Ember и возможно ещё кто-то. У всех кристаллов разная периферия, не совместимая со всеми остальными. Или вы используете CMSIS? но там таких функций я не видел.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Грабли с USART_FLAG_RXNE
СообщениеДобавлено: 30 июл 2010, 16:59 
Администратор
Аватара пользователя

Зарегистрирован: 16 янв 2010, 06:09
Сообщения: 6273
Откуда: Челябинск
Любопытно. Т.е. даже на один байт усарта он отдает два слова, причем старшие разряды его нулевые?

_________________
Хозяин дома


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Грабли с USART_FLAG_RXNE
СообщениеДобавлено: 30 июл 2010, 17:17 
Старожил

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
Вероятно умолченная информация: микроконтроллер stm32
Вложение:
stm32_usart_dr.PNG
stm32_usart_dr.PNG [ 66.99 Кб | Просмотров: 11944 ]

STM32F10x_StdPeriph_Lib_V3.1.2\Libraries\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c
Код:
/**
  * @brief  Returns the most recent received data by the USARTx peripheral.
  * @param  USARTx: Select the USART or the UART peripheral.
  *   This parameter can be one of the following values:
  *   USART1, USART2, USART3, UART4 or UART5.
  * @retval The received data.
  */
uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
 
  /* Receive Data */
  return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);
}

STM32F10x_StdPeriph_Lib_V3.1.2\Libraries\CMSIS\Core\CM3\stm32f10x.h
Код:
/**
  * @brief Universal Synchronous Asynchronous Receiver Transmitter
  */

typedef struct
{
  __IO uint16_t SR;
  uint16_t  RESERVED0;
  __IO uint16_t DR;
  uint16_t  RESERVED1;
  __IO uint16_t BRR;
  uint16_t  RESERVED2;
  __IO uint16_t CR1;
  uint16_t  RESERVED3;
  __IO uint16_t CR2;
  uint16_t  RESERVED4;
  __IO uint16_t CR3;
  uint16_t  RESERVED5;
  __IO uint16_t GTPR;
  uint16_t  RESERVED6;
} USART_TypeDef;

Так что любый пляски с результатом функции мало понятны. Остаётся вариант что у вас более старая библиотека где эта баго-фича не пофиксена, или более новая, рассчитаная на более новые кристаллы с уже пофиксенной баго-фичей. А чтение члена структуры без учёта его размера вещь вообще невероятная.
На будущее: уточняйте что за библиотеки и что за контроллер.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Грабли с USART_FLAG_RXNE
СообщениеДобавлено: 31 июл 2010, 00:55 
Старожил
Аватара пользователя

Зарегистрирован: 11 мар 2010, 12:44
Сообщения: 1117
Откуда: Default city
А как быть с 9-битным уартом?

_________________
Не дай Бог увидеть нубский ЛУТ, бессмысленный и беспощадный
В МК "на порядок" - это "в два раза"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Грабли с USART_FLAG_RXNE
СообщениеДобавлено: 27 июн 2011, 00:52 
Старожил

Зарегистрирован: 27 янв 2010, 12:28
Сообщения: 446
Откуда: Харьков
Достану-ка тему из мезонина.
Проблема с этим же флагом, USART_FLAG_RXNE. С его проверкой при приёме. Сколько ни проверяю, приёма не происходит. Хотя передача работает отлично. Делать на прерываниях пока не хочу, интересно разобраться с флагами. Код пишу в Atollic TrueStudio Lite. Камень STM32F100C4T6B.
Основные части кода под спойлером.
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Грабли с USART_FLAG_RXNE
СообщениеДобавлено: 27 июн 2011, 06:49 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 22 янв 2011, 03:23
Сообщения: 39
Откуда: Украина/Одесса
Цитата:
_gpioADefStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
_gpioADefStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &_gpioADefStructure);

Со стандартной библиотекой не работал особо - сильно она мне не понравилась кучей мусора в памяти но тут вроде и так всё ясно:
Даташит гласит что PA10 это USART1_RX. Тут он выставлен на выход альтернативной функции. Логично что на него ничего не принимается.
Ставь в режим Floating input или вход с подтяжкой к питанию например.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Грабли с USART_FLAG_RXNE
СообщениеДобавлено: 27 июн 2011, 11:37 
Старожил

Зарегистрирован: 27 янв 2010, 12:28
Сообщения: 446
Откуда: Харьков
pavel2661
Спасибо, действительно заработало.
Но тогда вопрос, почему PA9 всё же работает на передачу, хотя он тоже настроен на альтернативную функцию? И CTS/RTS работают, хотя они настроены тоже на альтернативную функцию?
USART на PA9...PA12 - это же альтернативная функция, правильно? По идее её выбирать и нужно? А основная функция - GPIO. Почему тогда все выводы, кроме USART1_RX отлично работают как GPIO_Mode_AF_PP, и только USART1_RX надо выставлять
pavel2661 писал(а):
Floating input или вход с подтяжкой к питанию например.

Работает, но имхо как-то нелогично.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Грабли с USART_FLAG_RXNE
СообщениеДобавлено: 27 июн 2011, 17:36 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 22 янв 2011, 03:23
Сообщения: 39
Откуда: Украина/Одесса
Потому что GPIO_Mode_AF_PP это Push-Pull ВЫХОД альтернативной функции.
А вход альтернативной функции всегда подключен к входному буферу ножки. ИМХО логично ибо не имеет смысла отключать входы альтернативных функций. Можно просто не подать на нее синхронизацию из RCC или выключить конкретный вход блока (как на таймерах например) если оно не нужно. Зато если она все время подключена то можно всякие извраты устраивать типа измерять таймером сигналы которые сам сгенерировал не используя лишние ноги МК. Не знаю где это может быть нужно, но тем не менее.

Вдогонку насчет CTS - оно у вас не работает как нужно. Посмотрите осциллографом на эту ногу и убедитесь что там скорее всего всегда 0, так как настроен порт на выход альтернативной функции и ни один блок который может управлять этим выходом (там вроде TIM1 и ещё что-то) не настроен - значит там всегда ноль.
А даташит гласит что:
Цитата:
If the CTS flow control is enabled (CTSE=1), then the transmitter checks the nCTS input
before transmitting the next frame. If nCTS is asserted (tied low), then the next data is
transmitted

Тоесть если CTS притянуто к земле (0) то передатчик может передавать. Таким образом у вас передатчик всегда может передавать независимо от того, какой сигнал выставили с той стороны. Кстати такой режим работы порта приводит к лишним токам когда с той стороны выставляют единицу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Грабли с USART_FLAG_RXNE
СообщениеДобавлено: 27 июн 2011, 18:25 
Старожил

Зарегистрирован: 27 янв 2010, 12:28
Сообщения: 446
Откуда: Харьков
pavel2661
Огромное спасибо за разъяснение, теперь логика ST становится понятна :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Грабли с USART_FLAG_RXNE
СообщениеДобавлено: 12 сен 2011, 02:03 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2010, 19:07
Сообщения: 930
Откуда: Тольятти
Снова поднимаю тему, т.к. чую, что попался не на эти грабли, а на лежащие рядом, и разобраться с ними так и не смог.

Код:
void USART1_IRQHandler(void) {
   if (USART_GetITStatus(USART1, USART_IT_RXNE) ) {
      USART_ClearITPendingBit(USART1, USART_IT_RXNE);
      USART_ClearFlag(USART1, USART_FLAG_RXNE);
      volatile u32 tmp = USART_ReceiveData(USART1);
      GPIOC->ODR ^= GPIO_ODR_ODR8;  // <--- поморгать светодиодом
   };
};

...

   GPIO_InitTypeDef GPIO_InitStructure;
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init( GPIOC , &GPIO_InitStructure); // <--- Весь порт С на выход

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
   GPIO_Init( GPIOA , &GPIO_InitStructure); // <-- Весь порт А на вход

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // <-- кроме PA9, это Tx, его на альтернативный выход
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_Init( GPIOA , &GPIO_InitStructure);
...

   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // <--- разрешить прерывания при ПРИЁМЕ
...

   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);


Передача байтов работает. И при ПЕРЕДАЧЕ возникает прерывание, мигает светодиод на PC8! Хотя я русским языком сказал, USART_IT_RXNE. Судя по поведению, буфер приёма (Rx) всегда "не пустой" и любое прерывание от UART'a будет выполять код от USART_IT_RXNE, поскольку буфер не пуст. И фиг что сделаешь.

У меня только одно предположение, поскольку я здесь нигде напрямую не работаю с регистрами, всё через обёртки от STM32 Periph Library, возможно, где-то в закромках там что-то перепутано. Но я в этом сильно сомневаюсь.

Что подскажете?

P.S. проблема решена, спасибо Frolls, я по ошибке инициализировал и задействовал USART_Clock, не зная, что это такое. Стёр несколько строчек инициализации этих непонятных мне часов и всё заработало как надо.

_________________
Роман


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Грабли с USART_FLAG_RXNE
СообщениеДобавлено: 01 окт 2011, 18:59 
Заглядывает иногда

Зарегистрирован: 01 июн 2010, 11:04
Сообщения: 139
Всем привет!

Наткнулся на странное поведение контроллера при возникновении прерывания USART. По приему байта происходит прерывание, но бит RXNE сбрасывается автоматически, еще до проверки. Контроллер STM32F100RBT6 (Discovery board). TX pin USART1 соединен с RX pin USART3. Что не так делаю - непонятно. Ниже код:

Код:
// USART RXNE TEST

#include "stm32f10x.h"

vu8  n;
u16 *ptr;
u16 Buf[100];

void USART3_IRQHandler (void)
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
  *ptr++ = USART_ReceiveData (USART3);
}
}

void usart1_out (u16 data)
{
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) {;}
USART_SendData(USART1, (u16)data);
}

int main(void)
{
USART_InitTypeDef      USART_InitStructure;
NVIC_InitTypeDef        NVIC_InitStructure;
ErrorStatus            HSEStartUpStatus;
GPIO_InitTypeDef      GPIO_InitStructure;
u8 i;

n=1;
ptr=&Buf[0];

RCC_DeInit();
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div1)
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp()
if (HSEStartUpStatus == SUCCESS)
{
  RCC_PREDIV1Config(RCC_PREDIV1_Source_HSE, RCC_PREDIV1_Div1);/* PLLCLK = (8MHz_ext/1) * 3 = 24 MHz */
  RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_3);            
}else{while(1){;}}

RCC_PLLCmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {;}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while (RCC_GetSYSCLKSource() != 0x08) {;}

NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

GPIO_DeInit (GPIOA);
GPIO_DeInit (GPIOB);
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;                   /* Tx */
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_11;               /* Rx */
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);

RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1, ENABLE);          /* Configuring USART */
RCC_APB1PeriphClockCmd (RCC_APB1Periph_USART3, ENABLE);
USART_InitStructure.USART_BaudRate = 9600;               
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
USART_InitStructure.USART_Mode = USART_Mode_Rx;
USART_Init(USART3, &USART_InitStructure);
USART_Cmd(USART3, ENABLE);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);

while(1)
{
  for (i=0; i<255; i++)
  {
   while (n==0){;}
   n=0;
   usart1_out (i);
  }
}
}



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Грабли с USART_FLAG_RXNE
СообщениеДобавлено: 21 апр 2012, 11:56 
Только пришел

Зарегистрирован: 21 апр 2012, 11:05
Сообщения: 7
такая же проблема... в чем причина??? и что за тип переменной vu8???


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB