Matlab生成stm32代码

栏目: 编程工具 · 发布时间: 5年前

内容简介:利用Matlab的simulink搭建模型生成C代码,通过stm32cubemx生成工程,最后在KEIL或者IAR等工具里面编译生成代码下载至MCU中执行。 本文以流水灯建立模型和简单使用定时器为例进行演示。Matlab版本建议在2013B以上,本文使用Matlab 2016a。下载地址(https://www.stmcu.org.cn/document/detail/index/id-216053) 安装完成后重启MATLAB。官网文档中提到,当前只支持F4和F3部分系列,F1系列生成代码后编译可能会报错
## 一、整体思路

利用Matlab的simulink搭建模型生成C代码,通过stm32cubemx生成工程,最后在KEIL或者IAR等 工具 里面编译生成代码下载至MCU中执行。 本文以流水灯建立模型和简单使用定时器为例进行演示。

二、开发环境

1、安装Matlab

Matlab版本建议在2013B以上,本文使用Matlab 2016a。

2、安装STM32硬件支持包

下载地址(https://www.stmcu.org.cn/document/detail/index/id-216053) 安装完成后重启MATLAB。官网文档中提到,当前只支持F4和F3部分系列,F1系列生成代码后编译可能会报错,本文使用STM32-MAT版本V4.3.0。

3、安装STM32CUBEMX

用于配置单片机硬件资源,下载地址(https://www.stmcu.org.cn/document/detail/index/id-214984)

4、安装KEIL或者IAR等IDE

用于配置工程文件。

三、STM32硬件资源配置

1、打开STM32CUBEMX

选择“access to MCU selector”

2、选择STM32芯片

以STM32F103R6为例。如果搜索不到,那么可能需要下载安装库文件 下载对应的库文件即可。 搜索到芯片后,选中点击“Start Project”,进入配置界面。

3、首先选择时钟

这里选择HSE,使用外部晶振

4、再配置GPIO

选择PA1-5作为LED灯。引脚状态选择为输出。 再根据硬件设计,配置IO上拉还是下拉。

5、最后配置时钟

选择最大72MHz。

6、保存工程

输入工程文件信息 选择生成的工程文件,如果是KEIL,那么选择“MDK-ARM V5”。 最后保存即可。

四、SIMULINK配置

1、配置MATLAB搜索路径

打开MATLAB,首先配置MATLAB搜索路径。 将STM32-MAT的安装路径添加进来。 添加完成后将MATLAB当前工作路径修改为第三步中IOC文件位置,默认是在Matlab安装位置,不修改的话后面生成代码的时候会报错。 最后建议重启一下MATLAB。

2、打开SIMULINK

新建一个空白模型。 打开配置界面

3、选择STM32配置文件

选择stm32.tlc。 解算器(Solver)选项默认为固定步长,即“Fixed-step”,然后修改步长为1/10000,即0.1ms。也可以根据实际情况修改,默认为auto可能会导致程序运行时无法显示出效果。 添加代码注释

4、选择cubeMX路径

五、模型搭建

Simulink配置完成后就可以自己搭建模型。

1、配置芯片

选择MCU config,将右侧模块拖动至刚刚新建的空白模型。 双击刚刚拖出来的模块,进入配置界面,选择第三步生成的IOC文件。

2、选择GPIO模块

同样拖动至SIMULINK,双击该模块配置IO引脚,可以看到我们在cubemx里面配置的IO,勾选要打开的IO,点击确认即可。

3、模型设计

使用”Counter Free-Running”模块进行计数,参数配置如下 此配置的意思为每0.5秒计数一次,计数的最大值为2^Nbits – 1,其中Nbits为所填的2,所以这里最大值为3。 示波器显示和预期值一致。 然后通过一个关系比较符,当计数值分别等于0,1,2,3,时,相应的GPIO输出为1。 示波器仿真结果如图 最后模型如图所示

六、代码生成

模型设计完成后,仿真结果无误,就可以进行代码生成。按“Ctrl+B”或者如图所示点击,进行代码生成。 最后生成工程目录如下 “stmDemo_stm32”目录为matlab生成的原始代码。 IOC文件为stm32cubemx工程文件。 Slx文件为simulink模型文件。 其他的为KEIL工程中的代码。

七、编译下载验证

1、仿真验证

打开工程,代码编译完成后,下载程序到目标板。 这里使用proteus进行仿真,仿真中流水灯切换速度为5秒,比预定的时间0.5秒慢了10倍,仿真提示” Simulation is not running in real time due to excessive CPU load.”,说明仿真时单片机运行速度不是实时的。 为了进一步验证,再使用一个定时器进行让LED5以1Hz的频率闪烁。配置如下: 模型如下:

生成代码后编译报错,原因为F1系列的库函数中”__HAL_TIM_SetAutoreload”该函数未定义成” __HAL_TIM_SET_AUTORELOAD”。 而在F4系列的库函数中是有该定义的,编译不会报错。 因此生成的代码无法正常使用定时器,除非修改生成后的代码,这样并不是我们想要的。

2、开发板验证

最后以F429单片机为例,重新生成代码下载到单片机进行验证。IOC文件中,时钟配置为180MHz,其他步骤同第三~六步。 代码生成完成后对工程进行配置,设置程序下载完成后重置运行,下载器根据实际情况设置为”CMSIS-DAP-Debugger”。 编译完成下载至单片机中,看是否满足设计要求。 经过验证该代码无误。

八、注意事项

1、代码生成后的处理

生成代码后,由于使用了systick(系统定时器),但是生成的代码中没有对其进行调用,所以需要在stm32f4xx_it.C中手动添加一行代码,否则程序可能无法正常运行。添加的代码为:HAL_SYSTICK_IRQHandler(); 该问题具体原因未知,可能和stm32cubemx配置或者版本有关。

2、Matlab工作路径

建议生成代码之前,将matlab工作路径指定到IOC文件位置,同时将SLX文件也放在同一个文件夹下,这样方便工程管理。

3、参考文档

在STM32-MAT安装路径下还有更多示例以及使用说明。

4、Invalid index问题

Invalid index. Component:Simulink | Category:Block diagram error

matlab2018b中生成代码时出现上述问题 解决方法如下: 在simulink设置选项“hardware implementation”中把设备STM改为“custom processor”

九、小结

总的来说该方法生成底层代码较复杂,而且配置繁琐。当然优点是基本不需要修改生成的代码,但实际上未能节省太多时间。

MATLAB自动生成的代码是标准的C代码,支持所有的MCU。因此建议在实际开发中能在Simulink环境下仿真的部分,通过Simulink实现;对于单片机底层这类没法在Simulink下仿真的软件,不应该打包到Simulink环境下。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Algorithms Unlocked

Algorithms Unlocked

Thomas H. Cormen / The MIT Press / 2013-3-1 / USD 25.00

Have you ever wondered how your GPS can find the fastest way to your destination, selecting one route from seemingly countless possibilities in mere seconds? How your credit card account number is pro......一起来看看 《Algorithms Unlocked》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具