当前位置: 首页 > news >正文

【动手学电机驱动】STM32-MBD(3)Simulink 状态机模型的部署

STM32-MBD(1)安装 Simulink STM32 硬件支持包
STM32-MBD(2)Simulink 模型部署入门
STM32-MBD(3)Simulink 状态机模型的部署

【动手学电机驱动】STM32-MBD(3)Simulink 状态机模型部署

    • 1. Simulink/STM32 代码生成的软硬件条件和环境测试
      • 1.1 软硬件条件
      • 1.2 开发环境测试
    • 2. 基于状态机的 Simulink 闪灯模型
      • 2.1 创建 Simulink 仿真模型
      • 2.2 创建 STM32CubeMX 工程
      • 2.3 搭建 Simulink 仿真模型
      • 2.4 配置 STM32CubeMX 工程
    • 3. Simulink 状态机模型的仿真
    • 4. 从 Simulink 模型生成 STM32 代码
    • 5. 附录:嵌入式系统的状态机(State Machine)
      • 5.1 状态机的基本概念
      • 5.2 Simulink Stateflow 的使用

通过安装MATLAB 硬件支持包,可以将 STM32 微处理器与 MATLAB/Simulink 结合使用,让开发者可以直接在MATLAB环境中进行嵌入式系统的设计和调试。

状态机是常用的嵌入式软件设计模式,可以描述系统在不同状态下的行为,定义事件和状态之间的转移条件,实现复杂的逻辑和条件。

上一篇采用 NUCLEO-G431RB 开发板, 以 LED 点灯实验为例,使用 Matlab/Simulink 建模仿真后直接生成 STM32 项目工程代码。本文还是采用 NUCLEO-G431RB 开发板,使用 Simulink Stateflow 设计状态机实现控制逻辑,来实现 LED 点灯实验。在建模仿真后使用 Simulink 直接生成 STM32 项目工程代码,将状态机仿真模型部署到基于 STM32 处理器的硬件板。


1. Simulink/STM32 代码生成的软硬件条件和环境测试

Simulink/STM32 代码生成对于软硬件和开发环境的要求非常严格,很容易由于版本不匹配或路径错误而失败。作者已经踩过了很多的坑,可以说是我在所有开发项目中都从未经历过的。


1.1 软硬件条件

关于所需的软硬件条件和安装过程,详见 【STM32-MBD】(1)安装 Simulink STM32 硬件支持包。
强烈建议安装相关软件时使用推荐版本。
请严格按照文中介绍的步骤安装和配置软件。

必需的硬件:

  • STM32 开发板(如:NUCLEO-G431RB 开发板,也可以选择其它 STM32 开发板,但需要安装对应的固件包)。
  • Micro-micro USB 数据线,或 USB Type-A 至 Micro-B 连接线缆,用于将STM32 Nucleo 板连接到 PC。

必需的软件:

  • STM32 开发工具(建议首先严格使用推荐版本跑通本文项目)

    • STM32CubeMX (推荐使用 V6.4.0)
    • STM32CubeProgrammer (推荐使用 V2.6.0)
    • STM32CubeIDE(或 Keil,MDK-ARM 等 IDE 工具)
    • STM32Cube_FW_G4 固件包(推荐采用 V1.5.0)
      如果使用其它 STM32 MCU,则需选择对应的固件包。例如使用 STM32F4 时则要选择STM32Cube_FW_F4_V1.26.0 固件包。
  • MATLAB/Simulink(本文使用 MATLAB R2022b,可以采用更新版本)

    • Simulink Coder:从 Simulink 模型、Stateflow 图和 MATLAB 函数生成并执行 C 和 C++ 代码,用于实时和非实时应用,包括仿真加速、快速原型构建和硬件在环测试
    • STM32 嵌入式硬件支持包,Embedded Coder Support Package for STMicroelectronics STM32 Processors,STM32 处理器的嵌入式硬件支持包

1.2 开发环境测试

