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

使用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.mfbz.cn/a/602827.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python菜鸟级安装手册-上篇

python安装教程 电脑-右键-属性&#xff0c;确认系统类型和版本号&#xff0c;比如本案例系统是64位 win10 点击python官网&#xff0c;进行下载 适用于 Windows 的 Python 版本 |Python.org 选择第一个安装程序64位即可满足需要&#xff0c; 嵌入式程序包是压缩包版本&…

MySQL中的ON DUPLICATE KEY UPDATE和REPLACE

在 MySQL 中&#xff0c;ON DUPLICATE KEY UPDATE 和 REPLACE 语句都可以用来处理插入数据时主键或唯一键冲突的情况&#xff0c;但它们在处理冲突的方式上有所不同。它们有以下区别&#xff1a; 行为方式&#xff1a; ON DUPLICATE KEY UPDATE&#xff1a;当插入的数据行存在冲…

【竞技宝】欧冠:多特淘汰大巴黎进决赛,姆巴佩迷失

多特蒙德在本赛季欧冠半决赛第二回合较量中,跟大巴黎队狭路相逢。赛前,大部分球迷和媒体都看好坐拥姆巴佩的大巴黎队,可以靠着主场作战的优势,逆转多特蒙德晋级欧冠决赛。大巴黎队主场作战确实创造出不少得分机会,只可惜球队运气有些差,射门都打在了多特蒙德横梁上。反观多特蒙…

双翻斗雨量计学习

双翻斗雨量计用户手册&#xff08;脉冲型&#xff09; 本仪器由雨量计壳体、承雨口、漏斗、翻斗支撑、上漏斗雨量调节支架、上漏斗、汇集漏斗、计数翻斗雨量调节支架、计数翻斗、干簧管安装架、轴承螺钉、出水漏斗、腿部支架、干簧管、水平泡、调节支撑板、控制盒、调平装置、接…

IaC实战指南:DevOps的自动化基石

基础设施即代码&#xff08;Infrastructure as Code&#xff0c;IaC&#xff09;是指利用脚本、配置或编程语言创建和维护基础设施的一组实践和流程。通过IaC&#xff0c;我们可以轻松测试各个组件、实现所需的功能并在最小化停机时间的前提下进行扩展。更值得一提的是&#xf…

算法基础01一快速排序,归并排序,二分

一.排序 1.快速 排序 基于分治 确定分界点 左 右 中间 随机划分区间 左半边<x >x在右半边递归处理左右两端 #include<iostream>using namespace std;const int N 1e6 10;int n; int q[N]; void quick_sort(int q[],int l,int r) {if(l>r)return;//边界&…

k8s 资源文件参数介绍

Kubernetes资源文件yaml参数介绍 yaml 介绍 yaml 是一个类似 XML、JSON 的标记性语言。它强调以数据为中心&#xff0c;并不是以标识语言为重点例如 SpringBoot 的配置文件 application.yml 也是一个 yaml 格式的文件 语法格式 通过缩进表示层级关系不能使用tab进行缩进&am…

怎么快速分享视频文件?用二维码看视频的方法

怎样不通过传输下载分享视频内容呢&#xff1f;以前分享视频内容&#xff0c;大多会通过微信、QQ、邮箱、网盘等形式来传递。但是这种方式需要下载后才可以观看&#xff0c;不仅占用手机内存&#xff0c;而且效率也比较低&#xff0c;所以现在很多人会采用视频生成二维码的方式…

Could not resolve placeholder ‘xx.xxx.host’ in value “xxx“问题解决

Could not resolve placeholder ‘xx.xxx.host’ in value "xxx"问题解决 众多原因其中之一 springboot 项目&#xff0c;idea 配置apollo 时&#xff0c;运行指定了配置文件 uat 所以使用本地配置文件启动 时&#xff0c;一直去找uat 配置文件&#xff0c;结果自…

树莓派4b测量光照强度

