Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
0 / 0 / 1
Регистрация: 18.11.2018
Сообщений: 35

Как задать четность всегда 0 (ну или всегда 1) stm32

21.09.2025, 11:50. Показов 1041. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно использовать бит четности как адресный бит. Если передается адрес, то бит четности в 1. Во всех остальных случаях в 0. Как это реализовать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.09.2025, 11:50
Ответы с готовыми решениями:

Общение с барометром MS5540 на STM32 (Arduino to STM32)
Получил от китайца сей аппарат, пошел тут же гуглить что нибудь готовое, но не тут то было....

stm32 + FSMC + stm32
Доброе времени суток. Возможно ли к Ftosh памяти подцепить два Stm32F4. Один МК будет записывать...

Чем связать STM32 + STM32 в одном корпусе?
Есть 2 платы: (1) - STM32 (Вывод на LCD + запись SD) и (2) - STM32F4 (обработка сигналов +...

27
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
21.09.2025, 13:04
adiagnost, в USART?
0
0 / 0 / 1
Регистрация: 18.11.2018
Сообщений: 35
21.09.2025, 13:16  [ТС]
Да, в USART - RS-485
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
21.09.2025, 13:25
я это видел на AVRках там это называется типа "межпроцессорный обмен" точно не помню из за давности
на ARM(STM) я как то не обращал внимание, скорее всего тоже где то есть.
Я пользую другому включаю 9битный режим с одним стоп битом
и когда считываю проверяю 9 бит
позже скину свои зарисовки
0
0 / 0 / 1
Регистрация: 18.11.2018
Сообщений: 35
21.09.2025, 13:34  [ТС]
включаю 9битный режим с одним стоп битом
и когда считываю проверяю 9 бит
И получается, что можно устанавливать бит четности по своему усмотрению?
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
21.09.2025, 13:41
Цитата Сообщение от adiagnost Посмотреть сообщение
И получается, что можно устанавливать бит четности по своему усмотрению?
у меня сейчас нет стандарта USART под рукой
и я не могу сказать как расположены биты
если это 9 бит то да можно
я работаю с DMX там данные с 9 бит "1" а синхро с "0"
0
0 / 0 / 1
Регистрация: 18.11.2018
Сообщений: 35
21.09.2025, 14:04  [ТС]
В принципе, насколько я понимаю, в данном вопросе не важен протокол верхнего уровня (DMX или RS-485 или ещё какие-то с проверкой бита четности), главное как на уровне контроллера управлять этим (9-м) битом в UART (USART).
Так что для меня не вполне понятно вот это:
я работаю с DMX там данные с 9 бит "1" а синхро с "0"
Или так - в первичных настройках UART выставляется 9 бит, разрешается бит четности (при этом четность не важна), а при преобразовании логических уровней UART в DMX есть возможность как-то принудительно выставлять 9-ый бит?
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
21.09.2025, 14:15
Цитата Сообщение от adiagnost Посмотреть сообщение
UART в DMX есть возможность как-то принудительно выставлять 9-ый бит?
ну да
вот скину тебе кусок чтения DMX кода
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
uint8_t DmxBufIn[513];
int FlagDmx;
int ChanelDMX;
 
static uint8_t bStart;
static uint8_t bBegin;
static uint16_t tmpAddr;
 
void DmxRead(void)
{
uint16_t data;
uint8_t btmp;   
 
  //data= USART_ReceiveData(USARTDMX);
    data = (uint16_t)(huart3.Instance->DR & (uint16_t)0x01FF);
      btmp=(uint8_t)((data&0x0100)==0x100);
       data&=0xFF;
 
 
 
       if(!bStart)
        {
 
        if(data==0&&!btmp) // 9 бит 0 стартовая посылка
            {
//              QualAddr=tmpAddr;
                bStart=1;
                ChanelDMX=tmpAddr;
                tmpAddr=0;   
            }
        }
       else
       {
          if(btmp)    // 9 бит в 1 иначе ошибка
           {
             if(bBegin)
              {
               DmxBufIn[tmpAddr]=data;  
               tmpAddr++;
                    FlagDmx=10;
              if(tmpAddr>511)
                    {
                          bBegin=0;
                          bStart=0;
             
                    }
                }
            else
            {
             if(data==0)
              {
               bBegin=1;
              }
               else
               {
                bBegin=0;
                bStart=0;
                }
             }
           }
         else // 9 бит в 0 уходим в начало
        {
            bStart=0;             
            bBegin=0;
 
           }
       }
 
};
а с передачей чуть попозже

Добавлено через 2 минуты
Цитата Сообщение от adiagnost Посмотреть сообщение
главное как на уровне контроллера управлять этим (9-м) битом в UART (USART).
так ты не управляешь а создаешь 9битную посылку 8Бит данные а 9 бит выставляешь по своему усмотрению
1
321 / 80 / 5
Регистрация: 19.07.2024
Сообщений: 442
21.09.2025, 14:24
Цитата Сообщение от adiagnost Посмотреть сообщение
как на уровне контроллера управлять этим (9-м) битом в UART (USART).
Вопрос не понятен...
Открываем Reference Manual, описание USART_CR1, читаем:
...
Bit 12 M: Word length
This bit determines the word length. It is set or cleared by software.
0: 1 Start bit, 8 Data bits, n Stop bit
1: 1 Start bit, 9 Data bits, n Stop bit
Note: The M bit must not be modified during a data transfer (both transmission and reception)
...
Bit 10 PCE: Parity control enable
This bit selects the hardware parity control (generation and detection). When the parity
control is enabled, the computed parity is inserted at the MSB position (9th bit if M=1; 8th bit
if M=0) and parity is checked on the received data. This bit is set and cleared by software.
Once it is set, PCE is active after the current byte (in reception and in transmission).
0: Parity control disabled
1: Parity control enabled
Bit 9 PS: Parity selection
This bit selects the odd or even parity when the parity generation/detection is enabled (PCE
bit set). It is set and cleared by software. The parity is selected after the current byte.
0: Even parity
1: Odd parity
...
Зачем эти пляски с битом чётности, если можно просто включить 9-битный режим (бит 12)?
Да и как видно - никак невозможно принудительно выставить бит чётности в нужное значение. Так как он формируется контроллером аппаратно.
0
0 / 0 / 1
Регистрация: 18.11.2018
Сообщений: 35
21.09.2025, 14:34  [ТС]
кусок чтения DMX кода
Да, проанализировать состояние 9-го бита вроде понятно как. А вот устанавливать принудительно..
Пока в голову только пришло проверять каждый байт на лету и, в зависимости от того, что содержится в настоящий момент и что нужно в 9-м бите (0 или 1), перед его отправкой тоже на лету менять соответственно настройку UART_PARITY.. Правда не знаю, получится ли.. Надо пробовать.

Добавлено через 4 минуты
так ты не управляешь а создаешь 9битную посылку 8Бит данные а 9 бит выставляешь по своему усмотрению
надо строго так:
- 8 бит данных + бит четности + 2 стоп-бита.

никак невозможно принудительно выставить бит чётности в нужное значение. Так как он формируется контроллером аппаратно
вот это-то и печально.. И вопрос в том, можно ли как-то это обойти..
0
Windows must die
827 / 833 / 102
Регистрация: 23.11.2021
Сообщений: 4,840
Записей в блоге: 15
21.09.2025, 14:35
Да, это можно сделать, но только вручную. В DMA не получится, потому смысла нет. Лучше подумать над протоколом.
Или, например, CAN использовать вместо 485.
1
321 / 80 / 5
Регистрация: 19.07.2024
Сообщений: 442
21.09.2025, 14:42
Цитата Сообщение от adiagnost Посмотреть сообщение
надо строго так:
- 8 бит данных + бит четности + 2 стоп-бита.
Т.е. - нужно передавать 12-битные символы?
Так: 1 старт + 8 данных + 1 чётность + 2 стопа (вариант 1) ?
Или так: 1 старт + 9 данных + 2 стопа (вариант 2) ?

Вроде как STM32 такое не умеют. Нужно: 1) или выбрать другой МК, который умеет; 2) или реализовывать UART программно.