为了确定 Simulink/STM32 代码生成 的开发环境安装配置成功,首先要逐项进行检查测试。具体步骤详见 【STM32-MBD】(2)Simulink 模型部署入门。

  1. 运行 STM32CubeMX,菜单选择 Help–About,检查版本为 V6.4.0。

  2. 在 STM32CubeMX 菜单选择 Help–Manage embedded software packages,检查已安装 STM32Cube MCU Package for STM32G4 Series V1.5.0 固件包。

  3. 运行 STM32CubeProgrammer,测试与 STM32 开发板的连接。
    (1)用 USB 连接线连接计算机与 NUCLEO-G431RB 开发板,确保连接正常。
    (2)运行 STM32CubeProgrammer,点击右上角 “Connect” 按钮连接设备。
    如下图所示,检查与 STM32 开发板的连接:
    (a) 右上角的状态灯为绿色并显示 “Connected”;
    (b) 右侧信息栏 “Target information” 显示目标设备 STM32 MCU和开发板的信息;
    © 在 “Device memory” 信息栏显示设备内存地址和对应的内存信息。
    在这里插入图片描述

  4. 运行 Matlab,菜单选择 主页–附加功能–管理附加功能,弹出“附加功能管理器”窗口,检查已安装 STM32 嵌入式硬件支持包 “Embedded Coder Support Package for STMicroelectronics STM32 Processors”。

  5. 点击齿轮图标“设置” STM32 嵌入式硬件支持包:
    (1)选择所使用的 MCU 型号(本文为 STM32Gxx Based MCUs)。
    (2)提示必需的 STM32 工具及版本(STM32CubeMX、STM32CubeProgrammer)。
    (3)对 STM32CubeMX 进行验证:点击 “Browse” 选择 STM32CubeMX 的安装路径,点击 “Validate” 进行验证。
    (4)对 STM32CubeProgrammer 进行验证:点击“Browse”选择 STM32CubeProgrammer 的安装路径,点击 “Validate” 进行验证。
    在这里插入图片描述


2. 基于状态机的 Simulink 闪灯模型

实验名称:2. 基于状态机实现 LED 闪灯

在 【STM32-MBD】(2)Simulink 模型部署入门中,我们先使用 STM32CubeMX 创建 STM32 工程,再到 Simulink 配置项目文件。另一种方法是从 Simulink 创建一个STM32CubeMX 工程文件(.ioc),这使项目的路径设置更方便。本文采用这种方法来实现 Simulink 代码生成。


2.1 创建 Simulink 仿真模型

  1. 为仿真模型新建一个子目录,例如:“D:\SimulinkProjects\STM32G431_MBD02”。

  2. 运行 MATLAB 软件,打开 Simulink。点击 “空白模型” 创建新的 Simulink 模型,保存到本项目路径下:STM32G431_MBD02.slx。

  3. 在 Simulink 菜单选择 “建模” - “模型设置” (也可以用 CTRL+E),打开“配置参数”对话框。
    左侧边栏中选择“求解器”,如下图所示。
    (1)在右侧 “仿真时间” 设置为 “inf”。
    (2)在 “求解器选择” 选项设置类型为 “定步长”,“固定步长(基础采样时间)” 设为 “1e-4” (对应于 MCU 的 ADC 采样频率为 10kHz)。
    (3)可选地,在 "任务和采样周期选项"下勾选:“将每个离散速率视为单独任务”和“自动处理数据传输的速率转换”。

在这里插入图片描述


2.2 创建 STM32CubeMX 工程

  1. **检查 PC 与 STM32G431 开发板连接正常。**然后在“配置参数”窗口的左边栏中选择“硬件实现”,在右侧 “硬件板(Hardware board)” 选项的下拉框中选择 “STM32G4xx Based”。
    如下图所示,系统识别到目标设备为 STM32G4 系列,设备 ID为 STM32G431R(6-8-B)Tx。
    说明:
    (1)必须确保 PC 与 STM32G431 开发板连接正常,才能进行硬件配置。
    (2)根据使用的 STM32 的型号,从 “Hardware board” 中选择适当的硬件板选项,配合 STM32CubeMX 配置外设来实现对 STM32 硬件板的支持。本项目使用 STM32G431RB MCU,因此选择 “STM32G4xx Based”。

  2. 在右侧 “Hardware board settings” 配置 “Target hardware resources” ,创建一个STM32CubeMX 工程文件。
    (1)点击 “Create” 创建一个STM32CubeMX 工程文件 STM32G431_MBD02.ioc。
    (2)点击 “Browse” 选择当前项目的目录,即仿真模型 .slx 与 CubeMX 项目 .ioc 要保存在同一个目录下。
    (3)在 “Project name” 输入 CubeMX 工程文件的文件名,如 STM32G431_MBD02.ioc。
    (4)在 “Select hardware” 选择硬件开发板的型号,如本文使用 NUCLEO-G431RB。如果使用用户开发板,选择 “Custome STM32G4xx Based”。
    点击 “确定”,就在指定项目目录下创建 STM32CubeMX 工程文件 STM32G431_MBD02.ioc。

