学习单片机和嵌入式开发?这个项目是你入坑的不二之选

BabyOS是一款专为MCU项目开发设计的代码框架,通过管理功能模块和外设驱动,帮助工程师减少重复工作,缩短开发周期。无论是裸机开发还是操作系统开发,BabyOS都能提供有效的支持。

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

《ARM嵌入式系统软件开发实例(一) 周立功 北京航天航空大学出版社》(PDF) 目录第1章 ZLG/FS原理与应用 1.1 概述 1.1.1 ZLG/FS简介 1.1.2 ZLG/FS的特点 1.1.3 已实现的特性 1.1.4 暂时未实现的特性 1.2 使用 1.2.1 使用示例 1.2.2 Config.hfat.h 1.2.3 与编译器无关的数据类型 1.2.4 初始化ZLG/FS 1.2.5 目录相关操作 1.2.6 文件相关操作 1.2.7 关闭ZLG/FS 1.2.8 在多任务环境下使用ZLG/FS 1.3 ZLG/FS的结构视图 1.3.1 概述 1.3.2 应用程序 1.3.3 文件管理与目录管理 1.3.4 文件分配表管理与文件目录表管理 1.3.5 逻辑盘管理模块 1.3.6 高速缓存管理模块 1.3.7 底层驱动程序 1.3.8 实用程序 1.3.9 源代码文件说明 1.4 驱动程序设计指南 1.4.1 一个驱动程序的例子 1.4.2 参数 1.4.3 逻辑盘初始化 1.4.4 卸载逻辑盘 1.4.5 读/写扇区 1.5 FAT文件系统基础知识 1.5.1 简介 1.5.2 本节的约定 1.5.3 概述(适用于各类型的FAT文件系统) 1.5.4 引导扇区BPB 1.5.5 FAT数据结构 1.5.6 FAT类型的确定 1.5.7 FAT卷的初始化 1.5.8 FAT32 FSInfo扇区结构备份引导扇区 1.5.9 FAT的目录结构(FDT表) 1.5.10 FAT的长目录项 1.5.11 命名限制字符集 1.5.12 短文件名长文件名的名字映射 1.5.13 命名惯例长文件名 1.5.14 长目录项对旧版FAT的影响 1.5.15 验证目录的内容 1.5.16 与FAT目录项相关的其他注意事项 1.6 逻辑盘信息管理 1.6.1 用户接口函数 1.6.2 内部使用函数 1.6.3 逻辑盘卷的区别 1.6.4 逻辑盘信息登录项 1.6.5 初始化 1.6.6 加载底层驱动程序 1.6.7 卸载底层驱动程序 1.6.8 获取逻辑盘信息 1.6.9 获取空闲登录项 1.7 Cache管理 1.7.1 用户接口函数 1.7.2 内部使用函数 1.7.3 原理 1.7.4 初始化 1.7.5 通过Cache读/写逻辑扇区 1.7.6 把Cache数据写回逻辑盘 1.8 文件分配表管理 1.8.1 FAT简介 1.8.2 接口函数 1.8.3 获取簇的下一个簇号 1.8.4 设置下一个簇号 1.8.5 为簇链增加一个簇 1.8.6 删除一个簇链 1.9 文件目录表管理 1.9.1 FDT简介 1.9.2 用户接口函数 1.9.3 内部接口函数 1.9.4 数据结构 1.9.5 读取FDT信息 1.9.6 保存FDT信息 1.9.7 获取指定目录指定FDT信息 1.9.8 设置指定目录指定FDT信息 1.9.9 在指定目录查找指定FDT 1.9.10 指定目录查增加FDT 1.9.11 在指定目录删除指定FDT 1.9.12 改变指定目录指定FDT属性 1.9.13 察看指定目录是否为空 1.9.14 在指定目录查看指定FDT是否存在 1.10 目录操作 1.10.1 用户接口函数 1.10.2 内部接口函数 1.10.3 获取指定目录的逻辑盘号 1.10.4 改变当前逻辑盘 1.10.5 建立目录 1.10.6 删除目录 1.10.7 改变当前目录 1.10.8 用户文件/目录名转换为系统名 1.10.9 获取指定文件/目录所在的目录的开始簇号及系统内名称 1.10.10 获取指定目录开始簇号 1.11 文件操作 1.11.1 用户接口函数 1.11.2 数据结构 1.11.3 初始化 1.11.4 删除文件 1.11.5 打开文件 1.11.6 查看指定的文件是否处于打开状态 1.11.7 关闭文件 1.11.8 从文件中读数据 1.11.9 把数据写文件 1.11.10 判断文件是否读/写到文件尾 1.11.11 移动文件读/写位置 1.12 实用程序 第2章 USB驱动程序开发 2.1 USB1.1协议简介 2.1.1 USB系统构成 2.1.2 USB设备的枚举过程 2.1.3 USB的分组标识 2.1.4 USB标准设备请求 2.1.5 USB设备描述符 2.2 PDIUSBD12器件简介 2.3 硬件电路设计 2.4 软件设计总体思想 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值