前言
入职一段时间了,需要不断充实自己的技能树,现在汽车行业控制器的开发大都基于“V”流程,采用基于模型开发的方式,此文章作为记录自己不断的学习过程
一、MBD是什么?
基于模型的设计(Model-Based Design,MBD),是一种围绕模型搭建展开的项目开发方法。该方法可避免繁琐的代码编写和调试过程,可极大提高项目开发效率,目前在汽车行业应用普遍。
二、概述
本文只是通过一个简单的示例来展示MBD的开发流程。 设计需求很简单,通过按键控制LED的亮灭状态,即按一次按键LED亮,再按一次按键LED灭。 控制器:STM32F407ZG 应用层开发:MATLAB/Simulink 底层开发:STM32CubeMX 工程编译环境:Keil,在Keil环境中完成应用层与底层代码的集合,并通过编译下载到控制器;
三、软件架构
应用层开发:MATLAB/Simulink,建好模型后通过Emmodded Coder生成C代码; 底层开发:ST公司的CubeMX,配置好时钟及GPIO,可直接生成完整的底层工程代码; 应用层与底层的接口开发:Keil
1-底层代码生成
开发板:STM32F407ZG 1-配置时钟源为外部晶振  2-配置时钟  3-配置GPIO  通过KEY0控制LED0的亮灭,KEY0为PE4引脚,LED0为PF9引脚。配置PE4引脚为输入,PF9引脚为输出;  
4-配置工程名及存储位置,生成底层代码 
2-底层代码与应用层代码接口开发
Keil打开STM32CubeMX生成的工程,编写应用层与底层的接口函数  接口函数Get_Key0State()读取按键KEY0引脚PE4的状态,返回1表示按键按下,返回0表示按键未按下; 接口函数Set_Led0State(unsinged char state)用来设置LED0的状态,传入的数值为1,LED0灭,传入的数值为0,LED0亮;
在main.h中声明一下两个函数,用于接口函数调用
3-应用层代码生成
整体思路:通过调用Get_Key0State()函数读取KEY0的状态从而检测按键是否按下。若检测到按键KEY0按下,LED0的状态发生转换; MATLAB/Simulink中搭建模型如下:  1-按键处理:  按键处理设置了两个延时,即当第一个周期Get_Key0State为0,之后连续两个周期Get_Key0State为1则认为按键被按下,用于请求转换LED0的状态; 2-LED状态转换  按键按下一次,LED0的状态变换一次; 3-设置Singnal对象,并设置 Storage Class和头文件  输入信号线Storage Class设置为GetSet,头文件设置为main.h,表示从main.h中调用Get_Key0State函数;  传递信号线Storage Class设置为ExportedGlobal全局变量  输出信号线Storage Class设置为ExportedGlobal全局变量 4-MATLAB生成代码配置 求解器设置为离散  硬件设置为ARM Cortex,开发板为STM32F407ZG,ARM Cortex内核  Code Generation:设置为ert.tlc,仅生成代码  设置不用再生成额外的主函数 5-配置完成后Ctrl+B生成代码  6-将生成的.c和.h文件拷贝到底层工程中  7-将生成的应用层代码加入到工程中   8-加入头文件  9-调用应用层函数 MATLAB/Simulink生成的应用层函数model_step()功能就是调用main.h中的Get_Key0State()函数,判断按键是否按下,按键按下后变换LED的状态;  在主函数中调用model_step(),根据model_step()函数中LEDState值得状态设置LED的亮灭;  10-编译,下载到开发板,观察现象
|