相对于使用c语言指针操做寄存器地址直接设置寄存器数据,标准库使用c语言结构体和函数对mcu外设进行了封装。因为c没有面向对象机制,因此只能使用结构体来封装 外设对象的属性,函数来实现对外设对象的行为操做。函数
对于GPIO每一个外设通常都对应多个寄存器,如控制寄存器、数据寄存器、时钟寄存器等,每一个寄存器最多32位,可实现不少种设置。所以采用告终构体 + 枚举 进行封装。设计
PPP_InitTypeDef 用来定义外设对象结构体和直接属性,每一个属性对应一个寄存器枚举类型PPPxxx_TypeDef,属性(寄存器)枚举类型包含了对该寄存器的全部可能设置。指针
另外有些外设没有使用枚举的方式定义寄存器的可选值,而是采用定义多个常量宏方式,这时PPP_InitTypeDef 属性仍然对应一个寄存器可能的值。对象
因此,不管使用枚举仍是宏的方式定义寄存器可选值,最终都经过PPP_InitTypeDef来设置外设寄存器。ci
实现对寄存器设置的函数为PPP_Init,设置好外设对象的结构体后,调用该函数即完成对 对象寄存器的初始化配置。开发
因为普通的IO(GPIO)是独立工做的,只须要控制其输出高低电平即完成工做,因此通常不须要其它操做,固然若是须要使用GPIO模拟其它功能,这时就须要标准库定义的其它函数,如读数据、写数据、设置复用功能等。同步
具体到stm32的外设,因为stm32 芯片的管脚除了电源、极少数独立功能引脚,剩下的都是GPIO,全部具体外设功能都是从这些GPIO复用而来,所以要想使用某功能,须要经过GPIO_PinAFConfig 设置该GPIO引脚要复用的功能。it
另外,考虑到低功耗的设计,stm32的全部外设功能能够独立设置开启和关闭,对应外设的时钟也须要独立开启和关闭,若是该外设的时钟没有开启,不管怎样外设都不会工做。原理
对于其它外设,通常都须要遵照某个协议才能使用,如通讯类的i2c、spi、UART管脚,须要先熟悉协议,了解是否须要时钟同步、数据收发的格式等其它协议规范,而后按照规范经过函数操做外设寄存器,实现具体外设功能。配置
不管使用什么外设,必须根据硬件原理图,肯定具体使用的管脚才能进行开发。硬件的通讯通常都是在特定时钟频率下发送一系列特定格式的帧(高低电平)来实现的。
具体到显示外设,则必须有基本的字库实现对ascii码的解析才能显示文字,中文还须要中文字库。
stm32标准库是对寄存器的封装及直接操做,若是不熟悉外设结构和外设寄存器或者相关外设的通讯协议、原理,则无法使用相关函数。