发新帖本帖赏金 20.00元(功能说明)我要提问
返回列表
[程序源码]

分享下自己写的nrf51822的框架

[复制链接]
40050|100
手机看帖
扫描二维码
随时随地手机跟帖
lxian1988|  楼主 | 2015-2-10 00:48 | 显示全部楼层 |阅读模式
本帖最后由 lxian1988 于 2015-2-10 00:59 编辑

之前搞了两个多月的nrf51822,主要是做蓝牙可穿戴设备。用官方库的时候感觉真心不怎么样,而且不能使用RTOS,所以自己花时间写了一套框架。当时开发和测试的时候花了不少时间,[size=14.3999996185303px]自己感觉还是蛮靠谱的。虽然用的是nrf51的CPU写的,但是核心的内存管理部分可以移植到一般的ARM上(当然如果用RTOS的话就不必要使用我这个库了)。现在虽然不做这个了,但还是发出了跟各位分享下,希望能帮助一些朋友。如果你喜欢的话,可以给我买罐啤酒。:)

正文开始。
框架名字叫LX_NRF51Kit,特点如下:
1. 实现了简单的heap(参考了正点原子的STM32代码),然后基于heap实现了Queue、FIFO等。
2. 基于Queue实现了消息中心。
3. 重写了nordic原有的所有外设驱动,包括UART、Radio、ADC等。对于UART和Radio这类通信外设都把终端封装在了驱动代码内,通过回调向上抛数据(定时器也是如此)。另外通过FIFO作为收发数据的缓存,所以接口函数的结构是一样的,利于一些数据流的重定向。
4. 应用层主要写了一个软件定时器,把一路硬件定时器扩展为N路软件定时器,支持重发和单发模式;另外写了一个无延时(就是不会阻塞主线程)的Button模块,支持单击和双击。
5. 定义了日志系统。日志等级分为ERROR、WARNING、LOG三种,可以选择打开日志的等级;另外支持UART、RADIO和FLASH的重定向,三者可并行。
一句话,我尽了最大努力想让这个框架的使用者能够像在RTOS上开发应用,可以把LX_NRF51Kit看做单线程的RTOS。

文档结构:
1.png
1. APP存放的是应用层代码;
2. CortexM0是ARM的;
3. Debug放的是日志调试的模块;
4. Hardward放的是外部芯片的驱动,我写了一个FLASH芯片MX25L4006E的驱动作为示例,Debug模块中有个功能是把日志写到该芯片中的;
5. LX_NRF51Kit是框架的核心部分,包括heap、queue、FIFO和临界区控制等代码。其中临界区支持SoftDevice开启和关闭的,临界区代码也支持在中断中调用。详见lx_nrf51Kit.h;
6. nrf51822是MCU的外设驱动;
7. SoftDevice你懂的,把官方的很多乱七八糟的删除了。

最后,希望你喜欢!



LXNrf51Kit.rar

177.47 KB

打赏榜单

21ic小喇叭 打赏了 20.00 元 2018-08-28

评分
参与人数 5威望 +14 收起 理由
ZJY135790 + 1 很给力!
simonliyu2013 + 1 很给力!
xye_yt + 1 赞一个!
jifenger + 1 很给力!
xyz549040622 + 10 很给力!

查看全部评分

相关帖子

le062| | 2015-2-10 11:48 | 显示全部楼层
多谢楼主,顺带问一下,这个模块能否当主机连上其他蓝牙模块

使用特权

评论回复
lxian1988|  楼主 | 2015-2-10 13:32 | 显示全部楼层
le062 发表于 2015-2-10 11:48
多谢楼主,顺带问一下,这个模块能否当主机连上其他蓝牙模块

不客气。我当时用的是当蓝牙外设,但是好像Nordic最新的SDK可以用来当主机

使用特权

评论回复
dirtwillfly| | 2015-2-10 17:09 | 显示全部楼层
感谢分享,好资料啊

使用特权

评论回复
wujz| | 2015-2-13 11:59 | 显示全部楼层
感谢

使用特权

评论回复
tangtaostar| | 2015-3-12 14:20 | 显示全部楼层
正在做这个,参考一下,

使用特权

评论回复
lsc201100| | 2015-3-15 13:54 | 显示全部楼层

感谢分享,好资料啊

使用特权

评论回复
sillysg110| | 2015-4-3 09:49 | 显示全部楼层
非常感谢

使用特权

评论回复
1060652341| | 2015-4-3 10:33 | 显示全部楼层
非常感谢

使用特权

评论回复
zpyws| | 2015-4-23 17:41 | 显示全部楼层
真的太感谢楼主了,正好在调试定时器中断,网上到处找不到中断的例子,全TM是轮询的,终于在楼主这找到了

