|
|
  |
Как завести USART1 ?, Не видно передачи осцилоскопом |
|
|
|
Dec 13 2011, 10:05
|
Знающий
   
Группа: Свой
Сообщений: 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]
|
|
|
|
|
Dec 13 2011, 11:47
|
Знающий
   
Группа: Свой
Сообщений: 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]
|
|
|
|
|
Dec 13 2011, 14:21
|

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

|
Во-первых, сначала надо включать тактирование ножек/AFIO, а уже потом - ремап. Во-вторых, зачем вам вообще этот ремап, для PA9/PA10 он не нужен  В третьих, флаги прерываний UART сбрасываются чтением DR. Вполне возможно, что при отладке он считывается лишний раз, вот больше и нет прерываний. Попробуйте без отладчика. ЗЫ. Используйте пожалуйста для оформления фрагментов программ кнопочку CODE:  . А для больших кусков - CODEBOX (слева, под смайликами).
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Dec 13 2011, 14:42
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(AHTOXA @ Dec 13 2011, 17:21)  Во-первых, сначала надо включать тактирование ножек/AFIO, а уже потом - ремап. Во-вторых, зачем вам вообще этот ремап, для PA9/PA10 он не нужен  В третьих, флаги прерываний UART сбрасываются чтением DR. Вполне возможно, что при отладке он считывается лишний раз, вот больше и нет прерываний. Попробуйте без отладчика. ЗЫ. Используйте пожалуйста для оформления фрагментов программ кнопочку CODE:  . А для больших кусков - CODEBOX (слева, под смайликами). Не зyаю...ниче не получается. передача есть, прием только один раз  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); } } } в чем может быть дело? все уарты перепробовал-одно и то же. такое ощущение что на прием его нужно как то взводить каждый раз.
|
|
|
|
|
Dec 13 2011, 15:08
|

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

|
Цитата(inventor @ Dec 13 2011, 20:42)  Не зyаю...ниче не получается. передача есть, прием только один раз  Ну как же ничё? Передача уже работает  А как вы проверяете, что нет приёма? Код у вас правильный сейчас. Попробуйте включить мигание светодиодом в обработчике приёма, и посмотрите без отладчика. ---- Добавлено: А куда делось тактирование AFIO?!
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Dec 13 2011, 18:08
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(AHTOXA @ Dec 13 2011, 18:08)  Ну как же ничё? Передача уже работает  А как вы проверяете, что нет приёма? Код у вас правильный сейчас. Попробуйте включить мигание светодиодом в обработчике приёма, и посмотрите без отладчика. ---- Добавлено: А куда делось тактирование AFIO?! Это просто один из вариантов. тактирование альтернативной функции (как я понимаю) в этот раз я убрал. а посылки у меня были.а приема как не было так и нет. я уж думаю, может пайка плохая... прерывание Rx возникает один, ну или редко два раза. а потом тишина... передача идет, а приема нет. завтра надо попробовать БЕЗ прерываний прием сделать,посмотреть,хотя бы работает или нет. А насчет светодиода-я ставил внутрь обработчика его, но он слишком быстро переключается, поэтому кажется что горит все время.
|
|
|
|
|
Dec 14 2011, 03:59
|

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

|
Цитата(inventor @ Dec 14 2011, 00:08)  Это просто один из вариантов. тактирование альтернативной функции (как я понимаю) в этот раз я убрал. И зря. Как только какая-то ножка используется не в качестве GPIO, тактирование AFIO надо включать. То есть, практически всегда. Цитата(inventor @ Dec 14 2011, 00:08)  А насчет светодиода-я ставил внутрь обработчика его, но он слишком быстро переключается, поэтому кажется что горит все время. Поставьте его в ту ветку, которая выполняется при приёме символа. Если и там быстро переключается, то значит приём есть
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Dec 14 2011, 08:13
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(AHTOXA @ Dec 14 2011, 06:59)  И зря. Как только какая-то ножка используется не в качестве GPIO, тактирование AFIO надо включать. То есть, практически всегда. Поставьте его в ту ветку, которая выполняется при приёме символа. Если и там быстро переключается, то значит приём есть  спасибо за помощь! По ходу дело в оптимизации или в самом компиляторе. Поставил код, который моргает светодиодом и на него брейкпойт заходит внутрь нормально.й хотя очень странно, я и оптимизацию до этого выключал и переменные описал как volatile.
|
|
|
|
|
Dec 14 2011, 08:31
|

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

|
Так что, теперь всё работает? Цитата(inventor @ Dec 14 2011, 14:13)  По ходу дело в оптимизации или в самом компиляторе. Вряд ли. Наблюдения показывают, что обычно виноват программист  Я думаю, что сначала у вас не работало потому, что был включен ремап, а потом - потому, что отключили тактирование AFIO. Что касаемо volatile, то регистр данных уже объявлен как volatile, поэтому компилятор ни при каких условиях не имеет права выкидывать чтение из него (USART_ReceiveData(USART1)).
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|