реклама на сайте
подробности

 
 
> STM32F10x USART 7Bit word_len, Отсутствует 7-ми битный режим...
demiurg_spb
сообщение Mar 19 2013, 05:44
Сообщение #1


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Стал портировать модбас ASCII на железку с STM32F10x и облом...
Не реализована поддержка 7-ми битного режима в этой серии кристаллов (есть только 8,9 бит и 7 бит в режиме LIN).

Есть у кого-нибудь идеи как сие можно побороть?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 10)
ViKo
сообщение Mar 19 2013, 05:50
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



А бит четности в Модбасе есть? Тогда переместите его в 8-й бит данных.
Если нет, сделайте 8-й бит стоповым. Будет у вас 2 стопа, что тоже неплохо.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Mar 19 2013, 05:55
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



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

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

Это вы предлагаете программно считать чётность и добивать ею 7-ой бит (нумерация с нуля)?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 19 2013, 06:02
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Так а другого варианта не просматривается ... ))
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Mar 19 2013, 06:35
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Хорошо. К вопросу о быстрых способах вычисления количества единиц (нулей) в байте...
Поглядел на 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);                \
}))


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
drum1987
сообщение Mar 19 2013, 07:08
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 255
Регистрация: 3-02-09
Из: Омск
Пользователь №: 44 323



а "классическое" сдвиг-сложение этот камень не осилит чтоли? В асм лезть не советую...компилятор вы вряд ли переплюните...
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 19 2013, 07:25
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Так?

Код
int parity(int b)
{
   b ^= b >> 1;
   b ^= b >> 2;
   b ^= b >> 4;
   return b & 1;
}
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 19 2013, 07:30
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(demiurg_spb @ Mar 19 2013, 08:55) *
По стандарту либо 2 стоп-бита без чётности, либо чётность и один стоп-бит.
Это вы предлагаете программно считать чётность и добивать ею 7-ой бит (нумерация с нуля)?

Можно четность в bit7, можно 1-цу (стоп) - так проще. Но, как показал scifi, и четность вычислить несложно.
Go to the top of the page
 
+Quote Post
MK2
сообщение Mar 19 2013, 09:06
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 202
Регистрация: 30-10-10
Пользователь №: 60 535



возможно я неправильно понял ТС, но по-моему там все есть:
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Mar 19 2013, 09:26
Сообщение #10


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(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)

Попробую напрямую с конфигурационными регистрами поработать. О результатах отпишусь.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Mar 19 2013, 13:44
Сообщение #11


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Отписываюсь:
У 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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 22:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01585 секунд с 7
ELECTRONIX ©2004-2016