使用特权

评论回复
lxian1988|  楼主 | 2015-4-23 20:03 | 显示全部楼层
zpyws 发表于 2015-4-23 17:41
真的太感谢楼主了,正好在调试定时器中断,网上到处找不到中断的例子,全TM是轮询的,终于在楼主这找到了 ...

呵呵,不客气,希望能帮上忙

今天过来看一下,没想到这么偏门的芯片还有这么多朋友在用。不知道大家使用的时候有什么问题吗,可以交流下

使用特权

评论回复
zpyws| | 2015-4-24 14:14 | 显示全部楼层
lxian1988 发表于 2015-4-23 20:03
呵呵,不客气,希望能帮上忙

今天过来看一下,没想到这么偏门的芯片还有这么多朋友在用。不知道大家使用 ...

今天调用串口时,TXD中断和RXD中断都成功了,但RXTO(Receiver timeout event)一直没办法触发中断,你有没有试过?

使用特权

评论回复
lxian1988|  楼主 | 2015-4-24 21:32 | 显示全部楼层
zpyws 发表于 2015-4-24 14:14
今天调用串口时,TXD中断和RXD中断都成功了,但RXTO(Receiver timeout event)一直没办法触发中断,你有没 ...

印象中没有用过这个超时中断啊,串口都是只用接受中断的,因为就算是检测到超时又能怎么样呢,感觉最好的解决方法就是通过上层协议层处理,物理层本来就是不可靠的

使用特权

评论回复
zpyws| | 2015-4-27 10:32 | 显示全部楼层
lxian1988 发表于 2015-4-24 21:32
印象中没有用过这个超时中断啊,串口都是只用接受中断的,因为就算是检测到超时又能怎么样呢,感觉最好的 ...

谢谢你的热心解答,我写的串口驱动必须信赖于接收超时中断,要不然没法知道一帧数据接收结束。从STM8,STM32F0,STM32F1,LM3S,LPC17xx,M051等全部带接收超时中断,我看手册发现NRF51也支持,但实际调试时却没法中断,只能先放着了

使用特权

评论回复
wrh12345| | 2015-5-5 09:36 | 显示全部楼层
:)顶一个,谢谢!!

使用特权

评论回复
lxian1988|  楼主 | 2015-5-20 20:05 | 显示全部楼层
wrh12345 发表于 2015-5-5 09:36
顶一个,谢谢!!

呵呵,客气了~

使用特权

评论回复
8411240410| | 2015-5-28 09:21 | 显示全部楼层
正在拜读,非常OK.

使用特权

评论回复
8411240410| | 2015-5-28 09:30 | 显示全部楼层
想请教下,是不是每次从Heap中都最少能分配出一个储存块(32字节)那,如果我的链表项只占2,3字节,是不是有些浪费,
是不是说我可以通过宏,#define HEAP_BLOCK_SIZE                         (32)           根据实际情况来设置储存块大小

使用特权

评论回复
lxian1988|  楼主 | 2015-5-28 09:55 | 显示全部楼层
8411240410 发表于 2015-5-28 09:30
想请教下,是不是每次从Heap中都最少能分配出一个储存块(32字节)那,如果我的链表项只占2,3字节,是不是 ...

呵呵,谢谢你的肯定~

这个代码如我上面写的,是参考正点院子的STM32里的heap改的。

确实是每次都要分配出32个字节,这样做的目的一是为了加速CPU处理速度,因为32位机最好每次都是操作4个字节的整数倍的数据量,所以配置的时候要保证字对齐。

另外就是减少内存碎片的发生。这个Heap毕竟是简单的一个实现,如果app总是不同的申请、释放不同大小字节的内存,最后会导致整个heap里内存碎片严重。使用4字节的整数倍能够降低碎片度

最后就是如果heap的block设置的越大,那么标记heap使用状态的table就越小;而block越小,可以分配出来的内存块个数越多。所以在权衡之后,最后定下来一个block32个字节。app在使用的时候最好是尽快释放内存,毕竟这个MCU的资源太少了。

使用特权

评论回复
lxian1988|  楼主 | 2015-5-28 10:02 | 显示全部楼层
8411240410 发表于 2015-5-28 09:30
想请教下,是不是每次从Heap中都最少能分配出一个储存块(32字节)那,如果我的链表项只占2,3字节,是不是 ...

你确实可以通过修改宏来把block改小,但是我估计heap的描述表会变得很大,得不偿失,而且可能编译不过去。

使用特权

评论回复
发新帖 本帖赏金 20.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

16

帖子

8

粉丝