1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/notrynohigh-BabyOS_Example

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Базовый пример использования BabyOS на плате BearPi

V0.0.1

BabyOS V8.2.3

notrynohigh@outlook.com

ДЛЯ: Начинающих разработчиков микроконтроллеров или любителей открытого исходного кода

https://gitee.com/notrynohigh/BabyOS

https://gitee.com/notrynohigh/BabyOS_Example/tree/BearPi/

[TOC]

Платформы аппаратного и программного обеспечения

BearPi

2119fd4ba4b5cc4a

Периферия Интерфейс Примечание
1 Экран (ST7789) SPI2
2 SPIFLASH (W25Q64) QSPI
3 Кнопки (K1, K2) GPIO PB2 / PB3
4 Wi-Fi (ESP12F) LPUART
5 TF-карта SDIO

Модуль ESP12F на плате BearPi, если заводская прошивка не поддерживает MQTT, можно обновить прошивку по следующей ссылке:

https://docs.ai-thinker.com/固件汇总 MQTT透传AT固件 (固件号:1112)

BabyOS

Адрес репозитория: https://gitee.com/notrynohigh/BabyOS

Рекомендуется использовать ветку master.

Если вы являетесь любителем открытого исходного кода и хотите внести свой вклад в репозиторий BabyOS, используйте ветку dev.

Руководство пользователя BabyOS

https://gitee.com/notrynohigh/BabyOS/blob/master/doc/

STM32CUBE MX

Скачать программу: https://www.st.com/zh/development-tools/stm32cubemx.html

Руководство по STM32L41XX

https://www.st.com/resource/en/reference_manual/rm0394-stm32l41xxx42xxx43xxx44xxx45xxx46xxx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf

Создание базового проекта

См. пример кода в /Examples/template/

  1. Используйте программу STM32CUBE MX для настройки и генерации базового проекта

Файл проекта STM32CUBE MX находится в папке Board

stm32cubemx

  1. Добавьте код BabyOS
Путь Часть/все Примечание
bos/algorithm По необходимости добавить Временно не добавляйте файлы
bos/core Все добавить Добавить все
bos/drivers По необходимости добавить Временно не добавляйте файлы
bos/hal Все добавить Добавить все
bos/mcu По необходимости добавить Добавить код из пути bos/mcu/st/stm32l41x
bos/modules Все добавить Добавить все
bos/thirdparty По необходимости добавить Временно не добавляйте файлы
bos/utils Все добавить Добавить все
bos/_config b_config.h — глобальный файл конфигурации
b_device_list.h — файл регистрации устройств
b_hal_if.h — файл интерфейсов драйверов

Компилятору нужно добавить два пути:

bos/

_config/ Если файлы конфигурации скопированы в другой путь, добавьте соответствующий путь.

  1. Вызов необходимых функций BabyOS

Включите заголовочный файл b_os.h

① Вызов функции прерывания таймера bHalIncSysTick();

// stm32l4xx_it.c
#include "b_os.h"
void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  /* USER CODE BEGIN SysTick_IRQn 1 */
  bHalIncSysTick();
  /* USER CODE END SysTick_IRQn 1 */
}

② Вызов bInit(); bExec();

//main.c
#include "b_os.h"
int main()
{
    ...
    bInit();
    while(1)
    {
 		bExec();       
    }
}

Независимые кнопки F1 F2

См. пример кода в /Examples/key/

key_sch

Из схемы следует, что две независимые кнопки при нажатии дают низкий уровень.

  1. Добавьте файл драйвера

Добавьте b_drv_key.c в проект.

  1. Добавьте сторонний код flexible_button

Поскольку модуль функциональности кнопок зависит от стороннего открытого кода, добавьте flexible_button.c в проект.

В файле конфигурации b_config.h включите flexible_button.

  1. Добавьте аппаратные интерфейсы кнопок
//b_hal_if.h
...
#define HAL_KEY_IF                                           \
    {B_HAL_GPIOB, B_HAL_PIN2, 0}, {B_HAL_GPIOB, B_HAL_PIN3, 0}
...
  1. Зарегистрируйте устройства
//b_device_list.h
...
B_DEVICE_REG(bKEYF1, B_DRIVER_KEY, "KEY-F1")
B_DEVICE_REG(bKEYF2, B_DRIVER_KEY, "KEY-F2")    
...
  1. Напишите пример

① При одинарном нажатии кнопки F1 выводится "hello BabyOS"

② При одинарном нажатии кнопки F2 выводится "hello BearPi"

③ При двойном нажатии кнопки F2 выводится "hello BabyOS BearPi"

//main.c

