0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

模块化代码的设计思路,开发思想和独立模块开发模型

5CTi_cirmall 来源:电路设计技能 作者:电路设计技能 2021-03-05 14:40 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

嵌入式软件这个行业涉及甚广,从我们身边的电视、冰箱、洗衣机,到我们的手机,再到交通、到医疗、军事无处不在。

在项目的开发过程中,使用调试工具是必不可少的。

串口简单灵活的特性常被工程师用作代码的调试工具,它的另一个名字叫uart

说到uart,相信很多工程师都熟透了,掌握一个uart,可以说是已经迈进了嵌入式软件的殿堂,所以uart也常被用作嵌入式入门的必备功课。

那既然都熟了,那为什么还拿出来说呢,带着这样的一个问题,跟着我一起深入的了解我们的这个项目,一起探讨uart背后那些不为人知的故事。

目的意义在我们的开发测试中,uart通常扮演者信息输出,人机交互和下载程序的功能,有些场景下可能有线的串口不是很方便或者不能实现信息的输出,比如调平衡车,有线串口对这种远距离的调试显得有些力不足。有些场景或者我们根本不可以把数据直接读出来,比如车厂,整车的CAN数据是汽车的血液,一些ECU的出厂前身体状况,全靠采集can数据来诊断,即使整车有can数据的存储功能,一些测试调试不一定能很方便的拿到,所以这个无线的数据采集仪就能派上用场,这就是我本次项目的主要意义。

本期内容可以了解到以下几个方面:

1、模块化代码的设计思路,开发思想和独立模块开发模型;

2、uart等串行板级通信的设计原理及其注意事项;

3、项目中常用的测试方法和测试手段;

4、通信协议的制定和协议栈的开发;

项目简介:项目采用双mcu-STM32F030C8T6和RF24L01无线模块实现主从设备的上下行数据传输,在此基础上增加与pc的通信和数据记录功能,实现离线数据同步功能;

基础功能:

实现双mcu数据的上下行无线传输,波特率为115200;

实现主设备与pc机的通信,并实现uart调试功能;

扩展功能:1、can数据、spi 、iic的数据的采集传输;2、离线存储功能;

开发准备及其环境硬件环境:具备RF24L01模块接口的STM32开发板2块、RF20L01无线模块2块;开发工具:STM32J-link仿真器、串口TTL转换小板各1;软件环境 :KIEL-MDK 、串口助手 ;

开发计划节点1:完成技术指标的确定,开发板、硬件模块及其调试器采购到位,完成软硬件的架构设计;

节点2:调试接口与pc的交互程序的开发;

初建工程,完成uart1调试接口程序的开发;

完成uart2与pc机的交互程序的设计;

节点3:定制NRF24L01的传输协议,并完成开发

驱动的开发与BSP的开发;

协议的开发;

节点4:整体调试、测试;

节点5:编写项目总结。

项目设计

Part 01

项目概述及其环境的搭建

项目简介:

项目采用双mcu-STM32F030C8T6和RF24L01无线模块实现主从设备的上下行数据传输,在此基础上增加与pc的通信和数据记录功能,实现离线数据同步功能;功能指标

基础功能:

1、为了尽快上手软件,硬件系统采用现成模块, RF24L01模块接口的STM32开发板2块和RF20L01无线模块2块,STM32系统板2块分为主板和从板,从板信息通过24l01无线模块发送到主板,主板通过uart与pc交互;硬件部分后续独立部分说明分享。

2、软件方面是重点研究对象,软件主要分为driver、hal、bsp、service、app五个部分。Driver层是和硬件直接相关,hal层是隔离层,bsp是驱动相关芯片的板级支持层、服务层主要是一些任务相关,App为应用层。

扩展功能:1、can数据、spi 、iic的数据的采集传输;2、离线存储功能;

开发准备及其环境:1、硬件环境 :具备RF24L01模块接口的STM32开发板2块、RF20L01无线模块2块;2、开发工具 :STM32J-link仿真器、串口TTL转换小板各1;3、软件环境 KIEL-MDK 、串口助手 ;

Part 02

软件设计-外设uart

导言uart外设是开发调试的重要手段,也是板级通信常用的通信方式。

对于耳熟能详的uart,你了解多少呢?

它的用法的注意事项和难点又有哪些呢?

