Stm32 SPL или Регистры? — Хабр Q&A
SPLплюсы:
1. Приемлемый уровень абстракции между разными камнями и семействами, есть мануалы как переводить софт с одного на другое семейство стм32 и в них описан ТОЛЬКО SPL
2. Он понятнее чем запись в регистры, особенно если нужно наработки использовать потом через пару лет или другим человеком.
3. Сама фирма производитель тестировала чипы именно на SPL и значит порядок работы с периферией что заложен в SPL даст существенно меньше глюков чем любой другой.
4. В SPL интуитивно понятный и можно писать «на деревню дедушке», т.е. DAC_deinit() например зная что ADC_DeInit() существует значит и другое есть
5. В SPL всё таки много наработок — в множестве функций есть очень тонкие моменты и ньюансы которые уже сделаны и при работе с регистрами на них точно напорешся и потратишь не одну неделю.
МИНУСЫ:
1. SPL медленный, особенно ножкодрыганье — но он для этого не предназначен вообще то и ждать от него скоростей в пару тактов глупо. Да и для 99% задач SPL достаточно быстр. Как решение проблемы использовать побитовый доступ для ножкодрыгания, или один раз через SPL настроил что надо, сохранил все значения регистров в временные переменные и одним memmove просто скопировал в блок регистров сразу всё — максимально быстро особенно для ДМА которой надо дофига всего сделать.
3. код SPL громоздкий … ну вы батенька WinAPI не видели и другие высокоуровневые языки.
My Embedded: STM32F407(STM32F4-DISCOVERY) — Нестандартный подход
Часть 1 — Теория
В предыдущей статье я указывал, что к системе подключается стандартная библиотека. На самом деле, подключается CMSIS — система обобщенного структурного представления МК, а также SPL — стандартная библиотека периферии. Рассмотрим каждую из них:CMSIS
Представляет собой набор заголовочных файлов и небольшого набора кода для унификации и структурировании работы с ядром и периферией МК. По сути, без этих файлов невозможно нормально работать с МК. Получить библиотеку можно на странице сопровождающей документации к МК.
Хотя те файлы которые касаются процессорного ядра МК у всех производителей идентичны (хотя бы потому, что модель процессорного ядра у них одна — предоставленная в виде ip-блоков компанией ARM).
Что касается периферии то у STM32 и STM8 (внезапно) она почти похожа, также частично это справедливо и для других МК выпущенных компанией ST. В практической части, я покажу насколько просто использовать CMSIS. Однако трудности в его использовании связаны с нежеланием людей читать документацию и разбираться в устройстве МК.
Именно поэтому, далее я опишу следующий компонент стандартной библиотеки.
SPL
Standard Peripheral Library — стандартная библиотека периферии. Как следует из названия, назначение этой библиотеки — создание абстракции для периферии МК. Библиотека состоит из заголовочных файлов где объявлены человеко-понятные константы для конфигурирования и работы с периферией МК, а также файлы исходного кода собираемые собственно в саму библиотеку для операций с периферией.
Считается, что она более удобна новичкам, т.к. позволяет не думать как работает периферия, однако качество кода, универсальность подхода и скованность интерфейсов накладывают на разработчика определенные ограничения.
Также функционал библиотеки не всегда позволяет точно реализовать настройку некоторых компонентов таких как USART (универсальный синхронный-асинхронный последовательный порт) в определённых условиях. В практической части, я также опишу работу с этой частью библиотеки.
Базовый проект
|
|
Шаблоны проектов IAR для STM8S/STM8L SPL / STM8 / Сообщество EasyElectronics.ru
Честно говоря запарился я на каждый проект перетаскивать исходники, настраивать пути, прописывать хедеры и прочее прочее. И наконец-то созрел сделать себе нормальные шаблоны. Лучше ведь поздно чем никогда, верно?
И для того чтобы не забыть, что и где я правил в оригинальной библиотеке, да и чтобы где-то забэкапить результаты своих трудов решил написать эту заметку. Ну а если кому-то это поможет сэкономить время — буду только рад =)
Для создания шаблонов использовался IAR 1.42.3, и библиотеки STM8S SPL v2.2.0, STM8L51x SPL v1.6.1.
Установка
Для установки нужно всего лишь распаковать архивы вc:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\stm8\config\template\project\
Собственно в папках содержатся структуры будущих проектов, а в файлах с расширением .projtempl находится описание шаблона и полный список его файлов.
STM8L15x SPL
После создания проекта по шаблону он должен сразу полностью компилиться, выдавая одно предупреждение по поводу «ITC_GetCPUCC»(на него надо забить).В настройках проекта сразу выбран STM8L152C6 (STM8L-DICOVERY). Там же в настройках компилятора задефайнено следующее:
STM8L15X_MD
HSE_VALUE=((uint32_t)16000000)
LSE_VALUE=((uint32_t)32768)
HSI_VALUE=((uint32_t)16000000)
LSI_VALUE=((uint32_t)38000)
Соответственно, чтобы подправить семейство или тактовые частоты, достаточно просто подправить эти дефайны. Ну а если кому-то больше нравится править внутри хедеров, то эти дефайны могут быть найдены в stm8l15x.h
Отличие от исходной библиотеки заключается в организации прерываний:
- файл stm8l15x_it.h. Выкинул все лишнее, оставив прототипы функций-обработчиков прерываний.
- Файл stm8l15x_it.с. Состоит только из заглушек обработчиков вида:
... #ifndef ADC1_COMP_IRQ //ADC1/Comparator Interrupt routine. INTERRUPT_HANDLER(ADC1_COMP_IRQHandler,18) { while (1){}; } #endif ...
- файл stm8l15x_conf.h. По умолчанию закоментированы хедеры всех периферийных блоков, кроме stm8l15x_clk.h и stm8l15x_gpio.h. Добавил блок дефайнов вида:
Работает так: если дефайн закоментирован, то при возникновении случайно разрешенного прерывания контроллер мертво повисает в обработчике-заглушке. Для того чтобы воспользоваться обработчиком в своих целях — раскоментируем нужный дефайн, и размещаем обработчик там где хочется./* Uncomment the line below to create your own interrupt handlers */ //#define TRAP_IRQ /* TRAP */ //#define FLASH_IRQ /* FLASH EOP/PG_DIS */ //#define DMA1_CHANNEL0_1_IRQ /* DMA1 Channel0/1 */ //#define DMA1_CHANNEL2_3_IRQ /* DMA1 Channel2/3 */ ...
STM8S SPL
После создания проекта по шаблону он также должен сразу полностью компилиться, выдавая такое же предупрежедение.В настройках проекта сразу выбран STM8S003F3. Там же в настройках компилятора задефайнено следующее:
STM8S003
HSE_VALUE=((uint32_t)16000000)
HSI_VALUE=((uint32_t)16000000)
LSI_VALUE=((uint32_t)128000)
В этой библиотеке пришлось править чуть больше, так как она рассчитана на большое количество мк с разной периферией, а следовательно щедро приправлена директивами условной компиляции.
Подвергнуты изменениям:
- файлы stm8l15x_conf.h, stm8l15x_it.h, stm8l15x_it.с.Изменения аналогичны правкам в STM8L SPL выше.
- файлы stm8s_adc1.c, stm8s_adc2.c, stm8s_can.c, stm8s_uart1.c, stm8s_uart2.c, stm8s_uart3.c, stm8s_uart4.c, stm8s_tim2.c, stm8s_tim3.c, stm8s_tim4.c, stm8s_tim5.c, stm8s_tim6.c. Все тело этих файлов заключено в директивы условной компиляции, аналогичные директивам в stm8s.h в разделе «Peripherals declarations». Просто структуры некоторых периферийных блоков не будут создаваться, если выбрано семейство мк, где они отсутствуют. В файлах же идет активное обращение к этим структурам, и чтобы избежать ошибок, нужно либо удалять файлы, либо оборачивать их в блоки условной компиляции.
Если вдруг найдутся ошибки, то пишите — исправлю.