static void _KeyEventHandler(uint32_t dev_no, uint8_t sub_id, uint16_t event, uint8_t param)
{
    if(dev_no == bKEYF1)
    {
        b_log("hello babyos \r\n");
    }
    else
    {
        if(event == BTN_EVENT_CLICK)
        {
            b_log("hello BearPi\r\n");
        }
        else
        {
            b_log("hello babyos BearPi\r\n");
        }
    }
}

int main()
{
    ...
    /* USER CODE BEGIN 2 */
    bInit();
    /* USER CODE END 2 */
    bBUTTON_ADD_KEY(bKEYF1, BTN_EVENT_CLICK, _KeyEventHandler);
    bBUTTON_ADD_KEY(bKEYF2, BTN_EVENT_CLICK | BTN_EVENT_DOUBLE_CLICK, _KeyEventHandler); 
    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    
    while (1)
    {
        bExec();    
    }
}

Результат:

key_result

TFT цветной экран

См. пример кода в /Examples/tft/

tft_sch

Из схемы следует, что аппаратный интерфейс TFT цветного экрана — SPI.

  1. Добавьте файл драйвера

Добавьте b_drv_st7789.c в проект.

  1. Добавьте файлы GUI

Модуль GUI в BabyOS зависит от стороннего открытого кода, добавьте ugui.c в проект.

В файле b_config.h включите UGUI.

  1. Добавьте аппаратные интерфейсы
//b_hal_if.h
#define HAL_ST7789_IF                                        \
    {                                                        \
        .if_type = 2,                                        \
        ._if._spi._spi =                                     \
            {                                                \
                .is_simulation = 0,                          \
                .cs            = {B_HAL_GPIOC, B_HAL_PIN13}, \
                ._if.spi       = B_HAL_SPI_2,                \
            },                                               \
        ._if._spi.rs = {B_HAL_GPIOC, B_HAL_PIN6},            \
    }
  1. Зарегистрируйте устройства
//b_device_list.h
B_DEVICE_REG(bTFT, B_DRIVER_ST7789, "tft")
  1. Напишите пример

① Каждые 5 секунд генерируются случайные координаты и отображается "BabyOS BearPi"

//main.c

static void _TestTFT()
{
    static uint32_t t = 0;
    uint16_t        x = 0, y = 0;
    srand(t++);
    x = rand() % (240 - 120);
    srand(t++);
    y = rand() % (320 - 16);
    b_log("x: %d y: %d\r\n", x, y);
    UG_PutString(x, y, "BabyOS BearPi");
}

int main()
{
    ...
    bInit();
    /* USER CODE END 2 */
    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    bGUI_ADD_DEVICE(bTFT, NULL, 240, 320, 0);
    UG_FillScreen(C_RED);
    while (1)
    {
        bExec();
        BOS_PERIODIC_TASK(_TestTFT, 5000);
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
    }
    
}

Результат:

tft_resulttft_result2

SPIFLASH

См. пример кода в /Examples/spiflash/

spiflash_sch

Из схемы следует, что аппаратный интерфейс SPIFLASH — QSPI.

  1. Добавьте файл драйвера

Добавьте b_drv_spiflash.c в проект.

SPIFLASH зависит от стороннего открытого кода sfud, добавьте код из пути BabyOS/bos/drivers/sfud в проект.

  1. Добавьте аппаратные интерфейсы
//b_hal_if.h
#define HAL_SPIFLASH_IF                         \
    {                                           \
        .is_spi = 0, ._if._qspi = B_HAL_QSPI_1, \
    } 
  1. Зарегистрируйте устройства
//b_device_list.h
B_DEVICE_REG(bSPIFLASH, B_DRIVER_SPIFLASH, "spiflash")
  1. Напишите пример

① Запись количества запусков системы

//main.c

static void _TestSpiflash()
{
    int fd = -1;
    uint32_t boot[2];
    fd = bOpen(bSPIFLASH, BCORE_FLAG_RW);
    if(fd < 0)
    {
        return;
    }
    bLseek(fd, 0);
    bRead(fd, (uint8_t *)boot, sizeof(boot));
    if(boot[0] != 0x12345678)
    {
        boot[0] = 0x12345678;
        boot[1] = 1;
    }
    else
    {
        boot[1] += 1;
    }
    b_log("boot: %d\r\n", boot[1]);
    
    bFlashErase_t param = {0, 1};
    bCtl(fd, bCMD_ERASE_SECTOR, &param);
    bLseek(fd, 0);
    bWrite(fd, (uint8_t *)boot, sizeof(boot));
    bClose(fd);
}

int main()
{
    ...
    bInit();
    _TestSpiflash();
    /* USER CODE END 2 */
    /* Infinite loop */
    /* USER CODE BEGIN WHILE */

    while (1)
    {
        bExec();
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
    }
    
}

Результат:

spiflash_result

TF-карта

См. пример кода в /Examples/tfcard/