本期内容让我带着大家重点探讨一下uart的软件设计。

内容提要1、uart的基本概述和STM32中uart驱动HAL层的配置;2、调试打印中,uart的数据发送策略;3、通信中,uart的策略与架构。

软件实战1、外设与系统

与传统写驱动程序相比,STM32CubeMX代码生成器让驱动变得更简单、快速,大大提高了开发效率。

STM32CubeMX不仅支持外设配置,还支持freeRTOS,不过很可惜,考虑到片子的成本,8KRAM的片子仅能跑2个静态的线程,而且从板有集成到项目中的需求,所以从设备不使用freeRTOS。

从设备主频48MHZ,uart外设需要对GPIO/NVIC/DMA/UART进行配置,主设备还需要配置freeRTOS。

2、调试神器-uart不管哪个项目,printf的输出是必不可少的!

实现的关键点是数据通过printf函数收集到debug_pool后如何发送。

下面内容围绕这个问题展开讨论。

无os的情况下,若是需要实时性要求较高的情况下,发送需要直接调用uart驱动发送接口抛出,这种方式,效率低,cpu占用高。

一般情况下是要开一片空间,当数据收集满后通过DMA送到uart硬件然后发出去。不过这种方式是需要一个Task,周期的抛数据。

有os的系统,这里需要加消息队列或者内存池,还需要一个独立的线程进行处理。

比较复杂,这里不展开讨论。

对上图思想进行解释:1、接收部分首先考虑如何接收数据,是采用run_buf的形式还是一个字节中断的方式;

2、数据接收后,要思考帧识别,确定一帧数据后进入CRC校验;

3、校验通过后再进行协议的解析和处理;

5、数据发送部分先对数据进行打包。记住多线程的处理要对数据进行保护,防止tx_buf里的数据被刷写;

6、通过打包后的数据要CRC加码校验,然后再发出去;

值得注意的是:要将这些公共的CRC和收发任务单独提出来,与协议相关的内容独立出来,这样协议层的变得不会引起程序大的改动;

Part 03

软件设计-外设uart

引言:相信很多工程师们都晓得:调试串口不仅扮演打印信息的角色,还得有配置设备、设备参数输入等功能。如果开发window上位机界软件是成本上和时间上都不划算;要是在Linux这种跨平台下还得开发一套软件。所以做一个类似Linux命令这样的串口软件就显得很有必要!

直接用像SecureCRT这类软件连接串口即可调试,与设备进行交互,把这个软件命名为mshel。

另外,直接与pc进行这样的数据流存在乱码和丢数据的现象,这里使用了为二者制定的私有协议。

本期内容:1、mshell的原理与结构;2、pc交互的通信协议;

软件实战:mshell的设计原理和思路:mshell是设备开发人员与设备进行配置管理的交互接口,主要功能如下:1)设备log打印显示功能;

2)可对设备进行配置和控制;

3)具有Linux的终端控制台类似的功能,可以显示功能菜单和参数输入等功能,给出功能菜单示例;

SecureCRT软件的串口数据交互特点:

1)对与窗口输入的字母和数字,是以ASCII的形式通过串口下发到设备;

2)窗口输入一个字符,串口会下发一个字符,回车、退格和空格都是一个字节,左右上下键是2字节;

3)软件接收到字符后回显到窗口,回车0x0D回显没有反应, 行跳转;

4)给出用到的一些双字节按键:

KEY_UP = 0x5B410000,

KEY_DOWN = 0x5B420000,

KEY_LEFT = 0x5B440000,

KEY_RIGHT = 0x5B430000,

根据以上特点可知,实现mshell进行需要回显功能,就是收到啥发啥,提示程序员设备收到所下发的字符。

需要对收到的字符进行存储和解析,需要设计命令解析器

命令解析器处理完指令及其数据后,交给执行单元。

执行单元的设计包括一级指令执行,即选择功能模块,比如uart相关指令,之后进入到子模块处理程序。

核心模块的功能如下:

1)echo回显模块是将pc发来的字符实时的发回到pc的终端,提示输入有效;

2)cmd_analysis命令解析器是将收到的字符进行处理,要知道输入参数的个数,指令以及数据;

3)cmd_dispatch命令调度器是对注册的命令块进行回调处理;

1)物理层主要是硬件线路数据,软件驱动的收发;采用标准3线制 Uart 物理接口、波特率待定、 8个数据位,无校验,1个停止位。

