文章目录
- 1 问题引入
- 2 集成方案
- 3 建模与编程过程
-
- 3.1 Simulink模型搭建
- 3.2 代码生成配置
- 3.3 STM32工程搭建
- 3.4 STM32的main.c文件修改
-
- 3.4.1 #include “demo.h”
- 3.4.2 float Demo_Input;
- 3.4.3 demo_initialize()
- 3.4.4 Demo_Input = Demo_Input + 1;
- 3.4.5 demo_step();
- 3.4.6 printf()
- 3.5 软件编译、串口打印
- 4 多模型的集成
-
- 4.1 多模型集成方案
- 4.2 新增Demo2模型
- 4.3 修改Stm32工程
- 4.4 软件编译、串口打印
- 5 总结与注意点
1 问题引入
博主在《Simulink代码生成》专栏的博客中,通过将模型生成代码,然后研究C代码的逻辑和结构。但是,在汽车ECU软件开发的过程中,代码并不是最终产物,还需要将代码编译成可执行文件,刷入控制器中。过程如下示意图:
3 建模与编程过程
本章节会详细地讲解博主从零开始建模和编程,直到控制器跑起来,并打印出正确的结果。
3.1 Simulink模型搭建
根据上一章的方案介绍,Simulink模型里面就是简单实现了将输入放大两倍的功能。具体搭建过程如下:
1)打开Simulink模型,建立一个Inport模块、一个Outport模块和一个Gain模块。将Gain模块的放大系数设置为2,并用信 线将三者连接。
2)Ctrl + B生成代码后,可以简单地看一下接口和step函数。在demo.c文件中先是定义了输出接口Demo_Output变量,然后在step函数中将Demo_Inport乘以2再赋值给Demo_Output。
3.4.1 #include “demo.h”
#include “demo.h”是为了让main.c文件能够通过demo的头文件访问到demo.c的函数。因为在后面的代码中,main函数中要调用demo_step函数和Demo_Output全局变量。
3.4.2 float Demo_Input;
在main.c中定义了全局变量Demo_Input,使得demo.c可以通过demo_private.h中访问到。这样的话,Demo_Input全局变量就传递到了demo.c中进行计算了。
3.4.3 demo_initialize()
在while(1)循环之前先调用一下demo_initialize();初始化函数,将Demo_Output初始化为0.
3.4.4 Demo_Input = Demo_Input + 1;
让每个while循环中,Demo_Input的值加1。
3.4.5 demo_step();
调用了step函数,对Demo_Input的数值做乘以2的计算,再赋值给Demo_Output。那么通过模型的放大2倍,Demo_Output应该一直是Demo_Input的两倍。也就是说,Demo_Input的输出值是0,1,2,3…,Demo_Output的输出值是0,2,4,6…。
3.4.6 printf()
printf把输入Demo_Input和输出Demo_Output通过串口打印到电脑上。
3.5 软件编译、串口打印
将STM32工程重新编译,并通过ST-LINK下载到硬件中。
通过串口,可以打印出输入和输出的值:
4.3 修改Stm32工程
1)首先将demo2.c文件加入Stm32的项目中。
将修改后的工程编译并下载到Stm32中,通过串口打印出如下内容:

通过Demo2_Output返回的数值,可以看出新增的demo2.slx也在while循环中不断地运行。
5 总结与注意点
- 注意目标硬件要选择正确,因为这背后是该控制器所规定的不同数据类型的字长。
- 不要手动修改模型生成的代码,即使是策略上的一点小的修改,也应该先改模型,再生成代码,否则模型与代码上的管理会非常混乱,或者在复杂的项目中容易导致代码的重大缺陷。
- 由于Simulink本身也只是一个工程软件,自身也有bug,因此生成的代码也有可能与模型的策略不一致。但是这是一个概率极低的事件,如果出现了不符合预期的测试结果,还是应该先去寻找建模过程中的逻辑错误。
以上很多概念在博主的其他博客中也都有更详细的说明。
>>返回个人博客总目录
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!