热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用STM32CubeMX生成Keil工程并完成流水灯

目录一、介绍二、使用STM32CubeMX生成Keil工程1、创建新工程2、初始化配置3、工程导出三、在Keil中完善我们的功能四、在仿真中观察波形1、仿真配置总结

目录

一、介绍

二、使用STM32CubeMX生成Keil工程

1、创建新工程

2、初始化配置 

 3、工程导出

三、在Keil中完善我们的功能

四、在仿真中观察波形

1、仿真配置

总结 

参考资料:




一、介绍

我的上篇文章介绍了如何借助其他大佬写好的工程模板来实现我们需要的功能,这种方法其实并不是最好的,但是对于我们初学者来讲是比较友好的,因为大多数大佬的代码都附上了相应的注释通俗易懂。今天我来给大家安利一款特别实用的软件,这是ST公司专门用于stm芯片的代码生成器,它能为我们省去许多步骤,以可视化的方式为我们呈现出来,特别的方便。

STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具,目的就是为了方便开发者, 允许用户使用图形化向导生成C 初始化代码,可以大大减轻开发工作,时间和费用,提高开发效率。STM32CubeMX几乎覆盖了STM32 全系列芯片。
在CubeMX上,通过傻瓜化的操作便能实现相关配置,最终能够生成C语言代码,支持多种工具链,比如MDK、IAR For ARM、TrueStudio等 省去了我们配置各种外设的时间,大大的节省了时间。
那么我们要从哪儿才能得到这样一个宝贝呢?这个问题问得好,我们可以直接去ST公司官网下载该软件:STM32CubeMX - STM32Cube initialization code generator - STMicroelectronics

可以直接下载,只需要你填好你的基本信息和邮箱就可以快速下载了。

关于STM32CubeMX的安装详细可以参考:【STM32】STM32 CubeMx使用教程一--安装教程_Z小旋-CSDN博客_stm32cubemx安装


二、使用STM32CubeMX生成Keil工程

是否还记得我在上一篇文章中提到的初始化三步,如果我们直接在Keil中编写代码的话,初始化一步不能少,但是我们现在有更高级的工具了啊,所以下面我们就要通过这个工具(STM32CubeMX)来初始化配置。


1、创建新工程

首先我们打开安装好的STM32CubeMX,并创建一个新工程。 

选择自己的芯片。

接着我们就可以看到我们自己的芯片了,如下图:


2、初始化配置 

现在就需要我们对于管脚和时钟进行初始化配置了,我设置的管脚(PA4、PA5、PA6)输出为LED提供高电平。

先配置时钟,选择晶振

现在我们来配置时钟树,中间把8MHz改成72并回车。 回车之后会弹出

点击“OK”即可完成时钟配置。

现在咱们再来配置输出管脚与输出模式。在STM32CubeMX上配置我们所需要的输出管脚与输出模式可比我们自己写代码来初始化简单多了,我们只需要点击可视化图上对应的管脚,选择为输出即可。

 现在我们再来配置输出模式,点击左侧GPIO来配置我们用到的输出管脚。在我们点击以后会出现以下界面,由于三个管脚配置相同,所以我只讲解一个,其他同理即可。

 我们注意看下面的输出模式配置:


GPIO output level Low的意思是将该串口初始化为低电平,当然也可以选择High,就是将初始电平拉高,这里按我们电路的接法,所以应该拉低。

GPIO mode Outpull Push pull的意思是选择输出模式为推挽输出模式,还有其他几种输出模式,在我的上一篇博客中有讲到另外几种输出方式,大家可以了解一下。这里我们是需要点亮LED灯,所以选择推挽输出模式。

GPIO Pull-up/Pull-down No pull-up and no pull-down的意思是设置为输出没有上拉和下拉输出,其实安逻辑来说我们是需要给我们的LED给一个下拉电阻才能点亮的,但是我们在实际的运用中为了简便发现这样也可以点亮,并且因为电流大,所以LED亮度很高。

Maximum output speed Low配置的是输出速度,我们这里配置输出速度为低,目前我们碰到的大多数情况都选择低就可以了。



 注:此时注意观察

 都为绿色表明没有问题,如果是黄色(警告)或者红色(错误),则需要我们重新配置,因为有一些管脚不只是输入输出功能,还具有其他比如ADC转换等功能,如果占用了此管脚的话还想要用这些功能就很麻烦,所以不建议这样配置。



 3、工程导出

现在我们已经初始化好我们需要用到的管脚了,可以导出工程让我们继续完善我们的代码了。

点击上方的Project Manager,配置以下内容(注意我用红色字体写的提示)。

 设置我们需要保存的路径,以及以什么方式打开该工程。


注:工程名和路径一定要是英文,这类工程我们应该养成习惯避免使用中文,在后续的学习中才会避免一系列的不必要错误。 选择打开方式的时候,因为我们安装的是MDK,所以选择MDK-ARM


现在我们基本完成了工程的配置,可以生成代码并导出了。点击右上角 GENERATE CODE 生成代码。


三、在Keil中完善我们的功能

 代码生成完以后我们点击打开工程,即可跳到我们的Keil工程中了。

注意到我们左侧的工程栏里,可以看到gpio.c文件还有main.c文件,这些就是依靠STM32CubeMX给我们生成的代码了,怎么样,是不是比我们自己来写代码初始化简单多了方便多了,所以说这是个很好用的工具嘛。我们现在打开初始化文件来看看。

gpio.c:

可以看到与我们上次自己写的初始化代码其实很相似,道理是一样的,在这里我就不做赘述了。生成的gpio.h文件中也只有一个函数声明语句。

现在我们需要做的是什么呢,当然是完善我们自己的功能啦。那么我们要在哪儿完善我们的代码呢,打开我们的main.c文件,找到我们的主函数中的while循环(因为我们要实现的功能简单,而且全部已经初始化了,所以只需要在主函数中编写代码就可以了)。

我们可以看到很多的/* USER CODE BEGIN 2 */ /* USER CODE END 2 */,我们要编写的代码就在这BEGIN和END中间。在中间加上我们的代码就可以了。

HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//A0灯亮HAL_Delay(500);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET); //A0灯灭,同时B0亮HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);HAL_Delay(500);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); //B0灯灭,同时C15灯亮HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);HAL_Delay(500);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//C15灯灭然后开始循环

这个时候可能很多小伙伴就要问了,每段语句前面的 HAL_ 是什么意思呀,实际上这是一个叫HAL库的东西,具体HAL库是什么意思呢,有什么用呢


HAL库是ST公司目前主力推的开发方式,全称就是Hardware Abstraction Layer(抽象印象层)。库如其名,很抽象,一眼看上去不太容易知道他的作用是什么。它的出现比标准库要晚,但其实和标准库一样,都是为了节省程序开发的时期,而且HAL库尤其的有效,如果说标准库把实现功能需要配置的寄存器集成了,那么HAL库的一些函数甚至可以做到某些特定功能的集成。也就是说,同样的功能,标准库可能要用几句话,HAL库只需用一句话就够了。并且HAL库也很好的解决了程序移植的问题,不同型号的stm32芯片它的标准库是不一样的,例如在F4上开发的程序移植到F3上是不能通用的,而使用HAL库,只要使用的是相通的外设,程序基本可以完全复制粘贴,注意是相通外设,意思也就是不能无中生有,例如F7比F3要多几个定时器,不能明明没有这个定时器却非要配置,但其实这种情况不多,绝大多数都可以直接复制粘贴。是而且使用ST公司研发的STMcube软件,可以通过图形化的配置功能,直接生成整个使用HAL库的工程文件,可以说是方便至极,但是方便的同时也造成了它执行效率的低下,在各种论坛帖子真的是被吐槽的数不胜数。


如果想详细了解的小伙伴可以参考:(21条消息) STM32 之 HAL库_戈扬的博客-CSDN博客_hal库 总之,我们用HAL库中的函数的话就会更加方便,而且许多函数都非常好用。 

