**FUR-V2.0: руководство по использованию** FUR — это сокращение от Fast-Uart-Reg, что означает «быстрый последовательный порт-регистр». Три слова в аббревиатуре описывают особенности этого компонента: 1. Быстрый: протоколы связи FUR основаны на ASCII-коде, который позволяет быстрее считывать данные по сравнению с 16-битными кодами. 2. Последовательный порт: компонент FUR основан на аппаратном обеспечении последовательного порта, которое присутствует в большинстве микроконтроллеров. Если вы умеете работать с последовательным портом, то сможете использовать FUR. 3. Регистр: концепция регистра используется для хранения и обработки данных в FUR. Это будет подробно объяснено ниже. **Понимание концепции** Прежде чем начать использовать FUR, необходимо понять концепцию регистров в нём. В микроконтроллерах регистры представляют собой логические устройства или физические элементы на кристалле. Например, SBUF — это регистр данных последовательного порта, который имеет адрес 0x99 и может быть адресован напрямую через инструкции. В FUR используются только программные регистры. Они могут быть связаны с физическими регистрами или существовать виртуально. Версия V2.0 полностью раскрывает возможности сопоставления и позволяет свободно реализовывать пользовательские функции регистров. Если вам всё ещё неясно, рекомендуется сначала ознакомиться с протоколом и постепенно изучать FUR. **Протокол** FUR использует протокол переменной длины, обеспечивая максимальную гибкость. Общий формат протокола следующий: **[адрес@номер] операция = данные;** - Адрес: адрес регистра, 16 бит, допустимые значения от 0 до 65535. - Номер: номер микроконтроллера при многомашинной коммуникации, 8 бит, от 0 (широковещательный адрес) до 255. - Операция: поддерживает «+», «−», «*», «/», «&», «|», «^», операции с битами и чтение/запись. - Данные: данные для операций над регистрами, 16 бит или 16-битное шестнадцатеричное значение от 0x0000 до 0xFFFF. ### Операция сложения **[адрес@номер]+=данные;** Например, чтобы увеличить содержимое регистра с адресом 16 на микроконтроллере с номером 2 на 7, отправьте команду **[16@2]+=7;**. Если есть только ведущий и ведомый, можно использовать широковещательную передачу **[16@0]+=7;**. Если номер неизвестен и есть только ведущий и ведомый, номер можно опустить и отправить команду **[16]+=7;**. ### Операция вычитания **[адрес@номер]-=данные;** Например, чтобы уменьшить содержимое регистра с адресом 16 на микроконтроллере с номером 2 на 7, отправьте команду **[16@2]-=7;**. Если есть только ведущий и ведомый, можно использовать широковещательную передачу **[16@0]-=7;**. Если номер неизвестен и есть только ведущий и ведомый, номер можно опустить и отправить команду **[16]-=7;**. ### Операция умножения **[адрес@номер]*=данные;** Например, чтобы умножить содержимое регистра с адресом 16 на микроконтроллере с номером 2 на 7, отправьте команду **[16@2]*=7;**. Если есть только ведущий и ведомый, можно использовать широковещательную передачу **[16@0]*=7;**. Если номер неизвестен и есть только ведущий и ведомый, номер можно опустить и отправить команду **[16]*=7;**. ### Операция деления **[адрес@номер]/=данные;** Например, чтобы разделить содержимое регистра с адресом 16 на микроконтроллере с номером 2 на 7, отправьте команду **[16@2]/=7;**. Если есть только ведущий и ведомый, можно использовать широковещательную передачу **[16@0]/=7;**. Если номер неизвестен и есть только ведущий и ведомый, номер можно опустить и отправить команду **[16]/=7;**. ### Операция И **[адрес@номер]&=данные;** Например, чтобы установить младшие 4 бита содержимого регистра с адресом 16 на микроконтроллере с номером 2 равными 0, отправьте команду **[16@2]&=0xFFF0;** или **[16@2]&=65520;**. Если есть только ведущий и ведомый, можно использовать широковещательную передачу **[16@2]&=0xFFF0;** или **[16@2]&=65520;**. Если номер неизвестен и есть только ведущий и ведомый, номер можно опустить и отправить команду **[16@2]&=0xFFF0;** или **[16@2]&=65520;**. ### Операция ИЛИ **[адрес@номер]|=данные;** Например, чтобы установить младшие 4 бита содержимого регистра с адресом 16 на микроконтроллере с номером 2 равными 1, отправьте команду **[16@2]|=0x000F;**, **[16@2]|=15;** или даже **[16@2]|=0xF;**. Если есть только ведущий и ведомый, можно использовать широковещательную передачу **[16@0]|=0x000F;**, **[16@0]|=15;** или даже **[16@0]|=0xF;**. Если номер неизвестен и есть только ведущий и ведомый, номер можно опустить и отправить команду **[16]|=0x000F;**, **[16]|=15;** или даже **[16]|=0xF;**. ### Операция исключающего ИЛИ **[адрес@номер]^=данные;** Например, чтобы инвертировать D7 бит содержимого регистра с адресом 16 на микроконтроллере с номером 2, отправьте команду **[16@2]^=0x0080;**, **[16@2]^=128;** или даже **[16@2]^=0x80;**. Если есть только ведущий и ведомый, можно использовать широковещательную передачу **[16@0]^=0x0080;**, **[16@0]^=128;** или даже **[16@0]^=0x80;**. Если номер неизвестен и есть только ведущий и ведомый, номер можно опустить и отправить команду **[16]^=0x0080;**, **[16]^=128;** или даже **[16]^=0x80;**. ### Операции с битами **[адрес@номер].параметр=данные;** Например, чтобы установить D7 бит содержимого регистра с адресом 16 на микроконтроллере с номером 2 равным 1, отправьте команду **[16@2].7=1;**. Если есть только ведущий и ведомый, можно использовать широковещательную передачу **[16@0].7=1;**. Если номер неизвестен и есть только ведущий и ведомый, номер можно опустить и отправить команду **[16].7=1;**. ### Операция чтения **[адрес@номер]?;** Например, чтобы прочитать содержимое регистра с адресом 16 на микроконтроллере с номером 2, отправьте команду **[16@2]?;**. Если есть только ведущий и ведомый, можно использовать широковещательную передачу **[16@0]?;**. Если номер неизвестен и есть только ведущий и ведомый, номер можно опустить и отправить команду **[16]?;**. ### Операция записи **[адрес@номер]=данные;** Например, чтобы записать значение 596 в регистр с адресом 16 на микроконтроллере с номером 2, отправьте команду **[16@2]=596;**. Если есть только ведущий и ведомый, можно использовать широковещательную передачу **[16@0]=596;**. Если номер неизвестен и есть только ведущий и ведомый, номер можно опустить и отправить команду **[16]=596;**. ### Заключение Основные операции FUR аналогичны обычным операциям с переменными, поэтому их легко запомнить. В следующей таблице приведены три примера, иллюстрирующие эту точку зрения: | Тип операции | Операция с переменной | Операция FUR | | :--: | :--: | :--:| | Присвоение | value=156; | [12]=156; | | Сложение | value+=156; | [12]+=156; | | Исключающее ИЛИ | value^=5; | [12]^=5; | ## Методы переноса и низкоуровневое подключение ## API функций ## Дополнительные команды Помимо перечисленных команд, FUR также предоставляет несколько часто используемых команд. ### Запрос ID **[id]?;** Обратите внимание: когда используется один к одному, эту команду можно использовать для запроса идентификационного номера целевого устройства. Однако в конфигурации один ко многим её нельзя использовать, поскольку несколько ведомых устройств могут одновременно реагировать на команду, вызывая хаос на шине.