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

 
 
 
Reply to this topicStart new topic
> Как завести USART1 ?, Не видно передачи осцилоскопом
inventor
сообщение Dec 13 2011, 10:05
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Проблема такая.
На отладочной плате stm32vlDiscovery завел первый USART
прерывания есть-вроде как работает, прерывания прерываются и туда в обработчик заходят, собрал переходничок на ADM3202 чтобы можно было подцепить к компьютеру и посмотреть обмен, но смотрю дальше осцилоскопом-нету передачи,а ножка Tx висит в нуле.
CODE

void USART_Config(void)
{
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;


/* Enable USART clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

/* Remap GPIO */
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);



USART_InitStructure.USART_BaudRate = 115200;
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_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);

/* Enable the USART1 Transmit interrupt */
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);

/* Enable the USART1 Receive interrupt */
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);


/* Enable the USARTx Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

/* Enable USART */
USART_Cmd(USART1, ENABLE);
}


Может я че не понимаю, но вроде нужно сделать так, чтобы выводы были не портами а USART так называема альтернативная функция
но у меня вроде ка это сделано
/* Remap GPIO */
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);

Ожидаю сигнала на порте PA9 но там его нету.
Может кто поможет?

Сообщение отредактировал IgorKossak - Dec 13 2011, 18:07
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 13 2011, 11:07
Сообщение #2


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

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



RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE );


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
inventor
сообщение Dec 13 2011, 11:47
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(AHTOXA @ Dec 13 2011, 14:07) *
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE );


Да...это я добавил и кроме этого сделал так:
CODE

void USART_Config(void)
{
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStruct;


/* Remap GPIO */
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);


/* Enable GPIO clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);



/* Configure USART Tx as alternate function push-pull */
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);

/* Configure USART Rx as input floating */
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA, &GPIO_InitStruct);




/* USARTx configuration ----------------------------------------------------*/
/* USARTx configured as follow:
- BaudRate = 230400 baud
- Word Length = 8 Bits
- One Stop Bit
- No parity
- Hardware flow control disabled (RTS and CTS signals)
- Receive and transmit enabled
*/
USART_InitStructure.USART_BaudRate = 115200;
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_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);

/* Enable the USART1 Transmit interrupt */
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);

/* Enable the USART1 Receive interrupt */
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);


/* Enable the USARTx Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

/* Enable USART */
USART_Cmd(USART1, ENABLE);
}

Теперь проблема вот в чем. передача работает, а прием случается только один раз. причина мне непонятна.
вот обработчик:
CODE

void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE))
{
/* Read one byte from the receive data register */
RxBuffer[RxCounter++] = USART_ReceiveData(USART1);


if(RxCounter == NbrOfDataToRead)
{
RxCounter = 0;
}
}

if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
{
/* Write one byte to the transmit data register */
USART_SendData(USART1, TxBuffer[TxCounter++]);

if(TxCounter == NbrOfDataToTransfer)
{
TxCounter = 0;
STM32vldiscovery_LEDToggle(LED4);

/* Disable the EVAL_COM2 Transmit interrupt */
// USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
}
}
}

Ставлю брекпойнт на /* Read one byte from the receive data register */
RxBuffer[RxCounter++] = USART_ReceiveData(USART1);
Прерывание чтения возникает только один раз. В чем может быть проблема?

Сообщение отредактировал IgorKossak - Dec 13 2011, 18:09
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 13 2011, 14:21
Сообщение #4


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

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



Во-первых, сначала надо включать тактирование ножек/AFIO, а уже потом - ремап.
Во-вторых, зачем вам вообще этот ремап, для PA9/PA10 он не нужен sm.gif
В третьих, флаги прерываний UART сбрасываются чтением DR. Вполне возможно, что при отладке он считывается лишний раз, вот больше и нет прерываний. Попробуйте без отладчика.
ЗЫ. Используйте пожалуйста для оформления фрагментов программ кнопочку CODE: . А для больших кусков - CODEBOX (слева, под смайликами).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
inventor
сообщение Dec 13 2011, 14:42
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(AHTOXA @ Dec 13 2011, 17:21) *
Во-первых, сначала надо включать тактирование ножек/AFIO, а уже потом - ремап.
Во-вторых, зачем вам вообще этот ремап, для PA9/PA10 он не нужен sm.gif
В третьих, флаги прерываний UART сбрасываются чтением DR. Вполне возможно, что при отладке он считывается лишний раз, вот больше и нет прерываний. Попробуйте без отладчика.
ЗЫ. Используйте пожалуйста для оформления фрагментов программ кнопочку CODE: . А для больших кусков - CODEBOX (слева, под смайликами).



Не зyаю...ниче не получается. передача есть, прием только один раз sad.gif

CODE
void USART_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

/* тактирование */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

/* USART1_Rx на вход */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);


