当前位置: 首页 > news >正文

使用 Simulink 进行 STM32 编程

目录

介绍
所需材料

  • 步骤 1:在MATLAB中设置STM32-MAT软件路径
  • 步骤 2:在STM32CubeMX中创建一个项目
  • 步骤 3:配置时钟和 GPIO 引脚
  • 步骤 4:项目经理并生成代码
  • 步骤 5:在 Simulink 中创建模型
  • 步骤 6:在模型中插入 STM32_Config 模块
  • 步骤 7:创建模型
  • 步骤 8:编译并生成代码
  • 步骤 9:将代码上传到硬件中

介绍

欢迎读者,在本博客中,我们将逐步介绍使用 Simulink 进行 STM32 编程的过程。在直接进入步骤之前,我们先讨论一下为什么需要使用Simulink对STM32进行编程?STM32采用ARM cortex M架构。由于其较低的成本和良好的性能,它被用于许多应用。使用 Arduino IDE 对 STM32 进行编程非常简单,因为人们开发了许多库。但是,当您开始开发复杂的嵌入式或控制系统时,使用 Arduino IDE 编写裸机代码是一件忙碌的事情。Simulink 的出现使这个过程变得更加容易。您可以使用块开发复杂的系统,并使用 Simulink 功能对其进行测试,然后生成可编译并生成二进制文件的“c”代码,以便该二进制文件可以直接闪存到 STM32 中。现在就完成了,复杂的系统已部署在物理层面。 在本博客中,我们将使用 Simulink 开发模型和嵌入式编码器,以生成同一模型 STM32CubeMX 的“c”代码,用于开发配置文件 (.ioc) 和 Keil 的 MDK-ARM 来构建项目并将其闪存到控制器中。我们将使用 STM32f103c8t6(也称为 Blue Pill)作为目标 MCU。

所需材料

让我们看一下所需的软件和软件包:

来自 MATLAB:

  • MATLAB 编码器(附加组件)

  • Simulink Coder(附加组件)

  • 嵌入式代码(附加)
    来自意法半导体:

  • STM32CubeMX
    用于开发 STM32 应用程序的 STM32-MAT/TARGET 工具包

  • STM32-MAT/TARGET 已从相应网站中删除。

以下任一工具链:

  • STMicroElectronics 的 STM32CubeIDE
  • 来自 Keil 的 MDK-ARM
  • IAR 的 EWARM

所需硬件:

  • STM32F103C8T6(蓝丸)微控制器
  • STLink v2
  • 面包板
  • 4 × 跳线

让我们逐步完成该过程。

  • Step-1:在MATLAB中设置STM32-MAT软件路径
    安装完所有软件和附加组件后,打开 MATLAB,选择“设置路径”选项,然后选择安装 STM32-MAT/TARGET 期间在位置“c:/MATLAB/STM32-MAT/STM”创建的文件夹工具包。

设置STM32-MAT文件的路径

在 MATLAB 中设置 STM32-MAT 文件的路径


选择STM32-MAT软件文件

注意:如果您在上述指定路径中没有找到 STM32 文件夹,请确保 STM32-MAT/TARGET 工具包已正确安装。单击此处下载该实用程序。

  • 步骤2:在STM32CubeMX中创建一个项目
    现在打开 STM32cubeMX 并通过选择“ACCESS TO MCU SELECTOR”创建一个新项目。

在STM32CubeMX中创建一个项目

在MCU/MPU选择器中,输入部件号“STM32F103C8T6”,并在列表中选择“STM32F103C8TX”选项,然后单击开始项目。

选择单片机

步骤 3:配置时钟和 GPIO 引脚
单击开始项目后,您将获得引脚分配视图。现在设置时钟。在系统核心中,选择“ RCC ”选项,然后在“ High-Speed Clock ”部分选择“ Crystal/Ceramic Resonator ”。

将时钟设置为水晶/陶瓷谐振器

现在设置 GPIO。选择“PC13”并将其设置为“GPIO_Output”。


选择 GPIO 并设置为输出

现在,在“系统核心”部分中选择“GPIO”选项,然后选择“GPIO”并选中修改后的复选框。现在更改引脚配置,如下图所示。

修改GPIO配置

第 4 步:项目经理并生成代码
现在打开项目管理器,如图所示编辑详细信息,然后单击生成代码。

关闭单击“代码生成”选项卡后弹出的打开的对话框,然后打开 MATLAB。

步骤 5:在 Simulink 中创建模型
在保存“ blink.ioc ”文件的同一文件夹中创建一个空白模型,如下图所示。

创建空白 Simulink 模型

现在从模拟选项卡打开模型设置并更改求解器部分中的参数,如下图所示。

配置求解器参数

打开“代码生成”选项卡,然后使用浏览选项选择“STM32.tlc”选项作为系统目标文件。现在选择“代码生成”部分下的“STM32 选项”。

