基于 树莓派4 + STM32H7 构建支持云端应用的嵌入式系统平台 【一】

2023-10-26

原创不易,转载请注明出处,互相尊重劳动成果,谢谢!

一. 想法概述

1. 想法由来

从事嵌入式软件开发多年,涉及许多不同产品需求与应用场景,其间使用了多种不同的软硬件系统与平台,系统的选型始终没法做到构建一个统一成熟的系统来覆盖所有应用,达不到这种一劳永逸的理想状态,选型策略都是围绕满足需求,考虑成本、资源限制、功能复杂度等,而且在产品中基本是生产成本是第一位要考虑的,选型没有最好,只有适合,所以也才有了ST的上百种产品协型号,满足不同的产品需求与成本限制。

随着这几年,在人工智能、云服务、大数据计算等方面的应用增长,越来越多的嵌入式产品也被纳入到这个生态圈中,作为数据采集前端,或底层执行机构,成为了整个系统框架不可或缺的部分,所谓的智能化分析、控制、决策与执行,都离不开底层嵌入式产品或模块的支持。在一些高利润、大规模的产品系统中,模块成本已不是所要考虑的最关键的因素,实现功能、运行性能、长期的可扩展性、可维护性变成了系统架构设计中首要考虑的重要因素,既要满足底层系统的强实时性、高可靠性,又要满足复杂数据分析处理的高性能要求,并能够连接到云服务平台,上传各类实时数据,为更上层的人工智能分析处理提供海量数据,并基于此数据进行数据挖掘与深度学习,进而将智能决策后的控制需求落到实处,准确可靠地及时执行,完成整个智能系统的闭环。

基于以上对未来技术的发展趋势的分析与预测,结合以前的项目经验与开发能力,在自己能够实现的范围内,构建一套能够满足上述需求的软件系统,既能保证实时性与可靠性,又具备一定的复杂数据处理能力与可扩展性,并实现与云平台的数据交互,完成数据采集处理、实时控制、以及决策执行等功能;并能够具备良好的升级控制能力,在硬件升级迭代时,软件也能够方便轻松地迁移到新平台。

2. 系统架构

考虑到目标系统既要满足强实时性,又需要较为复杂的数据处理、存储、传输等功能,较为理想的架构是双核心异构系统,即使用两个不同类型的系统进行互联后组成整个平台,MCU+RTOS 实现强实时方面的控制需求,包括外围各类外设接口等;APU+Linux 实现数据的复杂计算处理、存储、网络传输、远程诊断/维护等业务与服务。两个系统通过高速连接进行数据交互,各司其职,整体组成前端嵌入式产品或模块。

两个系统间的连接方式,取决于相互传输的数据量的大小。
对于一般产品而言,MCU会做必要的前端数据处理,仅处理结果传输到Linux平台做进一步的处理或向云端传输,两个系统间的数据传输与频率均不高,此时可选择串口作为数据传输通道。串口的优点在于处理简单高效,两个系统的串口属于板级连接,物理传输路径很短,可以轻松将传输速率拉升到1~2Mbps,且收发独立的传输方式可实现数据异步传输,满足关键数据的突发与实时传输。
如果有更高数据传输量的需求,可考虑SPI或QSPI接口,传输速率可达数十M甚至百Mbps,但要达到高传输速率的QSPI接口在Linux平台上需要进行优化设计,包括硬件与驱动两方面,设计复杂度较大。
其他接口可选择USB接口,USB HS的传输速率可480Mbps,但需要MCU上支持并实现USB HS接口。此外USB接口并不是工业接口规范,在现场使用时可能会出现掉线情况,且掉线后的自恢复能力并不十分可靠。
还可选择Ethernet接口,两个系统之间使用网络连接通信,数据传输高速可靠,且协议灵活度很高,可满足各类数据复杂传输需求。但最好是Linux平台留出一个专用的网口与MCU平台连接通信,降低系统设计的复杂性。

3. 系统选型

基于目前手上已有的硬件开发板,选择树莓派4b板和STM32H743开发板来搭建上述异构系统。

STM32H743基于Cortex M7内核,主频最高480MHz,片内1M SRAM,基本满足绝大多数的实时控制需求。
该MCU具备很多外设接口,系统中所有涉及到的外设器件,都连接到该MCU上做接口控制。
软件平台采用ThreadX平台,使用包括ThreadX、FileX+LevelX、NetX、USBX等组件,完成系统调度与通信。

树莓派4b的性能数据可网上搜索,资料很多。

两块开发板的连接方式,可采用串口、USB或以太网络,这三种方式都可实现,前期先基于串口连接进行数据互传,后续根据实据传输的数据量及实时要求,再实现网络传输和USB。

