使用MATLAB/SIMULNIK驱动STM32开发板-----按键实现

简介:通过MBD建模的方式,利用MATLAB/SIMULINK配合STM32CubeMX两个工具,自动生成代码至Keil,驱动STM32开发板。
本期利用Stateflow有限状态机实现按键驱动。用了大量的篇幅仅仅实现一个按键功能,这在Keil中两三行代码就搞定,感觉有点像“杀鸡焉用牛刀”。但是Simulink的功能就是降低开发门槛,比如实现一个PID,你可能要敲几十行代码,在simulnik中就是拉一个离散PID模块。这里主要是介绍一下MBD开发的方法。篇幅关系,一些基本设置省略,后期需要的话专门开一个专题。


前言

GPIO分配如下:PA5为按键,默认上拉;PA4为LED,输出低电平点亮。

提示:以下是本篇文章正文内容,下面案例可供参考

一、配置STM32CubeMX

1.1 配置GPIO

在这里插入图片描述
在这里插入图片描述

1.2 配置SYS

在这里插入图片描述

1.3 配置时钟源RCC


配置时钟源RCC

在这里插入图片描述

1.4 时钟配置

在这里插入图片描述

1.5 MX 代码配置及生成

对基本配置完后,进行代码生成设置。

在这里插入图片描述
这边建议勾选 == Generate Peripheral initialzation as a pair ‘.c/.h’ ==这个选项,可以让基本的板载功能,分别生成一个.c和.h文件。

在这里插入图片描述
最后点击右上角的生成代码。完成STM32的板载功能配置。

二、MATLAB/SIMULINK基本配置

必须把求解器的类型设置为定步长,这是生成嵌入式代码必须要求的。采样的时间可以根据仿真的需要设置(对于生成的嵌入式c代码是没有什么影响的。)

Hardware Implementation,这边的Vendor设置为ARM Cortex-M。如果你有官方开发板,可以对硬件板子进行对于设置,这样就用不到Keil了。直接在MATLAB中就可下载编译。

在这里插入图片描述
对Code Generation进行设置,这一步也很重要,这是生成符合嵌入式代码标准的c代码。

在这里插入图片描述

三 、Simulink模型搭建

利用Function-Call subsystem搭建如下系统。这边的Key_Mapping是待会生成代码的主函数名。如果不用Function-Call subsystem的话也可以,直接搭模型,那样就是生成xxx_step()
Key_Check是输入,待会在keil中,把它与HAL_GPIOReadPin关联起来。Key_Sts是判断按键状态的输出变量。

在这里插入图片描述
在这里插入图片描述
把Key_Mapping这个In信号设置为Output function call
在这里插入图片描述
设置Property Inspector,点它进入设置。如果报错的话,可以在最后面模型搭建好的时候,在过来设置。
在这里插入图片描述
将Domain设置为Export function。
在这里插入图片描述
双击进入这个Function-Call subsystem子系统。
在空白幕布上双击,输入模块名称:chart。用来生成Stateflow状态机模块。
先对,Stateflow做一些简单的设置。双击进入chart。在黄色幕布上,右键选择Properties。
做如下设置。
在这里插入图片描述
在这里插入图片描述
搭建如图状态机模型。我们这里的Key_Check为输入,就是用来读取GPIO信号的变量;输出默认Key_Sts = 1(按键稳定弹起阶段)。中间的Debounce为消抖阶段。大概的思路就是:按键初始为弹起状态,当按键被按下,有一个延时消抖的阶段,经过多少个延时周期后,如果还是检测到按键为按下状态的话,则认为按键确实被按下了。反之按键弹起也是一个思路。这里的after(xx,tick)为经过多少个时钟周期后。在用模型搭建任务调度的时候,也可以用这个stateflow函数。
在这里插入图片描述
对模型参数进行设置。配置输入输出。
在这里插入图片描述
在Function call system中,给输入输出再拉两个输入输出端口。
在这里插入图片描述
信号关联。在APPS中选择Embedded。左下角会出现Code Mapping-Component Interface。
我们先在第一级子系统中,设置信号的名称和信号的数据类型。
信号线上的名称,就是生成代码的变量名。这边的数据类型选择Uint8.
在这里插入图片描述

在这里插入图片描述
进入Code Mapping-Component Interface。
设置输入信号生成代码的方式为ImportedExtern。输出信号为ExportedGlobal。
也可以不用Code Mapping-Component Interface。直接建立matlab脚本,用Simulink.Signal/mpt.signal去定义变量,最后将信号绑定在一起也是可以的,那样也可以。效果一样。
在这里插入图片描述
在这里插入图片描述
最后是simulink代码生成。直接ctrl+B。
这个Key_Sts就是我们输出的变量,你也不勾选ExportedGlobal,用其他方式,指针、结构体来生成这个变量都是可以的。不过还是怎么简单怎么来。输入的那个变量需要我们在keil中自己去定义。
在这里插入图片描述

四、代码导入Keil

生成的代码集成在一个叫XXX_ert_rtw文件夹里。我们copy除ert_main.c之外的.c.h文件至keil。

在这里插入图片描述
进入keil,完成一些基本设置。
在STM32Cube那个文件夹下,创建一个新的文件夹,用来放matlab生成的代码。
在这里插入图片描述
把刚才创建的文件夹添加到工程树中。
在这里插入图片描述
在这里插入图片描述
文件路径添加
在这里插入图片描述
在这里插入图片描述
在工程树中,添加MATLAB生成的c代码。
在这里插入图片描述

五、 Keil代码键入与编译

在main.c中,#include 这个导入的.h文件
在这里插入图片描述
定义变量
在这里插入图片描述
最后在while循环中,将变量与板子gpio关联起来。编译。烧入。
在这里插入图片描述

总结

这只是很简单的使用MBD方式,其实MATLAB模型是需要测试的,只不过这个实验很简单,所以就省略了,后面我会介绍一些关于matlab测试以及debug的方式。这个代码只是在轮询的方式去检测按键,后面会加入中断函数,实现其他的功能。

  • 16
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值