tf_sch

Из схемы следует, что TF-карта использует SDIO.

  1. Добавьте файл драйвера

Добавьте b_drv_sd.c в проект.

В файле b_config.h настройте использование FatFS и добавьте сторонний открытый код FatFS в проект.

  1. Добавьте аппаратные интерфейсы
//b_hal_if.h
#define HAL_SD_IF                               \
    {                                           \
        .is_spi = 0, ._if._sdio = B_HAL_SDIO_1, \
    }
  1. Зарегистрируйте устройства
//b_device_list.h
B_DEVICE_REG(bSD, B_DRIVER_SD, "tf-card")
  1. Напишите пример

① Использование файла для записи количества запусков системы

//main.c
int main()
{
    ...
    bInit();
    /* USER CODE END 2 */
    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    bFS_Init();
    bFS_Test();
    while (1)
    {
        bExec();
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
    }  
}

Результат:

tf_result

Wi-Fi-MQTT

См. пример кода в /Examples/wifi/

wifi_sch

Из схемы следует, что Wi-Fi использует LPUART1.

  1. Добавьте файл драйвера

Добавьте b_drv_esp12f.c в проект.

Добавьте одну кнопку для входа в режим настройки сети и добавьте b_drv_key.c в проект.

В файле b_config.h включите b_mod_wifi.

Пример включает переключение состояний. В файле b_config.h включите модуль функциональности конечных автоматов.

  1. Добавьте аппаратные интерфейсы
//b_hal_if.h
#define HAL_ESP12F_IF B_HAL_LPUART_1  
  1. Зарегистрируйте устройства
//b_device_list.h
B_DEVICE_REG(bESP12F, B_DRIVER_ESP12F, "WiFi")
B_DEVICE_REG(bKEYF1, B_DRIVER_KEY, "KEY-F1")
  1. Напишите пример

① При отсутствии подключения периодически отправляйте ping на www.baidu.com

② При подключении подписывайтесь на тему baby и каждую минуту публикуйте сообщение на тему os

③ Долгое нажатие кнопки F1 для входа и выхода из режима настройки сети.

Формат настройки сети: ssid:notrynohigh passwd:11223344

ssid: notrynohigh

passwd:11223344

//main.c
//Обработчик событий кнопки, вызывается при долгом нажатии F1 для настройки сети
static void _ButtonEventHandler(uint32_t dev_no, uint8_t sub_id, uint16_t event, uint8_t param)
{
    if(dev_no == bKEYF1)
    {
        if(event == BTN_EVENT_LONG)
        {   
            bStateInvokeEvent(EVENT_CFG_NET, NULL);
        }
    }
}

//Обработка данных LPUART1 и передача их в b_util_uart
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart == &hlpuart1)
    {
        bUtilUartRxHandler2(B_HAL_LPUART_1, sgUartData);
        HAL_UART_Receive_IT(&hlpuart1, &sgUartData, 1);
    }
}

int main()
{
    ...
    bInit();
    bWifiInit();
    /* USER CODE END 2 */
    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    bBUTTON_ADD_KEY(bKEYF1, BTN_EVENT_LONG, _ButtonEventHandler);
    bStateTransfer(STATE_OFFLINE);   //Начальное состояние — отсутствие подключения
    HAL_UART_Receive_IT(&hlpuart1, &sgUartData, 1);
    phandle = bWifiUp(bESP12F, bWifiEventHandle);
    if (phandle == NULL)
    {
        b_log("handle invalid...\r\n");
    }
    bStateTransfer(STATE_OFFLINE);
    if (phandle)
    {
        bStateInvokeEvent(EVENT_WIFI_INIT, phandle);
    }
    while (1)
    {
        bExec();
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
    } 
}

Результат:

wifi_result1

wifi_result2

wifi_result3

Обновление прошивки IAP

См. пример кода по адресу https://gitee.com/notrynohigh/BabyOS_Example/tree/BearPi-IAP/

Обновление прошивки использует модуль IAP из BabyOS.

Протокол передачи файлов — проприетарный протокол BabyOS.

Документация по IAP:

https://gitee.com/notrynohigh/BabyOS/wikis/

Программа для обновления прошивки с верхнего уровня:

https://gitee.com/notrynohigh/BabyOS_Protocol


Заключение

Добро пожаловать всем начинающим разработчикам микроконтроллеров для быстрого ознакомления с функциональностью MCU с помощью BabyOS.

Добро пожаловать всем любителям открытого исходного кода для совместной работы над проектом BabyOS.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/notrynohigh-BabyOS_Example.git
git@api.gitlife.ru:oschina-mirror/notrynohigh-BabyOS_Example.git
oschina-mirror
notrynohigh-BabyOS_Example
notrynohigh-BabyOS_Example
BearPi