STM32-MBD(1)Matlab2022/2023 安装 STM32 硬件支持包
STM32-MBD(1b)Matlab2025b 安装 STM32 硬件支持包
STM32-MBD(2)Simulink 模型部署入门:点灯
STM32-MBD(3)Simulink 模型部署之状态机:闪灯
STM32-MBD(4)Simulink 模型部署之状态机:开关控制
STM32-MBD(5)Simulink 模型开发之外部中断:开关控制
STM32-MBD(6)Simulink 模型开发之 PWM 输出
STM32-MBD(7)Simulink 模型开发之 定时器
STM32-MBD(8)Simulink 模型开发之 ADC 转换
STM32-MBD(9)Simulink 模型开发之串口通信
STM32-MBD(10)Simulink 模型开发之上位机
STM32-MBD(11)Simulink 模型开发之处理器在环仿真(PIL)

本节的案例使用 Hardware Interrupt 模块在生成的代码中针对 Embedded Coder Support Package for STM32 Processors Based Boards 创建中断服务例程 (ISR)。

本文采用 NUCLEO-G431RB 开发板,使用 Simulink 建立 STM32G431 的外部中断仿真模型,直接生成 STM32 项目工程代码,将仿真模型部署到基于 STM32G431 处理器的硬件板。使用本案例,可以在按下 NUCLEO-STM32G431RB 板上的按钮时使 LED 以不同速率闪烁。

使用本案例,您可以:

  • 创建 ISR 以对基于 STM32 处理器的硬件板上的事件作出响应。
  • 配置 Hardware Interrupt 模块,为 NUCLEO-STM32G431RB 板上的 ISR 发出的按下用户按钮提供服务。

1. 项目简介

Embedded Coder Support Package for STMicroelectronics STM32 Processors 使您能够在运行时使用 Simulink 模块访问外设,以及使用 STM32CubeMX 工具配置处理器上的外设。但是,Simulink/STM32 代码生成对于软硬件和开发环境的要求非常严格,很容易由于版本不匹配或路径错误而失败。作者已经踩过了很多的坑,可以说是我在所有开发项目中都从未经历过的。

Matlab 提供了 基于 NUCLEO-F429ZI 开发板的外部中断例程:Using Hardware Interrupt Block to Create an ISR on STMicroelectronics STM32 Processor Based Boards,本文将其修改为 基于 NUCLEO-STM32G431RB 开发板的案例。

在此案例中,详细介绍如何配置具有 Hardware Interrupt 模块的 Simulink 模型,以便在按下 STMicroelectronics NUCLEO-STM32G431RB 板上的按钮时生成代码并使 LED 以不同速率闪烁。模型使用 Hardware Interrupt 模块来生成 ISR,该 ISR 仅在按下用户按钮时触发。在这种机制下,用户按钮的任何状态变化都会得到通知。


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)连接计算机与 NUCLEO-G431RB 开发板。
    (2)运行 STM32CubeProgrammer,点击右上角 “Connect” 按钮连接设备,检查与 STM32 开发板的连接正常。

  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 的模型开发之外部中断(Hardware Interrupt)

实验名称:7. 基于 Simulink 模型开发之 外部中断(Hardware Interrupt)
实验内容:

  • 配置 Hardware Interrupt 模块,为 NUCLEO-G431RB 开发板上的 ISR 发出的按下用户按钮提供服务。
  • 在按下 NUCLEO-STM32G431RB 板上的按钮时使 LED 以不同速率闪烁。

2.1 用 STM32CubeMX 创建工程

本例直接使用 STM32CubeMX 创建新的 STM32 工程。也可以从 Simulink 创建 STM32CubeMX 工程。youcans

  1. 打开 STM32CubeMX。

  2. 选择 New Project(或Ctrl-N快捷键)新建工程,进入 New Project 界面。
    选择 STM32G431RB 作为目标 MCU(参考开发板的 MCU 型号)。

  3. 自动转入 CubeMX 的 Pinout Configuration 视图,进行管脚配置:
    (1)选择 “System Core – SYS” 设置调试器类型,将 Debug 模式设为 “Serial Wire”。
    (2)选择 “System Core – SYS” 设置基础时钟源,将 Timebase Source 设为 “TIM2”——非常重要!
    注意:Timebase Source 默认为 “SysTick”,但在 STM32支持包中 “SysTick” 已经用作框架的基础时间功能,因此必须修改为 非"SysTick" 的其它定时器。否则在编译项目时会报错——非常重要!。

在这里插入图片描述

(3)选择 “System Core – RCC” 配置时钟模式,设置高速晶振为外部时钟,将 High Speed Clock (HSE) 设为 “Crystal/Ceramic Resonator”。

