STM32F103知识点小结—GPIO功能设置

STM32F103知识点小结—GPIO功能设置

STM32F1系列的单片机具有丰富的外设,其中最基础的就是GPIO的使用。

IO口模式的分类

IO口模式可大致分为8类。按基本功能可以分为

(1).输入功能

1.浮空输入
2.上拉输入
3.下拉输入
4.模拟输入

(2)输出功能

1.开漏输出:可以输出高、低电平,连接数字器件
2.推挽输出:适合做电流型驱动,驱动能力较强

相关寄存器

TM32 的每个 IO 端口都有 7 个寄存器来控制。他们分别是:配置模式的 2 个 32 位的端口 配置寄存器 CRL 和 CRH; 2 个 32 位的数据寄存器 IDR 和 ODR; 1 个 32 位的置位/复位寄存器BSRR;一个 16 位的复位寄存器 BRR; 1 个 32 位的锁存寄存器 LCKR。
1.CRL 和 CRH 控制着每个 IO 口的模式及输出速率 (在固件库开发中, 操作寄存器 CRH 和 CRL 来配置 IO 口的模式和速度是通过 GPIO 初始化函数完成:)

 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

2.IDR:IDR 是一个端口输入数据寄存器,只用了低 16 位。该寄存器为只读寄存器,并且只能以
16 位的形式读出。在固件库中操作 IDR 寄存器读取 IO 端口数据是通过GPIO_ReadInputDataBit 函数实现的:

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 

返回值是 1(Bit_SET)或者 0(Bit_RESET);

3.ODR 是一个端口输出数据寄存器,也只用了低 16 位。该寄存器为可读写,从该寄存器读出来的数据可以用于判断当前 IO 口的输出状态。而向该寄存器写数据,则可以控制某个 IO 口的输出电平。 在固件库中设置 ODR 寄存器的值来控制 IO 口的输出状态是通过函数 GPIO_Write 来实现的:

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

该函数一般用来往一次性一个 GPIO 的多个端口设值。
4.BSRR 寄存器是端口位设置/清除寄存器。 该寄存器和 ODR 寄存器具有类似的作用,都可以用来设置 GPIO 端口的输出位是 1 还是 0。寄存器通过举例子可以很清楚了解它的使用方法。 例如你要设置 GPIOA 的第 1 个端口值为 1,那么你只需要往寄存器 BSRR 的低 16 位对应位写 1 即可:

GPIOA->BSRR=1<<1;

如果你要设置 GPIOA 的第 1 个端口值为 0, 你只需要往寄存器高 16 位对应为写 1 即可:

GPIOA->BSRR=1<<(16+1)

该寄存器往相应位写 0 是无影响的,所以我们要设置某些位,我们不用管其他位的值。
5.BRR 寄存器是端口位清除寄存器。该寄存器的作用跟 BSRR 的高 16 位雷同,这里就不做详细讲解。 在 STM32 固件库中, 通过 BSRR 和 BRR 寄存器设置 GPIO 端口输出是通过函数
GPIO_SetBits()和函数 GPIO_ResetBits()来完成的。

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

GPIO端口初始化流程

1.定义初始化结构体
2.使能IO时钟(AHPB2)
3.IO模式设置:(1).IO引脚选择
(2).输入、输出、复用功能模式选择
(3).IO速度设置
4.利用已经定义赋值好的初始化结构体进行初始化:GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO口调用实例

GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|
RCC_APB2Periph_GPIOE, ENABLE); //使能 PB,PE 端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 推挽输出
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_5); /PE.5 输出高 







 

你可能感兴趣的:(STM32学习)