# elbear_arduino_bsp
Пакет поддержки платы Elbear Ace-Uno на базе микроконтроллера MIK32 Амур в среде программирования Arduino IDE.

 
## Установка пакета в ArduinoIDE
Для установки пакета в параметрах ArduinoIDE необходимо добавить ссылку `https://elron.tech/files/package_elbear_beta_index.json` в поле "Дополнительные ссылки для Менеджера плат".  
Подробные шаги по установке и начальной настройке описаны в [инструкции](./Instructions.md).

## Функциональное назначение выводов  
![Pinout](docs/pinout.PNG)

## Особенности использования платы Elbear Ace-Uno в ArduinoIDE
### Цифровые выводы
На плате Elbear Ace-Uno пользователю доступны встроенные светодиод и кнопка. Для их использования можно воспользоваться макросами `LED_BUILTIN` и `BTN_BUILTIN`, передавая их в качестве аргументов функции вместо номера цифрового вывода.  
В отличие от стандартного функционала Arduino, на плате Elbear Ace-Uno невозможно управлять притяжками цифрового вывода, настроенного на вход, с помощью функции `digitalWrite()`. Для включения притяжки к питанию необходимо воспользоваться функцией `pinMode(PinNumber, INPUT_PULLUP)`.  
Для изменения состояния цифровых выводов помимо стандартной функции `digitalWrite()` доступна функция `digitalToggle(uint32_t PinNumber)`.  

### Аналоговые выводы
ADC  
Разрешение встроенного в МИК32 АЦП составляет 12 бит, но возможно изменение разрешения в пределах от 1 до 32 бит с помощью функции analogReadResolution(). Разрешение АЦП по умолчанию составляет 10 бит. Функция analogRead() возвращает результаты измерения после усреднения по 10 значениям.  
ШИМ  
одновременно с разными частотами можно использовать только выводы, сидящие на разных таймерах. На таймере 1 - 3, 5, 6, 9. На таймере 2 - 10, 11.  
D10 не может быть использован, если работает SPI.

### Прерывания  
На плате Elbear Ace-Uno доступно 7 прерываний, настраиваемых функцией `attachInterrupt()`. 
|Номер вывода|Номер прерывания|
|2|0|
|3|1|
|4|2|
|5|3|
|8|4|
|9|5|
|`BTN_BUILTIN`|6|

В микроконтроллере MIK32 предусмотрен всего один вектор прерывания. Когда срабатывает прерывание от любого источника, общая функция-обработчик последовательно проверяет все возможные источники и, при необходимости, вызывает соответствующие обработчики конкретных модулей. Поэтому важно, чтобы функции, вызываемые при прерываниях, выполняли минимально необходимый объем работы и обеспечивали как можно более быстрое завершение обработки. Это позволит избежать задержек и снизит риск пропуска последующих прерываний.  
Общая функция-обработчик прерываний располагается в RAM памяти. Это позволяет устраненить задержки, связанных с кэшированием памяти при работе из FLASH памяти. Обработчики прерываний, назначаемые цифровым выводам с помощью функции `attachInterrupt()`, а так же обработчик прерывания для функции `tone()` так же располагаются в памяти RAM.  

### Serial
Для работы доступно два последовательных интерфейса. Нулевой интерфейс доступен на выводах D0, D1, для работы с ним используется экземпляр класса под названием `Serial`. Нулевой интерфейс используется для вывода информации в Монитор порта в Arduino IDE.  
Первый интерфейс доступен на выводах D7, D8, используемый экземпляр класса - `Serial1`.  
Доступны следующие настройки режима работы каждого интерфейса: длина данных - 7 или 8 бит; четность - нет, четное, нечетное; стоп бит - 1 или 2 бита.

### Предупреждения об ошибках
Если в скетче используется интерфейс `Serial`, при возникновении ошибок при использовании какой-либо функции из пакета в порт может передаваться сообщение об этой ошибке с пояснением. Например, если в функцию будет передан некорректный номер цифрвого вывода, предупреждение об этом появится в подключенном com порте.  
По умолчанию вывод предупреждений включен. Если интерфейс `Serial` используется для коммуникации с другим устройством, вывод предупреждений можно отключить. Для этого в самом начале функции `setup()` необходимо вызвать макрос `DISABLE_ERROR_MESSAGES();`. Вывод предупреждений можно включить обратно, вызвав макрос `ENABLE_ERROR_MESSAGES();` в любом месте программы.
### Библиотеки, входящие в состав пакета
Входящие в состав пакета библиотеки используют периферию микроконтроллера MIK32 и адаптированы для работы с ним.  
|Библиотека|Описание|Заметки|
|---------|---------|------|
|[SPI](https://docs.arduino.cc/language-reference/en/functions/communication/SPI/)|Библиотека для работы с интерфейсом SPI| Для работы используется встроенный SPI1. Доступные делители частот - `SPI_CLOCK_DIV4`, `SPI_CLOCK_DIV8`, `SPI_CLOCK_DIV16`, `SPI_CLOCK_DIV32`, `SPI_CLOCK_DIV64`, `SPI_CLOCK_DIV128`, `SPI_CLOCK_DIV256`, обеспечивают частоту работы от 125 кГц до 8 МГц. Скорость работы по умолчанию - 4 МГц. Для задания режима и скорости работы рекомендуется использовать функцию `SPISettings()`, а не соответствующие отдельные функции.|
|[Wire](https://docs.arduino.cc/language-reference/en/functions/communication/Wire/)|Библиотека для работы с интерфейсом I2C|Для работы используется встроенный I2C1. Доступные частоты работы интерфейса: 100 кГц (`WIRE_FREQ_100K`), 400 кГц (`WIRE_FREQ_400K`), 1000 кГц (`WIRE_FREQ_1000K`). Скорость работы по умолчанию - 100 кГц. В режиме работы в качестве ведомого устройства функции, заданные через onReceive() и onRequest(), выполняются в прерывании.|
|[SoftwareSerial](https://docs.aСrduino.cc/learn/built-in-libraries/software-serial/)|Библиотека, реализующая программный последовательный интерфейс.|Доступные скорости работы - от 300 до 57600 бод. Для отправки данных (TX) можно использовать любой цифровой вывод. Для приема данных (RX) можно использовать только выводы, поддерживающие прерывания. Обработчик прерывания и связанные с ним функции располагаются в памяти RAM.|
|[EEPROM](https://docs.arduino.cc/learn/built-in-libraries/eeprom/)|Библиотека для работы с памятью EEPROM| Для использования доступно 1024 байта встроенной EEPROM памяти. Для корректной работы библиотеки обязательно вызывать функцию EEPROM.begin() перед началом работы с памятью.|
|[Servo](https://docs.arduino.cc/libraries/servo/)|Библиотека для работы с сервоприводом| Любой цифровой вывод может использоваться для управления сервоприводом|
|[NeoPixel](https://docs.arduino.cc/libraries/adafruit-neopixel/)|Библиотека для работы с адресными светодиодами||

## Протестированные библиотеки
|Библиотека|Описание|Заметки|
|---------|---------|------|
|[SD Library](https://www.arduino.cc/en/Reference/SD)|Библиотека, позволяющая считывать и записывать информацию на карты `SD`|v1.2.4|


# Полезные ссылки 
*  [Материалы по платам ELBEAR ACE-UNO](https://elron.tech/support/#elbear)
*  [Телеграмм-канал компании (обновления по проекту ELBEAR и другим)](https://t.me/elrontech)

При возникновении вопросов или выявлении проблем можно оставить заявку [здесь](https://gitflic.ru/project/elron-tech/elbear_arduino_bsp/issue).