在这里插入图片描述

  1. 选择硬件在环通信串口。
    点击 “Target hardware resources–Groups–Connectivity”,将 “USART/UART" 设为 “USART3”,将 “Serial port" 设为 电脑上的 COM 端口。具体端口号可以查看电脑”设备管理器“中的”端口(COM和LPT)“。
    注意:这是针对 NUCLEO-G431RB 开发板集成了 STLINK-V3E 串口一体调试器。如果使用单独的 USB 转串口模块,要注意连线正确(USART3:PB10, PB11)。

2.3 搭建 Simulink 仿真模型

回到 Simulink 仿真窗口,搭建仿真模型。

  1. 点击菜单栏的 “库浏览器” 打开库浏览器,搜索 “Stateflow” 并选择 “chart” 模块,将其拖动到右侧,在仿真模型中添加一个状态机。

在这里插入图片描述

  1. 双击 “Chart” 模块,进入 Stateflow 编辑界面,建立一个 LED 闪灯的状态机。
    (1)从工具栏拖拽一个状态块 “State”,创建一个状态,将其命名为 “LED_on”,并填写其状态信息。
    (2)创建另一个状态,将其命名为 “LED_off”,并填写其状态信息。
    (3)创建状态转换传输线(Transition),并填写状态转换条件。
    (4)点击 “建模–符号窗格”,右键点击 “检查”,设置 LD2_output 的类型为 uint8。

在这里插入图片描述

  1. 回到 Simulink 仿真窗口,在仿真模型中添加 STM32G4xx MCU 的 “Digital Write” 模块。
    (1)点击菜单栏的 “库浏览器” 打开库浏览器,展开 “Embedded Coder Support Package for STMicroelectronics STM32 Processors – STM32G4xx Based Boards”。
    (2)选择 “Digital Port Write” 模块,将其拖动到右侧的模型。
    (3)设置 “Digital Write” 模块参数。按照 CubeMX 项目中的 GPIO 管脚配置,将 Port name 设为 “GPIOA”,将 Pin number 设为 “[5]”,即将 PA5 管脚设置为 GPIO_Output。

在这里插入图片描述

  1. 完成搭建仿真模型,保存为文件 STM32G431_MBD02.slx。注意仿真模型 .slx 与 CubeMX 项目 .ioc 要保存在相同的路径下。

2.4 配置 STM32CubeMX 工程

要支持在基于 STM32 处理器的板上运行 Simulink 模型,需要使用 STM32CubeMX 图形化工具。STM32CubeMX 工具采用图形界面,可用于配置 STM32 处理器的外设,并为所选的 STM32 处理器生成外设初始化代码。


  1. 运行 STM32CubeMX,打开通过 Simulink 创建的 CubeMX 工程文件 STM32G431_MBD02.ioc。
    由于在 Simulink 中创建 CubeMX 工程文件时,在硬件选择时已经选择 NUCLEO-G431RB 开发板,该工程文件已经根据 NUCLEO-G431RB 开发板的要求完成了一些基本配置。但考虑对其它硬件开发板需要用户来配置,下面仍按一般步骤进行设置。

  2. 点击菜单栏 “Project Manager” 进入工程配置界面,如下图所示。——非常重要!
    (1)在 Project 中检查项目路径,确认CubeMX 项目文件 .ioc 与 Simulink 仿真模型 .slx 在相同的路径。
    (2)在 Toolchain/IDE 选择 IDE 工具为 “STM32CubeIDE”(也可以根据需要选择其它 IDE 工具 )。
    (3)在 Project 中勾选 “Do not generate the main()”,在生成代码时不生成 main.c 文件中的 main() 函数。
    (4)在 Project 中取消选中 “Generate Under Root”。
    (5)在 “Project” 中继续向下拉,“在 MCU and Firmware Package” 栏中,取消选中 “Use latest available version”,根据所安装的 G4 固件版本,选择 “STM32Cube FW_G4 V1.5.0”;
    如果固件包不是安装在默认路径,则要取消选中 “Use Default Firmware Location”,通过 Browse 选择固件包的安装路径。

