В « Учебнике: DIY Kinetis SDK Project с Eclipse — Запуск » я показал, как создать Kinetis SDK проект с нуля. В этом посте речь идет о добавлении файлов инициализации платы. При инициализации платы настраиваются периферийные часы и штыревое соединение.
Часы и Pin Muxing
Как указано в « Учебнике: проект DIY Kinetis SDK с Eclipse — Запуск », до main()
меня уже была базовая конфигурация:
- Стек и куча определены
- Настраивается «критическое» оборудование, такое как Watchdog / COP и базовые тактовые частоты процессора
- C / C ++ переменные инициализируются
- Все настройки среды выполнения библиотеки ANSI выполнены
Но для многих современных микроконтроллеров необходима еще одна аппаратная конфигурация, которая обычно выполняется в main()
качестве одного из первых шагов: для настройки стробирования тактовых импульсов и мультиплексирования контактов.
« Синхронизация часов » означает, что часы настроены так, что используемые периферийные устройства синхронизируются. По умолчанию на ядрах ARM необходимо включить периферийные часы, а доступ к периферийному устройству, например, к входам / выходам, которые не синхронизированы, с большой вероятностью приведет к исключению или серьезной неисправности .
Другое дело «Pin Muxing»: на современном микроконтроллере внешний вывод на корпусе процессора может использоваться разными периферийными устройствами. Например, на рисунке ниже показано представление «Процессор» в Processor Expert. Вывод № 7 можно использовать для ввода / вывода, UART, I2S, FTM или даже для USB. И теперь он настроен и направлен на PTE6 как вывод ввода / вывода:
Pin Muxing или Routing во многих случаях могут быть изменены во время выполнения, но важно правильно настроить его в начале, прежде чем выполнять инициализацию драйвера, так как muxin «разделяется» между периферийными устройствами и драйверами.
SDK Board Files
Я добавляю свою доску в проект с файлами в $ {KSDK_PATH} \boards:
И я удостоверяюсь, что компилятор знает путь включения к папке с досками. Но так как файлы платы используют кучу других включаемых файлов SDK, мне нужно добавить несколько дополнительных путей включения компилятора:
"${KSDK_PATH}/boards/frdmk64f120m" "${KSDK_PATH}/platform/drivers/gpio" "${KSDK_PATH}/platform/hal/port" "${KSDK_PATH}/platform/hal/gpio" "${KSDK_PATH}/platform/drivers/clock" "${KSDK_PATH}/platform/utilities" "${KSDK_PATH}/platform/hal/sim"
Благодаря этому я могу скомпилировать и связать файлы платы :-).
Инициализация платы
Для инициализации платы я включаю заголовочный файл:
#include "board.h"
и вызвать функцию инициализации:
hardware_init(); /* initialize the hardware */
Мое приложение теперь ничего не делает: оно вызывает только main (), и там я инициализирую оборудование:
Но он будет жаловаться на отсутствие clock_manager_set_gate()
:
Это означает, что мне нужно добавить необходимые файлы для настройки часов и SIM-карты (модуль системной интеграции). Поэтому я добавляю больше файлов: часы и сим :
И снова мне нужно добавить путь включения для компилятора:
"${KSDK_PATH}/platform/drivers/interrupt"
К сожалению, в текущем SDK V1.0.0-Beta есть ошибка: fsl_sim_features.h сообщает, что он не знает мой правильно указанный «CPU_MK64FN1M0VLL12 ″ :-(:
Description Resource Path Location Type #error "No valid CPU defined" fsl_sim_features.h /FRDM-K64F_Bare_SDK/SDK/platform/hal/sim line 279 C/C++ Problem
Поэтому мне нужно добавить следующее в настройки препроцессора моего компилятора, чтобы компилятор был доволен:
"CPU_MK64FN1M0VMD12"
И с этим я могу построить:
text data bss dec hex filename 17912 2476 260 20648 50a8 FRDM-K64F_Bare_SDK.elf
newlib-нано
Ну, это большой размер кода! Время переключиться на меньшую библиотеку newlib-nano. Итак, я добавляю
-specs=nano.specs
в мои настройки компоновщика:
При этом размер кода уменьшается вдвое :-):
text data bss dec hex filename 8376 152 44 8572 217c FRDM-K64F_Bare_SDK.elf
Теперь этот 8-килобайтный (yikes!) Код все еще * много *, учитывая то, что делает наше приложение: оно ничего не делает (пока). Причина в том, как SDK спроектирован: он использует много таблиц и внутренних структур данных, а также делает много вещей динамически (например, аппаратная инициализация). Следовательно, накладные расходы на код (и скорость) по сравнению с «традиционным» проектом не малы. Даже «чистые» проекты Processor Expert намного меньше для того, чтобы «ничего не делать», потому что Processor Expert может просто генерировать необходимый код, и ему не нужно выполнять все лишние вещи. То же самое с проектом Processor Expert было бы меньше 4 Кбайт кода!
hardware_init ()
Но что hardware_init()
делает? Не так уж много, но очень важная вещь: чтобы настроить часы и мультиплексирование:
void hardware_init(void) { int32_t i; /* enable clock for PORTs */ for (i = 0; i < HW_PORT_INSTANCE_COUNT; i++) { clock_manager_set_gate(kClockModulePORT, i, true); } /* init the general pinmux */ configure_enet_pin_mux(0); for (i = 0; i < HW_PORT_INSTANCE_COUNT; i++) { configure_gpio_pin_mux(i); } configure_i2c_pin_mux(0); configure_i2c_pin_mux(1); configure_sdhc_pin_mux(0); configure_spi_pin_mux(0); configure_uart_pin_mux(0); }
Первый цикл for включает тактовые импульсы (передает часы периферийным устройствам) для периферийных устройств PORT (GPIO). Я рекомендую вам использовать отладчик и пройтись по коду (например, зайдите clock_manager_set_gate()
. Затем вы можете увидеть, что влияет на размер кода).
Затем он настраивает мультиплексирование выводов Ethernet с configure_enet_pin_mux()
последующим циклом for, который делает то же самое для выводов ввода-вывода общего назначения. Поскольку у нас есть два I2C на микроконтроллере, есть два вызова configure_i2c_pin_mux()
.
Резюме
Прежде чем я смогу запустить код своего приложения, микроконтроллер должен быть правильно инициализирован. По сути, это означает настройку вывода на контакт и синхронизацию часов. Поскольку это обычно зависит от платы или от того, что прикреплено к выводам, это также называется «конфигурация платы». Kinetis SDK имеет предварительно сконфигурированную конфигурацию платы, например, для FRDM-K64F. Конфигурация выполняется с помощью функции, hardware_init()
которую нужно вызывать сразу после main()
. С помощью Kinetis SDK я могу программно инициализировать свое оборудование и плату и выполнять собственную настройку платы. Однако с учетом того, как SDK спроектирован, будьте готовы к накладным расходам. Для микроконтроллера с большим количеством FLASH, такого как K64F, это не имеет большого значения, но для микроконтроллера меньшего размера важна экономия каждого байта.
Проект доступен на GitHub . Так что же дальше? Мигающий светодиод!
С Новым Годом ?