【Clion/keil+CubeMX+simulink模型化开发STM32】(一)创建项目工程-点亮led

前言

随着嵌入式行业发展,单片机的开发从汇编到c语言,从寄存器到库函数,开发门槛越来越低,效率越来越高。stm32的开发方式也有很大的变化,从一开始的纯代码构建项目工程,到现在结合GUI的cubemx自动生成寄存器配置等代码,stm32的开发方式越来越脱离手写代码,好处也很明显,通过GUI的方式可以快速上手开发,同时自动生成的代码不易出错,开发者只需要专注应用层代码,无需关注底层寄存器。
本文讲述的是一种更加抽象化的开发方式,即使用simulink搭建应用层模型,并生成应用层代码,再结合cubemx生成驱动层代码完成整个项目的开发。使用该开发方式,将底层与应用层分隔开,应用层代码不必在意底层驱动,大大提高了项目的移植性和可复用性,同时利用simulink搭建模型可以更加方便地仿真与调试。

st公司以前提供过一个matlab的插件,通过该插件,可以通过simulink直接驱动底层
不过该插件早已不在维护且官网也已停产,无法在官网下载,所以不会将重点放在该插件上。
本文主要讲解的是模型化开发的思想以及如何开发,该插件只是作为辅助,有这个插件只是能让你方便一点,建议大家不要太依赖该插件

准备

一、Clion嵌入式开发环境/keil mdk
二、cubemx
三、matlab 2023b:我这里使用的是2023b,建议大家至少选择2022a,主要是以前的版本,UI界面和我的不一样,且没有中文,不方便大家学习
四、(选装 插件)stm32 matlab target,STM32-MAT/TARGET:STM32 embedded target for MATLAB and Simulink (RN0087)
下载链接

本文以Clion嵌入式开发环境为例,keli开发流程基本与其一致,可同样参考本文进行开发,使用keil的开发方式其实要更简单一些,如果大家对于Clion的开发方式比较熟悉了的话,可以选择Clion开发,个人觉得Clion开发起来更舒适一些。

插件安装(选看)

将插件下载下来后,解压到本地存放即可,我将其存放在D盘内的STM32_MAT文件夹内,然后打开matlab
在这里插入图片描述
至此,插件即已安装完毕,后续再simulink的库中会看到stm32相关的硬件模型

创建cubemx工程

使用keil开发的话,通过cubemx创建工程即可,使用Clion开发需要先到Clion中创建项目工程再打开cubemx,具体创建项目方式参考
【Clion+CubeMX开发STM32】(二)创建自己的工程
根据上文创建好工程之后,打开cubemx工程,在新建cubemx项目工程时,这里有一个需要注意的地方
在这里插入图片描述

一、正常配置自己的工程

在这里插入图片描述

在Project Manager中,按照以往开发习惯,Application Structure会选择Advance
这里我们选择Basic

Basic:是基础的结构,一般不包含中间件(RTOS、文件系统、USB设备等)。
Advanced:相反就是包含中间件,一般针对相对复杂一点的工程。

这里先选择Basic,后面会讲两个模式有什么区别

创建simulink模型

simulink配置

打开matlab 2023a
在这里插入图片描述
选择路径为项目工程路径,然后电机simulink,创建simulink模型
在这里插入图片描述
打开后保存一下,然后点击模型设置
在这里插入图片描述
找到“求解器”,修改为“定步长”“离散”采样时间“0.001”秒

在这里插入图片描述

将simulink与cubemx相关联
在这里插入图片描述

创建LED模型

设置完simulink后,即可开始搭建LED模型
在这里插入图片描述
打开库浏览器,找到stateflow内的chart
在这里插入图片描述
可以从库浏览器中找到,也可以在空白处直接输入chart找到
调用后,双击chart来配置LED模型
在这里插入图片描述
使用鼠标左键,拖动两个“状态”到窗口内,这里我们配置一个LED闪烁模型。
即设计两个状态,分别为LED_ON和LED_OFF,程序需要在这两个状态间来回切换,两个状分别的持续时间由我们自由设置。
现在已经调用出两个状态,接下来就是设置两个状态

在这里插入图片描述
设置第一个状态为LED_ON,且在该状态下LED_OUT=0
设置第二个状态为LED_OFF,且在该状态下LED_OUT=1
在这里插入图片描述

参数属性设置

按照上图设置好后,我们就已设计好一个状态转换模型了,通过输出口led_output的值来切换LED的状态就能实现LED闪烁效果
不过现在只是设计好了模型,我们的模型还需要设置一下才能正确编译并转换成能用的代码。
在这里插入图片描述

在这里插入图片描述

鼠标点击符号前方的按钮,选择符号的属性,这里可以为输出数据、参数数据,
很明显,我们需要将led_output配置为output date输出数据这样led_output会生成一个输出接口,这样才能在代码中去对led_output的值进行读写
然后将HIGH和LOW设置为parameter date参数数据,这两个只是参数分别代表着低电平0和高电平1

我新添加了一个mode属性作为演示
在这里插入图片描述

