Микроконтроллер
Библиотека Freedom Metal
Все детали, которые мы до сих пор рассматривали в этом разделе, относятся к аппаратному обеспечению и низкоуровневым элементам, которыми вы будете управлять и взаимодействовать с помощью библиотеки встроенного ПО. Думайте об этой библиотеке как об API.
Так же, как и API, совершенно обычным делом является доступ к нескольким библиотекам встроенного ПО, разработанным разными организациями. Например, для Arduino UNO доступно несколько библиотек, включая ту, которая поставляется с Arduino IDE, драйвера, написанные Atmel (поставщиком микроконтроллеров), драйверы, написанные поставщиками устройств, такими как производитель ЖК-модуля, и даже библиотеки, написанные любителями.
Библиотека, которую мы будем использовать в этом курсе, легко доступна в Freedom Studio и написана SiFive. Она называется библиотека Freedom Metal и включена в пакет поддержки платы (или BSP) для платы HiFive1 Rev B.
Давайте представим эту библиотеку практическим, экспериментальным способом. Мы создадим проект, использующий исходные файлы из библиотеки Freedom Metal, включенной в BSP.
Создание проекта в Blinky
Мы начнем с создания проекта так, как вы узнали в предыдущем разделе. То есть создайте проект Freedom E SKD для платы HiFive1 Rev-B, используя программу hello Example, но назовите его Blinky, как показано ниже, на рисунке 2.7. Нажмите на кнопку Готово, когда будете готовы.
![Мастер создания проекта Freedom Studio, показывающий рекомендуемые настройки для проекта Blinky](/EDI/20_01_25_2/1737325222-1077/tutorial/1372/objects/3/files/02-07.jpg)
Рис. 2.7. Мастер создания проекта Freedom Studio, показывающий рекомендуемые настройки для проекта Blinky
Когда Freedom Studio завершит создание вашего проекта (что может занять некоторое время), примите ее предложение по сборке и запуску конфигурации JLink, чтобы упростить отладку. Нажмите на кнопку Отладки (рис.2.8).
Не волнуйтесь, если вы увидите следующее окно с сообщением (рис.2.9). Это просто означает, что у вас плата не подключена к USB-порту. Не стесняйтесь отклонить это сообщение.
После этого вы должны увидеть, что ваш вновь созданный проект открыт в среде IDE. Если вы наведете указатель мыши на кнопку отладки, вы увидите текст всплывающей подсказки, который гласит: Debug Blinky (или любое другое название, которое вы дали своему проекту) (рис.2.10). Это показывает, что конфигурация отладки J-Link доступна простым нажатием этой кнопки. Мы сделаем это вскоре, когда подключим плату к USB-порту. А пока мы добавим немного кода.
Код Blinky
Программа будет мигать. То есть пользовательский светодиод на Red-V Thing Plus будет мигать с постоянной частотой 1 Гц, включаясь на полсекунды и выключаясь на полсекунды.
Следующий фрагмент кода был получен из руководства SparkFun по разработке Red-V и изменен в двух незначительных деталях:
-
Временная шкала, используемая функцией задержки
Команда SparkFun, которая тестировала это приложение, использовала плату, отличную от Red-V Thing Plus. В этом коде используется Redboard Red-V, также представленный в этом руководстве. Единицы времени, которые они использовали для достижения задержки в 1 секунду, составляли 2 000 000 единиц. Однако в конечном итоге код разделил эти единицы на 10, чтобы достичь задержки в 1 секунду. Наш случай был другим: функция delay предлагается для получения параметра задержки в микросекундах, и это именно то, что сработало в Red-V Thing Plus. Для задержки в 0,5 секунды в этом параметре было использовано значение 500 000.
-
Некоторые комментарии были изменены, а некоторые удалены
Комментарии и код, касающиеся адаптации шкалы времени, были удалены. Ссылки на контакты ввода-вывода платы также были изменены, поскольку первоначально они относились к плате Red-V Red Board, а не к Red-V Thing Plus.
Скопируйте этот код и вставьте его, чтобы заменить содержимое hello.c в вашем проекте Blinky. Кроме того, продолжайте бегло просматривать код, не останавливаясь, чтобы разобраться с каждой функцией. Просто попробуйте разобраться в этом. Мы перейдем к функциям позже.
/****************************************************************************** Red-V Thing Plus Blinky, Minor modifications by Eduardo Corpe?o, June-9-2022 This code was originally written by: Ho Yun "Bobby" Chan and "Tron Monroe" @ SparkFun Electronics DATE: 11/21/2019 DEVELOPMENT ENVIRONMENT SPECIFICS: Firmware developed using Freedom Studio v4.18.0.2021-04-1 on Windows 10 ========== RESOURCES ========== Freedom E SDK ========== DESCRIPTION ========== Using the built-in LED. To test with different pin, simply modify the reference pin and connect a standard LED and 100Ohm resistor between the respective pin and GND. LICENSE: This code is released under the MIT License (http://opensource.org/licenses/MIT) ******************************************************************************/ #include <stdio.h> // включить библиотеку Serial #include <time.h> //включить библиотеку таймера #include <metal/gpio.h> //включить библиотеку GPIO, https://sifive.github.io/freedom-metal-docs/apiref/gpio.html // Пользовательская функция задержки записи, поскольку у нас нет такой функции, как у Arduino void delay(int number_of_microseconds){ clock_t start_time = clock(); // Сохранение времени начала // Выполнение цикла до тех пор, пока не будет достигнуто требуемое время while (clock() < start_time + number_of_microseconds); } int main (void) { printf("RED-V Example: Blink\n"); struct metal_gpio *led0; // Создайте образец GPIO // Примечание: Последовательность вызовов этих функций имеет значение! // Получите дескриптор устройства GPIO, т.е. определите вывод IC здесь, где GPIO IC = 5, вывод silkscreen = SCK/5 // это индекс устройства GPIO, ссылка на который начинается с 0, обязательно проверьте схему led0 = metal_gpio_get_device(0); // Быстрая проверка, чтобы убедиться, правильно ли мы настроили metal_gpio, была основана на примере кода "sifive-welcome.c" if (led0 == NULL) { printf("LED is null.\n"); return 1; } // Контакты устанавливаются при инициализации, поэтому мы должны отключить их, когда используем в качестве ввода / вывода metal_gpio_disable_input(led0, 5); // Установить gpio в качестве выходных данных metal_gpio_enable_output(led0, 5); // Контакты выполняют несколько функций, убедитесь, что мы отсоединяем все подключенное metal_gpio_disable_pinmux(led0, 5); // Включите вывод metal_gpio_set_pin(led0, 5, 1); while(1){ metal_gpio_set_pin(led0, 5, 0); // Выключите вывод delay(500000); // 500мс в микросекундах metal_gpio_set_pin(led0, 5, 1); // Включите вывод delay(500000); } return 0; // недостижимый код }