Набір для розробки програмного забезпечення RASPBERRY PI

У статті наведена коротка інформація про склад бібліо­тек Raspberry Pi Pico, призначених для використання як у невбудованих, так і в вбудованих системах Інтернету речей.

В. Макаренко

Огляд Raspberry Pi Pico SDK

Набір для розробки програмного забезпечення Raspberry Pi Pico SDK (Software Development Kit), на­далі SDK, надає заголовки, бібліотеки та систему збірки, необхідні для написання програм для мікро- контролерних пристроїв серії RP, таких як Raspberry Pi Pico, на C, C++ або мові асемблера. Пакет SDK створено для надання API (інтерфейсу прикладного програмування) та середовища програмування, яке знайоме як розробникам невбудованих, так і роз­робникам вбудованих систем.

Основні можливості SDK

Одна програма одночасно виконується на при­строї за допомогою звичайного методу main(). Стандартні бібліотеки C/C++ підтримуються разом із API для доступу до апаратного забезпечення мік- роконтролера, включаючи DMA, IRQ, а також різно­манітних периферійних пристроїв з фіксованими функціями та PIO (програмований ввід-вивід).

Бібліотеки високого рівня

Крім того, SDK надає бібліотеки вищого рівня для роботи з таймерами, USB, синхронізацією та багатоядерним програмуванням, а також додаткову функціональність високого рівня, побудовану за до­помогою PIO, наприклад аудіо. SDK можна викори­стовувати для створення чого завгодно: від простих додатків або повноцінних середовищ виконання, та­ких як MicroPython, до низькорівневого програмного забезпечення, такого як сам завантажувач мікро- контролера на чіпі.

Система збірки CMake

SDK використовує CMake для керування збір­кою. CMake широко підтримується IDE (інтегрованим середовищем розробки) і дозволяє просто вказати збірку (через файли CMakeLists.txt), з яких CMake може створити систему збірки (для ви­користання make, ninja або іншими інструментами збірки), налаштовану для платформи та будь-яких змінних конфігурації, які вибере розробник.

Переваги CMake

Крім того, що CMake є широко використовува­ною системою збирання для розробки на C/C++, CMake є фундаментальною для структури SDK, а та­кож для конфігурації та створення програм.

SDK створює виконуваний файл, який включає весь код, необхідний для роботи на пристрої (окрім конкретного пристрою з плаваючою комою та іншо­го оптимізованого коду, що міститься в bootrom мік- роконтролера).

Структура SDK

Розглянемо документацію до SDK для різних за­стосувань. Структура SDK наведена на рис. 1.

Рис. 1. Структура Pico C SDK 

Апаратні API-інтерфейси (Hardware APIs)

Ця група бібліотек забезпечує тонкий та ефек­тивний інтерфейс прикладного програмування C (API) / абстракції для доступу до апаратного забез­печення мікроконтролерів серії RP без необхідності прямого читання та запису апаратних регістрів. В табл. 1 наведено склад бібліотек API для доступу до апаратного забезпечення мікроконтролерів

API високого рівня 

Ця група бібліотек забезпечує функціональність вищого рівня, не пов’язану з апаратним забезпечен­ням, або надає більш багатий набір функціональних можливостей, що виходять за рамки базових апа­ратних інтерфейсів.

Таблиця 1. Склад бібліотек API для доступу до апаратного забезпечення мікроконтролерів

Бібліотека Призначення бібліотеки
hardware_adc АЦПAnalog to Digital Converter (ADC) API.
hardware_base Низькорівневі типи і засоби доступу до апаратних регістрів, що відображаються в пам’яті.
hardware_claim Спрощене управління апаратними ресурсами АРІ.
hardware_clocks Управління годинником АРІ.
hardware_divider RP2040 низькорівневий апаратний дільник частоти АРІ. Платформи, що не належать до RP2040, надають версії програмного забезпечення для всіх функцій.
hardware_dcp Макроси збірки для подвійного співпроцесора RP2350.
hardware_dma Контролер прямого доступу до па м’яті (DMA) АРІ.
channel_con fig Конфігурація каналу DMA.
hardware_exception Методи налаштування обробників винятків процесора.
hardware_flash Низькорівневе програмування flash і стирання АРІ.
hardware_gpio Введення / виведення загального призначення (GPIO) АРІ.
hardware_hazard3 Аксесуари для автомобілів RISCV, що відповідають вимогам стандарту Hazard3, і вбудовані компоненти для призначених для користувача інструкцій по Hazard 3. RP2350
hardware_i2c

