Перейти к содержанию
    

stm32f091vc + USART

Всем привет. Суть проблемы такова: запускаю проект. Возникает прерывание 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 */

Изменено пользователем IgorKossak
[codebox] для длинного кода. [code]-для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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?

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Взял пример с st.com. Спасибо буду курить. (как это сложно)

Но вопрос в том почему вылезает флаг FE после строчки USART7->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_RXNEIE | USART_CR1_UE;

а конкретно после установки бита USART_CR1_RE.

 

Изменено пользователем keks9357

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а конкретно после установки бита USART_CR1_RE.
На входе вашего УАПП физически откуда-то присутствует ноль. Как только вы разрешаете прием, этот ноль воспринимается за стартовый бит. УАПП честно отсчитывает 10 битовых интервалов и не обнаруживает на входе единицы в тот момент, когда ожидает на входе стоповый бит. О чем честно и сообщает ошибкой FE.

Надо не только курить, но и думать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я понимаю что ошибка возникает из-за того, что на ноге не тот уровень. А вот причину выявить не могу. Всем спасибо за мысли и подсказки. Уверен дело в какой нибудь мелочи))) как всегда!) Обязательно отпишусь в чем было дело.

Изменено пользователем keks9357

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...