5 Star 14 Fork 2

火星大王/SCNSLibrary

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

并不智能的智能车

有问题发issues,欢迎PR

简介

一套低性能嵌入式开发库,基于C语言开发,封装了常用的传感器。 原本的用途是参加全国大学生智能汽车竞赛,但是在开发过程中逐步发现可以应用于一些奇奇怪怪的地方, 所以进行了相关的硬件分离便于使用。

一个和智能车没啥关系的东西

为什么会有呢?

或许是最开始的梦想吧

一个从入坑时候就开始的梦想

时光飞逝

少年终于实现了梦想

只不过

时光飞逝

话说回来

真的和智能车没啥关系吗?

或许吧

Demos & BSP

核心特性

  • 高速显示器驱动
    • 可选的PFB(Partial Frame Buffer),在DMA的加持下对比纯CPU帧率翻倍(MM32F3277@120MHz,SPI@60Mbit/s,ST7789)。
    • 可选的全屏缓冲。
    • 多平台同API。
    • 可以使用DMA2D等加速器(基于BSP内实现)。
    • 物理显示器抽象,方便的更换不同的物理实现。
  • 灵活的菜单
    • 翻页菜单,最大支持255页,65536个菜单项。
    • 局部刷新。该刷的刷,不该刷的一点也不多刷。
    • 灵活的应用。一行代码加菜单,不用长长长的配置代码。
    • 支持文件内部变量(全局变量加static修饰),全局变量不乱飞。
    • 支持LCD+按键+串口多方位调参。最少三个按键即可支持翻页+调参,简化硬件设计;串口调参支持使用菜单名至极修改,更加方便。
  • 多传感器支持
    • 各种传感器,并不能一网打尽
  • 跨平台支持
    • 非常先进落后的BSP机制,C99标准,移植简单。
    • 支持关闭模块,一步一个脚印慢慢移植,不再出现满屏报错。
    • 支持在电脑设备上模拟部分操作,例如LCD等,高效稳定进行测试开发。
  • EKF
    • 扩展卡尔曼滤波器解算陀螺仪,效果好,算的慢
    • 好像有些BUG
  • 悦耳动听的蜂鸣器
  • 先进的示波器
    • 数据自动命名自制
    • 可选阻塞发送
  • 按键
    • 单击,长按,多次按

参考视频

API大全

API大全

移植指北

首先回答一个问题:BSP是什么

在嵌入式系统中,板级支持包(英语:board support package,简称BSP)用作初始化与执行操作系统并用于评估板(Evaluation Board)的简易程式码。 它通常包含了以基础支持代码来加载操作系统的引导程序(英语:bootloader),以及主板上所有设备的驱动程序。

在SCNS中,BSP提供了各个操作具体应该如何执行。

BSP存在的核心意义是使得移植的范围可控,并减少移植工作量。在移植的过程中SCNS库的本体不需要进行修改,只有BSP中的东西需要修改。

然后回答一个问题:.C.H是什么

这个东西本质上是一个.h文件,因为后缀只看最后一个.后面的东西。

这个东西存在的意义是实现BSP的封闭,有一些类似于面向对象中的私有。

可以注意到在下面的结构图中,ScnsInclude作为include了所有模块的文件,只include了.h,而没有include .c.h。 这意味着,.c.h里面的东西不会随着include被include到别的地方,从而实现了对内的封闭。

看完上面两个问题,再来看看项目结构

项目主要位于scns文件夹下

其子文件夹bsp提供了板级支持包以供其余配置

模块主要分为两大类:需要BSP支持的模块与不需要BSP支持的模块。

需要BSP支持的模块由ScnsXxx.c、ScnsXxx.h、ScnsXxx.c.h以及在bsp中的ScnsBspXxx.c、ScnsBspXxx.c.h、ScnsBspXxx.h共6个文件组成。

不需要BSP的模块则只有ScnsXxx.c、ScnsXxx.h供2个文件。

设计这么多文件的主要目的是为了尽可能的封闭BSP中的内容。

各个文档之间的依赖于包含关系如下图所示。

这确实是个图,不过需要你的markdown解析器支持plantuml

@startuml
folder scns{
    file ScnsInclude.h{
    }
    file ScnsConfig.h{
    }
    file ScnsXxx.c{
    }
    file ScnsXxx.h{
    }
    file ScnsXxx.c.h{
    }
}
folder xxx/bsp{
    file ScnsBspConfig.h{
    }
    file ScnsBspXxx.c{
    }
    file ScnsBspXxx.c.h{
    }
    file ScnsBspXxx.h{
    }
}
ScnsInclude.h ---> ScnsXxx.h
ScnsInclude.h ---> ScnsConfig.h
ScnsConfig.h  ---> ScnsBspConfig.h


