《嵌入式系统》知识总结9:使用STM32固件库操纵GPIO

STM32固件库(函数库)

“STM32 标准函数库”它是由 ST 公司针对 STM32 提供的函数接口,即 API (Application Program Interface),开发者可调用这些函数接口来配置 STM32的寄存器,使开发人员得以脱离最底层的寄存器操作,有开发快速、易于阅读、维护成本低等优点。

当我们调用库 API 的时候不需要去了解库底层的寄存器操作,就像开始学习 C 语言的时候,用 printf()函数时只是学习它的使用格式,并没有去研究它的源码实现,但需要深入研究的时候,经过千锤百炼的库源码就是最佳学习范例。
实际上,库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。

库开发方式直接配置寄存器方式的区别如图所示

《嵌入式系统》知识总结9:使用STM32固件库操纵GPIO_第1张图片

 CMSIS 标准

所谓 CMSIS 标准,实际是新建了一个软件抽象层

《嵌入式系统》知识总结9:使用STM32固件库操纵GPIO_第2张图片

CMSIS 标准中最主要的为 CMSIS 核心层,它包括了:
内核函数层:其中包含用于访问内核寄存器的名称、地址定义,主要由 ARM 公司提供。
设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提供。


可见 ,CMSIS 层位于硬件层与操作系统或用户层之间,提供了与芯片生产商无关的硬件抽象层,可以为接口外设、实时操作系统提供简单的处理器软件接口,屏蔽了硬件差异,这对软件的移植是有极大的好处的。STM32的库,就是按照 CMSIS 标准建立的。 

 固件库中与GPIO相关的api

(1)开启外设时钟

使用复位和时钟控制RCC驱动程序(stm32f10x_rcc.c)
有3个针对不同总线连接的外设时钟命令函数
• RCC_AHBPeriphClockCmd
• RCC_APB1PeriphClockCmd
• RCC_APB2PeriphClockCmd
GPIO通过APB2总线连接系统
开启GPIO外设时钟的函数
RCC_APB2PeriphClockCmd

(2)初始化外设

1. 定义外设初始化结构变量(PPP是外设名称)
PPP_InitTypeDef PPP_InitStructure;
2. 用允许的成员值填充外设初始化结构成员
PPP_InitStructure.member1 = val1;
...
3. 调用PPP_Init函数初始化外设
PPP_Init(PPP, &PPP_InitStructure);
4. 允许外设开始工作(不是所有的外设都需要)
PPP_Cmd(PPP, ENABLE)

typedef struct
{ uint16_t GPIO_Pin;
/* 指定配置的GPIO引脚 */
GPIOSpeed_TypeDef GPIO_Speed;
/* 指定GPIO引脚输出的最高频率 */
GPIOMode_TypeDef GPIO_Mode;
/* 指定GPIO引脚配置的工作模式 */
}GPIO_InitTypeDef;

//GPIO_InitTypeDef成员1:GPIO_Pin
//要进行配置的GPIO引脚编号
//其值是常量GPIO_Pin_y(y是0...15和ALL)

#define GPIO_Pin_0 ((uint16_t)0x0001)
/*!< Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002)
/*!< Pin 1 selected */
......
#define GPIO_Pin_15 ((uint16_t)0x8000)
/*!< Pin 15 selected */
#define GPIO_Pin_All ((uint16_t)0xFFFF)
/*!< All pins selected */

//GPIO_InitTypeDef成员2:GPIO_Speed
//定义在枚举类型GPIOSpeed_TypeDef 中

typedef enum
{ GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
// 不赋值的枚举变量自动加1,故此常量值为2
GPIO_Speed_50MHz // 常量值为3
}GPIOSpeed_TypeDef;
//选择最高输出频率
G P I O _ I n i t S t r u c t u r e . G P I O _ S p e e d =GPIO_Speed_50MHz;


//GPIO_InitTypeDef成员3:GPIO_Mode
//定义在枚举类型GPIOMode_TypeDef 中

typedef enum
{ GPIO_Mode_AIN = 0x0, // 模拟输入模式
GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入模式
GPIO_Mode_IPD = 0x28, // 下拉输入模式
GPIO_Mode_IPU = 0x48, // 上拉输入模式
GPIO_Mode_Out_OD = 0x14, // 通用开漏输出模式
GPIO_Mode_Out_PP = 0x10, // 通用推挽输出模式
GPIO_Mode_AF_OD = 0x1C, // 复用开漏输出模式
GPIO_Mode_AF_PP = 0x18 // 复用推挽输出模式
}GPIOMode_TypeDef;
//选择工作模式为推挽输出
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;


(3)控制外设工作

外设驱动库提供控制外设工作的有关函数
对GPIO主要是输入和输出数据
本例中只需要输出函数,例如
• 字输出GPIO_Write函数
• 位输出GPIO_WriteBit函数
• 置位GPIO_SetBits函数
• 复位GPIO_ResetBits函数

void GPIO_SetBits (GPIO_TypeDef *GPIOx,
uint16_t GPIO_Pin)
void GPIO_ResetBits (GPIO_TypeDef *GPIOx,
uint16_t GPIO_Pin)

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