4. 开发语言

  1. C,用于MCU平台上的软件开发
  2. C/C++,用于Linux上的驱动、业务层软件开发
  3. Python,用于Linux上数据分析处理算法开发
  4. JAVA/Konlin,用于Linux上BS架构服务中的WebServer后端服务开发,以及云端服务开发
  5. JavaScript/TypeScript,用于Linux上BS架构服务中的前端页面开发,以及云端服务的访问页面开发
  6. C#,用于PC端调试工具及应用软件开发

5. 涉及到的框架

  1. ThreadX,用于构建嵌入式应用框架
  2. SpringBoot,用于BS后端服务框架
  3. VUE+Quasar,用于BS前端页面框架
  4. Prism,用于C# MVVM软件框架
  5. DotNetBar WPF,用于C#图形界面开发

6. 开发工具

  1. MCU 代码编辑工具,使用 SouceInsight 和 CLion 混合使用
  2. MCU 代码编译、调试工具,使用 IAR
  3. Linux 代码开发、调试,使用 CLion
  4. Python 开发、调试,使用 PyCharm
  5. 后端 Java/Kotlin 开发、调试,使用 IntelliJ IDEA
  6. 前端 JavaScript/TypeScript 开发、调试,使用 WebStorm
  7. PC端 C# 开发,使用 Vistual Studio 2022

7. 功能实现

设计目标:覆盖整个系统软件框架的所有涉及的功能与部件,具备信号采集、处理、上传、浏览、查询等功能,且能够基于现有硬件平台最简实现。

第一期功能实现,考虑仅使用两块开发板,不增加额外硬件的前提下,实现数据的实时采样上传,并通过数据流实现数据链路覆盖各个软件模块及功能,前期使用STM32H743片内ADC,实时读取MCU内部温度,通过板间数据通道,传送到树莓派板,并基于Python做简单的低通滤波处理,并将处理后的数据,上传到外部服务器,服务器端判断温度数值,超过设定阈值后下发报警命令,下行通知到树莓派及H743,两块板同步报警,报警方式为闪烁LED灯的简单方式,形成数据闭环。

此外,在树莓派上做BS服务,用户可通过浏览器访问树莓派,实时显示系统状态及当前温度,以及短时温度曲线,后续可做为本地UI通道,实现系统交互控制;服务器端也做BS服务,支持用户查看系统温度、检索历史温度数据及曲线,查看运行状态及报警记录等,后期可做报警时同步通知绑定用户,通知方式可基于微信、短信或邮件;服务器端同时做后台管理界面,支持用户登录后管理系统,配置参数,查看整个系统运行数据看板等功能。

后续功能设计中,可考虑更复杂的数据获取、处理算法、数据挖掘与深度学习框架等,更具体实际产品应用需求,完善软件功能模块,搭建一套实用软件平台框架,准备好应对各类产品需求所需的技术节点储备,实现快速产品化的目标。

二. 环境搭建

1. MCU开发环境

  1. MCU开发平台选用IAR 9.2。下载链接:

    IAR 9.2 下载页面链接

  2. 代码编辑工具选用SourceInsight和Clion,两者功能各有千秋,互补使用。

  3. 在Github上,下载ThreadX全家桶代码,包括ThreadX、NetX、FileX和USBX。
    ThreadX RTOS的下载地址如下:

    Threadx RTOS 源码

    ThreadX下载时的最新版本为6.1.11版。下载并解压ThreadX源码,打开ThreadX中基于M7内核的IAR示例工程,工程路径为:

		threadx-master\ports\cortex_m7\iar\example_build\azure_rtos.eww

编译其中的 tx 目标,生成ThreadX的RTOS库,供MCU软件框架工程使用,避免每次重新编译时,都花费冗余时间反复编译这些库文件,提高编译效率。

  1. ST固件库使用LL库开发,提高运行效率,减少HAL库本身出问题引入的不稳定性。不过使用LL库后,基本不再使用ST Cube,所有硬件外设的驱动均基于LL库自行设计实现,除了USB驱动与Ethernet驱动外,这两个外设使用机制较为复杂,仍使用HAL库实现底层访问与操作。
    STM32H7的固件库下载地址:

    STM32H7 固件库源码

当时下载的最新版本是1.10.0。解压源码后,在例程目录中随便选找一个H743的IAR示例工程,如:

	STM32CubeH7-master\Projects\STM32H743I-EVAL\Applications\FreeRTOS\FreeRTOS_ThreadCreation\EWARM\Project.eww

