keks9357 0 11 апреля, 2017 Опубликовано 11 апреля, 2017 (изменено) · Жалоба Всем привет. Суть проблемы такова: запускаю проект. Возникает прерывание 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 */ Изменено 11 апреля, 2017 пользователем IgorKossak [codebox] для длинного кода. [code]-для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 11 апреля, 2017 Опубликовано 11 апреля, 2017 (изменено) · Жалоба 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? Изменено 11 апреля, 2017 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
keks9357 0 11 апреля, 2017 Опубликовано 11 апреля, 2017 (изменено) · Жалоба Взял пример с st.com. Спасибо буду курить. (как это сложно) Но вопрос в том почему вылезает флаг FE после строчки USART7->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_RXNEIE | USART_CR1_UE; а конкретно после установки бита USART_CR1_RE. Изменено 11 апреля, 2017 пользователем keks9357 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 11 апреля, 2017 Опубликовано 11 апреля, 2017 · Жалоба а конкретно после установки бита USART_CR1_RE.На входе вашего УАПП физически откуда-то присутствует ноль. Как только вы разрешаете прием, этот ноль воспринимается за стартовый бит. УАПП честно отсчитывает 10 битовых интервалов и не обнаруживает на входе единицы в тот момент, когда ожидает на входе стоповый бит. О чем честно и сообщает ошибкой FE. Надо не только курить, но и думать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
keks9357 0 11 апреля, 2017 Опубликовано 11 апреля, 2017 (изменено) · Жалоба Я понимаю что ошибка возникает из-за того, что на ноге не тот уровень. А вот причину выявить не могу. Всем спасибо за мысли и подсказки. Уверен дело в какой нибудь мелочи))) как всегда!) Обязательно отпишусь в чем было дело. Изменено 11 апреля, 2017 пользователем keks9357 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 11 апреля, 2017 Опубликовано 11 апреля, 2017 · Жалоба Я понимаю что ошибка возникает из-за того, что на ноге не тот уровень. А вот причину выявить не могу.Так идите от УАПП. Для начала проверьте, какая нога (ноги) подключены к нему на вход через свои альтернативные функции. Потом смотрите, действительно ли эти ноги настроены на ввод. После этого смотрите, какой уровень нога видит в своем регистре IDR и в самом конце тупо проверить вольтметром напряжение на выводе микросхемы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
keks9357 0 11 апреля, 2017 Опубликовано 11 апреля, 2017 · Жалоба Спасибо. Буду проверять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться