文章目录

  • 软件准备
  • 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流程相关推荐

  1. MATLAB仿真作图的流程与代码结构-经验总结

    文章目录 流程简述 代码结构 1.第一部分:加载数据 2.第二部分:仿真计算 3.第三部分:绘图 命名规则 流程简述 在长期编写matlab代码中总结出得经验:通过一个合理的流程来写MATLAB代码, ...

  2. SDM For Face Alignment 流程介绍及Matlab代码实现之训练篇

    SDM 训练阶段的任务如下: 载入标准化的数据(包括400*400的正脸及特征点) 对每一张标准化的图片,模拟人脸检测仪,产生10个扰动的人脸框及相应的初始特征点x0x_0. 求解Δx\Delta x ...

  3. SDM For Face Alignment 流程介绍及Matlab代码实现之预处理篇

    SDM全称为 Supervised Descent Method,是一种机器学习的方法,可以被用来做Face Alignment. 下面我们将通过matlab代码来梳理整个实现的过程. 预处理阶段 I ...

  4. matlab怎么导入数据格式,matlab导入excel表格数据代码,如何将excel中数据导入到matlab中...

    如何将excel中数据导入到matlab中 Matlab如何导入excel数据的如下: 1.一xlsread()函数,import简单的多,具句: A = xlsread('yourfilename. ...

  5. matlab sdm,SDM For Face Alignment 流程介绍及Matlab代码实现之预处理篇

    SDM全称为 Supervised Descent Method,是一种机器学习的方法,可以被用来做Face Alignment. 下面我们将通过matlab代码来梳理整个实现的过程. 预处理阶段 I ...

  6. 孔雀优化算法(POA)——(含MATLAB代码)

    先要声明的是,这个算法的争议较大,评论是两边倒的,一些学者觉得是一锅乱炖,我个人不发表观点,这里只是把这个算法介绍一下.我不推荐它,也不反对大家去了解,只做单纯的讲解.觉得这个算法不行的就不看吧~ 孔 ...

  7. 哈里斯鹰优化(HHO)算法(含MATLAB代码)

    先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论.我会不定期在公众号里分享不同的智能优化算法,经典的,或者是近几年提出 ...

  8. 浣熊优化算法(COA)(含MATLAB代码)

    先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论.我会不定期在公众号里分享不同的智能优化算法,经典的,或者是近几年提出 ...

  9. 白鲸优化(BWO)算法(含MATLAB代码)

    先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论. 原文在这里:点一下 白鲸优化(BWO)算法: 白鲸优化(Belug ...

最新文章

  1. ​​​​​​​CV:利用cv2(加载人脸识别xml文件及detectMultiScale函数得到人脸列表)+keras的load_model(加载表情hdf5、性别hdf5)并标注
  2. mysql 结果保存到文件_将MySQL中sql运行结果保存到文件
  3. 程序员不可能实现的6个愿望
  4. 机器人动力学知识参考资料
  5. php 弹出下载,php文件下载,不弹出下载框怎么破
  6. 小白菜飘过计算机三级数据库
  7. 声纹识别之Alize入门教程(三):I-vector
  8. 打造前端 Deepin Linux 工作环境——安装 nodejs 环境,git 版本管理
  9. PaddleOCR 图片文字提取
  10. 小米12S和红米K50至尊版哪个好
  11. [计算机数值分析]直线拟合的最小二乘法
  12. java hdms_网盘预研 - ZICK_ZEON的个人空间 - OSCHINA - 中文开源技术交流社区
  13. Emun 枚举类型使用浅析——包括enumSet enumMap
  14. XStream的使用方法
  15. 从实际性能剖析,为什么MEMS激光雷达才是未来主流?
  16. 陆金所—稳盈-e享统计-python爬虫
  17. c语言来自不兼容指针类型的分配,c - 为什么我会收到“警告:来自不兼容指针类型的分配”? 结构数组中的双链表 - 堆栈内存溢出...
  18. WPS如何双面打印文件呢
  19. 数据结构-线索化二叉树
  20. 自制Wi-Fi无线信号放大器(罐形)全教程

热门文章

  1. 视图实现圆角效果的三种方法及比较
  2. PYTHON表白代码:还有半个月就要圣诞啦~初雪要来了么?心软的神还会远吗(不知道怎么开口表白的小可爱还不赶紧把素材备好)
  3. IPTABLES常规操作规则与放行
  4. 安装好UTAU后没法使用
  5. 波澜哥utau音源下载
  6. 非官方即时通信 IM,支持腾讯IM,环信IM,极光IM,融云IM,网易云信IM等
  7. STM32输出PWM信号(库函数版本)
  8. 最新Cfree5.0免费版下载
  9. 太阳高度角计算题_太阳高度角的计算问题
  10. windows8.1版本遇到安装wireshark报错KB2999226补丁的解决方案