19 Commits
Author SHA1 Message Date
klassents 8e38c2679e включить драйвер для всех плат 2026-05-13 13:43:33 +07:00
klassents 41867b00a2 v0.5.4
1. Исправления в библиотеке EEPROM:
- исправлена работа EEPROM.put() при записи объектов по невыравненным адресам;
- исправлено чтение EEPROM.get() для объектов, занимающих несколько страниц;
- добавлены проверки выхода адреса и объекта за пределы EEPROM, убран переход записи/чтения в начало памяти при достижении конца EEPROM;
- EEPROM.put() теперь стирает и записывает страницу, только если данные изменились.
2. Исправления в библиотеке HardwareSerial:
- в обработчике прерываний по приему данных вычисление индекса для следующего принятого байта перенесено в цикл обработки принятых данных;
- размер буфера для приема теперь задается, только если не был задан ранее.
3. Использование драйвера при загрузке скетчей или загрузчика через программатор теперь задается отдельно для каждой платы - драйвер используется только при работе с платой START-MIK32.
Co-authored-by: KLASSENTS <klassen@elron.tech>
Co-committed-by: KLASSENTS <klassen@elron.tech>
2026-05-13 07:59:59 +03:00
klassents 48f0786566 обновлены ссылки на документацию по платам 2026-02-18 14:55:06 +07:00
klassents c233edddd8 Добавлено примечание о версии драйвера ch340 2025-09-08 12:41:52 +03:00
klassents 00e8d1b1af Обновить docs/Elbear_description.md 2025-09-08 12:40:39 +03:00
klassents 0fbfd77518 v0.5.3
- начальный загрузчик для плат elbear, elsomik обновлен до версии 0.2.0
- исключено появление краткосрочных просадок при работе ШИМ с максимальным коэффициентом заполнения
- добавлена возможность пропускать код стандартного обработчика прерываний при использовании пользовательского обработчика
- добавлена возможность конфигурирования вывода на вход с притяжкой к земле (INPUT_PULLDOWN)
- исправление известных ошибок
2025-08-06 08:42:39 +03:00
klassents 8a675b2f61 Обновить docs/elsomik_description.md 2025-07-21 10:14:36 +03:00
klassents fef9b6e2bf Удалить docs/pinout_ElsomikOEM.png 2025-07-18 10:45:28 +03:00
klassents 0a5482b7c9 Обновить docs/elsomik_description.md 2025-07-18 10:45:06 +03:00
klassents 5be685ce7b Загрузить файлы в «docs» 2025-07-18 10:44:47 +03:00
klassents 1d850f20d0 Обновить README.md 2025-07-18 09:25:49 +03:00
klassents 20c1b9bd4e Обновить docs/Instructions.md 2025-07-18 09:21:28 +03:00
klassents 6b50a0201c Обновить docs/debug_description.md 2025-07-18 09:19:20 +03:00
klassents 262826c3b6 Обновить docs/Instructions.md 2025-07-18 09:16:28 +03:00
klassents 1042468094 Обновить docs/debug_description.md 2025-07-18 06:26:16 +03:00
klassents 34c86da403 Обновить docs/Instructions.md 2025-07-18 06:23:33 +03:00
klassents 1a73000ae9 v0.5.2
- исправлены ошибки при работе с пользователями, в имени которых есть пробелы
- исправлены ошибки при работе с программатором на win11
- исправлены известные ошибки
2025-07-15 09:36:38 +03:00
ogneyar f81c108d44 Добавил BMP280, VL53L0X, MCP2515 и DS18B20
Добавил BMP280, VL53L0X, MCP2515 и DS18B20 (:
2025-06-22 15:17:59 +03:00
klassents df1d14a57c Добавлена функция инициализации параметров SPI по умолчанию 2025-06-04 12:33:52 +03:00
59 changed files with 1185 additions and 872 deletions

No files matched your search

+40 -12
View File
@@ -2,9 +2,9 @@
Пакет поддержки плат на базе микроконтроллера MIK32 Амур в среде программирования Arduino IDE.
## Установка пакета в ArduinoIDE
## Установка пакета в ArduinoIDE и подготовка к работе
Для установки пакета в параметрах ArduinoIDE необходимо добавить ссылку `https://elron.tech/files/package_elbear_beta_index.json` в поле "Дополнительные ссылки для Менеджера плат".
Подробные шаги по установке и начальной настройке описаны в [инструкции](./docs/Instructions.md).
Подробные шаги по установке, начальной настройке и записи начального загрузчика для всех поддерживаемых плат описаны в [инструкции](./docs/Instructions.md).
## Платы, входящие в состав пакета
Пакет включает в себя поддержку следующих плат:
@@ -15,7 +15,8 @@
## Особенности использования пакета в ArduinoIDE
### Цифровые выводы
В отличие от стандартного функционала Arduino на платах, входящих в состав пакета, невозможно управлять притяжками цифрового вывода, настроенного на вход, с помощью функции `void digitalWrite(uint32_t PinNumber, uint32_t Val)`. Для включения притяжки к питанию необходимо воспользоваться функцией `void pinMode(PinNumber, INPUT_PULLUP)`.
В отличие от стандартного функционала Arduino на платах, входящих в состав пакета, невозможно управлять притяжками цифрового вывода, настроенного на вход, с помощью функции `void digitalWrite(uint32_t PinNumber, uint32_t Val)`. Для включения притяжки к питанию необходимо воспользоваться функцией `pinMode(PinNumber, INPUT_PULLUP)`.
Доступна возможность конфигурирования цифрового вывода на вход с притяжкой к земле, для этого необходимо использовать макрос `INPUT_PULLDOWN` - `pinMode(PinNumber, INPUT_PULLDOWN)`.
Для инвертирования состояния цифровых выводов доступна функция `void digitalToggle(uint32_t PinNumber)`.
### Аналоговые выводы
@@ -37,14 +38,39 @@
Общая функция-обработчик прерываний располагается в RAM памяти. Это позволяет устранить задержки, связанные с кэшированием при работе из FLASH памяти. Обработчики прерываний, назначаемые на цифровые выводы с помощью функции `void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode)`, и обработчик прерывания для функции `tone()` так же располагаются в памяти RAM.
Глобальное разрешение прерываний активируется после завершения функции `setup()`. Если необходимо использовать прерывания внутри самой функции `setup()`, их можно включить вручную, вызвав функцию `interrupts()` перед вызовом функций, работающих с прерываниями. Прерывания используются для приема данных модулями `Serial`, `Wire`, для работы библиотеки `Servo`, функцией `tone()`.
В пакете поддержки доступна возможность дополнения или замены стандартного обработчика прерываний пользовательской функцией-обработчиком. Для этого в своем скетче необходимо определить функцию `extern "C" bool ISR()`, она вызывается первой в стандартном обработчике. Внутри функции можно проверять флаги прерываний и реагировать на нужные. Важно очищать флаги обрабатываемых прерываний, чтобы обработчик работал корректно.
Если функция возвращает `false`, после ее выполнения так же будет выполнен код стандартного обработчика прерываний. Если функция возвращает `true`, выполнение кода стандартного обработчика будет пропущено.
Пользовательскую функцию необходимо располагать в RAM памяти, так как стандартный обработчик прерываний расположен именно там.
Ниже приведен пример пользовательского обработчика прерывания по переполнению от 16-битного таймера 1:
```
extern "C" __attribute__((section(".ram_text"))) bool ISR(void)
{
// обработка прерывания от 16-битного таймера
if (EPIC_CHECK_TIMER16_1())
{
if (TIM16_GET_ARRM_INT_STATUS(htimer16_1_))
{
// необходимые действия при переполнении таймера
}
// очистить флаги прерывания от таймера 1
TIM16_CLEAR_INT_MASK(htimer16_1_, 0xFFFFFFFF);
}
return false;
}
```
Для корректной работы функции из примера необходимо подключить в скетче следующие файлы:
```
#include "mik32_hal_timer16.h"
#include "wiring_LL.h"
```
### Serial
Для работы доступно два последовательных интерфейса. Нулевой интерфейс используется экземпляром класса `Serial`. Информации в Монитор порта в Arduino IDE поступает через него. Первый интерфейс используется экземпляром класса `Serial1`. Выводы, на которых доступны указанные интерфейсы, перечислены в описании отдельных плат.
Доступны следующие макросы для настройки режима работы каждого интерфейса в функции `Serial.begin()`: `SERIAL_7N1`, `SERIAL_8N1`, `SERIAL_7N2`, `SERIAL_8N2`, `SERIAL_7E1`, `SERIAL_8E1`, `SERIAL_7E2`, `SERIAL_8E2`, `SERIAL_7O1`, `SERIAL_8O1`, `SERIAL_7O2`, `SERIAL_8O2`. Здесь длина данных - 7 или 8 бит; бит четности - нет(N), четный(E), нечетный(O); стоп бит - 1 или 2 бита.
### Переопределение функции main
В ArduinoIDE доступна возможность определить пользовательскую функцию `main()` в скетче. Для этого необходимо удалить из скетча функции `setup()` и `loop()` и определить свою функцию `int main(void){}`. Чтобы весь функционал пакета поддержки работал корректно, перед заходом в бесконечный цикл необходимо вызвать функцию `post_init()`, внутри которой глобально разрешаются прерывания. Пример переопределения представлен ниже.
![main_redefine_example_.png](docs/main_redefine_example_.png)
В ArduinoIDE доступна возможность определить пользовательскую функцию `main()` в скетче. Для этого необходимо удалить из скетча функции `setup()` и `loop()` и определить свою функцию `int main(void){}`. Чтобы весь функционал пакета поддержки работал корректно, перед заходом в бесконечный цикл необходимо вызвать функцию `post_init()`, внутри которой глобально разрешаются прерывания. Пример переопределения представлен ниже.
![main_redefine_example_.png](docs/main_redefine_example_.png)
### Предупреждения об ошибках
Если в скетче используется интерфейс `Serial`, при возникновении ошибок при использовании какой-либо функции из пакета в порт может передаваться сообщение об этой ошибке с пояснением. Например, если в функцию будет передан некорректный номер цифрового вывода, предупреждение об этом появится в подключенном com порту.
@@ -73,13 +99,15 @@
Список модулей и шилдов, работа которых была протестирована на платах, входящих в состав пакета поддержки, доступен [здесь](./docs/tested_shields.md).
## Режим отладки
Для всех плат, входящих в состав пакета, доступен режим отладки скетча в ArduinoIDE версии 2. Подготовка к работе в режиме отладки описана в [инструкции.](./docs/debug_description.md)
Для всех плат, входящих в состав пакета, доступен режим отладки скетча в Arduino IDE версии 2.3.4 на Windows 10 x64. Подготовка к работе в режиме отладки описана в [инструкции.](./docs/debug_description.md) Функция отладки является экспериментальной.
# Полезные ссылки
* [Описание плат ELBEAR](https://elron.tech/russian-arduino-compatible-board/)
* [Материалы по платам ELBEAR](https://elron.tech/support/#elbear)
* [Материалы по платам ELSOMIK](https://elron.tech/support/#elsomik)
* [Материалы по плате START-MIK32](https://wiki.mik32.ru/%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D0%BE%D1%87%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BB%D0%B0%D1%82%D0%B0_%D0%A1%D1%82%D0%B0%D1%80%D1%82)
## Полезные ссылки
* [Проблемы и их решения при работе с пакетом в Arduino IDE](https://docs.elron.tech/arduino/available-ide/arduinoIDE-bsp/bsp-troubleshooting)
* [Описание плат ELBEAR](https://docs.elron.tech/arduino/)
* [Материалы по платам ELBEAR ACE-UNO](https://docs.elron.tech/arduino/elbear-ace-uno)
* [Материалы по платам ELBEAR ACE-NANO](https://docs.elron.tech/arduino/elbear-ace-nano)
* [Материалы по платам ELSOMIK](https://docs.elron.tech/som/)
* [Материалы по плате START-MIK32](https://docs.mikron.ru/wiki/boards/start.html)
* [Телеграмм-канал компании](https://t.me/elrontech)
При возникновении вопросов или выявлении проблем можно оставить заявку [здесь](https://gitflic.ru/project/elron-tech/elbear_arduino_bsp/issue).
+6
View File
@@ -14,6 +14,7 @@ aceUno8Mb.upload.speed=230400
# tool for bootloader update
aceUno8Mb.bootloader.tool=mik32_upload
aceUno8Mb.bootloader.tool.default=mik32_upload
aceUno8Mb.bootloader.driver_option=
aceUno8Mb.bootloader.file=elbear/bootloader.hex
aceUno8Mb.bootloader.interface=ftdi/mikron-link.cfg
aceUno8Mb.bootloader.params.verbose=
@@ -41,6 +42,7 @@ aceUno16Mb.upload.speed=230400
# tool for bootloader update
aceUno16Mb.bootloader.tool=mik32_upload
aceUno16Mb.bootloader.tool.default=mik32_upload
aceUno16Mb.bootloader.driver_option=
aceUno16Mb.bootloader.file=elbear/bootloader.hex
aceUno16Mb.bootloader.interface=ftdi/mikron-link.cfg
aceUno16Mb.bootloader.params.verbose=
@@ -68,6 +70,7 @@ aceUno32Mb.upload.speed=230400
# tool for bootloader update
aceUno32Mb.bootloader.tool=mik32_upload
aceUno32Mb.bootloader.tool.default=mik32_upload
aceUno32Mb.bootloader.driver_option=
aceUno32Mb.bootloader.file=elbear/bootloader.hex
aceUno32Mb.bootloader.interface=ftdi/mikron-link.cfg
aceUno32Mb.bootloader.params.verbose=
@@ -94,6 +97,7 @@ aceNano.upload.speed=230400
# tool for bootloader update
aceNano.bootloader.tool=mik32_upload
aceNano.bootloader.tool.default=mik32_upload
aceNano.bootloader.driver_option=
aceNano.bootloader.file=elbear/bootloader.hex
aceNano.bootloader.interface=ftdi/mikron-link.cfg
aceNano.bootloader.params.verbose=
@@ -120,6 +124,7 @@ elsomik.upload.speed=230400
# tool for bootloader update
elsomik.bootloader.tool=mik32_upload
elsomik.bootloader.tool.default=mik32_upload
elsomik.bootloader.driver_option=
elsomik.bootloader.file=elsomik/bootloader.hex
elsomik.bootloader.interface=ftdi/mikron-link.cfg
elsomik.bootloader.params.verbose=
@@ -147,6 +152,7 @@ start-mik32-v1.upload.speed=120000
# tool for bootloader update
start-mik32-v1.bootloader.tool=mik32_upload
start-mik32-v1.bootloader.tool.default=mik32_upload
start-mik32-v1.bootloader.driver_option=
start-mik32-v1.bootloader.file=start-mik32/bootloader.hex
start-mik32-v1.bootloader.interface=start-link.cfg
start-mik32-v1.bootloader.params.verbose=
+278 -258
View File
@@ -1,261 +1,281 @@
:020000040100F9
:10000000FD62938202400100FD12E39E02FE374131
:10001000000213010100B701000293810100B7152E
:100020000001938505FF3716000113060602B70687
:1000300000029386060039A083A2050023A0560083
:1000400091059106E3EAC5FEB71500019385050207
:100050003716000113060602B7060002938606262D
:1000600039A083A2050023A0560091059106E3EA7A
:10007000C5FEB70500029385050337060002130687
:10008000062621A023A005009105E3EDC5FEB700DB
:100090000001E780C00AB7000001E780C00AB7107E
:1000A0000001E780808473005010F5BF828000005B
:1000B0000000000000000000000000000000000040
:1000C0006F004000197106C20AC40EC612C816CAD3
:1000D0001ACC1ECE22D026D22AD42ED632D836DA48
:1000E0003ADC3EDEC2C0C6C2CAC4CEC6D2C8D6CA78
:1000F000DACCDECEE2D0E6D2EAD4EED6F2D8F6DA28
:10010000FADCFEDE970000009380E00482909240CB
:100110002241B2414242D2426243F24302549254DB
:100120002255B2554256D2566257F2570648964863
:100130002649B649464AD64A664BF64B065C965C5B
:10014000265DB65D465ED65E665FF65F096173004A
:10015000203001A03D432A876373C3029377F700E1
:10016000BDEFADE5937606FF3D8ABA960CC34CC34E
:100170000CC74CC74107E36BD7FE11E28280B30680
:10018000C3408A069702000096966780A600230760
:10019000B700A306B7002306B700A305B7002305E1
:1001A000B700A304B7002304B700A303B7002303D9
:1001B000B700A302B7002302B700A301B7002301D1
:1001C000B700A300B7002300B700828093F5F50FB6
:1001D00093968500D58D93960501D58D61B793963D
:1001E00027009702000096968682E78086FA96801E
:1001F000C1171D8F3E96E374C3F8A5B7B707050076
:100200000947D8CFB7170500938707C0984385667D
:1002100093860640558F98C398471367074098C741
:10022000B71708009387074023A0070023A2070001
:1002300023A407001307A008D8C77D57D8CF354798
:1002400098C3D84F935657018D8AE5DE8280B71741
:1002500008009387074023A0070023A2070023A4D8
:10026000070023A607007D57D8CF23A40702B7179E
:100270000500938707C09843F1769386F63F758F04
:1002800098C398471377F7BF98C7B7070500094782
:1002900098D38280B71708009387074088D7D84F34
:1002A000137707046DDF82803707000203234704BA
:1002B000B706000237150800B7450F0023A406044F
:1002C0008147014613050540938515240328C50180
:1002D000B308F30013780802630C080205C2232256
:1002E000170537470F0023A4F60413070724639765
:1002F000E700B707000205472383E700B7170800A8
:1003000093870740C85342054181828005467DBFDF
:100310008507E39DB7FE7DD2B7470F00938707247B
:1003200023A4F60423221705E9B7411106C622C407
:1003300026C2AA84EF00B022E1689388086A0148C7
:100340008147014781460146B70520C72685379476
:100350009800EF003006130414687D1419E40D456D
:10036000B240224492444101828085452685EF00B7
:10037000702005897DF10145E5B7411122C437049C
:100380000002930704008C43B70700804AC0BE9563
:10039000B707000223AEB70206C626C293974501EF
:1003A000130404003709000289E713058900EF00F0
:1003B00090290C40B70400029386C4041306001071
:1003C00013058900EF0070231C4037070002835695
:1003D0008703938707101CC013060010B68763F4C9
:1003E000C600930700101384C4041305F400938718
:1003F00007F01306100F814513040410231CF702A5
:10040000913BA2851385C4043D46EF0010282320AC
:1004100004002322040023240400231604002307DD
:100420000400B240224492440249410182805D713D
:10043000130680028145280886C6293BBD47230C48
:10044000F1008947230EF1003ED2E1779387070838
:100450002C080A85231AF102E52BB64061618280DF
:100460005D71A2C4370400021305840086C6A6C2CB
:10047000CAC0652513058400EF00807D85451305FE
:100480008400EF00300F8D47814463E3A700AA8406
:10049000894513058400EF00F00D937725002A8627
:1004A00089E7136625001376F60FA68513058400E9
:1004B000EF00B00FE1689388086A0148814701475F
:1004C00081460146B705203813058400E525E1681B
:1004D00038009388086A1308000285468147014660
:1004E000B70599EB1305840023040100E125B71536
:1004F00000015146938505FD6800EF0010191309AE
:100500008400832709006C0051463ED085473ED2C7
:100510006810C1673ED4EF005017B70607009C4231
:100520003707F1FF7D17F98F08109CC20D2DB640DB
:1005300026449644064961618280411106C6013B0A
:100540000537B707008073905730B700008082905E
:10055000B2404101828041113707000222C406C621
:100560009307070083C76700854613040700638E5F
:10057000D70009476388E70023030400B240224400
:10058000410182801305000F3133B71708009387AC
:100590000740D84F218B09C7D84F13678700D8CFA2
:1005A000693FD9BF411106C622C426C24AC083474B
:1005B000350005476383E70811472A846389E7000C
:1005C0008DCFB24022449244024941018280B70754
:1005D000000283D7870391C34D3383474400034709
:1005E0005400E2074207BA97370700022320F704B6
:1005F000370700022320F700E9B7370900028354C8
:1006000089030346050093054500370500021305DD
:10061000C5042695EF00700783470400BE94C2040A
:10062000C180231C99029307F00FE3FC97F8224442
:10063000B24092440249410189B33D45A139B7070F
:10064000000283D7870391C30D3B2244B2409244FA
:1006500002494101DDB53707000241119306070049
:1006600003DF460026C4B704000283A2840422C626
:100670003715080037040002B7480F0037430F0052
:10068000370E00024AC28147232A04021309FFFFE2
:10069000814E814681458143014801461307070089
:1006A000130505409388182413030324130ECE1555
:1006B000636FE60363850E0009462303C70089C6FE
:1006C000B7060002A388F60299C1232A74026304C4
:1006D000080023A4540483476700A9E73244A244D6
:1006E0001249370500021305C515410165BD814258
:1006F0000328C50113780802631B08028502E399E9
:1007000012FF89C6B7060002A388F60299C1232A00
:100710007402B7470F009387072423A4F404854786
:100720002303F7003244A244124941018280E38A44
:1007300062FC03284502937FF80F637D260113783E
:10074000F80FC29385453308CE002300F801050653
:100750000548B9BFB307704093F7F70F6394FF00E4
:100760008546D5B7854EEDBF011122CC4EC652C489
:1007700037040002B7490F00371ADCBA26CA4AC844
:1007800056C25AC006CE13040400370900029389EA
:10079000F923930A0003B7040002391A370B000249
:1007A000213683274904A303A40063F3F9007133BE
:1007B0008347640099C34533E5B783467400638873
:1007C0005605930700066381F60603C704038D47A9
:1007D000998F8E07B357FA0093F7F70F6393F606D6
:1007E0009307170093F7F70F2388F4021147639DCF
:1007F000E7003D45453413058B00053E29C113052F
:10080000000F493C238804022322090451BF3D45BF
:100810002322090423880402B53C793405052312F8
:10082000A4003D45853CADBF3D45232209042388F6
:1008300004028D340D3583476400B5FFDDB73D45B7
:10084000C9B723880402A9BF011106CE22CCC53640
:100850003704000213058400C92413058400CD2E3B
:10086000E1689388086A0148814778008546014617
:10087000B705D9EB1305840023060100252EE16896
:100880009388086A01488147014781460146B705B8
:1008900038FF13058400392E9532F9350547AA87AC
:1008A0006305E50209476300E506054591EBB706D8
:1008B0000600DC4A7D771307F73FF98FDCCA014554
:1008C00082807D1719EB0D4582809306004037A783
:1008D000070013070712B7050500905D7D8E75D2DE
:1008E000370606005C4A7D771307F73FF98FD58FEF
:1008F00041115CCA02C613073006B2476359F700BC
:10090000014541018280856693860680C9B7B2475A
:1009100085073EC6DDB791476307F50263EAA70086
:100920008547630AF50489476309F5040545828014
:10093000A147E31DF5FE0947094501A8FD1781EF11
:10094000C8D20D45828005470D45B7A7070093879C
:100950000712B7060500905E798E6DD28A05C98DA3
:100960004111CCD202C613073006B247635AF700D2
:100970000145410182801147C9BF21470145F1B7B7
:10098000B24785073EC6D5B70547AA876305E50286
:1009900009476302E506054591EBB70606009C4A48
:1009A0007D771307F73FF98F9CCA014582807D1739
:1009B00019EB0D4582809306004037A70700130707
:1009C0000712B7050500905D7D8E75D237070600CA
:1009D0001C4B7D761306F63FF18FD58F1CCB8547D8
:1009E0001CCF411102C613073006B2476359F70006
:1009F0000145410182808566938606807DBFB247AE
:100A000085073EC6DDB711C98547630DF50205456B
:100A10008280FD1791EB0D4582800946B7A707003C
:100A200093870712B7060500985E718F7DD3411139
:100A3000C8D602C613073006B2476357F700014510
:100A4000410182800546D9BFB24785073EC6EDB752
:100A5000011126CAB7040600DC4806CE22CC4AC8DB
:100A60004EC652C456C2F19BDCC89C482A89C84570
:100A7000F19B9CC883C7C5012E848A07DCC883C745
:100A8000D5018A079CC8193D0C44AA8A0345440035
:100A900059351848B70705002A8A98C3584808509E
:100AA000D8C3184C98C7CD35AA894850A93F834769
:100AB00004002A8793F6170089E6D44893E62600B7
:100AC000D4C893F6270099E637060600544A93E601
:100AD000160054CA93F6470099E637060600144AF2
:100AE00093E6260014CAA18B99E7B70606009C4A34
:100AF00093E717009CCAF240624423205901232245
:100B00004901232439012326E900D244B249224A6B
:100B1000924A4A85424905618280011106CE22CC63
:100B200002C402C62147B707050037550800D8C7D9
:100B300005448D478A85130505803EC022C2292AB7
:100B4000375508009307C0038A851305058022C224
:100B500022C43EC01122F2406244056182804111EC
:100B600022C406C62A84553F18405C4F93E707010C
:100B70005CCF1C441CCB5C4085CB1C43B7061000EB
:100B8000D58F1CC3144C5C48B240D606CE07D58F17
:100B900083460401C206D58F8346C4012244E2067F
:100BA000D58F1CCF410182801C43B706F0FFFD1694
:100BB000F58FC1BF032305002A8E0325C3011365EA
:100BC0000502232EA3002324C30013962601498285
:100BD0004D8E232603012322C3001396050163547F
:100BE000060299C20545B1CB01476346D700639C15
:100BF00008020D4582803386E7000346060005079C
:100C0000230AC300DDB799C2054505CB8147E3D070
:100C1000D7FE03260E00034546013306F70085077D
:100C20002300A600EDB783270E00FD18DC4F93F7D5
:100C30000702D5DF11656D8D11E18280B7070700CE
:100C400083C7470113F585001D8D3335A0008280D1
:100C50001C414147D8CF8280B7470800938707409F
:100C60002A886304F508B757080093870780630450
:100C7000F50A37470800630DE50A05458280331EF3
:100C80001F013376DE0129C683A3450088431393F1
:100C9000180033966F001346F6FF13F43300718D7E
:100CA00033146400418D88C3638B5302638C030249
:100CB000084303AEC500718D331E6E003365C50158
:100CC00008C38842698E884533156500498E90C2F5
:100CD000850833D51E0145F5324441018280232623
:100CE000C801F9B72324C801E1B7B71605003717C3
:100CF0000500B7170500938646C1130707C1938700
:100D0000C7C083AE05008148054F8D4F914233D552
:100D10001E0105ED8280B716050037170500B717CD
:100D20000500938606C21307C7C1938787C1D1BF49
:100D3000B716050037170500B7170500938686C05C
:100D4000130747C0938707C06DBF331E1F0133765B
:100D5000DE0119E2850865BF411122C635B7E16899
:100D60009388086A01488147014781460146B705D3
:100D7000200689B5011106CEA307010089476393B8
:100D8000F502B7052035E1681307F1009388086A7A
:100D90000148814785460146313DF2400345F10057
:100DA00005618280B7052005F9BF011106CE22CC6E
:100DB00026CA2306B100AA84A306C1004D37E16804
:100DC0009388086A01487C00014789460146B78537
:100DD000200126850964F93B130414717D1419E47C
:100DE0000D45F2406244D2440561828085452685E6
:100DF0005137058965F50145EDB7011106CE22CCC5
:100E000026CA2E844AC8AA84328936C6893FB24788
:100E1000E16822869388086A01480147CA86B78537
:100E200080022685616479331304146A7D1411C429
:100E3000854526858137058975F9F2406244D2449B
:100E4000424905618280011106CE22CC26CA2EC6F7
:100E5000AA8431373246E1689388086A014881479D
:100E600001478146B705802026856164A1331304BC
:100E7000146A7D1411C485452685ED3D058975F9F3
:100E8000F2406244D24405618280B3C7A5008D8BD5
:100E9000B308C500B1E78D4763F4C7049377350005
:100EA0002A87B9EB13F6C8FFB306E64093070002A2
:100EB00063C8D706AE86BA876371C70203A8060067
:100EC0009107910623AE07FFE3EAC7FE9307F6FFFB
:100ED000998FF19B91073E97BE95636617018280BB
:100EE0002A87637E150383C7050005078505A30FC1
:100EF000F7FEE39AE8FE828083C605000507937734
:100F00003700A30FD7FE8505D1DF83C6050005078F
:100F100093773700A30FD7FE8505F9FF61B782806D
:100F2000411122C61304000283A3050083A24500D9
:100F300083AF850003AFC50083AE050103AE450155
:100F400003A3850103A8C501945113074702B30702
:100F5000E640232E77FC232057FE2322F7FF23248D
:100F6000E7FF2326D7FF2328C7FF232A67FE232C6A
:100F700007FF232ED7FE93854502E347F4FAAE869A
:100F8000BA876371C70203A806009107910623AED2
:100F900007FFE3EAC7FE9307F6FF998FF19B9107DE
:100FA0003E97BE956365170132444101828083C735
:100FB000050005078505A30FF7FEE387E8FE83C755
:100FC000050005078505A30FF7FEE392E8FEE9BFDC
:100FD00020000000010000000300000006000000E7
:100FE000EB00000000000000000000000000000016
:100FF000000000800000000000000700000000006A
:1010000000000000000000000000000000000000E0
:1010100000000000000000000000000000000000D0
:10000000FD6293820240FD12E39F02FE374100022F
:1000100013010100B711000293818193B71500010C
:10002000938585103716000113068613B706000264
:100030009386861539A083A2050023A0560091055A
:100040009106E3EAC5FEB70500019385850B3706E7
:10005000000113060621B70600029386060039A0A8
:1000600083A2050023A0560091059106E3EAC5FE90
:10007000B705000293858518370600021306464B24
:1000800021A023A005009105E3EDC5FEB702000203
:100090009382020C73905230B7000001E780600B2E
:1000A000B7000001E780600BB7100001E780E09324
:0800B00073005010F5BF8280BF
:1000B8000000000000000000000000000000000038
:1000C8000000000000000000000000000000000028
:1000D8000000000000000000000000000000000018
:1000E8000000000000000000000000000000000008
:1000F80000000000000000000000000000000000F8
:1001080000000000000000000000000000000000E7
:1001180000000000000000000000000000000000D7
:1001280000000000000000000000000000000000C7
:1001380000000000000000000000000000000000B7
:1001480000000000000000000000000000000000A7
:100158000000000000000000000000000000000097
:100168000000000000000000000000000000000087
:100178006F004000130141F806C00AC20EC412C63F
:1001880016C81ACA1ECC22CE26D02AD22ED432D6CF
:1001980036D83ADA3EDC42DEC6C0CAC2CEC4D2C6BF
:1001A800D6C8DACADECCE2CEE6D0EAD2EED4F2D6AF
:1001B800F6D8FADAFEDC97000000938000058290FA
:1001C80082401241A2413242C2425243E243724447
:1001D80082541255A2553256C2565257E257725897
:1001E80086481649A649364AC64A564BE64B764CC7
:1001F800865C165DA65D365EC65E565FE65F1301D9
:08020800C1077300203001A0C2
:100210003D432A876373C3029377F700BDEFADE5D3
:10022000937606FF3D8ABA960CC34CC30CC74CC7E5
:100230004107E36BD7FE11E28280B306C3408A0612
:100240009702000096966780A6002307B700A306D2
:10025000B7002306B700A305B7002305B700A30422
:10026000B7002304B700A303B7002303B700A3021A
:10027000B7002302B700A301B7002301B700A30012
:10028000B7002300B700828093F5F50F93968500A1
:10029000D58D93960501D58D61B79396270097026A
:1002A000000096968682E78086FA9680C1171D8F99
:1002B0003E96E374C3F8A5B7B70705000947D8CF42
:1002C000B7170500938707C0984385669386064055
:1002D000558F98C398471367074098C7B71708000A
:1002E0009387074023A0070023A2070023A4070049
:1002F0001307A008D8C77D57D8CF354798C3D84F24
:10030000935657018D8AE5DE8280B71708009387E0
:10031000074023A0070023A2070023A4070023A669
:1003200007007D57D8CF23A40702B717050093878E
:1003300007C09843F1769386F63F758F98C3984728
:100340001377F7BF98C7B7070500094798D382808E
:10035000B71708009387074088D7D84F137707044B
:100360006DDF828003A3418637150800B7450F0073
:1003700023A4018681470146130505409385152472
:100380000328C501B308F30013780802630A0802C2
:1003900011CE23A2118737470F0023A4F18613073C
:1003A00007246395E70005472387E184B717080012
:1003B00093870740C8534205418182800546C9B7EB
:1003C0008507E39DB7FE7DD2B7470F0093870724CB
:1003D00023A4F18623A21187F9B7411106C622C4CE
:1003E00026C2AA84EF007028E1689388086A014851
:1003F0008147014781460146B70520C726853794C6
:100400009800EF00F00B130414687D1419E40D45F7
:10041000B240224492444101828085452685EF0006
:10042000302605897DF10145E5B7411122C4130647
:1004300000109305F00F1385C18606C6D13B83A536
:1004400081849386C1861306001013850182EF0014
:1004500090341384C186814793050410130600105D
:10046000B306F4003387F50083C606000347070090
:10047000639AE6008507E395C7FE0545B24022442E
:10048000410182800145DDBF411126C293878184ED
:100490008C43B70700804AC0BE9523AEB18406C620
:1004A00022C4939745019384818489E7138501824F
:1004B000EF00302A8C409386C18613850182938693
:1004C000061013060010EF00102485371384C18630
:1004D00011E989472383F400B2402244924402493F
:1004E000410182809C4083D68185938707109CC000
:1004F00013060010B68763F4C600930700109387B5
:1005000007F01306100F9305F00F1305F410239C4A
:10051000F18413040420ED39A2853D461385C1966C
:10052000EF00D02822852244B240924402493D4641
:100530009305F00F4101E9B95D7113068002814511
:10054000280886C6F131BD47230CF1008947230EE8
:10055000F1003ED2E177938707082C080A85231A19
:10056000F102DD23B640616182805D71A2C4138512
:10057000018286C6A6C2CAC0EF00E06A1385018266
:10058000EF00C07D854513850182EF00700F8D4718
:10059000814463E3A700AA84894513850182EF00A3
:1005A000300E937725002A8689E713662500137697
:1005B000F60F9377060499C31376F60BA685138579
:1005C0000182EF00500FE1689388086A0148814773
:1005D000014781460146B705203813850182EF00A7
:1005E000206EE16838009388086A13080002854687
:1005F00081470146B70599EB138501822304010069
:10060000EF00006CB715000151469385450F680057
:10061000EF00D01913890182832709006C0051462D
:100620003ED085473ED26810C1673ED4EF00101817
:10063000B70607009C423707F1FF7D17F98F0810B6
:100640009CC22525B64026449644064961618280B5
:10065000411106C65D39113FB707008073905730CE
:10066000B70000808290B24041018280411122C4D3
:1006700006C69387818483C7670085461384818477
:10068000638ED70009476388E70023030400B24064
:100690002244410182801305000F5D39B71708001D
:1006A00093870740D84F218B09C7D84F136787001E
:1006B000D8CF793FD9BF411106C622C426C24AC04D
:1006C0008347350005476389E70611472A84638914
:1006D000E7009DC7B2402244924402494101828012
:1006E00083D7818591C34D3383474400034754002A
:1006F000E2074207BA9723A0F18623A4F184D9BF69
:1007000083D48185034604001385C19626959305FD
:100710004400EF00B00983470400BE94C204C180C6
:10072000239C91849307F00FE3F697FA2244B2409A
:1007300092440249410189BB3D45193983D78185DE
:1007400099E72244B24092440249410111B72D3B3E
:1007500083C7E184FDD7BDBF41119386818403DF48
:10076000460026C483A2818622C637150800B748F2
:100770000F0037430F004AC2814723AA018413099F
:10078000FFFF814E81468145814301480146138721
:100790008184130505409388182413030324138EC2
:1007A000C1A7636BE60363850E0009462303C700F8
:1007B00099C2A388F18499C123AA718463040800B3
:1007C00023A4518683476700A9E33244A244124917
:1007D0001385C1A74101C5B581420328C50113781E
:1007E0000802631908028502E39912FF99C2A388DF
:1007F000F18499C123AA7184B7470F009387072416
:1008000023A4F18685472303F7003244A24412490A
:1008100041018280E38C62FC03284502937FF80F3C
:10082000637D26011378F80FC29385453308CE0007
:100830002300F80105060548ADB7B307704093F7EC
:10084000F70F6394FF008546D5B7854EEDBF0111C4
:1008500026CA4EC652C4B7490F00371ADCBA22CC9A
:100860004AC856C25AC006CE938481849389F9231C
:10087000930A0006130B0009391AED3483A7418649
:10088000A383A40063F3F900E13383C7640099C331
:10089000F13BE5B783C67400638356096388660538
:1008A000930700036381F60603C701858D47998F7F
:1008B0008E07B357FA0093F7F70F639FF606930777
:1008C000170093F7F70F2388F1841147639DE70022
:1008D0003D45BD3C13850182093629CD1305000F26
:1008E000853C2388018423A2018641BF3D4523A284
:1008F000018623880184A93C0145993C0945893C2E
:100900000145B9349DBF3D4523A20186238801845A
:100910008134893C05052392A4003D45DDB73D4562
:1009200023A201862388018425343D3583C76400D2
:10093000A5F3E5B73D456DB7238801843DBF01119F
:1009400006CE22CCD53E13850182F12C138501827F
:100950003121E1689388086A01488147780085461B
:100960000146B705D9EB1385018223060100892EC4
:10097000E1689388086A014881470147814601463A
:10098000B70538FF13850182252EEFF0FF92C135A0
:100990000547AA876305E50209476300E5060545A3
:1009A00091EBB7060600DC4A7D771307F73FF98F16
:1009B000DCCA014582807D1719EB0D4582809306C4
:1009C000004037A7070013070712B7050500905D21
:1009D0007D8E75D2370606005C4A7D771307F73F98
:1009E000F98FD58F41115CCA02C613073006B24792
:1009F0006359F70001454101828085669386068030
:100A0000C9B7B24785073EC6DDB791476307F50210
:100A100063EAA7008547630AF50489476309F5047B
:100A200005458280A147E31DF5FE0947094501A858
:100A3000FD1781EFC8D20D45828005470D45B7A748
:100A4000070093870712B7060500905E798E6DD276
:100A50008A05C98D4111CCD202C613073006B247B0
:100A6000635AF7000145410182801147C9BF214700
:100A70000145F1B7B24785073EC6D5B70547AA87F6
:100A80006305E50209476304E506054591EBB706F2
:100A900006009C4A7D771307F73FF98F9CCA0145F2
:100AA00082807D1719EB0D4582809306004037A7A1
:100AB000070013070712B7050500905D7D8E75D2FC
:100AC000370706001C4B7D761306F63FF18FD58F56
:100AD0001CCB232C070085471CCF411102C61307EE
:100AE0003006B2476359F7000145410182808566AF
:100AF000938606806DBFB24785073EC6DDB711C934
:100B00008547630DF50205458280FD1791EB0D4584
:100B100082800946B7A7070093870712B70605002A
:100B2000985E718F7DD34111C8D602C61307300677
:100B3000B2476357F7000145410182800546D9BF9E
:100B4000B24785073EC6EDB7011126CAB7040600B5
:100B5000DC4806CE22CC4AC84EC652C456C2F19BCF
:100B6000DCC89C482A89C845F19B9CC8D84883C7E3
:100B7000C5012E84137737C08A07D98FDCC883C795
:100B8000D50198489A071377F7C393F7073CD98F95
:100B90009CC8FD3B0C44AA8A03454400BD35184857
:100BA000B70705002A8A98C358480850D8C3184C7C
:100BB00098C7E935AA8948509937834704002A879E
:100BC00093F6170089E6D44893E62600D4C893F636
:100BD000270099E637060600544A93E6160054CAE1
:100BE00093F6470099E637060600144A93E6260076
:100BF00014CAA18B99E7B70606009C4A93E7170031
:100C00009CCAF24062442320590123224901232433
:100C100039012326E900D244B249224A924A4A8540
:100C2000424905618280011106CE22CC02C402C66F
:100C30002147B707050037550800D8C705448D4739
:100C40008A85130505803EC022C2292A375508002F
:100C50009307C0038A851305058022C222C43EC0C3
:100C60001122F240624405618280411122C406C60D
:100C70002A84553F18405C4F93E707015CCF1C4422
:100C80001CCB5C4085CB1C43B7061000D58F1CC322
:100C9000144C5C48B240D606CE07D58F834604017B
:100CA000C206D58F8346C4012244E206D58F1CCFED
:100CB000410182801C43B706F0FFFD16F58FC1BFCE
:100CC000032305002A8E0325C30113650502232E85
:100CD000A3002324C3001396260149824D8E2326A8
:100CE00003012322C300139605016354060299C22F
:100CF0000545B1CB01476346D700639C08020D450B
:100D000082803386E700034606000507230AC300F6
:100D1000DDB799C2054505CB8147E3D0D7FE032651
:100D20000E00034546013306F70085072300A600A1
:100D3000EDB783270E00FD18DC4F93F70702D5DFD0
:100D400011656D8D11E18280B707070083C74701E8
:100D500013F585001D8D3335A00082801C4141476D
:100D6000D8CF8280B7470800938707402A8863045A
:100D7000F508B7570800938707806304F50A3747DB
:100D80000800630DE50A05458280331E1F01337696
:100D9000DE0129C683A345008843139318003396C8
:100DA0006F001346F6FF13F43300718D33146400A3
:100DB000418D88C3638B5302638C0302084303AEE7
:100DC000C500718D331E6E003365C50108C38842AE
:100DD000698E884533156500498E90C2850833D5E4
:100DE0001E0145F53244410182802326C801F9B72E
:100DF0002324C801E1B7B716050037170500B71758
:100E00000500938646C1130707C19387C7C083AE09
:100E100005008148054F8D4F914233D51E0105EDE8
:100E20008280B716050037170500B71705009386AF
:100E300006C21307C7C1938787C1D1BFB716050084
:100E400037170500B7170500938686C0130747C0FC
:100E5000938707C06DBF331E1F013376DE0119E291
:100E6000850865BF411122C635B7E1689388086AD5
:100E700001488147014781460146B705200689B5EB
:100E8000011106CEA307010089476393F502B70558
:100E90002035E1681307F1009388086A014881470B
:100EA00085460146313DF2400345F10005618280EF
:100EB000B7052005F9BF011106CE22CC26CA2306AC
:100EC000B100AA84A306C1004D37E1689388086A7F
:100ED00001487C00014789460146B78520012685E7
:100EE0000964F93B130414717D1419E40D45F240B3
:100EF0006244D24405618280854526855137058943
:100F000065F50145EDB7011106CE22CC26CA2E8427
:100F10004AC8AA84328936C6893FB247E168228628
:100F20009388086A01480147CA86B78580022685EA
:100F3000616479331304146A7D1411C485452685D0
:100F40008137058975F9F2406244D244424905610E
:100F50008280011106CE22CC26CA2EC6AA84313741
:100F60003246E1689388086A014881470147814613
:100F7000B705802026856164A1331304146A7D14AB
:100F800011C485452685ED3D058975F9F240624419
:100F9000D24405618280E16836879388086AB28608
:100FA00001482E868147B705800319BBB3C7A5004A
:100FB0008D8BB308C500B1E78D4763F4C704937701
:100FC00035002A87B9EB13F6C8FFB306E64093074E
:100FD000000263C8D706AE86BA876371C70203A84A
:100FE00006009107910623AE07FFE3EAC7FE9307C9
:100FF000F6FF998FF19B91073E97BE9563661701A7
:1010000082802A87637E150383C70500050785054F
:10101000A30FF7FEE39AE8FE828083C6050005076A
:1010200093773700A30FD7FE8505D1DF83C6050070
:10103000050793773700A30FD7FE8505F9FF61B742
:101040008280411122C61304000283A3050083A2FB
:10105000450083AF850003AFC50083AE050103AE35
:10106000450103A3850103A8C50194511307470255
:10107000B307E640232E77FC232057FE2322F7FFF9
:101080002324E7FF2326D7FF2328C7FF232A67FE51
:10109000232C07FF232ED7FE93854502E347F4FA5E
:1010A000AE86BA876371C70203A80600910791064E
:1010B00023AE07FFE3EAC7FE9307F6FF998FF19B84
:1010C00091073E97BE9563651701324441018280C6
:1010D00083C7050005078505A30FF7FEE387E8FE34
:1010E00083C7050005078505A30FF7FEE392E8FE19
:1010F000E9BF000020000000010000000300000024
:0811000006000000EB000000F6
:1011080000000700000000000000000000000000D0
:1011180000000000000000000000000000000000C7
:081128000000000000000000BF
:08113000000000800000000037
:0400000501000000F6
:00000001FF
+278 -258
View File
@@ -1,261 +1,281 @@
:020000040100F9
:10000000FD62938202400100FD12E39E02FE374131
:10001000000213010100B701000293810100B7152E
:100020000001938505FF3716000113060602B70687
:1000300000029386060039A083A2050023A0560083
:1000400091059106E3EAC5FEB71500019385050207
:100050003716000113060602B7060002938606262D
:1000600039A083A2050023A0560091059106E3EA7A
:10007000C5FEB70500029385050337060002130687
:10008000062621A023A005009105E3EDC5FEB700DB
:100090000001E780C00AB7000001E780C00AB7107E
:1000A0000001E780808473005010F5BF828000005B
:1000B0000000000000000000000000000000000040
:1000C0006F004000197106C20AC40EC612C816CAD3
:1000D0001ACC1ECE22D026D22AD42ED632D836DA48
:1000E0003ADC3EDEC2C0C6C2CAC4CEC6D2C8D6CA78
:1000F000DACCDECEE2D0E6D2EAD4EED6F2D8F6DA28
:10010000FADCFEDE970000009380E00482909240CB
:100110002241B2414242D2426243F24302549254DB
:100120002255B2554256D2566257F2570648964863
:100130002649B649464AD64A664BF64B065C965C5B
:10014000265DB65D465ED65E665FF65F096173004A
:10015000203001A03D432A876373C3029377F700E1
:10016000BDEFADE5937606FF3D8ABA960CC34CC34E
:100170000CC74CC74107E36BD7FE11E28280B30680
:10018000C3408A069702000096966780A600230760
:10019000B700A306B7002306B700A305B7002305E1
:1001A000B700A304B7002304B700A303B7002303D9
:1001B000B700A302B7002302B700A301B7002301D1
:1001C000B700A300B7002300B700828093F5F50FB6
:1001D00093968500D58D93960501D58D61B793963D
:1001E00027009702000096968682E78086FA96801E
:1001F000C1171D8F3E96E374C3F8A5B7B707050076
:100200000947D8CFB7170500938707C0984385667D
:1002100093860640558F98C398471367074098C741
:10022000B71708009387074023A0070023A2070001
:1002300023A407001307A008D8C77D57D8CF354798
:1002400098C3D84F935657018D8AE5DE8280B71741
:1002500008009387074023A0070023A2070023A4D8
:10026000070023A607007D57D8CF23A40702B7179E
:100270000500938707C09843F1769386F63F758F04
:1002800098C398471377F7BF98C7B7070500094782
:1002900098D38280B71708009387074088D7D84F34
:1002A000137707046DDF82803707000203234704BA
:1002B000B706000237150800B7450F0023A406044F
:1002C0008147014613050540938515240328C50180
:1002D000B308F30013780802630C080205C2232256
:1002E000170537470F0023A4F60413070724639765
:1002F000E700B707000205472383E700B7170800A8
:1003000093870740C85342054181828005467DBFDF
:100310008507E39DB7FE7DD2B7470F00938707247B
:1003200023A4F60423221705E9B7411106C622C407
:1003300026C2AA84EF00B022E1689388086A0148C7
:100340008147014781460146B70520C72685379476
:100350009800EF003006130414687D1419E40D456D
:10036000B240224492444101828085452685EF00B7
:10037000702005897DF10145E5B7411122C437049C
:100380000002930704008C43B70700804AC0BE9563
:10039000B707000223AEB70206C626C293974501EF
:1003A000130404003709000289E713058900EF00F0
:1003B00090290C40B70400029386C4041306001071
:1003C00013058900EF0070231C4037070002835695
:1003D0008703938707101CC013060010B68763F4C9
:1003E000C600930700101384C4041305F400938718
:1003F00007F01306100F814513040410231CF702A5
:10040000913BA2851385C4043D46EF0010282320AC
:1004100004002322040023240400231604002307DD
:100420000400B240224492440249410182805D713D
:10043000130680028145280886C6293BBD47230C48
:10044000F1008947230EF1003ED2E1779387070838
:100450002C080A85231AF102E52BB64061618280DF
:100460005D71A2C4370400021305840086C6A6C2CB
:10047000CAC0652513058400EF00807D85451305FE
:100480008400EF00300F8D47814463E3A700AA8406
:10049000894513058400EF00F00D937725002A8627
:1004A00089E7136625001376F60FA68513058400E9
:1004B000EF00B00FE1689388086A0148814701475F
:1004C00081460146B705203813058400E525E1681B
:1004D00038009388086A1308000285468147014660
:1004E000B70599EB1305840023040100E125B71536
:1004F00000015146938505FD6800EF0010191309AE
:100500008400832709006C0051463ED085473ED2C7
:100510006810C1673ED4EF005017B70607009C4231
:100520003707F1FF7D17F98F08109CC20D2DB640DB
:1005300026449644064961618280411106C6013B0A
:100540000537B707008073905730B700008082905E
:10055000B2404101828041113707000222C406C621
:100560009307070083C76700854613040700638E5F
:10057000D70009476388E70023030400B240224400
:10058000410182801305000F3133B71708009387AC
:100590000740D84F218B09C7D84F13678700D8CFA2
:1005A000693FD9BF411106C622C426C24AC083474B
:1005B000350005476383E70811472A846389E7000C
:1005C0008DCFB24022449244024941018280B70754
:1005D000000283D7870391C34D3383474400034709
:1005E0005400E2074207BA97370700022320F704B6
:1005F000370700022320F700E9B7370900028354C8
:1006000089030346050093054500370500021305DD
:10061000C5042695EF00700783470400BE94C2040A
:10062000C180231C99029307F00FE3FC97F8224442
:10063000B24092440249410189B33D45A139B7070F
:10064000000283D7870391C30D3B2244B2409244FA
:1006500002494101DDB53707000241119306070049
:1006600003DF460026C4B704000283A2840422C626
:100670003715080037040002B7480F0037430F0052
:10068000370E00024AC28147232A04021309FFFFE2
:10069000814E814681458143014801461307070089
:1006A000130505409388182413030324130ECE1555
:1006B000636FE60363850E0009462303C70089C6FE
:1006C000B7060002A388F60299C1232A74026304C4
:1006D000080023A4540483476700A9E73244A244D6
:1006E0001249370500021305C515410165BD814258
:1006F0000328C50113780802631B08028502E399E9
:1007000012FF89C6B7060002A388F60299C1232A00
:100710007402B7470F009387072423A4F404854786
:100720002303F7003244A244124941018280E38A44
:1007300062FC03284502937FF80F637D260113783E
:10074000F80FC29385453308CE002300F801050653
:100750000548B9BFB307704093F7F70F6394FF00E4
:100760008546D5B7854EEDBF011122CC4EC652C489
:1007700037040002B7490F00371ADCBA26CA4AC844
:1007800056C25AC006CE13040400370900029389EA
:10079000F923930A0003B7040002391A370B000249
:1007A000213683274904A303A40063F3F9007133BE
:1007B0008347640099C34533E5B783467400638873
:1007C0005605930700066381F60603C704038D47A9
:1007D000998F8E07B357FA0093F7F70F6393F606D6
:1007E0009307170093F7F70F2388F4021147639DCF
:1007F000E7003D45453413058B00053E29C113052F
:10080000000F493C238804022322090451BF3D45BF
:100810002322090423880402B53C793405052312F8
:10082000A4003D45853CADBF3D45232209042388F6
:1008300004028D340D3583476400B5FFDDB73D45B7
:10084000C9B723880402A9BF011106CE22CCC53640
:100850003704000213058400C92413058400CD2E3B
:10086000E1689388086A0148814778008546014617
:10087000B705D9EB1305840023060100252EE16896
:100880009388086A01488147014781460146B705B8
:1008900038FF13058400392E9532F9350547AA87AC
:1008A0006305E50209476300E506054591EBB706D8
:1008B0000600DC4A7D771307F73FF98FDCCA014554
:1008C00082807D1719EB0D4582809306004037A783
:1008D000070013070712B7050500905D7D8E75D2DE
:1008E000370606005C4A7D771307F73FF98FD58FEF
:1008F00041115CCA02C613073006B2476359F700BC
:10090000014541018280856693860680C9B7B2475A
:1009100085073EC6DDB791476307F50263EAA70086
:100920008547630AF50489476309F5040545828014
:10093000A147E31DF5FE0947094501A8FD1781EF11
:10094000C8D20D45828005470D45B7A7070093879C
:100950000712B7060500905E798E6DD28A05C98DA3
:100960004111CCD202C613073006B247635AF700D2
:100970000145410182801147C9BF21470145F1B7B7
:10098000B24785073EC6D5B70547AA876305E50286
:1009900009476302E506054591EBB70606009C4A48
:1009A0007D771307F73FF98F9CCA014582807D1739
:1009B00019EB0D4582809306004037A70700130707
:1009C0000712B7050500905D7D8E75D237070600CA
:1009D0001C4B7D761306F63FF18FD58F1CCB8547D8
:1009E0001CCF411102C613073006B2476359F70006
:1009F0000145410182808566938606807DBFB247AE
:100A000085073EC6DDB711C98547630DF50205456B
:100A10008280FD1791EB0D4582800946B7A707003C
:100A200093870712B7060500985E718F7DD3411139
:100A3000C8D602C613073006B2476357F700014510
:100A4000410182800546D9BFB24785073EC6EDB752
:100A5000011126CAB7040600DC4806CE22CC4AC8DB
:100A60004EC652C456C2F19BDCC89C482A89C84570
:100A7000F19B9CC883C7C5012E848A07DCC883C745
:100A8000D5018A079CC8193D0C44AA8A0345440035
:100A900059351848B70705002A8A98C3584808509E
:100AA000D8C3184C98C7CD35AA894850A93F834769
:100AB00004002A8793F6170089E6D44893E62600B7
:100AC000D4C893F6270099E637060600544A93E601
:100AD000160054CA93F6470099E637060600144AF2
:100AE00093E6260014CAA18B99E7B70606009C4A34
:100AF00093E717009CCAF240624423205901232245
:100B00004901232439012326E900D244B249224A6B
:100B1000924A4A85424905618280011106CE22CC63
:100B200002C402C62147B707050037550800D8C7D9
:100B300005448D478A85130505803EC022C2292AB7
:100B4000375508009307C0038A851305058022C224
:100B500022C43EC01122F2406244056182804111EC
:100B600022C406C62A84553F18405C4F93E707010C
:100B70005CCF1C441CCB5C4085CB1C43B7061000EB
:100B8000D58F1CC3144C5C48B240D606CE07D58F17
:100B900083460401C206D58F8346C4012244E2067F
:100BA000D58F1CCF410182801C43B706F0FFFD1694
:100BB000F58FC1BF032305002A8E0325C3011365EA
:100BC0000502232EA3002324C30013962601498285
:100BD0004D8E232603012322C3001396050163547F
:100BE000060299C20545B1CB01476346D700639C15
:100BF00008020D4582803386E7000346060005079C
:100C0000230AC300DDB799C2054505CB8147E3D070
:100C1000D7FE03260E00034546013306F70085077D
:100C20002300A600EDB783270E00FD18DC4F93F7D5
:100C30000702D5DF11656D8D11E18280B7070700CE
:100C400083C7470113F585001D8D3335A0008280D1
:100C50001C414147D8CF8280B7470800938707409F
:100C60002A886304F508B757080093870780630450
:100C7000F50A37470800630DE50A05458280331EF3
:100C80001F013376DE0129C683A3450088431393F1
:100C9000180033966F001346F6FF13F43300718D7E
:100CA00033146400418D88C3638B5302638C030249
:100CB000084303AEC500718D331E6E003365C50158
:100CC00008C38842698E884533156500498E90C2F5
:100CD000850833D51E0145F5324441018280232623
:100CE000C801F9B72324C801E1B7B71605003717C3
:100CF0000500B7170500938646C1130707C1938700
:100D0000C7C083AE05008148054F8D4F914233D552
:100D10001E0105ED8280B716050037170500B717CD
:100D20000500938606C21307C7C1938787C1D1BF49
:100D3000B716050037170500B7170500938686C05C
:100D4000130747C0938707C06DBF331E1F0133765B
:100D5000DE0119E2850865BF411122C635B7E16899
:100D60009388086A01488147014781460146B705D3
:100D7000200689B5011106CEA307010089476393B8
:100D8000F502B7052035E1681307F1009388086A7A
:100D90000148814785460146313DF2400345F10057
:100DA00005618280B7052005F9BF011106CE22CC6E
:100DB00026CA2306B100AA84A306C1004D37E16804
:100DC0009388086A01487C00014789460146B78537
:100DD000200126850964F93B130414717D1419E47C
:100DE0000D45F2406244D2440561828085452685E6
:100DF0005137058965F50145EDB7011106CE22CCC5
:100E000026CA2E844AC8AA84328936C6893FB24788
:100E1000E16822869388086A01480147CA86B78537
:100E200080022685616479331304146A7D1411C429
:100E3000854526858137058975F9F2406244D2449B
:100E4000424905618280011106CE22CC26CA2EC6F7
:100E5000AA8431373246E1689388086A014881479D
:100E600001478146B705802026856164A1331304BC
:100E7000146A7D1411C485452685ED3D058975F9F3
:100E8000F2406244D24405618280B3C7A5008D8BD5
:100E9000B308C500B1E78D4763F4C7049377350005
:100EA0002A87B9EB13F6C8FFB306E64093070002A2
:100EB00063C8D706AE86BA876371C70203A8060067
:100EC0009107910623AE07FFE3EAC7FE9307F6FFFB
:100ED000998FF19B91073E97BE95636617018280BB
:100EE0002A87637E150383C7050005078505A30FC1
:100EF000F7FEE39AE8FE828083C605000507937734
:100F00003700A30FD7FE8505D1DF83C6050005078F
:100F100093773700A30FD7FE8505F9FF61B782806D
:100F2000411122C61304000283A3050083A24500D9
:100F300083AF850003AFC50083AE050103AE450155
:100F400003A3850103A8C501945113074702B30702
:100F5000E640232E77FC232057FE2322F7FF23248D
:100F6000E7FF2326D7FF2328C7FF232A67FE232C6A
:100F700007FF232ED7FE93854502E347F4FAAE869A
:100F8000BA876371C70203A806009107910623AED2
:100F900007FFE3EAC7FE9307F6FF998FF19B9107DE
:100FA0003E97BE956365170132444101828083C735
:100FB000050005078505A30FF7FEE387E8FE83C755
:100FC000050005078505A30FF7FEE392E8FEE9BFDC
:100FD00020000000010000000300000006000000E7
:100FE000EB00000000000000000000000000000016
:100FF000000000800000000000000700000000006A
:1010000000000000000000000000000000000000E0
:1010100000000000000000000000000000000000D0
:10000000FD6293820240FD12E39F02FE374100022F
:1000100013010100B711000293818193B71500010C
:10002000938585103716000113068613B706000264
:100030009386861539A083A2050023A0560091055A
:100040009106E3EAC5FEB70500019385850B3706E7
:10005000000113060621B70600029386060039A0A8
:1000600083A2050023A0560091059106E3EAC5FE90
:10007000B705000293858518370600021306464B24
:1000800021A023A005009105E3EDC5FEB702000203
:100090009382020C73905230B7000001E780600B2E
:1000A000B7000001E780600BB7100001E780E09324
:0800B00073005010F5BF8280BF
:1000B8000000000000000000000000000000000038
:1000C8000000000000000000000000000000000028
:1000D8000000000000000000000000000000000018
:1000E8000000000000000000000000000000000008
:1000F80000000000000000000000000000000000F8
:1001080000000000000000000000000000000000E7
:1001180000000000000000000000000000000000D7
:1001280000000000000000000000000000000000C7
:1001380000000000000000000000000000000000B7
:1001480000000000000000000000000000000000A7
:100158000000000000000000000000000000000097
:100168000000000000000000000000000000000087
:100178006F004000130141F806C00AC20EC412C63F
:1001880016C81ACA1ECC22CE26D02AD22ED432D6CF
:1001980036D83ADA3EDC42DEC6C0CAC2CEC4D2C6BF
:1001A800D6C8DACADECCE2CEE6D0EAD2EED4F2D6AF
:1001B800F6D8FADAFEDC97000000938000058290FA
:1001C80082401241A2413242C2425243E243724447
:1001D80082541255A2553256C2565257E257725897
:1001E80086481649A649364AC64A564BE64B764CC7
:1001F800865C165DA65D365EC65E565FE65F1301D9
:08020800C1077300203001A0C2
:100210003D432A876373C3029377F700BDEFADE5D3
:10022000937606FF3D8ABA960CC34CC30CC74CC7E5
:100230004107E36BD7FE11E28280B306C3408A0612
:100240009702000096966780A6002307B700A306D2
:10025000B7002306B700A305B7002305B700A30422
:10026000B7002304B700A303B7002303B700A3021A
:10027000B7002302B700A301B7002301B700A30012
:10028000B7002300B700828093F5F50F93968500A1
:10029000D58D93960501D58D61B79396270097026A
:1002A000000096968682E78086FA9680C1171D8F99
:1002B0003E96E374C3F8A5B7B70705000947D8CF42
:1002C000B7170500938707C0984385669386064055
:1002D000558F98C398471367074098C7B71708000A
:1002E0009387074023A0070023A2070023A4070049
:1002F0001307A008D8C77D57D8CF354798C3D84F24
:10030000935657018D8AE5DE8280B71708009387E0
:10031000074023A0070023A2070023A4070023A669
:1003200007007D57D8CF23A40702B717050093878E
:1003300007C09843F1769386F63F758F98C3984728
:100340001377F7BF98C7B7070500094798D382808E
:10035000B71708009387074088D7D84F137707044B
:100360006DDF828003A3418637150800B7450F0073
:1003700023A4018681470146130505409385152472
:100380000328C501B308F30013780802630A0802C2
:1003900011CE23A2118737470F0023A4F18613073C
:1003A00007246395E70005472387E184B717080012
:1003B00093870740C8534205418182800546C9B7EB
:1003C0008507E39DB7FE7DD2B7470F0093870724CB
:1003D00023A4F18623A21187F9B7411106C622C4CE
:1003E00026C2AA84EF007028E1689388086A014851
:1003F0008147014781460146B70520C726853794C6
:100400009800EF00F00B130414687D1419E40D45F7
:10041000B240224492444101828085452685EF0006
:10042000302605897DF10145E5B7411122C4130647
:1004300000109305F00F1385C18606C6D13B83A536
:1004400081849386C1861306001013850182EF0014
:1004500090341384C186814793050410130600105D
:10046000B306F4003387F50083C606000347070090
:10047000639AE6008507E395C7FE0545B24022442E
:10048000410182800145DDBF411126C293878184ED
:100490008C43B70700804AC0BE9523AEB18406C620
:1004A00022C4939745019384818489E7138501824F
:1004B000EF00302A8C409386C18613850182938693
:1004C000061013060010EF00102485371384C18630
:1004D00011E989472383F400B2402244924402493F
:1004E000410182809C4083D68185938707109CC000
:1004F00013060010B68763F4C600930700109387B5
:1005000007F01306100F9305F00F1305F410239C4A
:10051000F18413040420ED39A2853D461385C1966C
:10052000EF00D02822852244B240924402493D4641
:100530009305F00F4101E9B95D7113068002814511
:10054000280886C6F131BD47230CF1008947230EE8
:10055000F1003ED2E177938707082C080A85231A19
:10056000F102DD23B640616182805D71A2C4138512
:10057000018286C6A6C2CAC0EF00E06A1385018266
:10058000EF00C07D854513850182EF00700F8D4718
:10059000814463E3A700AA84894513850182EF00A3
:1005A000300E937725002A8689E713662500137697
:1005B000F60F9377060499C31376F60BA685138579
:1005C0000182EF00500FE1689388086A0148814773
:1005D000014781460146B705203813850182EF00A7
:1005E000206EE16838009388086A13080002854687
:1005F00081470146B70599EB138501822304010069
:10060000EF00006CB715000151469385450F680057
:10061000EF00D01913890182832709006C0051462D
:100620003ED085473ED26810C1673ED4EF00101817
:10063000B70607009C423707F1FF7D17F98F0810B6
:100640009CC22525B64026449644064961618280B5
:10065000411106C65D39113FB707008073905730CE
:10066000B70000808290B24041018280411122C4D3
:1006700006C69387818483C7670085461384818477
:10068000638ED70009476388E70023030400B24064
:100690002244410182801305000F5D39B71708001D
:1006A00093870740D84F218B09C7D84F136787001E
:1006B000D8CF793FD9BF411106C622C426C24AC04D
:1006C0008347350005476389E70611472A84638914
:1006D000E7009DC7B2402244924402494101828012
:1006E00083D7818591C34D3383474400034754002A
:1006F000E2074207BA9723A0F18623A4F184D9BF69
:1007000083D48185034604001385C19626959305FD
:100710004400EF00B00983470400BE94C204C180C6
:10072000239C91849307F00FE3F697FA2244B2409A
:1007300092440249410189BB3D45193983D78185DE
:1007400099E72244B24092440249410111B72D3B3E
:1007500083C7E184FDD7BDBF41119386818403DF48
:10076000460026C483A2818622C637150800B748F2
:100770000F0037430F004AC2814723AA018413099F
:10078000FFFF814E81468145814301480146138721
:100790008184130505409388182413030324138EC2
:1007A000C1A7636BE60363850E0009462303C700F8
:1007B00099C2A388F18499C123AA718463040800B3
:1007C00023A4518683476700A9E33244A244124917
:1007D0001385C1A74101C5B581420328C50113781E
:1007E0000802631908028502E39912FF99C2A388DF
:1007F000F18499C123AA7184B7470F009387072416
:1008000023A4F18685472303F7003244A24412490A
:1008100041018280E38C62FC03284502937FF80F3C
:10082000637D26011378F80FC29385453308CE0007
:100830002300F80105060548ADB7B307704093F7EC
:10084000F70F6394FF008546D5B7854EEDBF0111C4
:1008500026CA4EC652C4B7490F00371ADCBA22CC9A
:100860004AC856C25AC006CE938481849389F9231C
:10087000930A0006130B0009391AED3483A7418649
:10088000A383A40063F3F900E13383C7640099C331
:10089000F13BE5B783C67400638356096388660538
:1008A000930700036381F60603C701858D47998F7F
:1008B0008E07B357FA0093F7F70F639FF606930777
:1008C000170093F7F70F2388F1841147639DE70022
:1008D0003D45BD3C13850182093629CD1305000F26
:1008E000853C2388018423A2018641BF3D4523A284
:1008F000018623880184A93C0145993C0945893C2E
:100900000145B9349DBF3D4523A20186238801845A
:100910008134893C05052392A4003D45DDB73D4562
:1009200023A201862388018425343D3583C76400D2
:10093000A5F3E5B73D456DB7238801843DBF01119F
:1009400006CE22CCD53E13850182F12C138501827F
:100950003121E1689388086A01488147780085461B
:100960000146B705D9EB1385018223060100892EC4
:10097000E1689388086A014881470147814601463A
:10098000B70538FF13850182252EEFF0FF92C135A0
:100990000547AA876305E50209476300E5060545A3
:1009A00091EBB7060600DC4A7D771307F73FF98F16
:1009B000DCCA014582807D1719EB0D4582809306C4
:1009C000004037A7070013070712B7050500905D21
:1009D0007D8E75D2370606005C4A7D771307F73F98
:1009E000F98FD58F41115CCA02C613073006B24792
:1009F0006359F70001454101828085669386068030
:100A0000C9B7B24785073EC6DDB791476307F50210
:100A100063EAA7008547630AF50489476309F5047B
:100A200005458280A147E31DF5FE0947094501A858
:100A3000FD1781EFC8D20D45828005470D45B7A748
:100A4000070093870712B7060500905E798E6DD276
:100A50008A05C98D4111CCD202C613073006B247B0
:100A6000635AF7000145410182801147C9BF214700
:100A70000145F1B7B24785073EC6D5B70547AA87F6
:100A80006305E50209476304E506054591EBB706F2
:100A900006009C4A7D771307F73FF98F9CCA0145F2
:100AA00082807D1719EB0D4582809306004037A7A1
:100AB000070013070712B7050500905D7D8E75D2FC
:100AC000370706001C4B7D761306F63FF18FD58F56
:100AD0001CCB232C070085471CCF411102C61307EE
:100AE0003006B2476359F7000145410182808566AF
:100AF000938606806DBFB24785073EC6DDB711C934
:100B00008547630DF50205458280FD1791EB0D4584
:100B100082800946B7A7070093870712B70605002A
:100B2000985E718F7DD34111C8D602C61307300677
:100B3000B2476357F7000145410182800546D9BF9E
:100B4000B24785073EC6EDB7011126CAB7040600B5
:100B5000DC4806CE22CC4AC84EC652C456C2F19BCF
:100B6000DCC89C482A89C845F19B9CC8D84883C7E3
:100B7000C5012E84137737C08A07D98FDCC883C795
:100B8000D50198489A071377F7C393F7073CD98F95
:100B90009CC8FD3B0C44AA8A03454400BD35184857
:100BA000B70705002A8A98C358480850D8C3184C7C
:100BB00098C7E935AA8948509937834704002A879E
:100BC00093F6170089E6D44893E62600D4C893F636
:100BD000270099E637060600544A93E6160054CAE1
:100BE00093F6470099E637060600144A93E6260076
:100BF00014CAA18B99E7B70606009C4A93E7170031
:100C00009CCAF24062442320590123224901232433
:100C100039012326E900D244B249224A924A4A8540
:100C2000424905618280011106CE22CC02C402C66F
:100C30002147B707050037550800D8C705448D4739
:100C40008A85130505803EC022C2292A375508002F
:100C50009307C0038A851305058022C222C43EC0C3
:100C60001122F240624405618280411122C406C60D
:100C70002A84553F18405C4F93E707015CCF1C4422
:100C80001CCB5C4085CB1C43B7061000D58F1CC322
:100C9000144C5C48B240D606CE07D58F834604017B
:100CA000C206D58F8346C4012244E206D58F1CCFED
:100CB000410182801C43B706F0FFFD16F58FC1BFCE
:100CC000032305002A8E0325C30113650502232E85
:100CD000A3002324C3001396260149824D8E2326A8
:100CE00003012322C300139605016354060299C22F
:100CF0000545B1CB01476346D700639C08020D450B
:100D000082803386E700034606000507230AC300F6
:100D1000DDB799C2054505CB8147E3D0D7FE032651
:100D20000E00034546013306F70085072300A600A1
:100D3000EDB783270E00FD18DC4F93F70702D5DFD0
:100D400011656D8D11E18280B707070083C74701E8
:100D500013F585001D8D3335A00082801C4141476D
:100D6000D8CF8280B7470800938707402A8863045A
:100D7000F508B7570800938707806304F50A3747DB
:100D80000800630DE50A05458280331E1F01337696
:100D9000DE0129C683A345008843139318003396C8
:100DA0006F001346F6FF13F43300718D33146400A3
:100DB000418D88C3638B5302638C0302084303AEE7
:100DC000C500718D331E6E003365C50108C38842AE
:100DD000698E884533156500498E90C2850833D5E4
:100DE0001E0145F53244410182802326C801F9B72E
:100DF0002324C801E1B7B716050037170500B71758
:100E00000500938646C1130707C19387C7C083AE09
:100E100005008148054F8D4F914233D51E0105EDE8
:100E20008280B716050037170500B71705009386AF
:100E300006C21307C7C1938787C1D1BFB716050084
:100E400037170500B7170500938686C0130747C0FC
:100E5000938707C06DBF331E1F013376DE0119E291
:100E6000850865BF411122C635B7E1689388086AD5
:100E700001488147014781460146B705200689B5EB
:100E8000011106CEA307010089476393F502B70558
:100E90002035E1681307F1009388086A014881470B
:100EA00085460146313DF2400345F10005618280EF
:100EB000B7052005F9BF011106CE22CC26CA2306AC
:100EC000B100AA84A306C1004D37E1689388086A7F
:100ED00001487C00014789460146B78520012685E7
:100EE0000964F93B130414717D1419E40D45F240B3
:100EF0006244D24405618280854526855137058943
:100F000065F50145EDB7011106CE22CC26CA2E8427
:100F10004AC8AA84328936C6893FB247E168228628
:100F20009388086A01480147CA86B78580022685EA
:100F3000616479331304146A7D1411C485452685D0
:100F40008137058975F9F2406244D244424905610E
:100F50008280011106CE22CC26CA2EC6AA84313741
:100F60003246E1689388086A014881470147814613
:100F7000B705802026856164A1331304146A7D14AB
:100F800011C485452685ED3D058975F9F240624419
:100F9000D24405618280E16836879388086AB28608
:100FA00001482E868147B705800319BBB3C7A5004A
:100FB0008D8BB308C500B1E78D4763F4C704937701
:100FC00035002A87B9EB13F6C8FFB306E64093074E
:100FD000000263C8D706AE86BA876371C70203A84A
:100FE00006009107910623AE07FFE3EAC7FE9307C9
:100FF000F6FF998FF19B91073E97BE9563661701A7
:1010000082802A87637E150383C70500050785054F
:10101000A30FF7FEE39AE8FE828083C6050005076A
:1010200093773700A30FD7FE8505D1DF83C6050070
:10103000050793773700A30FD7FE8505F9FF61B742
:101040008280411122C61304000283A3050083A2FB
:10105000450083AF850003AFC50083AE050103AE35
:10106000450103A3850103A8C50194511307470255
:10107000B307E640232E77FC232057FE2322F7FFF9
:101080002324E7FF2326D7FF2328C7FF232A67FE51
:10109000232C07FF232ED7FE93854502E347F4FA5E
:1010A000AE86BA876371C70203A80600910791064E
:1010B00023AE07FFE3EAC7FE9307F6FF998FF19B84
:1010C00091073E97BE9563651701324441018280C6
:1010D00083C7050005078505A30FF7FEE387E8FE34
:1010E00083C7050005078505A30FF7FEE392E8FE19
:1010F000E9BF000020000000010000000300000024
:0811000006000000EB000000F6
:1011080000000700000000000000000000000000D0
:1011180000000000000000000000000000000000C7
:081128000000000000000000BF
:08113000000000800000000037
:0400000501000000F6
:00000001FF
+4 -6
View File
@@ -121,18 +121,16 @@ int HardwareSerial::availableForWrite(void)
void HardwareSerial::rx_complete_irq(void)
{
// which UART to use
UART_TypeDef* uart = UART_0;
if (uartNum == 1)
uart = UART_1;
// find next index in buffer with upper limit
uint8_t i = (uint8_t)(_rx_buffer_head + 1)%SERIAL_RX_BUFFER_SIZE;
UART_TypeDef* uart = (uartNum == 1) ? UART_1 : UART_0;
rx_buffer_index_t i;
unsigned char c;
// while there is something to receive, put the data into the buffer
// and edit the buffer index
while(!UART_IS_RX_FIFO_EMPTY(uart))
{
c = UART_READ_BYTE(uart);
// find next index in buffer with upper limit
i = (unsigned int)(_rx_buffer_head + 1)%SERIAL_RX_BUFFER_SIZE;
if (i != _rx_buffer_tail)
{
// write if there is space in the buffer
+10 -2
View File
@@ -41,7 +41,15 @@
// often work, but occasionally a race condition can occur that makes
// Serial behave erratically. See https://github.com/arduino/Arduino/issues/2405
#if !defined(SERIAL_RX_BUFFER_SIZE)
#define SERIAL_RX_BUFFER_SIZE 64
#endif
#if (SERIAL_RX_BUFFER_SIZE>256)
typedef uint16_t rx_buffer_index_t;
#else
typedef uint8_t rx_buffer_index_t;
#endif
// Define config for Serial.begin(baud, config);
// parity: 7...4 bits = 0 (no), 2 (even), 3 (odd)
@@ -68,8 +76,8 @@
class HardwareSerial : public Stream
{
protected:
volatile uint8_t _rx_buffer_head;
volatile uint8_t _rx_buffer_tail;
volatile rx_buffer_index_t _rx_buffer_head;
volatile rx_buffer_index_t _rx_buffer_tail;
unsigned char _rx_buffer[SERIAL_RX_BUFFER_SIZE];
private:
+18 -6
View File
@@ -18,12 +18,12 @@ void __attribute__((weak)) IRremote_interrupt_handler(void)
// dummy function for case when IRremote library is not in use
}
void __attribute__((weak)) ISR(void)
{
bool __attribute__((section(".ram_text"), weak)) ISR(void)
{
/*
A dummy function for the case when additional interrupts are not used in the project.
In the project, you need to create a function of the form:
extern "C" void ISR()
extern "C" __attribute__((section(".ram_text"))) bool ISR(void)
{
if (EPIC_CHECK_TIMER16_1())
{
@@ -35,20 +35,31 @@ void __attribute__((weak)) ISR(void)
// reset timer interrupt flags
TIM16_CLEAR_INT_MASK(htimer16_1_, 0xFFFFFFFF);
}
return false;
}
If you don't need to call standard trap_handler() code, you can return true from this function
and trap_handler() code will be missed. But you must carefully clear interrupt flags by yourself
in your custom ISR() function.
libraries required to use this example:
#include "mik32_hal_timer16.h"
#include "mik32_hal_irq.h"
#include "wiring_LL.h"
*/
return false;
}
// ---------------------------------------------- //
void __attribute__((noinline, section(".ram_text"), optimize("O3"))) trap_handler (void)
{
// custom interrupt
ISR();
if(ISR())
{
// reset all interrupts and miss trap_handler() code
EPIC_CLEAR_ALL();
return;
}
// gpio interrupt
if (EPIC_CHECK_GPIO_IRQ())
gpio_interrupt_handler();
@@ -77,6 +88,7 @@ void __attribute__((noinline, section(".ram_text"), optimize("O3"))) trap_handle
if (EPIC_CHECK_I2C_0())
wire_interrupt_handler(0);
// i2c1 interrupt
if (EPIC_CHECK_I2C_1())
wire_interrupt_handler(1);
+54 -45
View File
@@ -104,55 +104,64 @@ It is recommended to enable the timer in the following order:
*/
void analogWrite(uint32_t PinNumber, uint32_t writeVal)
{
if (writeVal > WriteValMax) writeVal = WriteValMax;
if (digitalPinPwmIsOn(PinNumber) > 0) // pin has pwm and pwm is already on
if (writeVal >= WriteValMax)
{
// we can only change writeVal if it is differ from current value
TIMER32_TypeDef* timer = pwmPinToTimer(PinNumber);
uint32_t newOCR = (uint32_t) (((uint64_t)pwmTopVal * writeVal) / WriteValMax);
if (timer->CHANNELS[pwmPinToTimerChannel(PinNumber)].OCR != newOCR)
// if we need max value, use digitalWrite to supply constant level
digitalWrite(PinNumber, HIGH);
}
else
{
// if we need less then max, use pwm
int8_t pwmState = digitalPinPwmIsOn(PinNumber);
if (pwmState > 0) // pin has pwm and pwm is already on
{
// if new ocr differs from current, set new ocr
timer->CHANNELS[pwmPinToTimerChannel(PinNumber)].OCR = newOCR;
// we can only change writeVal if it is differ from current value
TIMER32_TypeDef* timer = pwmPinToTimer(PinNumber);
uint32_t newOCR = (uint32_t) (((uint64_t)pwmTopVal * writeVal) / WriteValMax);
if (timer->CHANNELS[pwmPinToTimerChannel(PinNumber)].OCR != newOCR)
{
// if new ocr differs from current, set new ocr
timer->CHANNELS[pwmPinToTimerChannel(PinNumber)].OCR = newOCR;
}
}
else if (pwmState == 0) // pin has pwm and pwm is off
{
// init pin as pwm
uint32_t OCRval = (pwmTopVal * writeVal) / WriteValMax;
// initialization of the required timer
htimer32.Instance = pwmPinToTimer(PinNumber);
htimer32.Top = pwmTopVal;
htimer32.State = TIMER32_STATE_DISABLE;
htimer32.Clock.Source = TIMER32_SOURCE_PRESCALER;
htimer32.Clock.Prescaler = 0; // Prescaler = 1
htimer32.InterruptMask = 0;
htimer32.CountMode = TIMER32_COUNTMODE_FORWARD;
HAL_Timer32_Init(&htimer32);
// gpio init as timer channel pin
HAL_GPIO_PinConfig(digitalPinToPort(PinNumber), digitalPinToBitMask(PinNumber),
HAL_GPIO_MODE_TIMER_SERIAL, HAL_GPIO_PULL_NONE, HAL_GPIO_DS_2MA);
htimer32_channel.TimerInstance = htimer32.Instance;
htimer32_channel.ChannelIndex = pwmPinToTimerChannel(PinNumber);
htimer32_channel.PWM_Invert = TIMER32_CHANNEL_NON_INVERTED_PWM;
htimer32_channel.Mode = TIMER32_CHANNEL_MODE_PWM;
htimer32_channel.CaptureEdge = TIMER32_CHANNEL_CAPTUREEDGE_RISING;
htimer32_channel.OCR = OCRval;
htimer32_channel.Noise = TIMER32_CHANNEL_FILTER_OFF;
HAL_Timer32_Channel_Init(&htimer32_channel);
// start timer with initialized channel
HAL_Timer32_Channel_Enable(&htimer32_channel);
HAL_Timer32_Value_Clear(&htimer32);
HAL_Timer32_Start(&htimer32);
pwmIsInited++; // increase inited channels qty
}
else // pin doesn't have pwm
ErrorMsgHandler("analogWrite(): invalid pwm pin number");
}
else if (digitalPinPwmIsOn(PinNumber) == 0) // pin has pwm and pwm is off
{
// init pin as pwm
uint32_t OCRval = (uint32_t) (((uint64_t)pwmTopVal * writeVal) / WriteValMax);
// initialization of the required timer
htimer32.Instance = pwmPinToTimer(PinNumber);
htimer32.Top = pwmTopVal;
htimer32.State = TIMER32_STATE_DISABLE;
htimer32.Clock.Source = TIMER32_SOURCE_PRESCALER;
htimer32.Clock.Prescaler = 0; // Prescaler = 1
htimer32.InterruptMask = 0;
htimer32.CountMode = TIMER32_COUNTMODE_FORWARD;
HAL_Timer32_Init(&htimer32);
// gpio init as timer channel pin
HAL_GPIO_PinConfig(digitalPinToPort(PinNumber), digitalPinToBitMask(PinNumber),
HAL_GPIO_MODE_TIMER_SERIAL, HAL_GPIO_PULL_NONE, HAL_GPIO_DS_2MA);
htimer32_channel.TimerInstance = htimer32.Instance;
htimer32_channel.ChannelIndex = pwmPinToTimerChannel(PinNumber);
htimer32_channel.PWM_Invert = TIMER32_CHANNEL_NON_INVERTED_PWM;
htimer32_channel.Mode = TIMER32_CHANNEL_MODE_PWM;
htimer32_channel.CaptureEdge = TIMER32_CHANNEL_CAPTUREEDGE_RISING;
htimer32_channel.OCR = OCRval;
htimer32_channel.Noise = TIMER32_CHANNEL_FILTER_OFF;
HAL_Timer32_Channel_Init(&htimer32_channel);
// start timer with initialized channel
HAL_Timer32_Channel_Enable(&htimer32_channel);
HAL_Timer32_Value_Clear(&htimer32);
HAL_Timer32_Start(&htimer32);
pwmIsInited++; // increase inited channels qty
}
else // pin doesn't have pwm
ErrorMsgHandler("analogWrite(): invalid pwm pin number");
}
// Set the resolution of analogWrite parameters
+8 -6
View File
@@ -23,12 +23,14 @@
#include <stdint.h>
#include "wiring_private.h"
#define HIGH 0x1
#define LOW 0x0
#define INPUT 0x0
#define OUTPUT 0x1
#define INPUT_PULLUP 0x2
#define NC 0xFFFFFFFF // Not connected
#define HIGH 0x1
#define LOW 0x0
#define INPUT 0x0
#define OUTPUT 0x1
#define INPUT_PULLUP 0x2
#define INPUT_PULLDOWN 0x3
#define NC 0xFFFFFFFF // Not connected
#define PI 3.1415926535897932384626433832795
#define HALF_PI 1.5707963267948966192313216916398
+28 -11
View File
@@ -37,7 +37,7 @@ void pinMode(uint32_t PinNumber, uint32_t PinMode)
return;
}
if (digitalPinPwmIsOn(PinNumber))
if (digitalPinPwmIsOn(PinNumber) > 0 )
// if the pin use PWM, disable PWM
analogWriteStop(PinNumber);
@@ -56,6 +56,10 @@ void pinMode(uint32_t PinNumber, uint32_t PinMode)
GPIO_InitStruct.Mode = HAL_GPIO_MODE_GPIO_INPUT;
GPIO_InitStruct.Pull = HAL_GPIO_PULL_UP;
break;
case INPUT_PULLDOWN:
GPIO_InitStruct.Mode = HAL_GPIO_MODE_GPIO_INPUT;
GPIO_InitStruct.Pull = HAL_GPIO_PULL_DOWN;
break;
case OUTPUT:
GPIO_InitStruct.Mode = HAL_GPIO_MODE_GPIO_OUTPUT;
GPIO_InitStruct.Pull = HAL_GPIO_PULL_NONE;
@@ -102,15 +106,22 @@ __attribute__((noinline, section(".ram_text"))) void digitalWrite(uint32_t PinNu
ErrorMsgHandler("digitalWrite(): pin number exceeds the total number of pins");
return;
}
if (digitalPinPwmIsOn(PinNumber))
GPIO_TypeDef* port = digitalPinToPort(PinNumber);
HAL_PinsTypeDef mask = digitalPinToBitMask(PinNumber);
if (digitalPinPwmIsOn(PinNumber) > 0)
{
// if the pin use PWM, disable PWM
analogWriteStop(PinNumber);
// and configure pin as output
HAL_GPIO_PinConfig(port, mask, HAL_GPIO_MODE_GPIO_OUTPUT, HAL_GPIO_PULL_NONE, HAL_GPIO_DS_2MA);
}
if (Val == HIGH)
GPIO_SET_PIN(digitalPinToPort(PinNumber), digitalPinToBitMask(PinNumber));
GPIO_SET_PIN(port, mask);
else
GPIO_CLEAR_PIN(digitalPinToPort(PinNumber), digitalPinToBitMask(PinNumber));
GPIO_CLEAR_PIN(port, mask);
}
// read pin
@@ -122,9 +133,9 @@ __attribute__((noinline, section(".ram_text"))) int digitalRead(uint32_t PinNumb
return -1;
}
if (digitalPinPwmIsOn(PinNumber))
if (digitalPinPwmIsOn(PinNumber) > 0)
// if the pin use PWM, disable PWM
analogWriteStop(PinNumber);
analogWriteStop(PinNumber); // pin is configured as input here
return GPIO_READ_PIN(digitalPinToPort(PinNumber), digitalPinToBitMask(PinNumber));
}
@@ -138,11 +149,17 @@ __attribute__((noinline, section(".ram_text"))) void digitalToggle(uint32_t PinN
return;
}
if (digitalPinPwmIsOn(PinNumber))
GPIO_TypeDef* port = digitalPinToPort(PinNumber);
HAL_PinsTypeDef mask = digitalPinToBitMask(PinNumber);
if (digitalPinPwmIsOn(PinNumber) > 0)
{
// if the pin use PWM, disable PWM
analogWriteStop(PinNumber);
GPIO_TOGGLE_PIN(digitalPinToPort(PinNumber), digitalPinToBitMask(PinNumber));
// and configure pin as output
HAL_GPIO_PinConfig(port, mask, HAL_GPIO_MODE_GPIO_OUTPUT, HAL_GPIO_PULL_NONE, HAL_GPIO_DS_2MA);
}
GPIO_TOGGLE_PIN(port, mask);
}
#ifdef __cplusplus
+19 -4
View File
@@ -5,9 +5,10 @@
### Цифровые выводы
На плате ELBEAR ACE-UNO доступны встроенные светодиод и кнопка. Для их использования необходимо воспользоваться макросами `LED_BUILTIN` и `BTN_BUILTIN`, передавая их в качестве аргументов функции вместо номера цифрового вывода. Макросу `LED_BUILTIN` соответствует номер вывода D22, а макросу `BTN_BUILTIN` - D23.
### Аналоговые выводы
Выводы A0...A5 на плате могут использоваться как в аналоговом, так и в цифровом режиме.
Аналоговые выводы на плате могут использоваться как в аналоговом, так и в цифровом режиме.
Для использования вывода в качестве аналогового необходимо перевести соответствующий DIP-переключатель, расположенный рядом с аналоговыми выводами, в положение OFF. В этом режиме внешнее напряжение, подаваемое на вывод, будет понижаться резистивным делителем перед подачей на микроконтроллер.
Для использования вывода в качестве цифрового нужно перевести переключатель в положение ON. В этом случае напряжение с вывода платы передается на микроконтроллер без изменений.
Для использования вывода в качестве цифрового нужно перевести переключатель в положение ON. В этом случае напряжение с вывода платы передается на микроконтроллер без изменений. Вывод А5 недоступен для использования в качестве цифрового вывода.
Для аналоговых выводов режим цифрового вывода с подтяжкой к питанию(`INPUT_PULLUP`) не дает желаемого результата, так как на этих сигналах установлена неотключаемая подтяжка к земеле (10 кОм), а подтяжка к питанию внутри микроконтроллера осуществляется резистором 50 кОм. Для реализации такого режима на аналоговых выводах необходимо использовать внешний дополнительный резистор 1...2 кОм, подключенный к питанию.
Таблица соответствия выводов платы и номера DIP-переключателя представлена ниже. Переключатель 5 относится сразу к двум аналоговым выводам - А4, А5.
|Вывод|Номер переключателя|
@@ -20,7 +21,20 @@
|А5|5|
#### ШИМ
На плате ELBEAR ACE-UNO доступно 8 выводов для формирования ШИМ-сигнала: D3, D5, D6, D9...D13. Генерация сигнала осуществляется с помощью 32-битного таймера. Выводы D3, D5, D6, D9 подключены к таймеру 1, выводы D10...D13 подключены к таймеру 2. Выводы, подключенные к одному и тому же таймеру, выдают ШИМ-сигнал одинаковой частоты.
На плате ELBEAR ACE-UNO доступно 8 выводов для формирования ШИМ-сигнала. Генерация сигнала осуществляется с помощью 32-битного таймера. Выводы, подключенные к одному и тому же таймеру, выдают ШИМ-сигнал одинаковой частоты.
Доступные выводы:
|Цифровой вывод|Используемый таймер|
|---------|---------|
|D3|таймер 1|
|D5|таймер 1|
|D6|таймер 1|
|D9|таймер 1|
|D10|таймер 2|
|D11|таймер 2|
|D12|таймер 2|
|D13|таймер 2|
Цифровые выводы D9, D10 не могут быть использованы для генерации ШИМ, если одновременно активен интерфейс SPI (при использовании экземпляра `SPI` недоступен ШИМ на выводе D10, при использовании экземпляра `SPI0` - на выводе D9). Это ограничение связано с особенностями работы микроконтроллера. Ограничение не распространяется на использование D9, D10 в качестве цифрового вывода при активном SPI.
### Прерывания
На плате ELBEAR ACE-UNO доступно 8 прерываний, настраиваемых функцией `void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode)`:
@@ -50,4 +64,5 @@
Интерфейс I2C1 доступен на выводах SDA и SCL, для работы с ним используется экземпляр класса под названием `Wire`.
## Драйверы
Для работы с платой по интерфейсу USB необходим драйвер для микросхемы CH340С, его можно скачать [здесь](https://www.wch-ic.com/downloads/CH341SER_ZIP.html).
Для работы с платой по интерфейсу USB необходим драйвер для микросхемы CH340С, его можно скачать [здесь](https://www.wch-ic.com/downloads/CH341SER_ZIP.html). Были замечены ошибки при работе драйвера версии 2024 года, поэтому рекомендуется устанавливать драйвер более старой версии (например, 2019 года).
Подготовка к работе по интерфейсу JTAG и инструкция по записи начального загрузчика есть [здесь](Instructions.md).
Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

+31 -17
View File
@@ -1,12 +1,13 @@
# Установка пакета и предварительная подготовка к работе
## Установка пакета в ArduinoIDE
1. Установите [Arduino IDE](https://www.arduino.cc/en/software).
2. Откройте меню `Файл -> Параметры`.
1. Установите [Arduino IDE](https://www.arduino.cc/en/software).
2. Откройте меню `Файл -> Параметры`.
3. Вставьте данную ссылку в поле "Дополнительные ссылки для Менеджера плат":
`https://elron.tech/files/package_elbear_beta_index.json`
![Add_board](Add_board.PNG)
4. Откройте меню `Инструменты -> Плата -> Менеджер плат...`.
![Add_board](Add_board.PNG)
4. Откройте меню `Инструменты -> Плата -> Менеджер плат...`.
5. В поиске найдите пакет `MIK32 Boards (Arduino BSP by Elron)`, выберите нужную версию пакета и нажмите кнопку `Установить`.
![Install_board](Install_board_.PNG)
![Install_board](Install_board_.PNG)
6. Процесс установки может занять некоторое время. Результаты установки отобразятся в поле `Вывод`, а так же во всплывающих уведомлениях.
![Installation_process](Installation_process_.PNG)
@@ -15,29 +16,42 @@
Платы ELBEAR ACE-UNO ревизии 1.1.0, ELBEAR ACE-NANO, ELSOMIK готовы к использованию в ArduinoIDE из коробки, так как поставляются с предварительно записанным начальным загрузчиком.
Для записи начального загрузчика:
Для записи начального загрузчика:
1. Подключите плату к ПК по интерфейсу JTAG.
Для подключения плат ELBEAR, ELSOMIK потребуется программатор [ELJTAG](https://elron.tech/eljtag-programmator-risc-v-mcu/).
Для подключения платы START-MIK32 необходимо перевести переключатель режима программатора в положение JTAG и подключить плату к ПК через USB разъем.
2. В ArduinoIDE выберите программатор: `Инструменты -> Программатор -> mik32 uploader`.
Для подключения платы START-MIK32 необходимо на плате перевести переключатель режима программатора (COM/JTAG) в положение JTAG и подключить плату к ПК через USB разъем.
2. В ArduinoIDE выберите программатор: `Инструменты -> Программатор -> mik32 uploader`.
![programmer](programmer.png)
3. Для записи начального загрузчика выберите `Инструменты -> Записать Загрузчик`.
![Bootloader](Bootloader_.png)
4. При возникновении проблем с загрузкой ознакомьтесь с разделом `Настройка программатора` в [инструкции](https://elron.tech/wp-content/uploads/2024/05/instrukcija-po-pervomu-zapusku.pdf) по первому запуску платы ELBEAR ACE-UNO или с [документацией](https://wiki.mik32.ru/%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D0%BE%D1%87%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BB%D0%B0%D1%82%D0%B0_%D0%A1%D1%82%D0%B0%D1%80%D1%82) по запуску платы START-MIK32.
![Bootloader](Bootloader_.png)
4. При возникновении проблем с загрузкой ознакомьтесь с разделом `Настройка программатора` в [инструкции](https://elron.tech/wp-content/uploads/2025/07/instrukcija_po_pervomu_zapusku_140725.pdf) по первому запуску платы ELBEAR ACE-UNO или с [документацией](https://docs.mikron.ru/wiki/boards/start.html) по запуску платы START-MIK32 (ссылки на документацию по плате START-MIK32 актуальны на июль 2025 года, если они не действительны, возможно найти актуальную информацию на сайте производителя - https://mikron.ru/).
Теперь можно загружать скетчи в плату по USB.
## Начало работы
1. Подключите плату к ПК по USB.
1. Подключите плату к ПК по USB.
2. Откройте ArduinoIDE и загрузите необходимый скетч. Для начала работы можно воспользоваться готовыми примерами, например - `Файл -> Примеры -> 01.Basics -> Blink`.
![Blink_example](Blink_example.png)
![Blink_example](Blink_example.png)
3. Выберите активную плату - `Инструменты -> Плата`.
![Set_board](Set_board_.png)
![Set_board](Set_board_.png)
4. Выберите используемый COM порт - `Инструменты -> Порт`.
![Set_port](Set_port_.png)
Выбранные плата и порт в ArduinoIDE должны отображаться следующим образом:
![Selected_board_port](Selected_board_port_.png)
![Selected_board_port](Selected_board_port_.png)
5. Проверьте скетч, нажав соответствующую кнопку.
![Build_project](Build_project_.png)
![Build_project](Build_project_.png)
6. Загрузите полученную прошивку на плату.
![Flash_project](Flash_project_.png)
![Flash_project](Flash_project_.png)
7. При необходимости можно открыть терминал и получать сообщения от платы по интерфейсу Serial. Для этого добавьте в скетч работу с интерфейсом и после загрузки прошивки выберите `Инструменты -> Монитор порта`.
![Monitor](Monitor_.png)
![Monitor](Monitor_.png)
## Загрузка скетчей через программатор
ArduinoIDE позволяет так же загружать скетчи через программатор. Для этого:
1. Подключите плату к ПК по интерфейсу JTAG.
Для подключения плат ELBEAR, ELSOMIK потребуется программатор [ELJTAG](https://elron.tech/eljtag-programmator-risc-v-mcu/).
Для подключения платы START-MIK32 необходимо на плате перевести переключатель режима программатора (COM/JTAG) в положение JTAG и подключить плату к ПК через USB разъем.
2. Откройте ArduinoIDE и загрузите необходимый скетч. Для начала работы можно воспользоваться готовыми примерами, например - `Файл -> Примеры -> 01.Basics -> Blink`.
3. Выберите активную плату - `Инструменты -> Плата`.
4. Выберите программатор - `Инструменты -> Программатор -> mik32 uploader`.
5. Проверьте скетч, нажав соответствующую кнопку.
6. Для загрузки скетча через программатор выберите - `Скетч -> Загрузить на плату при помощи программатора`.
![Flash_project_jtag](Flash_project_jtag.png)
+4 -1
View File
@@ -4,7 +4,10 @@
![Start_V1_pinout.png](Start_V1_pinout.png)
### Загрузка скетчей
Для загрузки скетчей в ArduinoIDE необходимо передвинуть переключатель режима программатора на плате в положение `COM`. Так же необходимо установить две перемычки на разъем 5 - первой перемычкой замкнуть выводы `COM_RX` и `MCU_TX`, а второй - выводы `COM_TX` и `MCU_RX`.
Для загрузки скетчей в ArduinoIDE необходимо передвинуть переключатель режима программатора на плате в положение `COM`. Так же необходимо установить две перемычки на разъем 5 - первой перемычкой замкнуть выводы `COM_RX` и `MCU_TX`, а второй - выводы `COM_TX` и `MCU_RX`.
Для работы с платой по интерфейсу USB не требуется установка дополнительных драйверов.
Подготовка к работе по интерфейсу JTAG и инструкция по записи начального загрузчика есть [здесь](Instructions.md).
### Цифровые выводы
Выводы на плате START-MIK32 пронумерованы в соответствии с их принадлежностью к определенному GPIO-порту и конкретному пину внутри порта. Чтобы использовать цифровой вывод, необходимо передать в функцию номер порта и номер пина в формате `P0_1`, где "0" — это номер порта, а "1" — номер пина внутри порта. Например, для инициализации вывода 5 порта 2 на выход необходимо вызвать функцию `pinMode(P2_5, OUTPUT)`.
Для использования доступны следующие выводы: `P0_0 ... P0_15, P1_0 ... P1_15, P2_0 ... P2_7`.
Binary file not shown.

After

Width:  |  Height:  |  Size: 326 KiB

+14 -14
View File
@@ -8,7 +8,7 @@
# Предварительная подготовка
Для отладки в Arduino IDE используется плагин Cortex-Debug. По умолчанию в IDE установлена версия 1.5.1, но с указанной версией режим отладки для плат из состава пакета работает некорректно. Для корректной работы необходимо использовать более новую версию плагина.
Для подготовки к работе в режиме отладки необходимо сделать следующее:
* Установить драйвера для работы с программатором, если ранее они не были установлены. Подробности можно найти в [инструкции](https://elron.tech/wp-content/uploads/2024/05/instrukcija-po-pervomu-zapusku.pdf) по первому запуску платы ELBEAR ACE-UNO или в [документации](https://wiki.mik32.ru/%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D0%BE%D1%87%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BB%D0%B0%D1%82%D0%B0_%D0%A1%D1%82%D0%B0%D1%80%D1%82) по запуску платы START-MIK32.
* Установить драйвера для работы с программатором, если ранее они не были установлены. Подробности можно найти в [инструкции](https://elron.tech/wp-content/uploads/2025/07/instrukcija_po_pervomu_zapusku_140725.pdf) по первому запуску платы ELBEAR ACE-UNO или в [документации](https://docs.mikron.ru/wiki/boards/start.html) по запуску платы START-MIK32.
* Скачать архив, содержащий небходимую версию Cortex-Debug и все его зависимости, по [ссылке](https://elron.tech/files/mik32_arduinoIDE_debug_plagins.zip).
* Содержимое архива переместить в папку `plugins` из папки с установленной ArduinoIDE. Примерный путь - `C:\Program Files\Arduino IDE\resources\app\plugins`. Содержимое архива (несколько файлов с расширением `.vsix`) разместить в указанной папке, не создавая промежуточных папок.
* Запустить ArduinoIDE и по инструкции, описанной ниже, запустить режим отладки.
@@ -19,25 +19,25 @@
После установки новой версии плагина в строке меню и в области вывода информации появятся две новые вкладки - `MEMORY` и `xRTOS`. Это плагины, которые необходимы для работы Cortex-Debug. Они не используются непосредственно пользователем при работе, но удалять их нельзя, иначе режим отладки с установленной версией Cortex-Debug не запустится.
# Запуск отладки
Последовательность действий для запуска режима отладки:
1. В ArduinoIDE открыть скетч, который необходимо запустить в режиме отладки.
2. Выбрать нужную плату - `Инструменты -> Плата`.
3. Подключить плату к ПК через программатор. Для плат ELBEAR ACE-UNO, ELBEAR ACE-NANO, ELSOMIK использовать ELJTAG. На плате START-MIK32 передвинуть переключатель режима программатора в положение `JTAG`.
4. В ArduinoIDE выбрать используемый программатор - `Инструменты -> Программатор -> mik32 uploader`.
5. Активировать оптимизацию для отладки при сборке скетча - `Скетч -> Оптимизировать для отладки`. Если отладку запустить без указанной оптимизации, при пошаговом прохождении скетча могут возникнуть проблемы, например, с "перепрыгиванием" лишних строк кода, или значения некоторых переменных могут отображаться некорректно.
6. Скомпилировать скетч - `Скетч -> Проверить/Скомпилировать`.
Последовательность действий для запуска режима отладки:
1. В ArduinoIDE открыть скетч, который необходимо запустить в режиме отладки.
2. Выбрать нужную плату - `Инструменты -> Плата`.
3. Подключить плату к ПК через программатор. Для плат ELBEAR ACE-UNO, ELBEAR ACE-NANO, ELSOMIK использовать ELJTAG. На плате START-MIK32 передвинуть переключатель режима программатора в положение `JTAG`.
4. В ArduinoIDE выбрать используемый программатор - `Инструменты -> Программатор -> mik32 uploader`.
5. Активировать оптимизацию для отладки при сборке скетча - `Скетч -> Оптимизировать для отладки`. Если отладку запустить без указанной оптимизации, при пошаговом прохождении скетча могут возникнуть проблемы, например, с "перепрыгиванием" лишних строк кода, или значения некоторых переменных могут отображаться некорректно.
6. Скомпилировать скетч - `Скетч -> Проверить/Скомпилировать`.
7. Загрузить скетч на плату. Загружать скетч можно как по USB (`Скетч -> Загрузить на плату`), так и через программатор (`Скетч -> Загрузить на плату при помощи программатора`).
! При запуске отладки скетч не компилируется и не загружается на плату автоматически. Поэтому при внесении изменений в код необходимо вручную повторять пункты 6,7 перед запуском отладки.
! При запуске отладки скетч не компилируется и не загружается на плату автоматически. Поэтому при внесении изменений в код необходимо вручную повторять пункты 6,7 перед запуском отладки.
8. Открыть панель отладочника в меню слева:
![Debug_panel.PNG](debug_panel.PNG)
После запуска отладки здесь будут доступны к просмотру стек вызовов функций, значения переменных, установленные точки останова, а также состояние периферийных регистров микроконтроллера.
9. Для запуска отладки необходимо нажать кнопку `Начать отладку` в верхней части экрана:
![Debug_start.PNG](debug_start.PNG)
При этом:
- Откроется новый терминал `gdb-server`, в котором запустится программа openocd. Терминал отображает статус соединения с микроконтроллером.
- Запустится режим отладки, а курсор выполнения программы остановится в начале функции `setup()`.
- Станут активными кнопки пошагового перемещения по программе.
- Во всех разделах на панели отладки обновится информация.
При этом:
- Откроется новый терминал `gdb-server`, в котором запустится программа openocd. Терминал отображает статус соединения с микроконтроллером.
- Запустится режим отладки, а курсор выполнения программы остановится в начале функции `setup()`.
- Станут активными кнопки пошагового перемещения по программе.
- Во всех разделах на панели отладки обновится информация.
10. Для просмотра отладочной информации можно запустить консоль отладки. Для этого на панели отладки нужно нажать соответствующую кнопку:
![Debug_console.PNG](debug_console.PNG)
+4 -3
View File
@@ -1,13 +1,14 @@
# ELSOMIK
Особенности работы с платой ELSOMIK в среде программирования ArduinoIDE.
### Функциональное назначение выводов платы ELSOMIK OEM
![pinout_Elsomik_OEM.png](pinout_ElsomikOEM.png)
![pinout_Elsomik_OEM.png](_pinout_ElsomikOEM.png)
### Функциональное назначение выводов платы ELSOMIK SE
![pinout_Elsomik_SE.png](pinout_ElsomikSE.png)
### Загрузка скетчей
На плате отсутствуют встроенные преобразователи, позволяющие загружать скетчи по USB через COM-порт, однако каждая плата поставляется с предварительно записанным начальным загрузчиком. Для записи скетчей через USB потребуется использование внешнего USB-UART преобразователя, подключаемого к выводам платы P0_5 (RX0) и P0_6 (TX0), которые соответствуют интерфейсу UART0.
Перед загрузкой скетча необходимо кратковременно ввести контроллер в состояние RESET. Если используется USB-UART преобразователь с выведенным сигналом DTR, необходимо соединить DTR с выводом RST на плате через керамический конденсатор емкостью от 0,47 мкФ до 2,2 мкФ. В случае отсутствия сигнала DTR, необходимо вручную соединить вывод RST платы с землей и отпустить его непосредственно перед началом записи скетча.
На плате отсутствуют встроенные преобразователи, позволяющие загружать скетчи по USB через COM-порт, однако каждая плата поставляется с предварительно записанным начальным загрузчиком. Для записи скетчей через USB потребуется использование внешнего USB-UART преобразователя, подключаемого к выводам платы P0_5 (RX0) и P0_6 (TX0), которые соответствуют интерфейсу UART0. Для корректной работы так же может потребоваться установка на ПК драйвера для микросхемы, используемой в преобразователе USB-UART.
Перед загрузкой скетча необходимо кратковременно ввести контроллер в состояние RESET. Если используется USB-UART преобразователь с выведенным сигналом DTR, необходимо соединить DTR с выводом RST на плате через керамический конденсатор емкостью от 0,47 мкФ до 2,2 мкФ. В случае отсутствия сигнала DTR, необходимо вручную соединить вывод RST платы с землей и отпустить его непосредственно перед началом записи скетча.
Для записи начального загрузчика или загрузки скетчей с помощью программатора необходимо подключить программатор (например, [ELJTAG](https://elron.tech/eljtag-programmator-risc-v-mcu/)) к выводам TDO, TDI, TCK, TMS, TRST, GND, 3V3, RST. Инструкцию по использованию программатора в Arduino IDE можно найти [здесь](Instructions.md).
### Цифровые выводы
Выводы на плате ELSOMIK пронумерованы в соответствии с их принадлежностью к определенному GPIO-порту и конкретному пину внутри порта. Чтобы использовать цифровой вывод, необходимо передать в функцию номер порта и номер пина в формате `P0_1`, где "0" — это номер порта, а "1" — номер пина внутри порта. Например, для инициализации вывода 5 порта 1 на выход необходимо вызвать функцию `pinMode(P1_5, OUTPUT)`.
Для использования доступны следующие выводы: `P0_0 ... P0_15, P1_0 ... P1_15, P2_6, P2_7`. Выводы `P0_11 ... P0_15` на плате обозначены иначе, ниже представлена таблица соответствия:
+20 -5
View File
@@ -5,10 +5,11 @@
### Цифровые выводы
На плате ELBEAR ACE-NANO доступен встроенный светодиод. Для его использования необходимо воспользоваться макросом `LED_BUILTIN`, передавая его в качестве аргумента функции вместо номера цифрового вывода. Макросу соответствует номер вывода D22.
### Аналоговые выводы
Выводы A0...A7 на плате могут использоваться как в аналоговом, так и в цифровом режиме.
Аналоговые выводы на плате могут использоваться как в аналоговом, так и в цифровом режиме.
Для использования вывода в качестве аналогового необходимо перевести соответствующий DIP-переключатель, расположенный рядом с аналоговыми выводами, в положение OFF. В этом режиме внешнее напряжение, подаваемое на вывод, будет понижаться резистивным делителем перед подачей на микроконтроллер.
Для использования вывода в качестве цифрового нужно перевести переключатель в положение ON. В этом случае напряжение с вывода платы передается на микроконтроллер без изменений.
Выводы А4...А7 используют один и тот же канал АЦП, поэтому не могут использоваться одновременно.
Для использования вывода в качестве цифрового нужно перевести переключатель в положение ON. В этом случае напряжение с вывода платы передается на микроконтроллер без изменений. Выводы А5, А6, А7 недоступны для использования в качестве цифровых выводов.
Выводы А4...А7 используют один и тот же канал АЦП, поэтому не могут использоваться одновременно.
Для аналоговых выводов режим цифрового вывода с подтяжкой к питанию(`INPUT_PULLUP`) не дает желаемого результата, так как на этих сигналах установлена неотключаемая подтяжка к земеле (10 кОм), а подтяжка к питанию внутри микроконтроллера осуществляется резистором 50 кОм. Для реализации такого режима на аналоговых выводах необходимо использовать внешний дополнительный резистор 1...2 кОм, подключенный к питанию.
Таблица соответствия выводов платы и номера DIP-переключателя представлена ниже. Переключатель 5 относится сразу к четырем аналоговым выводам - А4...А7.
|Вывод|Номер переключателя|
@@ -23,7 +24,20 @@
|А7|5|
#### ШИМ
На плате ELBEAR ACE-NANO доступно 8 выводов для формирования ШИМ-сигнала: D3, D5, D6, D9...D13. Генерация сигнала осуществляется с помощью 32-битного таймера. Выводы D3, D5, D6, D9 подключены к таймеру 1, выводы D10...D13 подключены к таймеру 2. Выводы, подключенные к одному и тому же таймеру, выдают ШИМ-сигнал одинаковой частоты.
На плате ELBEAR ACE-NANO доступно 8 выводов для формирования ШИМ-сигнала. Генерация сигнала осуществляется с помощью 32-битного таймера. Выводы, подключенные к одному и тому же таймеру, выдают ШИМ-сигнал одинаковой частоты.
Доступные выводы:
|Цифровой вывод|Используемый таймер|
|---------|---------|
|D3|таймер 1|
|D5|таймер 1|
|D6|таймер 1|
|D9|таймер 1|
|D10|таймер 2|
|D11|таймер 2|
|D12|таймер 2|
|D13|таймер 2|
Цифровые выводы D9, D10 не могут быть использованы для генерации ШИМ, если одновременно активен интерфейс SPI (при использовании экземпляра `SPI` недоступен ШИМ на выводе D10, при использовании экземпляра `SPI0` - на выводе D9). Это ограничение связано с особенностями работы микроконтроллера. Ограничение не распространяется на использование D9, D10 в качестве цифрового вывода при активном SPI.
### Прерывания
На плате ELBEAR ACE-NANO доступно 8 прерываний, настраиваемых функцией `void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode)`:
@@ -53,4 +67,5 @@
Интерфейс I2C1 доступен на выводах A4 и A5, для работы с ним используется экземпляр класса под названием `Wire`.
## Драйверы
Для работы с платой по интерфейсу USB необходим драйвер для микросхемы CH343P, его можно скачать [здесь](https://www.wch-ic.com/downloads/CH343SER_ZIP.html).
Для работы с платой по интерфейсу USB необходим драйвер для микросхемы CH343P, его можно скачать [здесь](https://www.wch-ic.com/downloads/CH343SER_ZIP.html).
Подготовка к работе по интерфейсу JTAG и инструкция по записи начального загрузчика есть [здесь](Instructions.md).
Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

+4
View File
@@ -1,6 +1,10 @@
## Модули, работающие без аппаратной модификации
|Модуль|Описание|Протестировано на|Ссылки на модуль|Материалы|
|---------|---------|------|---------|------|
|Датчик температуры DS18B20|Цифровой датчик|ELBEAR ACE-UNO,ELBEAR ACE-NANO, START-MIK32-V1|[Ozon](https://ozon.ru/t/dhmEm2y), [AliExpress](https://sl.aliexpress.ru/p?key=SMB63oS)|[Telegram](https://t.me/hutor_yanin/2612), [Gitflic](https://gitflic.ru/project/elron-tech/elbear_arduino_bsp/file?file=libraries%2FOneWire%2Fexamples%2FDS18x20_Temperature)|
|CAN-модуль MCP2515|CAN контроллер с SPI интерфейсом, модуль на базе MCP2515|ELBEAR ACE-UNO,ELBEAR ACE-NANO|[Ozon](https://ozon.ru/t/dhmEemf), [AliExpress](https://sl.aliexpress.ru/p?key=yeGH3aC)|[Telegram](https://t.me/hutor_yanin/2588), [Gitflic](https://gitflic.ru/project/ogneyar/arduino/file?file=ElbearAceUno%2FSPI_MCP2515_CAN)|
|Модуль лазерного дальномера VL53L0X|Подключение по I2C|ELBEAR ACE-UNO,ELBEAR ACE-NANO, START-MIK32-V1|[Ozon](https://ozon.ru/t/CKX9Vtg), [AliExpress](https://sl.aliexpress.ru/p?key=3yE73Ax)|[Telegram](https://t.me/hutor_yanin/2560), [Gitflic](https://gitflic.ru/project/ogneyar/arduino/file?file=ElbearAceUno%2FI2C_VL53L0X_test)|
|Модуль датчика температуры, давления BMP280|Цифровой датчик|ELBEAR ACE-UNO,ELBEAR ACE-NANO, START-MIK32-V1|[Ozon](https://ozon.ru/t/Q1zc8bJ), [AliExpress](https://sl.aliexpress.ru/p?key=N5WW3jN)|[Telegram](https://t.me/hutor_yanin/2536), [Gitflic](https://gitflic.ru/project/ogneyar/arduino/file?file=ElbearAceUno%2FI2C_BMP280_terminal)|
|Инфракрасный датчик движения (PIR)|Цифровой датчик. Протестированны разновидности: AM312, SR501, SR602 и SR505|ELBEAR ACE-NANO|[Ozon](https://ozon.ru/t/97BptDy), [AliExpress](https://sl.aliexpress.ru/p?key=oxyG3lk)|[Telegram](https://t.me/hutor_yanin/2417), [Gitflic](https://gitflic.ru/project/ogneyar/arduino/file?file=ElbearAceUno%2FReedSwitch_test)|
|Цифро-аналоговый преобразователь MCP4725 12 бит|Модуль MCP4725 представляет собой прецизионный 12-битный цифро-аналоговый преобразователь (ЦАП), подключение по I2C|ELBEAR ACE-UNO, START-MIK32-V1|[Ozon](https://ozon.ru/t/CK7qTXd), [AliExpress](https://sl.aliexpress.ru/p?key=ZW6s3Te)|[Telegram](https://t.me/hutor_yanin/1456), [Gitflic](https://gitflic.ru/project/ogneyar/arduino/file?file=ElbearAceUno%2FI2C_MCP4725_DAC_test)|
|Датчик температуры и влажности AHT10|Цифровой датчик, подключение по I2C|ELBEAR ACE-UNO, START-MIK32-V1|[Ozon](https://ozon.ru/t/amuSvQx), [AliExpress](https://sl.aliexpress.ru/p?key=TuCs33F)|[Telegram](https://t.me/hutor_yanin/1519?single), [Gitflic](https://gitflic.ru/project/ogneyar/arduino/file?file=ElbearAceUno%2FI2C_AHT10_terminal)|
+1 -2
View File
@@ -134,6 +134,5 @@ This is useful for STL objects, custom iteration and C++11 style ranged for loop
#### **`EEPROM.end()`**
This function returns an `EEPtr` pointing at the location after the last EEPROM cell.
Used with `begin()` to provide custom iteration.
**Note:** The `EEPtr` returned is invalid as it is out of range. In fact the hardware causes wrapping of the address (overflow) and `EEPROM.end()` actually references the first EEPROM cell.
**Note:** The `EEPtr` returned is invalid as it is out of range and must not be dereferenced.
+13 -12
View File
@@ -20,13 +20,13 @@ uint8_t read_byte( int idx )
// check if idx is valid
if (idx < 0)
{
idx = -idx;
ErrorMsgHandler("EEPROM.read(): The eeprom cell address must be non-negative");
return 0xFF;
}
if ((uint32_t)idx >= (uint32_t)EEPROM_LENGHT)
if ((uint32_t)idx >= (uint32_t)EEPROM_LENGTH)
{
idx = (int)((uint32_t)idx % EEPROM_LENGHT);
ErrorMsgHandler("EEPROM.read(): The address of the eeprom cell goes beyond the eeprom");
return 0xFF;
}
uint32_t read_data_buf[EEPROM_PAGE_WORDS] = {};
@@ -50,13 +50,13 @@ void write_byte( int idx, uint8_t val )
// check if idx is valid
if (idx < 0)
{
idx = -idx;
ErrorMsgHandler("EEPROM.write(): The eeprom cell address must be non-negative");
return;
}
if ((uint32_t)idx >= (uint32_t)EEPROM_LENGHT)
if ((uint32_t)idx >= (uint32_t)EEPROM_LENGTH)
{
idx = (int)((uint32_t)idx % EEPROM_LENGHT);
ErrorMsgHandler("EEPROM.write(): The address of the eeprom cell goes beyond the eeprom");
return;
}
update_byte(idx, val);
}
@@ -66,13 +66,13 @@ void update_byte( int idx, uint8_t val )
// check if idx is valid
if (idx < 0)
{
idx = -idx;
ErrorMsgHandler("EEPROM.update(): The eeprom cell address must be non-negative");
return;
}
if ((uint32_t)idx >= (uint32_t)EEPROM_LENGHT)
if ((uint32_t)idx >= (uint32_t)EEPROM_LENGTH)
{
idx = (int)((uint32_t)idx % EEPROM_LENGHT);
ErrorMsgHandler("EEPROM.update(): The address of the eeprom cell goes beyond the eeprom");
return;
}
uint32_t write_data_buf[EEPROM_PAGE_WORDS] = {};
@@ -88,15 +88,16 @@ void update_byte( int idx, uint8_t val )
// byte number in a word
uint32_t byte_idx = ((uint32_t)idx) % EEPROM_WORD_SIZE;
// get desired byte
uint32_t byte = ((uint32_t)val) << ((EEPROM_WORD_SIZE - byte_idx - 1) * 8);
uint8_t oldVal = (uint8_t)(*((uint8_t*)write_data_buf + word_idx * EEPROM_WORD_SIZE + (EEPROM_WORD_SIZE - byte_idx - 1)));
uint32_t shift = (EEPROM_WORD_SIZE - byte_idx - 1) * 8;
uint32_t byte = ((uint32_t)val) << shift;
uint8_t oldVal = (uint8_t)((write_data_buf[word_idx] >> shift) & 0xFF);
// checking if written byte is different from the new one
if(oldVal != val)
{
// clear page
HAL_EEPROM_Erase(&heeprom, (uint16_t)addr, EEPROM_PAGE_WORDS, HAL_EEPROM_WRITE_SINGLE, EEPROM_OP_TIMEOUT);
// get and replace the desired byte
write_data_buf[word_idx] = (write_data_buf[word_idx] & (~((uint32_t)(0xFF) << ((EEPROM_WORD_SIZE - byte_idx - 1) * 8)))) | byte;
write_data_buf[word_idx] = (write_data_buf[word_idx] & (~((uint32_t)(0xFF) << shift))) | byte;
HAL_EEPROM_Write(&heeprom, (uint16_t)addr, write_data_buf, EEPROM_PAGE_WORDS, HAL_EEPROM_WRITE_SINGLE, EEPROM_OP_TIMEOUT);
}
+60 -35
View File
@@ -12,7 +12,7 @@
#define EEPROM_WORD_SIZE 4 // word takes 4 bytes
#define EEPROM_PAGE_SIZE ( EEPROM_PAGE_WORDS * EEPROM_WORD_SIZE ) // page takes 32*4 = 128 bytes
#define EEPROM_END 0x1FFF
#define EEPROM_LENGHT (EEPROM_PAGE_SIZE * EEPROM_PAGE_COUNT)
#define EEPROM_LENGTH (EEPROM_PAGE_SIZE * EEPROM_PAGE_COUNT)
void HAL_read(uint16_t addr, uint32_t * data);
void HAL_write(uint16_t addr, uint32_t * data);
@@ -81,6 +81,14 @@ struct EEPtr{
int index;
};
static inline uint32_t eeprom_reverse_word(uint32_t word)
{
return ((word & 0x000000FFUL) << 24) |
((word & 0x0000FF00UL) << 8) |
((word & 0x00FF0000UL) >> 8) |
((word & 0xFF000000UL) >> 24);
}
struct EEPROMClass{
//Basic user access methods.
@@ -91,7 +99,7 @@ struct EEPROMClass{
void begin();
EEPtr end() { return length(); } // Standards requires this to be the item after the last valid entry. The returned pointer is invalid.
uint16_t length() { return (uint16_t)EEPROM_LENGHT; }
uint16_t length() { return (uint16_t)EEPROM_LENGTH; }
template< typename T >
const T &put(int idx, const T &data)
@@ -100,20 +108,26 @@ struct EEPROMClass{
// check if idx is valid
if (idx < 0)
{
idx = -idx;
ErrorMsgHandler("EEPROM.put(): The eeprom cell address must be non-negative");
return data;
}
if ((uint32_t)idx >= (uint32_t)EEPROM_LENGHT)
if ((uint32_t)idx >= (uint32_t)EEPROM_LENGTH)
{
idx = (int)((uint32_t)idx % EEPROM_LENGHT);
ErrorMsgHandler("EEPROM.put(): The address of the eeprom cell goes beyond the eeprom");
return data;
}
if (sizeof(data) > ((uint32_t)EEPROM_LENGTH - (uint32_t)idx))
{
ErrorMsgHandler("EEPROM.put(): The data goes beyond the eeprom");
return data;
}
uint32_t write_data_buf[EEPROM_PAGE_WORDS] = {};
uint32_t old_data_buf[EEPROM_PAGE_WORDS];
uint32_t dataSize = sizeof(data); // writing data size
uint32_t dataShift = 0; // shift of the data writing start address
uint32_t writeSize = dataSize;
// calc start address of the desired page
uint32_t addr = EEPROM_START_ADDR + (((uint32_t)idx) / EEPROM_PAGE_SIZE) * EEPROM_PAGE_SIZE;
// address of the searched word in eeprom: EEPROM_START_ADDR + (uint32_t)idx
@@ -126,45 +140,56 @@ struct EEPROMClass{
uint32_t byte_idx = ((uint32_t)idx) % EEPROM_WORD_SIZE;
// read first page
HAL_read((uint16_t)addr, write_data_buf);
memcpy(old_data_buf, write_data_buf, sizeof(write_data_buf));
// if data does not fit on the first page, then write down only what fits
if (EEPROM_PAGE_SIZE - byte_addr < dataSize)
writeSize = EEPROM_PAGE_SIZE - byte_addr;
uint32_t lastWord = (writeSize + byte_idx - 1) / EEPROM_WORD_SIZE + word_idx;
dataSize -= writeSize;
// Convert affected words to byte order suitable for memcpy()
for(uint8_t i = word_idx; i <= lastWord; i++)
{
write_data_buf[i] = eeprom_reverse_word(write_data_buf[i]);
}
// write data page by page, first separately write the first page
memcpy((void *)((uint8_t *)write_data_buf + byte_addr), (void*)dataPointer, writeSize);
// prepare words for writing
for(uint8_t i = word_idx; i <= lastWord; i++)
{
uint32_t word = write_data_buf[i];
write_data_buf[i] = 0;
write_data_buf[i] = ((word & 0xFF)<<24) | ((word & (0xFF<<8))<<8) | ((word & (0xFF<<16))>>8) | ((word & (0xFF<<24))>>24);
write_data_buf[i] = eeprom_reverse_word(write_data_buf[i]);
}
if (memcmp(old_data_buf, write_data_buf, sizeof(write_data_buf)) != 0)
{
HAL_erase((uint16_t)addr);
HAL_write((uint16_t)addr, write_data_buf);
}
HAL_erase((uint16_t)addr);
HAL_write((uint16_t)addr, write_data_buf);
// if there is data left after writing the first page, then write it page by page until it runs out
while (dataSize > 0)
{
addr += EEPROM_PAGE_SIZE;
// if reaching the eeprom end address, return to the initial address
if (addr == EEPROM_START_ADDR + EEPROM_LENGHT)
addr = EEPROM_START_ADDR;
HAL_read((uint16_t)addr, write_data_buf);
memcpy(old_data_buf, write_data_buf, sizeof(write_data_buf));
dataShift += writeSize;
writeSize = dataSize;
if (EEPROM_PAGE_SIZE < dataSize)
writeSize = EEPROM_PAGE_SIZE;
lastWord = (writeSize - 1) / EEPROM_WORD_SIZE;
// Convert affected words to byte order suitable for memcpy()
for(uint8_t i = 0; i <= lastWord; i++)
{
write_data_buf[i] = eeprom_reverse_word(write_data_buf[i]);
}
memcpy((void *)(write_data_buf), (void*)((uint8_t *)dataPointer + dataShift), writeSize);
// prepare words for writing
for(uint8_t i = 0; i <= lastWord; i++)
{
uint32_t word = write_data_buf[i];
write_data_buf[i] = 0;
write_data_buf[i] = ((word & 0xFF)<<24) | ((word & (0xFF<<8))<<8) | ((word & (0xFF<<16))>>8) | ((word & (0xFF<<24))>>24);
write_data_buf[i] = eeprom_reverse_word(write_data_buf[i]);
}
if (memcmp(old_data_buf, write_data_buf, sizeof(write_data_buf)) != 0)
{
HAL_erase((uint16_t)addr);
HAL_write((uint16_t)addr, write_data_buf);
}
HAL_erase((uint16_t)addr);
HAL_write((uint16_t)addr, write_data_buf);
dataSize -= writeSize;
}
return data;
@@ -177,13 +202,18 @@ struct EEPROMClass{
// check if idx is valid
if (idx < 0)
{
idx = -idx;
ErrorMsgHandler("EEPROM.get(): The eeprom cell address must be non-negative");
return data;
}
if ((uint32_t)idx >= (uint32_t)EEPROM_LENGHT)
if ((uint32_t)idx >= (uint32_t)EEPROM_LENGTH)
{
idx = (int)((uint32_t)idx % EEPROM_LENGHT);
ErrorMsgHandler("EEPROM.get(): The address of the eeprom cell goes beyond the eeprom");
return data;
}
if (sizeof(data) > ((uint32_t)EEPROM_LENGTH - (uint32_t)idx))
{
ErrorMsgHandler("EEPROM.get(): The data goes beyond the eeprom");
return data;
}
uint32_t read_data_buf[EEPROM_PAGE_WORDS] = {};
@@ -210,9 +240,7 @@ struct EEPROMClass{
// prepare words
for(uint8_t i = word_idx; i <= lastWord; i++)
{
uint32_t word = read_data_buf[i];
read_data_buf[i] = 0;
read_data_buf[i] = ((word & 0xFF)<<24) | ((word & (0xFF<<8))<<8) | ((word & (0xFF<<16))>>8) | ((word & (0xFF<<24))>>24);
read_data_buf[i] = eeprom_reverse_word(read_data_buf[i]);
}
// read data page by page, first separately read the first page
memcpy((void *)dataPointer, (void*)((uint8_t *)read_data_buf + byte_addr), readSize);
@@ -221,21 +249,16 @@ struct EEPROMClass{
while (dataSize > 0)
{
addr += EEPROM_PAGE_SIZE;
// if reaching the eeprom end address, return to the initial address
if (addr == EEPROM_START_ADDR + EEPROM_LENGHT)
addr = EEPROM_START_ADDR;
HAL_read((uint16_t)addr, read_data_buf);
dataShift += readSize;
readSize = dataSize;
if (EEPROM_PAGE_SIZE < dataSize)
readSize = EEPROM_PAGE_SIZE;
lastWord = (dataSize - 1) / EEPROM_WORD_SIZE;
lastWord = (readSize - 1) / EEPROM_WORD_SIZE;
// prepare words
for(uint8_t i = 0; i <= lastWord; i++)
{
uint32_t word = read_data_buf[i];
read_data_buf[i] = 0;
read_data_buf[i] = ((word & 0xFF)<<24) | ((word & (0xFF<<8))<<8) | ((word & (0xFF<<16))>>8) | ((word & (0xFF<<24))>>24);
read_data_buf[i] = eeprom_reverse_word(read_data_buf[i]);
}
memcpy((void *)((uint8_t *)dataPointer + dataShift), (void*)(read_data_buf), readSize);
dataSize -= readSize;
@@ -244,7 +267,9 @@ struct EEPROMClass{
}
};
#pragma GCC diagnostic ignored "-Wunused-variable" // for GCC and Clang
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
static EEPROMClass EEPROM;
#endif
#pragma GCC diagnostic pop
#endif
@@ -11,15 +11,15 @@
*
* Typical pin layout used:
* -----------------------------------------------------------------------------------------
* MFRC522 Arduino Arduino Arduino Arduino Arduino
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* MFRC522 Elbear/ Arduino Arduino Arduino Arduino
* Reader/PCD Elsomik/Start Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* -----------------------------------------------------------------------------------------
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 53 D10 10 10
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
* RST/Reset RST 9 / P0_3 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 / P1_4 53 D10 10 10
* SPI MOSI MOSI 11 / P1_1 51 D11 ICSP-4 16
* SPI MISO MISO 12 / P1_0 50 D12 ICSP-1 14
* SPI SCK SCK 13 / P1_2 52 D13 ICSP-3 15
*
* More pin layouts for other boards can be found here: https://github.com/miguelbalboa/rfid#pin-layout
*/
@@ -27,8 +27,8 @@
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9 // Configurable, see typical pin layout above
#define SS_PIN 10 // Configurable, see typical pin layout above
#define RST_PIN 9 // P0_3 Configurable, see typical pin layout above
#define SS_PIN 10 // P1_4 Configurable, see typical pin layout above
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance
@@ -22,15 +22,15 @@
*
* Typical pin layout used:
* -----------------------------------------------------------------------------------------
* MFRC522 Arduino Arduino Arduino Arduino Arduino
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* MFRC522 Elbear/ Arduino Arduino Arduino Arduino
* Reader/PCD Elsomik/Start Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* -----------------------------------------------------------------------------------------
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 53 D10 10 10
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
* RST/Reset RST 9 / P0_3 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 / P1_4 53 D10 10 10
* SPI MOSI MOSI 11 / P1_1 51 D11 ICSP-4 16
* SPI MISO MISO 12 / P1_0 50 D12 ICSP-1 14
* SPI SCK SCK 13 / P1_2 52 D13 ICSP-3 15
*
* More pin layouts for other boards can be found here: https://github.com/miguelbalboa/rfid#pin-layout
*/
@@ -11,15 +11,15 @@
*
* Typical pin layout used:
* -----------------------------------------------------------------------------------------
* MFRC522 Arduino Arduino Arduino Arduino Arduino
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* MFRC522 Elbear/ Arduino Arduino Arduino Arduino
* Reader/PCD Elsomik/Start Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* -----------------------------------------------------------------------------------------
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 53 D10 10 10
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
* RST/Reset RST 9 / P0_3 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 / P1_4 53 D10 10 10
* SPI MOSI MOSI 11 / P1_1 51 D11 ICSP-4 16
* SPI MISO MISO 12 / P1_0 50 D12 ICSP-1 14
* SPI SCK SCK 13 / P1_2 52 D13 ICSP-3 15
*
* More pin layouts for other boards can be found here: https://github.com/miguelbalboa/rfid#pin-layout
*/
@@ -16,15 +16,15 @@
*
* Typical pin layout used:
* -----------------------------------------------------------------------------------------
* MFRC522 Arduino Arduino Arduino Arduino Arduino
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* MFRC522 Elbear/ Arduino Arduino Arduino Arduino
* Reader/PCD Elsomik/Start Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* -----------------------------------------------------------------------------------------
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 53 D10 10 10
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
* RST/Reset RST 9 / P0_3 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 / P1_4 53 D10 10 10
* SPI MOSI MOSI 11 / P1_1 51 D11 ICSP-4 16
* SPI MISO MISO 12 / P1_0 50 D12 ICSP-1 14
* SPI SCK SCK 13 / P1_2 52 D13 ICSP-3 15
*
* More pin layouts for other boards can be found here: https://github.com/miguelbalboa/rfid#pin-layout
*
@@ -13,16 +13,16 @@
*
* Typical pin layout used:
* -----------------------------------------------------------------------------------------
* MFRC522 Arduino Arduino Arduino Arduino Arduino
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* MFRC522 Elbear/ Arduino Arduino Arduino Arduino
* Reader/PCD Elsomik/Start Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* -----------------------------------------------------------------------------------------
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 53 D10 3 10
* RST/Reset RST 9 / P0_3 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 / P1_4 53 D10 10 10
* IRQ ? ? ? ? 2 10
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
* SPI MOSI MOSI 11 / P1_1 51 D11 ICSP-4 16
* SPI MISO MISO 12 / P1_0 50 D12 ICSP-1 14
* SPI SCK SCK 13 / P1_2 52 D13 ICSP-3 15
*
* More pin layouts for other boards can be found here: https://github.com/miguelbalboa/rfid#pin-layout
*
@@ -16,8 +16,8 @@
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9 //
#define SS_PIN 10 //
#define RST_PIN 9 // P0_3
#define SS_PIN 10 // P1_4
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance
@@ -8,15 +8,15 @@
*
* Typical pin layout used:
* -----------------------------------------------------------------------------------------
* MFRC522 Arduino Arduino Arduino Arduino Arduino
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* MFRC522 Elbear/ Arduino Arduino Arduino Arduino
* Reader/PCD Elsomik/Start Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* -----------------------------------------------------------------------------------------
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 53 D10 10 10
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
* RST/Reset RST 9 / P0_3 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 / P1_4 53 D10 10 10
* SPI MOSI MOSI 11 / P1_1 51 D11 ICSP-4 16
* SPI MISO MISO 12 / P1_0 50 D12 ICSP-1 14
* SPI SCK SCK 13 / P1_2 52 D13 ICSP-3 15
*
* More pin layouts for other boards can be found here: https://github.com/miguelbalboa/rfid#pin-layout
*
@@ -15,15 +15,15 @@
*
* Typical pin layout used:
* -----------------------------------------------------------------------------------------
* MFRC522 Arduino Arduino Arduino Arduino Arduino
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* MFRC522 Elbear/ Arduino Arduino Arduino Arduino
* Reader/PCD Elsomik/Start Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* -----------------------------------------------------------------------------------------
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 53 D10 10 10
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
* RST/Reset RST 9 / P0_3 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 / P1_4 53 D10 10 10
* SPI MOSI MOSI 11 / P1_1 51 D11 ICSP-4 16
* SPI MISO MISO 12 / P1_0 50 D12 ICSP-1 14
* SPI SCK SCK 13 / P1_2 52 D13 ICSP-3 15
*
* More pin layouts for other boards can be found here: https://github.com/miguelbalboa/rfid#pin-layout
*
@@ -17,15 +17,15 @@
*
* Typical pin layout used:
* -----------------------------------------------------------------------------------------
* MFRC522 Arduino Arduino Arduino Arduino Arduino
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* MFRC522 Elbear/ Arduino Arduino Arduino Arduino
* Reader/PCD Elsomik/Start Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* -----------------------------------------------------------------------------------------
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 53 D10 10 10
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
* RST/Reset RST 9 / P0_3 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 / P1_4 53 D10 10 10
* SPI MOSI MOSI 11 / P1_1 51 D11 ICSP-4 16
* SPI MISO MISO 12 / P1_0 50 D12 ICSP-1 14
* SPI SCK SCK 13 / P1_2 52 D13 ICSP-3 15
*
* More pin layouts for other boards can be found here: https://github.com/miguelbalboa/rfid#pin-layout
*/
@@ -14,16 +14,16 @@
*
* Typical pin layout used:
* -----------------------------------------------------------------------------------------
* MFRC522 Arduino Arduino Arduino Arduino Arduino
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* MFRC522 Elbear/ Arduino Arduino Arduino Arduino
* Reader/PCD Elsomik/Start Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* -----------------------------------------------------------------------------------------
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
* RST/Reset RST 9 / P0_3 5 D9 RESET/ICSP-5 RST
* SPI SS 1 SDA(SS) ** custom, take a unused pin, only HIGH/LOW required **
* SPI SS 2 SDA(SS) ** custom, take a unused pin, only HIGH/LOW required **
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
* SPI MOSI MOSI 11 / P1_1 51 D11 ICSP-4 16
* SPI MISO MISO 12 / P1_0 50 D12 ICSP-1 14
* SPI SCK SCK 13 / P1_2 52 D13 ICSP-3 15
*
* More pin layouts for other boards can be found here: https://github.com/miguelbalboa/rfid#pin-layout
*
@@ -12,15 +12,15 @@
*
* Typical pin layout used:
* -----------------------------------------------------------------------------------------
* MFRC522 Arduino Arduino Arduino Arduino Arduino
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* MFRC522 Elbear/ Arduino Arduino Arduino Arduino
* Reader/PCD Elsomik/Start Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* -----------------------------------------------------------------------------------------
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 53 D10 10 10
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
* RST/Reset RST 9 / P0_3 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 / P1_4 53 D10 10 10
* SPI MOSI MOSI 11 / P1_1 51 D11 ICSP-4 16
* SPI MISO MISO 12 / P1_0 50 D12 ICSP-1 14
* SPI SCK SCK 13 / P1_2 52 D13 ICSP-3 15
*
* More pin layouts for other boards can be found here: https://github.com/miguelbalboa/rfid#pin-layout
*/
@@ -13,15 +13,15 @@
*
* Typical pin layout used:
* -----------------------------------------------------------------------------------------
* MFRC522 Arduino Arduino Arduino Arduino Arduino
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* MFRC522 Elbear/ Arduino Arduino Arduino Arduino
* Reader/PCD Elsomik/Start Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* -----------------------------------------------------------------------------------------
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 53 D10 10 10
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
* RST/Reset RST 9 / P0_3 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 / P1_4 53 D10 10 10
* SPI MOSI MOSI 11 / P1_1 51 D11 ICSP-4 16
* SPI MISO MISO 12 / P1_0 50 D12 ICSP-1 14
* SPI SCK SCK 13 / P1_2 52 D13 ICSP-3 15
*
* More pin layouts for other boards can be found here: https://github.com/miguelbalboa/rfid#pin-layout
*
@@ -8,15 +8,15 @@
* Uses MIFARE RFID card using RFID-RC522 reader
* Uses MFRC522 - Library
* -----------------------------------------------------------------------------------------
* MFRC522 Arduino Arduino Arduino Arduino Arduino
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* MFRC522 Elbear/ Arduino Arduino Arduino Arduino
* Reader/PCD Elsomik/Start Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* -----------------------------------------------------------------------------------------
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 53 D10 10 10
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
* RST/Reset RST 9 / P0_3 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 / P1_4 53 D10 10 10
* SPI MOSI MOSI 11 / P1_1 51 D11 ICSP-4 16
* SPI MISO MISO 12 / P1_0 50 D12 ICSP-1 14
* SPI SCK SCK 13 / P1_2 52 D13 ICSP-3 15
*
* More pin layouts for other boards can be found here: https://github.com/miguelbalboa/rfid#pin-layout
*/
@@ -2,15 +2,15 @@
* Write personal data of a MIFARE RFID card using a RFID-RC522 reader
* Uses MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
* -----------------------------------------------------------------------------------------
* MFRC522 Arduino Arduino Arduino Arduino Arduino
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* MFRC522 Elbear/ Arduino Arduino Arduino Arduino
* Reader/PCD Elsomik/Start Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* -----------------------------------------------------------------------------------------
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 53 D10 10 10
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
* RST/Reset RST 9 / P0_3 5 D9 RESET/ICSP-5 RST
* SPI SS SDA(SS) 10 / P1_4 53 D10 10 10
* SPI MOSI MOSI 11 / P1_1 51 D11 ICSP-4 16
* SPI MISO MISO 12 / P1_0 50 D12 ICSP-1 14
* SPI SCK SCK 13 / P1_2 52 D13 ICSP-3 15
*
* More pin layouts for other boards can be found here: https://github.com/miguelbalboa/rfid#pin-layout
*
@@ -1,6 +1,6 @@
#include <NeoPixel.h>
#define PIN 2
#define PIN 2 // P0_0
#define NUMPIXELS 1
NeoPixel pixels(NUMPIXELS, PIN);
@@ -1,6 +1,6 @@
#include <NeoPixel.h>
#define PIN 2
#define PIN 2 // P0_0
#define NUMPIXELS 1
NeoPixel pixels(NUMPIXELS, PIN);
@@ -7,7 +7,9 @@
// The DallasTemperature library can do all this work for you!
// https://github.com/milesburton/Arduino-Temperature-Control-Library
OneWire ds(10); // on pin 10 (a 4.7K resistor is necessary)
int pin = 10; // P1_4 for Start/Elsomik
OneWire ds(pin); // a 4.7K resistor is necessary on used pin
void setup(void) {
Serial.begin(9600);
@@ -12,8 +12,9 @@
* - For reading from a switch, you should use 10K pull-up resisters.
*/
OneWire net(10); // on pin 10
int pin = 10; // P1_4 for Start/Elsomik
OneWire net(pin);
void PrintBytes(const uint8_t* addr, uint8_t count, bool newline=false) {
for (uint8_t i = 0; i < count; i++) {
@@ -23,14 +23,19 @@ DS250x add-only programmable memory reader w/SKIP ROM.
*/
#include <OneWire.h>
OneWire ds(6); // OneWire bus on digital pin 6
// OneWire bus on digital pin 6
int pin = 6; // P0_2 for Start/Elsomik
OneWire ds(pin);
void setup() {
Serial.begin (9600);
}
void loop() {
byte i; // This is for the for loops
boolean present; // device present var
bool present; // device present var
byte data[32]; // container for the data from device
byte leemem[3] = { // array with the commands to initiate a read, DS250x devices expect 3 bytes to start a read: command,LSB&MSB adresses
0xF0 , 0x00 , 0x00 }; // 0xF0 is the Read Data command, followed by 00h 00h as starting address(the beginning, 0000h)
@@ -12,7 +12,7 @@ Sd2Card card;
SdVolume volume;
SdFile root;
const int chipSelect = 9;
const int chipSelect = 9; // P0_3
void setup() {
// Open serial communications and wait for port to open:
+2 -2
View File
@@ -10,9 +10,9 @@
Servo servo; // create an Servo class instance to control the servo
int pos = 0; // variable for storing servo position
int pin = 8; // P1_9 for Start/Elsomik
void setup() {
servo.attach(8); // connecting the servo drive to digital pin 8 (D8)
servo.attach(pin); // connecting the servo drive to specified digital pin
}
void loop() {
+2 -2
View File
@@ -8,9 +8,9 @@
#include <Servo.h>
Servo servo; // create an Servo class instance to control the servo
int pin = 8; // P1_9 for Start/Elsomik
void setup() {
servo.attach(8); // connecting the servo drive to digital pin 8 (D8)
servo.attach(pin); // connecting the servo drive to specified digital pin
}
void loop() {
+4 -3
View File
@@ -8,12 +8,13 @@
#include <Servo.h>
Servo servo; // create an Servo class instance to control the servo
int potpin = A0; // analog pin used to connect a potentiometer
// analog pin used to connect a potentiometer
int potpin = A0; // P1_5 for Start/Elsomik
int val; // variable for reading the analog output value
int pin = 8; // P1_9 for Start/Elsomik
void setup() {
servo.attach(8); // connecting the servo drive to digital pin 8 (D8)
servo.attach(pin); // connecting the servo drive to specified digital pin
}
void loop() {
@@ -5,13 +5,14 @@
Receives from software serial, sends to hardware serial.
The circuit:
* RX is digital pin 2 (connect to TX of other device)
* TX is digital pin 6 (connect to RX of other device)
* RX is digital pin 2 (P0_10) (connect to TX of other device)
* TX is digital pin 6 (P0_2) (connect to RX of other device)
Note:
Not all pins on the Elbear Ace-Uno support interrupts,
so only the following can be used for RX:
2, 3, 4, 5, 8, 9
Not all pins on the Elbear Ace-Uno/Ace-Nano support interrupts,
so only the following can be used for RX: 2, 3, 4, 5, 8, 9
Elsomik board pins with interrupts: P0_8, P1_4, P1_5, P1_6, P1_9, P1_10, P1_15, P2_7
Start board pins with interrupts: P0_10, P0_12, P0_13, P0_14, P0_15, P1_9, P1_15
created back in the mists of time
modified 25 May 2012
@@ -22,8 +23,9 @@
*/
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 6); // RX, TX
int rx_pin = 2; // P1_9 for Start/Elsomik
int tx_pin = 6; // P0_2 for Start/Elsomik
SoftwareSerial mySerial(rx_pin, tx_pin);
void setup() {
// Open serial communications and wait for port to open:
@@ -17,17 +17,22 @@
* Second serial device's TX attached to digital pin 8(RX), RX to pin 10(TX)
Note:
Not all pins on the Elbear Ace-Uno support interrupts,
so only the following can be used for RX:
2, 3, 4, 5, 8, 9
Not all pins on the Elbear Ace-Uno/Ace-Nano support interrupts,
so only the following can be used for RX: 2, 3, 4, 5, 8, 9
Elsomik board pins with interrupts: P0_8, P1_4, P1_5, P1_6, P1_9, P1_10, P1_15, P2_7
Start board pins with interrupts: P0_10, P0_12, P0_13, P0_14, P0_15, P1_9, P1_15
*/
#include <SoftwareSerial.h>
// software serial #1: RX = digital pin 2, TX = digital pin 6
SoftwareSerial portOne(2, 6);
int rx_pin_1 = 2; // P1_9 for Start/Elsomik
int tx_pin_1 = 6; // P0_2 for Start/Elsomik
SoftwareSerial portOne(rx_pin_1, tx_pin_1);
// software serial #2: RX = digital pin 8, TX = digital pin 10
SoftwareSerial portTwo(8, 10);
int rx_pin_2 = 8; // P1_15 for Start/Elsomik
int tx_pin_2 = 10; // P1_3 for Start/Elsomik
SoftwareSerial portTwo(rx_pin_2, tx_pin_2);
// active port is changed by user button pressing
volatile bool isPortOneActive = true;
@@ -1,13 +1,22 @@
// задать пин, к которому подсоединен светодиод
#ifdef LED_BUILTIN // для плат Elbear/Start можно использовать встроенный светодиод
uint8_t ledPin = LED_BUILTIN;
#elif defined(ARDUINO_ELSOMIK) // для плат Elsomik нужно задать вывод
uint8_t ledPin = P0_0;
#else
uint8_t ledPin = 2;
#endif
// функция настройки запускается один раз при нажатии кнопки reset или подаче питания на плату
void setup() {
// Инициализация пина P0_3 как выход
pinMode(LED_BUILTIN, OUTPUT);
// Инициализация пина как выход
pinMode(ledPin, OUTPUT);
}
// функция цикла выполняется снова и снова бесконечно
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // включить светодиод (HIGH - высокий уровень напряжения)
delay(1000); // Секунда ожидания
digitalWrite(LED_BUILTIN, LOW); // выключить светодиод (LOW - низкий уровень напряжения)
delay(1000); // Секунда ожидания
digitalWrite(ledPin, HIGH); // включить светодиод (HIGH - высокий уровень напряжения)
delay(1000); // Секунда ожидания
digitalWrite(ledPin, LOW); // выключить светодиод (LOW - низкий уровень напряжения)
delay(1000); // Секунда ожидания
}
@@ -1,22 +1,37 @@
// задать пин, к которому подсоединен светодиод
#ifdef LED_BUILTIN // для плат Elbear/Start можно использовать встроенный светодиод
uint8_t ledPin = LED_BUILTIN;
#elif defined(ARDUINO_ELSOMIK) // для плат Elsomik нужно задать вывод
uint8_t ledPin = P0_0;
#else
uint8_t ledPin = 2;
#endif
// задать пин, к которому подсоединена кнопка
#ifdef BTN_BUILTIN // для плат Elbear Ace-Uno/Start можно использовать встроенную кнопку
uint8_t btn_pin = BTN_BUILTIN;
#elif defined(ARDUINO_ELSOMIK) // для плат Elsomik нужно задать вывод в формате порт-вывод
uint8_t btn_pin = P0_1;
#else
uint8_t btn_pin = 4; // для платы Elbear Ace-Nano нужно задать номер цифрового вывода
#endif
int buttonS = 0; // задаем переменную для хранения состояния кнопки
// функция настройки запускается один раз при нажатии кнопки reset или подаче питания на плату
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // P0_3
pinMode(LED_BUILTIN1, OUTPUT); // P1_3
pinMode(BTN_BUILTIN, INPUT); // P0_8
pinMode(ledPin, OUTPUT);
pinMode(btn_pin, INPUT);
}
// функция цикла выполняется снова и снова бесконечно
void loop() {
buttonS = digitalRead(BTN_BUILTIN); // считываем значение с кнопки
if (buttonS == 0) // если кнопка нажата, то
buttonS = digitalRead(btn_pin); // считываем значение с кнопки
if (buttonS == 0) // если кнопка нажата, то
{
digitalWrite(LED_BUILTIN, HIGH); // включить светодиод на пине P0_3
digitalWrite(LED_BUILTIN1, LOW); // выключить светодиод на пине P1_3
} else // если кнопка отпущена, то
digitalWrite(ledPin, HIGH); // включить светодиод
} else // если кнопка отпущена, то
{
digitalWrite(LED_BUILTIN, LOW); // выключить светодиод на пине P0_3
digitalWrite(LED_BUILTIN1, HIGH); // включить светодиод на пине P1_3
digitalWrite(ledPin, LOW); // выключить светодиод
}
}
@@ -1,14 +1,29 @@
const int button1Pin = P0_2; // кнопка №1 - пин P0_2
const int button2Pin = P0_3; // кнопка №2 - пин P0_3
const int ledPin = P1_3; // пин P1_3, для светодиода
// задать пин, к которому подсоединен светодиод
#ifdef LED_BUILTIN // для плат Elbear/Start можно использовать встроенный светодиод
uint8_t ledPin = LED_BUILTIN;
#elif defined(ARDUINO_ELSOMIK) // для плат Elsomik нужно задать вывод
uint8_t ledPin = P0_0;
#else
uint8_t ledPin = 2;
#endif
// задать пины, к которым подсоединены кнопки
#if defined(ARDUINO_ELSOMIK) || defined(ARDUINO_START_MIK32_V1)
// для плат Elsomik и Start задать пины в формате порт_вывод
const int button1Pin = P0_2; // кнопка №1
const int button2Pin = P0_3; // кнопка №2
#else
// для плат Elbear задать номера цифровых выводов
const int button1Pin = 3; // кнопка №1
const int button2Pin = 4; // кнопка №2
#endif
// функция настройки запускается один раз при нажатии кнопки reset или подаче питания на плату
void setup() {
// Установим пины кнопок как входящие:
// Установим пины кнопок как входы:
pinMode(button1Pin, INPUT);
pinMode(button2Pin, INPUT);
// Установим пин светодиода как исходящий:
// Установим пин светодиода как выход:
pinMode(ledPin, OUTPUT);
}
@@ -18,7 +33,7 @@ void loop() {
/*
* Здесь мы читаем текущее состояние кнопок и помещаем их значение
* в две пепременные.
* в две переменные.
*/
button1State = digitalRead(button1Pin);
button2State = digitalRead(button2Pin);
@@ -26,7 +41,7 @@ void loop() {
if (((button1State == LOW) || (button2State == LOW)) // Проверяем нажата ли только одна из кнопок
&& !((button1State == LOW) && (button2State == LOW))) {
digitalWrite(ledPin, HIGH); // Включаем светодиод
} else // иначе
} else // иначе
{
digitalWrite(ledPin, LOW); // Выключаем светодиод
}
@@ -1,5 +1,20 @@
const int ledPin = LED_BUILTIN; // Пин P0_3 для светодиода.
const int sensorPin = P1_5; // Пин, к которому подключается средний вывод потенциометра.
// задать пин, к которому подсоединен светодиод
#ifdef LED_BUILTIN // для плат Elbear/Start можно использовать встроенный светодиод
uint8_t ledPin = LED_BUILTIN;
#elif defined(ARDUINO_ELSOMIK) // для плат Elsomik нужно задать вывод
uint8_t ledPin = P0_0;
#else
uint8_t ledPin = 2;
#endif
// задать пин, к которому подключается средний вывод потенциометра
#if defined(ARDUINO_ELSOMIK) || defined(ARDUINO_START_MIK32_V1)
// для плат Elsomik и Start задать пин в формате порт_вывод. Пин должен поддерживать АЦП измерения
const int sensorPin = P1_5;
#else
// для плат Elbear задать номер аналогового вывода
const int sensorPin = A0;
#endif
int sensorValue = 0; // Переменная для хранения значения потенциометра
// функция настройки запускается один раз при нажатии кнопки reset или подаче питания на плату
@@ -1,11 +1,24 @@
// Имена для пинов светодиода и потенциометра (англ potentiometr или "pot")
#define LED_PIN P0_0
#define POT_PIN P1_5
// задать пин, к которому подсоединен светодиод
#ifdef LED_BUILTIN // для плат Elbear/Start можно использовать встроенный светодиод
uint8_t ledPin = LED_BUILTIN;
#elif defined(ARDUINO_ELSOMIK) // для плат Elsomik нужно задать вывод
uint8_t ledPin = P0_0;
#else
uint8_t ledPin = 2;
#endif
// задать пин, к которому подключается средний вывод потенциометра
#if defined(ARDUINO_ELSOMIK) || defined(ARDUINO_START_MIK32_V1)
// для плат Elsomik и Start задать пин в формате порт_вывод. Пин должен поддерживать АЦП измерения
const int sensorPin = P1_5;
#else
// для плат Elbear задать номер аналогового вывода
const int sensorPin = A0;
#endif
// функция настройки запускается один раз при нажатии кнопки reset или подаче питания на плату
void setup() {
// Установим пин светодиода как выход
pinMode(LED_PIN, OUTPUT);
pinMode(ledPin, OUTPUT);
}
// функция цикла выполняется снова и снова бесконечно
@@ -18,7 +31,7 @@ void loop() {
* микроконтроллер выдаст число от 0 до 1023
* пропорциональное углу поворота ручки.
*/
rotation = analogRead(POT_PIN);
rotation = analogRead(sensorPin);
/*
* В brightness записывается полученное ранее значение rotation
@@ -29,7 +42,7 @@ void loop() {
brightness = rotation / 4;
// Итоговое напряжение подается на светодиод.
analogWrite(LED_PIN, brightness);
analogWrite(ledPin, brightness);
}
@@ -1,7 +1,16 @@
// Имена пинов для светодиодов
// задать пины, к которым подсоединен светодиод. Пины должны поддерживать функцию ШИМ
#if defined(ARDUINO_ELSOMIK) || defined(ARDUINO_START_MIK32_V1)
// для плат Elsomik и Start задать пины в формате порт_вывод
const int RED_PIN = P0_0;
const int GREEN_PIN = P0_1;
const int BLUE_PIN = P0_2;
#else
// для плат Elbear задать номера цифровых выводов
const int RED_PIN = 3;
const int GREEN_PIN = 5;
const int BLUE_PIN = 6;
#endif
/*
* Следующая переменная контролирует, насколько быстро выполняется цикл по смене
@@ -1,6 +1,19 @@
// Константы с именами для используемых пинов.
const int sensorPin = P1_5;
const int ledPin = P0_0;
// задать пин, к которому подсоединен светодиод
#ifdef LED_BUILTIN // для плат Elbear/Start можно использовать встроенный светодиод
uint8_t ledPin = LED_BUILTIN;
#elif defined(ARDUINO_ELSOMIK) // для плат Elsomik нужно задать вывод
uint8_t ledPin = P0_0;
#else
uint8_t ledPin = 2;
#endif
// задать пин, к которому подключается средний вывод потенциометра
#if defined(ARDUINO_ELSOMIK) || defined(ARDUINO_START_MIK32_V1)
// для плат Elsomik и Start задать пин в формате порт_вывод. Пин должен поддерживать АЦП измерения
const int sensorPin = P1_5;
#else
// для плат Elbear задать номер аналогового вывода
const int sensorPin = A0;
#endif
/*
* Глобальны переменные для уровней яркости:
@@ -1,7 +1,13 @@
#include "notes.h" // Библиотека с частотой нот
// Константы с именами для используемых пинов.
const int buzzerPin = P0_0;
// задать пин, к которому подсоединен пьезоэлемент
#if defined(ARDUINO_ELSOMIK) || defined(ARDUINO_START_MIK32_V1)
// для плат Elsomik и Start задать пин в формате порт_вывод
const int buzzerPin = P0_0;
#else
// для плат Elbear задать номер цифрового вывода
const int buzzerPin = 2;
#endif
/*
* BPM (bpm, англ. beats per minute[1], удары в минуту) в музыке — показатель, определяющий скорость исполнения
+6 -6
View File
@@ -33,7 +33,7 @@ compiler.optimization_flags.release=-Os
compiler.optimization_flags.debug=-Og -g3
compiler.extra_flags = -march=rv32imc_zicsr_zifencei -mabi=ilp32 -mcmodel=medlow -Wall -fsigned-char -ffunction-sections
compiler.S.flags = {compiler.extra_flags} -x assembler-with-cpp {compiler.define} -I"{runtime.platform.path}/libraries/FreeRTOS/src" {compiler.optimization_flags} {compiler.warning_flags} {compiler.MIK32_Amur.extra_include}
compiler.S.flags = {compiler.extra_flags} -x assembler-with-cpp {compiler.define} "-I{runtime.platform.path}/libraries/FreeRTOS/src" {compiler.optimization_flags} {compiler.warning_flags} {compiler.MIK32_Amur.extra_include}
compiler.c.flags = -c -std=gnu11 -Werror=return-type {compiler.extra_flags} {compiler.define} {compiler.warning_flags} {compiler.optimization_flags} {compiler.MIK32_Amur.extra_include}
compiler.cpp.flags = -c -std=gnu++17 -fabi-version=0 -fno-exceptions -fno-rtti -fno-use-cxa-atexit -fno-threadsafe-statics -Werror=return-type {compiler.extra_flags} {compiler.define} {compiler.warning_flags} {compiler.optimization_flags} {compiler.MIK32_Amur.extra_include}
compiler.c.elf.flags = -march=rv32imc_zicsr_zifencei -mabi=ilp32 -mcmodel=medlow -nostartfiles -Xlinker
@@ -51,7 +51,7 @@ archive_file_path={build.path}/{archive_file}
recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} "{archive_file_path}" "{object_file}"
# Combine gc-sections, archives, and objects
recipe.c.combine.pattern= "{compiler.path}{compiler.c.elf.cmd}" -o "{build.path}/{build.project_name}.elf" -T "{build.core.path}/mik32/shared/ldscripts/{build.ldscript}" {compiler.c.elf.flags} -Map={build.path}/{build.project_name}.map -Wl,--gc-sections -Wl,--no-warn-rwx-segments "-L{build.path}" -Wl,--start-group {object_files} -Wl,--whole-archive "{archive_file_path}" -Wl,--no-whole-archive -lc -Wl,--end-group
recipe.c.combine.pattern= "{compiler.path}{compiler.c.elf.cmd}" -o "{build.path}/{build.project_name}.elf" -T "{build.core.path}/mik32/shared/ldscripts/{build.ldscript}" {compiler.c.elf.flags} "-Map={build.path}/{build.project_name}.map" -Wl,--gc-sections -Wl,--no-warn-rwx-segments "-L{build.path}" -Wl,--start-group {object_files} -Wl,--whole-archive "{archive_file_path}" -Wl,--no-whole-archive -lc -Wl,--end-group
# Create output (.bin file)
recipe.objcopy.bin.pattern="{compiler.path}{compiler.objcopy.cmd}" {compiler.elf2bin.flags} "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.bin"
@@ -105,7 +105,7 @@ debug.additional_config=debug_config.mik32
tools.elbear_uploader.cmd=elbear_uploader
tools.elbear_uploader.cmd.windows=elbear_uploader.exe
tools.elbear_uploader.path={runtime.tools.elbear_uploader.path}
tools.elbear_uploader.upload.pattern={path}/{cmd} {build.path}/{build.project_name}.hex --com={serial.port} --baudrate={upload.speed}
tools.elbear_uploader.upload.pattern="{path}/{cmd}" "{build.path}/{build.project_name}.hex" --com={serial.port} --baudrate={upload.speed}
tools.elbear_uploader.upload.params.quiet=
tools.elbear_uploader.upload.params.verbose=
@@ -126,10 +126,10 @@ tools.mik32_upload.erase.params.quiet=
tools.mik32_upload.erase.params.verbose=
# For Tools > Burn Bootloader
tools.mik32_upload.bootloader.pattern={path}/{cmd} {runtime.platform.path}/bootloaders/{bootloader.file} --run-openocd --openocd-exec={runtime.tools.openocd.path}/bin/openocd{cmd.extension} --openocd-interface={path}/openocd-scripts/interface/{bootloader.interface} --openocd-target={path}/openocd-scripts/target/mik32.cfg
tools.mik32_upload.bootloader.pattern="{path}/{cmd}" "{runtime.platform.path}/bootloaders/{bootloader.file}" --run-openocd {bootloader.driver_option} --openocd-exec "{runtime.tools.openocd.path}/bin/openocd{cmd.extension}" --openocd-interface "{path}/openocd-scripts/interface/{bootloader.interface}" --openocd-target "{path}/openocd-scripts/target/mik32.cfg"
tools.mik32_upload.bootloader.params.quiet=
# For Sketch > Upload Using Programmer
tools.mik32_upload.program.pattern={path}/{cmd} {build.path}/{build.project_name}.hex --run-openocd --openocd-exec={runtime.tools.openocd.path}/bin/openocd{cmd.extension} --openocd-interface={path}/openocd-scripts/interface/{bootloader.interface} --openocd-target={path}/openocd-scripts/target/mik32.cfg
tools.mik32_upload.program.pattern="{path}/{cmd}" "{build.path}/{build.project_name}.hex" --run-openocd {bootloader.driver_option} --openocd-exec "{runtime.tools.openocd.path}/bin/openocd{cmd.extension}" --openocd-interface "{path}/openocd-scripts/interface/{bootloader.interface}" --openocd-target "{path}/openocd-scripts/target/mik32.cfg"
tools.mik32_upload.program.params.quiet=
tools.mik32_upload.program.params.verbose=
tools.mik32_upload.program.params.verbose=
+5
View File
@@ -131,6 +131,11 @@ void additionalPinsInit(uint32_t PinNumber)
HAL_GPIO_PinConfig(SELA_A_PORT, SELA_A_PIN, HAL_GPIO_MODE_GPIO_OUTPUT, HAL_GPIO_PULL_NONE, HAL_GPIO_DS_2MA);
// SELA_B
HAL_GPIO_PinConfig(SELA_B_PORT, SELA_B_PIN, HAL_GPIO_MODE_GPIO_OUTPUT, HAL_GPIO_PULL_NONE, HAL_GPIO_DS_2MA);
// select A7 via switches selaA, selaB to allow using A4 and A5 as digital outputs
HAL_GPIO_WritePin(SELA_A_PORT, SELA_A_PIN, GPIO_PIN_HIGH);
HAL_GPIO_WritePin(SELA_B_PORT, SELA_B_PIN, GPIO_PIN_HIGH);
selaSwitchesIsInited = true;
}