2)数据链路层是对接收一包数据的完整性已经正确的保证,这里使用crc校验;

3)传输层是实现数据包的顺序传输,和稳定性,具体的协议帧定义如下:

aef57c86-7b95-11eb-8b86-12bb97331649.png

应答帧在应用层payload中进行,counter计数避免帧重复,对于协议的实现,仅mcu部分,上位机部分使用Linux,将数据存到文件中即可。

本次更新内容如下:

Part 04

无线通信模块的协议

引言: 前面的uart相关的开发主要的功能是连接采集设备和上位机的接口功能,设备想要实现无线数据传输,离不开NRF24L01,这个模块的传输方式是半双工模式,也就是同一时刻仅能单侧传输数据,所以如何准确的实现数据双向的收发,本期的通信协议就非常关键了。

本期内容:

1、NRF24L01模块的重要理解;

2、数据收发原理;

项目实战:

一、模块的重要理解

1、关于频率:

2.4GWiFi频段和和nrf24l01有很大一块重叠,如果出现严重的丢包,很有可能受到了WiFi的的干扰,将nrf2401的频段设置为高于2490MHz可以显著降低丢包率。nrf2401做了3种固定的波特率,分别是 250Kbps/1Mbps/2Mbps,在使用时指定一个即可。需要注意的是,当nrf2401正处于接收数据或发送数据的工作状态时,不要修改波特率,否则会数据包会出错。

2、关于功耗:

掉电模式,nrf2401消耗的电流为900nA,比全火力状态低了4个数量级,所以为了省电,大多数情况下是可以让模块处于此模式,当有数据收发的时候再开机。就这样让模块关机也有个缺点,就是当对数据实时性要求很高的情况下,nrf24l01启动时要一次开启各个关闭的模块,相对来说有点耗时,容易丢数或者延迟发送。

热待机模式(Standby),相对掉电模式相比,热待机模式下仅仅是将射频相关电路停掉来达到省电的目的,这样的话,这个模块即达到节点的目的又加快的启动时间,但它的功耗交完全掉电相比还是要高,大约在30-300uA这个范围,但是也算很省电了。

射频功耗控制,全火力模式下(也就是模块处于正常收发数据的状态下),模块也有对射频功耗控制的手段,达到省电的目的。nrf2401模块的射频功耗被划分为4个档次,分别为0/1/2/3,分别对应的-18/-12/-6/0dBm。其他方面同等条件下,功率越小传输距离越小,可以根据实际情况自行选择使用什么功率配置。值得注意的是,射频功率控制只能控制对外发送数据,接收数据的功率是没办法控制的。

nfr24l01的通信类型属于半双工,就是说再同一时刻,一个模块仅能收数或者发数,无法做到同时收发。为了保证数据的准确稳定的传输,双方做了一个约定,即通信流程。

二、数据收发原理

1、设备地址:

与mac地址一样,每一个nrf2401设备有一个唯一的地址(可理解为设备ID)来充当设备的身份证,地址长度可以设3/4/5的任选一。设备发送时,先发对端的设备地址,然后再发数据。若配置了硬件ack应答,则每次收到数据后,会像对端回复ack应答。

Nrf2401有6个地址通道,也就是说模块有6个数据通道,同时可和6个设备进行交互也可以是6个通道的多路数据转发等设计。6个通道的地址宽度配置是要保持一致,不支持6个同通道下的不同地址宽度的配置。

* channel0和channel1地址宽带可随意配置,最大宽度为5,低字节兼容3/4宽度的地址;

* channel2-channel5,最低字节可随意配置其他字节与channel共享;

* 向同一设备发送数据,即使信道(地址)不同,也会存在干扰可能接收数据失败;

2、数据校验:

nrf2401支持CRC8/CRC16,通过配置寄存器的方式,二选一。发送设备将要发送的数据(包括地址)进行CRC计算后,添加到发送包中发出去。接收设备收到数据将数据计数后,和数据中的CRC值进行校验,如果不匹配就丢弃;

3、长帧数据:

模块发送最大长度为32字节,要想发送长帧,就需要分包发送,发送的数据除了周期的数据还有事件数据。周期数据一般采用单包数据,比如心跳信号。长帧数据的用来做事件发送,而且需要一包数据发送的单帧计数器来防止数据发乱发错。设备本身替我们做了CRC校验和地址自动匹配,如果需要一对多的收发,可以在设备的数据域再加一个地址,把硬件地址当作信道使用。

