前言
基于上一章节内容,本文进一步扩展应用层的功能,以展示基于模型设计开发的优势。
一、设计需求
通过按键控制两个LED的转换状态,第一次按下按键LED0、LED1亮;第二次按下按键LED0和LED1呈现流水灯状态,间隔周期为1s;第三次按下按键LED0、LED1灭。
底层代码生成及底层代码与应用层接口代码请参考上一篇博客:
MATLAB/Simulink&&STM32CubeMX&&Keil工具链完成基于模型的设计开发(一)
二、硬件设计
控制器:STM32F407ZG
MCU引脚:KEY0引脚PE4;LED0引脚PF9;LED1引脚PF10
三、软件设计
3.1底层配置
1、RCC设置为外部时钟,配置为168MHz
2、PE4设置为输入,上拉电阻;PF9、PF10设置为输出,上拉电阻,高速,初值为1;
3、IDE设置为Keil
3.2应用层与底层的接口开发
3.3应用层开发
3.3.1按键检测
检测到Get_KEY0State的下降沿,Mode++,根据Mode的值进行LED状态的切换
3.3.2状态切换
根据Mode的值,进行LED的状态切换
3.3.3仿真验证
仿真信号给了6个下降沿,LED的状态切换为:亮 流水 灭 亮 流水 灭
仿真结果符合自己的设计逻辑
3.3.4输入输出信号类型设置
接口信号名称及数据类型已经在Keil中定义完成,设置输入输出信号类型如下:
3.3.5代码生成
关于代码生成设置,请阅读:
MATLAB/Simulink&&STM32CubeMX&&Keil工具链完成基于模型的设计开发(一)
注:因为模型中用到了falling函数,所以会多生成三个代码文件:rt_zcfcn.c,rt_zcfcn.h,zero_crossing_type.h
3.3代码集成
将Matlab生成的文件夹复制到底层生成的工程下:APP_LED_Driver
在APP_LED_Driver中的.c文件添加到工程
添加APP_LED_Driver中的头文件路径
注:此时编译会报错,缺少“solver_zc.h”文件,该文件在Matlab的安装路径下,将该文件复制到APP_LED_Driver文件下
该文件的路径
添加APP_LED_Driver.h
在主函数中调用APP_LED_initialize()初始化函数;调用APP_LED_Dirver_step()函数,根据该函数运行结果进行LED驱动。
注:调用APP_LED_Dirver_step()一次相当于在Matlab中运行了模型一次,Matlab设置为10ms运行一次,所以该函数也要在工程中10ms运行一次,为了方便,仅仅在while循环中加了一个10ms延时,近似模拟10ms运行一次的环境。实际使用中要把该函数置于精确的10ms调度下,确保该函数10ms被执行一次
四、实验验证
编译,将程序下载到控制器
五、总结
在Matlab/Simulink中进行图形化编程还是很有意思的,在Stateflow中可以实现很多复杂的逻辑。