在这里插入图片描述

  1. 在 Pinout Configuration 视图进行系统配置。
    (1)选择 “System Core – SYS” 设置调试器类型,将 Debug 设为 “Serial Wire”,
    (2)选择 “System Core – SYS” 设置基础时钟源,将 Timebase Source 设为 “TIM2”——非常重要!
    Timebase Source 默认为 “SysTick”,需要留作它用,因此必须修改为其它定时器。
    (3)选择 “System Core – RCC” 配置时钟模式,设置高速晶振为外部时钟,将 High Speed Clock (HSE) 设为 “Crystal/Ceramic Resonator”。
    在这里插入图片描述

  1. 在 Clock Configuration 视图进行时钟配置。本实验使用 NUCLEO-G431RB 默认设置,如下图所示。
    在这里插入图片描述

  2. 在 Pinout Configuration 视图中,搜索 PA5 管脚(在 NUCLEO 开发板中 连接LD2 灯),将其设置为 GPIO_Output。如下图所示。

在这里插入图片描述


  1. 点击菜单栏 “Project Manager” 进入工程配置界面。
    (1)在 Code Generator 中,勾选 “Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral”,让每个外设生成独立的’.c/.h’文件。
    在这里插入图片描述

(2)在 Advanced Settings 中,将 “Driver Selector” 全部设置为 “LL”(默认为 “HAL”),为外设选择低级 (LL) 驱动–非常重要! 否则编译会报错。

(3)在 Advanced Settings 中,将 “Generated Function Calls” 的 “Visibility(Static)” 勾选项全部取消,对所有外设初始化函数调用取消选择可见性(静态)。

在这里插入图片描述


  1. 完成以上配置后,使用快捷键 “CTL+S” 或点击 File–Save Project,保存 CubeMX 项目文件。
    注意:在 STM32CubeMX 中配置完成后,不要点击 “GENERATE CODE” 生成代码,而是保存 .ioc 项目文件。

3. Simulink 状态机模型的仿真

  1. 在 Simulink 打开仿真模型 STM32G431_MBD02.slx。
  2. 为输出信号添加一个示波器。
  3. 在 “仿真” 窗口点击 “运行”,观察示波器的输出波形。如下图所示,示波器显示周期为 400 msec 的方波。
  4. 打开状态机 LD2_state 修改状态转换条件,可以得到不同周期和脉宽的波形。

在这里插入图片描述


4. 从 Simulink 模型生成 STM32 代码

  1. 在 Simulink 打开仿真模型 STM32G431_MBD02.slx。

  2. 在 “硬件(Hardware)” 窗口点击 “编译、部署和启动”(Ctrl+B 快捷键),就启动模型 STM32G431_MBD02 的编译过程,为模型生成代码,并加载到 NUCLEO-G431RB 开发板。

模型编译过程的主要信息显示在 “诊断查看器” 中,编译摘要如下。
如果编译中发生错误,错误信息也将显示在 “诊断查看器” 。

 顶层模型编译  