PS: А зачем 2 стопа? если не секрет.
0
0 / 0 / 1
Регистрация: 18.11.2018
Сообщений: 35
21.09.2025, 14:56  [ТС]
Цитата Сообщение от Eddy_Em Посмотреть сообщение
например, CAN использовать вместо 485
"Чистый" CAN с его неупорядоченностью нам не подойдет, разве что надстройки типа canOpen (ну или подобные), но у них накладные бешенные, и, учитывая необходимые скорости (1.5 мбит/с), получается совсем грустно с CAN в наших задачах.

Добавлено через 2 минуты
Цитата Сообщение от jcxz Посмотреть сообщение
А зачем 2 стопа? если не секрет.
Так принято было в нашей системе давно уже. С чем точно связано - не знаю. Система давно разработана и только модернизируется постоянно, так как переделывать с 0 - не вариант.

Добавлено через 1 минуту
Цитата Сообщение от jcxz Посмотреть сообщение
Так: 1 старт + 8 данных + 1 чётность + 2 стопа (вариант 1) ?
да, так.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
21.09.2025, 14:58
вот две передачи
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void SendByteToDmx(uint8_t val)
{
uint16_t tmpVal=0x100|val;
// послать
USART_SendData(USARTDMX,tmpVal);    
 
}
void SendStartToDmx(uint8_t val)
{
uint16_t tmpVal=0x000|val;
 
// послать
USART_SendData(USARTDMX,tmpVal);    
 
}
вот настройки
C
1
2
3
4
5
6
7
8
9
10
11
12
    
    // теперь очередь настраивать USART-канал
  USART_InitStructure.USART_BaudRate = 250000;
 
 USART_InitStructure.USART_WordLength = USART_WordLength_9b;
 USART_InitStructure.USART_StopBits = USART_StopBits_1;
 USART_InitStructure.USART_Parity = USART_Parity_No ;
 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
 //Write USART1 parameters
 USART_Init(USARTDMX, &USART_InitStructure);
  //Enable USART1
