[STM32]从零开始的STM32 HAL库情况搭建
一、前言之前在搭建STM32的尺度库情况时就告诉过大家,开发STM32的方式重要有三种。一种是最原始但是服从最高的寄存器开发,另一种是服从仅次于寄存器难度相对较低的尺度库开发,末了一种是最为简朴但是步伐服从最低的HAL库开发。如果对于初学者而言,你利用HAL库你可以快速的配置STM32的外设并将STM32利用起来,但是你会少很多接触STM32底层代码的机会,这不会让你的代码能力有所提升。所以,对于初学者,我并不发起一开始就学习HAL库,而是从尺度库学起,由下而上的学习。在企业开发中,为了开发服从和步伐员之间的开发情况统一,会更倾向于利用HAL库进行开发。提到HAL库的情况配置与服从问题,我们不得不提到一款软件了———cubeMX,这是由ST公司开发的用于简化STM32的初始化配置的一款软件,它能省去我们对函数库的配置与对外设的初始化,我们只需利用简朴的几个步骤就能配置好STM32的HAL库开发情况并且初始化外设。那么,本次的教程,就会教大家怎样安装cubeMX以及安装相关的固件库并且配置STM32的基本情况。
二、在开始之前
在开始配置HAL库之前,大家需要先配置好keil的情况,由于HAL库始终只是一个函数库,概念和尺度库是一样的,然而cubeMX只是用来生成HAL库的软件而已。所以只管HAL库简朴,我们仍旧需要keil来进行编译。这里需要大家预备好keil的情况并且已经安装好了STM32对应的芯片包。具体教程请看下面的文章:
keil的安装以及芯片包安装:怎样精确的安装和配置keil?(详细)-CSDN博客
在安装好keil以后,这里还需要下载我给的资料包,资料包中包含了cubeMX的安装包以及部分芯片在cubeMX的固件包。这里cubeMX安装包的下载方式较为苛刻,所以不保举大家自己下载。
资料下载:https://pan.baidu.com/s/1IL9IQzxCNC95UWupvSFsug?pwd=clxm
提取码:clxm
在下载完资料以后,就可以继续下面的步骤了。
三、cubeMX的安装
既然我们要利用HAL库,第一步当然是配置一个HAL库的情况。上面我也提到了,HAL库的情况我们可以利用cubeMX直接配置。所以这里我们需要安装cubeMX。
打开我给的资料包文件夹下的cubeMX的文件夹就可以看到cubeMX的安装包了:
https://i-blog.csdnimg.cn/direct/ab574f66c7434fffb1a86260df59de2a.png
我们双击安装包启动安装引导步伐:
https://i-blog.csdnimg.cn/direct/cb16cd9983db4b97b16d56d50fdd3199.png
起首就是这里可以选择是只为我安装还是为所有用户安装,这里我们选择“只为我安装”即可,我们选择上面的选项:
https://i-blog.csdnimg.cn/direct/647c03a161e949239fa26ddb117645fa.png
这里我们直接点击“Next”:
https://i-blog.csdnimg.cn/direct/9536f4ba3a1949b0b265a9f121f2125d.png
这里我们需要同意协议,并且点击“Next”:
https://i-blog.csdnimg.cn/direct/32ce41b0c081417195d5b719695ba265.png
这里我们再将“已阅读ST条款”打上勾,然后点击“Next”:
https://i-blog.csdnimg.cn/direct/59de61e15618435ea0e338470f70752f.png
下面需要选择一下cubeMX的安装路径,这里需要注意的是cubeMX对中文非常敏感,路径中不能有一点中文或者其它特别字符。选择好路径以后,我们直接点击“Next”:
https://i-blog.csdnimg.cn/direct/b9bf5d76a0c04ef68b9c8a33d424b603.png
这里点击了“Next”以后,大概会弹出下面的提示:
https://i-blog.csdnimg.cn/direct/e0fe0978d5724af9a4789036b2763f85.png
这里的提示表现这个目次已经存在,问我们要不要覆盖,如果点击了“yes”这个目次中本来文件夹就没有了。
如果收到了下面这样的提示就表现cubeMX安装的目次不为空,我们需要将目次清空或者新建一个目次:
https://i-blog.csdnimg.cn/direct/08fa5d2fad934226b54476aafd69a057.png
来到下一步以后,这里有两个选项是关于快捷方式的需要我们选择要不要在桌面或者开始菜单添加快捷方式,这里我都打勾表现都要添加。随后点击“Next”即可:
https://i-blog.csdnimg.cn/direct/67f1c637a57344a4b0484604a768fca4.png
随后就进入了安装,大家这里耐心等待:
https://i-blog.csdnimg.cn/direct/2c63e347f17e4eb29b2f6f0c35e79d39.png
https://i-blog.csdnimg.cn/direct/4a167ff8c2f74b929574dad410bcd730.png
进度条走完以后,我们直接点击“Next”:
https://i-blog.csdnimg.cn/direct/1e0ccda0afda4bde9318091cd60289ae.png
末了点击“Done”:
https://i-blog.csdnimg.cn/direct/5c82626d8e0742d7b935ccc230a62692.png
至此,我们的cubeMX就已经安装完成了:
https://i-blog.csdnimg.cn/direct/abf351eee01447f88f14c4f6204198d7.png
四、cubeMX的更新以及芯片包的安装
cubeMX和别的一些IDE或者语言差异,它的版本并不是固定在低版本,相反,cubeMX版本最好保持在一个比较高的版本。新版本会对旧版本生成的工程进行向下兼容,但是旧版本是没办法兼容新版本的。所以,如今就来教大家怎样更新cubeMX吧。起首我们启动cubeMX:
https://i-blog.csdnimg.cn/direct/3174f4700abf46c1824554a2e0dab0f6.png
这里我们点击上方菜单的“Help”:
https://i-blog.csdnimg.cn/direct/9eb7b8c161744ec8864d563bfa293c6f.png
在“Help”的下拉菜单中,我们点击“Check for Updates”:
https://i-blog.csdnimg.cn/direct/69feddb7cafb4bbb9e585e953e8cf02e.png
这里会列出我们可以更新的cubeMX版本和固件包的版本,如果这里是空的,就表现你的cubeMX和固件包不需要更新:
https://i-blog.csdnimg.cn/direct/447cb42e1cf14bf9877596fbd43141ab.png
这里我们需要勾选要更新的cubeMX和相关的固件包,末了点击“Install”:
https://i-blog.csdnimg.cn/direct/d0dc93ffe40240d78d5449d36c307366.png
随后就进入了更新得状态,但是这里大概会由于网络更新失败,这里目前没有办理办法,大家只能尝试利用一些正向署理本领来办理:
https://i-blog.csdnimg.cn/direct/c37e6f98f55946588a0a93da8747714f.png
当然,如果实在没办法更新的话,不更新也没关系,我给的cubeMX的安装包版本是比较新的。
下面我们来教大家怎样安装固件包,这里先说一下固件包的概念。固件包是为了让cubeMX支持相关的STM32芯片,假如我这里的想要生成STM32F1的HAL库工程,我就需要安装一个F1的固件包。所以,为了让我们的cubeMX能够支持到我们芯片,起首就需要安装相关的固件包。这里固件包可以分为在线安装和离线安装。这里两种方法我们都会先容。起首是在线安装:
我们这里同样要点击菜单中的“Help”:
https://i-blog.csdnimg.cn/direct/95c2f3cfe9b2468fb24fa13ee3a34ec0.png
然后点击下拉菜单中的“Manage embedded software packages”:
https://i-blog.csdnimg.cn/direct/ebf08d555ad6492c9d69a4148b5c49f9.png
随后就能看到下面的窗口了:https://i-blog.csdnimg.cn/direct/1f6b821afe1b457bb80335392ab4101c.png
这里有STM32几乎所有单片机的型号,大家选择自己型号的单片机下载即可,这里我就用F1举例。我们点击STM32F1:
https://i-blog.csdnimg.cn/direct/d25fa51391dd4ce4948e8f1929171c39.png
这里的下拉菜单中我们可以选择固件包的版本,这里发起大家选择最新版,我们直接在固件包前面打上勾然后点击“Install”即可:
https://i-blog.csdnimg.cn/direct/857c9776812e4ce8aedcbeb95fe6d382.png
随后就会开始安装了:
https://i-blog.csdnimg.cn/direct/5a3a50a82612437985a91c4ddbf772c4.png
这里在安装固件包时,仍旧大概由于网络出现错误。当然这里如果你由于网络问题不停无法下载固件包的话,可以看下面的离线固件包安装教程。
这里如果固件包安装好了固件包对应的前面的框的颜色会发生改变:
https://i-blog.csdnimg.cn/direct/19e1ca6c93944789b30766164d2bd6ed.png
至此,我们的在线安装固件包就已经完成了。
如今你大概已经完成了在线安装,或者说你想进行下面的离线安装,但是我们如今有一件必须做的事,那就是确定自己的用户名中没有中文。怎么看用户名中有没有中文呢,我们需要到C盘中的“用户”文件夹下:
https://i-blog.csdnimg.cn/direct/acece8aafaa64b7498065afe56f5949c.png
这里可以看到,我的盘算机中拥有两个用户,这两个用户的用户名都没有中文和别的特别字符,这里的两个文件夹就代表了这两个用户的用户文件夹:
https://i-blog.csdnimg.cn/direct/3e84f3adb70e47c18d2b5a425460f575.png
如果你发现你的用户名中有中文,那大概就需要修改用户名或者是重新创建一个用户,重新创建用户相对简朴一些。不管是哪种方法,在网络上都有对应的教程,大家跟着操作就行。这里包管用户名中没有中文的一步是绝对要做的,否则后面的cubeMX在生成的时候是一定会报错的。大家大概会有疑问,我们这里C盘下的用户文件夹,这个文件夹不就是中文吗,为什么这个中文没关系,实在这里的中文只是单纯的被表现为了中文,实在本质还是英文路径,不信吗?假如我们随便检察一个用户文件夹的属性:
https://i-blog.csdnimg.cn/direct/0cf6ace581ac4976b41a49d193015345.png
我们可以看到这个文件夹位于C盘下的Users文件夹下,是的这里“用户”两个字被替换为了“Users”。
这里我们办理了用户名的问题就可以开始预备离线安装固件包了。起首我们这里需要相识一个路径“C:\Users\85884\STM32Cube\Repository”,即用户目次下的“STM32Cube”目次下的“Repository”目次:
https://i-blog.csdnimg.cn/direct/9c15a8c7d8bd40f695abade4eb019ff2.png
这个目次包含了我们下载的固件包,以文件夹的情势存放在这里,这里的每一个文件夹就是一个固件包上面有单片机的型号和固件包的版本。所以,如果我们想离线安装的话,只需要将对应的固件包的文件夹复制到此处即可,打开我给的资料中的固件包文件夹,这里我提供了大多数常用系列的固件包:
https://i-blog.csdnimg.cn/direct/548f04df4e5a480898dc0f6089a1f96f.png
大家利用时只需要将这些固件包复制到我刚才说的文件夹中即可。
复制进去以后,我们重启cubeMX就可以看到对应的固件包已经安装乐成了:
https://i-blog.csdnimg.cn/direct/9d4468e67c2349e28ce79083a52e3d91.png
如果我给的固件包中没有你想要的,可以去下方ST的github的开源主页:
cubeMX固件包开源主页:
STMicroelectronics/STM32Cube_MCU_Overall_Offer: This repo describes all STM32 MCU related GitHub projects. The open source offer for the STM32 MCU products
https://i-blog.csdnimg.cn/direct/93abff7ac28b4eb68559b1621c0f3935.png
在主页中往下滑,就可以看到所有系列的固件包了:
https://i-blog.csdnimg.cn/direct/a1f83fc5ed88404c899a1110ab7df196.png
这里我们以F7的固件包举例,我们点击“STM32CubeF7”就可以进入F7固件包相关的主页:
https://i-blog.csdnimg.cn/direct/f04730f6768e47b88a39a802306dfc6a.png
随后我们点击页面中的“Code”:
https://i-blog.csdnimg.cn/direct/48982a6da14546f89538c605b31c7e52.png
在下拉菜单中点击“Download ZIP”:
https://i-blog.csdnimg.cn/direct/15cd8b9858114951a9d387f9ed0660e9.png
随后欣赏器就会弹出下载了:
https://i-blog.csdnimg.cn/direct/2bd494b192d24b56a9cdb9bd632a2a7e.png
我们将这个压缩包下载到我们能找到的地方:
https://i-blog.csdnimg.cn/direct/a2579d58e00b4a14bb2588f4415b2e8e.png
解压得到以下文件夹:
https://i-blog.csdnimg.cn/direct/e69f52cd5b9e4487b7efd6fcf26773b4.png
我们将这个文件夹复制到对应的路径中:
https://i-blog.csdnimg.cn/direct/3eef3bb730cb4be4baaa68454437ad76.png
这个时候我们再启动cubeMX,再次来到固件包的管理页面,可以看到我们的固件包已经被添加进来了:
https://i-blog.csdnimg.cn/direct/fa8ca84ffa8346459613b970518c8421.png
至此,我们离线安装固件包就已经完成了。
五、cubeMX新建一个STM32 HAL库工程
前面的步骤都算是为新建工程做的预备,从如今开始,我们才正式的开始创建cubeMX的工程并且生成STM32的工程,这里我会利用STM32F103C8T6来举例。我们起首还是启动cubeMX:
https://i-blog.csdnimg.cn/direct/62922e0683d44f19b58867869107750a.png
随后点击中间的“ACCESS TO MCU SELECTOR”:
https://i-blog.csdnimg.cn/direct/d046d212aa514121a569e68f39144a43.png
在点击了以后这里大概会弹出更新框,也大概会更新失败,不过不用担心,只要固件包配置精确了,这里更新与否都无所谓:
https://i-blog.csdnimg.cn/direct/7170eced313a4d4d952e60f71d16a761.png
随后会弹出这个芯片选择页面,这里要我们选择我们要利用的芯片:
https://i-blog.csdnimg.cn/direct/947f417f3e6e4e8d9301d703411eb9e0.png
直接在左上角的搜索框输入要利用的芯片型号即可:
https://i-blog.csdnimg.cn/direct/78cfc93417614d63a0a5c19ce8ad50c2.png
我们在搜索结果中,双击就可以选择这个芯片了:
https://i-blog.csdnimg.cn/direct/a4a654f7e9074678931214a424571fc9.png
随后就来到一个这样的页面,这也表现我们的工程被创建了:
https://i-blog.csdnimg.cn/direct/08ea49b320014a6590c8e2984cbd0f45.png
如今我们开始一些简朴的配置使STM32能够正常工作,这些配置放在别的系列的单片机中也是必须的,我们起首来配置STM32的时钟,这里点击“System Core”,在下拉菜单中点击“RCC”:
https://i-blog.csdnimg.cn/direct/ac3c584fb9564981919eecd1e1a824ed.png
这里我们需要将外部高速时钟使能(HSE):
https://i-blog.csdnimg.cn/direct/31bb13ab9a4a432bbd89b01a3f54e6c5.png
配置完成以后就是这样的:
https://i-blog.csdnimg.cn/direct/d9fe55be7c67429da9c0a02cd09f4dd2.png
随后我们来对时钟进行详细的配置,这里点击顶部的“Clock Configuration”进入时钟的配置界面:
https://i-blog.csdnimg.cn/direct/0b4dbd8b8e8a4ad4af289ec23060cc4b.png
在cubeMX中,我们配置时钟输入或者是主频亦或是每个外设的时钟优劣常简朴的,我们只需要能看懂时钟树即可,如今我来带大家看看时钟树,我们先看最左边的部分:
https://i-blog.csdnimg.cn/direct/3de1721b184244ada219873aaac869a9.png
这里有四种时钟,即外部高速,外部低速,内部高速,内部低速时钟。这些时钟被输入到了芯片内部,我们可以利用“锁相环源选择多路复用器”来选择那一路时钟进入锁相环。
我们继续往后面看,这里有“x”或者“/”符号的地方就是锁相环,它可以使时钟分频或者倍频,这也是为什么我们的外部时钟输入只有8M,而STM32的主频却有几十上百M,这些频率都是通过锁相环分频或者倍频之后得到的:
https://i-blog.csdnimg.cn/direct/714ca70f65e944118725032ed481458e.png
随后就是“锁相环源选择多路复用器”,我们看到在时钟树中能够选择时钟源的地方就利用的是“锁相环源选择多路复用器”:
https://i-blog.csdnimg.cn/direct/bb1f5f35e9c74a95bda9c91346f62a4d.png
在STM32F103单片机中的多路复用器只有三个,随着系列的增加,这里的多路复用器和锁相环都会变多。
我们如今来调整多路复用器,使STM32的系统时钟直接接到我们的外部高速时钟,具体的我们需要调整多路复用器,如图:
https://i-blog.csdnimg.cn/direct/a3daa3ad460148878ca813b5ea734c68.png
这里大家大概会问,16M的频率是不是太低了。这里我们当然可以改,我们直接改“HCLK”这里:
https://i-blog.csdnimg.cn/direct/0ed7d3dc420c4727b23cc48bbb27bed4.png
可以直接输入72回车,cubeMX会自动配置锁相环:
https://i-blog.csdnimg.cn/direct/6d068478a2e349989021446ebaee6eac.png
如上图就算是配置好了。这里最高频率不要超过芯片能工作的最高频率,否则大概会是芯片无法工作甚至烧毁。
配置完时钟,我们点击“Pinout & Configuration”回到刚才的配置界面:
https://i-blog.csdnimg.cn/direct/f06c98326416491cac2582ca2a00b23d.png
随后点击“SYS”我们需要配置一下调试接口:
https://i-blog.csdnimg.cn/direct/36c565eafee445fe9f6f6c86089a1fee.png
这里配置为“Serial Wire”:
https://i-blog.csdnimg.cn/direct/24be4a38ff654505acf323fb4e3e3509.png
设置以后,我们可以发现PA13和PA14被占用了,这也刚好是我们利用STLink下载步伐的接口。如果不配置的话,下次烧录大概会存在烧录不进去的情况,如果你已经烧录不进去了,可以考虑利用串口将步伐擦除再烧录。
配置完上面的模块以后,STM32已经可以基本的工作了,但是我们还需要配置一些GPIO来检察一点征象,比如,我们如今就来配置一下STM32最小板上LED对应的引脚,来点一个灯试试看。我们这里可以直接点击右边单片机上的PC13:
https://i-blog.csdnimg.cn/direct/5d48cb0da0234b28a8a862ae71b55b81.png
这里由于我们需要点灯,所以把GPIO配置为输出模式。配置完成以后,对应的GPIO会亮起:
https://i-blog.csdnimg.cn/direct/ae2e369122084df1a33c5f35191c472e.png
然后我们再点击左边菜单中的GPIO进行详细配置:
https://i-blog.csdnimg.cn/direct/c0d92c37a21e487eb8f120c981e28b90.png
点击选中我们要配置的GPIO口:
https://i-blog.csdnimg.cn/direct/b3ad70b7b2e544159f5d7c6c80b5f8b6.png
下面我们来详细的看看这些参数:
https://i-blog.csdnimg.cn/direct/c84d0f0c160e426da9343f57b35efe55.png
起首是“GPIO output level”表现GPIO一开始输出的电平,有“High”和“Low”两种选项,即一开始GPIO默认高或者低。
然后是“GPIO mode”,表现GPIO的输出模式,有开漏输出和推挽输出两种,这里由于要驱动LED,所以选择推挽输出。
然后是“GPIO Pull-up/Pull-down”表现GPIO的上下拉状态,这里可以上拉,也可以下拉或者说不上拉也不下拉。
末了是“Maximum output speed”表现GPIO的输出速度,这里我们可以直接选择高。
经过了上面的配置,我们的GPIO就已经配置好了。下面可以预备生成keil工程了,我们这里点击“Project Manager”进入项目配置界面:
https://i-blog.csdnimg.cn/direct/e791ecb5c78345a4aed329d68c8adc02.png
起首是“Project Name”即项目的名字,大家可以根据用途给项目命名,我这里的项目是点灯,所以这里直接就写“LED”,注意,这里的项目名不能有中文和特别字符:
https://i-blog.csdnimg.cn/direct/6e2d16a17fb04afc966f697104961584.png
然后是“Project Location”,我们需要选择一下项目的路径,注意这里路径中的每一个文件夹都不能有中文:
https://i-blog.csdnimg.cn/direct/9deb701cb3a4485e82f82061d933b39f.png
随后在“Toolchain /IDE”这里我们要选择“MDK-ARM”:
https://i-blog.csdnimg.cn/direct/dbd5d9801395418c8ee2dcaefd9a4086.png
版本直接默认即可:
https://i-blog.csdnimg.cn/direct/bb41688132534468a6b6b1b568441373.png
随后我们点击“Code Generator”配置一下代码的生成:
https://i-blog.csdnimg.cn/direct/927a891d833241d0884057859b3f304b.png
这里在第一个框中我们要选择“Copy all used libraries into the project folder”表现复制所有的库文件:
https://i-blog.csdnimg.cn/direct/107887a91fea4a498fd3cb03bc1454d3.png
在第二个框中,我们将“Generate peripheral initialization as a pair of '.c/.h' files per peripheral”打上勾,表现将为每一个外设都生成一个单独的.c .h:
https://i-blog.csdnimg.cn/direct/a53ec5f55f724c5cb9a021eb86c78310.png
至此,我们所有的配置都已经完成了,我们直接点击“GENERATE CODE”生成工程:
https://i-blog.csdnimg.cn/direct/d42fb0f89ae1483abf2d2f7791016574.png
在生成完成以后,可以看到这样一个弹窗,如果你在生成时报错了,就去检查对应的固件包有没有安装好,或者路径中有没有中文,cubeMX大部分的错误都是这两种:
https://i-blog.csdnimg.cn/direct/ee76cedeb4da46d483fda559af0bfdf4.png
这里我们直接点击“Open Project”这可以直接启动Keil:
https://i-blog.csdnimg.cn/direct/55fe7b2dbce5499aaea95157d6bae626.png
点击了以后可以看到我们的keil了已经启动:
https://i-blog.csdnimg.cn/direct/fb04c593948e4a5f999086fddee6f4d7.png
这里可以先不动,我们直接点击编译,编译一般都是没有错误和警告的,这也意味着HAL库的情况已经搭建完成了:
https://i-blog.csdnimg.cn/direct/8fedaf63cacb42d7806090f51255ee25.png
我们这里进入main.c:
https://i-blog.csdnimg.cn/direct/ae5d66d6d91949dfa99c4a9d90f68005.png
往下滑就能找到我们的主函数了:
https://i-blog.csdnimg.cn/direct/248a099afc0a4cdfbf8b95b299295dad.png
主函数的while也在这下面:
https://i-blog.csdnimg.cn/direct/de4482368e6c414ab2535ffa2e667d6f.png
我们的一些初始化函数也被写在了主函数中:
https://i-blog.csdnimg.cn/direct/3fdc262aa26648738905bf2cae66a2d6.png
既然我们一开始已经配置了GPIO,那么如今的GPIO已经被“MX_GPIO_Init”这个函数初始化为了我们想要的状态。我们不用再对GPIO有多余的配置,下面我们就来点个灯吧,我们可以直接利用HAL库中的引脚电平翻转函数和延时函数:
https://i-blog.csdnimg.cn/direct/847c450153a1429188ffad92969aef2d.png
这里我们在主函数的循环中,每500ms翻转一次电平。大家注意,在cubeMX生成的工程中,一定要将代码写在“BEGIN”和“END”中,比如“/* USER CODE BEGIN WHILE */”和/* USER CODE END WHILE */“”这两个就是配对的,代码要写在这两个注释之间,否则下次利用cubeMX生成代码时,从前写的代码就会被覆盖。
我们再次将代码编译并且下载:
https://i-blog.csdnimg.cn/direct/a7a398c253614eb9b2d46eadced3a417.png
步伐下载以后,可以看到LED正常闪烁。如果你的LED没有闪烁大概就需要检查一下是不是那里没有配置好,或者利用调试模式看看问题。至此,我们的STM32 HAL库工程就已经生成完成了。
六、结语
在cubeMX中,我们可以配置STM32的所有外设,极大的简化了我们搭建情况和外设初始化的过程,但是问题也随之而来,HAL库将函数封装得太上层了,我们需要修改底层代码会变的非常不便。至于选择什么库进行开发,就看大家自己吧。末了,感谢大家的观看!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]