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

news2025/1/10 15:15:36

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

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

一、STM32CubeMX新建工程

1. 打开 STM32CubeMX 软件,点击“新建工程”,选择中对应的型号
在这里插入图片描述

2. RCC 设置,选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)
开启 LSE(外部低速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)
在这里插入图片描述

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

SYS 设置,选择 Debug 为 Serial Wire
在这里插入图片描述

4.配置所需要的输入和输出引脚
根据电路板硬件的实际情况配置LED灯引脚
在这里插入图片描述

5.选择时钟
HCLK (MHz)输入框中,改为频率为 72MHz,自动计算时钟分配。
在这里插入图片描述

6.工程文件的输出
输入项目名和项目路径和选择应用的 IDE 开发环境 MDK-ARM V5
在这里插入图片描述

7.工程文件代码生成
每个外设生成独立的 ’.c/.h’ 文件
不勾:所有初始化代码都生成在 main.c
勾选:初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。
在这里插入图片描述

8.点击 GENERATE CODE 生成代码
在这里插入图片描述

9.打开MDK-ARM V5 进行编译,无错误 无警告
在这里插入图片描述

二、Simulink 新建工程

打开MATLAB 的 Simulink (动态系统和嵌入式系统的多领域模拟和基于模型的设计工具)
在这里插入图片描述

在Simulink 新建 空白模型
在这里插入图片描述

similink库中的Stateflow下拉框选择“Chart”,拖到右侧空白框中。改名为“LED_STate”。
在这里插入图片描述

双击“Chart”进入里面的内容,拖动“状态”组件。后续作为状态转移。
在这里插入图片描述

在状态框中写入如下代码并状态与状态之间相连
在这里插入图片描述
after:after函数函数就是经过多长时间再到下一个状态,相当于延时

通过“建模”下的“符号窗格” 看到三个名称的状态有感叹是提示没有定义。
在这里插入图片描述

通过单击每个符号名称的类型进行修改,led_output 改为“Output Data”。
在这里插入图片描述

也可以通过选择符号名称右键-> 检查
在这里插入图片描述

属性检查器可查看属性信息
在这里插入图片描述

led_output 类型改为“uint8”
在这里插入图片描述

其他两个符号 改为“Parameter Data”类型。
在这里插入图片描述

类型设置完成后 无感叹号提示。
在这里插入图片描述

以上操作也可以通过汇总的方式查看,通过模块资源管理器。
在这里插入图片描述

“HIGH”和“ LOW”两个符号的Value值改成 “1”和“0”
在这里插入图片描述

返回上一层“Chart”。
在这里插入图片描述

在模型界面上单击输入“Output”。
在这里插入图片描述

修改Output信号名称为“LEDOutput”。
在这里插入图片描述

更新我们所设计的模型
在这里插入图片描述

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

在APP下的标签“Embedded oder”生成程序代码。
在这里插入图片描述

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

配置参数修改三个地方如下图所示。
在这里插入图片描述

修改完成后,继续点击“编译”。
在这里插入图片描述

可以看到右侧已经生成代码文件
在这里插入图片描述

生成的代码 .c和.h 保存路径如下图的提示。
在这里插入图片描述

三、MDK导入生成的代码

在Groups增加新的文件夹,名称为SimulinkCode
在这里插入图片描述

在Files项目下“Add Files…”导入Simulink生成的.c文件
在这里插入图片描述

增加.h头文件的引用路径
在这里插入图片描述

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

untitled_step()函数是我们Simulink生成的状态机,需要在main.c中while循环添加。
在这里插入图片描述

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

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

在Simulink中的代码接口下的“默认代码映射”,下方就会弹出代码映射窗口。
在这里插入图片描述

单击“LEDOutpu”组件后在码映射窗口下选择“Outports”,有一个“Output”选项。
在这里插入图片描述

右侧弹出“属性检查器”在Storage Class字符下,下拉框选择“ExportedGlobal”。
在这里插入图片描述

可以看到Simulink代码显示窗口 的LEDoutput原结构体的形式改为全局变量。
在这里插入图片描述

修改代码,编译通过
在这里插入图片描述

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: '<Root>/LED_STate' */
#define untitled_IN_LED_OFF            ((uint8_T)1U)
#define untitled_IN_LED_ON             ((uint8_T)2U)