打开后,将工程属性设置为Library,删除工程中的所有应用目录与文件,仅保留Drivers下的CMSIS和STM32HA7xx_HAL_Driver两个目录中的文件,并将固件库中所有LL驱动代码添加进来,源文件位于:

	STM32CubeH7-master\Drivers\STM32H7xx_HAL_Driver\Src

将目录中的所有 stm32h7xx_ll_xxx.c 文件都加入到工程中,编译生成STLibrary.a库,供MCU软件工程使用。
上述方法是借用一个已配置好的H743工程,改造为ST驱动库,省去工程的一些配置操作。当然也可以全新建一个库工程,包含进所有HAL和LL的驱动文件,并设置相应的目标工程参数,生成所需的驱动库。

  1. 新建MCU软件工程,或者按照上面的方法,复制ThreadX示例工程,在其上直接修改作为自己的工程。器件选择开发板上的MCU型号 STM32H743II,添加必要的启动文件和上述两个库。
    在ThreadX中的初始任务定义中,创建 threadMonitor 任务:
void    tx_application_define(void *first_unused_memory)
{
    UCHAR* pointer = (UCHAR *) first_unused_memory;

	InitBoard();

    tx_thread_create(&thread_monitor, "threadMonitor", thread_monitor_entry, 0,
        pointer, NORMAL_STACK_SIZE,
        MONITOR_THREAD_PRIORITY, MONITOR_THREAD_PRIORITY, TX_NO_TIME_SLICE, TX_AUTO_START);
}

在任务实现中,睡眠500毫秒后翻转开发板上LED灯引脚:

	void    thread_monitor_entry(ULONG thread_input)
	{
		while(1)
		{
			LL_GPIO_TogglePin(GPIOH, LL_GPIO_PIN_12);
			tx_thread_sleep(500);
		}
	}

编译、下载、运行,观察LED灯每秒闪烁一次,运行正常。
在这里插入图片描述

  1. 至此,MCU开发平台搭建完成。

2. 树莓派开发环境

  1. 在树莓派的官方网站中,下载最新的版本的 Raspberry Pi OS,下载链接:

    Raspberry Pi OS 下载

考虑到树莓派仅用做代码开发调试,并不做复杂的应用,所以下载体积较小的第一个版本:
树莓派版本选择

  1. 下载TF卡烧写工具,下载链接:

烧写工具

写入树莓派系统到TF卡

  1. 将下载好的镜像,写入到新的8G TF卡中。
  2. 插入TF卡到树莓派板,上电后,系统正常运行。

搭建好两个硬件系统的设计、运行环境后,接下来先建立MCU上的软件,实现使用片内ADC进行温度采集与串口传输的功能。

下一篇 ->

基于 树莓派4 + STM32H7 构建支持云端应用的嵌入式系统平台 【二】

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于 树莓派4 + STM32H7 构建支持云端应用的嵌入式系统平台 【一】 的相关文章

