使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南

马肤

温馨提示:这篇文章已超过439天没有更新,请注意相关的内容是否还可用!

摘要:通过MATLAB和Simulink环境,实现对STM32开发板上LED灯的点亮。利用MATLAB的编程能力,编写控制代码,并通过Simulink进行模型构建和仿真测试。最终将控制信号传输至STM32开发板,成功控制LED灯的亮灭。这一过程展示了MATLAB/Simulink在嵌入式系统开发中的强大功能和应用潜力。

使用MATLAB/Simulink点亮STM32开发板LED灯-笔记

  • 一、STM32CubeMX新建工程
  • 二、Simulink 新建工程
  • 三、MDK导入生成的代码

    一、STM32CubeMX新建工程

    1. 打开 STM32CubeMX 软件,点击“新建工程”,选择中对应的型号

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第1张

    2. RCC 设置,选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)

    开启 LSE(外部低速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第2张

    3. 配置调试模式

    非常重要的一步,否则会造成第一次烧录程序后续无法识别调试器

    SYS 设置,选择 Debug 为 Serial Wire

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第3张

    4.配置所需要的输入和输出引脚

    根据电路板硬件的实际情况配置LED灯引脚

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第4张

    5.选择时钟

    在 HCLK (MHz)输入框中,改为频率为 72MHz,自动计算时钟分配。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第5张

    6.工程文件的输出

    输入项目名和项目路径和选择应用的 IDE 开发环境 MDK-ARM V5

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第6张

    7.工程文件代码生成

    每个外设生成独立的 ’.c/.h’ 文件

    不勾:所有初始化代码都生成在 main.c

    勾选:初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第7张

    8.点击 GENERATE CODE 生成代码

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第8张

    9.打开MDK-ARM V5 进行编译,无错误 无警告

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第9张

    二、Simulink 新建工程

    打开MATLAB 的 Simulink (动态系统和嵌入式系统的多领域模拟和基于模型的设计工具)

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第10张

    在Simulink 新建 空白模型

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第11张

    similink库中的Stateflow下拉框选择“Chart”,拖到右侧空白框中。改名为“LED_STate”。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第12张

    双击“Chart”进入里面的内容,拖动“状态”组件。后续作为状态转移。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第13张

    在状态框中写入如下代码并状态与状态之间相连

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第14张

    after:after函数函数就是经过多长时间再到下一个状态,相当于延时

    通过“建模”下的“符号窗格” 看到三个名称的状态有感叹是提示没有定义。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第15张

    通过单击每个符号名称的类型进行修改,led_output 改为“Output Data”。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第16张

    也可以通过选择符号名称右键-> 检查

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第17张

    属性检查器可查看属性信息

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第18张

    led_output 类型改为“uint8”

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第19张

    其他两个符号 改为“Parameter Data”类型。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第20张

    类型设置完成后 无感叹号提示。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第21张

    以上操作也可以通过汇总的方式查看,通过模块资源管理器。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第22张

    “HIGH”和“ LOW”两个符号的Value值改成 “1”和“0”

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第23张

    返回上一层“Chart”。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第24张

    在模型界面上单击输入“Output”。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第25张

    修改Output信号名称为“LEDOutput”。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第26张

    更新我们所设计的模型

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第27张

    为了方便观察和所设计的模型是否正常,在LED_STate增加“Scope”示波器,可以看到示波器正常输出高低电平。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第28张

    在APP下的标签“Embedded oder”生成程序代码。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第29张

    从下图中可以看出 编译不通过,下方有“建议的操作”,选择第一项弹出配置参数。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第30张

    配置参数修改三个地方如下图所示。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第31张

    修改完成后,继续点击“编译”。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第32张

    可以看到右侧已经生成代码文件

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第33张

    生成的代码 .c和.h 保存路径如下图的提示。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第34张

    三、MDK导入生成的代码

    在Groups增加新的文件夹,名称为SimulinkCode

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第35张

    在Files项目下“Add Files…”导入Simulink生成的.c文件

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第36张

    增加.h头文件的引用路径

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第37张

    首先这个模型生成的初始化“untitled_initialize”是空的,我们可以不调用,但是后面如果模型比较大了,或者说初始化函数中有文件的话,这个是必须要调。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第38张

    untitled_step()函数是我们Simulink生成的状态机,需要在main.c中while循环添加。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第39张

    我们现在这个untitled_step()函数是在while中一直跑的,这样是没有固定的运行周期的。但是我们在模型仿真的时候,定步长是固定,0.001的采样时间。所以我们需要给他一个周期。在中断文件下添加“BalancecarTaskcount”变量来计数。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第40张

    接下来我们看看这个,控制LED亮灭调用stm32函数的“HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET);”直接给“1”或“0”就行,但是下面如图所示,这里是结构不方便使用,需要改成一个全局变量。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第41张

    在Simulink中的代码接口下的“默认代码映射”,下方就会弹出代码映射窗口。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第42张

    单击“LEDOutpu”组件后在码映射窗口下选择“Outports”,有一个“Output”选项。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第43张

    右侧弹出“属性检查器”在Storage Class字符下,下拉框选择“ExportedGlobal”。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第44张

    可以看到Simulink代码显示窗口 的LEDoutput原结构体的形式改为全局变量。

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第45张

    修改代码,编译通过

    使用MATLAB/Simulink点亮STM32开发板LED灯,MATLAB/Simulink与STM32开发板LED灯点亮实战指南 第46张

    untitled.c

    /*
     * Academic License - for use in teaching, academic research, and meeting
     * course requirements at degree granting institutions only.  Not for
     * government, commercial, or other organizational use.
     *
     * File: untitled.c
     *
     * Code generated for Simulink model 'untitled'.
     *
     * Model version                  : 1.2
     * Simulink Coder version         : 9.8 (R2022b) 13-May-2022
     * C/C++ source code generated on : Fri May  3 15:00:42 2024
     *
     * Target selection: ert.tlc
     * Embedded hardware selection: Intel->x86-64 (Windows64)
     * Code generation objectives: Unspecified
     * Validation result: Not run
     */
    #include "untitled.h"
    #include "rtwtypes.h"
    /* Named constants for Chart: '/LED_STate' */
    #define untitled_IN_LED_OFF            ((uint8_T)1U)
    #define untitled_IN_LED_ON             ((uint8_T)2U)
    /* Exported block signals */
    uint8_T LEDOutput;                     /* '/Output' */
    /* Block states (default storage) */
    DW_untitled_T untitled_DW;
    /* Real-time model */
    static RT_MODEL_untitled_T untitled_M_;
    RT_MODEL_untitled_T *const untitled_M = &untitled_M_;
    /* Model step function */
    void untitled_step(void)
    {
      /* Chart: '/LED_STate' */
      if (untitled_DW.temporalCounter_i1 = 500U) {
          untitled_DW.is_c3_untitled = untitled_IN_LED_ON;
          untitled_DW.temporalCounter_i1 = 0U;
          /* Outport: '/Output' */
          LEDOutput = 0U;
        }
      } else {
        /* Outport: '/Output' */
        /* case IN_LED_ON: */
        LEDOutput = 0U;
        if (untitled_DW.temporalCounter_i1 >= 500U) {
          untitled_DW.is_c3_untitled = untitled_IN_LED_OFF;
          untitled_DW.temporalCounter_i1 = 0U;
          /* Outport: '/Output' */
          LEDOutput = 1U;
        }
      }
      /* End of Chart: '/LED_STate' */
    }
    /* Model initialize function */
    void untitled_initialize(void)
    {
      /* (no initialization code required) */
    }
    /* Model terminate function */
    void untitled_terminate(void)
    {
      /* (no terminate code required) */
    }
    /*
     * File trailer for generated code.
     *
     * [EOF]
     */
    