更改系统目标文件

选中“STM32CubeMx路径更新”复选框并选择“更新安装路径”选项。现在应用更改并关闭“模型设置”对话框。

更新STM32CubeMX路径

步骤 6:在模型中插入 STM32_Config 模块

现在打开“Library Browser”并选择“STM32_Config”块,将此块添加到模型中。

选择STM32_Config模块

注意:如果您没有找到“Target Support Package – STM32 Adapter”选项,请确保 STM32-MAT/TARGET 工具包已正确安装。单击此处下载并正确安装。

双击“STM32_Config”块,在打开的对话框中选择“选择STM32配置文件”选项。现在选择在步骤 4 中创建的“.ioc”文件。

选择STM32配置文件

第 7 步:创建模型
通过选择并排列相同的块来完成建模,如下图所示。

选择 GPIO 和脉冲发生器模块

以下是脉冲块参数。

脉冲发生器块

Step-8:编译并生成代码
完成建模后,通过选择“建模”选项卡下的“更新模型”选项来编译模型。

编译模型

编译完成后,进入“APPS”部分并选择Embedded Coder。

启动嵌入式编码器应用程序

现在构建项目(可能需要一些时间)。下图第二个框中是Embedded coder生成的代码报告。

构建模型

步骤9:将代码上传到硬件中
代码报告生成后,打开“STM32CubeMx”并选择“生成代码”选项,现在出现一个对话框选项。选择“打开项目”选项。

生成代码

在打开 MDK-Keil IDE 之前,我们先来了解一下硬件。

STM32F103C8T6

STLINK-V2

在将二进制文件写入 STM32 之前,将 STM32 的“Boot0”引脚切换为“HIGH”。如下图所示连接 STM32 和 STLink v2 之间的连接。

STM32与STLink之间的连接

现在打开 MDK-Keil IDE 并构建项目。此后,您将收到“0”错误和“0”警告。现在将模型加载到 STM32 中。您将在控制台中收到“完成加载”消息。

构建项目并将代码加载到STM32中

现在将“Boot0”切换回“LOW”并按下重置按钮,如下图所示。

切换回“boot0”引脚

现在内置 LED 开始闪烁。

结论

“ Simulink ” 和 “ Embedded Coder ”使复杂嵌入式系统和控制系统的原型设计变得更加容易。在将模型的二进制文件部署到硬件中之前,我们可以在 Simulink 中测试系统或模型的错误和性能。

相关文章:

使用 Simulink 进行 STM32 编程

目录 介绍 所需材料 步骤 1:在MATLAB中设置STM32-MAT软件路径步骤 2:在STM32CubeMX中创建一个项目步骤 3:配置时钟和 GPIO 引脚步骤 4:项目经理并生成代码步骤 5:在 Simulink 中创建模型步骤 6:在模型中插…...

走出迷宫的最少步数and第一条出路

题面 题目描述 一个迷宫由 R 行 C 列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走&#xff0c…...

MediaCodec创建对应解码器

媒体编解码API使用示例 //获取相关格式文件的内容信息,如轨道数量、获取MIME信息、视频的高度与宽度、语言格式、播放总时长等 MediaExtractor mediaExtractor new MediaExtractor(); try {mediaExtractor.setDataSource(path); // 设置数据源 } catch (IOExcept…...

使用eXosip+ffmpeg、ffplay命令行实现sip客户端

文章目录 前言一、关键实现1、主要流程2、解决端口冲突(1)、出现原因(2)、解决方法 3、解析sdp(1)、定义实体(2)、解析视频(3)、解析音频 4、命令行推拉流&am…...

dotNet 之网络TCP

**硬件支持型号 点击 查看 硬件支持 详情** DTU701 产品详情 DTU702 产品详情 DTU801 产品详情 DTU802 产品详情 DTU902 产品详情 G5501 产品详情 ARM dotnet 编程 dotNet使用TCP,可以使用Socket和TcpClient 、TcpListener类 2种,对于高级用户&…...

python基础面试题汇总(持续更新),冲击offer

目录 1.概念理解题python内置数据结构,哪些是不可变的python新式类和经典类的区别is和有什么区别Python中变量查找顺序python函数的参数是值传递还是引用传递python垃圾回收机制什么是闭包什么是装饰器,开发中用到举例如何实现只读属性Python中类方法、实…...

Java课题笔记~ AOP编程术语(掌握)