现在我们以LED_MODE等参数为例,设置好符号类型后,这里还有两个问题
一、LED_MODE作为一个输出端口,其输出的数据是什么类型的?uint8 or uint16
二、ON_MODE、OFF_MODE、HIGH、LOW这四个参数具体的值我们还没有配置
首先:设置LED_MODE、LED_OUTPUT输出接口的数据类型
在这里插入图片描述
通过属性检查器,和端口号,确认端口的输出数据类型,这里我们选择uint8,因为我们只需要输出0或1即可
然后解决第二个问题,使用字典,设置ON_MODE、OFF_MODE、HIGH、LOW这几个符号的数据,类似于宏定义
在这里插入图片描述
如下图,添加simulink parameter并设置名字 数值 数据类型
在这里插入图片描述
在这里插入图片描述

至此,我们的状态模型就已经搭建好了,点击左上角的蓝色后退箭头,回到simulink中
在这里插入图片描述
状态设置好后,我们还需要添加out接口将从状态机中输的数据给输出出去,否则我们无法进行调用。
在这里插入图片描述
在空白处输入out调用out接口并与状态机相连接,在生成代码前,我们可以先仿真一下,看看led_output是否按照我们设定的500ms来转换
在这里插入图片描述
运行后,双击scope示波器,即可查看波形
在这里插入图片描述
波形正常,说明我们的状态机chart有设计正常无误,接下来就可以生成代码

(选看) 使用插件

如果没有安装前文的插件,这一部分可以不看,如果安装了插件,我们可以将led_output的值直接输出到GPIO上,以此来直接控制LED闪烁。
如果没有安装该插件,生成代码后,我们可以手动调用led_output的值,然后手写代码根据led_output的值来转换LED的状态
在这里插入图片描述
安装有插件后,即可在库中找到mcu相关的硬件模型,如果我们将led_output的值直接输出到模型接口上,那matlab会自动生成代码来控制IO口的电平转换
不过不建议大家过于依赖此插件,
其一是,ST已经停产不再维护
其二是,我们在simulink模型开发中尽量脱离底层,这样可以脱离硬件平台的制约,提高模型的复用性。
在这里插入图片描述
双击mcu模型后,选择cubemx生成的ioc文件

在这里插入图片描述
双击GPIO write模型后勾选上GPIOA 8这里根据自己的LED口来设置

生成代码

通过示波器确认模型无误后,Ctrl+B生成代码
在这里插入图片描述

生成了一个.c三个.h文件,主要是注意.c文件有哪些,头文件等会儿只需要包含路径即可
红色的代码行表示的是和上次编译有哪些变化。
在这里插入图片描述

导入工程

打开项目文件夹,可以看到一个和simulink同名的文件,其内包含有Src和Inc

我们前面创建cubemx工程时,选择了Basic
这样才能让simulink和cubemx生成的main.c组合在一起

在这里插入图片描述
这时打开Clion,在Clion中查看生成的代码,同时将生成的代码加入Cmakelist中去
在这里插入图片描述
查看项目结构和代码,可以发现simulink在main.c中生成了一些它的代码
但是,仔细查看main.c文件,cubemx生成的HAL_Init等初始化函数不见了
不用惊慌,只需要用cubemx重新generate code就行

因为simulink生成代码后会把main.c的内容覆盖,所以需要用cubemx重新生成一遍代码来添加会初始化等配置
由此会造成我们在main.c中编写的代码会在simulink生成代码时抹除掉
如果不想让simulink抹除,可以选择Advance,让simulink单独生成一份main.c,这样就不会覆盖

Basic和Advance选择

两种模式,造成两种结果,各有优缺点,请自行考量选择
Basic:不用移植simulink生成的代码,但是每次生成前需要单独保存一份main.c内自己编写的代码,随后再手动添加回去
Advance:需要将simulink生成的main.c文件中的内容移植到程序内

如果你的项目中只用simulink生成代码。不会再main.c中添加其他代码,那么选择Basic
如果你只是结合matlab进行开发,main.c内还有你自己的一些代码,那么建议选择Advance,每次生成代码后,可以在simulink中查看main.c的改变,再手动删改就行

通过Basic生成的cubemx工程会和simulink共用同一个Src文件夹,所以simulink的代码会自动添加进工程内
如是Advance生成的cubemx工程,其源文件和头文件皆在Core文件夹内,simulink生成的代码则在Src文件夹内,所以一个项目内会出现两个main.c源文件,我们在使用的时候建议只添加cubemx生成的main.c文件,然后将Src内的simulink源文件main.c内调用的代码移植到工程中去

在这里插入图片描述

以Basic模式为例,每次simulink生成代码后,还需要用cubemx生成一遍代码,这样才能让两者代码结合

在这里插入图片描述

在这里插入图片描述
重新生成好后,只需添加到Cmakelist中让其参与到工程编译即可,这里直接略过。

在这里插入图片描述

代码讲解

添加好后,可以尝试编译,编译没问题后,查看main函数,然后烧录代码即可
在这里插入图片描述

总结

一、创建cubemx项目工程
二、打开simulink创建状态模型
三、设置符号属性和数据类型
四、生成代码

总体流程其实一整套走下来之后并不难,虽然有点复杂,但是先跟着实践走一遍,再转回头看理论会好理解得多。有些步骤的意义通过文字的形式并不好讲解,这里主要还是讲开发方法,跟着步骤走,学会这种开发方式和其模型化开发的理念即可。

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

注意沈题!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值