/* USART1_Tx на выход */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Сам уарт */
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_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);

/* IRQ для USART1 Rx */
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);


/* IRQ для USART1 Tx */
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);


/* NVIC */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

/* Enable the USART1 */
USART_Cmd(USART1, ENABLE);
}


сзамкнул ножки pa9 и pa10-опять прерывание только один раз
и обработчик
CODE
void USART1_IRQHandler(void)
{


if(USART_GetITStatus(USART1, USART_IT_RXNE)!= RESET)
{
/* Read one byte from the receive data register */
a = USART_ReceiveData(USART1);
a++;

/* if(RxCounter == NbrOfDataToRead)
{
RxCounter = 0;
}
*/
}

if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
{
/* Write one byte to the transmit data register */
USART_SendData(USART1, TxBuffer[TxCounter++]);

if(TxCounter == NbrOfDataToTransfer)
{
TxCounter = 0;
STM32vldiscovery_LEDToggle(LED4);

/* Disable the EVAL_COM2 Transmit interrupt */
// USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
}
}
}


в чем может быть дело?
все уарты перепробовал-одно и то же.
такое ощущение что на прием его нужно как то взводить каждый раз.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 13 2011, 15:08
Сообщение #6


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

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



Цитата(inventor @ Dec 13 2011, 20:42) *
Не зyаю...ниче не получается. передача есть, прием только один раз sad.gif

Ну как же ничё? Передача уже работаетsm.gif
А как вы проверяете, что нет приёма? Код у вас правильный сейчас.
Попробуйте включить мигание светодиодом в обработчике приёма, и посмотрите без отладчика.
----
Добавлено: А куда делось тактирование AFIO?!


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
inventor
сообщение Dec 13 2011, 18:08
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(AHTOXA @ Dec 13 2011, 18:08) *
Ну как же ничё? Передача уже работаетsm.gif
А как вы проверяете, что нет приёма? Код у вас правильный сейчас.
Попробуйте включить мигание светодиодом в обработчике приёма, и посмотрите без отладчика.
----
Добавлено: А куда делось тактирование AFIO?!


Это просто один из вариантов. тактирование альтернативной функции (как я понимаю) в этот раз я убрал.
а посылки у меня были.а приема как не было так и нет.
я уж думаю, может пайка плохая...
прерывание Rx возникает один, ну или редко два раза.
а потом тишина...
передача идет, а приема нет.
завтра надо попробовать БЕЗ прерываний прием сделать,посмотреть,хотя бы работает или нет.
А насчет светодиода-я ставил внутрь обработчика его, но он слишком быстро переключается,
поэтому кажется что горит все время.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 14 2011, 03:59
Сообщение #8


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

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



Цитата(inventor @ Dec 14 2011, 00:08) *
Это просто один из вариантов. тактирование альтернативной функции (как я понимаю) в этот раз я убрал.

И зря. Как только какая-то ножка используется не в качестве GPIO, тактирование AFIO надо включать. То есть, практически всегда.
Цитата(inventor @ Dec 14 2011, 00:08) *
А насчет светодиода-я ставил внутрь обработчика его, но он слишком быстро переключается,
поэтому кажется что горит все время.

Поставьте его в ту ветку, которая выполняется при приёме символа. Если и там быстро переключается, то значит приём естьsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
inventor
сообщение Dec 14 2011, 08:13
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(AHTOXA @ Dec 14 2011, 06:59) *
И зря. Как только какая-то ножка используется не в качестве GPIO, тактирование AFIO надо включать. То есть, практически всегда.

Поставьте его в ту ветку, которая выполняется при приёме символа. Если и там быстро переключается, то значит приём естьsm.gif


спасибо за помощь!
По ходу дело в оптимизации или в самом компиляторе.
Поставил код, который моргает светодиодом и на него брейкпойт
заходит внутрь нормально.й
хотя очень странно, я и оптимизацию до этого выключал
и переменные описал как volatile.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 14 2011, 08:31
Сообщение #10


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

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



Так что, теперь всё работает?
Цитата(inventor @ Dec 14 2011, 14:13) *
По ходу дело в оптимизации или в самом компиляторе.

Вряд ли. Наблюдения показывают, что обычно виноват программистsm.gif
Я думаю, что сначала у вас не работало потому, что был включен ремап, а потом - потому, что отключили тактирование AFIO.
Что касаемо volatile, то регистр данных уже объявлен как volatile, поэтому компилятор ни при каких условиях не имеет права выкидывать чтение из него (USART_ReceiveData(USART1)).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
inventor
сообщение Dec 14 2011, 13:21
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Все заработало как часы.
пересобрал старые проекты для AVR и TMS на этой платке.
Все работает. Теперь нужно внутренности этого камня изучать.
Еще раз спасибо!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 12th August 2025 - 14:45
Рейтинг@Mail.ru


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