1.BH1750光照强度连接图 2. BH1750工作原理 BH1750的通讯过程 第1步:发送上电命令。 发送的过程和第2步基本一致,把测量命令(0x10)改成上电命令(0x01)。第2步:发送测量命令。 下面图片上的例子,ADDR引脚是接GND的,发送的测量命令是“连续高分辨率测量(0x10)”。 发送数据…

Android11 InputReader分析

InputReader线程主要负责读取输入数据&#xff0c;并把数据交给InputDispatcher线程。本文以多指触摸屏为例&#xff0c;梳理一下InputReader的流程。 InputReader线程主要完成以下工作&#xff1a; 处理已有的输入设备处理新增或者移除的输入设备对输入设备产生的输入数据进行…

【数据结构与算法】力扣 226. 翻转二叉树

题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a; root [4,2,7,1,3,6,9] 输出&#xff1a; [4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a; root [2,1,3] 输出&#xff1a; [2,3,1…

【算法刷题 | 贪心算法09】4.30(单调递增的数字)

文章目录 16.单调递增的数字16.1题目16.2解法&#xff1a;贪心16.2.1贪心思路16.2.2代码实现 16.单调递增的数字 16.1题目 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的…

项目1:STM32+DHT11+FreeRTOS+emwin+LCD

【屏幕显示DHT11数据】 面向对象的思想编写硬件驱动程序&#xff0c;DHT11采集环境中的温湿度数据。使用FreeRTOS提供的任务间通信、同步、互斥&#xff0c;将DHT11的数据传递给显示任务。显示任务中&#xff0c;使用emWin中间件&#xff0c;制作屏幕的各种界面&#xff0c;并将…

程序员必备的8款工具软件,第5款简直绝了!

没错&#xff0c;今天又送福利了&#xff01;来给大家推荐一波好用的软件~ 都说程序员的电脑上有各种各样的软件工具、编辑器、插件等等&#xff0c;不同岗位的程序员使用的工具也不同。 今天就给你分享8款程序员必备的工具软件&#xff0c;看看是不是你常用的&#xff01; …

【最经典的79个】软件测试面试题(内含答案)备战“金三银四”

001.软件的生命周期(prdctrm) 计划阶段(planning)-〉需求分析(requirement)-〉设计阶段(design)-〉编码(coding)->测试(testing)->运行与维护(running maintrnacne) 测试用例 用例编号 测试项目 测试标题 重要级别 预置条件 输入数据 执行步骤 预期结果 0002.问&…

锂电池管理芯片厂商拓品微电子授权世强硬创代理,产品涵盖充电/升压等系列

为进一步扩大自身品牌在国内的知名度&#xff0c;给更多硬科技企业提供锂电池管理芯片产品&#xff0c;南京拓品微电子有限公司&#xff08;下称“拓品微电子”&#xff0c;英文名&#xff1a;TOP POWER ASIC&#xff09;与拥有超30年历史的分销企业世强先进&#xff08;科技&a…

618热门好物大盘点,省心购物指南快看过来!

在618购物节即将拉开帷幕之际&#xff0c;整个互联网仿佛都弥漫着一种节日的热闹与期待。各大品牌纷纷亮出他们的杀手锏&#xff0c;推出了一系列诱人的优惠活动和特色产品&#xff0c;让人眼花缭乱&#xff0c;心动不已。如果你此刻正犹豫着该把哪一件宝贝收入囊中&#xff0c…

【JavaScript】原型

1. 什么是原型&#xff1f; 在 JavaScript 中&#xff0c;每个对象都有一个原型&#xff08;prototype&#xff09;&#xff0c;它是对象的一种特殊属性。原型对象包含了对象的属性和方法&#xff0c;当我们访问对象的属性或方法时&#xff0c;如果对象本身不存在这些属性或方…

电动车违规停放监测摄像机

随着电动车的普及和城市交通拥堵问题的加剧&#xff0c;电动车的停放管理也成为一个亟待解决的难题。为了维护城市交通秩序和提高停车效率&#xff0c;一种名为电动车违规停放监测摄像机应运而生&#xff0c;成为城市管理的利器。这种电动车违规停放监测摄像机&#xff0c;利用…