hardwarejnterp

І2С контролер АРІ.

Апаратний інтерполятор АРІ.

interp_con fig Конфігурація інтерполятора.
hardwarejrq Обробка апаратних переривань АРІ.
hardware_pio Програмоване введення-виведення (РІО) АРІ.
sm_con fig Конфігурація кінцевого автомата РІО.
piojnstructions Кодування команд РІО.
hardware_pll API-інтерфейси управління контуром фазового автопідстроювання частоти.
hardware_powman Управління живленням API. RP2350
hardware_pwm АРІ апаратної широтно-імпульсної модуляції (ШІМ).
hardware_resets АРІ апаратного скидання.
hardware_riscv Засоби доступу до стандартного обладнання RISCV (переважно CSR) RP2350
hardware_riscv_platform_ timer Аксесуари для стандартного таймера платформи RISCV (mtime/mtimecmp), доступні на мікроконтролерах Raspberry Pi з процесорами RISCV. RP2350
hardware_rtc Апаратний АРІ годинника реального часу. RP2040
hardware_rcp Вбудовані функції і макроси збірки для співпроцесора з надмірністю. RP2350
hardware_spi Апаратний SPI АРІ.
hardware_sha256 АРІ апаратного прискорювача SHA-256. RP2350
hardware_sync Низькорівневі апаратні спін-блокування, бар’єрні інтерфейси та інтерфейси обробки подій.
hardware_ticks Апаратні відмітки АРІ.
hardware_timer Низькорівневий АРІ апаратного таймера.
hardware_uart Апаратний UART АРІ.
hardware_vreg АРІ для регулювання напруги.
hardware_watchdog АРІ апаратного сторожового таймера.
hardware_xosc АРІ кварцового генератора (XOSC).

В табл. 2 наведено склад бібліотек API високого рівня.

Таблиця 2. Склад бібліотек API високого рівня

Бібліотека Призначення бібліотеки
рісо aon timer Абстракція високого рівня “Завжди ввімкнено таймер”.
pico_async_context async_context надає логічно однопотоковий контекст для виконання роботи та реагування на асинхронні події. Таким чином, екземпляр async_context підходить для обслуговування сторонніх бібліотек, які не є реентерабельними.
async_context_freertos async_context_freertos забезпечує реалізацію async_context, яка обробляє асинхронну роботу в окремому завданні FreeRTOS.
async_context_poll async_context_poll забезпечує реалізацію async_context, яка призначена для використання з простим циклом опитування на одному ядрі. Це небезпечно для потоків.
async_context_threadsafe_background async_context_threadsafe_background забезпечує реалізацію async_context, яка регулює асинхронну роботу в IRQ з низьким пріоритетом, і користувачеві не потрібно опитувати роботу.
pico_bootsel_via_double_reset Додаткова підтримка для швидкого подвійного скидання системи при переході в режим початкового завантаження.
pico flash Високорівневий flash АРІ.
pico_i2c_slave Функції, що забезпечують керований перериваннями ведений інтерфейс І2С.
pico_multicore Додана підтримка запуску коду на другому процесорному ядрі (core 1) і взаємодії з ним.
fifo Функції для міжядерних FIFO.
doorbell Функції, пов’язані з дверними дзвінками, які ядро може використовувати для надсилання запитів IRQ собі або іншому ядру.
lockout Функції, що дозволяють одному ядру змусити інше ядро призупинити виконання у відомому стані.
pico rand АРІ генератора випадкових чисел.
pico sha256 Апаратно прискорена реалізація SHA-256. RP2350
pico_stdlib Об’єднання основної підмножини бібліотек Raspberry Pi Pico SDK, що використовуються більшістю виконуваних файлів, а також деяких додаткових корисних методів.
pico sync Примітиви синхронізації та взаємне виключення.
critical_section АРІ критичної секції для короткочасного взаємного виключення, безпечний для IRQ і багатоядерних систем.
lock core Базова підтримка примітивів синхронізації / блокування.
mutex Mutex АРІ для взаємного виключення без IRQ між ядрами.
sem Семафорний АРІ для обмеження доступу до ресурсу.
pico_time АРІ для точних міток часу, сплячого режиму та зворотних викликів на основі часу.
timestamp Функції часових міток, що відносяться до моментів часу (включаючи поточний час).
sleep Функції сплячого режиму для затримки виконання при зниженому енергоспоживанні.
alarm Функції сигналізації для планування майбутнього виконання.
repeating_timer Функції повторюваного таймера для простого планування повторного виконання.
pico_ unique, jd Унікальний АРІ доступу до ідентифікатора пристрою.
рісо util Корисні структури даних і службові функції.
datetime Форматування дати і часу.
pheap Реалізація спряженої пари.
queue Реалізація багатоядерної та IRQ-безпечної черги.

 

