【STM32-MBD】(3)Simulink 模型部署之外部中断:按键输入
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)
【STM32-MBD】(3)Simulink 模型部署之外部中断:按键输入
本节的案例使用 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 模型部署入门。
-
运行 STM32CubeMX,菜单选择 Help–About,检查版本为 V6.4.0。
-
在 STM32CubeMX 菜单选择 Help–Manage embedded software packages,检查已安装 STM32Cube MCU Package for STM32G4 Series V1.5.0 固件包。
-
运行 STM32CubeProgrammer,测试与 STM32 开发板的连接。
(1)连接计算机与 NUCLEO-G431RB 开发板。
(2)运行 STM32CubeProgrammer,点击右上角 “Connect” 按钮连接设备,检查与 STM32 开发板的连接正常。 -
运行 Matlab,菜单选择 主页–附加功能–管理附加功能,弹出“附加功能管理器”窗口,检查已安装 STM32 嵌入式硬件支持包 “Embedded Coder Support Package for STMicroelectronics STM32 Processors”。
-
点击齿轮图标“设置” 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
-
打开 STM32CubeMX。
-
选择 New Project(或Ctrl-N快捷键)新建工程,进入 New Project 界面。
选择 STM32G431RB 作为目标 MCU(参考开发板的 MCU 型号)。 -
自动转入 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”

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

- 点击菜单栏 “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)” 勾选项全部取消,对所有外设初始化函数调用取消选择可见性(静态)。

- 完成以上配置后,使用快捷键 “CTL+S” 或点击 File–Save Project,保存 CubeMX 项目文件。
注意:在 STM32CubeMX 中配置完成后,不要点击 “GENERATE CODE” 生成代码,而是直接保存项目文件 “STM32G431_MBD04.ioc”。
2.2 创建 Simulink 仿真模型
在 CubeMX 项目文件所在的路径(例如:“D:\SimulinkProjects\STM32G431_MBD04”)下新建 Simulink 仿真模型,注意 *仿真模型 .slx 与 CubeMX 项目 .ioc 要保存在同一个目录下。
-
运行 MATLAB 软件,打开 Simulink。点击 “空白模型” 创建新的 Simulink 模型,保存到本项目路径下:STM32G431_MBD04.slx。
-
打开 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。

-
在 Simulink 仿真窗口,继续搭建仿真模型。

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

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

- 在右侧 “硬件实现(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)“。

- 完成搭建仿真模型,保存为文件 STM32G431_MBD04a.slx。注意仿真模型 .slx 与 CubeMX 项目 .ioc 要保存在相同的路径下。
2.3 从 Simulink 模型生成 STM32 代码
-
在 Simulink 打开仿真模型 STM32G431_MBD04a.slx。
-
在 “硬件(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

-
Simulink 通过调用 STM32CubeProgrammer 将编译的目标文件加载到 STM32 开发板。
-
将代码加载到开发板上后,硬件板上的 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)
(本节完)
参考资料:
-
基于 STMicroelectronics STM32 处理器的板快速入门, (https://ww2.mathworks.cn/help/ecoder/stmicroelectronicsstm32f4discovery/ug/Getting-started-stm32cubemx.html?searchHighlight=STM32&s_tid=srchtitle_support_results_2_STM32)
-
STMicroelectronics STM32 Hardware Support from Simulink, youcans@qq.com, https://ww2.mathworks.cn/hardware-support/stm32.html
-
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
更多推荐



所有评论(0)