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

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

STM32-MBD(1)安装 Simulink STM32 硬件支持包
STM32-MBD(2)Simulink 模型部署入门
STM32-MBD(3)Simulink 状态机模型的部署
[STM32-MBD(4)Simulink 状态机实现按键控制]
(https://blog.csdn.net/youcans/article/details/144948539)

【动手学电机驱动】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(4)Simulink 状态机实现按键控制] (https://bl…...

springCloudGateWay使用总结

1、什么是网关 功能: ①身份认证、权限验证 ②服务器路由、负载均衡 ③请求限流 2、gateway搭建 2.1、创建一个空项目 2.2、引入依赖 2.3、加配置 3、断言工厂 4、过滤工厂 5、全局过滤器 6、跨域问题...

04、Redis深入数据结构

一、简单动态字符串SDS 无论是Redis中的key还是value,其基础数据类型都是字符串。如,Hash型value的field与value的类型,List型,Set型,ZSet型value的元素的类型等都是字符串。redis没有使用传统C中的字符串而是自定义了…...

zephyr移植到STM32

Zephy如何移植到单片机 1. Window下搭建开发环境1.1 安装Choncolatey1.2 安装相关依赖1.3创建虚拟python环境1.4 安装west1.4.1 使用 pip 安装 west1.4.2 检查 west 安装路径1.4.3 将 Scripts路径添加到环境变量1.4.4 验证安装 1.5 获取zephyr源码和[安装python](https://so.cs…...

Windows使用AutoHotKey解决鼠标键连击现象(解决鼠标连击、单击变双击的故障)

注:罗技鼠标,使用久了之后会出现连击现象,如果刚好过保了,可以考虑使用软件方案解决连击现象: 以下是示例AutoHotKey脚本,实现了调用XButton1用于关闭窗口(以及WinW,XButton2也导向…...

案例研究:UML用例图中的结账系统

在软件工程和系统分析中,统一建模语言(UML)用例图是一种强有力的工具,用于描述系统与其用户之间的交互。本文将通过一个具体的案例研究,详细解释UML用例图的关键概念,并说明其在设计结账系统中的应用。 用…...

将光源视角的深度贴图应用于摄像机视角的渲染

将光源视角的深度贴图应用于摄像机视角的渲染是阴影映射(Shadow Mapping)技术的核心步骤之一。这个过程涉及到将摄像机视角下的片段坐标转换到光源视角下,并使用深度贴图来判断这些片段是否处于阴影中。 1. 生成光源视角的深度贴图 首先&…...

安卓漏洞学习(十八):Android加固基本原理

APP加固技术发展历程 APK加固整体思路 加固整体思路:先解压apk文件,取出dex文件,对dex文件进行加密,然后组合壳中的dex文件(Android类加载机制),结合之前的apk资源(解压apk除dex以外…...

前端数据模拟器 mockjs 和 fakerjs

功能:帮助前端生成随机数据,独立于后端单独开发 一、mockjs 安装:npm install mockjs 优点:官网是中文。 缺点:目前该库已经无人维护,也没人解决github上的bug。 官网 github地址 二、fakerjs 安装&#xf…...

Ruby语言的软件开发工具

Ruby语言的软件开发工具概述 引言 Ruby是一种简单且功能强大的编程语言,它以优雅的语法和灵活性而闻名。自1995年首次发布以来,Ruby已经被广泛应用于各种开发领域,特别是Web开发。随着Ruby语言的普及,相关的开发工具也日益丰富。…...

P8772 [蓝桥杯 2022 省 A] 求和

题目描述 给定 𝑛 个整数 𝑎1,𝑎2,⋯ ,𝑎𝑛 求它们两两相乘再相加的和,即 𝑆𝑎1⋅𝑎2𝑎1⋅𝑎3⋯𝑎1⋅𝑎𝑛&…...

(七)Linux库的串口开发

文章目录 基于官方提供的串口测试代码部分解析代码部分1. usage 函数2. opt_parsing_err_handle 函数3. sig_handle 函数4. init_serial 函数5. serial_write 函数6. serial_read 函数7. run_read_mode 函数8. run_write_mode 函数9. run_loopback_test 函数 进行测试第一步编译…...

【git】在服务器使用docker设置了一个gogs服务器,访问和现实都不理想

以下问题应该都可以通过设置custom/conf/app.ini来解决 配置文档参考地址:https://www.bookstack.cn/read/gogs_zh/advanced-configuration_cheat_sheet.md domain显示的事localhost,实际上应该是一个IP地址。 关键字: DOMAIN ROOT_URL 因为是docker…...

ubuntu报错:没有在该文件夹中粘贴文件的权限

1 现象: 近期给ubuntu扩展了硬盘,但是在其中进行文件操作时提示“没有在该文件夹中粘贴文件的权限” 2 原因: 新增硬盘挂载地址为“/home/username/data/” 终端输入 ls -ld /home/username/data/输出 drwxr-xr-x 3 root root 4096 1月…...

JavaWeb开发(六)XML介绍

1. XML介绍 1.1. 什么是XML (1)XML 指可扩展标记语言(EXtensible Markup Language)XML 是一种很像HTML的标记语言。   (2)XML 的设计宗旨是传输数据(目前主要是作为配置文件),而不是显示数据。   (3&a…...

Vue 3 和 Electron 来构建一个桌面端应用

我们将使用 Vue 3 和 Electron 来构建一个桌面端应用,该应用可以通过 Websocket 与服务器进行通信,并实现心跳检测、客户端上线、获取资产信息以及修改资产状态的功能。以下是实现步骤的概述: 项目结构:创建一个 Vue 3 项目&…...

Python中的asyncio:高效的异步编程模型

随着互联网应用的快速发展,程序的响应性和处理效率成为衡量系统性能的重要指标。传统的同步编程模型在面对高并发和IO密集型任务时,常常显得捉襟见肘,难以满足现代应用的需求。Python的asyncio库作为一种高效的异步编程模型,为开发…...

《解锁鸿蒙系统AI能力,开启智能应用开发新时代》

在当今科技飞速发展的时代,鸿蒙系统以其独特的分布式架构和强大的AI能力,为开发者们带来了前所未有的机遇。本文将深入探讨开发者如何利用鸿蒙系统的AI能力开发更智能的应用,开启智能应用开发的新时代。 鸿蒙系统构筑了15系统级的AI能力&…...

安卓OCR使用(Google ML Kit)

OCR是一个很常用的功能,Google ML Kit提供了OCR能力,用起来也很简单,本文介绍一下使用方法。 1. 相关概念 名词概念解释TextBlock块一个段落Line行一行文本Element元素单词;对汉字来说,类似"开头 (分隔符)中间&…...

使用redis的5种常用场景

文章目录 1. 缓存热点数据2. 分布式锁3. 计数器和限流器4. 消息队列5. 会话管理总结 在日常开发工作中,Redis作为一款高性能的内存数据库,凭借其强大的功能特性和卓越的性能表现,已经成为了许多项目中不可或缺的组件。本文将详细介绍Redis在实…...

Extreme670和440的DHCP和vlan划分

1.网关配置 防火墙 USG 添加静态路由,也就是回指路由192.168.0.0 255.255.0.0 192.168.100.2 usg关闭DHCP192.168.100.0段的,usg接口的网关地址是192.168.100.1,防火墙策略启用192.168.100.0段到wan1段的内网和外网的NAT地址转换。 2…...

VTK知识学习(33)-交互问题2

1、前言 主要是针对前面有过实现不了交互的情况进行说明,经过一些尝试和分析调用API,总算实现RenderWindowControl函数回调正常串接,当然这个移动处理事件的效果目前也没有确认。 2、使用 vtkImageReslice reslice vtkImageReslice.New();p…...

c++ thread线程join、detach、joinable方法

(621条消息) 线程中断Thread的interrupt()方法_thread interrupt_萝卜阿咕咕的博客-CSDN博客 C/C编程&#xff1a;std::thread 详解-CSDN博客 #include <iostream> #include <thread>void do_some_work() {std::cout<<"Hello Concurrent World\n"…...

Transformer:深度学习的变革力量

深度学习领域的发展日新月异&#xff0c;在自然语言处理&#xff08;NLP&#xff09;、计算机视觉等领域取得了巨大突破。然而&#xff0c;早期的循环神经网络&#xff08;RNN&#xff09;在处理长序列时面临着梯度消失、并行计算能力不足等瓶颈。而 Transformer 的横空出世&am…...

【Python】__main__.py、__init__.py

文章目录 1. __init__.py作用&#xff1a;用法&#xff1a;示例&#xff1a;特点 2. __main__.py作用&#xff1a;用法&#xff1a;示例&#xff1a;特点&#xff1a; 3. 综合示例总结&#xff1a; 1. init.py 作用&#xff1a; __init__.py 文件的主要作用是标识一个目录是一…...

springboot集成整合工作流,activiti审批流,整合实际案例,流程图设计,流程自定义,表单配置自定义,代码demo流程

前言 activiti工作流引擎项目&#xff0c;企业erp、oa、hr、crm等企事业办公系统轻松落地&#xff0c;一套完整并且实际运用在多套项目中的案例&#xff0c;满足日常业务流程审批需求。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器&#xff0c;流行的前后端…...

代码随想录算法【Day16】

Day16 513.找二叉树左下角的值 本题使用迭代法更简单&#xff0c;使用迭代法和递归法的区别是什么 递归法 目标就是找深度最大的叶子结点 无论前中后序遍历&#xff0c;都是左节点先被遍历到&#xff0c;所以一旦得到深度最大的节点&#xff0c;就是最后一行最靠左侧的节点…...

从光子到图像——相机如何捕获世界?

引言 你是否想过为何我们按一下相机快门就可以将眼前广袤多彩的世界显示于一个小小的相机屏幕上&#xff1f;本期推文中将带着大家重现从光子转换为电子、电子转换为图像中数字驱动值的整个流程。 ▲人们通过相机捕获眼前的场景 从光子到电子的转换 光线首先通过光学镜头进入相…...

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

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

Ubuntu 下载安装 elasticsearch7.17.9

参考 https://blog.csdn.net/qq_26039331/article/details/115024218 https://blog.csdn.net/mengo1234/article/details/104989382 过程 来到 Es 的版本发布列表页面&#xff1a;https://www.elastic.co/downloads/past-releases#elasticsearch 根据自己的系统以及要安装的…...

8. LINUX 用户和组

文章目录 8.1 密码文件&#xff1a;/etc/passwd1. 登录名&#xff08;Login Name&#xff09;2. 经过加密的密码&#xff08;Encrypted Password&#xff09;3. 用户 ID&#xff08;User ID, UID&#xff09;4. 组 ID&#xff08;Group ID, GID&#xff09;5. 注释&#xff08;…...

vue监听中的watch监听(详解)

1、watch 选项用于监听数据的变化并执行相应的回调函数。watch 选项提供了两个重要的属性&#xff1a;deep 和 immediate。1.1、深度监听 (deep: true) 当你需要监听一个对象或数组内部的变化时&#xff0c;可以使用 deep: true。 这会使得 watch 监听器递归地监听对象或数组内…...

微信小程序中 隐藏scroll-view 滚动条 网页中隐藏滚动条

在微信小程序中隐藏scroll-view的滚动条可以通过以下几种方法实现&#xff1a; 方法一&#xff1a;使用CSS隐藏滚动条 在小程序的样式文件中&#xff08;如app.wxss或页面的.wxss文件&#xff09;&#xff0c;添加以下CSS代码来隐藏滚动条&#xff1a; scroll-view ::-webkit…...

K8s Pod OOMKilled,监控却显示内存资源并未打满

1. 问题现象 pod一直重启&#xff0c;通过grafana查看&#xff0c;发现内存使用率并没有100%。 2. 排查过程 2.1 describe查看pod最新一次的状态 可以明显看到&#xff0c;最近一次的重启就是因为内存不足导致的。 2.2 describe 查看node节点状态 找到原因了&#xff0c;原来…...

对话|全年HUD前装将超330万台,疆程技术瞄准人机交互“第一屏”

2024年&#xff0c;在高阶智驾进入快速上车的同时&#xff0c;座舱人机交互也在迎来新的增长点。Chat GPT、AR-HUD、车载投影等新配置都在带来新增量机会。 高工智能汽车研究院监测数据显示&#xff0c;2024年1-10月&#xff0c;中国市场&#xff08;不含进出口&#xff09;乘用…...

【HTML+CSS+JS+VUE】web前端教程-10-列表标签之无序列表

无序列表实现 无序列表是一个项目的列表,此列项目使用粗体圆点(典型的小黑圆圈)进行标记 无序列表始于<ul>标签,每个列表项始于<li>标签。<ul><li>苹果...

基于V2X的无人机与特种车辆战地智能通信:技术融合与实战应用

一、引言 1.1 研究背景与意义 在现代战争的复杂环境中&#xff0c;通信系统的高效与可靠已然成为决定胜负的关键因素。随着军事技术的飞速发展&#xff0c;战争形态发生了深刻变革&#xff0c;作战空间不断拓展&#xff0c;从陆地、海洋、天空延伸至电磁、网络、太空等多维领…...

20250109下载JDK17的方法链接

20250109下载JDK17的方法&链接 2025/1/9 16:20 缘起&#xff1a;编译地面站应用程序QGC&#xff0c;需要安装QT和【旧版本的】JDK17。 当时在网上没有找到JDK17&#xff0c;就安装了比较接近的JDK21。反正最后的QT for Android最后就是没有编译通过。 到底是谁的问题&#…...

杭州铭师堂的云原生升级实践

作者&#xff1a;升学e网通研发部基建团队 公司介绍 杭州铭师堂&#xff0c;是一个致力于为人的全面发展而服务的在线教育品牌。杭州铭师堂秉持“用互联网改变教育&#xff0c;让中国人都有好书读”的使命&#xff0c;致力于用“互联网教育”的科技手段让更多的孩子都能享有优…...

chrome浏览器的更新提示弹窗无法更新Chrome解决方法

使用组策略编辑器 此方法适用于 Windows 系统且系统为专业版及以上版本&#xff0c;家庭版系统没有组策略功能。 按下Win R键&#xff0c;打开 “运行” 对话框&#xff0c;输入gpedit.msc并回车&#xff0c;打开组策略编辑器。 在组策略编辑器中&#xff0c;依次展开 “计算机…...

LLM prompt提示构造案例:语音回复内容;o1思维链

1、语音回复内容 目的&#xff1a; 语音聊天助手的prompt&#xff0c;让大模型来引导聊天内容&#xff0c;简短和友好&#xff0c;从而文字转语音时候也比较高效。 ## 角色设定与交互规则 ### 基本角色 你是用户的好朋友. 你的回答将通过逼真的文字转语音技术阅读. ### 回答规则…...

OceanBase 学习计划全攻略:开启分布式数据库探索之旅

《OceanBase 学习计划全攻略&#xff1a;开启分布式数据库探索之旅》 在当今数字化浪潮汹涌澎湃的时代&#xff0c;数据库作为企业信息存储与管理的核心基础设施&#xff0c;其性能、可靠性和扩展性至关重要。OceanBase 作为一款具有卓越分布式特性的国产数据库&#xff0c;正…...

Linux 虚拟机与windows主机之间的文件传输--设置共享文件夹方式

Linux 虚拟机与windows主机之间的文件传输 设置共享文件夹方式 在虚拟机中打开终端查看是否已经新建完成&#xff0c;到文件夹中找到它看一下&#xff0c;这个位置就能存储东西啦...

React Context用法总结

1. 基本概念 1.1 什么是 Context Context 提供了一种在组件树中共享数据的方式&#xff0c;而不必通过 props 显式地逐层传递。它主要用于共享那些对于组件树中许多组件来说是"全局"的数据。 1.2 基本用法 // 1. 创建 Context const ThemeContext React.createC…...

Linux好用软件

力荐软件 apt-fast:更快速的软件管理安装过程会进入一个图形界面,配置线程数等信息,全部默认即可 sudo add-apt-repository ppa:apt-fast/stable sudo apt-get update sudo apt-get -y install apt-fast 以后安装应用,把apt-get直接替换成apt-fast即可,例如安装vlc sudo…...

【MYSQL】

文章目录 1.DDL 1.DDL --添加字段 ALTER TABLE table_name add COLUMN embed_model VARCHAR(32) NOT NULL COMMENT 名称备注 COLLATE utf8mb4_bin AFTER config_code;--修改字段 ALTER TABLE table_name CHANGE COLUMN column_a column_b VARCHAR(500) NOT NULL COMMENT 配置信…...

webrtc之rtc::ArrayView<const uint8_t>

rtc::ArrayView<const uint8_t> 是 WebRTC&#xff08;或其他基于 rtc 命名空间的库&#xff09;中常见的一个类型&#xff0c;它通常用于表示一块 只读的内存区域&#xff0c;该内存区域由一系列 uint8_t 类型&#xff08;无符号 8 位整数&#xff09;元素组成。 1. rt…...

深入理解 MySQL 的 EXPLAIN 工具

1. 什么是 EXPLAIN 工具&#xff1f; EXPLAIN 是 MySQL 中用来分析 SQL 查询执行计划的命令&#xff0c;它能够显示查询在执行时会如何访问表、使用哪些索引、扫描多少行等信息。通过 EXPLAIN 工具&#xff0c;开发者可以直观地了解查询的执行过程&#xff0c;从而进行针对性的…...

谷歌Google、紫鸟浏览器插件开发

对于跨境电商行业的IT部门来说&#xff0c;经常需要获取各种店铺相关数据&#xff0c;但是仅靠官方提供的接口来获取数据远远不够&#xff0c;这个时候我们就需要插件或者RPA的方式来获取数据。 以下是关于自研紫鸟插件的简单demo&#xff0c;紫鸟浏览器使用的是火狐和谷歌的插…...

HTML 显示器纯色亮点检测工具

HTML 显示器纯色亮点检测工具 相关资源文件已经打包成html等文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Html相关程序案例&#xff0c;秉着开源精神的想法&#xff0c;望大家喜欢&#…...