Сторонні бібліотеки (Third-party Libraries)

Сторонні бібліотеки для реалізації високорівневої функціональності. Склад сторонніх бібліотек наведено в табл. 3.

Таблиця 3. Склад сторонніх бібліотек

Бібліотека Призначення бібліотеки
tinyusb device Підтримка режиму мініатюрного USB-пристрою для RP2040. Веб-сайт із документацією TinyUSB можна знайти за посиланням.
tinvusb host Підтримка режиму хосту TinyUSB для RP2040.

Мережеві бібліотеки (Networking Libraries)

Функції для реалізації мережевої взаємодії наведені в табл. 4.

Таблиця 4. Склад мережевих бібліотек

Бібліотека Призначення бібліотеки
рісо btstack Бібліотеки інтеграції / оболонки для BTStack, документація щодо яких знаходиться за посиланням.
picojwip Бібліотеки інтеграції / оболонки для Lightweight IP (IwlP) стеку, документація щодо яких знаходиться за посиланням.
pico_lwip_arch Адаптери компілятора LwlP. За замовчуванням вони не включені в picojwip, на випадок, якщо ви хочете реалізувати власні.
pico Iwip freertos Бібліотека Glue для інтеграції Iwip в режимі NO SYS=0 з SDK.
pico Iwip nosys Бібліотека Glue для інтеграції Iwip в режимі NO SYS=1 з SDK.
pico_cyw43_driver Оболонка для cyw43_driver нижчого рівня, яка інтегрує його з pico_async_context для виконання фонової роботи.
pico btstack cyw43 Низькорівнева підтримка Bluetooth НСІ.
pico_cyw43_arch Архітектура для інтеграції драйвера CYW43 (для безброводової мережі на PicoW) та Iwip (для стека TCP/IP) у SDK. Це також потрібно для доступу до вбудованого світлодіода на Pico W.
cyw43 driver Драйвер, який використовується для безброводового зв’язку Pico W.
cyw43_ JI Низькорівневий інтерфейс драйвера CYW43.

Інфраструктура часу виконання (Runtime Infrastructure) 

Бібліотеки, які використовуються для забезпечення ефективної реалізації певних функцій на рівні мови та бібліотеки C, а також бібліотеки інтерфейсу CMake, що абстрагують етапи компіляції та посилання в SDK. Склад бібліотек інфраструктури часу наведено в табл. 5.

Зовнішні заголовки API (External API Headers)

Заголовки для інтерфейсів, які спільно використовуються з кодом за межами SDK. Склад бібліотек заголов­ків для інтерфейсів, які спільно використовуються з кодом за межами SDK наведено в табл. 6.

Таблиця 5. Склад бібліотек інфраструктури часу

