目录
一、介绍
我的上篇文章介绍了如何借助其他大佬写好的工程模板来实现我们需要的功能,这种方法其实并不是最好的,但是对于我们初学者来讲是比较友好的,因为大多数大佬的代码都附上了相应的注释通俗易懂。今天我来给大家安利一款特别实用的软件,这是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库中的函数貌似更加准确,这在我们后续的学习中慢慢探索。