Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F103 проблемы с контролем четности USART
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
sidy
Добрый день.

Потребовалось использовать контроль четности в USART (STM32f103) и возникла проблема. При отсутствии контроля четности прием идет правильно. Например посылка:
01 04 00 41 00 01 224 02
принимается должным образом.
При включении контроля четности, например odd принимаю ту же самую посылка следующим образом:
01 04 256 41 256 01 224 02
Т.е. вместо 0 принимается 256

Вот код инициализации USART:
RCC->APB2ENR|=RCC_APB2ENR_USART1EN;
USART1->CR1=USART1->CR2=USART1->CR3=0;
USART1->BRR=CPU_CLOCK/BAUD_RATE;
USART1->CR1|=USART_CR1_M;
USART1->CR1|=USART_CR1_PCE;
USART1->CR1|=USART_CR1_PS;
USART1->CR1|=USART_CR1_TE;
USART1->CR1|=USART_CR1_RE;
USART1->CR1|=USART_CR1_TCIE;
USART1->CR1|=USART_CR1_RXNEIE;

Подскажите в чем может быть дело.
ViKo
256 не влазит в 8-битовый байт. rolleyes.gif Дело в интерпретации числа 0x100.
sidy

Еще забыл добавить при контроле четности Even, посылка будет выглядеть так:
257 260 00 297 257 480 258
т.е. как-будто к каждому числу прибавили 256

Цитата(ViKo @ Aug 31 2018, 16:10) *
256 не влазит в 8-битовый байт. rolleyes.gif Дело в интерпретации числа 0x100.


т.е. нужно дополнительно преобразовывать значения в зависимости от того какой контроль четности используется?
x893
Четность + данные = 9 бит
ViKo
Цитата(sidy @ Aug 31 2018, 16:17) *
т.е. нужно дополнительно преобразовывать значения в зависимости от того какой контроль четности используется?

Так сразу интерпретируйте как 8-битов.
sidy
Цитата(ViKo @ Aug 31 2018, 21:13) *
Так сразу интерпретируйте как 8-битов.

Маску наложить? Думаю пройдет такой вариант.
ViKo
Цитата(sidy @ Aug 31 2018, 21:16) *
Маску наложить? Думаю пройдет такой вариант.

Настройки изучите в Referense Manual.
sidy
Цитата(ViKo @ Aug 31 2018, 21:19) *
Настройки изучите в Referense Manual.

Вы имеет ввиду бит USART_CR1_M?
ViKo
Цитата(sidy @ Sep 3 2018, 08:54) *
Вы имеет ввиду бит USART_CR1_M?

Ага, наверное, его. У меня передаются и принимаются 8-битовые байты. Четность не использую, два стопа делал. Никаких масок.
esaulenka
код из прерывания UART'а:

Код
    uint32_t status = uart_hw->SR;

    // receiver not empty
    if (USART_SR_RXNE & status)
    {
        uint16_t data = uart_hw->DR;
        if (parity_en)        // "срезать" бит чётности
            data &= 0xFF;


parity_en - флажок из настроек драйвера (он многофункциональный).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.