## Библиотека абстракции от периферии микроконтроллера LMCAL (LCard MicroController Abstraction Layer)

Библиотека предоставляет пользователю набор драйверов для управления периферией микроконтроллера. 

На данный момент готовы:
- драйвер CPU (настройка тактирования, управление прерываниями);
- драйвер GPIO (запись\чтение пинов, прерывания по входу);
- драйвер PTIM (периодический таймер для служебных функций);
- драйвер UART (асинхронный и синхронный прием\передача слов по UART);
- драйвер SPI (асинхронный и синхронный прием\передача слов по SPI);
- драйвер WDG  (инициализация и сброс WDG);
- драйвер FLASH (чтение, запись, очистка секций Flash памяти);
- драйвер EXMC (инициализация контроллера внешней памяти);

В планах:
драйверы SDIO, ADC, CAN, RTC..


Пример архитектуры ПО:

![image](./docs/lmcal.png)

Драйверы предоставляют функции, использующие логические каналы, а не конкретную периферию.
Настройка каналов выполняется в одноименных config-файлах. Поддержка платой заданной периферии определяется в port-файлах. 

В идеале, port-файлы должны поддерживать работу всей периферии контроллера в любых комбинациях ножек, а настройка выполняться в config-файлах. Однако, это невозможно из-за большого разнообразия периферии и микроконтроллеров. 

Для использования библиотеки в своем проекте, разработчик должен сам написать port и config файлы драйверов для своей платы или группы плат. Примеры файлов можно найти в текущем репозитории.


### Сборка в составке другого проекта

Предварительно:
- создать папки config и lmcal_port для вашей платы в целевом проекте.
- написать port-ы для необходимых драйверов и поместить их в lmcal_port.
- настроить конфигурационные файлы драйверов и поместить их в config.
- добавить в проект исходные файлы и пути для config и lmcal_port.

Шаблоны для config и port находятся в папках tmpl текущего проекта.

Для сборки:
- установите необходимые переменные для lmcal.mk (название микроконтроллера, готовый port, конкретные драйверы для сборки);
- добавьте в ваш проект файл l_macro_types.h;
- запустите lmcal.mk в вашем Makefile.

Пример makefile:
```
LMCAL_CPU  := at32f403
LMCAL_BUILD_ALL := 0
LMCAL_CPU_ON    := 1
LMCAL_GPIO_ON   := 1
LMCAL_PTIM_ON   := 1

include $(ROOT_DIR)/lib/lmcal/lmcal.mk
include $(ROOT_DIR)/lib/lmcal_port/lmcal_port.mk
```

### Сборка примеров

Для сборки примеров, перейдите в каталог /example, затем в папку с примером и выполните make. 
Настройка makefile позволяет выбрать плату для которой будет собираться проект (список поддерживаемых плат находится в папке port). Результаты сборки будут помещены в папку build в корне репозитория.


### Необходимые инструменты
1) make v4.3
2) arm-none-eabi-gcc xPack v14.2.1

Примечание: 
- выполнялась сборка на windows и linux;
- версии инструментов даны для справки;