(1) 切面(Aspect) 切面泛指交叉业务逻辑。上例中的事务处理、日志处理就可以理解为切面。常用的切面是通知(Advice)。实际就是对主业务逻辑的一种增强。 (2) 连接点(Jo…...

暑假刷题第23天--8/6

3748. 递增子串 - AcWing题库 #include<iostream> #include<string> const int N200005; int a[N]; using namespace std; int main(){int t;cin>>t;for(int q1;q<t;q){int n;cin>>n;string s;cin>>s;int cnt1;a[1]1;for(int i2;i<n;i){i…...

ArcGIS API for JavaScript 4.x 教程(一) 显示一张地图

了解如何创建和显示带有基本地图图层的地图。 地图包含地理数据层。地图包含一个基本地图层&#xff0c;以及一个或多个数据层&#xff08;可选&#xff09;。可以使用地图视图显示地图的特定区域&#xff0c;并设置位置和缩放级别。 本教程将向您展示如何使用地形底图层创建和…...

Python-OpenCV中的图像处理

Python-OpenCV中的图像处理 颜色空间转换物体跟踪获取HSV的值几何变换图像缩放图像平移图像旋转仿射变换透视变换 图像阈值单阈值自适应阈值Otsus二值化 颜色空间转换 在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会 发现我们经常用到的也就两种&#xff1…...

分清性能测试,负载测试,压力测试这三个的区别

做测试一年多来&#xff0c;虽然平时的工作都能很好的完成&#xff0c;但最近突然发现自己在关于测试的整体知识体系上面的了解很是欠缺&#xff0c;所以&#xff0c;在工作之余也做了一些测试方面的知识的补充。不足之处&#xff0c;还请大家多多交流&#xff0c;互相学习。 …...

前端架构师岗位的工作职责(合集)

前端架构师岗位的工作职责1 职责&#xff1a; 1.制定前端的标准和规范&#xff0c;并推广和应用&#xff0c;提高团队的开发效率; 2.前端架构的框架或核心模块的设计与实现; 3.在前端架构、设计与开发上对团队进行足够的指导; 4.在日常的系统设计与优化上与服务端团队紧密合…...

使用 Amazon ECS Anywhere 在边缘部署 Amazon IoT Greengrass

1.概述 亚马逊云科技提供了完备的IoT服务能力&#xff0c;涵盖设备服务、连接和控制服务以及云端分析服务&#xff0c;是快速构建安全可靠、可扩展的 IoT 平台的常见选择。Amazon IoT Greengrass 边缘运行时和云服务&#xff0c;可帮助您在设备上构建、部署和管理 IoT 应用。A…...

pytorch Stream 多流处理

CUD Stream https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#c-language-extensions 中指出在kenel的调用函数中最后一个可选参数表示该核函数处在哪个流之中。 - 参数Dg用于定义整个grid的维度和尺寸&#xff0c;即一个grid有多少个block。为dim3类型。…...

微信小程序选项卡切换(滑动切换,点击切换)

效果如下&#xff1a;可点击切换&#xff0c;滑动切换 代码如下 这个可以在项目用 index.wxml <view classtopTabSwiper><view classtab {{currentData 0 ? "tabBorer" : ""}} data-current "0" bindtapcheckCurrent>选项一&…...

安路FPGA的赋值报错——移位处理,加括号

authordaisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 在使用移位符号用来当作除以号使用时&#xff0c;发现如下问题 其中 cnt_8K 为偶数和奇数时输出的数据不一样 reg [10:0] cnt_8K; reg [10:0] ram1_addra; always(posedge clk_16M) begin if(ram_out_flag )begin if(…...

GO学习之 接口(Interface)

GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 文章目录 GO系列前言一、什么是…...

ansible常见模块的运用

ansible常见模块的运用 一&#xff1a;Ansible简介二&#xff1a;ansible 环境安装部署管理端安装 ansibleansible 目录结构配置主机清单配置密钥对验证 三&#xff1a;ansible 命令行模块1&#xff0e;command 模块在远程主机执行命令&#xff0c;不支持管道&#xff0c;重定向…...

合宙Air724UG LuatOS-Air script lib API--patch

patch Table of Contents patch patch.safeJsonDecode(s) (local函数 无法被外部调用) patch 模块功能&#xff1a;Lua补丁 patch.safeJsonDecode(s) (local函数 无法被外部调用) 封装自定义的json.decode接口 参数 名称 传入值类型 释义 s string json格式的字符串 返回值 t…...

pytorch求导

pytorch求导的初步认识 requires_grad tensor(data, dtypeNone, deviceNone, requires_gradFalse)requires_grad是torch.tensor类的一个属性。如果设置为True&#xff0c;它会告诉PyTorch跟踪对该张量的操作&#xff0c;允许在反向传播期间计算梯度。 x.requires_grad 判…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

32单片机——基本定时器

STM32F103有众多的定时器&#xff0c;其中包括2个基本定时器&#xff08;TIM6和TIM7&#xff09;、4个通用定时器&#xff08;TIM2~TIM5&#xff09;、2个高级控制定时器&#xff08;TIM1和TIM8&#xff09;&#xff0c;这些定时器彼此完全独立&#xff0c;不共享任何资源 1、定…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...