Статьи

Учебное пособие: проект DIY Kinetis SDK с Eclipse – настройка платы

В « Учебнике: DIY Kinetis SDK Project с Eclipse — Запуск » я показал, как создать Kinetis SDK проект с нуля. В этом посте речь идет о добавлении файлов инициализации платы. При инициализации платы настраиваются периферийные часы и штыревое соединение.

MK64FN1M0VLL12 на FRDM-K64F

MK64FN1M0VLL12 на FRDM-K64F

Часы и Pin Muxing

Как указано в « Учебнике: проект DIY Kinetis SDK с Eclipse — Запуск », до main()меня уже была базовая конфигурация:

  1. Стек и куча определены
  2. Настраивается «критическое» оборудование, такое как Watchdog / COP и базовые тактовые частоты процессора
  3. C / C ++ переменные инициализируются
  4. Все настройки среды выполнения библиотеки ANSI выполнены

Но для многих современных микроконтроллеров необходима еще одна аппаратная конфигурация, которая обычно выполняется в main()качестве одного из первых шагов: для настройки стробирования тактовых импульсов и мультиплексирования контактов.

« Синхронизация часов » означает, что часы настроены так, что используемые периферийные устройства синхронизируются. По умолчанию на ядрах ARM необходимо включить периферийные часы, а доступ к периферийному устройству, например, к входам / выходам, которые не синхронизированы, с большой вероятностью приведет к исключению или серьезной неисправности .

Другое дело «Pin Muxing»: на современном микроконтроллере внешний вывод на корпусе процессора может использоваться разными периферийными устройствами. Например, на рисунке ниже показано представление «Процессор» в Processor Expert. Вывод № 7 можно использовать для ввода / вывода, UART, I2S, FTM или даже для USB. И теперь он настроен и направлен на PTE6 как вывод ввода / вывода:

PTE6 Routing

PTE6 Routing

Pin Muxing или Routing во многих случаях могут быть изменены во время выполнения, но важно правильно настроить его в начале, прежде чем выполнять инициализацию драйвера, так как muxin «разделяется» между периферийными устройствами и драйверами.

SDK Board Files

Я добавляю свою доску в проект с файлами в $ {KSDK_PATH} \boards:

Добавлена ​​поддержка платы для FRDM-K64F

Добавлена ​​поддержка платы для FRDM-K64F

И я удостоверяюсь, что компилятор знает путь включения к папке с досками. Но так как файлы платы используют кучу других включаемых файлов 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 (), и там я инициализирую оборудование:

main () с hardware_init ()

main () с hardware_init ()

Но он будет жаловаться на отсутствие clock_manager_set_gate():

Отсутствует clock_manager_set_gate

Отсутствует 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

в мои настройки компоновщика:

опция компоновщика newlib-nano

опция компоновщика newlib-nano

При этом размер кода уменьшается вдвое :-):

   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 . Так что же дальше? Мигающий светодиод!

С Новым Годом 🙂