/* Exported block signals */
uint8_T LEDOutput;                     /* '<Root>/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: '<Root>/LED_STate' */
  if (untitled_DW.temporalCounter_i1 < 511U) {
    untitled_DW.temporalCounter_i1++;
  }

  if (untitled_DW.is_active_c3_untitled == 0U) {
    untitled_DW.is_active_c3_untitled = 1U;
    untitled_DW.is_c3_untitled = untitled_IN_LED_ON;
    untitled_DW.temporalCounter_i1 = 0U;

    /* Outport: '<Root>/Output' */
    LEDOutput = 0U;
  } else if (untitled_DW.is_c3_untitled == untitled_IN_LED_OFF) {
    /* Outport: '<Root>/Output' */
    LEDOutput = 1U;
    if (untitled_DW.temporalCounter_i1 >= 500U) {
      untitled_DW.is_c3_untitled = untitled_IN_LED_ON;
      untitled_DW.temporalCounter_i1 = 0U;

      /* Outport: '<Root>/Output' */
      LEDOutput = 0U;
    }
  } else {
    /* Outport: '<Root>/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: '<Root>/Output' */
      LEDOutput = 1U;
    }
  }

  /* End of Chart: '<Root>/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]
 */

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1643069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单链表式并查集

如果用暴力算法的话&#xff0c;那么会直接超时&#xff0c;我们要学会用并查集去记录下一个空闲的位置 #include<bits/stdc.h> using namespace std;const int N 100005;int n; int fa[N]; int a[N];int find(int x) {if (fa[x] x) {return x;}fa[x] find(fa[x]);re…

ChatGPT DALL-E绘图,制作各种表情包,实现穿衣风格的自由切换

DALL-E绘图功能探索&#xff1a; 1、保持人物形象一致&#xff0c;适配更多的表情、动作 2、改变穿衣风格 3、小女孩的不同年龄段展示 4、不同社交平台的个性头像创作 如果不会写代码&#xff0c;可以问GPT。使用地址&#xff1a;我的GPT4 视频&#xff0c;B站会发&#…

Leetcode—422. 有效的单词方块【简单】Plus

2024每日刷题&#xff08;126&#xff09; Leetcode—422. 有效的单词方块 实现代码 class Solution { public:bool validWordSquare(vector<string>& words) {int row words.size();for(int i 0; i < row; i) {// 当前这一行的列数int col words[i].length(…

网络基础-网络设备介绍

本系列文章主要介绍思科、华为、华三三大厂商的网络设备 网络设备 网络设备是指用于构建和管理计算机网络的各种硬件设备和设备组件。以下是常见的网络设备类型&#xff1a; 路由器&#xff08;Router&#xff09;&#xff1a;用于连接不同网络并在它们之间转发数据包的设备…

k8s调度原理以及自定义调度器

kube-scheduler 是 kubernetes 的核心组件之一&#xff0c;主要负责整个集群资源的调度功能&#xff0c;根据特定的调度算法和策略&#xff0c;将 Pod 调度到最优的工作节点上面去&#xff0c;从而更加合理、更加充分的利用集群的资源&#xff0c;这也是我们选择使用 kubernete…

「Node.js」ESModule 与 CommonJS 的 区别

前言 Node.js支持两种模块系统&#xff1a;CommonJS 和 ESModules&#xff08;ESM&#xff09;&#xff0c;它们在语法和功能上有一些不同。 CommonJS (CJS) CommonJS 是 Node.js 最早支持的模块规范&#xff0c;由于它的出现在ES6之前&#xff0c;因此采取的是同步加载模块…

Linux Ubuntu 开机自启动浏览器

终端输入命令&#xff1a;gnome-session-properties 打开启动设置 如果提示&#xff1a;Command ‘gnome-session-properties’ not found, but can be installed with: apt install gnome-startup-applications 则执行&#xff1a;apt install gnome-startup-applications安装…

用pyecharts完成综合案例之全球GDP动态可视化统计图

综合案例之全球GDP 所用csv文档下载链接如下&#xff1a;https://download.csdn.net/download/qq_42707739/12621102?ops_request_misc%257B%2522request%255Fid%2522%253A%2522171488482816800184124883%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fdownloa…

