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

 
 
> STM32F2 USART, не устанавливается бит RXNE (USART)
rav38
сообщение Oct 27 2014, 06:49
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 12-06-12
Из: Москва
Пользователь №: 72 275



Здравствуйте все!

Имеем STM32F207. Проблема с портами USART. При настройке на передачу все прекрасно работает и в прерываниях в том числе.

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

Если не вижу очевидного - ткните легонько носом пожалуйста.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
rav38
сообщение Oct 27 2014, 08:16
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 12-06-12
Из: Москва
Пользователь №: 72 275



Обратил внимание на настройку GPIO. Собственно выглядит код так:

Код
                                                  //RS2 TX
  GPIO_InitStruct.Pin= PIO_PIN_8;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
  GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
  
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  
                                                  //RS2 RX
  GPIO_InitStruct.Pin = GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
  GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
  
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);


Вроде бы во всех примерах прием просто настраивают как вход без подтяжек.
Запись GPIO_InitStruct.Alternate = GPIO_AF7_USART3 ф-цией HAL_GPIO_Init никак не обрабатывается для приемника в таком случае.
Здесь ничего не мог напутать?

Библиотеки использую stm32cubef2

Сообщение отредактировал rav38 - Oct 27 2014, 08:20
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 27 2014, 10:56
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



нога RX должна быть ни входом, ни выходом, она должна быть альтернативной функцией, ногой RX! Только в таком случае она будет подключена к входным цепям приемника....
А подтяжка не имеет смысла, потому что после переключения ее в альтернативную функцию уже эти каскады отключаются, вроде как...
Go to the top of the page
 
+Quote Post
rav38
сообщение Oct 27 2014, 11:06
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 12-06-12
Из: Москва
Пользователь №: 72 275



Код
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
GPIO_InitStruct.Alternate = GPIO_AF7_USART3;

HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);


вот таким образом из библиотечных примеров. не помогло. по-прежнему не могу ничего принять

Сообщение отредактировал rav38 - Oct 27 2014, 11:06
Go to the top of the page
 
+Quote Post
dac
сообщение Oct 27 2014, 11:17
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482



QUOTE (rav38 @ Oct 27 2014, 17:06) *
Состояние регистров порта на картинке.

а где флаг RXNE смотрите? если в отладчике включено чтение периферии, то этот флаг сбрасывается отладчиком
Go to the top of the page
 
+Quote Post
rav38
сообщение Oct 27 2014, 11:25
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 12-06-12
Из: Москва
Пользователь №: 72 275



Цитата(dac @ Oct 27 2014, 15:17) *
а где флаг RXNE смотрите? если в отладчике включено чтение периферии, то этот флаг сбрасывается отладчиком


поставил breakpoint в обработчике прерываний COM порта - ни разу в него не попал. для чистоты эксперимента убрал отладчик и в обработчик прерываний добавил включение светодиода - опять же не получилось.

Сообщение отредактировал rav38 - Oct 27 2014, 11:26
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 27 2014, 11:58
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ни на каких других ногах случайно UART3 не включен?

считывайте значение статусного регистра в переменную, а отладчиком смотрите значение переменной, все вкладки со значением регистров закройте...
читайте значение в маине постоянно, и сделайте if(status != 0) ... и туда бряк поставьте.

сначала надо понять что вообще данные идут,а потом прерывания. А отладчик может в этом мешать, сбрасывая флаги чтением регистров, а прерывание может не вызываться...


Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 27 2014, 12:42
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Golikov A. @ Oct 27 2014, 13:56) *
нога RX должна быть ни входом, ни выходом, она должна быть альтернативной функцией, ногой RX! Только в таком случае она будет подключена к входным цепям приемника....
Ну-ну-ну, не пугайте. Вход периферии подключен всегда (отключается только в аналоговом режиме), посмотрите на блок-схему в руководстве пользователя. В режиме альтернативной функции нога настраивается на вывод (если верить таблице Port bit configuration table в том же руководстве). И, кстати, подтяжки в этом режиме продолжают работать:
Цитата
When the I/O port is programmed as alternate function:
● The output buffer can be configured as open-drain or push-pull
● The output buffer is driven by the signal coming from the peripheral (transmitter enable
and data)
● The Schmitt trigger input is activated
● The weak pull-up and pull-down resistors are activated or not depending on the value in
the GPIOx_PUPDR register
● The data present on the I/O pin are sampled into the input data register every AHB1
clock cycle
● A read access to the input data register gets the I/O state

