Keil/STM32单片机开发——如何使用单片机开发函数库?

这次是较为简短的单片机方面开发介绍,本人或许知识方面有限存在疏漏情况,还请各位见谅。

本次的内容就是——什么是单片机标准开发库?什么是HAL库?它们能干什么用?我们怎么知道开发库中这些函数方法的功能?

在我的上一篇文章《Keil4/keil5如何新建C51/STM32工程项目(手把手教细节)》中,提到了“STM32标准库”和“HAL库”这个概念。我们之所以在新建STM32单片机工程中之所以用到它,究其原因就是因为STM32单片机提供了非常复杂和多功能的硬件设备接口的使用,仅靠我们作为初学者的能力,是不太可能从零开始通过写寄存器,通过写底层代码的方法一步步把单片机功能给实现的,那样对我们来说太难也太费时间了。

因此,一些单片机开发商和第三方开发组就会提供一些已经写好的底层代码和接口供我们使用,大大降低了我们进行单片机开发应用的难度,我们无需关心这些函数方法的底层算法和逻辑,只要专注于使用就可以了。而这,也是我们今天要学会的目标,如何识别这些函数方法的作用并正确使用它们。

对于HAL库和标准库的区别,我引用这篇文章供大家参考:

《标准库和HAL库到底有什么不同?怎么选?》

我们先来看看一个新建完成的STM32工程文件里都有什么吧(不会新建的可以戳我上一篇文章)。

Keil/STM32单片机开发——如何使用单片机开发函数库?_第1张图片

我们可以看到除了前缀都是“stm32f10x_......”外,后面都对应着这些函数方法可以实现的功能名称(如gpio、usart、flash等)

同时我们还需要注意一点,这些开发标准库里面的.c以及.h同名文件都是对应的。(缺一不可)

学过C语言的同学应该都知道.h文件实际上就是头文件,里面存放一些预设变量和函数方法的声明,而.c文件里面才是对这些预设变量和函数方法的定义。因此就会出现:stm32f10x_gpio.h和stm32f10x_gpio.c两个同名但不同后缀的文件。(但是在keil中,似乎每个.c文件只要添加进编译组中,它们就能在你前面设置好的头文件寻找路径中自动的引用这些头文件,但是对某些编译软件来说,它不一定这么智能,因此最好是把.c和.h文件一同加进编译组中,以免发生找不到头文件引用的情况。)

接下来我们来看看stm32f10x_gpio.c里面都有哪些功能供我们使用,打开后如下:

Keil/STM32单片机开发——如何使用单片机开发函数库?_第2张图片

Keil/STM32单片机开发——如何使用单片机开发函数库?_第3张图片

(看懂@brief、@param和@retval对我们使用这个功能函数至关重要)

我们发现,我们并不知道GPIO_TypeDef* GPIOx是什么?这也导致很多新手并不知道如何往这些函数填入什么对应的形参。但其实在@param里面,它已经告诉我们"GOIOx"是什么了(GPIO_TypeDef*只是它的变量类型,我们这个阶段不用去理会太多),它其实就是在我们单片机原理图上见到的诸如PA9、PB5等等GPIO口中的这个字母标号(在@Parma中它告诉我们:x可以为(A-G)的范围)。

举个例子,我们只要在程序中引用这个函数,写成GPIO_DeInit(GPIOA),那么这个函数就会对所有GPIOA类型的IO口起作用。而它的功能,@brief中也已经写明了:“将GPIOx外围寄存器初始化为其默认重置值。”这里如果我们在main()函数中调用该函数并让它作用于GPIOA口,那么GPIOA口都会被初始化为默认值(这里其实就是带有GPIOA标号的IO口不能使用了)。

如果遇上简介也没说明白的函数功能,大家一定要多上网搜搜,会有很多大神给出更加详细的解释的。

Keil/STM32单片机开发——如何使用单片机开发函数库?_第4张图片

这样看的话,是不是很多函数都能明白它们大致的功能了呢?stm32f10x_gpio.c文件提供了非常便捷的GPIO口控制函数,能使得GPIO口不再是单纯的输入和输出,它们其实能做到很多事情,比如GPIO口初始化、读位操作等等,这些随着大伙们对嵌入式的学习,使用到的功能和熟练度都会大大提升。(同理,在截图中也有控制闪存储存的stm32f10x_flash.c、i2c通信的stm32f10x_i2c.c,不同的外接设备需要配置的不只是GPIO口,就比如TFT屏幕,很可能需要配置I2C通信,于是就需要去stm32f10x_i2c.h和.c里去配置对应参数和环境)

那么,我们再来看看stm32f10x_gpio.h里又有什么吧?

Keil/STM32单片机开发——如何使用单片机开发函数库?_第5张图片

其实简单理解,.h文件中存放的多数都是一些声明。但是,它们里面很多宏定义类型直接关系到单片机的寄存器地址,而我们前面一直在指出,这些库方法的出现,就是为了避免我们从复杂的寄存器修改开始而导致我们的开发难度大大提高。因此,它们也很重要。

Keil/STM32单片机开发——如何使用单片机开发函数库?_第6张图片

Keil/STM32单片机开发——如何使用单片机开发函数库?_第7张图片

Keil/STM32单片机开发——如何使用单片机开发函数库?_第8张图片

我们来看看如何去启用一个PA8引脚,让它具有输出功能,如下:

Keil/STM32单片机开发——如何使用单片机开发函数库?_第9张图片

Keil/STM32单片机开发——如何使用单片机开发函数库?_第10张图片

写完后,PA8就被启用了。(引脚模式为输出,最高输出速度50MHz,默认为使其输出高电平。)

Keil/STM32单片机开发——如何使用单片机开发函数库?_第11张图片

最后,再补充几个功能:

如果我们想查找,引用的这个函数/变量,它的出处在哪里?那么我们可以这样做:

Keil/STM32单片机开发——如何使用单片机开发函数库?_第12张图片

点击之后它就会自动跳转到最原始定义的地方:

Keil/STM32单片机开发——如何使用单片机开发函数库?_第13张图片

如果,这个函数/值有多个引用处,那么它会出现这个菜单,你可以通过筛选和查找找到具体的引用以及原始定义:

Keil/STM32单片机开发——如何使用单片机开发函数库?_第14张图片

但是要记住的是,如果你要找“GPIO_INIT()”,但是最原始定义时是:“GPIO_INIT(void)”,那么它会提醒你:“GPIO_INIT()没有定义”。所以查找时最好选中的是名字本身就好。

Keil/STM32单片机开发——如何使用单片机开发函数库?_第15张图片

学会运用开发库函数去编写程序,对于正在比赛或者不是深究嵌入式开发的学生和爱好者来说非常友好,这其中有很多东西需要各位根据实际情况去调整,但这种引用方法基本上keil可以用,IAR以及其他主流嵌入式程序编写软件也一样可以。这期比较简单,很多细节还没有提到,主要是想让一些基本没有任何编程基础的学习者不至于遇到一堆函数手足无措。如有不会的可以留言私信,祝各位都能早日学成。

你可能感兴趣的:(单片机,stm32,嵌入式硬件)