基于MBD的嵌入式系统实现

基于STM32CubeMX和HAL的嵌入式系统编程通过图形化配置和自动生成初始化C代码的方式,大大降低了嵌入式系统应用程序开发的工作量。

偶尔看见刘杰老师的基于模型的设计和嵌入式系统实现,被只需要搭建模型就可以生成可以下载到嵌入式系统运行的代码的描述强烈吸引,几经波折,在几天的折腾后实现,终于实现了。避免忘记,避免重复踩坑,写本文档以记录之。

一、整体思路

先利用STM32CubeMX进行图形化配置,再用Matlab的simulink搭建模型进行仿真无错后生成部分C代码,再以STM32CubeMX生成工程,最后在KEIL或者IAR等工具中编译生成目标代码下载至MCU中执行。

本文以流水灯的功能实现为范例进行演示。

二、开发环境

只表明实现本范例时所使用的各软件,各自的安装过程不再详述。

1.Matlab2018a

2.STM32-MAT4.4.2(最新版本大概是5.6,与matlab2018a的版本不匹配)

3.STM32CubeMX5.5

4.MDK-ARM V5.29

三.用STM32CubeMX建立ioc工程

完成图形化STM32硬件资源配置,生成STM32CubeMX工程文件ioc。

开发板MCU为STM32F407VET6,用JLINK下载调试,HSE外接8M晶振,4个LED分别接PE0-PE3,低电平亮。

硬件资源配置过程见本文另一篇博文,完全相同。

配置完成后仅生成LED.ioc。

重要的事情说三遍:仅生成LED.ioc,不生成代码!不生成代码!不生成代码!

深度学习嵌入式部署 嵌入式实现_嵌入式系统


深度学习嵌入式部署 嵌入式实现_嵌入式系统_02


深度学习嵌入式部署 嵌入式实现_嵌入式系统_03


深度学习嵌入式部署 嵌入式实现_嵌入式系统_04


深度学习嵌入式部署 嵌入式实现_嵌入式系统_05


深度学习嵌入式部署 嵌入式实现_matlab_06

四.用simulink建立模型

1、将将STM32-MAT的安装路径添加进MATLAB搜索路径

打开MATLAB,配置MATLAB搜索路径,“添加并包含子文件夹…”。

深度学习嵌入式部署 嵌入式实现_matlab_07


深度学习嵌入式部署 嵌入式实现_嵌入式系统_08


2.建立simulink模型

(1)将IOC工程所在路径设置为matlab的当前工作路径

深度学习嵌入式部署 嵌入式实现_深度学习嵌入式部署_09

(2)打开simulink,生成一个空白模型命名为ledmat.slx,与LED.ioc保存在同一个文件夹中

深度学习嵌入式部署 嵌入式实现_MATLAB_10


(3)进行模型参数配置

第一步:code generation配置如下

深度学习嵌入式部署 嵌入式实现_嵌入式系统_11


这一步只是选择了browser,找到了stm32.tlc,其他都是默认值。

第二步,配置STM32 Options

深度学习嵌入式部署 嵌入式实现_深度学习嵌入式部署_12


这一步,只需要将三个复选框都选上,其他自动填充。第三步,配置solver

深度学习嵌入式部署 嵌入式实现_matlab_13


配置如图。

(4)模型搭建

第一步,配置MCU

深度学习嵌入式部署 嵌入式实现_matlab_14


找到MCU CONFIG,拖拽或发送至空白模型文件ledmat.slx

双击图标,打开参数配置窗口,浏览找到LED.IOC,OK保存。

深度学习嵌入式部署 嵌入式实现_深度学习嵌入式部署_15


MCU的型号出现在MCU CONFIG模块上。

深度学习嵌入式部署 嵌入式实现_深度学习嵌入式部署_16


第二步,将GPIO-WRITE模块拖放至模型文件,双击,在出现的配置窗口中将四个引脚的复选框选中。

深度学习嵌入式部署 嵌入式实现_MATLAB_17


确认后的效果:

深度学习嵌入式部署 嵌入式实现_图形化_18


第三步,调用阶梯信号经运算生成流水灯的驱动信号

深度学习嵌入式部署 嵌入式实现_嵌入式系统_19


计数器阶梯信号源双击图标出现参数配置窗口,2位,表示2^2=4个阶梯,取值为0~3.采样时间0.25是每个阶梯的持续时间为0.25s,即四阶梯周期为1秒。

完成模型如图:

深度学习嵌入式部署 嵌入式实现_深度学习嵌入式部署_20


其中,分别与4个const相比较,相同则输出1,不同输出0,做为各个引脚的驱动电平。

加入scope,仿真run,得到的仿真运行波形如下

深度学习嵌入式部署 嵌入式实现_matlab_21


说明模型正确。

(5)build model,生成部分代码

深度学习嵌入式部署 嵌入式实现_深度学习嵌入式部署_22

效果为

深度学习嵌入式部署 嵌入式实现_深度学习嵌入式部署_23


五.STMCubeMX生成代码

打开LED.ioc,点击 generate code

深度学习嵌入式部署 嵌入式实现_图形化_24


然后open project

六.MDKARM配置工程,并编译下载

1.配置仿真器

选择JLINK-选择端口类型为SW-复选RESET AND RUN

深度学习嵌入式部署 嵌入式实现_MATLAB_25


![选择端口类型为SW()

深度学习嵌入式部署 嵌入式实现_深度学习嵌入式部署_26


2.编译下载,运行。

此处有一大坑。在此处徘徊三日!,更换STM32CubeMX版本从5.5 5.3 5.2 5.1 5.0 都不行!CSDN上浏览数日,偶见此代码,对照发现没有,添加之!

添加了一行代码,解决!

代码为:HAL_SYSTICK_IRQHandler();

添加位置为:源文件stm32f4xx_it.c 的SysTick_Handler() 函数中。

深度学习嵌入式部署 嵌入式实现_MATLAB_27


3.重新编译,下载。

下载完程序自动运行,动图:

深度学习嵌入式部署 嵌入式实现_matlab_28


七.感受

第一次做,步骤繁琐,但是路径走通后再实现起其他功能,就轻松了。也据说,复杂系统功能的实现依赖于模型设计的话,更便捷更高效。

此方法对于片上资源的调用应该是有效的,计划逐一尝试。可调配排上资源列表:

深度学习嵌入式部署 嵌入式实现_matlab_29


中间的坑,是出错也没有直接的指示,多看多比较发现解决方法。

依赖软件比较多,matlab/simulink+stmcubemx+mdkarm.