完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
MCU,中文简称单片机。即将 CPU、存储器(RAM和ROM)、多种 I/O 接口等集成在一片芯片上,形成的芯片级计算机。 到目前为止,中国的单片机应用和嵌入式系统开发走过了二十余年的历程,随着物联网的兴起,单片机和嵌入式开发逐渐受到越来越多的关注。
今天推荐的这个开源项目就是专为MCU项目开发提速的代码框架,也是刚刚入选 GVP 的项目,一起来学习一下吧! 项目名称:BabyOS 项目作者:bean 开源许可协议:MIT 项目简介 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...rn"); } //存储键值对(可用于存储系统配置信息) bKV_Set((uint8_t *)"name", (uint8_t *)"BabyOS", 7); bKV_Get((uint8_t *)"name", buf); b_log("name:%srn", 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); } |
|
|
|
只有小组成员才能发言,加入小组>>
3314 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9059 浏览 16 评论
4088 浏览 18 评论
1179浏览 3评论
605浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
599浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 14:31 , Processed in 1.248872 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号