在这里插入图片描述


(4)选择 “System Core – GPIO” 配置GPIO。
在右侧 Pinout view 图中,搜索 PA5 管脚(在 NUCLEO 开发板中 连接LD2 灯),将其设置为 GPIO_Output。
搜索 PC13 管脚(在 NUCLEO 开发板中 连接蓝色用户按键 User Button),将其设置为 GPIO_EXTI13。
EXTI 可以监测指定GPIO的电平信号,当电平变化时,EXTI向NVIC发出中断申请,支持上升沿、下降沿、双边沿、软件触发。如果发生EXTI外部中断,可以发生中断响应或者事件响应,中断响应就是执行中断程序,事件响应是操作外设而不触发中断。

在这里插入图片描述


(5)选择 “System Core – NVIC” 配置 NVIC。
勾选 “EXTI line [15:10] interrupts”

在这里插入图片描述


  1. 在 Clock Configuration 视图进行时钟配置,如下图所示。
    本实验对于时钟时钟设置没有太多要求,只要设置正确即可。本例中使用外部 160MHz晶振,具体设置如下图所示,只供参考。
    在这里插入图片描述

  1. 点击菜单栏 “Project Manager” 进入工程配置界面,如下图所示。
    (1)在 Project Name 输入项目名称 “STM32G431_MBD04”。
    (2)在 Toolchain/IDE 选择 IDE 工具为 “STM32CubeIDE”(也可以根据需要选择其它 IDE 工具 )。

在这里插入图片描述

(3)在 “Project Manager” 继续向下拉,“在 MCU and Firmware Package” 栏中,取消选中 “Use latest available version”,根据所安装的 G4 固件版本,选择 “STM32Cube FW_G4 V1.5.0”;
(4)如果固件包不是安装在默认路径,则要取消选中 “Use Default Firmware Location”,通过 Browse 选择固件包的安装路径。

在这里插入图片描述

(5)在 Code Generator 中,勾选 “Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral”,让每个外设生成独立的’.c/.h’文件。
在这里插入图片描述


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

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

在这里插入图片描述


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

2.2 创建 Simulink 仿真模型

在 CubeMX 项目文件所在的路径(例如:“D:\SimulinkProjects\STM32G431_MBD04”)下新建 Simulink 仿真模型,注意 *仿真模型 .slx 与 CubeMX 项目 .ioc 要保存在同一个目录下。

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

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

  3. 在 Simulink 仿真窗口,继续搭建仿真模型。
    在这里插入图片描述

该模型使用一个 Multiport Switch 多路选择器,该模块根据控制输入(第一个输入端口)的值,选择并输出多个数据输入中的一个。
而控制输入值来自一个 由外部中断触发的重复时间序列 [1, 2, 0]。即当按下按钮 UserBTN 时,外部中断服务程序使 控制输入值 在 [1, 2, 0] 之间循环切换,选择多路选择器的不同通道导通,输出不同周期的开关信号,使 PA5 对应的 LED 灯以不同频率闪烁。

在这里插入图片描述

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

在这里插入图片描述

  1. 在右侧 “硬件实现(Hardware board settings)” 配置 “Target hardware resources” ,关联 STM32CubeMX 工程文件。
    (1)检查 PC 与 STM32G431 开发板连接正常。 在 “Hardware board” 选项的下拉框中选择 “STM32G4xx Based”.
    注意:必须确保 PC 与 STM32G431 开发板连接正常,才能进行硬件配置。
    (2)点击 “Browse” 选择当前项目的目录,选择 CubeMX 创建的工程文件 “STM32G431_MBD04.ioc”。
    选择硬件在环通信串口。
    (3)点击 “Target hardware resources–Groups–Connectivity”,将 “USART/UART" 设为 “USART3”,将 “Serial port" 设为 电脑上的 COM 端口。具体端口号可以查看电脑”设备管理器“中的”端口(COM和LPT)“。

在这里插入图片描述


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

2.3 从 Simulink 模型生成 STM32 代码

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

  2. 在 “硬件(Hardware)” 窗口点击 “编译、部署和启动”(Ctrl+B 快捷键),就启动模型 STM32G431_MBD04a 的编译过程,为模型生成代码,并加载到 NUCLEO-G431RB 开发板。
    模型编译过程的主要信息显示在 “诊断查看器” 中,编译摘要如下。
    如果编译中发生错误,错误信息也将显示在 “诊断查看器” 。

    ### 正在启动 STM32G431_MBD04 的编译过程
    ### 正在为 '模型特定' 文件夹结构生成代码和工件
    ### 正在将代码生成到编译文件夹中: D:\Matlab\StmMBD2025\STM32G431_MBD04\STM32G431_MBD04_ert_rtw
    ### 'STM32G431_MBD04' 的生成代码是最新的,因为未发现任何结构性、参数或代码替换库更改。
    ### 正在保存二进制信息缓存。
    ### 使用工具链: GNU Tools for ARM Embedded Processors
    ### 'D:\Matlab\StmMBD2025\STM32G431_MBD04\STM32G431_MBD04_ert_rtw\STM32G431_MBD04.mk' 是最新的
    ### 正在编译 'STM32G431_MBD04': "D:\Matlab\R2022b\bin\win64\gmake"  -j7  -f STM32G431_MBD04.mk all
