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