學習單片機和嵌入式開發?這個項目是你入坑的不二之選

MCU,中文簡稱單片機。即將 CPU、存儲器(RAM和ROM)、多種 I/O 接口等集成在一片芯片上,形成的芯片級計算機。 到目前爲止,中國的單片機應用和嵌入式系統開發走過了二十餘年的歷程,隨着物聯網的興起,單片機和嵌入式開發逐漸受到越來越多的關注。

今天推薦的這個開源項目就是專爲MCU項目開發提速的代碼框架,也是剛剛入選 GVP 的項目,一起來學習一下吧!

項目名稱:BabyOS

項目作者:bean

開源許可協議:MIT

項目地址:https://gitee.com/notrynohigh/BabyOS

 

項目簡介

BabyOS 適用於 MCU 項目,她是一套管理功能模塊和外設驅動的框架。

對項目而言,縮短開發週期。項目開發時選擇適用的功能模塊及驅動。直接進入功能代碼編寫的階段。

對工程師而言,減少重複工作。調試過的功能模塊和驅動代碼放入 BabyOS 中進行管理,以後項目可以直接使用,去掉重複調試的工作。

 

適用項目

使用裸機開發的項目推薦基於BabyOS進行,使用操作系統開發的項目,BabyOS可作爲功能庫及驅動庫使用。

 

使用方法

添加文件

bos/core/ 核心文件全部添加至工程

bos/config/ 配置文件及設備列表文件,全部添加至工程

bos/driver/ 選擇需要的驅動添加至工程,將b_hal.h內定義的硬件接口取消註釋

bos/hal/hal/ 硬件抽象層,將需要的文件添加至工程,根據具體平臺進行修改

bos/hal/utils/ 底層實用代碼,全部添加至工程

bos/modules/ 功能模塊,全部添加至工程

bos/algorithm/ 實用算法,選擇需要的添加至工程

bos/thirdparty/ 第三方開源代碼,將需要的添加至工程

增加系統定時器

例如使用滴答定時器,中斷服務函數調用:void bHalIncSysTick(void);

注:定時器的週期與b_config.h裏_TICK_FRQ_HZ要匹配

選擇功能模塊

b_config.h進行配置,根據自己的需要選擇功能模塊。

註冊設備

//           設備        驅動          描述
B_DEVICE_REG(W25QXX, bW25X_Driver, "flash")
//如果沒有註冊任何設備,取消B_DEVICE_REG(null, bNullDriver, "null")的註釋    
//B_DEVICE_REG(null, bNullDriver, "null")  

 

使用範例

以b_kv功能模塊爲例,先在b_config裏面使用b_kv。

取消硬件接口的註釋

b_hal.h中取消如下部分的註釋,並根據實際連接圖修改GPIO和SPI號。

#define HAL_W25X_SPI                    B_HAL_SPI_2
#define HAL_W25X_CS_PORT                B_HAL_GPIOB             
#define HAL_W25X_CS_PIN                 B_HAL_PIN12

修改硬件抽象層b_hal_spi.c內SPI的操作(依賴硬件平臺,使用STM32 HAL庫爲例)

void bHalGPIO_WritePin(uint8_t port, uint8_t pin, uint8_t s)
{
    GPIO_PinState sta = (s) ? GPIO_PIN_SET : GPIO_PIN_RESET;
    HAL_GPIO_WritePin(GPIO_PortTable[port], GPIO_PinTable[pin], sta);
}

基於SPIFLASH使用KV功能

#include "b_os.h"    //頭文件
//b_config.h配置文件中使能KV存儲
int main()
{
    uint8_t buf[128];
    //......     
    bInit();    //初始化,外設的初始化會在此處調用
    
    //下面舉例使用:W25QXX和KV存儲功能模塊,其中W25QXX已經添加到b_device_list.h
    if(0 == bKV_Init(W25QXX, 0xA000, 4096 * 4, 4096)) //初始化KV存儲,指定存儲設備W25QXX
    {
        b_log("bKV_Init ok...\r\n");
    }
    //存儲鍵值對(可用於存儲系統配置信息)
    bKV_Set((uint8_t *)"name", (uint8_t *)"BabyOS", 7);
    bKV_Get((uint8_t *)"name", buf);
    b_log("name:%s\r\n", buf); 
    //......
    while(1)
    {
        //.....
        bExec();      //循環調用此函數
        //.....
    }
}

如果不使用功能模塊,單獨對設備進行操作,使用如下方式進行:

//舉例使用W25QXX讀取數據,從0地址讀取128個字節數據至buf
{
    int fd = -1;
    fd = bOpen(W25QXX, BCORE_FLAG_RW);
    if(fd == -1)
    {
        return;
    }
    bLseek(fd, 0);
    bRead(fd, buf, 128);
    bClose(fd); 
}

 

以上就是該項目的簡單介紹,如果你覺得這個項目對你可以有所幫助,記得去項目主頁給它點一個 Star 哦:https://gitee.com/notrynohigh/BabyOS/wikis

Gitee 上還有更多硬件相關開源項目,點擊鏈接即可查看:https://gitee.com/explore/hardware

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章