...
    Running command: 
    	"C:\STMicroelectronics\STM32CubeProgrammer\bin\STM32_Programmer_CLI.exe"   -c port=SWD mode=NORMAL sn=002A00283331510833323639 -d "D:\Matlab\StmMBD2025\STM32G431_MBD04\STM32G431_MBD04.elf" -v
youcans@qq.com 编译过程已成功完成
    
    编译的顶层模型目标:
    
    模型               操作           重新编译原因        
    ============================================
    STM32G431_MBD04  代码已生成并完成编译。  代码生成信息文件不存在。  
    
    编译了 1 个模型,共 1 个模型(0 个模型已经是最新的)
    编译持续时间: 0h 0m 9.9242s

在这里插入图片描述

  1. Simulink 通过调用 STM32CubeProgrammer 将编译的目标文件加载到 STM32 开发板。

  2. 将代码加载到开发板上后,硬件板上的 LED 灯(LD2)会闪烁,表示代码正在运行。按下用户按钮(PC13)时,LED 的闪烁速率应发生变化。

在这里插入图片描述


3. Hardware Interrupt 模块介绍

Hardware Interrupt 模块
从中断服务例程触发下游函数调用子系统。
此功能需要 Embedded Coder Support Package for STMicroelectronics STM32 Processors 支持。

在这里插入图片描述

使用 Hardware Interrupt(硬件中断)模块,在模型生成代码中自动创建中断服务例程(ISR),以响应所选事件。该 ISR 执行与该模块事件端口关联的下游函数调用子系统。
与事件输出端口关联的函数调用子系统以与 ISR 优先级相同的优先级运行。

使用此模块可以:

  • 在基于 STM32 处理器的开发板上创建 ISR。
  • 设置 ISR 优先级。
  • 启用或禁用中断抢占。

此模块仅针对指定的 ISR 和所选事件生成代码。要更改配置、启用中断和特定的触发选项,请使用所选外设的设置。
例如,要为 Hardware Interrupt 模块上的 ADC 外设创建 ISR:

  • 模型中必须包含一个模数转换器(ADC)模块。
  • 要从 ADC 触发 ISR,请在 Configuration Parameters > Hardware Implementation > Target Hardware Resources > ADC1 中选择 Enable Regular EoCS Interrupt 或 Enable Injected EoCS Interrupt 复选框。如果您的模型中没有模数转换器模块,选择此复选框将不起作用。
  • 在 Hardware Interrupt 模块中,从 Interrupt group 参数中选择 Analog to digital converter (ADC),并从 Interrupt name 参数中选择 ADCIRQ_Handler。
  • 在 Events to serve 参数中选择 ADC1 Reg EoCS 或 ADC1 Inj EoCS 事件名称。

当您选择必要的 Hardware Interrupt 模块设置时,DMA 和看门狗中断的 ISR 会自动触发。这是因为在 Configuration Parameters > Hardware Implementation > Target Hardware Resources > ADC 中,默认选中了 DMA 传输完成中断已启用 和 看门狗中断已启用 复选框。

中断服务例程(ISR)生成在 model_interrupts.c 文件中。


4. 提示

在 STM32CubeMX 工程中,确保执行以下配置:

  • 在 Project Manager > Project 下:

    • 启用 Do not generate the main()
    • 禁用 Generate under root
  • 在 Project Manager > Advanced Settings > Driver Selector 下:

    • 为外设选择 Low-layer (LL) 驱动
  • 在 Project Manager > Advanced Settings > Generated Function Calls 下:

    • 对所有外设初始化函数调用取消选择 Do Not Generate Function Call
    • 对所有外设初始化函数调用取消选择 Visibility (static)

(本节完)


参考资料:

  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 Hardware Support from Simulink, youcans@qq.com, https://ww2.mathworks.cn/hardware-support/stm32.html

  3. Using Hardware Interrupt Block to Create an ISR on STMicroelectronics STM32 Processor Based Boards,
    https://www.mathworks.com/help/ecoder/stmicroelectronicsstm32f4discovery/ug/Hardware-Interrupt-ISR.html


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

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