Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F10x USART 7Bit word_len
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
demiurg_spb
Стал портировать модбас ASCII на железку с STM32F10x и облом...
Не реализована поддержка 7-ми битного режима в этой серии кристаллов (есть только 8,9 бит и 7 бит в режиме LIN).

Есть у кого-нибудь идеи как сие можно побороть?
ViKo
А бит четности в Модбасе есть? Тогда переместите его в 8-й бит данных.
Если нет, сделайте 8-й бит стоповым. Будет у вас 2 стопа, что тоже неплохо.
demiurg_spb
Цитата(ViKo @ Mar 19 2013, 09:50) *
А бит четности в Модбасе есть? Тогда переместите его в 8-й бит данных.
Если нет, сделайте 8-й бит стоповым. Будет у вас 2 стопа, что тоже неплохо.

По стандарту либо 2 стоп-бита без чётности, либо чётность и один стоп-бит.

Это вы предлагаете программно считать чётность и добивать ею 7-ой бит (нумерация с нуля)?
SasaVitebsk
Так а другого варианта не просматривается ... ))
demiurg_spb
Хорошо. К вопросу о быстрых способах вычисления количества единиц (нулей) в байте...
Поглядел на cortex-m3 instruction set и не смог найти ничего подходящего по данной теме (ну кроме CLZ и Bitfield Instructions)...
Есть хорошо известный табличный метод:
Код
uint_fast8_t bits_in_byte(uint_fast8_t byte)
{
        static const uint_fast8_t matrix[] =
        {
                0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3,
                4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4,
                4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2,
                3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5,
                4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4,
                5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3,
                3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2,
                3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6,
                4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
                3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6,
                4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
        };

        return matrix[byte];
}

Есть-ли ещё более оптимальные и быстрые варианты?
Вспомнил про вариант для AVR (видимо его стоит творчески переработать под ARM):
Код
#define parity_even_bit(val)                \
(__extension__({                    \
    unsigned char __t;                \
    __asm__ (                    \
        "mov __tmp_reg__,%0" "\n\t"        \
        "swap %0" "\n\t"            \
        "eor %0,__tmp_reg__" "\n\t"        \
        "mov __tmp_reg__,%0" "\n\t"        \
        "lsr %0" "\n\t"                \
        "lsr %0" "\n\t"                \
        "eor %0,__tmp_reg__"             \
        : "=r" (__t)                \
        : "0" ((unsigned char)(val))        \
        : "r0"                    \
    );                        \
    (((__t + 1) >> 1) & 1);                \
}))
drum1987
а "классическое" сдвиг-сложение этот камень не осилит чтоли? В асм лезть не советую...компилятор вы вряд ли переплюните...
scifi
Так?

Код
int parity(int b)
{
   b ^= b >> 1;
   b ^= b >> 2;
   b ^= b >> 4;
   return b & 1;
}
ViKo
Цитата(demiurg_spb @ Mar 19 2013, 08:55) *
По стандарту либо 2 стоп-бита без чётности, либо чётность и один стоп-бит.
Это вы предлагаете программно считать чётность и добивать ею 7-ой бит (нумерация с нуля)?

Можно четность в bit7, можно 1-цу (стоп) - так проще. Но, как показал scifi, и четность вычислить несложно.
MK2
возможно я неправильно понял ТС, но по-моему там все есть:
Нажмите для просмотра прикрепленного файла
demiurg_spb
Цитата(MK2 @ Mar 19 2013, 13:06) *
Очень вовремяsm.gif Спасибо! У меня был RM от 2009 года...
Но и тут тоже в самом начале описания модуля USART говорится лишь о 8ми и 9ти битах.
+ Ещё смутило что в стандартой библиотеке тоже тишина о 7ми битах.
Цитата
27.2 USART main features
● Programmable data word length (8 or 9 bits)

Попробую напрямую с конфигурационными регистрами поработать. О результатах отпишусь.
demiurg_spb
Отписываюсь:
У ST очень странные понятия о параметре data word length. В их понимании это не только биты данных но и бит чётности (об этом и в их библиотеке написано в каментах к USART_Init).
Таким образом невозможно реализовать режим br-7-n-1, а режим br-7-n-2 приходится делать через одно место посредством режима br-8-n-1.
Без танцев с бубном возможны лишь следующие 7-ми битные режимы:
br-7-е-1
br-7-o-1
br-7-е-2
br-7-o-2
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.