af4c7978-7b95-11eb-8b86-12bb97331649.png

说明:

*短帧的数据可以直接使用,最大长度32byte,可以周期,也可以事件;

*长帧数据不建议周期发送,一般用作事件发送类型使用;

帧格式解析:

*长帧数据为了提高数据的安全性,需要对长帧数据再次进行CRC校验;

*count计数器是避免数据包不丢失;

*flag标识

bit 0 ,0=非ACK帧, 1=ACK帧, 若是接收帧,则是表示ACK数据或者正常数据;

bit 1, 0=非ACK帧, 1=ACK帧, 若是发送帧,这位表示告诉接收方是否需要回复ACK应答,

bit 2, 0=短帧, 1=长帧, 标识是否为长帧或者单帧;

bit3-bit4,0=第一帧,1=流控帧,2=结束帧;

4、单帧的数据

单帧比较简单,没有再次CRC校验和count计数,帧格式如下:

af6c662a-7b95-11eb-8b86-12bb97331649.png

*flag标识

bit 0 ,0=非ACK帧, 1=ACK帧, 若是接收帧,则是表示ACK数据或者正常数据;

bit 1, 0=非ACK帧, 1=ACK帧, 若是发送帧,这位表示告诉接收方是否需要回复ACK应答,

bit 2, 0=短帧, 1=长帧, 标识是否为长帧或者单帧;

责任编辑:lq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2849

    浏览量

    53433
  • 无线通信
    +关注

    关注

    58

    文章

    5077

    浏览量

    147020
  • 串口
    +关注

    关注

    15

    文章

    1627

    浏览量

    83326

原文标题:来实战之《嵌入式UART项目开发》步骤四:无线通信模块的协议

