热门标签 | 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库


推荐阅读
  • PL2303HXD电路图(USB转UART)介绍及应用
    本文介绍了PL2303HXD电路图(USB转UART)的特性和应用,该电路图可以实现RS232和USB信号的转换,方便嵌入到手持设备中。PL2303HXD作为USB/RS232双向转换器,可以将USB数据转换为RS232信息流格式发送给外设,并将RS232外设的数据转换为USB数据格式传送回主机。通过利用USB块传输模式和自动流量控制,PL2303HXD能够实现更高的数据传输吞吐量比传统的UART端口。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 本文介绍了如何在Azure应用服务实例上获取.NetCore 3.0+的支持。作者分享了自己在将代码升级为使用.NET Core 3.0时遇到的问题,并提供了解决方法。文章还介绍了在部署过程中使用Kudu构建的方法,并指出了可能出现的错误。此外,还介绍了开发者应用服务计划和免费产品应用服务计划在不同地区的运行情况。最后,文章指出了当前的.NET SDK不支持目标为.NET Core 3.0的问题,并提供了解决方案。 ... [详细]
  • python中安装并使用redis相关的知识
    本文介绍了在python中安装并使用redis的相关知识,包括redis的数据缓存系统和支持的数据类型,以及在pycharm中安装redis模块和常用的字符串操作。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 本文介绍了如何使用MATLAB调用摄像头进行人脸检测和识别。首先需要安装扩展工具,并下载安装OS Generic Video Interface。然后使用MATLAB的机器视觉工具箱中的VJ算法进行人脸检测,可以直接调用CascadeObjectDetector函数进行检测。同时还介绍了如何调用摄像头进行人脸识别,并对每一帧图像进行识别。最后,给出了一些相关的参考资料和实例。 ... [详细]
  • c语言基础编写,c语言 基础
    本文目录一览:1、C语言如何编写?2、如何编写 ... [详细]
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社区 版权所有