2022年(27)
分类: Windows平台
2022-05-02 02:07:54
原文地址:超经典的STM32学习笔记——第一章GPIO口 作者:我本痴情
固件库中与GPIO有关的函数主要有:
函数名 |
描述 |
GPIO_Init |
根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器 |
GPIO_ReadInputDataBit |
读取指定端口管脚的输入 |
GPIO_ReadInputData |
读取指定的GPIO端口输入 |
GPIO_ReadOutputDataBit |
读取指定端口管脚的输出 |
GPIO_ReadOutputData |
读取指定的GPIO端口输出 |
GPIO_SetBits |
设置指定的数据端口位 |
GPIO_ResetBits |
清除指定的数据端口位 |
GPIO_WriteBit |
设置或者清除指定的数据端口位 |
GPIO_Write |
向指定GPIO数据端口写入数据 |
1.1函数GPIO_Init
函数名 |
GPIO_Init |
函数原形 |
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) |
功能描述 |
根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器 |
输入参数1 |
GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设 |
输入参数2 |
GPIO_InitStruct:指向结构GPIO_InitTypeDef的指针,包含了外设GPIO的配置信息参阅Section:GPIO_InitTypeDef查阅更多该参数允许取值范围 |
输出参数 |
无 |
返回值 |
无 |
先决条件 |
无 |
被调用函数 |
无 |
1.1.1:GPIO_TypeDef为一结构体:
typedef struct
{
__IO uint32_t CRL; // 端口配置低寄存器
__IO uint32_t CRH; // 端口配置高寄存器
__IO uint32_t IDR; // 端口输入数据寄存器
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;
GPIOx为一宏定义:
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
其中GPIOA_BASE=0x40010800,即PA口的起始地址,#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)这句语句的作用就是将GPIOA指定到PA口的入口地址中,也就是说将PA口的寄存器组取名为GPIOA。
1.1.2:GPIO_InitTypeDef为结构体:
typedef struct
{
uint16_t GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;
其中GPIO_Pin可取的值:
GPIO_Pin |
描述 |
GPIO_Pin_None |
无管脚被选中 |
GPIO_Pin_0 |
选中管脚0 |
GPIO_Pin_15 |
选中管脚15 |
GPIO_Pin_All |
选中全部管脚 |
GPIO_Speed可取的值:
GPIO_Speed |
描述 |
GPIO_Speed_10MHz |
最高输出速率10MHz |
GPIO_Speed_2MHz |
最高输出速率2MHz |
GPIO_Speed_50MHz |
最高输出速率50MHz |
GPIO_Mode可取的值:
GPIO_Mode |
描述 |
GPIO_Mode_AIN |
模拟输入 |
GPIO_Mode_IN_FLOATING |
浮空输入 |
GPIO_Mode_IPD |
下拉输入 |
GPIO_Mode_IPU |
上拉输入 |
GPIO_Mode_Out_OD |
开漏输出 |
GPIO_Mode_Out_PP |
推挽输出 |
GPIO_Mode_AF_OD |
复用开漏输出 |
GPIO_Mode_AF_PP |
复用推挽输出 |
表面看来函数GPIO_Init只有两个输入参数,实则4个输入参数。第二个结构体中包括了三个参数,这三个参数分别是对管脚的端口,速度,和模式进行配置。这三个参数的值其实就是一些宏定义的数值。对这三个参数的选择就相当于对对应的寄存器进行配置。第一个结构体是寄存器映射,它定义在文件“stm32f10x.h”中,他的作用就是将与管脚有关的寄存器名字与硬件地址对应起来,例如寄存器CRL就相当于地址:0x40010800.第一与第二个结构体相结合并可以对某端口进行初始化了。
1.1.3:例:配置PA口为浮空输入
//定义一个名为GPIO_InitStructure的GPIO_InitTypeDef型结构体
GPIO_InitTypeDef GPIO_InitStructure;
//选中所有的端口
GPIO_InitStructure. Gpio_Pin = GPIO_Pin_All;
//选择端口的速度为10M
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
//选择模式为浮空输入
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
//完成初始化
GPIO_Init(GPIOA, &GPIO_InitStructure);
1.2函数GPIO_ReadInputDataBit
函数名 |
GPIO_ReadInputDataBit |
函数原形 |
u8 GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) |
功能描述 |
读取指定端口管脚的输入 |
输入参数1 |
GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设 |
输入参数2 |
GPIO_Pin:待读取的端口位 |
输出参数 |
无 |
返回值 |
输入端口管脚值 |
先决条件 |
无 |
被调用函数 |
无 |
1.2.1:例:读取PB.7口的输入值
u8 ReadValue;
ReadValue = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7);
1.3函数GPIO_ReadInputData
函数名 |
GPIO_ReadInputData |
函数原形 |
u16 GPIO_ReadInputData(GPIO_TypeDef* GPIOx) |
功能描述 |
读取指定的GPIO端口输入 |
输入参数1 |
GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设 |
输入参数2 |
GPIO_Pin:待读取的端口位 |
输出参数 |
无 |
返回值 |
GPIO输入数据端口值 |
先决条件 |
无 |
被调用函数 |
无 |
1.3.1:例:读取PC口的输入值
U16 ReadValue;
ReadValue = GPIO_ReadInputData(GPIOC);
1.4函数GPIO_SetBits
函数名 |
GPIO_SetBits |
函数原形 |
void GPIO_SetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) |
功能描述 |
设置指定的数据端口位 |
输入参数1 |
GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设 |
输入参数2 |
GPIO_Pin:待设置的端口位该参数可以取GPIO_Pin_x(x可以是0-15)的任意组合 |
输出参数 |
无 |
返回值 |
无 |
先决条件 |
无 |
被调用函数 |
无 |
1.4.1:例:设置PA.1和PA.2口为高电平
GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2);
1.5函数GPIO_RsetBits
函数名 |
GPIO_ResetBits |
函数原形 |
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) |
功能描述 |
清除指定的数据端口位 |
输入参数1 |
GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设 |
输入参数2 |
GPIO_Pin:待设置的端口位该参数可以取GPIO_Pin_x(x可以是0-15)的任意组合 |
输出参数 |
无 |
返回值 |
无 |
先决条件 |
无 |
被调用函数 |
无 |
1.5.1:例:设置PA.1和PA.2口为低电平
GPIO_RsetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2);
1.6函数GPIO_WriteBit
函数名 |
GPIO_WriteBit |
函数原形 |
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin, BitAction BitVal) |
功能描述 |
设置或者清除指定的数据端口位 |
输入参数1 |
GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设 |
输入参数2 |
GPIO_Pin:待设置的端口位该参数可以取GPIO_Pin_x(x可以是0-15)的任意组合 |
输入参数3 |
BitVal: 该参数指定了待写入的值该参数必须取枚举BitAction的其中一个值Bit_RESET: 清除数据端口位Bit_SET: 设置数据端口位 |
返回值 |
无 |
先决条件 |
无 |
被调用函数 |
无 |
输出参数 |
无 |
1.6.1:例:设置PA.1,PA.2口为低电平
GPIO_WriteBit(GPIOA,GPIO_Pin_1 | GPIO_Pin_2,Bit_RESET);
1.7函数GPIO_Write
函数名 |
GPIO_Write |
函数原形 |
void GPIO_Write(GPIO_TypeDef* GPIOx, u16 PortVal) |
功能描述 |
向指定GPIO数据端口写入数据 |
输入参数1 |
GPIOx:x可以是A,B,C,D或者E,来选择GPIO外设 |
输入参数2 |
PortVal: 待写入端口数据寄存器的值 |
返回值 |
无 |
先决条件 |
无 |
被调用函数 |
无 |
输出参数 |
无 |
1.6.1:例:向PA口写入一数据
GPIO_Write(GPIOA,0X0101);
1.8:要初始化某端口时还需打开该端口的时钟及配置系统的时钟源,与之相关的两个函数为RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE)和SystemInit();
2:将GOIO口配置成外部中断的输入口
2.1与NVIC相关的函数
(1)NVIC_PriorityGroupConfig
函数名 |
NVIC_PriorityGroupConfig |
函数原形 |
Void NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup) |
功能描述 |
设置优先级分组:先占优先级和从优先级 |
输入参数 |
NVIC_PriorityGroup:优先级分组位长度 参阅Section:NVIC_PriorityGroup 查阅更多该参数允许取值范围 |
输出参数 |
无 |
返回值 |
无 |
先决条件 |
优先级分组只能设置一次 |
被调用函数 |
无 |
NVIC_PriorityGroup的值:
NVIC_PriorityGroup |
描述 |
NVIC_PriorityGroup_0 |
先占优先级0位 从优先级4位 |
NVIC_PriorityGroup_1 |
先占优先级1位 从优先级3位 |
NVIC_PriorityGroup_2 |
先占优先级2位 从优先级2位 |
NVIC_PriorityGroup_3 |
先占优先级3位 从优先级1位 |
NVIC_PriorityGroup_4 |
先占优先级4位 从优先级0位 |
(2)NVIC_Init
函数名 |
NVIC_Init |
函数原形 |
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) |
功能描述 |
根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 |
输入参数 |
NVIC_InitStruct:指向结构NVIC_InitTypeDef的指针,包含了外设GPIO的配置信息 参阅Section:NVIC_InitTypeDef查阅更多该参数允许取值范围 |
输出参数 |
无 |
返回值 |
无 |
先决条件 |
无 |
被调用函数 |
无 |
NVIC_InitTypeDef structure
NVIC_InitTypeDef定义于文件“stm32f10x_nvic.h”:
typedef struct
{
u8 NVIC_IRQChannel;
u8 NVIC_IRQChannelPreemptionPriority;
u8 NVIC_IRQChannelSubPriority;
FunctionalState NVIC_IRQChannelCmd;
} NVIC_InitTypeDef;
NVIC_IRQChannel
该参数用以指定IRQ通道。Table 272. 给出了该参数可取的值
NVIC_IRQChannel |
描述 |
WWDG_IRQChannel |
窗口看门狗中断 |
PVD_IRQChannel |
PVD通过EXTI探测中断 |
TAMPER_IRQChannel |
篡改中断 |
RTC_IRQChannel |
RTC全局中断 |
FlashItf_IRQChannel |
FLASH全局中断 |
RCC_IRQChannel |
RCC全局中断 |
EXTI0_IRQChannel |
外部中断线0中断 |
。。。。。 |
|
EXTI9_5_IRQChannel |
外部中断线9-5中断 |
EXTI15_10_IRQChannel |
外部中断线15-10中断 |
NVIC_IRQChannelPreemptionPriority
该参数设置了成员NVIC_IRQChannel中的先占优先级,Table. 273 列举了该参数的取值。
NVIC_IRQChannelSubPriority
该参数设置了成员NVIC_IRQChannel中的从优先级,Table. 273 列举了该参数的取值。
Table. 273 给出了由函数NVIC_PriorityGroupConfig设置的先占优先级和从优先级可取的值
Table 273. 先占优先级和从优先级值(1)(2)
NVIC_PriorityGroup |
NVIC_IRQChannel的先占优先级 |
NVIC_IRQChannel的从优先级 |
描述 |
NVIC_PriorityGroup_0 |
0 |
0-15 |
先占优先级0位 从优先级4位 |
NVIC_PriorityGroup_1 |
0-1 |
0-7 |
先占优先级1位 从优先级3位 |
NVIC_PriorityGroup_2 |
0-3 |
0-3 |
先占优先级2位 从优先级2位 |
NVIC_PriorityGroup_3 |
0-7 |
0-1 |
先占优先级3位 从优先级1位 |
NVIC_PriorityGroup_4 |
0-15 |
0 |
先占优先级4位 从优先级0位 |
NVIC_IRQChannelCmd
该参数指定了在成员NVIC_IRQChannel中定义的IRQ通道被使能还是失能。这个参数取值为ENABLE或者DISABLE。
例:
NVIC_InitTypeDef NVIC_InitStructure;
/*设置优先级分组*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* 选择外部中断线15-10中断*/
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
/*使能该通道*/
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure(&NVIC_InitStructure);
2.2与EXTI相关的函数
(1)GPIO_EXTILineConfig
函数名 |
GPIO_EXTILineConfig |
函数原形 |
void GPIO_EXTILineConfig(u8 GPIO_PortSource, u8 GPIO_PinSource) |
功能描述 |
选择GPIO管脚用作外部中断线路 |
输入参数1 |
GPIO_PortSource: 选择用作外部中断线源的GPIO端口 参阅Section:GPIO_PortSource查阅更多该参数允许取值范围 |
输入参数2 |
GPIO_PinSource:待设置的外部中断线路 该参数可以取GPIO_PinSourcex(x可以是0-15) |
输出参数 |
无 |
返回值 |
无 |
先决条件 |
无 |
被调用函数 |
无 |
例:选择PA13为中断的输入口
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource13);
(2) EXTI_Init
函数名 |
EXTI_Init |
函数原形 |
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct) |
功能描述 |
根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器 |
输入参数 |
EXTI_InitStruct:指向结构EXTI_InitTypeDef的指针,包含了外设EXTI的配置信息参阅Section:EXTI_InitTypeDef查阅更多该参数允许取值范围 |
输出参数 |
无 |
返回值 |
无 |
先决条件 |
无 |
被调用函数 |
无 |
EXTI_InitTypeDef structure
EXTI_InitTypeDef定义于文件“stm32f10x_exti.h”:
typedef struct
{ u32 EXTI_Line;
EXTIMode_TypeDef EXTI_Mode;
EXTIrigger_TypeDef EXTI_Trigger;
FunctionalState EXTI_LineCmd; } EXTI_InitTypeDef;
EXTI_Line
EXTI_Line选择了待使能或者失能的外部线路。Table 132. 给出了该参数可取的值
EXTI_Line0 |
外部中断线0 |
…….. |
…….. |
EXTI_Line18 |
外部中断线18 |
EXTI_Mode
EXTI_Mode设置了被使能线路的模式。Table 133. 给出了该参数可取的值
EXTI_Mode |
描述 |
EXTI_Mode_Event |
设置EXTI线路为事件请求 |
EXTI_Mode_Interrupt |
设置EXTI线路为中断请求 |
EXTI_Trigger
EXTI_Trigger设置了被使能线路的触发边沿。Table 134. 给出了该参数可取的值
EXTI_Mode |
描述 |
EXTI_Trigger_Falling |
设置输入线路下降沿为中断请求 |
EXTI_Trigger_Rising |
设置输入线路上升沿为中断请求 |
EXTI_Trigger_Rising_Falling |
设置输入线路上升沿和下降沿为中断请求 |
EXTI_LineCmd
EXTI_LineCmd用来定义选中线路的新状态。它可以被设为ENABLE或者DISABLE。
例:使能PA13为中断的输入通道,且下降沿触发
EXTI_InitStructure.EXTI_Line = EXTI_Line13;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿中断
/*使能中断*/
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);