### 正在启动 STM32G431_MBD02 的编译过程
### 正在为 '模型特定' 文件夹结构生成代码和工件
### 正在将代码生成到编译文件夹中: D:\MATLAB\SimulinkProjects\STM32G4\STM32G431_MBD02\STM32G431_MBD02_ert_rtw
### Invoking Target Language Compiler on STM32G431_MBD02.rtw
### Using System Target File: D:\Program Files\MATLAB\R2022b\rtw\c\ert\ert.tlc### 使用工具链: GNU Tools for ARM Embedded Processors
### 正在创建 'D:\MATLAB\SimulinkProjects\STM32G4\STM32G431_MBD02\STM32G431_MBD02_ert_rtw\STM32G431_MBD02.mk'...
### 正在编译 'STM32G431_MBD02': "D:\Program Files\MATLAB\R2022b\bin\win64\gmake" MATLAB_ROOT=%MATLAB_ROOT% ALT_MATLAB_ROOT=%ALT_MATLAB_ROOT% MATLAB_BIN=%MATLAB_BIN% ALT_MATLAB_BIN=%ALT_MATLAB_BIN%  -j5  -f STM32G431_MBD02.mk all
MW_GNU_ARM_TOOLS_PATH = C:/PROGRA~3/MATLAB/SUPPOR~1/R2022b_1/3P778C~1.INS/GNUARM~1.INS/win/bin
...### Successful completion of build procedure for: STM32G431_MBD02
### 'STM32G431_MBD02' 的 Simulink 缓存工件是在 'D:\MATLAB\SimulinkProjects\STM32G4\STM32G431_MBD02\STM32G431_MBD02.slxc' 中创建的。
编译过程已成功完成编译摘要  
编译的顶层模型目标:模型               操作           重新编译原因     
=========================================
STM32G431_MBD02  代码已生成并完成编译。  生成的代码已过期。  编译了 1 个模型,共 1 个模型(0 个模型已经是最新的)
编译持续时间: 0h 1m 55.953s

在这里插入图片描述

  1. Simulink 通过调用 STM32CubeProgrammer 将编译的目标文件加载到 STM32 开发板,NUCLEO-G431RB 开发板上的 LD2 会闪烁,表明代码正在运行。

  2. 在 Simulink 模型中打开状态机 LD2_state 修改状态转换条件,重新点击 “编译、部署和启动”,NUCLEO-G431RB 开发板上的 LD2 就以相应的周期和脉宽闪烁,表明基于 Simulink 的模型开发成功。

在这里插入图片描述

  1. 检查代码生成的文件目录,主要内容如下。

在这里插入图片描述

在这里插入图片描述


5. 附录:嵌入式系统的状态机(State Machine)

状态机是一种基于状态转移的程序设计模式,它通过将程序的执行过程分成一系列状态,以及描述状态转移的规则,实现复杂问题的分步解决。

状态机将对象的行为和状态进行解耦,使得对象在不同状态下可以有不同的行为,具有易于理解和维护、独立性强、灵活性好和可扩展的优点。


5.1 状态机的基本概念

在嵌入式系统中,状态机常用来实现复杂的控制逻辑、事件处理和通信协议等功能,其简单灵活的设计在嵌入式系统应用中得到了广泛的运用。

  1. 状态机的组成
    • 状态(State):状态是指系统的某种运行状态,如 “就绪状态”、“工作状态”、“停止状态” 等表示对象所处的状态。
      每个状态都会定义一组可能的行为,并且这些行为只能在该状态下执行。
    • 上下文(Context):指状态机的主要逻辑,负责根据当前状态调用相应的行为,并维护当前状态和处理状态转换。如“当接收到数据时,从就绪状态转移至工作状态”。
    • 事件(Event):事件是指触发状态转移的外部或内部条件,如“按下按钮”、“接收到数据”等。
      当事件发生时,状态机会根据当前状态和事件类型执行相应的操作,可能导致状态的变化。
    • 行为(Action):与每个状态相关联的具体操作。每个状态可以定义一组行为,用于在特定状态下执行相应的逻辑。

  1. 状态机的实现方式
    状态机的实现方式主要包括:表驱动方式、条件语句方式和函数指针方式。
    • 表驱动方式,是指通过查表实现状态转移和执行相应操作,其主要实现方式为二维数组或查找表。
    • 条件语句方式,是指通过条件语句实现状态转移和执行相应操作,其主要实现方式为 if 语句和 switch 语句。
      if 语句常用于状态转移和操作较少的情况,switch 语句常用于状态和事件均较多的情况。
    • 函数指针方式,是指通过函数指针实现状态转移和执行相应操作,其主要实现方式为将状态和触发事件作为函数指针的参数,状态转移和操作函数通过函数指针调用完成。
      函数指针方式适用于状态转移和操作多且异构的情况。

  1. 状态机的工作原理:
    • 初始化:将对象的初始状态设置为合适的状态。
    • 处理事件:当外部事件发生时,上下文将会根据当前状态和事件类型触发相应的行为。
    • 状态转换:在行为执行后,状态机可能会根据一定的条件决定是否需要进行状态转换。状态转换可以将对象的状态从一个状态转变为另一个状态。
    • 执行行为:根据新的状态,上下文将调用相应状态下定义的行为。

  1. 状态机的实例
    业务场景:有一个灯和一个按钮。初试状态 LD2 关闭。当 LD2 点亮时,按下按键就会关闭 LD2;当 LD2 关闭时,按下按键就会点亮 LD2。
    (1)确定状态:只有开灯和关灯两种确定的状态。
    (2)上下文:封装处理状态流转和执行状态改变后的行为。
    (3)事件:把用户按下按钮视为触发事件。
    (4)行为:执行状态改变后的方法,按下按钮后需要去执行开灯/关灯的动作。

