超经典的STM32学习笔记——第一章GPIO口

  • 格式:docx
  • 大小:37.67 KB
  • 文档页数:11

固件库中与GPIO有关的函数主要有:
1.1函数GPIO_Init
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_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);
函数GPIO_ReadInputDataBit
1.2.1:例:读取PB.7口的输入值
u8 ReadValue;
ReadValue = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7);
函数GPIO_ReadInputData
1.3.1:例:读取PC口的输入值
U16 ReadValue;
ReadValue = GPIO_ReadInputData(GPIOC);
1.4函数GPIO_SetBits
1.4.1:例:设置PA.1和PA.2口为高电平GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2);
1.5函数GPIO_RsetBits
1.5.1:例:设置PA.1和PA.2口为低电平
GPIO_RsetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2);
1.6函数GPIO_WriteBit
1.6.1:例:设置PA.1,PA.2口为低电平
GPIO_WriteBit(GPIOA,GPIO_Pin_1 | GPIO_Pin_2,Bit_RESET);
1.7函数GPIO_Write
1.6.1:例:向PA口写入一数据
GPIO_Write(GPIOA,0X0101);
1.8:要初始化某端口时还需打开该端口的时钟及配置系统的时钟源,与之相关的两个函数为RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE)和SystemInit();
2:将GOIO口配置成外部中断的输入口
2.1与NVIC相关的函数
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_IRQChannelPreemptionPriority
该参数设置了成员NVIC_IRQChannel中的先占优先级,Table. 273 列举了该参数的取值。

NVIC_IRQChannelSubPriority
该参数设置了成员NVIC_IRQChannel中的从优先级,Table. 273 列举了该参数的取值。

Table. 273 给出了由函数NVIC_PriorityGroupConfig设置的先占优先级和从优先级可取的值
()()
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相关的函数
例:选择PA13为中断的输入口
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource13);
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_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);。