Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F2 USART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
rav38
Здравствуйте все!

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

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

Если не вижу очевидного - ткните легонько носом пожалуйста.
rav38
Обратил внимание на настройку 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
Golikov A.
нога RX должна быть ни входом, ни выходом, она должна быть альтернативной функцией, ногой RX! Только в таком случае она будет подключена к входным цепям приемника....
А подтяжка не имеет смысла, потому что после переключения ее в альтернативную функцию уже эти каскады отключаются, вроде как...
rav38
Код
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);


вот таким образом из библиотечных примеров. не помогло. по-прежнему не могу ничего принять
dac
QUOTE (rav38 @ Oct 27 2014, 17:06) *
Состояние регистров порта на картинке.

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


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

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

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


Сергей Борщ
Цитата(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

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


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

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

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

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

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


AHTOXA
Я думаю, что Сергей вёл речь про F1xx. Там периферия именно что вся подключена к ноге. И можно включить, например, два разных периферийных модуля, которые используют одну и ту же ногу. Это, конечно, было криво, и потому ST исправили модуль GPIO в следующих после F1xx контроллерах.
В F2xx у ножек есть специальный регистр выбора альтернативных функций, и нога подключается только к одному периферийному модулю.
ЗЫ. Кстати, видел какое-то полезное использование возможности подключения ножки к нескольким периферийным модулям в F1xx, только вот не помню какое. То ли таймером измеряли длительность бита UART-а, то ли что-то ещё.
Сергей Борщ
Я вел речь про F2x. Понятно, что выходы периферии подключены через мультиплексор. Но входы периферии друг другу и никому другому не мешают и поэтому (согласно руководству пользователя) подключены к соотвесттвующим линиям постоянно. Хотя да, как их при этом развести между разными физическими ногами - непонятно. Видимо достаточно выбрать правильную альтернативную функцию для ноги, но переводить ногу в режим альтернативной функции не нужно. Кстати, а у автора вопроса выбрана соответствующая AF для нужной ноги?
AHTOXA
Цитата(Сергей Борщ @ Oct 27 2014, 22:56) *
Но входы периферии друг другу и никому другому не мешают и поэтому (согласно руководству пользователя) подключены к соотвесттвующим линиям постоянно. Хотя да, как их при этом развести между разными физическими ногами - непонятно.

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

Вроде бы да:
Код
GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
Golikov A.
не сочтите за занудство, но когда начинается магия, я бы проверил бы что же в итоге лежит в регистрах управления.

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


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

настоечные регистры ни только UART но главное регистры порта (направление, режим, подтяжки, выбор функции)

rav38
в общем проблема была решена так:

1) отключил stm32f2xx_hal_usart.h
2) подключил stm32f2xx_hal_uart.h
3) переименовал ф-ции и переменные по принципу: HAL_USART_Init -> HAL_UART_Init

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

Спасибо за участие!

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.