BabyOS為 MCU 項(xiàng)目開發(fā)提速的代碼框架
BabyOS適用于MCU項(xiàng)目,她是一套管理功能模塊和外設(shè)驅(qū)動(dòng)的框架。
對(duì)項(xiàng)目而言,縮短開發(fā)周期。項(xiàng)目開發(fā)時(shí)選擇適用的功能模塊及驅(qū)動(dòng)。直接進(jìn)入功能代碼編寫的階段。
對(duì)工程師而言,減少重復(fù)工作。調(diào)試過的功能模塊和驅(qū)動(dòng)代碼放入BabyOS中管理,以后項(xiàng)目可以直接使用,去掉重復(fù)調(diào)試的工作。
代碼結(jié)構(gòu)
BabyOS代碼分為3部分:
BabyOS倉庫:功能模塊和驅(qū)動(dòng) ,一般情況下用戶不需要改動(dòng),可以將此倉庫作為子模塊。
BabyOS_Config:配置文件和設(shè)備注冊(cè)文件
BabyOS_Hal:硬件抽象層, 不同分支對(duì)應(yīng)不同硬件平臺(tái),選擇對(duì)應(yīng)平臺(tái)下載,沒有合適的則選擇master分支
適用項(xiàng)目
使用裸機(jī)開發(fā)的項(xiàng)目推薦基于BabyOS進(jìn)行。
使用操作系統(tǒng)開發(fā)的項(xiàng)目,BabyOS可作為功能庫及驅(qū)動(dòng)庫使用。
使用方法
基于STM32F107上使用SPIFLASH及KV功能模塊為例
1.添加文件
BabyOS //可作git子模塊使用 ├── bos │ ├── algorithm //常用算法,無需添加其中文件 │ ├── core //核心文件,全部包含至工程 │ ├── drivers //驅(qū)動(dòng)文件,選擇spiflash驅(qū)動(dòng)添加至工程 │ ├── modules //功能模塊,全部添加至工程,由配置文件b_config.h配置 │ ├── thirdparty //第三方代碼,選擇SFUD第三方代碼添加至工程 │ └── utils //實(shí)用代碼,選擇delay部分代碼添加至工程 ├── doc //相關(guān)文檔 ├── LICENSE //開源協(xié)議 └── README.md BabyOS_Config //克隆后放入工程目錄,全部添加至工程 BabyOS_Hal //克隆后放入工程目錄,添加hal、gpio、uart、spi部分
//進(jìn)入用戶工程目錄執(zhí)行 git submodule add https://gitee.com/notrynohigh/BabyOS.git git clone https://gitee.com/notrynohigh/BabyOS_Config.git //克隆配置文件及設(shè)備注冊(cè)文件 git clone https://gitee.com/notrynohigh/BabyOS_Hal.git //克隆后切換到對(duì)應(yīng)平臺(tái)的分支,如果沒有則采用master分支作為模板
2.增加系統(tǒng)定時(shí)器
//例如使用滴答定時(shí)器,中斷服務(wù)函數(shù)調(diào)用:void bHalIncSysTick(void); //注:定時(shí)器的周期與b_config.h里_TICK_FRQ_HZ要匹配
3.選擇功能模塊
b_config.h進(jìn)行配置,勾選其中的KV Enable/Disable項(xiàng)
4.注冊(cè)設(shè)備
//b_device_list.h,在里面添加使用的外設(shè)。例如項(xiàng)目只需要使用SPIFlash,那么添加如下代碼: // 設(shè)備 驅(qū)動(dòng) 描述 B_DEVICE_REG(SPIFLASH, bSPIFLASH_Driver[0], "flash") //如果沒有注冊(cè)任何設(shè)備,取消B_DEVICE_REG(null, bNullDriver, "null")的注釋 //B_DEVICE_REG(null, bNullDriver, "null")
5.修改硬件接口
b_hal.h中根據(jù)實(shí)際連接圖修改GPIO和SPI號(hào)
#define HAL_SPIFLASH_QSPI_EN 0
#define HAL_SPIFLASH_TOTAL_NUMBER 1
#define HAL_SPIFLASH_IF {{B_HAL_QSPI_INVALID, B_HAL_SPI_1, {B_HAL_GPIOB, B_HAL_PIN12}},}
6.修改硬件抽象層SPI部分
(依賴硬件平臺(tái),使用STM32 HAL庫為例)
//b_hal_spi.c
int bHalSPI_Send(bHalSPINumber_t spi, uint8_t *pbuf, uint16_t len)
{
if(pbuf == NULL)
{
return -1;
}
switch(spi)
{
case B_HAL_SPI_1:
HAL_SPI_Transmit(&hspi1, pbuf, len, 0xfff);
break;
default:
break;
}
return 0;
}
int bHalSPI_Receive(bHalSPINumber_t spi, uint8_t *pbuf, uint16_t len)
{
if(pbuf == NULL)
{
return -1;
}
switch(spi)
{
case B_HAL_SPI_1:
HAL_SPI_Receive(&hspi1, pbuf, len, 0xfff);
break;
default:
break;
}
return 0;
}
7.修改硬件抽象層GPIO部分
(依賴硬件平臺(tái),使用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);
}
8.基于SPIFLASH使用KV功能
#include "b_os.h" //頭文件
//b_config.h配置文件中使能KV存儲(chǔ)
int main()
{
uint8_t buf[128];
bInit(); //初始化,外設(shè)的初始化會(huì)在此處調(diào)用
if(0 == bKV_Init(SPIFLASH, 0xA000, 4096 * 4, 4096)) //初始化KV存儲(chǔ),指定存儲(chǔ)設(shè)備SPIFLASH
{
b_log("bKV_Init ok...\r\n");
}
//存儲(chǔ)鍵值對(duì)(可用于存儲(chǔ)系統(tǒng)配置信息)
bKV_Set("name", (uint8_t *)"BabyOS", 7);
bKV_Get("name", buf);
b_log("name:%s\r\n", buf);
//......
while(1)
{
//.....
bExec(); //循環(huán)調(diào)用此函數(shù)
//.....
}
}
如果不使用功能模塊,單獨(dú)對(duì)設(shè)備進(jìn)行操作,使用如下方式進(jìn)行:
//舉例使用SPIFLASH讀取數(shù)據(jù),從0地址讀取128個(gè)字節(jié)數(shù)據(jù)至buf
{
int fd = -1;
fd = bOpen(SPIFLASH, BCORE_FLAG_RW);
if(fd == -1)
{
return;
}
bLseek(fd, 0);
bRead(fd, buf, 128);
bClose(fd);
}
更多使用介紹:
