基于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,不生成代码!不生成代码!不生成代码!
四.用simulink建立模型
1、将将STM32-MAT的安装路径添加进MATLAB搜索路径
打开MATLAB,配置MATLAB搜索路径,“添加并包含子文件夹…”。
2.建立simulink模型
(1)将IOC工程所在路径设置为matlab的当前工作路径
(2)打开simulink,生成一个空白模型命名为ledmat.slx,与LED.ioc保存在同一个文件夹中
(3)进行模型参数配置
第一步:code generation配置如下
这一步只是选择了browser,找到了stm32.tlc,其他都是默认值。
第二步,配置STM32 Options
这一步,只需要将三个复选框都选上,其他自动填充。第三步,配置solver
配置如图。
(4)模型搭建
第一步,配置MCU
找到MCU CONFIG,拖拽或发送至空白模型文件ledmat.slx
双击图标,打开参数配置窗口,浏览找到LED.IOC,OK保存。
MCU的型号出现在MCU CONFIG模块上。
第二步,将GPIO-WRITE模块拖放至模型文件,双击,在出现的配置窗口中将四个引脚的复选框选中。
确认后的效果:
第三步,调用阶梯信号经运算生成流水灯的驱动信号
计数器阶梯信号源双击图标出现参数配置窗口,2位,表示2^2=4个阶梯,取值为0~3.采样时间0.25是每个阶梯的持续时间为0.25s,即四阶梯周期为1秒。
完成模型如图:
其中,分别与4个const相比较,相同则输出1,不同输出0,做为各个引脚的驱动电平。
加入scope,仿真run,得到的仿真运行波形如下
说明模型正确。
(5)build model,生成部分代码
效果为
五.STMCubeMX生成代码
打开LED.ioc,点击 generate code
然后open project
六.MDKARM配置工程,并编译下载
1.配置仿真器
选择JLINK-选择端口类型为SW-复选RESET AND RUN
![选择端口类型为SW()
2.编译下载,运行。
此处有一大坑。在此处徘徊三日!,更换STM32CubeMX版本从5.5 5.3 5.2 5.1 5.0 都不行!CSDN上浏览数日,偶见此代码,对照发现没有,添加之!
添加了一行代码,解决!
代码为:HAL_SYSTICK_IRQHandler();
添加位置为:源文件stm32f4xx_it.c 的SysTick_Handler() 函数中。
3.重新编译,下载。
下载完程序自动运行,动图:
七.感受
第一次做,步骤繁琐,但是路径走通后再实现起其他功能,就轻松了。也据说,复杂系统功能的实现依赖于模型设计的话,更便捷更高效。
此方法对于片上资源的调用应该是有效的,计划逐一尝试。可调配排上资源列表:
中间的坑,是出错也没有直接的指示,多看多比较发现解决方法。
依赖软件比较多,matlab/simulink+stmcubemx+mdkarm.