Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32f091vc + USART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
keks9357
Всем привет. Суть проблемы такова: запускаю проект. Возникает прерывание FE(frame error), и кидает в обработчик прерываний. Если пошагово в отладчике проходить инициализацию USART, то USART работает. Пример взят с st.com и немного переделан для USART7(USART4 и USART1 заработали нормально). Добавление задержек не помогло. Нужен совет куда хотя бы смотреть? Скорее всего детская ошибка в инициализации, которую я в упор не вижу. Среда IAR 7.50.2 и St-Linkv2. Спасибо

Код
  RCC->AHBENR |=RCC_AHBENR_GPIOFEN;                                                                                                                                                            /* Enable the peripheral clock of GPIO */

  GPIOF->MODER = (GPIOF->MODER & ~(GPIO_MODER_MODER2|GPIO_MODER_MODER3)) | (GPIO_MODER_MODER2_1 | GPIO_MODER_MODER3_1);    /* (1) Select AF mode (10) on PF3 and PF2 */
  GPIOF->AFR[0] = (GPIOF->AFR[0] & ~(GPIO_AFRL_AFRL2 | GPIO_AFRL_AFRL3)) | (1 << 2*4) | (1 << 3*4);                                    /* (2) AF1 (01) for USART signals */

  RCC->APB2ENR |= RCC_APB2ENR_USART7EN;                                                                                /* Enable the peripheral clock USART */

  USART7->BRR = 480000 / 96;                                                                                            /* (1) oversampling by 16, 9600 baud */
  USART7->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_RXNEIE | USART_CR1_UE;            /* (3) 8 data bit, 1 start bit, 1 stop bit, no parity, reception and transmission enabled */
  while((USART7->ISR & USART_ISR_TC) != USART_ISR_TC)                                    /* polling idle frame Transmission */
  {
    /* add time out here for a robust application */
  }
  USART7->ICR |= USART_ICR_TCCF;                                                        /* Clear TC flag */
  USART7->CR1 |= USART_CR1_TCIE;                                                    /* Enable TC interrupt */
  
  NVIC_SetPriority(USART3_8_IRQn, 0);                                                    /* (4) Set priority for USART1_IRQn */
  NVIC_EnableIRQ(USART3_8_IRQn);                                                        /* (5) Enable USART1_IRQn */
Genadi Zawidowski
Цитата
USART7->ICR |= USART_ICR_TCCF; /* Clear TC flag */

курить описание регистра ICR, правильно так:
Цитата
USART7->ICR = USART_ICR_TCCF;


после
Цитата
RCC->APB2ENR |= RCC_APB2ENR_USART7EN; /* Enable the peripheral clock USART */
перед последующей операцией попробуйте просто
Цитата
(void) RCC->APB2ENR;


а в чем смысл в инициализации ждать (и сбрасывать) прерывание TC?
keks9357
Взял пример с st.com. Спасибо буду курить. (как это сложно)
Но вопрос в том почему вылезает флаг FE после строчки USART7->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_RXNEIE | USART_CR1_UE;
а конкретно после установки бита USART_CR1_RE.
Сергей Борщ
QUOTE (keks9357 @ Apr 11 2017, 11:21) *
а конкретно после установки бита USART_CR1_RE.
На входе вашего УАПП физически откуда-то присутствует ноль. Как только вы разрешаете прием, этот ноль воспринимается за стартовый бит. УАПП честно отсчитывает 10 битовых интервалов и не обнаруживает на входе единицы в тот момент, когда ожидает на входе стоповый бит. О чем честно и сообщает ошибкой FE.
Надо не только курить, но и думать.
keks9357
Я понимаю что ошибка возникает из-за того, что на ноге не тот уровень. А вот причину выявить не могу. Всем спасибо за мысли и подсказки. Уверен дело в какой нибудь мелочи))) как всегда!) Обязательно отпишусь в чем было дело.
Сергей Борщ
QUOTE (keks9357 @ Apr 11 2017, 12:08) *
Я понимаю что ошибка возникает из-за того, что на ноге не тот уровень. А вот причину выявить не могу.
Так идите от УАПП. Для начала проверьте, какая нога (ноги) подключены к нему на вход через свои альтернативные функции. Потом смотрите, действительно ли эти ноги настроены на ввод. После этого смотрите, какой уровень нога видит в своем регистре IDR и в самом конце тупо проверить вольтметром напряжение на выводе микросхемы.
keks9357
Спасибо. Буду проверять.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.