Бібліотека Призначення бібліотеки
boot stage2 Завантажувачі другого етапу відповідають за Налаштування зовнішньої флеш-пам’яті.
pico atomic Допоміжні реалізації для С11 atomics.
pico base Основні типи та макроси для Raspberry Pi Pico SDK.
pico_binary_info Двійкова інформація призначена для вбудовування машиночитаної інформації у двійковий файл у FLASH.
pico bootrom Доступ до функцій та даних у нижній частині екрана.
pico bit ops Оптимізовані функції маніпулювання бітами.
pico_cxx_options Бібліотека, не пов’язана з кодом, яка керує параметрами компілятора, пов’язаними з C++
pico_clib_interface Надає необхідний код зв’язку, необхідний для конкретного використовуваного середовища виконання С / C++.
pico crtO Надає сценарії компоновщика за замовчуванням і точку входу/виходу з програми.
pico_divider Оптимізовані функції 32-і 64-розрядного ділення частоти, прискорені апаратним дільником частоти RP2040.
pico double Оптимізовані функції з плаваючою комою подвійної точності.
pico float Оптимізовані функції з плаваючою комою одинарної точності.
pico Int64 ops Оптимізовано реалізації заміни вбудованого в компілятор 64-бітного множення.
pico malloc Багатоядерний захист для malloc, саііос і free.
pico_mem_ops Надає оптимізовані реалізації заміни вбудованих в компілятор memcpy, memset і пов’язаних з ними функцій.
pico_platform Макроси та визначення (і функції, якщо вони не включені в асемблерний код) для пристроїв / архітектури сімейства RP2, щоб забезпечити загальну абстракцію від специфіки компілятора / платформи низького рівня.
pico printf Компактна Заміна printf на Marco Paland (infoO.oaland.com)
pico_runtime Основна підтримка середовища виконання для запуску попередніх основних ініціалізаторів, що надаються іншими бібліотеками.
pico_runtime_init Основні функції ініціалізації середовища виконання, необхідні для налаштування середовища виконання перед входом в main.
pico_stdio Індивідуальна підтримка studio, що дозволяє здійснювати введення і виведення даних з UART, USB, напів-хостингу і т. д.
pico_stdio_semihosting Експериментальна підтримка стандартного виводу з використанням напівгостингу оперативної пам’яті.
pico stdio uart Підтримка стандартного вводу / виводу за допомогою UART.
pico stdio rtt Підтримка стандартного вводу / виводу за допомогою SEGGER RTT.
pico stdio usb Підтримка стандартного введення / виводу по послідовному USB (CDC).
pico_standard_binary_info Містить інформацію про двійковий файл за замовчуванням, який можна відобразити за допомогою Pico tool.
pico_standard_link Містить інформацію про двійковий файл за замовчуванням, який СА налаштував для параметрів прив’язки до стандартного виконуваного файлу SDK.

Таблиця 6. Склад бібліотек заголовків для інтерфейсів, які спільно використовуються з кодом за межами SDK

Бібліотека Призначення бібліотеки
boot oicobin headers Константи для формату PICO bin.
boot picoboot headers Файл заголовка для USB-інтерфейсу РІСОВООТ, що надається чіпом RP2xxx в режимі початкового завантаження.
boot uf2 headers Файл заголовка для формату UF2, підтримуваного мікросхемою RP2xxx в режимі BOOTS EL.
pico usb reset interface headers Визначення інтерфейсу скидання, який може бути наданий бібліотекою pico stdio usb.

Розглянемо склад однієї з апаратних бібліотек API.

АЦП – Analog to Digital Converter (ADC)

Мікроконтролери серії RP мають внутрішній ана­лого-цифровий перетворювач послідовних набли­жень (АЦП) з такими функціями:

  • частота дискретизації 500 кГц (з використан­ням незалежного годинника 48 МГц)
  • ефективне число бітів (ENOB) у 12 біт АЦП

RP2040 8.7, у RP2350 – 9.2

  • 5 мультиплексованих входів у RP2040:
  • 4 входи, які доступні на виводах спільних з GPIO
  • 1 вхід призначений для внутрішнього датчика температури
  • 4 елемент отримує вибірку FIFO
  • мультиплексор RP2350 з 5 або 9 входами:
  • 4 входи доступні на виводах у корпусі QFN- 60, які спільно використовуються з GPIO
  • 8 входів, доступних на виводах у корпусі QFN- 80, спільних з GPIO
  • 8 елемент отримує вибірку FIFO
  • генерація переривань
  • інтерфейс

Хоча існує лише один АЦП, ви можете вказати вхідні дані для нього за допомогою функції adc_se- lect_input(). У циклічному режимі (adc_set_round_ro- bin()) АЦП використовуватиме цей вхід і переходить до наступного після читання.

