Matlab生成stm32代码

3 篇文章 0 订阅
2 篇文章 1 订阅

一、整体思路

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

二、开发环境

1、安装Matlab

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

2、安装STM32硬件支持包

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

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为例。如果搜索不到,那么可能需要下载安装库文件
setup.png
下载对应的库文件即可。
setup.png
搜索到芯片后,选中点击“Start Project”,进入配置界面。
setup.png

3、首先选择时钟

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

4、再配置GPIO

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

5、最后配置时钟

选择最大72MHz。

在这里插入图片描述

6、保存工程

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

四、SIMULINK配置

1、配置MATLAB搜索路径

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

2、打开SIMULINK

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

3、选择STM32配置文件

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

4、选择cubeMX路径

setup.png

五、模型搭建

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

1、配置芯片

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

2、选择GPIO模块

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

3、模型设计

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

六、代码生成

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

七、编译下载验证

1、仿真验证

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

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

2、开发板验证

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

八、注意事项

1、代码生成后的处理

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

2、Matlab工作路径

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

3、参考文档

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

4、Invalid index问题

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

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

九、小结

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

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

  • 56
    点赞
  • 370
    收藏
    觉得还不错? 一键收藏
  • 32
    评论
Matlab是一种非常强大的数值计算和数据可视化软件,而STM32是一种基于ARM Cortex-M内核的微控制器。在这里,我将解释一下如何使用Matlab编写STM32代码。 首先,Matlab提供了Simulink工具,它是一种可视化编程环境,方便用户通过拖放图形化组件来设计和模拟控制系统。SimulinkSTM32的支持通过使用特定的硬件支持软件包来实现。 首先,您需要下载并安装MathWorks官方提供的Simulink support package for STM32开发板(具体型号根据您的STM32开发板型号而定)。安装完成后,您将能够在MatlabSimulink中选择STM32目标和相应的硬件参数。 一旦安装完成,您可以使用MatlabSimulink来编写控制算法,并将它们部署到STM32开发板上。为此,您需要将您的STM32开发板与计算机连接,并使用Simulink support package提供的Blockset来配置和生成相应的C代码Matlab提供了丰富的工具和库函数,可以让您更容易地进行算法设计和仿真,并生成适用于STM32的可执行代码。您可以在Simulink中使用模块化的方式设计传感器读取、数据处理、控制逻辑等功能,并使用MatlabSimulink Code Generation工具将其转化为C代码生成的C代码将会与STM32开发板上的硬件驱动程序进行交互,使您能够在实际硬件上测试和运行您的算法。此外,您还可以使用Matlab提供的代码生成器来生成其他语言(如C、C++、Python)的代码或使用通信协议(如UART、SPI、I2C)与其他外部设备进行通信。 总之,使用Matlab编写STM32代码是一种方便且高效的方式,可以快速地开发、测试和部署控制系统。同时,Matlab的可视化和数据处理功能也能为您的项目提供更多的灵活性和功能扩展性。
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值