随机推荐

  • 顺序表的C语言实现

    头文件 SeqList h pragma once include
  • 正大国际期货:期货市场到底难在哪儿?

    正大国际金融控股有限公司 简称 正大国际 成立于2019年11月4日 为香港证监会辖下之持牌法团 证监会中央编号 BOP620 从事第2类及第5类受规管活动及期货合约交易及就期货合约提供意见 主要从事商品期货经纪 金融期货经纪业务 致力于提
  • 程序员如何晋级管理层

    在技术领域 程序员们往往是团队中的核心力量 但是 在职场上 技术过硬并不意味着可以永远待在技术岗位上 程序员们很可能在职场中遇到瓶颈 希望获得更高的职位 那么 作为一名程序员 如何晋升到管理层呢 加强团队合作想要晋升管理层 首先需要具备团队
  • hadoop遇到的问题: org.apache.hadoop.ipc.Client: Retrying connect to server异常的解决

    今天在用pig脚本在hadoop运行时 出现如下错误 前提 hadoop能正常启动 pig的参数也正常配置好了 但是运行脚本就出现org apache hadoop ipc Client Retrying connect to server
  • 中国开源走向第二梯队!

    作者 彭慧中 责编 屠敏 出品 CSDN ID CSDNnews 开源已成为迄今为止最先进 最广泛 最活跃的协同创新模式 近年来 中国开源的发展已成为全球最快 中国在国际社区中的贡献度日益提升 在国际开源生态中的影响力日渐增强 在蓬勃发展之
  • 蒙特卡洛量化分析方法

    蒙特卡洛方法主要思想 对于一个随机系统 输出随输入变化是随机的 那么通过重复采样的方法可以得到输出的具体分布 进而再对输出分布形式进行分析 大数定律 当在试验不变的条件下 重复试验多次 随机事件的频率近似于它的概率 将上述思想用于量化分析
  • 常见国内镜像源地址

    常见国内镜像源地址 常见的pip后面的镜像源地址 常见国内镜像源地址 常见的pip后面的镜像源地址 清华大学 https pypi tuna tsinghua edu cn simple 阿里云 http mirrors aliyun co
  • ABAP:ONCHANGEOF的坑

    以下文章来源于ABAPer孙亮 作者孙小亮 ABAPer孙亮 绝对 有用 实用 的ABAP与Excel 原创 干货 不定期发布 可加vx 286503700交流 1 7 背景 由于AT NEW field会判断field和它前面的所有字段
  • 靠营销出圈的拉面说,会是下一个黄太吉吗?

    乘着 宅经济 一人食 的东风 方便速食这一餐饮细分赛道愈发火热 CBNData发布的 2021方便速食行业洞察报告 数据显示 方便速食行业近年来规模增长稳健 预估国内市场规模超2500亿元 而线上市场近一年的增长率更是超过了70 广阔的市场
  • DataGrip汉化设置

    左上角file settings plugins搜chinese如下图搜索结果 选择第二个官方汉化插件安装即可
  • 构造函数的初始化列表

    构造函数初始化列表以一个冒号开始 接着是以逗号分隔的数据成员列表 每个数据成员后面跟一个放在括号中的初始化式 例如 include
  • 【科普】一分钟看懂WINDOWS系统、LINUX系统和苹果操作系统到底有什么区别?

    转自 首先 不管是WINDOWS操作系统 LINUX系统还是苹果操作系统 甚至包括操作系统的鼻祖UNIX操作系统 最早都是用C语言编写的 实际上UNIX操作系统和C语言都是由贝尔实验室的汤普森 Ken Thompson 和丹尼斯 里奇 De
  • RFC文档(中文翻译版本)

    RFC文档官方在线阅读地址 https tools ietf org rfc index 以下是部分中文翻译的文档连接 RFC文档目录 RFC1 主机软件 RFC2 主机软件 RFC3 文档规范 RFC4 网络时间表 RFC6 与 Bob
  • Jmeter导出测试报告

    不管是测接口还是性能 测试完毕之后我们总是希望有所产出 能看的更直观 Jmeter就提供了导出测试报告的功能 一起看看怎么玩 如果细心留意的话 会看到在启动jmeter时 dos窗口会有一行命令 实际上这个命令就阔以帮助我们导出测试报告 我
  • 强制Vue重新渲染组件的最佳方式(亲测完美解决问题)

    有时候 依赖 Vue 响应方式来更新数据是不够的 相反 我们需要手动重新渲染组件来更新数据 或者 我们可能只想抛开当前的DOM 重新开始 那么 如何让Vue以正确的方式重新呈现组件呢 强制 Vue 重新渲染组件的最佳方法是在组件上设置 ke
  • MySQL 使用两种方式清空表,删除表中的所有数据

    假设要删除book表中的所有数据 DELETE FROM book 或 TRUNCATE TABLE book 两者的区别在于 如果book表的主键Id设置为自增的整型 那么 第一次新建一条数据不指定Id Id自动赋值为1 如果使用Dele
  • 刷脸支付项目成本低是创业投资首选

    人工智能技术的改革 还可以说刷脸支付的应用开启了人工智能技术的改革 在以往的人工智能技术的应用而言还不是十分普及 而人工智能技术的在商业化的落地 对于全国店家而言还可以得到广泛的应用 随着各方从业人员的推广以及技术的不断更新 人工智能技术和
  • 打印杨辉三角

    要打印杨辉三角 我们首先要观察杨辉三角中数的规律 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 5 1 如图 我们可以把杨辉三角中前面的空格先省掉 观察数的规律 可以把这些数看做一个二维数组 1 二维数组第一列的
  • 一文了解 Redis

    Redis 简介 Redis Remote Dictionary Server 是一个开源的高性能键值对存储数据库 最初由 Salvatore Sanfilippo 开发 它在内存中存储数据 并提供了持久化功能 可以将数据保存到磁盘中 是一
  • 基于 树莓派4 + STM32H7 构建支持云端应用的嵌入式系统平台 【一】

    基于 树莓派4 STM32H7 构建支持云端应用的嵌入式系统平台 一 一 想法概述 1 想法由来 2 系统架构 3 系统选型 4 开发语言 5 涉及到的框架 6 开发工具 7 功能实现 二 环境搭建 1 MCU开发环境 2 树莓派开发环境