Matlab代码导入STM32F103流程
文章目录
- 软件准备
- STM32CubeMX简介
- 配置STM32CUBEMX
- 配置SIMULINK
- SIMULINK对STM32F103进行点灯试验
- 一般算法导入到STM32
- 问题故障解决
- 参考
软件准备
- 安装MATLAB2019a,64位。
- 下载安装JRE。STM32CubeMX 软件是基于 JAVA 环境运行的,所以需要安装 JRE (Java Runtime Environment)才能使用, 建议到官网下载最新版本JRE。
https://www.java.com/en/download/manual.jsp
- 安装STM32-MAT/TARGET,我下载了STM32_MAT_TARGET_V4.4.2。(后来验证不要用这个版本,因为和其他软件版本不匹配,用5.6.0,下文有链接,否则会报错)
https://www.stmcu.com.cn/Designresource/detail/software/709508
STM32-MAT/TARGET 主要特性:
- 用于STM32微控制器的Simulink应用程序配置
- STM32配置通过STM32CubeMX完成
- STM32的自动“ C”代码生成基于STM32Cube HAL库
- 使用USART RTioStream的处理器循环(PIL, Processor In the Loop)
- 报告:代码生成, 代码执行分析
- STM32外设Simulink库模型
打开Matlab, 输入pathtool, 点击添加并包含子文件夹按钮, 找到D:\MATLAB\STM32-MAT\STM32路径加进去。
- 安装STM32CubeMX,我下载了stm32cubemx-win_v6-5-0。
https://www.st.com/en/development-tools/stm32cubemx.html#overview
准备一个ST-LINK下载器,插在 JTAG/SWD 调试下载口。一般商家会送一个。我用的是ST-Link V2版本。
ST-Link是用于STM8和STM32微控制器的在线调试器和编程器,也是大家口中的下载器。
ST-Link具有SWIM、JTAG / SWD等通信接口,用于与STM8或STM32微控制器进行通信(各版本有差异)。
三种接口说明:
· SWIM:Single Wire Interface Module,单线接口模块。
· JTAG:Joint Test Action Group,联合测试工作组,是一种国际标准测试协议。
· SWD:Serial Wire Debugging,串行调试接口。
STM32CubeMX简介
STM32CubeMX是一个配置STM32代码的工具,它把很多东西封装的比较好,硬件抽象层、中间层、示例代码等,是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具,目的就是为了方便开发者, 允许用户使用图形化向导生成C 初始化代码,可以大大减轻开发工作,时间和费用,提高开发效率。
32的三种开发模式
1.stm32能基于寄存器开发,就是和51单片机一样,直接对寄存器进行编程。基于寄存器编写的代码简练、执行效率高。但由于 STM32 微控制器的片上外设和寄存器数量太多,这种编程方式移植性差,寄存器名称记起来也很痛苦。
2.基于st官方的固件库进行开发。现在大部分stm32教程教的都是这种库函数开发,如正点原子,野火等。他相比寄存器开发更加简单,我们不需要记住每个寄存器的地址和名称,只要会调用ST官方封装好的库函数进行编程就可以了。
3.基于STM32cubemx进行开发,就是我们今天要给大家介绍的内容。STM32cubemx使用的是st官方新推出的HAL库,然后我们可以通过软件内设计好的图形化界面进行配置,软件自动生成生成配置代码,然后我们再在IDE上面codding。
STM32CubeMX特性:
1.直观的选择 STM32 微控制器(MCU)和微处理器(MPU)。
2.丰富易用的图形化界面: -自动解决配置冲突 -具有参数约束动态验证的外设和中间件功能模式 -时钟树与配置的动态验证 -功耗预测
3.生成初始化代码工程,包含:EWARM、 MDK-ARM、 TureSTUDIO、 SW4STM32等。
4.针对部分MPU生成Linux设备树。
5.可独立运行在Windows、Linux和macOS上使用,或作为 Eclipse 插件使用。
配置STM32CUBEMX
打开STM32CUBEMX
在线安装固件库(HAL库),也可以选择离线安装。
找到STM32F103ZET6。点击右上角的生成代码。注意先生成代码,再新建simulink,否则被覆盖了。
后续配置过程,详见:https://blog.csdn.net/woshigaowei5146/article/details/124815449?spm=1001.2014.3001.5502
配置SIMULINK
新建一个model文件(.slx)。注意:.ioc文件和.slx文件应在同一文件夹下。
点设置按钮。
固定步长,即“Fixed-step”,然后修改步长为1/10000,即0.1ms,也可以根据实际情况修改,默认为auto可能会导致程序运行时无法显示出效果。
SIMULINK对STM32F103进行点灯试验
注意:.ioc文件和.slx文件应在同一文件夹下。其他外设的应用可自行百度,资料还挺多。
在库中找到STM32 Config.
选择之前生成的ioc文件。
拖入GPIO_Write.
拖入一个方波发生器。注意周期长一点,要不然肉眼看不出来。
Build成功编译之后。再次打开STM32CUBEMX生成代码,打开MDK。工程文件在MDK-ARM中。打开*.uvprojx。
模型生成的头文件路径(…\STM32\ParaRobot\ParaCompute\Inc)添加到环境配置.
注意要打开最新生成的文件。可以通过文件的时间区分。Simulink的代码更新后,Keil会自动更新代码。如下所示。
在main.c中添加头文件:#include “ParaCompute.h”
在main.c中添加:**.test2_initialize放在while(1)外面, *.step放在while(1)里面。
https://blog.csdn.net/u013288925/article/details/108179302
test2_initialize();/* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */test2_step();/* USER CODE BEGIN 3 */}
#include “test2.h”
#include "demo.h"是为了让main.c文件能够通过demo的头文件访问到demo.c的函数。因为在后面的代码中,main函数中要调用demo_step函数。
test2_initialize()
在while(1)循环之前先调用一下test2_initialize();初始化函数。
test2_step()
simulink的主题函数。
编译过后,就可以通过STLINK下载了。然后重启STM32,可看到LED的闪烁。
一般算法导入到STM32
前面验证了Simulink可以将算法生成.c文件,导入到STM32并可以控制GPIO等外设中。下来验证一般的.m文件算法导入到STM32中。
将原先的.m文件导入SIMULINK中,在库中找到matlab function。
注意:.ioc文件和.slx文件应在同一文件夹下
双击进行函数的编写,并设置输入输出,我这里用的6入6出。输入输出端口用In和Out模块。
SIMULINK的配置步骤如前所述。
生成后,在main函数中添加算法生成的函数。主要有两个:void ParaCompute_step(void)和void ParaCompute_initialize(void)。算法模块在void ParaCompute_step(void)中。
刚开始纠结于生成的void ParaCompute_step(void)没有输入输出参数。想了几种办法去添加输入输出参数,但是都没有奏效。后来看了https://zhuanlan.zhihu.com/p/141454827收到启发,可以直接在函数外部设置参数。【还是C语言基础不行(/ω\)】
在头部添加#include “ParaCompute.h”
在main外部定义输出参数:
double out_1=0;
double out_2=0;
double out_3=0;
double out_4=0;
double out_5=0;
double out_6=0;
在void ParaCompute_step(void)函数中找到输入输出参数结构体,在while(1)循环中添加输入参数的值,并调用void ParaCompute_step(void):
ParaCompute_U.Re_Px=2;
ParaCompute_U.Re_Py=2;
ParaCompute_U.Re_Pz=0;
ParaCompute_U.Re_alpha=0;
ParaCompute_U.Re_beta=0;
ParaCompute_U.Re_gamma=0;ParaCompute_step();out_1=ParaCompute_Y.M_1;
out_2=ParaCompute_Y.M_2;
out_3=ParaCompute_Y.M_3;
out_4=ParaCompute_Y.M_4;
out_5=ParaCompute_Y.M_5;
out_6=ParaCompute_Y.M_6;
最终,通过输入6个参数,得到6个double类型的输出参数。此方法应该可将所有Matlab的算法移植到STM32中。
问题故障解决
The call to stm32_make_rtw_hook, during the before_make hook
generated the …可能是版本匹配的问题(https://www.ilovematlab.cn/thread-490019-1-1.html)
重新下载了mat_target_5.6.0:
https://download.csdn.net/download/weixin_49000276/82623871
- simulink Error: Errors occurred - aborting
系统时钟不能用Systick,而需要指定其他不用的定时器;或者没有拖入STM32 Config.
参考:https://blog.csdn.net/weixin_43465590/article/details/113615711
- 未定义函数或变量
通过试验证明,这个可以不理,只要GPIO能正确配置就行。并不像其他博客所说的版本不匹配,也可能是我正好对了。
- class does not support code generation.
在生成SerialLink类的函数时,遇到问题: class does not support code generation.应该是调用了外部的函数,不支持生成C文件。
将函数放在myWrapper中,但是还是会出现问题:The extrinsic function is not available for standalone code generation.
function [Axis_1, Axis_2, Axis_3, Axis_4, Axis_5] = fcn(Tar_X, Tar_Y, Tar_Z) coder.extrinsic('myWrapper');Axis_1 = zeros(size(1));Axis_2 = zeros(size(1));Axis_3 = zeros(size(1));Axis_4 = zeros(size(1));Axis_5 = zeros(size(1));[Axis_1,Axis_2,Axis_3,Axis_4,Axis_5] = myWrapper(Tar_X,Tar_Y,Tar_Z);
end
参考:
https://stackoverflow.com/questions/49381021/matlab-issue-with-simulink-does-not-support-code-generation
https://ww2.mathworks.cn/matlabcentral/answers/74770-is-there-any-way-to-disable-code-generation-in-simulink
- Function output cannot be an mxArray in this context. Consider preinitializing the output variable with a known type.
添加:Axis_1 = zeros(size(1));
参考:https://ww2.mathworks.cn/matlabcentral/answers/438184-how-to-solve-a-matlab-function-on-simulink-output-cannot-be-an-mxarray-in-this-context
- The extrinsic function is not available for standalone code generation.
验证了只写myWrapper(Tar_X,Tar_Y,Tar_Z);没有输出可以消除这个错误,但是没有达到目的。
Peter Corke Robotics Toolbox只能生成供simulink调用的模块,无法生成代码。
cg = CodeGenerator(myrobot2);
cg.geneverything();
https://ww2.mathworks.cn/matlabcentral/answers/660473-code-generated-blocks-for-seriallink-return-error-index-expression-out-of-bounds-peter-corke-rob
暂时没有找到解决办法,应该是外部函数只适用于模拟,但不适用于代码生成。考虑用Matlab2022版本试一下。哪位大神可以帮忙解决一下。
参考:https://blog.csdn.net/m0_46427461/article/details/124084542
参考
https://blog.csdn.net/weifengdq/article/details/109738385
https://blog.csdn.net/u010411288/article/details/91382302
https://blog.csdn.net/weixin_52071377/article/details/120811795
https://blog.csdn.net/qq_39751352/article/details/105860577
Matlab代码导入STM32F103流程相关推荐
- MATLAB仿真作图的流程与代码结构-经验总结
文章目录 流程简述 代码结构 1.第一部分:加载数据 2.第二部分:仿真计算 3.第三部分:绘图 命名规则 流程简述 在长期编写matlab代码中总结出得经验:通过一个合理的流程来写MATLAB代码, ...
- SDM For Face Alignment 流程介绍及Matlab代码实现之训练篇
SDM 训练阶段的任务如下: 载入标准化的数据(包括400*400的正脸及特征点) 对每一张标准化的图片,模拟人脸检测仪,产生10个扰动的人脸框及相应的初始特征点x0x_0. 求解Δx\Delta x ...
- SDM For Face Alignment 流程介绍及Matlab代码实现之预处理篇
SDM全称为 Supervised Descent Method,是一种机器学习的方法,可以被用来做Face Alignment. 下面我们将通过matlab代码来梳理整个实现的过程. 预处理阶段 I ...
- matlab怎么导入数据格式,matlab导入excel表格数据代码,如何将excel中数据导入到matlab中...
如何将excel中数据导入到matlab中 Matlab如何导入excel数据的如下: 1.一xlsread()函数,import简单的多,具句: A = xlsread('yourfilename. ...
- matlab sdm,SDM For Face Alignment 流程介绍及Matlab代码实现之预处理篇
SDM全称为 Supervised Descent Method,是一种机器学习的方法,可以被用来做Face Alignment. 下面我们将通过matlab代码来梳理整个实现的过程. 预处理阶段 I ...
- 孔雀优化算法(POA)——(含MATLAB代码)
先要声明的是,这个算法的争议较大,评论是两边倒的,一些学者觉得是一锅乱炖,我个人不发表观点,这里只是把这个算法介绍一下.我不推荐它,也不反对大家去了解,只做单纯的讲解.觉得这个算法不行的就不看吧~ 孔 ...
- 哈里斯鹰优化(HHO)算法(含MATLAB代码)
先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论.我会不定期在公众号里分享不同的智能优化算法,经典的,或者是近几年提出 ...
- 浣熊优化算法(COA)(含MATLAB代码)
先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论.我会不定期在公众号里分享不同的智能优化算法,经典的,或者是近几年提出 ...
- 白鲸优化(BWO)算法(含MATLAB代码)
先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论. 原文在这里:点一下 白鲸优化(BWO)算法: 白鲸优化(Belug ...
最新文章
- ​​​​​​​CV:利用cv2(加载人脸识别xml文件及detectMultiScale函数得到人脸列表)+keras的load_model(加载表情hdf5、性别hdf5)并标注
- mysql 结果保存到文件_将MySQL中sql运行结果保存到文件
- 程序员不可能实现的6个愿望
- 机器人动力学知识参考资料
- php 弹出下载,php文件下载,不弹出下载框怎么破
- 小白菜飘过计算机三级数据库
- 声纹识别之Alize入门教程(三):I-vector
- 打造前端 Deepin Linux 工作环境——安装 nodejs 环境,git 版本管理
- PaddleOCR 图片文字提取
- 小米12S和红米K50至尊版哪个好
- [计算机数值分析]直线拟合的最小二乘法
- java hdms_网盘预研 - ZICK_ZEON的个人空间 - OSCHINA - 中文开源技术交流社区
- Emun 枚举类型使用浅析——包括enumSet enumMap
- XStream的使用方法
- 从实际性能剖析,为什么MEMS激光雷达才是未来主流?
- 陆金所—稳盈-e享统计-python爬虫
- c语言来自不兼容指针类型的分配,c - 为什么我会收到“警告:来自不兼容指针类型的分配”? 结构数组中的双链表 - 堆栈内存溢出...
- WPS如何双面打印文件呢
- 数据结构-线索化二叉树
- 自制Wi-Fi无线信号放大器(罐形)全教程