код нагенерил CUBEMX
1
321 / 80 / 5
Регистрация: 19.07.2024
Сообщений: 442
21.09.2025, 14:59
Цитата Сообщение от adiagnost Посмотреть сообщение
Так принято было в нашей системе давно уже. С чем точно связано - не знаю. Система давно разработана и только модернизируется постоянно, так как переделывать с 0 - не вариант.
Ну если дело только в добавлении лишнего 'стопа', то просто добавьте паузу длительностью >= длительности 1-го бита после каждого передаваемого символа.
А приёмнику этот лишний 'стоп' вообще по барабану.
0
0 / 0 / 1
Регистрация: 18.11.2018
Сообщений: 35
21.09.2025, 15:06  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
USART_InitStructure.USART_WordLength = USART_WordLength_9b;
 ...
 USART_InitStructure.USART_Parity = USART_Parity_No ;
Интересно. Я могу установить режим "9 бит данных без бита четности"? Тогда это решение..

Добавлено через 1 минуту
Цитата Сообщение от jcxz Посмотреть сообщение
Ну если дело только в добавлении лишнего 'стопа'
Нет, это как раз не проблема..
0
321 / 80 / 5
Регистрация: 19.07.2024
Сообщений: 442
21.09.2025, 15:13
Цитата Сообщение от adiagnost Посмотреть сообщение
Интересно. Я могу установить режим "9 бит данных без бита четности"? Тогда это решение..
Т.е. - то, что я приводил выдержку из Reference Manual-а:
Цитата Сообщение от jcxz Посмотреть сообщение
Открываем Reference Manual, описание USART_CR1, читаем:
...
Bit 12 M: Word length
This bit determines the word length. It is set or cleared by software.
0: 1 Start bit, 8 Data bits, n Stop bit
1: 1 Start bit, 9 Data bits, n Stop bit
Note: The M bit must not be modified during a data transfer (both transmission and reception)
...
Bit 10 PCE: Parity control enable
This bit selects the hardware parity control (generation and detection). When the parity
control is enabled, the computed parity is inserted at the MSB position (9th bit if M=1; 8th bit
if M=0) and parity is checked on the received data. This bit is set and cleared by software.
Once it is set, PCE is active after the current byte (in reception and in transmission).
0: Parity control disabled
1: Parity control enabled
Bit 9 PS: Parity selection
This bit selects the odd or even parity when the parity generation/detection is enabled (PCE
bit set). It is set and cleared by software. The parity is selected after the current byte.
0: Even parity
1: Odd parity
...
Зачем эти пляски с битом чётности, если можно просто включить 9-битный режим (бит 12)?
вы даже не читали??? Как не читали и сам RM.

