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

2 篇文章 0 订阅
1 篇文章 1 订阅

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

一. 想法概述

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 构建支持云端应用的嵌入式系统平台 【二】

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于树莓派STM32的智能家居系统,需要一个清晰的系统架构和细致的软件设计。首先,我们需要将树莓派STM32以及Onenet云平台进行嵌入式开发,以实现智能家居系统的各种功能。 系统架构中,树莓派被设计为主控设备,负责与云平台进行通信和控制。而STM32作为从设备,主要处理各种传感器和执行器的数据采集和控制功能。这样的架构可以有效分担树莓派的计算负担,并提高系统的稳定性和响应速度。 在软件设计方面,我们可以采用分层的设计思路。首先是应用层,这个层次负责用户交互和控制。通过设计友好的用户界面和优雅的交互方式,使用户能够方便地使用系统各项功能。 其次是通信层,这个层次负责树莓派和云平台之间的通信。我们可以使用MQTT协议,通过WiFi或以太网连接树莓派和云平台,实现数据的传送和云端控制。 再次是逻辑层,这个层次负责处理来自传感器和执行器的数据,并自动化执行一些任务。通过编写适当的逻辑算法和规则,使系统能够智能地感知和响应环境变化,例如自动调节温度、照明和安防等。 最后是驱动层,这个层次负责与STM32进行通信和控制。我们可以编写相应的驱动程序,与STM32的GPIO口进行通信,实现对传感器和执行器的控制。 整个系统的设计需要考虑可扩展性和易于维护性。我们可以使用面向对象的编程方法,将各个功能模块进行封装,使其能够独立工作和灵活组装。同时,我们还需要进行充分的测试和调试,以确保系统的稳定性和可靠性。 总之,基于树莓派STM32的智能家居系统设计,需要一个清晰的架构和合理的软件设计。通过分层设计和模块化开发,我们可以实现一个功能强大、稳定可靠的智能家居系统

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值