5.2 Simulink Stateflow 的使用

Stateflow是集成于Simulink中的图形化设计与开发工具,适用于面向事件的响应系统,主要用于针对控制系统中的复杂控制逻辑进行建模与仿真。

  1. 状态块的内容包括:

    • (1) 状态名称:每个状态的名称置于状态块编辑区首行,其命名规则和一般变量名一样。
    • (2) 入口关键词:在编辑区中键入“entry:”或者“en:”,在下一个关键词出现之前,关键词以下的代码段都是该状态被激活时(或者说进入该状态)执行的动作。
    • (3) 出口关键词:在编辑区中键入“exit:”或者“ex:”,在下一个关键词出现之前,关键词以下的代码段都是该状态退出时执行的动作。
    • (4) during关键词:在编辑区中键入“during:”或者“du:”,在下一个关键词出现之前,关键词以下的代码段都是该状态下重复执行的动作,重复频率取决于仿真步长。
  2. 每个状态由 entry,during,exit 三部分组成,它们之间的动作执行时序满足如下约束:

    • (1) 对于某一确定的仿真步长,系统总是在某一确定的状态下(对于若干互斥的状态)。
    • (2) during 中的动作是在 entry 动作后一个采样步长执行的,在转移条件发生同时执行的动作应放置在 entry 中。
    • (3) during 必须判断处于当前状态下才会执行,而且是在 entry 后的下一个步长运行。当状态a通过状态b 直接进入状态c 时,会执行状态b 的 entry 动作,但不会执行其 during 动作,因为其无法停留在 during。所以一些条件判断(如涉及到转移到下一状态的条件)不可放在当前状态的 during,否则可能永远不会执行。
  3. 状态块与状态块之间需要依靠转移线连接,转移线代表状态的转换路径,其编辑区中提供了一对方括号和一对花括号。

    • (1) 方括号内需要填写转移条件,在有触发事件的前提下也可以不填写,当状态机处于转移线首端的状态,且转移条件为真时(如果有触发事件,事件需要已发生),状态会根据该条转移线进行状态的切换,也就是退出上一个状态并进入下一个状态。(缺省转移没有转移条件)
    • (2) 花括号内填写的是转移发生时执行的动作(也称条件动作),条件动作可以不填写。
    • (3) 括号之外可填写触发事件,在有转移条件的前提下也可以不填写,当状态机处于转移线首端的状态,且事件发生时(如果有转移条件,转移条件需要为真),状态会根据该条转移线进行状态的切换。(缺省转移没有触发事件)
    • (4) 除了缺省转移外,如果转移线不填写转移条件和触发事件,仿真时也能运行,但因为转移没有任何限制,转移线首端的状态仅会持续一个仿真步长就会退出。
    • (5) 点击状态块的边界(除了四个角以外),按住鼠标拖动,即可从状态块引出一条转移线,拖住转移线的末端即可将其连接到其它状态块上(转移线两端可以连在同一个状态块上)。
  4. 常用的触发事件有时间触发事件after,它有两个参数,第一个是时间参数,第二个是时间单位参数,当进入转移线首端的状态时,after开始计时,当达到计时时间后事件发生。

    • (1) 当一个状态块引出两条转移线时,转移线上会有编号,Chart模块会优先判断编号较小的转移线是否满足转移条件(以下提到的“满足转移条件”均指的是转移条件为真且事件触发)。
    • (2) 当转移线两端连接同一个状态块时,有两种情况:
      ① 转移线在状态块外部:如果转移线生效,当前状态会先退出再重新进入,也就是要执行关键词entry下的代码段。
      ② 转移线在状态块内部:内部的转移线优先判断,如果转移线生效,当前状态不会退出,不会执行关键词entry下的代码段。