现在我们就可以进行烧录了,烧录首先需要我们将USB-TTL与我们的板子相连,接到我们的PC上并用FlyMCU进行烧录,具体过程可以参考我上一篇博客。

烧录完成后让我们来看看效果吧!


四、在仿真中观察波形

我们平常创建好工程并写好代码以后是不是都要将程序烧进电路中才能验证我们代码的正确性呢,答案当然是否定的,因为靠烧录进板子来验证真的是太麻烦了,每个程序都需要烧录一次,而且还要重新接线,真的很麻烦。所以我教大家一种新的方法——仿真实验看波形来验证我们的正确性。


1、仿真配置

在开始仿真之前我们需要对keil进行一系列的配置,点击“仙女棒”,然后在Debug选项中选择软件仿真(use simulator),并且将下面的设置改成你对应的芯片即可。 

现在我们再运行仿真,并调出逻辑窗口,在逻辑窗口中添加上我们需要查看的管脚号。

点击setup添加对应管脚号。

点击添加管脚号,然后输入我们想查看的管脚号即可,比如:porta.0

 开始仿真,得到结果,观察仿真波形图。

 

此时我们先不要着急,观察一会儿,这里观察一下我们的延时函数是否准确。将鼠标移动至第一个下降沿处,当鼠标与其重叠时,读取此时时间。

我们发现横坐标正好是0.5s,但是我们回顾我的上篇博客用的延时函数 

有没有发现有一些不同。


注:本次用STM32CubeMX生成的代码采用的是HAL库中的延时函数,上次流水灯的制作采用的延时函数是软件延时。 



总结 

我想说的是我们用的也是我上次埋下的伏笔,延时方式不同延时的准确性也有差别,软件延时的原理是让程序空跑 期间啥都不干,对于时间精度高的工作我们一般不采用这种延时方式。我们在这里可以看出HAL库中的函数貌似更加准确,这在我们后续的学习中慢慢探索。


参考资料:

【STM32】STM32 CubeMx使用教程一--安装教程_Z小旋-CSDN博客_stm32cubemx安装

 (21条消息) STM32 之 HAL库_戈扬的博客-CSDN博客_hal库


推荐阅读
  • 本文详细介绍了C语言的起源、发展及其标准化过程,涵盖了从早期的BCPL和B语言到现代C语言的演变,并探讨了其在操作系统和跨平台编程中的重要地位。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 在Java中,this是一个引用当前对象的关键字。如何通过this获取并显示其所指向的对象的属性和方法?本文详细解释了this的用法及其背后的原理。 ... [详细]
  • 解析SQL查询结果的排序问题及其解决方案
    本文探讨了为什么某些SQL查询返回的数据集未能按预期顺序排列,并提供了详细的解决方案,帮助开发者理解并解决这一常见问题。 ... [详细]
  • 为了解决不同服务器间共享图片的需求,我们最初考虑建立一个FTP图片服务器。然而,考虑到项目是一个简单的CMS系统,为了简化流程,团队决定探索七牛云存储的解决方案。本文将详细介绍使用七牛云存储的过程和心得。 ... [详细]
  • 本文详细介绍了C语言中的基本数据类型,包括整型、浮点型、字符型及其各自的子类型,并探讨了这些类型在不同编译环境下的表现。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • C语言基础入门:7个经典小程序助你快速掌握编程技巧
    本文精选了7个经典的C语言小程序,旨在帮助初学者快速掌握编程基础。通过这些程序的实践,你将更深入地理解C语言的核心概念和语法结构。 ... [详细]
  • 主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ... [详细]
  • 本文介绍了一种基于选择排序思想的高效排序方法——堆排序。通过使用堆数据结构,堆排序能够在每次查找最大元素时显著提高效率。文章详细描述了堆排序的工作原理,并提供了完整的C语言代码实现。 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • 本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。 ... [详细]
author-avatar
刘德华
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有