ScnsXxx.h --> ScnsConfig.h
ScnsBspXxx.h --> ScnsConfig.h
ScnsXxx.h ->  ScnsBspXxx.h

ScnsXxx.c.h --> ScnsXxx.h 
ScnsXxx.c.h --> ScnsBspXxx.h #white;line.dotted;
ScnsXxx.c.h -> ScnsBspXxx.c.h 

ScnsBspXxx.c.h --> ScnsXxx.h
ScnsBspXxx.c.h --> ScnsBspXxx.h #white;line.dotted;
' ScnsBspXxx.c.h -> ScnsXxx.c.h 


ScnsXxx.c --> ScnsXxx.c.h 
ScnsXxx.c --> ScnsBspXxx.c.h #white;line.dotted;

ScnsBspXxx.c --> ScnsXxx.c.h 
ScnsBspXxx.c --> ScnsBspXxx.c.h #white;line.dotted;

note left of ScnsXxx.c : 实现部分
note left of ScnsXxx.h : 对外作用的声明或者定义
note left of ScnsXxx.c.h : 声明要求在ScnsBspXxx.c中实现的内容

note left of ScnsBspXxx.c : BSP实现部分
note left of ScnsBspXxx.h : BSP中对外作用的声明或者定义
note left of ScnsBspXxx.c.h : BSP中不对外作用的声明或者定义

@enduml

搞仓库

先把仓库搞下来。

推荐通过git submodule引入,这也是为什么这个仓库的根目录就是一堆代码,主要就是为了方便git submodule引入。

搞BSP

然后再搞一个BSP,可以从SCNSDemos里复制一份过来。

搞「总的开关文件」

在BSP里,你会看到一个叫ScnsBspConfig.h,大概这样的文件

#ifndef __SCNS_BSP_CONFIG_MM32F3277_seekfree_H__
#define __SCNS_BSP_CONFIG_MM32F3277_seekfree_H__



#define SCNS_AP3216C_ENABLE              0
#define SCNS_APDS9960_ENABLE             1
#define SCNS_AT24C02_ENABLE              0

略去很多行

#define SCNS_SMCTP_EXT_OSCILLOSCOPE_ENABLE                 1
#define SCNS_XPT2046_ENABLE              0
#define SCNS_YING_ENABLE                 1



#ifdef SCNS_CONFIG_SET
#error multy config
#endif
#define SCNS_CONFIG_SET
#endif

这个文件是总的开关文件,可以通过SCNS_XXXX_ENABLE灵活的控制模块是否开启。你可以先把这些都关掉然后一个一个慢慢开。

搞ScnsXXXX.c.h

一般来讲,每一个模块的移植应当参考ScnsXXXX.c.h,具体来讲:

#ifndef __SCNS_YING_C_H__
#define __SCNS_YING_C_H__

#include "ScnsYing.h"

#if defined(SCNS_YING_ENABLE)&&SCNS_YING_ENABLE==1

#include "ScnsBspYing.c.h"

这一片有一堆函数的声明,需要在ScnsBspXXXX.c中实现

/*******************************BSP.C.H*******************************
这一片有一堆,需要在ScnsBspXXXX.c.h中定义
 */
/*******************************BSP.H*******************************
这一片有一堆,需要在ScnsBspXXXX.h中定义
*/
#endif
#endif

搞 Init和 PostInit

我也不知道哪个版本开始,SCNS支持了Init和PostInit两个初始化阶段。

顾明思意,PostInit在Init的后面。

我们不妨使用泳道图直观的看一下

@startuml
|用户应用|
start
|ScnsXXXX|
:ScnsXXXXInit();
|ScnsBspXXX|
:ScnsBspXXXXInit();
|ScnsXXXX|
:模块内部初始化;
|ScnsBspXXX|
:ScnsBspXXXXPostInit();
|ScnsXXXX|
:标记初始化完成;
|用户应用|
stop
@enduml

上面这个图实际上省略了初始化失败时的返回过程。

实际上在任一阶段,一旦初始化失败,会直接返回。

将这两段拆开的主要目的是注意到有的时候BSP也可能希望知道模块的初始化有没有完成。

需要注意的是,在部分应用中,postInit会被调用多次,例如ScnsSd中的postInit会在插卡并握手完毕,如果你在运行中反复插卡,PostInit会被调用多次,但是Init只会调用一次。

推荐移植顺序

推荐移植顺序 ScnsYing->ScnsMem->ScnsTimer->其他

具体顺序应当参阅每一个模块自己的markdown,您可以在功能列表一节找到所有模块的markdown文件。

功能列表

空文件

简介

SCNS,a low-performance undocumented embedded peripheral library developed in C language. 展开 收起
C 等 3 种语言
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/huoxingdawang/scns.git
git@gitee.com:huoxingdawang/scns.git
huoxingdawang
scns
SCNSLibrary
master

搜索帮助