GPIO的通用IO

GPIO端口寄存器

固件库操作

  • 四个 32 位配置寄存器32 位配置寄存器
    GPIOx_MODER (I/O 引脚的方向),GPIOx_OTYPER(输出类型推挽和开漏), GPIOx_OSPEEDR(速度) 和GPIOx_PUPDR(上拉或者是下拉)
  • 两个 16位数据寄存器
    GPIOx_IDR(存储 I/O 引脚输入的数据) 和 GPIOx_ODR(输出数据)
  • 一个 32 位置位/复位寄存器
    GPIOx_BSRR
    寄存器 GPIOx_BSRR 就是对寄存器 GPIOx_ODR 的位操作,GPIOx_BSRR 的高 16 位用于复位操作,低 16 位用置位操作,只有对寄存器 GPIOx_BSRR 相应的位置 1 才对寄存器 GPIOx_ODR 有效,置 0 是无效的。如果对于寄存器 GPIOx_ODR 的同一位同时进行置位和复位操作,那么置位操作的优先级要高。
  • 一个 32 位 GPIO 锁寄存器
    GPIOx_LCKR
  • 两个 32 位复用功能寄存器
    GPIOx_AFRH和 GPIOx_AFRL
 ======================================================================
                 ##### Initialization and Configuration #####
 ======================================================================
/*初始化 GPIO 寄存器到默认的复位值*/
void GPIO_DeInit(GPIO_TypeDef* GPIOx)
{
	RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOA, DISABLE);
}
/*实现 GPIO 的初始化*/
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
/* GPIO_InitStruct 组员设置到默认初始值*/
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)
/*GPIO 锁寄存器,锁住相应端口的相应引脚*/
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
======================================================================
                         ##### GPIO Read and Write #####
 ======================================================================
/*输入数据寄存器的数据——读取端口某一个引脚的数据 GPIOx->IDR*/
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
/*输入数据寄存器的数据——读取端口所有引脚的数据 GPIOx->IDR*/
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
/*输入数据寄存器的数据——读取端口所有引脚的数据 GPIOx->ODR*/
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
/*输入数据寄存器的数据——读取端口某一个引脚的数据 GPIOx->ODR*/
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
/*通过操作寄存器 BSSRL 和 BSSRH 两个寄存器来操作 ODR 寄存器*/
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
/*设置输出数据寄存器(ODR)的数值*/
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
/*通过 GPIOx->ODR ^= GPIO_Pin;实现翻转功能。*/
void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
===============================================================================
                         #####  bsp_InitLed #####
 ===============================================================================  
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT; /* 设为输出口 */
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; /* 设为推挽模式 */
GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL; /* 上下拉电阻不使能 */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;/* IO口最大速度 */

GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED1;
GPIO_Init(GPIO_PORT_LED1, &GPIO_InitStructure);
  • LED的灌电流驱动方式
    IO 口输出低电平时 LED 点亮;驱动电流将由外部的电源提供
  • LED的 拉电流方式驱动方式
    LED 的驱动电流将由 MCU 的 VCC引脚提供
  • 将GPIO设置为输出时,GPIO输出寄存器的值缺省是0

寄存器操作

  • 端口配置寄存器CRL/CRH
    STM32 的 CRL 控制着每组 IO 端口(A~G)的低 8 位的模式。
    STM32 的 CRH 控制着每组 IO 端口(A~G)的高8 位的模式。
    每个 IO 端口的位占用 CRL 的 4 个位,高两位为 CNF,低两位为 MODE
    在这里插入图片描述
    常用的配置:
    0X0 表示模拟输入模式(ADC 用)
    0X3 表示推挽输出模式(做输出口用,50M 速率)
    0X8 表示上/下拉输入模式(做输入口用)
    0XB 表示复用输出(使用 IO 口的第二功能,50M 速率)
  • 端口输入数据寄存器IDR
    IDR 是一个端口输入数据寄存器,只用了低 16 位。该寄存器为只读寄存器,并且只能以16 位的形式读出。
  • 端口输出数据寄存器IDR
    ODR 是一个端口输出数据寄存器,也只用了低 16 位。该寄存器为可读写,从该寄存器读出来的数据可以用于判断当前 IO 口的输出状态。而向该寄存器写数据,则可以控制某个 IO 口的输出电平。
===============================================================================
                         #####  bsp_InitLed #####
=============================================================================== 
RCC->APB2ENR|=1<<4; 	//使能 PORTC 时钟 
GPIOC->CRH&=0XFFF00FFF; //清掉这 2 个位原来的设置,同时也不影响其他位的设置
GPIOC->CRH|=0X00038000; //PC11 上拉输入,PC12 推挽输出
GPIOC->ODR|=1<<11; 		//PC.11 输出高 
===============================================================================
                         #####  bsp_InitKeyHard#####
=============================================================================== 
RCC->APB2ENR|=1<<6; 	 //使能 PORTE 时钟
GPIOE->CRL&=0XFFF000FF;  //PE2~4 设置成输入 
GPIOE->CRL|=0X00088800;
GPIOE->ODR|=7<<2; 		 //PE2~4 上拉

搭配使用

/*熄灭指定的LED指示灯*/
void bsp_LedOff(uint8_t _no)
{
	_no--;
	if (_no == 0)
	{
		GPIO_PORT_LED1->BSRRL = GPIO_PIN_LED1;
	}
}
/*翻转指定的LED指示灯*/
void bsp_LedToggle(uint8_t _no)
{
	if (_no == 1)
	{
		GPIO_PORT_LED1->ODR ^= GPIO_PIN_LED1;
	}
}
/*查询数据输出寄存器得到 LED 的输出状态*/
uint8_t bsp_IsLedOn(uint8_t _no)
{
	if (_no == 1)
	{
		if ((GPIO_PORT_LED1->ODR & GPIO_PIN_LED1) == 0)
		{
			return 1;
		}
		return 0;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值