V0.0.1
BabyOS V8.2.3
ДЛЯ: Начинающих разработчиков микроконтроллеров или любителей открытого исходного кода
https://gitee.com/notrynohigh/BabyOS
https://gitee.com/notrynohigh/BabyOS_Example/tree/BearPi/
[TOC]
BearPi
№ | Периферия | Интерфейс | Примечание |
---|---|---|---|
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
См. пример кода в /Examples/template/
Файл проекта STM32CUBE MX находится в папке Board
Путь | Часть/все | Примечание |
---|---|---|
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/
Если файлы конфигурации скопированы в другой путь, добавьте соответствующий путь.
Включите заголовочный файл 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();
}
}
См. пример кода в /Examples/key/
Из схемы следует, что две независимые кнопки при нажатии дают низкий уровень.
Добавьте b_drv_key.c
в проект.
Поскольку модуль функциональности кнопок зависит от стороннего открытого кода, добавьте flexible_button.c
в проект.
В файле конфигурации b_config.h
включите flexible_button.
//b_hal_if.h
...
#define HAL_KEY_IF \
{B_HAL_GPIOB, B_HAL_PIN2, 0}, {B_HAL_GPIOB, B_HAL_PIN3, 0}
...
//b_device_list.h
...
B_DEVICE_REG(bKEYF1, B_DRIVER_KEY, "KEY-F1")
B_DEVICE_REG(bKEYF2, B_DRIVER_KEY, "KEY-F2")
...
① При одинарном нажатии кнопки 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();
}
}
Результат:
См. пример кода в /Examples/tft/
Из схемы следует, что аппаратный интерфейс TFT цветного экрана — SPI.
Добавьте b_drv_st7789.c
в проект.
Модуль GUI в BabyOS зависит от стороннего открытого кода, добавьте ugui.c
в проект.
В файле b_config.h
включите UGUI.
//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}, \
}
//b_device_list.h
B_DEVICE_REG(bTFT, B_DRIVER_ST7789, "tft")
① Каждые 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 */
}
}
Результат:
См. пример кода в /Examples/spiflash/
Из схемы следует, что аппаратный интерфейс SPIFLASH — QSPI.
Добавьте b_drv_spiflash.c
в проект.
SPIFLASH зависит от стороннего открытого кода sfud, добавьте код из пути BabyOS/bos/drivers/sfud в проект.
//b_hal_if.h
#define HAL_SPIFLASH_IF \
{ \
.is_spi = 0, ._if._qspi = B_HAL_QSPI_1, \
}
//b_device_list.h
B_DEVICE_REG(bSPIFLASH, B_DRIVER_SPIFLASH, "spiflash")
① Запись количества запусков системы
//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, ¶m);
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 */
}
}
Результат:
См. пример кода в /Examples/tfcard/
Из схемы следует, что TF-карта использует SDIO.
Добавьте b_drv_sd.c
в проект.
В файле b_config.h
настройте использование FatFS и добавьте сторонний открытый код FatFS в проект.
//b_hal_if.h
#define HAL_SD_IF \
{ \
.is_spi = 0, ._if._sdio = B_HAL_SDIO_1, \
}
//b_device_list.h
B_DEVICE_REG(bSD, B_DRIVER_SD, "tf-card")
① Использование файла для записи количества запусков системы
//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 */
}
}
Результат:
См. пример кода в /Examples/wifi/
Из схемы следует, что Wi-Fi использует LPUART1.
Добавьте b_drv_esp12f.c
в проект.
Добавьте одну кнопку для входа в режим настройки сети и добавьте b_drv_key.c
в проект.
В файле b_config.h
включите b_mod_wifi.
Пример включает переключение состояний. В файле b_config.h
включите модуль функциональности конечных автоматов.
//b_hal_if.h
#define HAL_ESP12F_IF B_HAL_LPUART_1
//b_device_list.h
B_DEVICE_REG(bESP12F, B_DRIVER_ESP12F, "WiFi")
B_DEVICE_REG(bKEYF1, B_DRIVER_KEY, "KEY-F1")
① При отсутствии подключения периодически отправляйте 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 */
}
}
Результат:
См. пример кода по адресу 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 )