配置环境
使用的板子是正点原子STM32F407ZGT6,这个应该没有要求,任意版本均可。
stm32 mat/target,是一个matlab插件。可能不会再更新了,起到的作用是让simulink生成代码时触发cubemx。对版本的要求比较苛刻
,我采用的是最新版本,在开发文档中可见对matlab与cubemx版本有要求:
实际测试中我尝试了matlab R2018a与matlab R2020b,以及CubeMX V6.3.0,代码生成都存在问题。目前的尝试中没有发现第二种能够正常运行mat/target的环境,建议按照开发文档要求的版本使用,即MATLAB R2018b+STM32CubeMX V5.6.0
安装方法:setup后找到安装的文件夹,然后在matlab界面设置路径->添加并包含子文件夹->导入setup的安装路径
,如图,STM32那一级文件夹是我的安装路径:
STM32CubeMX,注意选要求的版本
MATLAB R2018b
引用其他人Keil 5.27,CubeMX在5.6只支持Keil 5.27的生成(或许对Keil高版本也可以用,没有尝试)
或许使用Keil之外的软件也可以进行烧写,即STM32CubeMX配置时生成器的更换,暂时没有尝试。
运行流程
STM32CubeMX生成.ioc工程文件
我配置了烧写端口(使用ST-link仿真器)与晶振时间端口,然后设置PF9与PF10为GPIO output(我板子上LED灯的端口),共占用8个
然后进行工程设置,重点是ToolChain/IDE ,这里我们选择MDK-ARM V5.27
,适配Keil 5.27版本
这里重点是第一栏,最好选择Copy only the necessary library files
,否则项目的Drivers会变得很大(100M+),不便于项目移动
到这里之后按Ctrl+S保存项目即可,无需点击generate code
,路径下就会生成一个.ioc文件
Simulink
STM32_Config
首先在matlab里使用cd切到.ioc所在路径(否则simulink生成会出问题),然后打开simulink,先拖入STM32_Config模块:
在其内部点击Select STM32 configuration file,选择路径下的.ioc,完成config链接。
simulink config
然后进行simulink工程config,我设置如下:
将解算器设置为离散化,并给出步长(这个步长应该和单片机频率无关,估计只是在仿真里用)
代码生成这里的配置要改成使用stm32.tlc
有一些教程指出这里的三个comments框也要打上,我使用中没有出现明显问题,这里不打或许无影响(我观察中仍然生成了注释,不知道这里勾选有什么影响),如果发现有问题可以勾选试一下。
这一页中要设定STM32CubeMX启动路径,通常点击Path update框后,点击Update installed path,就会自动搜索CubeMX路径,等待一会后自动完成。
GPIO config
之后加入功能模块,我这里需要改变GPIO的状态,所以选Target Support Package里面的GPIO_Write。刚加入可能会报错:
此时只需要保存自己的simulink模型(.slx文件),然后关闭再打开,GPIO_write模块就会读取正确的端口
。如这里显示的GPIOA是错误的,实际上并没有打开A端口,并且点进去也都是全灰端口,无法使用。但重开后模块上的显示变成GPIOF,点击后就有9pin与10pin的可用复选框,与CubeMX中的设置一致。
这里勾选Pin可使GPIO_write多出一个输入端口,可连接simulink中的信号源等,产生需要的输入:
我这里加入了两个占空比不同的矩形波信号。
build model
也可以先运行一下,看看各处信号的输出是不是符合预期。
然后就可以进行build model:
注意正常的运行会在build过程中启动STM32CubeMX,并且触发了它的generate code,如果没有触发则生成失败(可以看下STM32CubeMX版本是否是5.6,在我的测试中6.3就不能被触发)
之后目录就会出现Src等文件夹,注意到其中的main.cpp的主循环中包含逻辑:
如果发现while内是个空循环,可能是matlab版本有问题,我在使用2020b版本时while内就为空。
keil
从MDK-ARM文件夹中启动Keil,先编译,再烧写。