文章出处:【微信号:cirmall,微信公众号:电路设计技能】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    美的与吉宝携手推出AI智能模块化制冷解决方案,覆盖亚洲市场

    新加坡2026年4月14日 /美通社/ -- 美的集团旗下的美的楼宇科技与新加坡吉宝有限公司基础设施部正式签署战略合作协议,双方将共同开发面向亚洲市场的AI驱动、节能高效的模块化制冷解决方案
    的头像 发表于 04-15 16:39 113次阅读
    美的与吉宝携手推出AI智能<b class='flag-5'>模块化</b>制冷解决方案,覆盖亚洲市场

    深度剖析MC68331:32位模块化微控制器的卓越之选

    深度剖析MC68331:32位模块化微控制器的卓越之选 在电子工程师的世界里,不断寻找高性能、高集成度且易于开发的微控制器是永恒的追求。MC68331这款32位模块化微控制器,凭借其独特的架构和丰
    的头像 发表于 04-09 10:15 154次阅读

    LuatOS 系统框架的模块化设计原理

     LuatOS 的设计核心在于高度模块化与松耦合架构。系统将硬件驱动、通信协议、定时任务等封装为独立模块,通过统一的注册与回调机制接入主事件循环。这种设计不仅提升了代码复用率,也使得
    的头像 发表于 02-03 15:56 280次阅读
    LuatOS 系统框架的<b class='flag-5'>模块化</b>设计原理

    端到端与模块化自动驾驶的数据标注要求有何不同?

    [首发于智驾最前沿微信公众号]自动驾驶技术路径的每一次技术转向,都伴随着底层数据处理逻辑的彻底重构。过去,智驾系统普遍依赖模块化设计,将驾驶任务拆解为感知、预测、规控等独立环节;而今,以端到端技术为
    的头像 发表于 01-27 09:48 1109次阅读
    端到端与<b class='flag-5'>模块化</b>自动驾驶的数据标注要求有何不同?

    模块化高精度铷原子钟存在的意义

    在时频计量领域,铷原子钟以其稳定性和可靠性成为通信、导航、科研等领域的核心设备。西安同步电子科技有限公司的SYN3306型高性能铷原子钟,通过将10MHz输出设计为模块化结构,实现了从“单一功能设备
    的头像 发表于 01-21 19:09 255次阅读

    MCU自动测量单元的分布式模块化设计有什么用?

    、可靠性与经济性的关键。首先,“模块化”指的是系统由多个独立的功能单元——即采集模块——构成。MCU系列提供了从1通道到40通道等多种规格的模块,用户可以根据测点
    的头像 发表于 01-14 14:56 276次阅读
    MCU自动测量单元的分布式<b class='flag-5'>模块化</b>设计有什么用?

    鼎阳科技推PXIe模块化示波器、PXIe模块化矢量网络分析仪产品组合,构建新一代模块化、软件定义的测试平台

    新品发布 2026年1月12日,鼎阳科技全新推出PXIe模块化示波器、PXIe模块化矢量网络分析仪和USB矢量网络分析仪三款新品,并同步推出三款PXIe嵌入式控制器与PXIe混合机箱。基于模块化架构
    的头像 发表于 01-14 10:35 6.6w次阅读
    鼎阳科技推PXIe<b class='flag-5'>模块化</b>示波器、PXIe<b class='flag-5'>模块化</b>矢量网络分析仪产品组合,构建新一代<b class='flag-5'>模块化</b>、软件定义的测试平台

    模块化开关电源组合特性测试研究

    模块化开关电源产品被广泛应用于工业自动控制、高可靠设备、科研设备、半导体制冷制热、工控设备、通讯设备、电力设备、仪器仪表、医疗设备等领域。中电华星作为国内目前销售规模较大的模块化电源供应商,在
    的头像 发表于 11-19 14:31 1.2w次阅读
    <b class='flag-5'>模块化</b>开关电源组合特性测试研究

    主流低代码开发平台有哪些:加速数字转型的核心力量

    在数字转型浪潮席卷各行各业的当下,企业对快速开发、灵活迭代应用程序的需求日益迫切。低代码开发平台凭借其可视编程、
    的头像 发表于 11-03 16:53 701次阅读

    新品发布|LRM模块化高速连接器

    认证发明专利。该款连接器是一种模块化、高性能高速率的系统连接器产品,多腔体模块化设计可以支持多种信号类型,射频、高频高速、光信号及电源的混合传输,不同的腔体可以灵
    的头像 发表于 10-20 17:02 2325次阅读
    新品发布|LRM<b class='flag-5'>模块化</b>高速连接器

    新品推荐|模块化集成式高速连接器

    LRM连接器随着电子技术的快速发展,在电力传输、工业自动、航空航天等领域,对高效、稳定、可靠的电气连接解决方案的需求日益增长。因此日晟万晟开发了新一代模块化集成式高速连接器-LRM系列,该款连接器
    的头像 发表于 07-07 18:15 1731次阅读
    新品推荐|<b class='flag-5'>模块化</b>集成式高速连接器

    MCU分布式模块化自动测量单元支持哪些测量任务?

    MCU-40型分布式模块化自动测量单元(MCU),是一款专为岩土工程与结构物安全监测设计的先进数据采集系统。其核心优势在于强大的多类型传感器兼容能力与模块化设计,能够高效完成以下关键测量任务:振弦式
    的头像 发表于 06-26 10:28 667次阅读
    MCU分布式<b class='flag-5'>模块化</b>自动测量单元支持哪些测量任务?

    【新品】远距离图传数传模块开发板、蓝牙模块开发板、无线模块开发

    新品上市图传数传模块开发板蓝牙模块开发板国产无线模块开发板部分型号参与送样文末了解详情↓↓↓EW
    的头像 发表于 06-12 19:33 1413次阅读
    【新品】远距离图传数传<b class='flag-5'>模块</b><b class='flag-5'>开发</b>板、蓝牙<b class='flag-5'>模块</b><b class='flag-5'>开发</b>板、无线<b class='flag-5'>模块</b><b class='flag-5'>开发</b>板

    鸿蒙5开发宝藏案例分享---模块化设计案例分享

    代码详解,保证接地气! 一、为什么必须模块化? 官方文档强调: “模块化是大型应用的生命线” 。当团队协作开发时(比如购物App分支付、商品、订单团队),
    发表于 06-12 16:17

    原理图模块化,BOM 物料位号处理

    原理图模块化,把常用的模块保存成一个PART(在TOOL 菜单下 选择 Generate Part)。保存成OLB格式。使用的时候,就像使用元器件一样,从库里面拖出来直接放到原理图上即可。 问题是
    发表于 06-09 19:27