? 最近在做一个LoRa物联网网关的项目,网关的作用主要是管理连接的LoRa传感器终端,将传感数据通过协议转换向上转发到Internet,当然,也要处理下行的数据。
? 使用到的LoRa射频芯片是SX1278,MCU为STM32F103RCT6,连接Internet用的是ESP8266+AT,且移植了FreeRTOS(单纯是为了学习),开发环境是STM32CubeMX+Keil 5。由于之前没负责过整个系统的开发,所以开此贴记录一下开发过程,由于本人上学以来语文一直不好,所以文笔正在努力进步中,如果此文章有您觉得我说的不明白的地方,可以发送邮件到ilu.wang@foxmail.com,或者在文章下方评论,我看到会尽快回复您,多谢谅解!
您也可以无聊当个故事看,我主要是记录一下也防止以后看不懂自己写的代码,哈哈哈~
所以我将从大概三个方面大概记录:
话不多说,直接开搂~
? SX1278是一款经典且性价比高的LoRa射频芯片,非常适合初学者学习使用,由于我不是特别会画PCB,所以还是选择别家的模块来的方便还不容易出错。
? 正点原子的LoRa模块是和一个MCU封装到一起的,所以可以用串口通信,很无脑,很多参数没法修改已被正点原子给写死,只能通过它家的上位机来配置模块,遂PASS。最后选择了安信可的LoRa Ra-02模块,02是邮票孔接口的还比较容易焊接。这个就不像正点原子家的那样无脑,它就是将SX1278和其外围电路集成到了一起而已,使用SPI接口通信,有用的引脚也都引出了,目前来看比较不错。唯一的问题是他的天线接口是ipex接口的,不如SMA的好看(其实是我有很多SMA接口的天线用不上了)。
? 配置SX1278是通过SPI接口对寄存器操作实现的,某些寄存器在LoRa模式和FSK模式有不同的作用,我这个项目只用LoRa模式,所以FSK有关的我也懒得看(话说很多寄存器我真的不看懂是啥意思,不是通信专业的对射频不是很了解,只能百度百度再百度)。
? 安信可的LoRa模块共引出了16个管脚(如下图),这么多的引脚加之这么多看不懂的寄存器,在这里不得不吐槽一下SX1278的官方手册真的是很不全,很多操作的逻辑都没有解释明白,要让我自己写驱动的话我估计会直接放弃,不过还好安信可提供了几个Demo可供咱们参考。
? 选了一个点对点控制LED的Demo,果断将驱动复制出来,驱动的结构有必要说一下。我个人习惯把嵌入式项目分为5层架构,由上到下分别是:应用层、中间件层、操作系统层、板级支持包、硬件层。这个是我看知乎上一篇文章总结的,觉得跟我自己的想法高度一致,也不知道说的对不对。
硬件层就是单片机内部外设的驱动,像GPIO,SPI等等,这一层一般是跟单片机走的,像这个项目的硬件层就是STM32提供的HAL库。
板级支持包这个概念是从大学的书本上看到的,Linux开发用的比较多吧,单片机没怎么看到大家谈(火哥好像用这个概念)。这一层大概就是对外部硬件的初始化和一些基本操作的封装,通常调用的是硬件层的API来实现。就比如这个SX1278,它的初始化、片选、复位等操作就是属于板级支持包要实现的。驱动文件中的 sx1276-board.c
和 sx1276-board.h
就是属于板级支持包的。
操作系统层是最容易理解的,于此项目而言就是FreeRTOS嘛。系统的初始化、任务、列表、队列等数据结构的创建都是在这层实现的。操作系统层不光使用板级支持包提供的接口,显然也调用硬件层的接口,所以这个层的位置其实比较尴尬,我的理解或许也有错误,欢迎讨论!
中间件层的作用是实现所需的功能函数。它与应用层的区别是:应用层负责解决整个系统何时该调用哪个功能函数;而中间件层就是实现这些功能函数的。这些功能函数可能调用了不同模块对应的板级支持包的接口,组合来实现一项功能。例如,网关在接收到感知层结点的数据时,在接收回调函数中可能调用MQTT_publish()将数据转发给上层应用,同时,也会调用OLED_display()显示消息到显式模块上。
驱动文件中的sx1276.c
和 sx1276.h
就是属于中间件层的。
应用层的工作是从整个系统的调度层面来讲的,这个后面再说吧~
官方的驱动中还剩下几个文件,在这里介绍一下它们作用:
文件名 | 功能 |
---|---|
radio.h | 声明了很重要的两个结构体 |
sx1276Regs-Fsk.h | FSK模式下的寄存器宏定义 |
sx1276Regs-LoRa.h | LoRa模式下的寄存器宏定义 |
? 将驱动文件复制到一个确定没其它问题的MDK工程中,我用的是正点原子开发板中的SPI章节Demo(HAL库),大差不差,选择一个自己觉得舒服的就行。然后可以建一个文件夹放SX1278的驱动文件,完成在Keil中建立Group、添加INCLUDE path等常规操作。
? 之后就可以开始改错了,这其中主要是改以下部分内容:
这里差不多就改完了,编译应该是0 error,这一章就介绍完了,明天开始记录SX1278的初始化函数部分的内容。
原文:https://www.cnblogs.com/Irvingcode/p/14710637.html