机器学习周报第40周

目录 摘要Abstract一、文献阅读1.1 摘要1.2 论文背景1.3 论文模型1.3.1 模型概述1.3.2 模型细节 1.4 模型精度 二、论文代码2.1 rtdetr.py2.2 backbone模块2.3 AIFI2.4 CCFM 总结 摘要 本周&#xff0c;我深入研读了RT-DETR&#xff08;实时目标检测变换器&#xff09;论文&am…

【数据结构】初识数据结构

引入&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我…

中仕公考:哪些情况不能考公务员?

1.年龄不符合 主要分两类【一类是未成年人&#xff0c;另一类是超龄人员】 具体来讲:年龄一般为18周岁以上、35周岁以下 (2024国考标准是1987年10月至2005年10月期间出生&#xff09; 对于2024年应届硕士、博士研究生(非在职人员)放宽到40周岁以下(2024国考标准是1982年10月以后…

【Conda】解决使用清华源创建虚拟环境不成功问题

文章目录 问题描述&#xff1a;清华源创建不成功解决步骤1 添加官方源步骤2 删除C:/user/你的用户名/的 .condarc 文件步骤3 再次创建 问题描述&#xff1a;清华源创建不成功 本地配置了清华源&#xff0c;但是在创建虚拟环境时不成功&#xff0c;报错如下。 图片若看不清&…

Docker使用进阶篇

文章目录 1 前言2 使用Docker安装常用镜像示例2.1 Docker安装RabbitMQ2.2 Docker安装Nacos2.3 Docker安装xxl-job&#xff08;推荐该方式构建&#xff09;2.4 Docker安装redis2.5 Docker安装mysql 1 前言 上一篇介绍了Docker的基础概念&#xff0c;带你 入门Docker&#xff0c…

初识webpack项目

新建一个空的工程 -> % mkdir webpack-project 为了方便追踪执行每一个命令&#xff0c;最终产生了哪些变更&#xff0c;将这个空工程初始化成git项目 -> % cd webpack-project/-> % git init Initialized empty Git repository in /Users/lixiang/frontworkspace/…

STM32微秒级别延时--F407--TIM1

基本配置&#xff1a; TIM1挂载在APB2总线上&#xff0c;150MHz经过15分频&#xff0c;得到10MHz计数频率&#xff0c;由于disable了自动重装载&#xff0c;所以只需要看下一次计数值是多少即可。 void TIM1_Delay_us(uint16_t us) //使用阻塞方式进行延时&#xff0c;ARR值不…

Colibri for Mac v2.2.0激活版:专业级无损音乐播放器

Colibri for Mac是一款专为Mac用户设计的高分辨率无损音乐播放器。它基于BASS技术构建&#xff0c;为用户带来极致的音频体验。Colibri支持所有流行的无损和有损音频格式&#xff0c;如FLAC、MP3、AAC等&#xff0c;确保音乐播放的清晰度和完美度。其独特的清晰比特完美播放技术…

hadoop学习---基于Hive的教育平台数据仓库分析案例(一)

案例背景&#xff1a; 大数据技术的应用可以从海量的用户行为数据中进行挖掘分析&#xff0c;根据分析结果优化平台的服务质量&#xff0c;最终满足用户的需求。教育大数据分析平台项目就是将大数据技术应用于教育培训领域&#xff0c;为企业经营提供数据支撑。 案例数据产生流…

华为鸿蒙系统(Huawei HarmonyOS)

华为鸿蒙系统&#xff08;华为技术有限公司开发的分布式操作系统&#xff09; 华为鸿蒙系统&#xff08;HUAWEI HarmonyOS&#xff09;&#xff0c;是华为公司在2019年8月9日于东莞举行的华为开发者大会&#xff08;HDC.2019&#xff09;上正式发布的分布式操作系统。 华为鸿蒙…

贪心-耍杂技的牛

问题描述 农民约翰的 N头奶牛&#xff08;编号为 1…N&#xff09;计划逃跑并加入马戏团&#xff0c;为此它们决定练习表演杂技。 奶牛们不是非常有创意&#xff0c;只提出了一个杂技表演&#xff1a; 叠罗汉&#xff0c;表演时&#xff0c;奶牛们站在彼此的身上&#xff0c;形…