更多内容可以参考以下内容:
Simulink之State Flow
实例讲解Simulink/Stateflow使用方法详细步骤


(本节完)

参考资料:

  1. 基于 STMicroelectronics STM32 处理器的板快速入门, (https://ww2.mathworks.cn/help/ecoder/stmicroelectronicsstm32f4discovery/ug/Getting-started-stm32cubemx.html?searchHighlight=STM32&s_tid=srchtitle_support_results_2_STM32)

  2. 安装 STMicroelectronics STM32 处理器的支持程序,(https://ww2.mathworks.cn/help/ecoder/stmicroelectronicsstm32f4discovery/ug/install-support-for-stm32-board-processors.html)

  3. 使用 STM32CubeMX 和 Simulink 配置基于 STM32 处理器的板,(https://ww2.mathworks.cn/help/ecoder/stmicroelectronicsstm32f4discovery/ug/STM32-CubeMX-Configuration.html?searchHighlight=STM32&s_tid=srchtitle_support_results_5_STM32)


版权声明:
youcans@xidian 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/144325556)
Copyright@youcans 2025
Crated:2025-01

相关文章:

【动手学电机驱动】STM32-MBD(3)Simulink 状态机模型的部署

STM32-MBD(1)安装 Simulink STM32 硬件支持包 STM32-MBD(2)Simulink 模型部署入门 STM32-MBD(3)Simulink 状态机模型的部署 【动手学电机驱动】STM32-MBD(3)Simulink 状态机模型部署…...

Linux 服务器启用 DNS 加密

DNS 加密的常用协议包括 DNS over HTTPS (DoH)、DNS over TLS (DoT) 和 DNSCrypt。以下是实现这些加密的步骤和工具建议: 1. 使用 DoH (DNS over HTTPS) 工具推荐: cloudflared(Cloudflare 提供的客户端)doh-client(…...

PyTorch不同优化器比较

常见优化器介绍 - SGD(随机梯度下降):是最基本的优化器之一,通过在每次迭代中沿着损失函数的负梯度方向更新模型参数。在大规模数据集上计算效率高,对于凸问题和简单模型效果较好。但收敛速度慢,容易陷入局…...

stm32的掉电检测机制——PVD

有时在一些应用中,我们需要检测系统是否掉电了,或者要在掉电的瞬间需要做一些处理。 STM32内部自带PVD功能,用于对MCU供电电压VDD进行监控。 STM32就有这样的掉电检测机制——PVD(Programmable Voltage Detecter),即可编程电压检…...

Nginx 文件名逻辑漏洞(CVE-2013-4547)

目录 漏洞原理 影响版本 漏洞复现 漏洞原理 CGI:是一种协议,定义了web服务器传递的数据格式。 FastCGI:优化版的CGI程序 PHP-CGI:PHP解释器,能够对PHP文件进行解析并返回相应的解析结果 PHP-FPM:Fas…...

Java 21 优雅和安全地处理 null

在 Java 21 中,判断 null 依然是开发中常见的需求。通过使用现代 Java 提供的工具和特性,可以更加优雅和安全地处理 null。 1. 使用 Objects.requireNonNull Objects.requireNonNull 是标准的工具方法,用于快速判断并抛出异常。 示例 import java.util.Objects;public c…...

AWS Glue基础知识

AWS Glue 是一项完全托管的 ETL(提取、转换、加载)服务,与考试相关,尤其是在数据集成、处理和分析方面。 1.数据集成和 ETL(提取、转换、加载) AWS Glue 主要用于构建 ETL 管道以准备数据以进行分析。作为…...

Kubernetes——part4-1 Kubernetes集群 服务暴露 Nginx Ingress Controller

Kubernetes集群 服务暴露 Nginx Ingress Controller 一、ingress控制器 1.1 ingress控制器作用 (类似于slb,做代理服务) ingress controller可以为kubernetes 集群外用户访问Kubernetes集群内部pod提供代理服务。 提供全局访问代理访问流程…...

Flutter入门,Flutter基础知识总结。

Flutter是Google推出的一种移动应用开发框架,它允许开发者使用一套代码库同时开发Android和iOS应用。以下是对Flutter知识点的详细总结: 一、Flutter概述 特点:跨平台、高保真、高性能。 编程语言:使用Dart语言编写。 设计理念&…...

weight decay 和L2是一个东西吗

weight decay和L2正则化本质上是相同的概念。 weight decay(权重衰减)和L2正则化在深度学习中都是用来防止模型过拟合的常用技术。它们通过对损失函数添加一个正则项来限制模型参数的大小,从而控制模型的复杂度。具体来说,L2正则…...

JavaScript系列(8)-- Array高级操作

JavaScript Array高级操作 📚 在前七篇文章中,我们探讨了JavaScript的语言特性、ECMAScript标准、引擎工作原理、数值类型、字符串处理、Symbol类型和Object高级特性。今天,让我们深入了解JavaScript中的Array高级操作。数组是最常用的数据结…...

Harmony开发【笔记1】报错解决(字段名写错了。。)

在利用axios从网络接收请求时,发现返回obj的code为“-1”,非常不解,利用console.log测试,更加不解,可知抛出错误是 “ E 其他错误: userName required”。但是我在测试时,它并没有体现为空,…...

MAC环境安装(卸载)软件

MAC环境安装(卸载)软件 jdknode安装node,并实现不同版本的切换背景 卸载node从node官网下载pkg安装的node卸载用 homebrew 安装的node如果你感觉删的不够干净,可以再细分删除验证删除结果 在macOS下创建home目录 jdk 1.下载jdk 先…...

【Vim Masterclass 笔记05】第 4 章:Vim 的帮助系统与同步练习(L14+L15+L16)

文章目录 Section 4:The Vim Help System(Vim 帮助系统)S04L14 Getting Help1 打开帮助系统2 退出帮助系统3 查看具体命令的帮助文档4 查看帮助文档中的主题5 帮助文档间的上翻、下翻6 关于 linewise7 查看光标所在术语名词的帮助文档8 关于退…...

Multisim更新:振幅调制器+解调器(含仿真程序+文档+原理图+PCB)

前言 继3年前设计的:Multisim:振幅调制器的设计(含仿真程序文档原理图PCB),有读者表示已经不能满足新需求,需要加上新的解调器功能😂😂😂,鸽了很久这里便安排…...

CentOS — 群组管理

文章目录 一、查看群组二、添加群组三、删除群组四、修改群组 Linux 系统中每个用户都属于一个特定的群组。 若不设置用户的群组,默认会创建一个和用户名一样的群组,并将用户分到该群组。 一、查看群组 groups 用户名:查看用户所属群组。 二…...

【pytorch】注意力机制-1

1 注意力提示 1.1 自主性的与非自主性的注意力提示 非自主性提示: 可以简单地使用参数化的全连接层,甚至是非参数化的最大汇聚层或平均汇聚层。 自主性提示 注意力机制与全连接层或汇聚层区别开来。在注意力机制的背景下,自主性提示被称为查…...

html 元素中的data-v-xxxxxx 是什么?为什么有的元素有?有的没有?

data-v-xxxxxx 在 HTML 中,data-v 属性通常与 Vue.js 或其他前端框架一起使用,特别是当这些框架结合 CSS 预处理器(如 Sass、Less)和单文件组件(Single File Components, SFCs)时。data-v 属性的主要目的是…...

第27周:文献阅读及机器学习

目录 摘要 Abstract 一、文献阅读 发现问题 研究方法 CNN-LSTM DT SVR 创新点 案例分析 数据准备 模型性能 预测模型的实现 仿真实验及分析 二、LSTM 1、基本结构 2、具体步骤 3、举例说明 4、原理理解 总结 摘要 本周阅读文献《Short-term water qua…...

回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测

回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测 目录 回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 一、极限学习机(ELM) 极限学习机是一种单层前馈神经网络,具有训练速…...

华为云AI开发平台ModelArts

华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言:多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)&#xff…...