RP2040, RP2350 у корпусі QFN-60:

  • входи АЦП користувача 0-3 знаходяться на GPIO 26-29
  • датчик температури знаходиться на вході

RP2350 у корпусі QFN-80:

  • входи АЦП користувача 0-7 знаходяться на GPIO 40-47
  • датчик температури знаходиться на вході

Значення датчика температури можна приблиз­но виразити в градусах Цельсія як:

T = 27 – (ADC_Voltage – 0,706)/0,001721.

На рис. 2 наведено приклад коду для роботи з АЦП. При роботі з джерелом можна отримати приклад у вигляді тексту. Для цього потрібно натис­нути на стрілочку у правому верхньому куті прикладу (рис. 3).

Рис. 3. Натиснувши на стрілочку, отримаємо приклад у вигляді тексту

Рис. 2. Приклад коду для роботи з АЦП

Фрагмент отриманого тектсу наведений нижче.

#include <stdio.h>

#include “pico/stdlib.h”

#include “hardware/gpio.h”

#include “hardware/adc.h”

int main() {

stdio_init_all();

printf(“ADC Example, measuring GPIO26\n”);

adc_init();

Функції АЦП

void adc_init (void)

Ініціалізуємо апаратне забезпечення АЦП.

static void adc_gpio_init (uint gpio)

Ініціалізуємо gpio для використання в якості ви­воду АЦП.

static void adc_select_input (введення користувачем)

Вибір вхідного каналу АЦП.

static uint adc_get_selected_input (void)

Повертає поточний вибраний канал введення АЦП.

static void adc_set_round_robin (uint input_mask)

Перемикач циклічної вибірки.

static void adc_set_temp_sensor_enabled (bool en­able)

Вмикаємо вбудований датчик температури.

static uint16_t adc_read (void)

Виконуємо одноразове перетворення.

static void adc_run (bool run)

Вмикаємо або вимикаємо режим дискретизації в автономному режимі.

static void adc_set_clkdiv (float clkdiv)

Встановлюємо дільник тактової частоти АЦП.

static void adc_fifo_setup (bool en, bool dreq_en, uint16_t dreq_thresh, bool err_in_fifo, bool byte_shift)

Налаштовуємо FIFO АЦП.

static bool adc_fifo_is_empty (void) Перевіряємо чи стан FIFO порожній.

static uint8_t adc_fifo_get_level (void) Отримуємо кількість записів в FIFO АЦП.

static uint16_t adc_fifo_get (void)

Отримуємо результат перевірки АЦП з FIFO.

static uint16_t adc_fifo_get_blocking (void) Очікуємо появу даних в АЦП FIFO.

static void adc_fifo_drain (void)

Розрядіть FIFO АЦП.

static void adc_irq_set_enabled (bool enabled) Вмикаємо / вимикаємо переривання АЦП.

Приклади використання Raspberry Pi наведені за посиланням. У прикладах наведено детальний опис

Latest news

Надтонкі джерела живлення MEAN WELL серії XDR: потужністю до 960 Вт
ALL NEWS

Надтонкі джерела живлення MEAN WELL серії XDR: потужністю до 960 Вт

ПЛК MEAN WELL PLC-DPLC-32MT/ET для промислової автоматизації
Brands

ПЛК MEAN WELL PLC-DPLC-32MT/ET для промислової автоматизації

Двонаправлені перетворювачі MEAN WELL BIC-5K 5 кВт
Brands

Двонаправлені перетворювачі MEAN WELL BIC-5K 5 кВт

Інтелектуальні системи живлення 1–18 кВт на базі AC/DC-перетворювачів MEAN WELL серії RCP
Brands

Інтелектуальні системи живлення 1–18 кВт на базі AC/DC-перетворювачів MEAN WELL серії RCP

VD MAIS стає членом Global Electronics Association
VD MAIS

VD MAIS стає членом Global Electronics Association

Mean Well SHP — промислові джерела живлення великої потужності (10–30 кВт)
Brands

Mean Well SHP — промислові джерела живлення великої потужності (10–30 кВт)