0
收藏0
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

  • 【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法,Matlab/Simulink自动生成代码的五种选择结构实现方法(二),Matlab/Simulink自动生成代码的五种选择结构实现方法详解(二)
  • 超级好用的C++实用库之跨平台实用方法,跨平台实用方法的C++实用库超好用指南,C++跨平台实用库使用指南,超好用实用方法集合,C++跨平台实用库超好用指南,方法与技巧集合
  • 【动态规划】斐波那契数列模型(C++),斐波那契数列模型(C++实现与动态规划解析),斐波那契数列模型解析与C++实现(动态规划)
  • 【C++】,string类底层的模拟实现,C++中string类的模拟底层实现探究
  • uniapp 小程序实现微信授权登录(前端和后端),Uniapp小程序实现微信授权登录全流程(前端后端全攻略),Uniapp小程序微信授权登录全流程攻略,前端后端全指南
  • Vue脚手架的安装(保姆级教程),Vue脚手架保姆级安装教程,Vue脚手架保姆级安装指南,Vue脚手架保姆级安装指南,从零开始教你如何安装Vue脚手架
  • 如何在树莓派 Raspberry Pi中本地部署一个web站点并实现无公网IP远程访问,树莓派上本地部署Web站点及无公网IP远程访问指南,树莓派部署Web站点及无公网IP远程访问指南,本地部署与远程访问实践,树莓派部署Web站点及无公网IP远程访问实践指南,树莓派部署Web站点及无公网IP远程访问实践指南,本地部署与远程访问详解,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南。
  • vue2技术栈实现AI问答机器人功能(流式与非流式两种接口方法),Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法探究,Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法详解
  • 发表评论

    快捷回复:表情:
    评论列表 (暂无评论,0人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码