STM32标准函数库也称为固件库,它是ST公司为嵌入式系统开发者访问STM32底层硬件而提供的一个中间函数接口,即API(Application Program Interface),由程序、数据结构和宏组成,还包括微控制器所有外设的性能特征、驱动描述和应用实例。在STM32标准函数库中,每个外设驱动都由一组函数组成,这组函数覆盖了外设驱动的所有功能。我们可以将STM32标准函数库中的函数视为对寄存器复杂配置过程高度封装后所形成的函数接口,通过调用这些函数接口即可实现对STM32寄存器的配置,从而达到控制的目的。
STM32标准函数库覆盖了从GPIO端口到定时器,再到CAN、I 2 C、SPI、UART和ADC等所有的标准外设,对应的函数源代码只使用了基本的C编程知识,非常易于理解和使用,并且方便进行二次开发和应用。库函数开发与寄存器开发的对比图如图2.1所示。实际上,STM32标准函数库中的函数只是建立在寄存器与应用程序之间的程序代码,向下对相关的寄存器进行配置,向上为应用程序提供配置寄存器的标准函数接口。STM32标准函数库的函数构建已由ST公司完成,这里不再详述。在使用库函数开发应用程序时,只要调用相应的函数接口即可实现对寄存器的配置,不需要探求底层硬件细节即可灵活规范地使用每个外设。
图2.1 库函数开发与寄存器开发的对比图
在传统8位单片机的开发过程中,通常通过直接配置芯片的寄存器来控制芯片的工作方式。在配置过程中,常常需要查阅寄存器表,由此确定所需要使用的寄存器配置位,以及是置0还是置1。虽然这些都是很琐碎、机械的工作,但是因为8位单片机的资源比较有限,寄存器相对来说比较简单,所以可以用直接配置寄存器的方式进行开发,而且采用这种方式进行开发,参数设置更加直观,程序运行时对CPU资源的占用也会相对少一些。
STM32的外设资源丰富,与传统8位单片机相比,STM32的寄存器无论是在数量上还是在复杂度上都有大幅度提升。如果STM32采用直接配置寄存器的开发方式,则查阅寄存器表会相当困难,而且面对众多的寄存器位,在配置过程中也很容易出错,这会造成编程速度慢、程序维护复杂等问题,并且程序的维护成本也会很高。库函数开发方式提供了完备的寄存器配置标准函数接口,使开发者仅通过调用相关函数接口就能实现烦琐的寄存器配置,简单易学、编程速度快、程序可读性高,并降低了程序的维护成本,很好地解决了上述问题。
虽然采用寄存器开发方式能够让参数配置更加直观,而且相对于库函数开发方式,通过直接配置寄存器所生成的代码量会相对少一些,资源占用也会更少一些,但因为STM32较传统8位单片机而言有充足的CPU资源,权衡库函数开发的优势与不足,在一般情况下,可以牺牲一点CPU资源,选择更加便捷的库函数开发方式。一般只有对代码运行时间要求极为苛刻的项目,如需要频繁调用中断服务函数等,才会选用直接配置寄存器的方式进行系统的开发工作。
自从库函数出现以来,STM32标准函数库中各种标准函数的构建也在不断完善,开发者对于STM32标准函数库的认识也在不断加深,越来越多的开发者倾向于用库函数进行开发。虽然目前STM32F1系列和STM32F4系列各有一套自己的函数库,但是它们大部分是相互兼容的,在采用库函数进行开发时,STM32F1系列和STM32F4系列之间进行程序移植,只需要进行小修改即可。如果采用寄存器进行开发,则二者之间的程序移植是非常困难的。
当然,采用库函数开发并不是完全不涉及寄存器,前面也提到过,虽然库函数开发简单易学、编程速度快、程序可读性高,但是它是在寄存器开发的基础上发展而来的,因此想要学好库函数开发,必须先对STM32的寄存器配置有一个基本的认识和了解。二者是相辅相成的,通过认识寄存器可以更好地掌握库函数开发,通过学习库函数开发也可以进一步了解寄存器。