STM32——GPIO(基本原理+固件库+CubeMX)

目录

前言

一、基本原理

1、输入

2、输出

3、复用功能

4、模拟输入

二、固件库运用

1.输出——点亮LED

2.输入——按键检测

三、STM32CubeMX配置

1.输出——点亮LED

2.输入——按键检测

完结


前言

        只要涉及单片机,必定先了解如何使用其I/O,而STM32单片机的GPIO模式种类多样,功能丰富,学会了它,其他MCU就可举一反三了。


一、基本原理

        STM32中的GPIO(General Purpose Input/Output,通用输入输出)端口是微控制器与外部交互的基础接口之一。GPIO引脚可以配置为输入或输出模式,用于读取外部设备的状态或控制外部设备(如LED、按钮、传感器等)。STM32的GPIO功能非常灵活和强大,支持多种配置和模式。每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存 器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。有以下几种模式:

        输入模式:可以配置为浮空输入、上拉输入、下拉输入或模拟输入等,用于读取外部信号。

        输出模式:可以配置为推挽输出(适用于大多数驱动应用,如LED控制)、开漏输出(常用于I2C、SPI等总线接口、电平转换、冲突保护、实现“”逻辑等)。

        复用模式:GPIO引脚还具有复用功能,可以作为外设的特定功能引脚,如USART的TX/RX、SPI的SCK/MISO/MOSI等。

        每个I/O端口位可以自由编程,而I/0端口寄存器必须按32位字被访问(不允许半字或字节访 问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问;这 样,在读和更改访问之间产生IRQ时不会发生危险。

其中Vdd在不同的引脚之间有所差别,因此也决定了引脚是否能容忍5V电压。

1、输入

        当I/O端口配置为输入时:

● 输出缓冲器被禁止;

● 施密特触发输入被激活;

● 根据输入配置(上拉,下拉或浮空)的不同,弱上拉和下拉电阻被连接;

● 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器;

● 对输入数据寄存器的读访问可得到I/O状态。

典型运用:按键扫描,如果按键连接的是地,按下按键为引脚连接低电平,则一般将初始电平设置为高电平,即上拉输入。

2、输出

        当I/O端口被配置为输出时:

● 输出缓冲器被激活

        ─ 开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(P-MOS从不被激活),即只能连接到VSS,故只能输出低电平。

        ─ 推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS,既能连接到VSS,也能连接到VDD,故高低电平均可输出。

● 施密特触发输入被激活;

● 弱上拉和下拉电阻被禁止;

● 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器;

● 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态;

● 在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值。

 典型运用:点亮LED,如果LED另一端连接的是地,需要驱动LED进行点亮,所以需要配置为推挽输出,同样操作还有三极管、继电器等。

3、复用功能

        当I/O端口被配置为复用功能时:

● 在开漏或推挽式配置中,输出缓冲器被打开;

● 内置外设的信号驱动输出缓冲器(复用功能输出);

● 施密特触发输入被激活;

● 弱上拉和下拉电阻被禁止;

● 在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器;

● 开漏模式时,读输入数据寄存器时可得到I/O口状态;

● 在推挽模式时,读输出数据寄存器时可得到最后一次写的值。

4、模拟输入

        当I/O端口被配置为模拟输入配置时:

● 输出缓冲器被禁止; 

● 禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置 为’0’;

● 弱上拉和下拉电阻被禁止;

● 读取输入数据寄存器时数值为’0’。

二、固件库运用

1.输出——点亮LED

void LED_Init(void)
{
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_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 推挽输出
GPIO_Init(GPIOE, &GPIO_InitStructure);
}

相关功能函数:

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);//对端口整体数据写入,一次操作16个引脚
GPIO_Write(GPIOB,0xFFFF);

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//对单个引脚设置为高电平
GPIO_SetBits(GPIOB,GPIO_Pin_5);

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//对单个引脚设置为低电平
GPIO_ResetBits(GPIOB,GPIO_Pin_5);

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//读出引脚输出的电平状态
GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5);

uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);//读出整个端口输出的数据,一次读出16个引脚的状态
GPIO_ReadOutputData(GPIOB);

2.输入——按键检测

void KEY_Init(void) //IO初始化
{ 
 	GPIO_InitTypeDef GPIO_InitStructure;
 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4|GPIO_Pin_3;//KEY0-KEY1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
 	GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE4,3

	//初始化 WK_UP-->GPIOA.0	  下拉输入
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉	  
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0
}

 相关功能函数:

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);//读出端口所有引脚的输入数据
GPIO_ReadInputData(GPIOB);

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//读出单个引脚的输入数据
GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5);

三、STM32CubeMX配置

1.输出——点亮LED

相关功能函数:

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);//设置引脚电平

void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);//反转引脚电平

 宏定义函数:

#define LED1(n) HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,(n?GPIO_PIN_RESET:GPIO_PIN_SET))  
//n=1:设置为低电平,n=0:设置为高电平

2.输入——按键检测

相关功能函数:

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);//读取引脚电平

 宏定义函数:

#define Key_Value HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)  

完结

        成功晋升点灯大师,继续努力!!

  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值