1. 从零搭建开发环境
第一次接触Simulink和STM32CubeMX联合开发时,我花了两天时间才把环境配置正确。这里分享一个避坑指南:安装顺序决定成败。正确的步骤应该是先装MATLAB(建议R2020b以上版本),再装STM32CubeMX(最新版),最后安装STM32-MAT/TARGET硬件支持包。这个顺序如果搞反了,经常会遇到路径识别错误的问题。
硬件支持包的安装有个小技巧:在MATLAB的"附加功能"里搜索"STM32",找到官方支持包后不要直接安装。我建议先下载到本地,然后用管理员权限运行安装程序。这样能避免因权限不足导致的文件拷贝失败。安装完成后,在MATLAB命令行输入stm32_TestHardware,如果返回"STM32 hardware is ready",说明环境配置成功。
STM32CubeMX的配置也有讲究。创建新工程时,务必选择与开发板匹配的MCU型号。比如我用的是STM32F103C8T6最小系统板,就需要在CubeMX的Part Number搜索框输入"STM32F103C8"来筛选。这一步选错会导致后续生成的代码无法正常运行。
2. CubeMX串口参数配置详解
在CubeMX中配置USART时,新手最容易忽略的是时钟树配置。我遇到过好几次串口通信失败的情况,最后发现都是时钟源没配置对。以STM32F103为例,需要先在RCC里启用外部高速时钟(HSE),然后在Clock Configuration选项卡里确保系统时钟(SYSCLK)不超过72MHz,最后在USART配置里选择正确的波特率。
具体到USART1的配置:
- Mode选择"Asynchronous"
- Baud Rate设为115200(这是最常用的波特率)
- Word Length选8bits
- Parity选None
- Stop Bits选1
- 开启全局中断(NVIC Settings里勾选USART1 global interrupt)
关键技巧:生成代码前一定要在Project Manager里勾选"Generate peripheral initialization as a pair of .c/.h files"。这样生成的代码结构更清晰,方便后续在Simulink中调用。
3. Simulink模型搭建实战
在Simulink中新建模型时,建议从Blank Model开始。我常用的模块组合是:
- 信号源:使用Constant模块发送固定数据,或者用Sine Wave生成测试波形
- 串口发送:从STM32 Embedded Target库中找到USART Transmit模块
- 数据转换:用Data Type Conversion模块确保数据类型匹配
踩坑记录:第一次使用时,我直接拖拽了USART Transmit模块,结果生成的代码编译报错。后来发现需要在Model Configuration Parameters里做以下设置:
- Solver选择"Fixed-step"和"discrete (no continuous states)"
- Hardware Implementation里选择STM32硬件
- Code Generation选择"ert.tlc"作为系统目标文件
- 勾选"Generate makefile"
4. S函数问题解决方案
遇到"S函数未定义"错误时,90%的情况都是头文件路径问题。除了原文提到的复制getBuffPtr文件的方法,我这里分享一个更彻底的解决方案:
- 在MATLAB命令行输入
targetupdater打开硬件支持包管理器 - 找到STM32-MAT/TARGET,点击"Show Installed Files"
- 将所有.h文件路径添加到MATLAB的包含路径(使用
addpath命令) - 在Simulink模型的Configuration Parameters -> Code Generation -> Custom Code中添加包含路径
如果还是报错,可以尝试手动修改生成的代码。在ert_main.c文件中添加以下声明:
extern void getBuffPtr(void);5. Keil工程配置技巧
将生成的代码导入Keil时,有几点需要注意:
- 在Options for Target -> C/C++选项卡中,添加以下预定义宏:
USE_STDPERIPH_DRIVER,STM32F10X_MD - 在Include Paths中添加CubeMX生成的Inc文件夹路径
- 确保Linker Script选择正确的内存映射文件(对于STM32F103C8T6是STM32F10x_MD.s)
实用技巧:我习惯在Keil中创建一个自定义的Build按钮,一键执行以下操作:
- 编译代码
- 生成hex文件
- 通过ST-Link下载到开发板 这个可以通过Tools -> Customize Tools Menu配置实现。
6. 上位机数据可视化
完成硬件端开发后,我推荐使用串口调试助手+Python做数据可视化。这里分享一个简单的Python脚本:
import serial import matplotlib.pyplot as plt ser = serial.Serial('COM3', 115200) data = [] for _ in range(100): value = int(ser.readline().decode().strip()) data.append(value) plt.plot(data) plt.show()在Simulink端,记得在USART Transmit模块的Data Type参数选择"uint8"或"uint16",确保与Python脚本的数据类型匹配。
7. 常见问题排查指南
在实际项目中,我总结出串口通信最常见的三个问题及解决方法:
数据乱码:
- 检查CubeMX和上位机的波特率是否一致
- 用示波器测量实际波特率(测量一个位的持续时间,计算倒数)
- 确认时钟配置是否正确
数据丢失:
- 增加硬件流控制(RTS/CTS)
- 降低波特率测试
- 在中断服务函数中添加缓冲区状态检查
通信不稳定:
- 检查电源稳定性(纹波最好小于50mV)
- 缩短通信线缆长度(建议不超过1米)
- 在TX/RX线上加33Ω电阻做阻抗匹配
调试时可以先用逻辑分析仪抓取波形,确认硬件层是否正常。我常用的采样率是波特率的16倍以上,比如115200波特率至少要用2MHz采样率。