Цитата Сообщение от adiagnost Посмотреть сообщение
Нет, это как раз не проблема..
Да, проблема в том, что вы не хотите читать документацию на ваш микроконтроллер. Это - самая главная проблема!
Если не читать документацию на микроконтроллер, в программирование МК лучше вообще не соваться.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
21.09.2025, 15:13
Цитата Сообщение от jcxz Посмотреть сообщение
1 старт + 8 данных + 1 чётность + 2 стопа
Цитата Сообщение от adiagnost Посмотреть сообщение
да, так.
так это тоже самое что и
Цитата Сообщение от jcxz Посмотреть сообщение
1 старт + 9 данных + 2 стопа
вот нагенерировал на 103
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
static void MX_USART2_UART_Init(void)
{
 
  /* USER CODE BEGIN USART2_Init 0 */
 
  /* USER CODE END USART2_Init 0 */
 
  /* USER CODE BEGIN USART2_Init 1 */
 
  /* USER CODE END USART2_Init 1 */
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 250000;
  huart2.Init.WordLength = UART_WORDLENGTH_9B; // 9бит данных
  huart2.Init.StopBits = UART_STOPBITS_2;              // 2стоп бита
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART2_Init 2 */
 
  /* USER CODE END USART2_Init 2 */
 
}
0
321 / 80 / 5
Регистрация: 19.07.2024
Сообщений: 442
21.09.2025, 15:14
Цитата Сообщение от adiagnost Посмотреть сообщение
Интересно. Я могу установить режим "9 бит данных без бита четности"? Тогда это решение..
Это не "решение", а кубокодинг наугад.
Решение, это когда сперва изучают даташит и reference manual на контроллер и только потом ваяют программу.

PS: кстати - два стоп-бита есть в регистре USART_CR2.
Поэтому здесь:
Цитата Сообщение от jcxz Посмотреть сообщение
Вроде как STM32 такое не умеют. Нужно: 1) или выбрать другой МК, который умеет; 2) или реализовывать UART программно.
был не прав.
1
0 / 0 / 1
Регистрация: 18.11.2018
Сообщений: 35
21.09.2025, 15:20  [ТС]
Цитата Сообщение от jcxz Посмотреть сообщение
вы даже не читали???
Что же вы так злитесь?
Я читал и видел, но с какого-то рожна подумал, что режим с 9-тью битами ОБЯЗАТЕЛЬНО предполагает, что 9-ый бит это бит четности.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.09.2025, 15:20
Помогаю со студенческими работами здесь

STM32 - STM32 I2C
*****ПРОБЛЕМА ИСПРАВЛЕНА****ОТВЕТ НИЖЕ , НЕ ВЧИТЫВАЙТЕСЬ В КОД ПРОГРАММЫ,УТОНЕТЕ)), НУ ЕСЛИ ТОЛЬКО...

stm32 подвисание или перезагрузка от запуска или отключения пускателя
Как решить эту проблему.Что нужно выполнить ? Добавлено через 32 минуты Ау спецы вы где?

Как войти в разработку STM32 бесплатно? Или подешевле
Добрый день! Я наверное не оригинален со своим вопросом. Не смог найти бесплатный путь к изучению...

МК51 (аналог intel 8051): как добавить бит четности?
Здравствуйте! В массиве 20Н-27Н РПД микроконтроллера МК51 подготовлены для передачи семиразрядные...

Как мне вычислить бит чётности у байта в CodeVisionAVR?
Здравствуйте. Помогите пожалуйста кодом. Есть переменная unsykned char (байт), как мне вычислить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru