初出茅庐的小李第78篇博客之STM32的GPIO寄存器学习

由于工作中用到寄存器,之前都是容库函数写的代码,趁这个机会补一下寄存器的知识。

GPIO寄存器有哪些?

typedef struct
{
  __IO uint32_t MODER;    /*!< GPIO port mode register,               Address offset: 0x00      */
  __IO uint32_t OTYPER;   /*!< GPIO port output type register,        Address offset: 0x04      */
  __IO uint32_t OSPEEDR;  /*!< GPIO port output speed register,       Address offset: 0x08      */
  __IO uint32_t PUPDR;    /*!< GPIO port pull-up/pull-down register,  Address offset: 0x0C      */
  __IO uint32_t IDR;      /*!< GPIO port input data register,         Address offset: 0x10      */
  __IO uint32_t ODR;      /*!< GPIO port output data register,        Address offset: 0x14      */
  __IO uint16_t BSRRL;    /*!< GPIO port bit set/reset low register,  Address offset: 0x18      */
  __IO uint16_t BSRRH;    /*!< GPIO port bit set/reset high register, Address offset: 0x1A      */
  __IO uint32_t LCKR;     /*!< GPIO port configuration lock register, Address offset: 0x1C      */
  __IO uint32_t AFR[2];   /*!< GPIO alternate function registers,     Address offset: 0x20-0x24 */
} GPIO_TypeDef;

	GPIOA->AFR[0];//对应ARF_L
	GPIOA->AFR[1];//对应ARF_H
	GPIOA->BSRRH;
	GPIOA->BSRRL;
	GPIOA->IDR;
	GPIOA->LCKR;
	GPIOA->LCKR;
	GPIOA->MODER;
	GPIOA->ODR;
	GPIOA->OSPEEDR;
	GPIOA->OTYPER;
	GPIOA->PUPDR;

GPIOA->AFR[0],GPIOA->AFR[1]

GPIOA->AFR[0]
GPIOA->AFR[1]
GPIOx_AFRL: 32位替代功能寄存器;
GPIOx_AFRH: 32位替代功能寄存器;
这两个的用法一般是把AFR[2]表示一个数组。
元素AFR[0]地址0x20 表示GPIOx_AFRL寄存器。
元素AFR[1]地址0x24 表示GPIOx_AFRH寄存器

GPIO 复用功能低位寄存器 (GPIOx_AFRL) (x = A…I)
GPIO Alternate Function Low Register
GPIO 复用功能高位寄存器 (GPIOx_AFRH) (x = A…I)
GPIO Alternate Function High Register

它管理谁?

它是管理复用功能的寄存器地位寄出器

如何理谁?

在这里插入图片描述
在这里插入图片描述
总结:两个寄存器就可以管理0-7和8-15这十六个管脚的模式多达8个端口GPIOA,GIOB,GPIOC,GIOD,GPIOE,GPIOF,GPIOG,GPIOH,GPIOI;
4个位就可以实现模式0000-1111十六种模式的切换,真的是秒啊;

库函数实现源码

void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
{
  uint32_t temp = 0x00;
  uint32_t temp_2 = 0x00;
  
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
  assert_param(IS_GPIO_AF(GPIO_AF));
  
  temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp;
  GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2;
}

GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_USART1);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值