完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、整体思路
利用Matlab的simulink搭建模型生成C代码,通过stm32cubemx生成工程,最后在KEIL或者IAR等工具里面编译生成代码下载至MCU中执行。 本文以流水灯建立模型和简单使用定时器为例进行演示。 二、开发环境 1、安装Matlab Matlab版本建议在2013B以上,本文使用Matlab 2016a。 2、安装STM32硬件支持包 安装完成后重启MATLAB。官网文档中提到,当前只支持F4和F3部分系列,F1系列生成代码后编译可能会报错,本文使用STM32-MAT版本V4.3.0。 3、安装STM32CUBEMX 4、安装KEIL或者IAR等IDE 用于配置工程文件。 三、STM32硬件资源配置 1、打开STM32CUBEMX 选择“access to MCU selector” 2、选择STM32芯片 以STM32F103R6为例。如果搜索不到,那么可能需要下载安装库文件 下载对应的库文件即可。 搜索到芯片后,选中点击“Start Project”,进入配置界面。 3、首先选择时钟 这里选择HSE,使用外部晶振 4、再配置GPIO 选择PA1-5作为LED灯。引脚状态选择为输出。 再根据硬件设计,配置IO上拉还是下拉。 5、最后配置时钟 选择最大72MHz。 6、保存工程 输入工程文件信息 选择生成的工程文件,如果是KEIL,那么选择“MDK-ARM V5”。 最后保存即可。 四、SIMULINK配置 1、配置MATLAB搜索路径 打开MATLAB,首先配置MATLAB搜索路径。 将STM32-MAT的安装路径添加进来。 添加完成后将MATLAB当前工作路径修改为第三步中IOC文件位置,默认是在Matlab安装位置,不修改的话后面生成代码的时候会报错。 最后建议重启一下MATLAB。 2、打开SIMULINK 新建一个空白模型。 打开配置界面 3、选择STM32配置文件 选择stm32.tlc。 解算器(Solver)选项默认为固定步长,即“Fixed-step”,然后修改步长为1/10000,即0.1ms。也可以根据实际情况修改,默认为auto可能会导致程序运行时无法显示出效果。 添加代码注释 4、选择cubeMX路径 五、模型搭建 Simulink配置完成后就可以自己搭建模型。 1、配置芯片 选择MCU config,将右侧模块拖动至刚刚新建的空白模型。 双击刚刚拖出来的模块,进入配置界面,选择第三步生成的IOC文件。 2、选择GPIO模块 同样拖动至SIMULINK,双击该模块配置IO引脚,可以看到我们在cubemx里面配置的IO,勾选要打开的IO,点击确认即可。 3、模型设计 使用”Counter Free-Running”模块进行计数,参数配置如下 此配置的意思为每0.5秒计数一次,计数的最大值为2^Nbits – 1,其中Nbits为所填的2,所以这里最大值为3。 示波器显示和预期值一致。 然后通过一个关系比较符,当计数值分别等于0,1,2,3,时,相应的GPIO输出为1。 示波器仿真结果如图 最后模型如图所示 六、代码生成 模型设计完成后,仿真结果无误,就可以进行代码生成。按“Ctrl+B”或者如图所示点击,进行代码生成。 最后生成工程目录如下 “stmDemo_stm32”目录为matlab生成的原始代码。 IOC文件为stm32cubemx工程文件。 Slx文件为simulink模型文件。 其他的为KEIL工程中的代码。 七、编译下载验证 1、仿真验证 打开工程,代码编译完成后,下载程序到目标板。 这里使用proteus进行仿真,仿真中流水灯切换速度为5秒,比预定的时间0.5秒慢了10倍,仿真提示” Simulation is not running in real time due to excessive CPU load.”,说明仿真时单片机运行速度不是实时的。 为了进一步验证,再使用一个定时器进行让LED5以1Hz的频率闪烁。配置如下: 模型如下: 生成代码后编译报错,原因为F1系列的库函数中”__HAL_TIM_SetAutoreload”该函数未定义成” __HAL_TIM_SET_AUTORELOAD”。 而在F4系列的库函数中是有该定义的,编译不会报错。 因此生成的代码无法正常使用定时器,除非修改生成后的代码,这样并不是我们想要的。 2、开发板验证 最后以F429单片机为例,重新生成代码下载到单片机进行验证。IOC文件中,时钟配置为180MHz,其他步骤同第三~六步。 代码生成完成后对工程进行配置,设置程序下载完成后重置运行,下载器根据实际情况设置为”CMSIS-DAP-Debugger”。 编译完成下载至单片机中,看是否满足设计要求。 经过验证该代码无误。 八、注意事项 1、代码生成后的处理 生成代码后,由于使用了systick(系统定时器),但是生成的代码中没有对其进行调用,所以需要在stm32f4xx_it.C中手动添加一行代码,否则程序可能无法正常运行。添加的代码为:HAL_SYSTICK_IRQHandler(); 该问题具体原因未知,可能和stm32cubemx配置或者版本有关。 2、Matlab工作路径 建议生成代码之前,将matlab工作路径指定到IOC文件位置,同时将SLX文件也放在同一个文件夹下,这样方便工程管理。 3、参考文档 在STM32-MAT安装路径下还有更多示例以及使用说明。 4、Invalid index问题 Invalid index. Component:Simulink | Category:Block diagram error matlab2018b中生成代码时出现上述问题 解决方法如下: 在simulink设置选项“hardware implementation”中把设备STM改为“custom processor” 九、小结 总的来说该方法生成底层代码较复杂,而且配置繁琐。当然优点是基本不需要修改生成的代码,但实际上未能节省太多时间。 MATLAB自动生成的代码是标准的C代码,支持所有的MCU。因此建议在实际开发中能在Simulink环境下仿真的部分,通过Simulink实现;对于单片机底层这类没法在Simulink下仿真的软件,不应该打包到Simulink环境下。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1820 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1634 浏览 1 评论
1104 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
740 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1692 浏览 2 评论
1951浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
756浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
587浏览 3评论
605浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
570浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-31 02:55 , Processed in 0.612521 second(s), Total 74, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号