Я понятия не имею, какой глубокий смысл разработчики кристалла закладывали в подключение входных сигналов периферии на альтернативные функции. Или же это (насчет перевода на вывод) вопиющая ошибка в руководстве пользователя - но в этом случае врут уж больно складно, на протяжении всего раздела.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
A.Lex
сообщение Oct 27 2014, 13:43
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 138
Регистрация: 27-12-11
Пользователь №: 69 107



В приложении работающая инициализация УАРТов.

Сообщение отредактировал A.Lex - Oct 27 2014, 13:46
Прикрепленные файлы
Прикрепленный файл  uart.zip ( 1.35 килобайт ) Кол-во скачиваний: 17
 
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 27 2014, 15:34
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Я понятия не имею, какой глубокий смысл разработчики кристалла закладывали в подключение входных сигналов периферии на альтернативные функции


тут есть какая-то обманка.... Вот берем ногу 9 порта Д про которую тут конкретно идет речь

она может быть входом, выходом, и альтернативной функцией, при этом она может быть
USART3_RX - 7 функция
FSMC_D14 - 12 функция
EVENTOUT - 15 функция
и что вся периферия которая реализует эти функции сразу подключена всегда к ноге? А как она сама на себя не влияет?

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

да хотя бы можно UART вывести на разные ноги, этот 3 уарт может быть на D9, B11, C11. И если все эти ноги сразу подключены к модулю, то как активность на ноге C11, не запускает прием уарта?

Полюбасу нога должна уметь отключатся от периферии!


Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 27 2014, 15:55
Сообщение #11


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Я думаю, что Сергей вёл речь про F1xx. Там периферия именно что вся подключена к ноге. И можно включить, например, два разных периферийных модуля, которые используют одну и ту же ногу. Это, конечно, было криво, и потому ST исправили модуль GPIO в следующих после F1xx контроллерах.
В F2xx у ножек есть специальный регистр выбора альтернативных функций, и нога подключается только к одному периферийному модулю.
ЗЫ. Кстати, видел какое-то полезное использование возможности подключения ножки к нескольким периферийным модулям в F1xx, только вот не помню какое. То ли таймером измеряли длительность бита UART-а, то ли что-то ещё.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 27 2014, 17:56
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Я вел речь про F2x. Понятно, что выходы периферии подключены через мультиплексор. Но входы периферии друг другу и никому другому не мешают и поэтому (согласно руководству пользователя) подключены к соотвесттвующим линиям постоянно. Хотя да, как их при этом развести между разными физическими ногами - непонятно. Видимо достаточно выбрать правильную альтернативную функцию для ноги, но переводить ногу в режим альтернативной функции не нужно. Кстати, а у автора вопроса выбрана соответствующая AF для нужной ноги?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 27 2014, 18:33
Сообщение #13


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Сергей Борщ @ Oct 27 2014, 22:56) *
Но входы периферии друг другу и никому другому не мешают и поэтому (согласно руководству пользователя) подключены к соотвесттвующим линиям постоянно. Хотя да, как их при этом развести между разными физическими ногами - непонятно.

Как это не мешают? Если к данному UART подключено три альтернативных ноги RX, то в этом случае все три ноги будут поступать на вход одновременно? Не, это вряд лиsm.gif Наверное всё же ошибка в описании.
Цитата(Сергей Борщ @ Oct 27 2014, 22:56) *
Кстати, а у автора вопроса выбрана соответствующая AF для нужной ноги?

Вроде бы да:
Код
GPIO_InitStruct.Alternate = GPIO_AF7_USART3;


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 27 2014, 18:49
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

Когда закончена вся инициализация, проверьте значение регистров управляющих этой ногой. Может где то случайно при настройки еще чего-то дернули не ту функцию и что-то не так настроилось...


Go to the top of the page
 
+Quote Post
rav38
сообщение Oct 28 2014, 09:25
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 12-06-12
Из: Москва
Пользователь №: 72 275



у меня уже кажется окончательно "замылился" глаз и такое чувство что запутался в какой-то мелочи((((
посмотрите еще пожалуйста исходник в прищепке. простая инициализация. какое-то время посылаю байты в порт. потом останавливаю отладчик и смотрю буфер. никаких изменений нет

Сообщение отредактировал rav38 - Oct 28 2014, 09:29
Прикрепленные файлы
Прикрепленный файл  usart.rar ( 9.96 килобайт ) Кол-во скачиваний: 13
 
Go to the top of the page
 
+Quote Post

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

 


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


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